def do_raw_action(self, action, size, output_size=None, data=None, timeout=2): # type: (str, int, Optional[int], Optional[bytearray], Union[T_co, int]) -> Union[T_co, Dict[str, Any]] input_field = Field.padding(13) if data is None else Field.bytes('data', len(data)) command = MasterCommandSpec(action, [input_field], [Field.bytes('data', size), Field.lit('\r\n')]) return self.do_command(command, fields={'data': data}, timeout=timeout)
def test_consume_output_varlength(self): """ Test for MasterCommandSpec.consume_output with a variable length output field. """ def dim(byte_value): """ Convert a dimmer byte value to the api value. """ return int(byte_value * 10.0 / 6.0) basic_action = MasterCommandSpec( 'OL', [], [Field('outputs', OutputFieldType()), Field.lit('\r\n\r\n')]) # Empty outputs (bytes_consumed, result, done) = basic_action.consume_output(bytearray(b'\x00\r\n\r\n'), None) self.assertEqual((5, True), (bytes_consumed, done)) self.assertEqual([], result["outputs"]) # One output (bytes_consumed, result, done) = basic_action.consume_output( bytearray(b'\x01\x05\x10\r\n\r\n'), None) self.assertEqual((7, True), (bytes_consumed, done)) self.assertEqual([(5, dim(16))], result["outputs"]) # Split up in multiple parts (bytes_consumed, result, done) = basic_action.consume_output(bytearray(b'\x03'), None) self.assertEqual((1, False), (bytes_consumed, done)) (bytes_consumed, result, done) = basic_action.consume_output(bytearray(b'\x05\x10'), result) self.assertEqual((2, False), (bytes_consumed, done)) (bytes_consumed, result, done) = basic_action.consume_output( bytearray(b'\x01\x02\x03\x04\r\n'), result) self.assertEqual((6, False), (bytes_consumed, done)) (bytes_consumed, result, done) = basic_action.consume_output(bytearray(b'\r\n'), result) self.assertEqual((2, True), (bytes_consumed, done)) self.assertEqual([(5, dim(16)), (1, dim(2)), (3, dim(4))], result["outputs"])
def test_consume_output(self): """ Test for MasterCommandSpec.consume_output """ basic_action = MasterCommandSpec('BA', [], [ Field.string('response', 2), Field.padding(11), Field.lit('\r\n') ]) # Simple case, full string without offset at once (bytes_consumed, result, done) = basic_action.consume_output( bytearray(b'OK' + (b'\x00' * 11) + b'\r\n'), None) self.assertEqual((15, True), (bytes_consumed, done)) self.assertEqual('OK', result["response"]) # Full string with extra padding in the back (bytes_consumed, result, done) = basic_action.consume_output( bytearray(b'OK' + (b'\x00' * 11) + b'\r\nSome\x04Junk'), None) self.assertEqual((15, True), (bytes_consumed, done)) self.assertEqual('OK', result["response"]) # String in 2 pieces (bytes_consumed, result, done) = basic_action.consume_output(bytearray(b'OK' + (b'\x00' * 5)), None) self.assertEqual((7, False), (bytes_consumed, done)) self.assertEqual(bytearray(b'\x00' * 5), result.pending_bytes) (bytes_consumed, result, done) = basic_action.consume_output( bytearray((b'\x00' * 6) + b'\r\n'), result) self.assertEqual((8, True), (bytes_consumed, done)) self.assertEqual('OK', result["response"]) # String in 2 pieces with extra padding in back (bytes_consumed, result, done) = basic_action.consume_output(bytearray(b'OK' + (b'\x00' * 5)), None) self.assertEqual((7, False), (bytes_consumed, done)) self.assertEqual(bytearray(b'\x00' * 5), result.pending_bytes) (bytes_consumed, result, done) = basic_action.consume_output( bytearray((b'\x00' * 6) + b'\r\nWorld'), result) self.assertEqual((8, True), (bytes_consumed, done)) self.assertEqual('OK', result["response"]) # String in 3 pieces (bytes_consumed, result, done) = basic_action.consume_output(bytearray(b'OK' + (b'\x00' * 5)), None) self.assertEqual((7, False), (bytes_consumed, done)) self.assertEqual(bytearray(b'\x00' * 5), result.pending_bytes) (bytes_consumed, result, done) = basic_action.consume_output(bytearray(b'\x00' * 3), result) self.assertEqual((3, False), (bytes_consumed, done)) self.assertEqual(bytearray(b'\x00' * 8), result.pending_bytes) (bytes_consumed, result, done) = basic_action.consume_output(bytearray(b'\x00' * 3), result) self.assertEqual((3, False), (bytes_consumed, done)) self.assertEqual(bytearray(b''), result.pending_bytes) (bytes_consumed, result, done) = basic_action.consume_output(bytearray(b'\r\n'), result) self.assertEqual((2, True), (bytes_consumed, done)) self.assertEqual('OK', result["response"])