Skip to content

Commit c7ab0a4

Browse files
committed
test: sweep part 1 - rename EXAMPLE fixtures to scenario names and modernize run files
Convert 45 plugins from the legacy `EXAMPLE01..NN` fixture scheme and the per-method `test_if_check_runs_EXAMPLE*` style to the declarative `TESTS` list pattern driven by `lib.lftest.run()`, following the conventions in CONTRIBUTING.md "Test data file naming" and "Writing tests". Highlights: - Fixture files now describe the data shape (e.g. `all-operational`, `minor-outage`, `three-scopes-two-high-usage`, `mongodb-11-percent-used`), not an expected plugin state. The expected state moves into the testcase `id` prefix (`ok-`, `warn-`, `crit-`, `unknown-`). - `disk-smart`: all 28 fixtures carry the `smartctl-v6-text-` prefix so that future `smartctl-v7-json-*` captures can live alongside them. - Fixtures that exercised clearly identical scenarios were consolidated (e.g. `atlassian-statuspage` dropped a second "Partially Degraded Service" clone). - `atlassian-statuspage` gained a `critical-outage` fixture to cover the previously-untested STATE_CRIT branch. - `fail2ban` gained a real `no-jails-configured` fixture pair to replace the missing-file trick the previous test used. - `gitlab-readiness` EXAMPLE08 was mis-understood in the legacy code as "status ok" - it actually exercises the "Unknown error fetching URL" path, now renamed and asserted correctly. Plugins deliberately left untouched in this pass: - `csv-values`: the plugin has no `--test` hook, it reads from `--filename` directly. Renaming needs a different harness. - `logfile`: no legacy `run` file, plugin maintains real on-disk state across runs. - `openvpn-client-list`: no legacy `run` file, plugin `--test` implementation currently just prints `TODO`. - `mediawiki-version`: converted to the modern skeleton but its only testcase still calls `lib.version.check_eol` directly over live HTTP because the plugin has no offline test hook. All 45 converted plugins run green under `./run` and under `tools/run-unit-tests --no-container`.
1 parent 96c2e23 commit c7ab0a4

File tree

156 files changed

+1559
-2377
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

156 files changed

+1559
-2377
lines changed

check-plugins/atlassian-statuspage/unit-test/run

Lines changed: 62 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -9,75 +9,77 @@
99
# https://github.com/Linuxfabrik/monitoring-plugins/blob/main/CONTRIBUTING.md
1010

1111
import sys
12-
13-
sys.path.insert(0, '..') # Adds higher directory to python modules path.
14-
12+
sys.path.insert(0, '..')
1513

1614
import unittest
1715

18-
from lib.globals import STATE_OK, STATE_UNKNOWN, STATE_WARN, STATE_CRIT
19-
import lib.base
20-
import lib.shell
21-
16+
from lib.globals import STATE_CRIT, STATE_OK, STATE_WARN
17+
import lib.lftest
2218

23-
class TestCheck(unittest.TestCase):
24-
check = '../atlassian-statuspage'
2519

26-
# self.assertEqual(retc, STATE_CRIT)
27-
# self.assertIn('Waiting for more data (1).', stdout)
28-
# self.assertRegex(stdout, r'1 error in Kernel Ring Buffer.')
29-
30-
def test_if_check_runs_EXAMPLE01(self):
31-
stdout, stderr, retc = lib.base.coe(
32-
lib.shell.shell_exec(self.check + ' --test=stdout/EXAMPLE01,,0')
33-
)
34-
self.assertIn(
35-
'Partially Degraded Service @ https://exact.statuspage.io, last update at 2025-05-28T11:04:36 Europe/London',
36-
stdout,
37-
)
38-
self.assertEqual(stderr, '')
39-
self.assertEqual(retc, STATE_WARN)
20+
# Fixtures were captured from real Atlassian-Statuspage-powered pages:
21+
#
22+
# all-operational - status.atlassian.com
23+
# indicator: "none"
24+
# minor-partially-degraded - exact.statuspage.io
25+
# indicator: "minor"
26+
# minor-outage - status.cloudflarestatus.com
27+
# indicator: "minor"
28+
# minor-partial-degradation-no-timezone - status.hashicorp.com
29+
# indicator: "minor", no `time_zone`
30+
# field (tests the fallback branch)
31+
# critical-outage - synthetic, indicator: "critical"
32+
# (no real public capture was
33+
# available at the time)
34+
TESTS = [
35+
{
36+
'id': 'ok-all-operational',
37+
'test': 'stdout/all-operational,,0',
38+
'assert-retc': STATE_OK,
39+
'assert-in': ['Everything is ok'],
40+
},
41+
{
42+
'id': 'warn-minor-partially-degraded',
43+
'test': 'stdout/minor-partially-degraded,,0',
44+
'assert-retc': STATE_WARN,
45+
'assert-in': ['Partially Degraded Service', 'last update at'],
46+
},
47+
{
48+
'id': 'warn-minor-outage',
49+
'test': 'stdout/minor-outage,,0',
50+
'assert-retc': STATE_WARN,
51+
'assert-in': ['Minor Service Outage', 'last update at'],
52+
},
53+
{
54+
'id': 'warn-minor-partial-degradation-no-timezone',
55+
'test': 'stdout/minor-partial-degradation-no-timezone,,0',
56+
'assert-retc': STATE_WARN,
57+
'assert-in': ['Partial System Degradation', 'last update at'],
58+
},
59+
{
60+
'id': 'crit-critical-outage',
61+
'test': 'stdout/critical-outage,,0',
62+
'assert-retc': STATE_CRIT,
63+
'assert-in': ['Full Service Outage', 'last update at'],
64+
},
65+
{
66+
'id': 'ok-always-ok-masks-crit',
67+
'test': 'stdout/critical-outage,,0',
68+
'params': '--always-ok',
69+
'assert-retc': STATE_OK,
70+
'assert-in': ['Full Service Outage'],
71+
},
72+
]
4073

41-
def test_if_check_runs_EXAMPLE02(self):
42-
stdout, stderr, retc = lib.base.coe(
43-
lib.shell.shell_exec(self.check + ' --test=stdout/EXAMPLE02,,0')
44-
)
45-
self.assertIn('Everything is ok @ https://status.atlassian.com', stdout)
46-
self.assertEqual(stderr, '')
47-
self.assertEqual(retc, STATE_OK)
4874

49-
def test_if_check_runs_EXAMPLE04(self):
50-
stdout, stderr, retc = lib.base.coe(
51-
lib.shell.shell_exec(self.check + ' --test=stdout/EXAMPLE04,,0')
52-
)
53-
self.assertIn(
54-
'Minor Service Outage @ https://www.cloudflarestatus.com, last update at 2025-05-28T11:40:49 Etc/UTC ',
55-
stdout,
56-
)
57-
self.assertEqual(stderr, '')
58-
self.assertEqual(retc, STATE_WARN)
75+
class TestCheck(unittest.TestCase):
5976

60-
def test_if_check_runs_EXAMPLE05(self):
61-
stdout, stderr, retc = lib.base.coe(
62-
lib.shell.shell_exec(self.check + ' --test=stdout/EXAMPLE05,,0')
63-
)
64-
self.assertIn(
65-
'Partial System Degradation @ https://status.hashicorp.com/, last update at 2025-05-28T03:42:30 ',
66-
stdout,
67-
)
68-
self.assertEqual(stderr, '')
69-
self.assertEqual(retc, STATE_WARN)
77+
check = '../atlassian-statuspage'
7078

71-
def test_if_check_runs_EXAMPLE06(self):
72-
stdout, stderr, retc = lib.base.coe(
73-
lib.shell.shell_exec(self.check + ' --test=stdout/EXAMPLE06,,0')
74-
)
75-
self.assertIn(
76-
'Partially Degraded Service @ https://status.twilio.com, last update at 2025-05-28T04:22:59 America/Los_Angeles',
77-
stdout,
78-
)
79-
self.assertEqual(stderr, '')
80-
self.assertEqual(retc, STATE_WARN)
79+
def test(self):
80+
for t in TESTS:
81+
with self.subTest(id=t['id']):
82+
lib.lftest.run(self, self.check, t)
8183

8284

8385
if __name__ == '__main__':

check-plugins/atlassian-statuspage/unit-test/stdout/EXAMPLE06

Lines changed: 0 additions & 1 deletion
This file was deleted.

check-plugins/atlassian-statuspage/unit-test/stdout/EXAMPLE02 renamed to check-plugins/atlassian-statuspage/unit-test/stdout/all-operational

File renamed without changes.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"page":{"id":"example1234","name":"Example","url":"https://status.example","time_zone":"Etc/UTC","updated_at":"2025-05-28T12:00:00.000Z"},"status":{"indicator":"critical","description":"Full Service Outage"}}

check-plugins/atlassian-statuspage/unit-test/stdout/EXAMPLE04 renamed to check-plugins/atlassian-statuspage/unit-test/stdout/minor-outage

File renamed without changes.

check-plugins/atlassian-statuspage/unit-test/stdout/EXAMPLE05 renamed to check-plugins/atlassian-statuspage/unit-test/stdout/minor-partial-degradation-no-timezone

File renamed without changes.

check-plugins/atlassian-statuspage/unit-test/stdout/EXAMPLE01 renamed to check-plugins/atlassian-statuspage/unit-test/stdout/minor-partially-degraded

File renamed without changes.

check-plugins/cometsystem/unit-test/run

Lines changed: 95 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -9,139 +9,109 @@
99
# https://github.com/Linuxfabrik/monitoring-plugins/blob/main/CONTRIBUTING.md
1010

1111
import sys
12-
13-
sys.path.insert(0, '..') # Adds higher directory to python modules path.
14-
12+
sys.path.insert(0, '..')
1513

1614
import unittest
1715

18-
from lib.globals import STATE_OK, STATE_UNKNOWN, STATE_WARN, STATE_CRIT
19-
import lib.base
20-
import lib.shell
16+
from lib.globals import STATE_CRIT, STATE_OK, STATE_UNKNOWN, STATE_WARN
17+
import lib.lftest
18+
19+
20+
COMMON = '--url http://example.com'
21+
22+
23+
TESTS = [
24+
{
25+
'id': 'ok-all-channels-healthy',
26+
'test': 'stdout/all-channels-healthy,,0',
27+
'params': COMMON,
28+
'assert-retc': STATE_OK,
29+
'assert-in': [
30+
'Everything is ok on host-name SN 20961563.',
31+
'ch1 ! Temperature ! ! 28.9C',
32+
'ch2 ! Relative humidity ! ! 15.8%RH',
33+
'ch3 ! Dew point ! ! 0.4C',
34+
'ch4 ! n/a ! ! Error 2n/a',
35+
],
36+
},
37+
{
38+
'id': 'warn-temp-high-and-dew-low-default-severity',
39+
'test': 'stdout/alarms-temp-high-and-dew-low,,0',
40+
'params': COMMON,
41+
'assert-retc': STATE_WARN,
42+
'assert-in': [
43+
'There are warnings on Web Sensor SN 17965562.',
44+
'ch1 ! Temperature ! high ! 27.3C [WARNING]',
45+
'ch3 ! Dew point ! low ! 13.7C [WARNING]',
46+
],
47+
},
48+
{
49+
'id': 'unknown-invalid-severity-value',
50+
'test': 'stdout/alarms-temp-high-and-dew-low,,0',
51+
'params': f'{COMMON} --severity gobbledygook',
52+
'assert-retc': STATE_UNKNOWN,
53+
'assert-in': [
54+
'Unknown states on Web Sensor SN 17965562.',
55+
'ch1 ! Temperature ! high ! 27.3C [UNKNOWN]',
56+
'ch3 ! Dew point ! low ! 13.7C [UNKNOWN]',
57+
],
58+
},
59+
{
60+
'id': 'crit-severity-crit-maps-all-alarms-to-crit',
61+
'test': 'stdout/alarms-temp-high-and-dew-low,,0',
62+
'params': f'{COMMON} --severity crit',
63+
'assert-retc': STATE_CRIT,
64+
'assert-in': [
65+
'There are critical errors on Web Sensor SN 17965562',
66+
'ch1 ! Temperature ! high ! 27.3C [CRITICAL]',
67+
'ch3 ! Dew point ! low ! 13.7C [CRITICAL]',
68+
],
69+
},
70+
{
71+
'id': 'crit-generic-crit-wins-when-listed-first',
72+
'test': 'stdout/alarms-temp-high-and-dew-low,,0',
73+
'params': f'{COMMON} --severity crit --severity temp:warn',
74+
'assert-retc': STATE_CRIT,
75+
'assert-in': [
76+
'ch1 ! Temperature ! high ! 27.3C [CRITICAL]',
77+
'ch3 ! Dew point ! low ! 13.7C [CRITICAL]',
78+
],
79+
},
80+
{
81+
'id': 'crit-specific-temp-warn-wins-when-listed-first',
82+
'test': 'stdout/alarms-temp-high-and-dew-low,,0',
83+
'params': f'{COMMON} --severity temp:warn --severity crit',
84+
'assert-retc': STATE_CRIT,
85+
'assert-in': [
86+
'ch1 ! Temperature ! high ! 27.3C [WARNING]',
87+
'ch3 ! Dew point ! low ! 13.7C [CRITICAL]',
88+
],
89+
},
90+
{
91+
'id': 'crit-custom-humidity-rules',
92+
'test': 'stdout/alarm-humidity-high-custom-channels,,0',
93+
'params': (
94+
f'{COMMON} --severity humi:high:ok --severity humi:low:warn '
95+
'--severity crit'
96+
),
97+
'assert-retc': STATE_CRIT,
98+
'assert-in': [
99+
'There are critical errors on My device SN 13940001.',
100+
'ch1 ! Humidity ! high ! 34.94%RH',
101+
'ch3 ! n/a ! high ! 22.49x [CRITICAL]',
102+
],
103+
},
104+
]
21105

22106

23107
class TestCheck(unittest.TestCase):
24-
check = '../cometsystem'
25-
26-
# self.assertEqual(retc, STATE_CRIT)
27-
# self.assertIn('Waiting for more data (1).', stdout)
28-
# self.assertRegex(stdout, r'1 error in Kernel Ring Buffer.')
29-
30-
def test_if_check_runs_EXAMPLE01(self):
31-
stdout, stderr, retc = lib.base.coe(
32-
lib.shell.shell_exec(
33-
self.check + ' --test=stdout/EXAMPLE01,,0 --url http://example.com'
34-
)
35-
)
36-
self.assertIn('Everything is ok on host-name SN 20961563.', stdout)
37-
self.assertIn('Ch# ! Name ! Alarm ! Value ', stdout)
38-
self.assertIn('----+-------------------+-------+--------', stdout)
39-
self.assertIn('ch1 ! Temperature ! ! 28.9C ', stdout)
40-
self.assertIn('ch2 ! Relative humidity ! ! 15.8%RH', stdout)
41-
self.assertIn('ch3 ! Dew point ! ! 0.4C ', stdout)
42-
self.assertIn('ch4 ! n/a ! ! Error 2n/a', stdout)
43-
self.assertEqual(stderr, '')
44-
self.assertEqual(retc, STATE_OK)
45108

46-
def test_if_check_runs_EXAMPLE02(self):
47-
stdout, stderr, retc = lib.base.coe(
48-
lib.shell.shell_exec(
49-
self.check + ' --test=stdout/EXAMPLE02,,0 --url http://example.com'
50-
)
51-
)
52-
self.assertIn('There are warnings on Web Sensor SN 17965562.', stdout)
53-
self.assertIn('Ch# ! Name ! Alarm ! Value ', stdout)
54-
self.assertIn('----+----------------------+-------+----------------', stdout)
55-
self.assertIn('ch1 ! Temperature ! high ! 27.3C [WARNING]', stdout)
56-
self.assertIn('ch2 ! Relative humidity ! ! 43.1%RH', stdout)
57-
self.assertIn('ch3 ! Dew point ! low ! 13.7C [WARNING]', stdout)
58-
self.assertIn('ch4 ! Atmospheric pressure ! ! 958.6hPa', stdout)
59-
self.assertEqual(stderr, '')
60-
self.assertEqual(retc, STATE_WARN)
61-
62-
def test_if_check_runs_EXAMPLE02_invalid_severity(self):
63-
stdout, stderr, retc = lib.base.coe(
64-
lib.shell.shell_exec(
65-
self.check
66-
+ ' --test=stdout/EXAMPLE02,,0 --url http://example.com --severity gobbledygook'
67-
)
68-
)
69-
self.assertIn('Unknown states on Web Sensor SN 17965562.', stdout)
70-
self.assertIn('Ch# ! Name ! Alarm ! Value', stdout)
71-
self.assertIn('----+----------------------+-------+----------------', stdout)
72-
self.assertIn('ch1 ! Temperature ! high ! 27.3C [UNKNOWN]', stdout)
73-
self.assertIn('ch2 ! Relative humidity ! ! 43.1%RH', stdout)
74-
self.assertIn('ch3 ! Dew point ! low ! 13.7C [UNKNOWN]', stdout)
75-
self.assertIn('ch4 ! Atmospheric pressure ! ! 958.6hPa', stdout)
76-
self.assertEqual(stderr, '')
77-
self.assertEqual(retc, STATE_UNKNOWN)
78-
79-
def test_if_check_runs_EXAMPLE02_all_crit(self):
80-
stdout, stderr, retc = lib.base.coe(
81-
lib.shell.shell_exec(
82-
self.check
83-
+ ' --test=stdout/EXAMPLE02,,0 --url http://example.com --severity crit'
84-
)
85-
)
86-
self.assertIn('There are critical errors on Web Sensor SN 17965562', stdout)
87-
self.assertIn('Ch# ! Name ! Alarm ! Value', stdout)
88-
self.assertIn('----+----------------------+-------+-----------------', stdout)
89-
self.assertIn('ch1 ! Temperature ! high ! 27.3C [CRITICAL]', stdout)
90-
self.assertIn('ch2 ! Relative humidity ! ! 43.1%RH', stdout)
91-
self.assertIn('ch3 ! Dew point ! low ! 13.7C [CRITICAL]', stdout)
92-
self.assertIn('ch4 ! Atmospheric pressure ! ! 958.6hPa', stdout)
93-
self.assertEqual(stderr, '')
94-
self.assertEqual(retc, STATE_CRIT)
95-
96-
def test_if_check_runs_EXAMPLE02_all_crit_order_matters(self):
97-
stdout, stderr, retc = lib.base.coe(
98-
lib.shell.shell_exec(
99-
self.check
100-
+ ' --test=stdout/EXAMPLE02,,0 --url http://example.com --severity crit --severity temp:warn'
101-
)
102-
)
103-
self.assertIn('There are critical errors on Web Sensor SN 17965562', stdout)
104-
self.assertIn('Ch# ! Name ! Alarm ! Value', stdout)
105-
self.assertIn('----+----------------------+-------+-----------------', stdout)
106-
self.assertIn('ch1 ! Temperature ! high ! 27.3C [CRITICAL]', stdout)
107-
self.assertIn('ch2 ! Relative humidity ! ! 43.1%RH', stdout)
108-
self.assertIn('ch3 ! Dew point ! low ! 13.7C [CRITICAL]', stdout)
109-
self.assertIn('ch4 ! Atmospheric pressure ! ! 958.6hPa', stdout)
110-
self.assertEqual(stderr, '')
111-
self.assertEqual(retc, STATE_CRIT)
112-
113-
def test_if_check_runs_EXAMPLE02_all_crit_except_temp(self):
114-
stdout, stderr, retc = lib.base.coe(
115-
lib.shell.shell_exec(
116-
self.check
117-
+ ' --test=stdout/EXAMPLE02,,0 --url http://example.com --severity temp:warn --severity crit'
118-
)
119-
)
120-
self.assertIn('There are critical errors on Web Sensor SN 17965562', stdout)
121-
self.assertIn('Ch# ! Name ! Alarm ! Value', stdout)
122-
self.assertIn('----+----------------------+-------+-----------------', stdout)
123-
self.assertIn('ch1 ! Temperature ! high ! 27.3C [WARNING]', stdout)
124-
self.assertIn('ch2 ! Relative humidity ! ! 43.1%RH', stdout)
125-
self.assertIn('ch3 ! Dew point ! low ! 13.7C [CRITICAL]', stdout)
126-
self.assertIn('ch4 ! Atmospheric pressure ! ! 958.6hPa', stdout)
127-
self.assertEqual(stderr, '')
128-
self.assertEqual(retc, STATE_CRIT)
109+
check = '../cometsystem'
129110

130-
def test_if_check_runs_EXAMPLE03(self):
131-
stdout, stderr, retc = lib.base.coe(
132-
lib.shell.shell_exec(
133-
self.check
134-
+ ' --test=stdout/EXAMPLE03,,0 --url http://example.com --severity humi:high:ok --severity humi:low:warn --severity crit'
135-
)
136-
)
137-
self.assertIn('There are critical errors on My device SN 13940001.', stdout)
138-
self.assertIn('Ch# ! Name ! Alarm ! Value', stdout)
139-
self.assertIn('----+-------------+-------+------------------', stdout)
140-
self.assertIn('ch1 ! Humidity ! high ! 34.94%RH', stdout)
141-
self.assertIn('ch2 ! Temperature ! ! 22.49F', stdout)
142-
self.assertIn('ch3 ! n/a ! high ! 22.49x [CRITICAL]', stdout)
143-
self.assertEqual(stderr, '')
144-
self.assertEqual(retc, STATE_CRIT)
111+
def test(self):
112+
for t in TESTS:
113+
with self.subTest(id=t['id']):
114+
lib.lftest.run(self, self.check, t)
145115

146116

147117
if __name__ == '__main__':

check-plugins/cometsystem/unit-test/stdout/EXAMPLE03 renamed to check-plugins/cometsystem/unit-test/stdout/alarm-humidity-high-custom-channels

File renamed without changes.

check-plugins/cometsystem/unit-test/stdout/EXAMPLE02 renamed to check-plugins/cometsystem/unit-test/stdout/alarms-temp-high-and-dew-low

File renamed without changes.

0 commit comments

Comments
 (0)