def test_validate_internal(): """Test Internal messages.""" versions = [('1.4', INTERNAL_FIXTURES_14), ('1.5', INTERNAL_FIXTURES_15), ('2.0', INTERNAL_FIXTURES_20)] for protocol_version, fixture in versions: gateway = get_gateway(protocol_version) const = get_const(protocol_version) for name, payload in fixture.items(): if isinstance(payload, dict): _payload = payload.get('payload') return_value = payload.get('return') else: _payload = payload return_value = None sub_type = const.Internal[name] msg = Message('1;255;3;0;{};{}\n'.format(sub_type, _payload)) valid = msg.validate(protocol_version) assert valid == { 'node_id': 1, 'child_id': 255, 'type': 3, 'ack': 0, 'sub_type': sub_type, 'payload': _payload } ret = gateway.logic('1;255;3;0;{};{}\n'.format(sub_type, _payload)) if return_value is None: assert ret is None, 'Version: {} Message: {}'.format( protocol_version, msg) else: assert ret, 'Version: {} Message: {}'.format( protocol_version, msg)
def parse_message_to_mqtt(self, data): """Parse a mysensors command string. Return a MQTT topic, payload and qos-level as a tuple. """ msg = Message(data, self) payload = str(msg.payload) msg.payload = "" # prefix/node/child/type/ack/subtype : payload return f"/{msg.encode('/')}"[:-2], payload, msg.ack
def _parse_message_to_mqtt(self, data): """Parse a mysensors command string. Return a MQTT topic, payload and qos-level as a tuple. """ msg = Message(data, self) payload = str(msg.payload) msg.payload = '' # prefix/node/child/type/ack/subtype : payload return ('{}/{}'.format(self._out_prefix, msg.encode('/'))[:-2], payload, msg.ack)
def test_validate_bad_pres(): """Test bad Presentation messages.""" versions = [('1.4', PRES_BAD_FIXTURES_14), ('1.5', PRES_BAD_FIXTURES_15), ('2.0', PRES_BAD_FIXTURES_20)] for protocol_version, fixture in versions: const = get_const(protocol_version) for name, payload in fixture.items(): sub_type = const.Presentation[name] msg = Message('1;0;0;0;{};{}\n'.format(sub_type, payload)) with pytest.raises(vol.Invalid): msg.validate(protocol_version)
def test_encode(self): """Test encode of message.""" msg = Message() cmd = msg.encode() self.assertEqual(cmd, '0;0;0;0;0;\n') msg.node_id = 1 msg.child_id = 255 msg.type = MessageType.internal msg.sub_type = Internal.I_BATTERY_LEVEL msg.ack = 0 msg.payload = 57 cmd = msg.encode() self.assertEqual(cmd, '1;255;3;0;0;57\n')
def test_callback_exception(self): """Test gateway callback with exception.""" side_effect = ValueError('test') self.gateway = Gateway(event_callback=self._callback) with mock.patch.object(self.gateway, 'event_callback', side_effect=side_effect) as mock_callback: with self.assertLogs(level='ERROR') as test_handle: msg = Message() msg.node_id = 1 self.gateway.alert(msg) assert mock_callback.called self.assertEqual( # only check first line of error log test_handle.output[0].split('\n', 1)[0], 'ERROR:mysensors:test')
def test_decode(self): """Test decode of message.""" msg = Message('1;255;3;0;0;57\n') self.assertEqual(msg.node_id, 1) self.assertEqual(msg.child_id, 255) self.assertEqual(msg.type, MessageType.internal) self.assertEqual(msg.sub_type, Internal.I_BATTERY_LEVEL) self.assertEqual(msg.ack, 0) self.assertEqual(msg.payload, '57')
def test_validate_internal(): """Test Internal messages.""" versions = [('1.4', INTERNAL_FIXTURES_14), ('1.5', INTERNAL_FIXTURES_15), ('2.0', INTERNAL_FIXTURES_20)] for protocol_version, fixture in versions: const = get_const(protocol_version) for name, payload in fixture.items(): sub_type = const.Internal[name] msg = Message('1;255;3;0;{};{}\n'.format(sub_type, payload)) valid = msg.validate(protocol_version) assert valid == { 'node_id': 1, 'child_id': 255, 'type': 3, 'ack': 0, 'sub_type': sub_type, 'payload': payload }
def test_validate_set(): """Test Set messages.""" versions = [('1.4', SET_FIXTURES_14), ('1.5', SET_FIXTURES_15), ('2.0', SET_FIXTURES_20)] for protocol_version, fixture in versions: const = get_const(protocol_version) for name, payload in fixture.items(): sub_type = const.SetReq[name] msg = Message('1;0;1;0;{};{}\n'.format(sub_type, payload)) valid = msg.validate(protocol_version) assert valid == { 'node_id': 1, 'child_id': 0, 'type': 1, 'ack': 0, 'sub_type': sub_type, 'payload': payload }
def test_validate_pres(): """Test Presentation messages.""" versions = [('1.4', PRES_FIXTURES_14), ('1.5', PRES_FIXTURES_15), ('2.0', PRES_FIXTURES_20)] for protocol_version, fixture in versions: gateway = get_gateway(protocol_version) const = get_const(protocol_version) for name, payload in fixture.items(): sub_type = const.Presentation[name] msg = Message('1;0;0;0;{};{}\n'.format(sub_type, payload)) valid = msg.validate(protocol_version) assert valid == { 'node_id': 1, 'child_id': 0, 'type': 0, 'ack': 0, 'sub_type': sub_type, 'payload': payload } ret = gateway.logic('1;0;0;0;{};{}\n'.format(sub_type, payload)) assert ret is None
def _check_connection(self): """Check if connection is alive every reconnect_timeout seconds.""" if ((self.tcp_disconnect_timer + 2 * self.reconnect_timeout) < time.time()): self.tcp_disconnect_timer = time.time() raise OSError('No response from {}. Disconnecting'.format( self.server_address)) if (self.tcp_check_timer + self.reconnect_timeout) >= time.time(): return msg = Message().modify(child_id=255, type=self.const.MessageType.internal, sub_type=self.const.Internal.I_VERSION) self.add_job(msg.encode) self.tcp_check_timer = time.time()
def _check_connection(self): """Check if connection is alive every reconnect_timeout seconds.""" if ((self.tcp_disconnect_timer + 2 * self.reconnect_timeout) < time.time()): self.tcp_disconnect_timer = time.time() self.disconnect() _LOGGER.info('No response. Disconnected.') return if not (self.tcp_check_timer + self.reconnect_timeout) < time.time(): return msg = Message().copy(child_id=255, type=self.const.MessageType.internal, sub_type=self.const.Internal.I_VERSION) self.fill_queue(msg.encode) self.tcp_check_timer = time.time()
def get_message(message_data=None): """Return a message.""" return Message(message_data)
def test_decode_bad_message(self): """Test decode of bad message.""" with self.assertRaises(ValueError): Message('bad;bad;bad;bad;bad;bad\n')
def test_encode_bad_message(self): """Test encode of bad message.""" msg = Message() msg.sub_type = 'bad' cmd = msg.encode() self.assertEqual(cmd, None)