1package disk 2 3import ( 4 "fmt" 5 "runtime" 6 "sync" 7 "testing" 8 9 "github.com/shirou/gopsutil/v3/internal/common" 10) 11 12func skipIfNotImplementedErr(t *testing.T, err error) { 13 if err == common.ErrNotImplementedError { 14 t.Skip("not implemented") 15 } 16} 17 18func TestDisk_usage(t *testing.T) { 19 path := "/" 20 if runtime.GOOS == "windows" { 21 path = "C:" 22 } 23 v, err := Usage(path) 24 skipIfNotImplementedErr(t, err) 25 if err != nil { 26 t.Errorf("error %v", err) 27 } 28 if v.Path != path { 29 t.Errorf("error %v", err) 30 } 31} 32 33func TestDisk_partitions(t *testing.T) { 34 ret, err := Partitions(false) 35 skipIfNotImplementedErr(t, err) 36 if err != nil || len(ret) == 0 { 37 t.Errorf("error %v", err) 38 } 39 t.Log(ret) 40 41 if len(ret) == 0 { 42 t.Errorf("ret is empty") 43 } 44 for _, disk := range ret { 45 if disk.Device == "" { 46 t.Errorf("Could not get device info %v", disk) 47 } 48 } 49} 50 51func TestDisk_io_counters(t *testing.T) { 52 ret, err := IOCounters() 53 skipIfNotImplementedErr(t, err) 54 if err != nil { 55 t.Errorf("error %v", err) 56 } 57 if len(ret) == 0 { 58 t.Errorf("ret is empty") 59 } 60 empty := IOCountersStat{} 61 for part, io := range ret { 62 t.Log(part, io) 63 if io == empty { 64 t.Errorf("io_counter error %v, %v", part, io) 65 } 66 } 67} 68 69// https://github.com/shirou/gopsutil/issues/560 regression test 70func TestDisk_io_counters_concurrency_on_darwin_cgo(t *testing.T) { 71 if runtime.GOOS != "darwin" { 72 t.Skip("darwin only") 73 } 74 var wg sync.WaitGroup 75 const max = 1000 76 for i := 1; i < max; i++ { 77 wg.Add(1) 78 go func() { 79 defer wg.Done() 80 IOCounters() 81 }() 82 } 83 wg.Wait() 84} 85 86func TestDiskUsageStat_String(t *testing.T) { 87 v := UsageStat{ 88 Path: "/", 89 Total: 1000, 90 Free: 2000, 91 Used: 3000, 92 UsedPercent: 50.1, 93 InodesTotal: 4000, 94 InodesUsed: 5000, 95 InodesFree: 6000, 96 InodesUsedPercent: 49.1, 97 Fstype: "ext4", 98 } 99 e := `{"path":"/","fstype":"ext4","total":1000,"free":2000,"used":3000,"usedPercent":50.1,"inodesTotal":4000,"inodesUsed":5000,"inodesFree":6000,"inodesUsedPercent":49.1}` 100 if e != fmt.Sprintf("%v", v) { 101 t.Errorf("DiskUsageStat string is invalid: %v", v) 102 } 103} 104 105func TestDiskPartitionStat_String(t *testing.T) { 106 v := PartitionStat{ 107 Device: "sd01", 108 Mountpoint: "/", 109 Fstype: "ext4", 110 Opts: []string{"ro"}, 111 } 112 e := `{"device":"sd01","mountpoint":"/","fstype":"ext4","opts":["ro"]}` 113 if e != fmt.Sprintf("%v", v) { 114 t.Errorf("DiskUsageStat string is invalid: %v", v) 115 } 116} 117 118func TestDiskIOCountersStat_String(t *testing.T) { 119 v := IOCountersStat{ 120 Name: "sd01", 121 ReadCount: 100, 122 WriteCount: 200, 123 ReadBytes: 300, 124 WriteBytes: 400, 125 SerialNumber: "SERIAL", 126 } 127 e := `{"readCount":100,"mergedReadCount":0,"writeCount":200,"mergedWriteCount":0,"readBytes":300,"writeBytes":400,"readTime":0,"writeTime":0,"iopsInProgress":0,"ioTime":0,"weightedIO":0,"name":"sd01","serialNumber":"SERIAL","label":""}` 128 if e != fmt.Sprintf("%v", v) { 129 t.Errorf("DiskUsageStat string is invalid: %v", v) 130 } 131} 132