| """Tests for devicemap_lib.py module.""" |
| |
| import unittest |
| import yaml |
| |
| from catatester.devicemap import devicemap_lib |
| |
| _SAMPLE_YAML = """ |
| allowed_dimensions: |
| Device: |
| - ip |
| - device_ip |
| hosts: |
| host-1: |
| host_ip: 1.2.3.4 |
| location: 'US-MTV-B47' |
| hosted_devices: |
| - device: {ip: 192.168.0.1} |
| - device: {ip: 192.168.0.2} |
| - device: |
| ip: 192.168.0.3 |
| location: 'NOT US-MTV-B47' |
| """ |
| |
| |
| class DeviceMapLibTest(unittest.TestCase): |
| """Tests for devicemap_lib.py module.""" |
| |
| def setUp(self): |
| self.sample_configs = devicemap_lib.Configs(yaml.safe_load(_SAMPLE_YAML)) |
| |
| def assertBotConfigMatchesSwarmingSchema(self, bot_config): |
| config_dict = bot_config.as_dict |
| self.assertTrue('dimensions' in config_dict) |
| self.assertTrue('state' in config_dict) |
| for value in config_dict['dimensions'].values(): |
| self.assertTrue(hasattr(value, '__iter__')) |
| |
| def testReadDeviceMap(self): |
| self.assertTrue( |
| devicemap_lib._ReadDeviceMap()) |
| |
| def testGetNumBotConfigs(self): |
| self.assertEqual(3, self.sample_configs.GetNumBotConfigs('host-1')) |
| with self.assertRaises(devicemap_lib.DeviceMapError): |
| self.sample_configs.GetNumBotConfigs('undefined-host') |
| |
| def testGetAllowedDimensions(self): |
| expected = set(['ip', 'device_ip']) |
| actual = self.sample_configs.GetAllowedDimensions('Device') |
| self.assertEqual(expected, actual) |
| with self.assertRaises(devicemap_lib.DeviceMapError): |
| self.sample_configs.GetAllowedDimensions('undefined-type') |
| |
| def testGetBotConfig_canGetDevice(self): |
| bot_config = self.sample_configs.GetBotConfig('host-1', 1) |
| self.assertTrue(bot_config) |
| self.assertBotConfigMatchesSwarmingSchema(bot_config) |
| self.assertIn('location', bot_config.dimensions) |
| self.assertEqual('US-MTV-B47', bot_config.dimensions['location']) |
| # Also verify works with a slightly different format (newline instead of {}) |
| bot_config = self.sample_configs.GetBotConfig('host-1', 3) |
| self.assertTrue(bot_config) |
| self.assertBotConfigMatchesSwarmingSchema(bot_config) |
| self.assertTrue('device_type' in bot_config.dimensions) |
| self.assertEqual('device', bot_config.dimensions['device_type']) |
| self.assertTrue('device_ip' in bot_config.dimensions) |
| self.assertEqual('192.168.0.3', bot_config.dimensions['device_ip']) |
| self.assertIn('location', bot_config.dimensions) |
| self.assertEqual('NOT US-MTV-B47', bot_config.dimensions['location']) |
| |
| def testGetBotConfig_canGetDeviceWithNewDimension(self): |
| sample_yaml = """ |
| hosts: |
| host-2: |
| host_ip: 2.2.2.2 |
| hosted_devices: |
| - device: {ip: 192.168.0.4, new_dimension: hello}""" |
| configs = devicemap_lib.Configs(yaml.safe_load(sample_yaml)) |
| bot_config = configs.GetBotConfig('host-2', 1) |
| self.assertTrue(bot_config) |
| self.assertBotConfigMatchesSwarmingSchema(bot_config) |
| expected = ('new_dimension', 'hello') |
| self.assertTrue(expected in bot_config.dimensions.items()) |
| |
| def testGetBotConfig_canGetDeviceWithDimensionContainingAList(self): |
| sample_yaml = """ |
| hosts: |
| host-2: |
| host_ip: 2.2.2.2 |
| hosted_devices: |
| - device: {ip: 192.168.0.4, new_dimension: ['hello']}""" |
| configs = devicemap_lib.Configs(yaml.safe_load(sample_yaml)) |
| bot_config = configs.GetBotConfig('host-2', 1) |
| self.assertTrue(bot_config) |
| self.assertBotConfigMatchesSwarmingSchema(bot_config) |
| expected = ('new_dimension', ['hello']) |
| self.assertTrue(expected in bot_config.dimensions.items()) |
| |
| def testGetBotConfig_canGetDeviceWithExtraState(self): |
| sample_yaml = """ |
| hosts: |
| host-2: |
| host_ip: 2.2.2.2 |
| hosted_devices: |
| - device: {ip: 192.168.0.5, extra_state: {eth_switch: 100.107.119.209}} |
| - device: |
| ip: 192.168.0.6 |
| extra_state: |
| eth_switch: 100.107.119.210 |
| example: 'something new'""" |
| configs = devicemap_lib.Configs(yaml.safe_load(sample_yaml)) |
| bot_config = configs.GetBotConfig('host-2', 1) |
| self.assertTrue(bot_config) |
| self.assertBotConfigMatchesSwarmingSchema(bot_config) |
| expected = ('eth_switch', '100.107.119.209') |
| self.assertTrue(expected in bot_config.state.items()) |
| |
| # Also verify works with a slightly different format (newline instead of {}) |
| bot_config = configs.GetBotConfig('host-2', 2) |
| self.assertTrue(bot_config) |
| self.assertBotConfigMatchesSwarmingSchema(bot_config) |
| expected = ('eth_switch', '100.107.119.210') |
| self.assertTrue(expected in bot_config.state.items()) |
| |
| def testGetBotConfig_canGetTestbed(self): |
| sample_yaml = """ |
| hosts: |
| host-2: |
| host_ip: 2.2.2.2 |
| location: 'US-MTV-B45' |
| hosted_devices: |
| - Testbed: |
| dimensions: |
| device_type: chaos_testbed |
| device_ip: 172.22.38.73 |
| group: ['chaos_lab'] |
| extra_state: |
| anchovy: ['172.22.38.69', '172.22.38.70'] |
| biggie: '172.22.38.73' |
| chorizo: ['172.22.38.66', '172.22.38.67'] |
| ethernet_switch: '172.22.38.80' |
| linux_client: '172.22.38.81' |
| mushroom: '172.22.38.72' |
| pepperoni: '172.22.38.71' |
| pineapple: ['172.22.38.78', '172.22.38.68'] |
| rpi: '172.22.38.79' |
| salami: ['172.22.38.65', '172.22.38.83'] |
| steak: ['172.22.38.74', '172.22.38.64']""" |
| configs = devicemap_lib.Configs(yaml.safe_load(sample_yaml)) |
| bot_config = configs.GetBotConfig('host-2', 1) |
| self.assertTrue(bot_config) |
| self.assertBotConfigMatchesSwarmingSchema(bot_config) |
| expected = ('biggie', '172.22.38.73') |
| self.assertTrue(expected in bot_config.state.items()) |
| expected = ('pineapple', ['172.22.38.78', '172.22.38.68']) |
| self.assertTrue(expected in bot_config.state.items()) |
| self.assertIn('location', bot_config.dimensions) |
| self.assertEqual('US-MTV-B45', bot_config.dimensions['location']) |
| |
| def testGetBotConfig_undefinedHostRaisesError(self): |
| with self.assertRaises(devicemap_lib.DeviceMapError): |
| self.sample_configs.GetBotConfig('host-doesnt-exist', 1) |
| |
| def testGetBotConfig_undefinedDeviceRaisesError(self): |
| with self.assertRaises(devicemap_lib.DeviceMapError): |
| self.sample_configs.GetBotConfig('host-1', 9999) |
| |
| def testFactoryResetNoSignedInGroup(self): |
| """Test that FDR flag is set when device is not in the group 'signed_in'.""" |
| sample_yaml = """ |
| hosts: |
| host-2: |
| host_ip: 2.2.2.2 |
| hosted_devices: |
| - device: |
| ip: 100.127.32.17 |
| group: ['device_performance']""" |
| configs = devicemap_lib.Configs(yaml.safe_load(sample_yaml)) |
| bot_config = configs.GetBotConfig('host-2', 1) |
| self.assertTrue(bot_config) |
| self.assertEqual('true', bot_config.dimensions['factory_reset']) |
| |
| def testFactoryResetNoGroup(self): |
| """Test that FDR flag is set when device is not explicitly in a group.""" |
| sample_yaml = """ |
| hosts: |
| host-2: |
| host_ip: 2.2.2.2 |
| hosted_devices: |
| - device: |
| ip: 100.127.32.17""" |
| configs = devicemap_lib.Configs(yaml.safe_load(sample_yaml)) |
| bot_config = configs.GetBotConfig('host-2', 1) |
| self.assertTrue(bot_config) |
| self.assertEqual('true', bot_config.dimensions['factory_reset']) |
| |
| def testFactoryResetSignedInGroup(self): |
| """Test that FDR flag is set when device is in the group 'signed_in'.""" |
| sample_yaml = """ |
| hosts: |
| host-2: |
| host_ip: 2.2.2.2 |
| hosted_devices: |
| - device: |
| ip: 100.127.32.17 |
| group: ['signed_in', 'device_performance']""" |
| configs = devicemap_lib.Configs(yaml.safe_load(sample_yaml)) |
| bot_config = configs.GetBotConfig('host-2', 1) |
| self.assertTrue(bot_config) |
| self.assertEqual('false', bot_config.dimensions['factory_reset']) |
| |
| def testFactoryResetExplicit(self): |
| """Test that FDR flag is set explicitly specified in config.""" |
| sample_yaml = """ |
| hosts: |
| host-2: |
| host_ip: 2.2.2.2 |
| hosted_devices: |
| - device: |
| ip: 100.127.32.17 |
| factory_reset: 'false'""" |
| configs = devicemap_lib.Configs(yaml.safe_load(sample_yaml)) |
| bot_config = configs.GetBotConfig('host-2', 1) |
| self.assertTrue(bot_config) |
| self.assertEqual('false', bot_config.dimensions['factory_reset']) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |