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  }