github.com/opencontainers/runc@v1.2.0-rc.1.0.20240520010911-492dc558cdd6/libcontainer/devices/device_unix_test.go (about) 1 //go:build !windows 2 // +build !windows 3 4 package devices 5 6 import ( 7 "errors" 8 "io/fs" 9 "os" 10 "testing" 11 12 "golang.org/x/sys/unix" 13 ) 14 15 func cleanupTest() { 16 unixLstat = unix.Lstat 17 osReadDir = os.ReadDir 18 } 19 20 func TestDeviceFromPathLstatFailure(t *testing.T) { 21 testError := errors.New("test error") 22 23 // Override unix.Lstat to inject error. 24 unixLstat = func(path string, stat *unix.Stat_t) error { 25 return testError 26 } 27 defer cleanupTest() 28 29 _, err := DeviceFromPath("", "") 30 if !errors.Is(err, testError) { 31 t.Fatalf("Unexpected error %v, expected %v", err, testError) 32 } 33 } 34 35 func TestHostDevicesIoutilReadDirFailure(t *testing.T) { 36 testError := errors.New("test error") 37 38 // Override os.ReadDir to inject error. 39 osReadDir = func(dirname string) ([]fs.DirEntry, error) { 40 return nil, testError 41 } 42 defer cleanupTest() 43 44 _, err := HostDevices() 45 if !errors.Is(err, testError) { 46 t.Fatalf("Unexpected error %v, expected %v", err, testError) 47 } 48 } 49 50 func TestHostDevicesIoutilReadDirDeepFailure(t *testing.T) { 51 testError := errors.New("test error") 52 called := false 53 54 // Override os.ReadDir to inject error after the first call. 55 osReadDir = func(dirname string) ([]fs.DirEntry, error) { 56 if called { 57 return nil, testError 58 } 59 called = true 60 61 // Provoke a second call. 62 fi, err := os.Lstat("/tmp") 63 if err != nil { 64 t.Fatalf("Unexpected error %v", err) 65 } 66 67 return []fs.DirEntry{fs.FileInfoToDirEntry(fi)}, nil 68 } 69 defer cleanupTest() 70 71 _, err := HostDevices() 72 if !errors.Is(err, testError) { 73 t.Fatalf("Unexpected error %v, expected %v", err, testError) 74 } 75 } 76 77 func TestHostDevicesAllValid(t *testing.T) { 78 devices, err := HostDevices() 79 if err != nil { 80 t.Fatalf("failed to get host devices: %v", err) 81 } 82 83 for _, device := range devices { 84 // Devices can't have major number 0. 85 if device.Major == 0 { 86 t.Errorf("device entry %+v has zero major number", device) 87 } 88 switch device.Type { 89 case BlockDevice, CharDevice: 90 case FifoDevice: 91 t.Logf("fifo devices shouldn't show up from HostDevices") 92 fallthrough 93 default: 94 t.Errorf("device entry %+v has unexpected type %v", device, device.Type) 95 } 96 } 97 }