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 }