src.elv.sh@v0.21.0-dev.0.20240515223629-06979efb9a2a/pkg/cli/lscolors/feature_test.go (about) 1 package lscolors 2 3 import ( 4 "fmt" 5 "net" 6 "os" 7 "runtime" 8 "testing" 9 10 "src.elv.sh/pkg/testutil" 11 ) 12 13 type opt struct { 14 setupErr error 15 mh bool 16 wantErr bool 17 } 18 19 func TestDetermineFeature(t *testing.T) { 20 testutil.InTempDir(t) 21 testutil.Umask(t, 0) 22 23 test := func(name, fname string, wantFeature feature, o opt) { 24 t.Helper() 25 t.Run(name, func(t *testing.T) { 26 t.Helper() 27 if o.setupErr != nil { 28 t.Skip("skipped due to setup error:", o.setupErr) 29 } 30 feature, err := determineFeature(fname, o.mh) 31 wantErr := "nil" 32 if o.wantErr { 33 wantErr = "non-nil" 34 } 35 if (err != nil) != o.wantErr { 36 t.Errorf("determineFeature(%q, %v) returns error %v, want %v", 37 fname, o.mh, err, wantErr) 38 } 39 if feature != wantFeature { 40 t.Errorf("determineFeature(%q, %v) returns feature %v, want %v", 41 fname, o.mh, feature, wantFeature) 42 } 43 }) 44 } 45 46 err := create("a") 47 test("regular file", "a", featureRegular, opt{setupErr: err}) 48 test("regular file mh=true", "a", featureRegular, opt{setupErr: err, mh: true}) 49 50 err = os.Symlink("a", "l") 51 test("symlink", "l", featureSymlink, opt{setupErr: err}) 52 53 err = os.Symlink("aaaa", "lbad") 54 test("broken symlink", "lbad", featureOrphanedSymlink, opt{setupErr: err}) 55 56 if runtime.GOOS != "windows" { 57 err := os.Link("a", "a2") 58 test("multi hard link", "a", featureMultiHardLink, opt{mh: true, setupErr: err}) 59 test("multi hard link with mh=false", "a", featureRegular, opt{setupErr: err}) 60 } 61 62 err = createNamedPipe("fifo") 63 test("named pipe", "fifo", featureNamedPipe, opt{setupErr: err}) 64 65 if runtime.GOOS != "windows" { 66 l, err := net.Listen("unix", "sock") 67 if err == nil { 68 defer l.Close() 69 } 70 test("socket", "sock", featureSocket, opt{setupErr: err}) 71 } 72 73 testutil.Set(t, &isDoorFunc, 74 func(info os.FileInfo) bool { return info.Name() == "door" }) 75 err = create("door") 76 test("door (fake)", "door", featureDoor, opt{setupErr: err}) 77 78 chr, err := findDevice(os.ModeDevice | os.ModeCharDevice) 79 test("char device", chr, featureCharDevice, opt{setupErr: err}) 80 81 blk, err := findDevice(os.ModeDevice) 82 test("block device", blk, featureBlockDevice, opt{setupErr: err}) 83 84 err = mkdirMode("d", 0700) 85 test("normal dir", "d", featureDirectory, opt{setupErr: err}) 86 // Regression test for b.elv.sh/1710. 87 test("directory with mh=true", "d", featureDirectory, opt{setupErr: err, mh: true}) 88 89 err = mkdirMode("d-wws", 0777|os.ModeSticky) 90 test("world-writable sticky dir", "d-wws", featureWorldWritableStickyDirectory, opt{setupErr: err}) 91 err = mkdirMode("d-ww", 0777) 92 test("world-writable dir", "d-ww", featureWorldWritableDirectory, opt{setupErr: err}) 93 err = mkdirMode("d-s", 0700|os.ModeSticky) 94 test("sticky dir", "d-s", featureStickyDirectory, opt{setupErr: err}) 95 96 err = createMode("xu", 0100) 97 test("executable by user", "xu", featureExecutable, opt{setupErr: err}) 98 err = createMode("xg", 0010) 99 test("executable by group", "xg", featureExecutable, opt{setupErr: err}) 100 err = createMode("xo", 0001) 101 test("executable by other", "xo", featureExecutable, opt{setupErr: err}) 102 103 err = createMode("su", 0600|os.ModeSetuid) 104 test("setuid", "su", featureSetuid, opt{setupErr: err}) 105 err = createMode("sg", 0600|os.ModeSetgid) 106 test("setgid", "sg", featureSetgid, opt{setupErr: err}) 107 108 test("nonexistent file", "nonexistent", featureInvalid, opt{wantErr: true}) 109 } 110 111 func create(fname string) error { 112 f, err := os.Create(fname) 113 if err == nil { 114 f.Close() 115 } 116 return err 117 } 118 119 func createMode(fname string, mode os.FileMode) error { 120 f, err := os.OpenFile(fname, os.O_CREATE, mode) 121 if err != nil { 122 return err 123 } 124 f.Close() 125 return checkMode(fname, mode) 126 127 } 128 129 func findDevice(typ os.FileMode) (string, error) { 130 entries, err := os.ReadDir("/dev") 131 if err != nil { 132 return "", err 133 } 134 for _, entry := range entries { 135 if entry.Type() == typ { 136 return "/dev/" + entry.Name(), nil 137 } 138 } 139 return "", fmt.Errorf("can't find %v device under /dev", typ) 140 } 141 142 func mkdirMode(fname string, mode os.FileMode) error { 143 if err := os.Mkdir(fname, mode); err != nil { 144 return err 145 } 146 return checkMode(fname, mode|os.ModeDir) 147 } 148 149 func checkMode(fname string, wantMode os.FileMode) error { 150 info, err := os.Lstat(fname) 151 if err != nil { 152 return err 153 } 154 if mode := info.Mode(); mode != wantMode { 155 return fmt.Errorf("created file has mode %v, want %v", mode, wantMode) 156 } 157 return nil 158 }