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  }