API
 
Loading...
Searching...
No Matches
sysMonitor_test.cpp
Go to the documentation of this file.
1/** \file sysMonitor_test.cpp
2 * \brief Catch2 tests for the sysMonitor app.
3 * \author Jared R. Males (jaredmales@gmail.com)
4 *
5 * \ingroup sysMonitor_files
6 */
7
8#include "../../../tests/testXWC.hpp"
9#include "../../../tests/testMacrosINDI.hpp"
10
11#include "../sysMonitor.hpp"
12
13using namespace MagAOX::app;
14
15namespace libXWCTest
16{
17
18/** \defgroup sysMonitor_unit_test sysMonitor Unit Tests
19 * \brief Unit tests for the sysMonitor application.
20 *
21 * \ingroup application_unit_test
22 */
23
24/// Namespace for `sysMonitor` unit tests.
25/** \ingroup sysMonitor_unit_test
26 */
27namespace sysMonitorTest
28{
29
30/// Verify the sysMonitor parser helpers accept valid system-monitor lines and reject malformed input.
31/**
32 * \ingroup sysMonitor_unit_test
33 */
34SCENARIO( "System monitor is constructed and CPU temperature results are passed in", "[sysMonitor]" )
35{
36 // clang-format off
37 #ifdef SYSMONITOR_TEST_DOXYGEN_REF
38 sysMonitor::parseCPUTemperatures( *(float *)nullptr, "" );
39 sysMonitor::parseCPULoads( *(float *)nullptr, "" );
40 sysMonitor::parseDiskTemperature( *(float *)nullptr, "" );
41 sysMonitor::parseDiskUsage( "", *(float *)nullptr );
42 sysMonitor::parseRamUsage( "", *(float *)nullptr );
43 #endif
44 // clang-format on
45
46 GIVEN( "A default constructed system monitor object and an empty vector for temperatures" )
47 {
49 int rv;
50 float temps = -1;
51
52 // Fails with whitespace in front, but is this necessary to correct for?
53
54 WHEN( "Correct line is given" )
55 {
56 rv = sm.parseCPUTemperatures( temps, "Core 0: +42.0°C (high = +100.0°C, crit = +100.0°C)" );
57 REQUIRE( rv == 0 );
58 REQUIRE( temps == 42 );
59 }
60
61 WHEN( "Correct line is given" )
62 {
63 rv = sm.parseCPUTemperatures( temps, "Core 1: +45.0°C (high = +100.0°C, crit = +100.0°C)" );
64 REQUIRE( rv == 0 );
65 REQUIRE( temps == 45 );
66 }
67
68 WHEN( "Correct line is given" )
69 {
70 rv = sm.parseCPUTemperatures( temps, "Core 2: +91.0°C (high = +100.0°C, crit = +100.0°C)" );
71 REQUIRE( rv == 0 );
72 REQUIRE( temps == 91 );
73 }
74
75 WHEN( "Blank line is given" )
76 {
77 rv = sm.parseCPUTemperatures( temps, "" );
78 REQUIRE( rv == -1 );
79 REQUIRE( temps == -999 );
80 }
81
82 WHEN( "Incorrect line is given" )
83 {
84 rv = sm.parseCPUTemperatures( temps, "coretemp-isa-0000" );
85 REQUIRE( rv == -1 );
86 REQUIRE( temps == -999 );
87 }
88
89 WHEN( "Corrupted line is given" )
90 {
91 rv = sm.parseCPUTemperatures( temps, "Core 3:+91.0° XXXXXXX" );
92 REQUIRE( rv == -1 );
93 REQUIRE( temps == -999 );
94 }
95
96 WHEN( "Corrupted line is given" )
97 {
98 rv = sm.parseCPUTemperatures( temps, "Core2: +91.0°C(high =+100.0°C, crit= +100.0°C)" );
99 REQUIRE( rv == -1 );
100 REQUIRE( temps == -999 );
101 }
102 }
103}
104
105SCENARIO( "System monitor is constructed and CPU load results are passed in", "[sysMonitor]" )
106{
107 GIVEN( "A default constructed system monitor object and an empty vector for loads" )
108 {
110 int rv;
111 float loads = -1;
112
113 // Fails with whitespace in front, but is this necessary to correct for?
114
115 WHEN( "Correct line is given" )
116 {
117 rv = sm.parseCPULoads(
118 loads,
119 "02:35:43 PM 0 6.57 0.02 1.32 0.24 0.00 0.00 0.00 0.00 0.00 91.85" );
120 REQUIRE( rv == 0 );
121 REQUIRE( ( loads - 0.0815 ) < 0.0005 );
122 }
123
124 WHEN( "Correct line is given" )
125 {
126 rv = sm.parseCPULoads(
127 loads,
128 "10:32:28 AM 1 6.54 0.21 2.75 24.64 0.00 0.06 0.00 0.00 0.00 65.81" );
129 REQUIRE( rv == 0 );
130 REQUIRE( ( loads - 0.3419 ) < 0.0005 );
131 }
132
133 WHEN( "Correct line is given" )
134 {
135 rv = sm.parseCPULoads(
136 loads,
137 "10:32:28 AM 3 4.24 0.03 1.97 5.52 0.00 0.00 0.00 0.00 0.00 88.24" );
138 REQUIRE( rv == 0 );
139 REQUIRE( ( loads - 0.1176 ) < 0.0005 );
140 }
141
142 WHEN( "Blank line is given" )
143 {
144 rv = sm.parseCPULoads( loads, "" );
145 REQUIRE( rv == -1 );
146 REQUIRE( loads == -1 );
147 }
148
149 WHEN( "Incorrect line is given" )
150 {
151 rv = sm.parseCPULoads( loads,
152 "02:35:43 PM CPU %%usr %%nice %%sys %%iowait %%irq %%soft %%steal "
153 "%%guest %%gnice %%idle" );
154 REQUIRE( rv == -1 );
155 REQUIRE( loads == -1 );
156 }
157
158 WHEN( "Corrupted line is given" )
159 {
160 rv = sm.parseCPULoads( loads,
161 "10:32:28AM 2 5.24 0.14 2.70_1.41 0.00 0.00 0.00 0.00 "
162 "0.00 80.50 ncawd vexing" );
163 REQUIRE( rv == -1 );
164 REQUIRE( loads == -1 );
165 }
166 }
167}
168
169SCENARIO( "System monitor is constructed and disk temperature result is passed in", "[sysMonitor]" )
170{
171 GIVEN( "A default constructed system monitor object and an empty float for temperature" )
172 {
174 int rv;
175 float hdd_temp = -1;
176 std::string dname;
177
178 // Fails with whitespace in front, but is this necessary to correct for?
179
180 WHEN( "Correct line is given for hard drive" )
181 {
182 rv = sm.parseDiskTemperature( dname, hdd_temp, "/dev/sda: ST1000LM024 HN-M101MBB: 31°C" );
183 REQUIRE( rv == 0 );
184 REQUIRE( dname == "sda" );
185 REQUIRE( hdd_temp == 31 );
186 }
187
188 WHEN( "Correct line is given for ssd" )
189 {
190 rv = sm.parseDiskTemperature( dname, hdd_temp, "/dev/sda: Samsung SSD 860 EVO 500GB: 27°C" );
191 REQUIRE( rv == 0 );
192 REQUIRE( dname == "sda" );
193 REQUIRE( hdd_temp == 27 );
194 }
195
196 WHEN( "Correct line is given for ssd" )
197 {
198 rv = sm.parseDiskTemperature( dname, hdd_temp, "/dev/sdd: Samsung SSD 860 EVO 1TB: 100°C" );
199 REQUIRE( rv == 0 );
200 REQUIRE( dname == "sdd" );
201 REQUIRE( hdd_temp == 100 );
202 }
203
204 WHEN( "Blank line is given" )
205 {
206 rv = sm.parseDiskTemperature( dname, hdd_temp, "" );
207 REQUIRE( rv == -1 );
208 REQUIRE( dname == "" );
209 REQUIRE( hdd_temp == -999 );
210 }
211
212 WHEN( "Incorrect line is given" )
213 {
214 rv = sm.parseDiskTemperature( dname, hdd_temp, "/dev/sda: ST1000LM024_HN-M101MBB: 999999" );
215 REQUIRE( rv == -1 );
216 REQUIRE( dname == "" );
217 REQUIRE( hdd_temp == -999 );
218 }
219
220 WHEN( "Corrupted line is given" )
221 {
222 rv = sm.parseDiskTemperature( dname, hdd_temp, "/dev/sdaT10 00L M0 24N-M101 MBB:31°CMBB" );
223 REQUIRE( rv == -1 );
224 REQUIRE( dname == "" );
225 REQUIRE( hdd_temp == -999 );
226 }
227 }
228}
229
230SCENARIO( "System monitor is constructed and disk usage result is passed in", "[sysMonitor]" )
231{
232 GIVEN( "A default constructed system monitor object and an empty float for usage" )
233 {
235 int rv;
236 float rootUsage = -1;
237 float dataUsage = -1;
238 float bootUsage = -1;
239
240 // Fails with whitespace in front, but is this necessary to correct for?
241
242 WHEN( "Correct line is given for root" )
243 {
244 rv = sm.parseDiskUsage(
245 "/dev/mapper/cl-root 52403200 12321848 40081352 24% /", rootUsage, dataUsage, bootUsage );
246 REQUIRE( rv == 0 );
247 REQUIRE( ( rootUsage - 0.24f ) < 0.0005 );
248 }
249
250 WHEN( "Correct line for /data is given" )
251 {
252 rv = sm.parseDiskUsage(
253 "/dev/md124 1952297568 81552 1952216016 1% /data", rootUsage, dataUsage, bootUsage );
254 REQUIRE( rv == 0 );
255 REQUIRE( ( dataUsage - 0.01f ) < 0.0005 );
256 }
257
258 WHEN( "Correct line for /boot is given" )
259 {
260 rv = sm.parseDiskUsage(
261 "/dev/md126 484004 289264 194740 60% /boot", rootUsage, dataUsage, bootUsage );
262 REQUIRE( rv == 0 );
263 REQUIRE( ( bootUsage - 0.6f ) < 0.0005 );
264 }
265
266 WHEN( "Blank line is given" )
267 {
268 rv = sm.parseDiskUsage( "", rootUsage, dataUsage, bootUsage );
269 REQUIRE( rv == -1 );
270 REQUIRE( rootUsage == -1 );
271 REQUIRE( dataUsage == -1 );
272 REQUIRE( bootUsage == -1 );
273 }
274
275 WHEN( "Incorrect line is given" )
276 {
277 rv = sm.parseDiskUsage(
278 "/dev/mapper/cl-root2403200 12321848 40081352 24% / 23e32 dwwe", rootUsage, dataUsage, bootUsage );
279 REQUIRE( rv == -1 );
280 REQUIRE( rootUsage == -1 );
281 REQUIRE( dataUsage == -1 );
282 REQUIRE( bootUsage == -1 );
283 }
284
285 WHEN( "Corrupted line is given" )
286 {
287 rv = sm.parseDiskUsage(
288 "/dev/mapper/cl-root 52403200 12321848 40081352 aa% /", rootUsage, dataUsage, bootUsage );
289 REQUIRE( rv == -1 );
290 REQUIRE( rootUsage == -1 );
291 REQUIRE( dataUsage == -1 );
292 REQUIRE( bootUsage == -1 );
293 }
294 }
295}
296
297SCENARIO( "System monitor is constructed and ram usage result is passed in", "[sysMonitor]" )
298{
299 GIVEN( "A default constructed system monitor object and an float for usage" )
300 {
302 int rv;
303 float ramUsage = -1;
304
305 // Fails with whitespace in front, but is this necessary to correct for?
306
307 WHEN( "Correct line is given" )
308 {
309 rv = sm.parseRamUsage( "Mem: 7714 1308 4550 288 1855 5807",
310 ramUsage );
311 REQUIRE( rv == 0 );
312 REQUIRE( ramUsage == (float)1308 / 7714 );
313 }
314
315 WHEN( "Correct line is given" )
316 {
317 rv = sm.parseRamUsage( "Mem: 7777 7700 4550 288 1855 5807",
318 ramUsage );
319 REQUIRE( rv == 0 );
320 REQUIRE( ramUsage == (float)7700 / 7777 );
321 }
322
323 WHEN( "Blank line is given" )
324 {
325 rv = sm.parseRamUsage( "", ramUsage );
326 REQUIRE( rv == -1 );
327 REQUIRE( ramUsage == -1 );
328 }
329
330 WHEN( "Incorrect line is given" )
331 {
332 rv = sm.parseRamUsage( "Swap: 7935 0 7935", ramUsage );
333 REQUIRE( rv == -1 );
334 REQUIRE( ramUsage == -1 );
335 }
336
337 WHEN( "Corrupted line is given" )
338 {
339 rv = sm.parseRamUsage( "Mem: 1308 7714 4550 288 1855 5807",
340 ramUsage );
341 REQUIRE( rv == -1 );
342 REQUIRE( ramUsage == -1 );
343 }
344 }
345}
346
347/// \cond DOXYGEN_SUPPRESS_TEST_HARNESS
348class sysMonitor_test : public sysMonitor
349{
350
351 public:
352 sysMonitor_test( const std::string device )
353 {
354 m_configName = device;
355
357 }
358};
359/// \endcond
360
361/// Verify the sysMonitor INDI callback validator accepts only the expected property.
362/**
363 * \ingroup sysMonitor_unit_test
364 */
365SCENARIO( "INDI Callbacks", "[sysMonitor]" )
366{
367 // clang-format off
368 #ifdef SYSMONITOR_TEST_DOXYGEN_REF
369 sysMonitor::newCallBack_m_indiP_setlat( pcf::IndiProperty() );
370 #endif
371 // clang-format on
372
374}
375
376} // namespace sysMonitorTest
377
378} // namespace libXWCTest
int parseDiskTemperature(std::string &driveName, float &temp, const std::string &line)
Parses string from system call to find drive temperatures.
int parseCPUTemperatures(float &temp, const std::string &line)
Parses string from system call to find CPU temperatures.
int parseCPULoads(float &, const std::string &)
Parses string from system call to find CPU usage loads.
int parseDiskUsage(std::string, float &, float &, float &)
Parses string from system call to find drive usage space.
int parseRamUsage(std::string, float &)
Parses string from system call to find RAM usage.
SCENARIO("System monitor is constructed and CPU temperature results are passed in", "[sysMonitor]")
Verify the sysMonitor parser helpers accept valid system-monitor lines and reject malformed input.
#define XWCTEST_INDI_NEW_CALLBACK(testclass, propname)
Catch-2 tests for whether a NEW callback properly validates the input property properly.
Namespace for all libXWC tests.
#define XWCTEST_SETUP_INDI_NEW_PROP(propname)