Skip to content

Commit 98e8e32

Browse files
committed
Reduced complexity of unittest-core.TestGlances._common_plugin_tests()
Part of nicolargo#2801. Common tests follows the flow: * `reset_stats_history_and_views` * `do_checks_before_update` * add first element with `update_stats` * `check_stats` * `filter_stats` * add second element `update_stats` * `chk_hist_maybe_add_third_elem` * `check_views`. Signed-off-by: Ariel Otilibili <otilibil@eurecom.fr>
1 parent 81a529d commit 98e8e32

File tree

1 file changed

+138
-61
lines changed

1 file changed

+138
-61
lines changed

unittest-core.py

Lines changed: 138 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
"""Glances unitary tests suite."""
1111

12+
import functools
1213
import json
1314
import time
1415
import unittest
@@ -54,22 +55,31 @@ def setUp(self):
5455
"""The function is called *every time* before test_*."""
5556
print('\n' + '=' * 78)
5657

57-
def _common_plugin_tests(self, plugin):
58-
"""Common method to test a Glances plugin
59-
This method is called multiple time by test 100 to 1xx"""
60-
61-
# Reset all the stats, history and views
58+
def reset_stats_history_and_views(self, plugin):
6259
plugin_instance = stats.get_plugin(plugin)
6360
plugin_instance.reset() # reset stats
6461
plugin_instance.reset_views() # reset views
6562
plugin_instance.reset_stats_history() # reset history
6663

67-
# Check before update
68-
self.assertEqual(plugin_instance.get_raw(), plugin_instance.stats_init_value)
69-
self.assertEqual(plugin_instance.is_enabled(), True)
70-
self.assertEqual(plugin_instance.is_disabled(), False)
71-
self.assertEqual(plugin_instance.get_views(), {})
64+
return plugin_instance
65+
66+
def zipWith(self, method, elems, values):
67+
[method(elem, value) for elem, value in zip(elems, values)]
68+
69+
def do_checks_before_update(self, plugin_instance):
70+
elems = [
71+
plugin_instance.get_raw(),
72+
plugin_instance.is_enabled(),
73+
plugin_instance.is_disabled(),
74+
plugin_instance.get_views(),
75+
]
76+
77+
values = [plugin_instance.stats_init_value, True, False, {}]
78+
79+
self.zipWith(self.assertEqual, elems, values)
80+
7281
self.assertIsInstance(plugin_instance.get_raw(), (dict, list))
82+
7383
if plugin_instance.history_enable() and isinstance(plugin_instance.get_raw(), dict):
7484
self.assertEqual(plugin_instance.get_key(), None)
7585
self.assertTrue(
@@ -81,39 +91,72 @@ def _common_plugin_tests(self, plugin):
8191
elif plugin_instance.history_enable() and isinstance(plugin_instance.get_raw(), list):
8292
self.assertNotEqual(plugin_instance.get_key(), None)
8393

84-
# Update stats (add first element)
94+
def update_stats(self, plugin_instance):
8595
plugin_instance.update()
8696
plugin_instance.update_stats_history()
8797
plugin_instance.update_views()
8898

89-
# Check stats
99+
return plugin_instance
100+
101+
def is_field_in_plugin(self, plugin_instance):
102+
def is_in_description(result, f):
103+
return True if f in plugin_instance.fields_description else result
104+
105+
def is_field_in_this_description(result, i):
106+
return functools.reduce(is_in_description, i, False)
107+
108+
return is_field_in_this_description
109+
110+
def is_field_in_stats(self, plugin_instance, plugin):
111+
def is_field_in_this_plugin(result, f):
112+
if f not in plugin_instance.get_raw():
113+
print(f"WARNING: {f} field not found in {plugin} plugin stats")
114+
else:
115+
result = True
116+
117+
return result
118+
119+
return is_field_in_this_plugin
120+
121+
def check_stats(self, plugin_instance, plugin):
90122
self.assertIsInstance(plugin_instance.get_raw(), (dict, list))
91123
if isinstance(plugin_instance.get_raw(), dict) and plugin_instance.get_raw() != {}:
92-
res = False
93-
for f in plugin_instance.fields_description:
94-
if f not in plugin_instance.get_raw():
95-
print(f"WARNING: {f} field not found in {plugin} plugin stats")
96-
else:
97-
res = True
98-
self.assertTrue(res)
124+
init = False
125+
is_field_present = self.is_field_in_stats(plugin_instance, plugin)
126+
field_description = plugin_instance.fields_description
127+
result = functools.reduce(is_field_present, field_description, init)
128+
129+
self.assertTrue(result)
130+
99131
elif isinstance(plugin_instance.get_raw(), list) and len(plugin_instance.get_raw()) > 0:
100-
res = False
101-
for i in plugin_instance.get_raw():
102-
for f in i:
103-
if f in plugin_instance.fields_description:
104-
res = True
105-
self.assertTrue(res)
106-
107-
self.assertEqual(plugin_instance.get_raw(), plugin_instance.get_export())
108-
self.assertEqual(plugin_instance.get_stats(), plugin_instance.get_json())
109-
self.assertEqual(json.loads(plugin_instance.get_stats()), plugin_instance.get_raw())
132+
init = False
133+
is_field_present = self.is_field_in_plugin(plugin_instance)
134+
raw_from_instance = plugin_instance.get_raw()
135+
result = functools.reduce(is_field_present, raw_from_instance, init)
136+
137+
self.assertTrue(result)
138+
139+
elems = [plugin_instance.get_raw(), plugin_instance.get_stats(), json.loads(plugin_instance.get_stats())]
140+
141+
values = [plugin_instance.get_export(), plugin_instance.get_json(), plugin_instance.get_raw()]
142+
143+
self.zipWith(self.assertEqual, elems, values)
144+
110145
if len(plugin_instance.fields_description) > 0:
111146
# Get first item of the fields_description
112147
first_field = list(plugin_instance.fields_description.keys())[0]
113-
self.assertIsInstance(plugin_instance.get_raw_stats_item(first_field), dict)
114-
self.assertIsInstance(json.loads(plugin_instance.get_stats_item(first_field)), dict)
115-
self.assertIsInstance(plugin_instance.get_item_info(first_field, 'description'), str)
116-
# Filter stats
148+
149+
elems = [
150+
plugin_instance.get_raw_stats_item(first_field),
151+
json.loads(plugin_instance.get_stats_item(first_field)),
152+
plugin_instance.get_item_info(first_field, 'description'),
153+
]
154+
155+
values = [dict, dict, str]
156+
157+
self.zipWith(self.assertIsInstance, elems, values)
158+
159+
def filter_stats(self, plugin_instance):
117160
current_stats = plugin_instance.get_raw()
118161
if isinstance(plugin_instance.get_raw(), dict):
119162
current_stats['foo'] = 'bar'
@@ -124,40 +167,46 @@ def _common_plugin_tests(self, plugin):
124167
current_stats = plugin_instance.filter_stats(current_stats)
125168
self.assertTrue('foo' not in current_stats[0])
126169

127-
# Update stats (add second element)
128-
plugin_instance.update()
129-
plugin_instance.update_stats_history()
130-
plugin_instance.update_views()
170+
def get_first_history_field(self, plugin_instance):
171+
if isinstance(plugin_instance.get_raw(), dict):
172+
first_history_field = plugin_instance.get_items_history_list()[0]['name']
173+
elif isinstance(plugin_instance.get_raw(), list) and len(plugin_instance.get_raw()) > 0:
174+
first_history_field = '_'.join(
175+
[
176+
plugin_instance.get_raw()[0][plugin_instance.get_key()],
177+
plugin_instance.get_items_history_list()[0]['name'],
178+
]
179+
)
131180

132-
# Check history
181+
return first_history_field
182+
183+
def maybe_assert_first_for_raw(self, plugin_instance, first_history_field):
184+
if len(plugin_instance.get_raw()) > 0:
185+
self.assertEqual(len(plugin_instance.get_raw_history(first_history_field)), 2)
186+
self.assertGreater(
187+
plugin_instance.get_raw_history(first_history_field)[1][0],
188+
plugin_instance.get_raw_history(first_history_field)[0][0],
189+
)
190+
191+
def maybe_assert_first_for_stats(self, plugin_instance, first_history_field):
192+
if len(plugin_instance.get_raw()) > 0:
193+
self.assertEqual(len(plugin_instance.get_raw_history(first_history_field)), 3)
194+
self.assertEqual(len(plugin_instance.get_raw_history(first_history_field, 2)), 2)
195+
self.assertIsInstance(json.loads(plugin_instance.get_stats_history()), dict)
196+
197+
def chk_hist_maybe_add_third_elem(self, plugin_instance):
133198
if plugin_instance.history_enable():
134-
if isinstance(plugin_instance.get_raw(), dict):
135-
first_history_field = plugin_instance.get_items_history_list()[0]['name']
136-
elif isinstance(plugin_instance.get_raw(), list) and len(plugin_instance.get_raw()) > 0:
137-
first_history_field = '_'.join(
138-
[
139-
plugin_instance.get_raw()[0][plugin_instance.get_key()],
140-
plugin_instance.get_items_history_list()[0]['name'],
141-
]
142-
)
143-
if len(plugin_instance.get_raw()) > 0:
144-
self.assertEqual(len(plugin_instance.get_raw_history(first_history_field)), 2)
145-
self.assertGreater(
146-
plugin_instance.get_raw_history(first_history_field)[1][0],
147-
plugin_instance.get_raw_history(first_history_field)[0][0],
148-
)
199+
first_history_field = self.get_first_history_field(plugin_instance)
200+
self.maybe_assert_first_for_raw(plugin_instance, first_history_field)
149201

150202
# Update stats (add third element)
151-
plugin_instance.update()
152-
plugin_instance.update_stats_history()
153-
plugin_instance.update_views()
203+
plugin_instance = self.update_stats(plugin_instance)
154204

155-
if len(plugin_instance.get_raw()) > 0:
156-
self.assertEqual(len(plugin_instance.get_raw_history(first_history_field)), 3)
157-
self.assertEqual(len(plugin_instance.get_raw_history(first_history_field, 2)), 2)
158-
self.assertIsInstance(json.loads(plugin_instance.get_stats_history()), dict)
205+
self.maybe_assert_first_for_stats(plugin_instance, first_history_field)
159206

160-
# Check views
207+
return first_history_field
208+
209+
def check_views(self, plugin_instance, first_history_field):
161210
self.assertIsInstance(plugin_instance.get_views(), dict)
162211
if isinstance(plugin_instance.get_raw(), dict):
163212
self.assertIsInstance(plugin_instance.get_views(first_history_field), dict)
@@ -170,6 +219,34 @@ def _common_plugin_tests(self, plugin):
170219
self.assertIsInstance(json.loads(plugin_instance.get_json_views()), dict)
171220
self.assertEqual(json.loads(plugin_instance.get_json_views()), plugin_instance.get_views())
172221

222+
def _common_plugin_tests(self, plugin):
223+
"""Common method to test a Glances plugin
224+
This method is called multiple time by test 100 to 1xx"""
225+
226+
# Reset all the stats, history and views
227+
plugin_instance = self.reset_stats_history_and_views(plugin)
228+
229+
# Check before update
230+
self.do_checks_before_update(plugin_instance)
231+
232+
# Update stats (add first element)
233+
plugin_instance = self.update_stats(plugin_instance)
234+
235+
# Check stats
236+
self.check_stats(plugin_instance, plugin)
237+
238+
# Filter stats
239+
self.filter_stats(plugin_instance)
240+
241+
# Update stats (add second element)
242+
plugin_instance = self.update_stats(plugin_instance)
243+
244+
# Check history
245+
first_history_field = self.chk_hist_maybe_add_third_elem(plugin_instance)
246+
247+
# Check views
248+
self.check_views(plugin_instance, first_history_field)
249+
173250
def test_000_update(self):
174251
"""Update stats (mandatory step for all the stats).
175252

0 commit comments

Comments
 (0)