...

Source file src/github.com/opencontainers/runc/libcontainer/devices/device_unix_test.go

Documentation: github.com/opencontainers/runc/libcontainer/devices

     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  }
    98  

View as plain text