1package host
2
3import (
4	"fmt"
5	"os"
6	"sync"
7	"testing"
8
9	"github.com/shirou/gopsutil/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 TestHostInfo(t *testing.T) {
19	v, err := Info()
20	skipIfNotImplementedErr(t, err)
21	if err != nil {
22		t.Errorf("error %v", err)
23	}
24	empty := &InfoStat{}
25	if v == empty {
26		t.Errorf("Could not get hostinfo %v", v)
27	}
28	if v.Procs == 0 {
29		t.Errorf("Could not determine the number of host processes")
30	}
31}
32
33func TestUptime(t *testing.T) {
34	if os.Getenv("CIRCLECI") == "true" {
35		t.Skip("Skip CI")
36	}
37
38	v, err := Uptime()
39	skipIfNotImplementedErr(t, err)
40	if err != nil {
41		t.Errorf("error %v", err)
42	}
43	if v == 0 {
44		t.Errorf("Could not get up time %v", v)
45	}
46}
47
48func TestBoot_time(t *testing.T) {
49	if os.Getenv("CIRCLECI") == "true" {
50		t.Skip("Skip CI")
51	}
52	v, err := BootTime()
53	skipIfNotImplementedErr(t, err)
54	if err != nil {
55		t.Errorf("error %v", err)
56	}
57	if v == 0 {
58		t.Errorf("Could not get boot time %v", v)
59	}
60	if v < 946652400 {
61		t.Errorf("Invalid Boottime, older than 2000-01-01")
62	}
63	t.Logf("first boot time: %d", v)
64
65	v2, err := BootTime()
66	skipIfNotImplementedErr(t, err)
67	if err != nil {
68		t.Errorf("error %v", err)
69	}
70	if v != v2 {
71		t.Errorf("cached boot time is different")
72	}
73	t.Logf("second boot time: %d", v2)
74}
75
76func TestUsers(t *testing.T) {
77	v, err := Users()
78	skipIfNotImplementedErr(t, err)
79	if err != nil {
80		t.Errorf("error %v", err)
81	}
82	empty := UserStat{}
83	if len(v) == 0 {
84		t.Skip("Users is empty")
85	}
86	for _, u := range v {
87		if u == empty {
88			t.Errorf("Could not Users %v", v)
89		}
90	}
91}
92
93func TestHostInfoStat_String(t *testing.T) {
94	v := InfoStat{
95		Hostname:   "test",
96		Uptime:     3000,
97		Procs:      100,
98		OS:         "linux",
99		Platform:   "ubuntu",
100		BootTime:   1447040000,
101		HostID:     "edfd25ff-3c9c-b1a4-e660-bd826495ad35",
102		KernelArch: "x86_64",
103	}
104	e := `{"hostname":"test","uptime":3000,"bootTime":1447040000,"procs":100,"os":"linux","platform":"ubuntu","platformFamily":"","platformVersion":"","kernelVersion":"","kernelArch":"x86_64","virtualizationSystem":"","virtualizationRole":"","hostid":"edfd25ff-3c9c-b1a4-e660-bd826495ad35"}`
105	if e != fmt.Sprintf("%v", v) {
106		t.Errorf("HostInfoStat string is invalid:\ngot  %v\nwant %v", v, e)
107	}
108}
109
110func TestUserStat_String(t *testing.T) {
111	v := UserStat{
112		User:     "user",
113		Terminal: "term",
114		Host:     "host",
115		Started:  100,
116	}
117	e := `{"user":"user","terminal":"term","host":"host","started":100}`
118	if e != fmt.Sprintf("%v", v) {
119		t.Errorf("UserStat string is invalid: %v", v)
120	}
121}
122
123func TestHostGuid(t *testing.T) {
124	id, err := HostID()
125	skipIfNotImplementedErr(t, err)
126	if err != nil {
127		t.Error(err)
128	}
129	if id == "" {
130		t.Error("Host id is empty")
131	} else {
132		t.Logf("Host id value: %v", id)
133	}
134}
135
136func TestTemperatureStat_String(t *testing.T) {
137	v := TemperatureStat{
138		SensorKey:   "CPU",
139		Temperature: 1.1,
140	}
141	s := `{"sensorKey":"CPU","sensorTemperature":1.1}`
142	if s != fmt.Sprintf("%v", v) {
143		t.Errorf("TemperatureStat string is invalid")
144	}
145}
146
147func TestVirtualization(t *testing.T) {
148	wg := sync.WaitGroup{}
149	testCount := 10
150	wg.Add(testCount)
151	for i := 0; i < testCount; i++ {
152		go func(j int) {
153			system, role, err := Virtualization()
154			wg.Done()
155			skipIfNotImplementedErr(t, err)
156			if err != nil {
157				t.Errorf("Virtualization() failed, %v", err)
158			}
159
160			if j == 9 {
161				t.Logf("Virtualization(): %s, %s", system, role)
162			}
163		}(i)
164	}
165	wg.Wait()
166}
167
168func TestKernelVersion(t *testing.T) {
169	version, err := KernelVersion()
170	skipIfNotImplementedErr(t, err)
171	if err != nil {
172		t.Errorf("KernelVersion() failed, %v", err)
173	}
174	if version == "" {
175		t.Errorf("KernelVersion() returns empty: %s", version)
176	}
177
178	t.Logf("KernelVersion(): %s", version)
179}
180
181func TestPlatformInformation(t *testing.T) {
182	platform, family, version, err := PlatformInformation()
183	skipIfNotImplementedErr(t, err)
184	if err != nil {
185		t.Errorf("PlatformInformation() failed, %v", err)
186	}
187	if platform == "" {
188		t.Errorf("PlatformInformation() returns empty: %v", platform)
189	}
190
191	t.Logf("PlatformInformation(): %v, %v, %v", platform, family, version)
192}
193