github.com/mvdan/u-root-coreutils@v0.0.0-20230122170626-c2eef2898555/pkg/cpio/utils_test.go (about)

     1  // Copyright 2013-2018 the u-root Authors. All rights reserved
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package cpio
     6  
     7  import (
     8  	"bytes"
     9  	"errors"
    10  	"io/fs"
    11  	"os"
    12  	"testing"
    13  )
    14  
    15  func TestNormalize(t *testing.T) {
    16  	for _, tt := range []struct {
    17  		path string
    18  		want string
    19  	}{
    20  		{
    21  			path: "/foo/bar",
    22  			want: "foo/bar",
    23  		},
    24  		{
    25  			path: "foo////bar",
    26  			want: "foo/bar",
    27  		},
    28  		{
    29  			path: "/foo/bar/../baz",
    30  			want: "foo/baz",
    31  		},
    32  		{
    33  			path: "foo/bar/../baz",
    34  			want: "foo/baz",
    35  		},
    36  		{
    37  			path: "./foo/bar",
    38  			want: "foo/bar",
    39  		},
    40  		{
    41  			path: "foo/../../bar",
    42  			want: "../bar",
    43  		},
    44  		{
    45  			path: "",
    46  			want: ".",
    47  		},
    48  		{
    49  			path: ".",
    50  			want: ".",
    51  		},
    52  	} {
    53  		if got := Normalize(tt.path); got != tt.want {
    54  			t.Errorf("Normalize(%q) = %q, want %q", tt.path, got, tt.want)
    55  		}
    56  	}
    57  }
    58  
    59  type bad struct {
    60  	err error
    61  }
    62  
    63  func (b *bad) WriteRecord(_ Record) error {
    64  	return b.err
    65  }
    66  
    67  var _ RecordWriter = &bad{}
    68  
    69  func TestWriteRecordsAndDirs(t *testing.T) {
    70  	// Make sure it fails for the non DedupWriters
    71  	if err := WriteRecordsAndDirs(&bad{}, nil); !errors.Is(err, os.ErrInvalid) {
    72  		t.Errorf("WriteRecordsAndDirs(&bad{}, nil): got %v, want %v", err, os.ErrInvalid)
    73  	}
    74  	var paths = []struct {
    75  		name string
    76  		err  error
    77  	}{
    78  		{name: "a/b/c/d", err: nil},
    79  		{name: "a/b/c/e", err: nil},
    80  		{name: "a/b", err: nil},
    81  	}
    82  
    83  	recs := make([]Record, 0)
    84  	for _, p := range paths {
    85  		recs = append(recs, Directory(p.name, 0777))
    86  	}
    87  	var b bytes.Buffer
    88  	w := Newc.Writer(&b)
    89  	if err := WriteRecordsAndDirs(w, recs[:2]); err != nil {
    90  		t.Fatalf("Writing %d records: got %v, want nil", len(recs), err)
    91  	}
    92  
    93  	out := "07070100000000000041FF0000000000000000000000000000000000000000000000000000000000000000000000000000000200000000a\x0007070100000000000041FF0000000000000000000000000000000000000000000000000000000000000000000000000000000400000000a/b\x00\x00\x0007070100000000000041FF0000000000000000000000000000000000000000000000000000000000000000000000000000000600000000a/b/c\x0007070100000000000041FF0000000000000000000000000000000000000000000000000000000000000000000000000000000800000000a/b/c/d\x00\x00\x0007070100000000000041FF0000000000000000000000000000000000000000000000000000000000000000000000000000000800000000a/b/c/e\x00\x00\x00"
    94  	if b.String() != out {
    95  		t.Fatalf("%q != %q", b.String(), out)
    96  	}
    97  	if err := WriteRecordsAndDirs(w, recs); !errors.Is(err, os.ErrExist) {
    98  		t.Fatalf("Writing %d records: got %v, want %v", len(recs), err, os.ErrExist)
    99  	}
   100  	// Test a bad write.
   101  	if err := WriteRecordsAndDirs(&bad{err: fs.ErrInvalid}, recs); !errors.Is(err, fs.ErrInvalid) {
   102  		t.Fatalf("Writing %d records: got %v, want %v", len(recs), err, fs.ErrInvalid)
   103  	}
   104  
   105  }