def test_put_characteristic(self): model_mixin.id_counter = 0 c = Controller() a = Accessory( 'test-dev-123', 'TestCo', 'Test Dev Pro', '00000', 1 ) a.add_service(LightBulbService()) manager = DeviceManager() manager._devices['00:00:00:00:00'] = Device(a) with mock.patch('homekit.controller.ble_impl.device.DeviceManager') as m1: with mock.patch('homekit.controller.ble_impl.DeviceManager') as m2: m1.return_value = manager m2.return_value = manager c.perform_pairing_ble('test-pairing', '00:00:00:00:00', '111-11-111') c.pairings['test-pairing'].list_accessories_and_characteristics() result = c.pairings['test-pairing'].put_characteristics([ (1, 10, True), ]) self.assertEqual(result, {}) self.assertTrue(a.services[1].characteristics[0].get_value()) result = c.pairings['test-pairing'].put_characteristics([ (1, 10, False), ]) self.assertEqual(result, {}) self.assertFalse(a.services[1].characteristics[0].get_value())
def test_identify(self): model_mixin.id_counter = 0 c = Controller() a = Accessory( 'test-dev-123', 'TestCo', 'Test Dev Pro', '00000', 1 ) a.add_service(LightBulbService()) manager = DeviceManager() manager._devices['00:00:00:00:00'] = Device(a) with mock.patch('homekit.controller.ble_impl.device.DeviceManager') as m1: with mock.patch('homekit.controller.ble_impl.DeviceManager') as m2: m1.return_value = manager m2.return_value = manager c.perform_pairing_ble('test-pairing', '00:00:00:00:00', '111-11-111') c.pairings['test-pairing'].list_accessories_and_characteristics() self.assertIsNone(a.services[0].characteristics[0].value) c.pairings['test-pairing'].identify() self.assertTrue(a.services[0].characteristics[0].value)
def test_get_characteristic_invalid_iid(self): model_mixin.id_counter = 0 c = Controller() a = Accessory( 'test-dev-123', 'TestCo', 'Test Dev Pro', '00000', 1 ) a.add_service(LightBulbService()) manager = DeviceManager() manager._devices['00:00:00:00:00'] = Device(a) with mock.patch('homekit.controller.ble_impl.device.DeviceManager') as m1: with mock.patch('homekit.controller.ble_impl.DeviceManager') as m2: m1.return_value = manager m2.return_value = manager c.perform_pairing_ble('test-pairing', '00:00:00:00:00', '111-11-111') c.pairings['test-pairing'].list_accessories_and_characteristics() result = c.pairings['test-pairing'].get_characteristics([ (2, 1), ]) self.assertEqual(result, { (2, 1): { "status": 6, "description": "Accessory was not able to perform the requested operation", } })
def test_get_characteristic_disconnected_read(self): model_mixin.id_counter = 0 c = Controller() a = Accessory( 'test-dev-123', 'TestCo', 'Test Dev Pro', '00000', 1 ) a.add_service(LightBulbService()) manager = DeviceManager() d = manager._devices['00:00:00:00:00'] = Device(a) with mock.patch('homekit.controller.ble_impl.device.DeviceManager') as m1: with mock.patch('homekit.controller.ble_impl.DeviceManager') as m2: m1.return_value = manager m2.return_value = manager c.perform_pairing_ble('test-pairing', '00:00:00:00:00', '111-11-111') c.pairings['test-pairing'].list_accessories_and_characteristics() # Establishes a secure session c.pairings['test-pairing'].get_characteristics([(1, 4)]) # Disconnect from virtual bluetooth device - BleSession doesn't know yet d.disconnect() # Further reads should throw an error self.assertRaises( exceptions.AccessoryDisconnectedError, c.pairings['test-pairing'].get_characteristics, [(1, 4)], )
def test_pair_unpair(self): model_mixin.id_counter = 0 c = Controller() a = Accessory( 'test-dev-123', 'TestCo', 'Test Dev Pro', '00000', 1 ) a.add_service(LightBulbService()) manager = DeviceManager() device = manager._devices['00:00:00:00:00'] = Device(a) with mock.patch('homekit.controller.ble_impl.DeviceManager') as m1: with mock.patch('homekit.controller.ble_impl.device.DeviceManager') as m2: m1.return_value = manager m2.return_value = manager c.perform_pairing_ble('test-pairing', '00:00:00:00:00', '111-11-111') c.pairings['test-pairing'].list_accessories_and_characteristics() self.assertEqual(len(device.peers), 1) c.remove_pairing('test-pairing') self.assertEqual(len(device.peers), 0) self.assertNotIn('test-pairing', c.pairings)
def test_discovery(self): model_mixin.id_counter = 0 c = Controller() a = Accessory( 'test-dev-123', 'TestCo', 'Test Dev Pro', '00000', 1 ) a.add_service(LightBulbService()) manager = DeviceManager() manager._devices['00:00:00:00:00'] = Device(a) with mock.patch('homekit.controller.controller.DiscoveryDeviceManager') as m: m.return_value = manager self.assertEqual(c.discover_ble(0), [{ 'acid': 9, 'category': 'Thermostat', 'cn': 2, 'cv': 2, 'device_id': '99:99:99:99:99:99', 'flags': 'unpaired', 'gsn': 3985, 'mac': '00:00:00:00:00', 'name': 'Test', 'sf': 1, }])
def test_unpaired_identify(self): model_mixin.id_counter = 0 c = Controller() a = Accessory('test-dev-123', 'TestCo', 'Test Dev Pro', '00000', 1) a.add_service(LightBulbService()) manager = DeviceManager() manager._devices['00:00:00:00:00'] = Device(a) with mock.patch( 'homekit.controller.ble_impl.device.DeviceManager') as m: m.return_value = manager self.assertIsNone(a.services[0].characteristics[0].value) self.assertTrue(c.identify_ble('00:00:00:00:00')) self.assertTrue(a.services[0].characteristics[0].value)
def test_pair_malformed_pin(self): model_mixin.id_counter = 0 c = Controller() a = Accessory('test-dev-123', 'TestCo', 'Test Dev Pro', '00000', 1) a.add_service(LightBulbService()) manager = DeviceManager() manager._devices['00:00:00:00:00'] = Device(a) with mock.patch( 'homekit.controller.ble_impl.device.DeviceManager') as m: m.return_value = manager c.perform_pairing_ble('test-pairing', '00:00:00:00:00', '111-11-111') self.assertRaises(exceptions.MalformedPinError, c.perform_pairing_ble, 'alias2', '12:34:56:00:01:0B', '01022021')
def test_pair_success(self): model_mixin.id_counter = 0 c = Controller() a = Accessory('test-dev-123', 'TestCo', 'Test Dev Pro', '00000', 1) a.add_service(LightBulbService()) manager = DeviceManager() manager._devices['00:00:00:00:00'] = Device(a) with mock.patch( 'homekit.controller.ble_impl.device.DeviceManager') as m: m.return_value = manager c.perform_pairing_ble('test-pairing', '00:00:00:00:00', '111-11-111') self.assertEqual(c.pairings['test-pairing'].pairing_data['Connection'], 'BLE')
def test_unpaired_identify_already_paired(self): model_mixin.id_counter = 0 c = Controller() a = Accessory('test-dev-123', 'TestCo', 'Test Dev Pro', '00000', 1) a.add_service(LightBulbService()) manager = DeviceManager() manager._devices['00:00:00:00:00'] = Device(a) with mock.patch( 'homekit.controller.ble_impl.device.DeviceManager') as m: m.return_value = manager c.perform_pairing_ble('test-pairing', '00:00:00:00:00', '111-11-111') self.assertIsNone(a.services[0].characteristics[0].value) self.assertRaises(exceptions.AlreadyPairedError, c.identify_ble, '00:00:00:00:00')
proxy_characteristic.set_get_value_callback( generate_get_value_callback(accessory['aid'], proxy_characteristic)) logging.info('%<------ finished creating proxy ------') return accessories if __name__ == '__main__': args = setup_args_parser() setup_logging(args.loglevel) client_config_file = os.path.expanduser(args.client_data) server_config_file = os.path.expanduser(args.server_data) controller = Controller() try: controller.load_data(client_config_file) except Exception as e: logging.error(e, exc_info=True) sys.exit(-1) if args.alias not in controller.get_pairings(): logging.error('"%s" is no known alias', args.alias) sys.exit(-1) try: pairing = controller.get_pairings()[args.alias] data = pairing.list_accessories_and_characteristics() except Exception as e: logging.error(e, exc_info=True)
def test_list_accessories_and_characteristics(self): model_mixin.id_counter = 0 c = Controller() a = Accessory( 'test-dev-123', 'TestCo', 'Test Dev Pro', '00000', 1 ) a.add_service(LightBulbService()) manager = DeviceManager() manager._devices['00:00:00:00:00'] = Device(a) with mock.patch('homekit.controller.ble_impl.device.DeviceManager') as m: with mock.patch('homekit.controller.ble_impl.DeviceManager') as m2: m.return_value = manager m2.return_value = manager c.perform_pairing_ble('test-pairing', '00:00:00:00:00', '111-11-111') accessories = c.pairings['test-pairing'].list_accessories_and_characteristics() self.assertEqual(accessories, [ { "aid": 1, "services": [ { "characteristics": [ { "iid": 3, "type": "00000014-0000-1000-8000-0026BB765291", "perms": [], "description": "", "format": "bool", "unit": "unknown", "range": None, "step": None }, { "iid": 4, "type": "00000020-0000-1000-8000-0026BB765291", "perms": [], "description": "", "format": "string", "unit": "unknown", "range": None, "step": None }, { "iid": 5, "type": "00000021-0000-1000-8000-0026BB765291", "perms": [], "description": "", "format": "string", "unit": "unknown", "range": None, "step": None }, { "iid": 6, "type": "00000023-0000-1000-8000-0026BB765291", "perms": [], "description": "", "format": "string", "unit": "unknown", "range": None, "step": None }, { "iid": 7, "type": "00000030-0000-1000-8000-0026BB765291", "perms": [], "description": "", "format": "string", "unit": "unknown", "range": None, "step": None }, { "iid": 8, "type": "00000052-0000-1000-8000-0026BB765291", "perms": [], "description": "", "format": "string", "unit": "unknown", "range": None, "step": None } ], "iid": 2, "type": "0000003E-0000-1000-8000-0026BB765291" }, { "characteristics": [ { "iid": 10, "type": "00000025-0000-1000-8000-0026BB765291", "perms": [], "description": "", "format": "bool", "unit": "unknown", "range": None, "step": None } ], "iid": 9, "type": "00000043-0000-1000-8000-0026BB765291" }, { "characteristics": [ { "iid": 12, "type": "0000004C-0000-1000-8000-0026BB765291", "perms": [], "description": "", "format": "data", "unit": "unknown", "range": None, "step": None }, { "iid": 13, "type": "0000004E-0000-1000-8000-0026BB765291", "perms": [], "description": "", "format": "data", "unit": "unknown", "range": None, "step": None }, { "description": "", "format": "data", "iid": 14, "perms": [], "range": None, "step": None, "type": "00000050-0000-1000-8000-0026BB765291", "unit": "unknown"} ], "iid": 11, "type": "00000055-0000-1000-8000-0026BB765291" } ] } ])
def setUp(self): self.controller = Controller()
def setUp(self): self.controller = Controller() self.__class__.logger.clear()