master
go 278 lines 7.39 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package hddtemp
4
5 import (
6 "context"
7 "errors"
8 "os"
9 "testing"
10
11 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/collecttest"
12
13 "github.com/stretchr/testify/assert"
14 "github.com/stretchr/testify/require"
15 )
16
17 var (
18 dataConfigJSON, _ = os.ReadFile("testdata/config.json")
19 dataConfigYAML, _ = os.ReadFile("testdata/config.yaml")
20
21 dataAllOK, _ = os.ReadFile("testdata/hddtemp-all-ok.txt")
22 dataAllSleep, _ = os.ReadFile("testdata/hddtemp-all-sleep.txt")
23 )
24
25 func Test_testDataIsValid(t *testing.T) {
26 for name, data := range map[string][]byte{
27 "dataConfigJSON": dataConfigJSON,
28 "dataConfigYAML": dataConfigYAML,
29
30 "dataAllOK": dataAllOK,
31 "dataAllSleep": dataAllSleep,
32 } {
33 require.NotNil(t, data, name)
34 }
35 }
36
37 func TestCollector_ConfigurationSerialize(t *testing.T) {
38 collecttest.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
39 }
40
41 func TestCollector_Init(t *testing.T) {
42 tests := map[string]struct {
43 config Config
44 wantFail bool
45 }{
46 "success with default config": {
47 wantFail: false,
48 config: New().Config,
49 },
50 "fails if address not set": {
51 wantFail: true,
52 config: func() Config {
53 conf := New().Config
54 conf.Address = ""
55 return conf
56 }(),
57 },
58 }
59
60 for name, test := range tests {
61 t.Run(name, func(t *testing.T) {
62 collr := New()
63 collr.Config = test.config
64
65 if test.wantFail {
66 assert.Error(t, collr.Init(context.Background()))
67 } else {
68 assert.NoError(t, collr.Init(context.Background()))
69 }
70 })
71 }
72 }
73
74 func TestCollector_Cleanup(t *testing.T) {
75 tests := map[string]struct {
76 prepare func() *Collector
77 }{
78 "not initialized": {
79 prepare: func() *Collector {
80 return New()
81 },
82 },
83 "after check": {
84 prepare: func() *Collector {
85 collr := New()
86 collr.conn = prepareMockAllDisksOk()
87 _ = collr.Check(context.Background())
88 return collr
89 },
90 },
91 "after collect": {
92 prepare: func() *Collector {
93 collr := New()
94 collr.conn = prepareMockAllDisksOk()
95 _ = collr.Collect(context.Background())
96 return collr
97 },
98 },
99 }
100
101 for name, test := range tests {
102 t.Run(name, func(t *testing.T) {
103 collr := test.prepare()
104
105 assert.NotPanics(t, func() { collr.Cleanup(context.Background()) })
106 })
107 }
108 }
109
110 func TestCollector_Charts(t *testing.T) {
111 assert.NotNil(t, New().Charts())
112 }
113
114 func TestCollector_Check(t *testing.T) {
115 tests := map[string]struct {
116 prepareMock func() *mockHddTempConn
117 wantFail bool
118 }{
119 "all disks ok": {
120 wantFail: false,
121 prepareMock: prepareMockAllDisksOk,
122 },
123 "all disks sleep": {
124 wantFail: false,
125 prepareMock: prepareMockAllDisksSleep,
126 },
127 "unexpected response": {
128 wantFail: true,
129 prepareMock: prepareMockUnexpectedResponse,
130 },
131 "empty response": {
132 wantFail: true,
133 prepareMock: prepareMockEmptyResponse,
134 },
135 }
136
137 for name, test := range tests {
138 t.Run(name, func(t *testing.T) {
139 collr := New()
140 collr.conn = test.prepareMock()
141
142 if test.wantFail {
143 assert.Error(t, collr.Check(context.Background()))
144 } else {
145 assert.NoError(t, collr.Check(context.Background()))
146 }
147 })
148 }
149 }
150
151 func TestCollector_Collect(t *testing.T) {
152 tests := map[string]struct {
153 prepareMock func() *mockHddTempConn
154 wantMetrics map[string]int64
155 wantDisconnect bool
156 wantCharts int
157 }{
158 "all disks ok": {
159 prepareMock: prepareMockAllDisksOk,
160 wantDisconnect: true,
161 wantCharts: 2 * 4,
162 wantMetrics: map[string]int64{
163 "disk_sda_temp_sensor_status_err": 0,
164 "disk_sda_temp_sensor_status_na": 0,
165 "disk_sda_temp_sensor_status_nos": 0,
166 "disk_sda_temp_sensor_status_ok": 1,
167 "disk_sda_temp_sensor_status_slp": 0,
168 "disk_sda_temp_sensor_status_unk": 0,
169 "disk_sda_temperature": 50,
170 "disk_sdb_temp_sensor_status_err": 0,
171 "disk_sdb_temp_sensor_status_na": 0,
172 "disk_sdb_temp_sensor_status_nos": 0,
173 "disk_sdb_temp_sensor_status_ok": 1,
174 "disk_sdb_temp_sensor_status_slp": 0,
175 "disk_sdb_temp_sensor_status_unk": 0,
176 "disk_sdb_temperature": 49,
177 "disk_sdc_temp_sensor_status_err": 0,
178 "disk_sdc_temp_sensor_status_na": 0,
179 "disk_sdc_temp_sensor_status_nos": 0,
180 "disk_sdc_temp_sensor_status_ok": 1,
181 "disk_sdc_temp_sensor_status_slp": 0,
182 "disk_sdc_temp_sensor_status_unk": 0,
183 "disk_sdc_temperature": 27,
184 "disk_sdd_temp_sensor_status_err": 0,
185 "disk_sdd_temp_sensor_status_na": 0,
186 "disk_sdd_temp_sensor_status_nos": 0,
187 "disk_sdd_temp_sensor_status_ok": 1,
188 "disk_sdd_temp_sensor_status_slp": 0,
189 "disk_sdd_temp_sensor_status_unk": 0,
190 "disk_sdd_temperature": 29,
191 },
192 },
193 "all disks sleep": {
194 prepareMock: prepareMockAllDisksSleep,
195 wantDisconnect: true,
196 wantCharts: 3,
197 wantMetrics: map[string]int64{
198 "disk_ata-HUP722020APA330_BFGWU7WF_temp_sensor_status_err": 0,
199 "disk_ata-HUP722020APA330_BFGWU7WF_temp_sensor_status_na": 0,
200 "disk_ata-HUP722020APA330_BFGWU7WF_temp_sensor_status_nos": 0,
201 "disk_ata-HUP722020APA330_BFGWU7WF_temp_sensor_status_ok": 0,
202 "disk_ata-HUP722020APA330_BFGWU7WF_temp_sensor_status_slp": 1,
203 "disk_ata-HUP722020APA330_BFGWU7WF_temp_sensor_status_unk": 0,
204 "disk_ata-HUP722020APA330_BFJ0WS3F_temp_sensor_status_err": 0,
205 "disk_ata-HUP722020APA330_BFJ0WS3F_temp_sensor_status_na": 0,
206 "disk_ata-HUP722020APA330_BFJ0WS3F_temp_sensor_status_nos": 0,
207 "disk_ata-HUP722020APA330_BFJ0WS3F_temp_sensor_status_ok": 0,
208 "disk_ata-HUP722020APA330_BFJ0WS3F_temp_sensor_status_slp": 1,
209 "disk_ata-HUP722020APA330_BFJ0WS3F_temp_sensor_status_unk": 0,
210 "disk_ata-WDC_WD10EARS-00Y5B1_WD-WCAV5R693922_temp_sensor_status_err": 0,
211 "disk_ata-WDC_WD10EARS-00Y5B1_WD-WCAV5R693922_temp_sensor_status_na": 0,
212 "disk_ata-WDC_WD10EARS-00Y5B1_WD-WCAV5R693922_temp_sensor_status_nos": 0,
213 "disk_ata-WDC_WD10EARS-00Y5B1_WD-WCAV5R693922_temp_sensor_status_ok": 0,
214 "disk_ata-WDC_WD10EARS-00Y5B1_WD-WCAV5R693922_temp_sensor_status_slp": 1,
215 "disk_ata-WDC_WD10EARS-00Y5B1_WD-WCAV5R693922_temp_sensor_status_unk": 0,
216 },
217 },
218 "unexpected response": {
219 prepareMock: prepareMockUnexpectedResponse,
220 wantDisconnect: true,
221 },
222 "empty response": {
223 prepareMock: prepareMockEmptyResponse,
224 wantDisconnect: true,
225 },
226 }
227
228 for name, test := range tests {
229 t.Run(name, func(t *testing.T) {
230 collr := New()
231 collr.conn = test.prepareMock()
232
233 mx := collr.Collect(context.Background())
234
235 assert.Equal(t, test.wantMetrics, mx)
236
237 assert.Len(t, *collr.Charts(), test.wantCharts, "wantCharts")
238
239 collecttest.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
240 })
241 }
242 }
243
244 func prepareMockAllDisksOk() *mockHddTempConn {
245 return &mockHddTempConn{
246 hddTempLine: string(dataAllOK),
247 }
248 }
249
250 func prepareMockAllDisksSleep() *mockHddTempConn {
251 return &mockHddTempConn{
252 hddTempLine: string(dataAllSleep),
253 }
254 }
255
256 func prepareMockUnexpectedResponse() *mockHddTempConn {
257 return &mockHddTempConn{
258 hddTempLine: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
259 }
260 }
261
262 func prepareMockEmptyResponse() *mockHddTempConn {
263 return &mockHddTempConn{
264 hddTempLine: "",
265 }
266 }
267
268 type mockHddTempConn struct {
269 errOnQueryHddTemp bool
270 hddTempLine string
271 }
272
273 func (m *mockHddTempConn) queryHddTemp() (string, error) {
274 if m.errOnQueryHddTemp {
275 return "", errors.New("mock.queryHddTemp() error")
276 }
277 return m.hddTempLine, nil
278 }