github.com/markusbkk/elvish@v0.0.0-20231204143114-91dc52438621/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 "github.com/markusbkk/elvish/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 // TODO: Test featureDoor on Solaris 74 75 chr, err := findDevice(os.ModeDevice | os.ModeCharDevice) 76 test("char device", chr, featureCharDevice, opt{setupErr: err}) 77 78 blk, err := findDevice(os.ModeDevice) 79 test("block device", blk, featureBlockDevice, opt{setupErr: err}) 80 81 err = mkdirMode("d", 0700) 82 test("normal dir", "d", featureDirectory, opt{setupErr: err}) 83 err = mkdirMode("d-wws", 0777|os.ModeSticky) 84 test("world-writable sticky dir", "d-wws", featureWorldWritableStickyDirectory, opt{setupErr: err}) 85 err = mkdirMode("d-ww", 0777) 86 test("world-writable dir", "d-ww", featureWorldWritableDirectory, opt{setupErr: err}) 87 err = mkdirMode("d-s", 0700|os.ModeSticky) 88 test("sticky dir", "d-s", featureStickyDirectory, opt{setupErr: err}) 89 90 err = createMode("xu", 0100) 91 test("executable by user", "xu", featureExecutable, opt{setupErr: err}) 92 err = createMode("xg", 0010) 93 test("executable by group", "xg", featureExecutable, opt{setupErr: err}) 94 err = createMode("xo", 0001) 95 test("executable by other", "xo", featureExecutable, opt{setupErr: err}) 96 97 err = createMode("su", 0600|os.ModeSetuid) 98 test("setuid", "su", featureSetuid, opt{setupErr: err}) 99 err = createMode("sg", 0600|os.ModeSetgid) 100 test("setgid", "sg", featureSetgid, opt{setupErr: err}) 101 102 test("nonexistent file", "nonexistent", featureInvalid, opt{wantErr: true}) 103 } 104 105 func create(fname string) error { 106 f, err := os.Create(fname) 107 if err == nil { 108 f.Close() 109 } 110 return err 111 } 112 113 func createMode(fname string, mode os.FileMode) error { 114 f, err := os.OpenFile(fname, os.O_CREATE, mode) 115 if err != nil { 116 return err 117 } 118 f.Close() 119 return checkMode(fname, mode) 120 121 } 122 123 func findDevice(typ os.FileMode) (string, error) { 124 entries, err := os.ReadDir("/dev") 125 if err != nil { 126 return "", err 127 } 128 for _, entry := range entries { 129 if entry.Type() == typ { 130 return "/dev/" + entry.Name(), nil 131 } 132 } 133 return "", fmt.Errorf("can't find %v device under /dev", typ) 134 } 135 136 func mkdirMode(fname string, mode os.FileMode) error { 137 if err := os.Mkdir(fname, mode); err != nil { 138 return err 139 } 140 return checkMode(fname, mode|os.ModeDir) 141 } 142 143 func checkMode(fname string, wantMode os.FileMode) error { 144 info, err := os.Lstat(fname) 145 if err != nil { 146 return err 147 } 148 if mode := info.Mode(); mode != wantMode { 149 return fmt.Errorf("created file has mode %v, want %v", mode, wantMode) 150 } 151 return nil 152 }