github.com/kolbycrouch/elvish@v0.14.1-0.20210614162631-215b9ac1c423/pkg/cli/lscolors/feature_test.go (about) 1 package lscolors 2 3 import ( 4 "os" 5 "runtime" 6 "testing" 7 8 "src.elv.sh/pkg/testutil" 9 ) 10 11 func TestDetermineFeature(t *testing.T) { 12 test := func(fname string, mh bool, wantedFeature feature) { 13 t.Helper() 14 feature, err := determineFeature(fname, mh) 15 if err != nil { 16 t.Errorf("determineFeature(%q, %v) returns error %v, want no error", 17 fname, mh, err) 18 } 19 if feature != wantedFeature { 20 t.Errorf("determineFeature(%q, %v) returns feature %v, want %v", 21 fname, mh, feature, wantedFeature) 22 } 23 } 24 25 _, cleanup := testutil.InTestDir() 26 defer cleanup() 27 28 create("a", 0600) 29 // Regular file. 30 test("a", true, featureRegular) 31 32 // Symlink. 33 err := os.Symlink("a", "symlink") 34 if err != nil { 35 t.Logf("Failed to create symlink: %v; skipping symlink test", err) 36 } else { 37 test("symlink", true, featureSymlink) 38 } 39 40 // Broken symlink. 41 err = os.Symlink("aaaa", "bad-symlink") 42 if err != nil { 43 t.Logf("Failed to create bad symlink: %v; skipping bad symlink test", err) 44 } else { 45 test("bad-symlink", true, featureOrphanedSymlink) 46 } 47 48 if runtime.GOOS != "windows" { 49 // Multiple hard links. 50 err := os.Link("a", "a2") 51 if err != nil { 52 t.Logf("Failed to create hard link: %v; skipping hard link test", err) 53 } else { 54 test("a", true, featureMultiHardLink) 55 } 56 } 57 58 // Don't test for multiple hard links. 59 test("a", false, featureRegular) 60 61 // Setuid and Setgid. 62 // TODO(xiaq): Fails. 63 /* 64 create("su", os.ModeSetuid) 65 test("su", true, featureSetuid) 66 create("sg", os.ModeSetgid) 67 test("sg", true, featureSetgid) 68 */ 69 70 if runtime.GOOS != "windows" { 71 // Executable. 72 create("xu", 0100) 73 create("xg", 0010) 74 create("xo", 0001) 75 test("xu", true, featureExecutable) 76 test("xg", true, featureExecutable) 77 test("xo", true, featureExecutable) 78 } 79 } 80 81 func create(fname string, perm os.FileMode) { 82 f, err := os.OpenFile(fname, os.O_CREATE, perm) 83 if err != nil { 84 panic(err) 85 } 86 // The following call works around a termux bug where os.OpenFile does not 87 // set the permission bits for group and other correctly. 88 f.Chmod(perm) 89 f.Close() 90 }