Skip to content

Commit 899c974

Browse files
committed
Adding a whole bunch of tests for windows detection
1 parent cdc73d2 commit 899c974

File tree

1 file changed

+218
-3
lines changed

1 file changed

+218
-3
lines changed

test/os_win7.py

Lines changed: 218 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@
2727
sys.modules['_winreg'] = _winreg
2828
sys.modules['winreg'] = _winreg
2929

30-
from mbed_lstools.windows import MbedLsToolsWin7
30+
from mbed_lstools.windows import (MbedLsToolsWin7, CompatibleIDsNotFoundException,
31+
_get_cached_mounted_points, _is_mbed_volume, _get_values_with_numeric_keys,
32+
_get_volumes, _get_usb_storage_devices, _determine_valid_non_composite_devices,
33+
_determine_subdevice_capability)
3134

3235
class Win7TestCase(unittest.TestCase):
3336
""" Basic test cases checking trivial asserts
@@ -41,10 +44,15 @@ def setUp(self):
4144
root_logger.setLevel(logging.DEBUG)
4245
del logging
4346
_winreg.HKEY_LOCAL_MACHINE = None
47+
_winreg.OpenKey.reset_mock()
4448
_winreg.OpenKey.side_effect = None
49+
_winreg.EnumValue.reset_mock()
4550
_winreg.EnumValue.side_effect = None
51+
_winreg.EnumKey.reset_mock()
4652
_winreg.EnumKey.side_effect = None
53+
_winreg.QueryValue.reset_mock()
4754
_winreg.QueryValue.side_effect = None
55+
_winreg.QueryInfoKey.reset_mock()
4856
_winreg.QueryInfoKey.side_effect = None
4957
_winreg.CreateKey.reset_mock()
5058
_winreg.CreateKeyEx.reset_mock()
@@ -128,6 +136,215 @@ def query_info_key(key):
128136
len(value_dict.get(key, [])))
129137
_winreg.QueryInfoKey.side_effect = query_info_key
130138

139+
def test_get_values_with_numeric_keys(self):
140+
dummy_key = 'dummy_key'
141+
with patch('mbed_lstools.windows._iter_vals') as _iter_vals:
142+
_iter_vals.return_value = [
143+
('0', True),
144+
('1', True),
145+
('Count', False),
146+
('NextInstance', False),
147+
]
148+
149+
values = _get_values_with_numeric_keys(dummy_key)
150+
_iter_vals.assert_called_once_with(dummy_key)
151+
self.assertEqual(len(values), 2)
152+
self.assertTrue(all(v is True for v in values))
153+
154+
_iter_vals.reset_mock()
155+
_iter_vals.side_effect = OSError
156+
157+
self.assertEqual(_get_values_with_numeric_keys(dummy_key), [])
158+
159+
def test_is_mbed_volume(self):
160+
self.assertTrue(_is_mbed_volume(u'_??_USBSTOR#Disk&Ven_MBED&Prod_VFS&Rev_0.1#0240000032044e4500367009997b00086781000097969900&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}'))
161+
self.assertTrue(_is_mbed_volume(u'_??_USBSTOR#Disk&Ven_mbed&Prod_VFS&Rev_0.1#0240000032044e4500367009997b00086781000097969900&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}'))
162+
self.assertFalse(_is_mbed_volume(u'_??_USBSTOR#Disk&Ven_Invalid&Prod_VFS&Rev_0.1#0240000032044e4500367009997b00086781000097969900&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}'))
163+
self.assertFalse(_is_mbed_volume(u'_??_USBSTOR#Disk&Ven_invalid&Prod_VFS&Rev_0.1#0240000032044e4500367009997b00086781000097969900&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}'))
164+
165+
def test_get_cached_mount_points(self):
166+
dummy_val = 'dummy_val'
167+
volume_string_1 = u'_??_USBSTOR#Disk&Ven_MBED&Prod_VFS&Rev_0.1#0240000032044e4500367009997b00086781000097969900&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}'
168+
volume_string_2 = u'_??_USBSTOR#Disk&Ven_MBED&Prod_VFS&Rev_0.1#1234000032044e4500367009997b00086781000097969900&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}'
169+
with patch('mbed_lstools.windows._iter_vals') as _iter_vals, \
170+
patch('mbed_lstools.windows._is_mbed_volume') as _is_mbed_volume:
171+
_winreg.OpenKey.return_value = dummy_val
172+
_iter_vals.return_value = [
173+
('dummy_device', 'this is not a valid volume string'),
174+
('\\DosDevices\\D:',
175+
volume_string_1.encode('utf-16le')),
176+
('\\DosDevices\\invalid_drive',
177+
volume_string_2.encode('utf-16le'))
178+
]
179+
_is_mbed_volume.return_value = True
180+
181+
result = _get_cached_mounted_points()
182+
183+
_winreg.OpenKey.assert_called_once_with(_winreg.HKEY_LOCAL_MACHINE,
184+
'SYSTEM\\MountedDevices')
185+
_iter_vals.assert_called_once_with(dummy_val)
186+
_is_mbed_volume.assert_has_calls([
187+
call(volume_string_1),
188+
call(volume_string_2)
189+
])
190+
self.assertEqual(result, [
191+
{
192+
'mount_point': 'D:',
193+
'volume_string': volume_string_1
194+
}
195+
])
196+
197+
_winreg.OpenKey.reset_mock()
198+
_winreg.OpenKey.side_effect = OSError
199+
self.assertEqual(_get_cached_mounted_points(), [])
200+
201+
202+
def test_get_volumes(self):
203+
dummy_key = 'dummy_key'
204+
volume_strings = [
205+
'dummy_volume_1',
206+
'dummy_volume_2',
207+
]
208+
with patch('mbed_lstools.windows._get_values_with_numeric_keys') as _num_keys, \
209+
patch('mbed_lstools.windows._is_mbed_volume') as _is_mbed_volume:
210+
_winreg.OpenKey.return_value = dummy_key
211+
_num_keys.return_value = volume_strings
212+
_is_mbed_volume.return_value = True
213+
214+
result = _get_volumes()
215+
216+
_winreg.OpenKey.assert_called_once_with(_winreg.HKEY_LOCAL_MACHINE,
217+
'SYSTEM\\CurrentControlSet\\Services\\volume\\Enum')
218+
_num_keys.assert_called_once_with(dummy_key)
219+
self.assertEqual(result, volume_strings)
220+
221+
_winreg.OpenKey.reset_mock()
222+
_winreg.OpenKey.side_effect = OSError
223+
_num_keys.reset_mock()
224+
225+
result = _get_volumes()
226+
227+
_winreg.OpenKey.assert_called_once_with(_winreg.HKEY_LOCAL_MACHINE,
228+
'SYSTEM\\CurrentControlSet\\Services\\volume\\Enum')
229+
_num_keys.assert_not_called()
230+
self.assertEqual(result, [])
231+
232+
def test_get_usb_storage_devices(self):
233+
dummy_key = 'dummy_key'
234+
volume_strings = [
235+
'dummy_usb_storage_1',
236+
'dummy_usb_storage_2',
237+
]
238+
with patch('mbed_lstools.windows._get_values_with_numeric_keys') as _num_keys, \
239+
patch('mbed_lstools.windows._is_mbed_volume') as _is_mbed_volume:
240+
_winreg.OpenKey.return_value = dummy_key
241+
_num_keys.return_value = volume_strings
242+
_is_mbed_volume.return_value = True
243+
244+
result = _get_usb_storage_devices()
245+
246+
_winreg.OpenKey.assert_called_once_with(_winreg.HKEY_LOCAL_MACHINE,
247+
'SYSTEM\\CurrentControlSet\\Services\\USBSTOR\\Enum')
248+
_num_keys.assert_called_once_with(dummy_key)
249+
self.assertEqual(result, volume_strings)
250+
251+
_winreg.OpenKey.reset_mock()
252+
_winreg.OpenKey.side_effect = OSError
253+
_num_keys.reset_mock()
254+
255+
result = _get_usb_storage_devices()
256+
257+
_winreg.OpenKey.assert_called_once_with(_winreg.HKEY_LOCAL_MACHINE,
258+
'SYSTEM\\CurrentControlSet\\Services\\USBSTOR\\Enum')
259+
_num_keys.assert_not_called()
260+
self.assertEqual(result, [])
261+
262+
def test_determine_valid_non_composite_devices(self):
263+
dummy_full_path = 'dummy_full_path'
264+
dummy_target_id = 'dummy_target_id'
265+
dummy_mount_point = 'dummy_mount_point'
266+
devices = [
267+
{
268+
'full_path': dummy_full_path,
269+
'entry_key_string': dummy_target_id
270+
}
271+
]
272+
target_id_usb_id_mount_point_map = {
273+
dummy_target_id: dummy_mount_point
274+
}
275+
dummy_key = 'dummy_key'
276+
277+
_winreg.OpenKey.return_value = dummy_key
278+
279+
with patch('mbed_lstools.windows._determine_subdevice_capability') as _capability:
280+
_capability.return_value = 'msd'
281+
282+
result = _determine_valid_non_composite_devices(devices, target_id_usb_id_mount_point_map)
283+
284+
device_key_string = 'SYSTEM\\CurrentControlSet\\Enum\\' + dummy_full_path
285+
_winreg.OpenKey.assert_called_once_with(_winreg.HKEY_LOCAL_MACHINE,
286+
device_key_string)
287+
_capability.assert_called_once_with(dummy_key)
288+
self.assertEqual(result, {
289+
dummy_target_id: {
290+
'target_id_usb_id': dummy_target_id,
291+
'mount_point': dummy_mount_point
292+
}
293+
})
294+
295+
def test_determine_subdevice_capability(self):
296+
dummy_key = 'dummy_key'
297+
298+
_winreg.QueryValueEx.return_value = (
299+
[
300+
u'USB\\DevClass_00&SubClass_00&Prot_00',
301+
u'USB\\DevClass_00&SubClass_00',
302+
u'USB\\DevClass_00',
303+
u'USB\\COMPOSITE'
304+
],
305+
7
306+
)
307+
capability = _determine_subdevice_capability(dummy_key)
308+
_winreg.QueryValueEx.assert_called_once_with(dummy_key, 'CompatibleIDs')
309+
self.assertEqual(capability, 'composite')
310+
311+
_winreg.QueryValueEx.reset_mock()
312+
_winreg.QueryValueEx.return_value = (
313+
[
314+
u'USB\\Class_08&SubClass_06&Prot_50',
315+
u'USB\\Class_08&SubClass_06',
316+
u'USB\\Class_08'
317+
],
318+
7
319+
)
320+
capability = _determine_subdevice_capability(dummy_key)
321+
_winreg.QueryValueEx.assert_called_once_with(dummy_key, 'CompatibleIDs')
322+
self.assertEqual(capability, 'msd')
323+
324+
_winreg.QueryValueEx.reset_mock()
325+
_winreg.QueryValueEx.return_value = (
326+
[
327+
u'USB\\Class_02&SubClass_02&Prot_01',
328+
u'USB\\Class_02&SubClass_02',
329+
u'USB\\Class_02'
330+
],
331+
7
332+
)
333+
capability = _determine_subdevice_capability(dummy_key)
334+
_winreg.QueryValueEx.assert_called_once_with(dummy_key, 'CompatibleIDs')
335+
self.assertEqual(capability, 'serial')
336+
337+
_winreg.QueryValueEx.reset_mock()
338+
_winreg.QueryValueEx.side_effect = OSError
339+
try:
340+
_determine_subdevice_capability(dummy_key)
341+
exception = False
342+
except CompatibleIDsNotFoundException as e:
343+
exception = True
344+
self.assertTrue(exception)
345+
_winreg.QueryValueEx.assert_called_once_with(dummy_key, 'CompatibleIDs')
346+
347+
131348
def test_one_composite_dev(self):
132349
value_dict = {
133350
(None, 'SYSTEM\\MountedDevices'): [
@@ -180,7 +397,6 @@ def test_one_composite_dev(self):
180397
self.assertIn(expected_info, devices)
181398
self.assertNoRegMut()
182399

183-
184400
def test_one_non_composite_dev(self):
185401
value_dict = {
186402
(None, 'SYSTEM\\MountedDevices'): [
@@ -217,7 +433,6 @@ def test_one_non_composite_dev(self):
217433
self.assertIn(expected_info, devices)
218434
self.assertNoRegMut()
219435

220-
221436
def test_mount_point_ready(self):
222437
with patch('mbed_lstools.windows.MbedLsToolsWin7._run_cli_process') as _cliproc:
223438
_cliproc.return_value = ("dummy", "", 0)

0 commit comments

Comments
 (0)