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