class TestFakeReadDevice(unittest.TestCase): """ FakeReadDevice class should work as intended to emluate a serial port """ def setUp(self): """ Create a fake read device for each test """ self.device = FakeReadDevice("test") def test_read_single_byte(self): """ reading one byte at a time should work as expected """ self.assertEqual(self.device.read(), 't') self.assertEqual(self.device.read(), 'e') self.assertEqual(self.device.read(), 's') self.assertEqual(self.device.read(), 't') def test_read_multiple_bytes(self): """ reading multiple bytes at a time should work as expected """ self.assertEqual(self.device.read(3), 'tes') self.assertEqual(self.device.read(), 't') def test_read_too_many(self): """ attempting to read too many bytes should raise an exception """ self.assertRaises(ValueError, self.device.read, 5)
def test_read_io_data(self): """ XBee class should properly read and parse incoming IO data """ ## Build IO data # One sample, ADC 0 enabled # DIO 1,3,5,7 enabled header = b'\x01\x02\xAA' # First 7 bits ignored, DIO8 low, DIO 0-7 alternating # ADC0 value of 255 sample = b'\x00\xAA\x00\xFF' data = header + sample ## Wrap data in frame # RX frame data rx_io_resp = b'\x83\x00\x01\x28\x00' device = FakeReadDevice( b'\x7E\x00\x0C'+ rx_io_resp + data + b'\xfd' ) xbee = XBee(device) info = xbee.wait_read_frame() expected_info = {'id':'rx_io_data', 'source_addr':b'\x00\x01', 'rssi':b'\x28', 'options':b'\x00', 'samples': [{'dio-1':True, 'dio-3':True, 'dio-5':True, 'dio-7':True, 'adc-0':255}] } self.assertEqual(info, expected_info)
def test_is_remote_response_parsed_as_io(self): """ I/O data in a Remote AT response for an IS command is parsed. """ ## Build IO data # One sample, ADC 0 enabled # DIO 1,3,5,7 enabled header = b'\x01\x02\xAA' # First 7 bits ignored, DIO8 low, DIO 0-7 alternating # ADC0 value of 255 sample = b'\x00\xAA\x00\xFF' data = header + sample device = FakeReadDevice( APIFrame(data = b'\x97D\x00\x13\xa2\x00@oG\xe4v\x1aIS\x00' + data).output() ) xbee = XBee(device) info = xbee.wait_read_frame() expected_info = {'id':'remote_at_response', 'frame_id':b'D', 'source_addr_long': b'\x00\x13\xa2\x00@oG\xe4', 'source_addr': b'v\x1a', 'command':b'IS', 'status':b'\x00', 'parameter':[{'dio-1':True, 'dio-3':True, 'dio-5':True, 'dio-7':True, 'adc-0':255}]} self.assertEqual(info, expected_info)
def test_read(self): """ _wait_for_frame should properly read a frame of data """ device = FakeReadDevice(b'\x7E\x00\x01\x00\xFF') xbee = XBeeBase(device) frame = xbee._wait_for_frame() self.assertEqual(frame.data, b'\x00')
def test_read_invalid_followed_by_valid(self): """ _wait_for_frame should skip invalid data """ device = FakeReadDevice(b'\x7E\x00\x01\x00\xFA' + b'\x7E\x00\x01\x05\xFA') xbee = XBeeBase(device) frame = xbee._wait_for_frame() self.assertEqual(frame.data, b'\x05')
def test_read_escaped(self): """ _wait_for_frame should properly read a frame of data Verify that API mode 2 escaped bytes are read correctly """ device = FakeReadDevice('\x7E\x00\x04\x7D\x5E\x7D\x5D\x7D\x31\x7D\x33\xE0') xbee = XBeeBase(device,escaped=True) frame = xbee._wait_for_frame() self.assertEqual(frame.data, '\x7E\x7D\x11\x13')
def test_read_at(self): """ read and parse a parameterless AT command """ device = FakeReadDevice(b'\x7E\x00\x05\x88DMY\x01\x8c') xbee = XBee(device) info = xbee.wait_read_frame() expected_info = {'id':'at_response', 'frame_id':b'D', 'command':b'MY', 'status':b'\x01'} self.assertEqual(info, expected_info)
def test_read_rx_with_close_brace(self): """ An rx data frame including a close brace must be read properly. """ device = FakeReadDevice(APIFrame(b'\x81\x01\x02\x55\x00{test=1}').output()) xbee = XBee(device) info = xbee.wait_read_frame() expected_info = {'id':'rx', 'source_addr':b'\x01\x02', 'rssi':b'\x55', 'options':b'\x00', 'rf_data':b'{test=1}'} self.assertEqual(info, expected_info)
def test_empty_frame_ignored(self): """ If an empty frame is received from a device, it must be ignored. """ device = FakeReadDevice(b'\x7E\x00\x00\xFF\x7E\x00\x05\x88DMY\x01\x8c') xbee = XBee(device) #import pdb #pdb.set_trace() info = xbee.wait_read_frame() expected_info = {'id':'at_response', 'frame_id':b'D', 'command':b'MY', 'status':b'\x01'} self.assertEqual(info, expected_info)
def test_read_at_params_in_escaped_mode(self): """ read and parse an AT command with a parameter in escaped API mode """ device = FakeReadDevice( b'~\x00\t\x88DMY\x01}^}]}1}3m' ) xbee = XBee(device, escaped=True) info = xbee.wait_read_frame() expected_info = {'id':'at_response', 'frame_id':b'D', 'command':b'MY', 'status':b'\x01', 'parameter':b'\x7E\x7D\x11\x13'} self.assertEqual(info, expected_info)
def test_read_at_params(self): """ read and parse an AT command with a parameter """ device = FakeReadDevice('\x7E\x00\x08\x88DMY\x01\x00\x00\x00\x8c') xbee = XBeePro900(device) info = xbee.wait_read_frame() expected_info = { 'id': 'at_response', 'frame_id': 'D', 'command': 'MY', 'status': '\x01', 'parameter': '\x00\x00\x00' } self.assertEqual(info, expected_info)
def test_read_90(self): """ Read and parse an RX packet from an XBee-Pro 900MHz module. """ data = '~\x00L\x90\x00}3\xa2\x00@x\xcd9\xff\xfe\x02\x00\x0f\x0e/AccelX\x00\x00\x00\x00\x00\x00\xc0L?AccelY\x00\x00\x00\x00\x00\x00\xc0L?AccelZ\x00\x00\x00\x00\x00\x00\xc0L?Yaw\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0L?\xc1' device = FakeReadDevice(data) xbee = XBeePro900(device, escaped=True) info = xbee.wait_read_frame() # import pprint # pprint.pprint(info) ## {'frame_id': '\x00', ## 'id': 'rx_pro', ## 'reserved': '\xfe\x02', ## 'rf_data': '\x0f\x0e/AccelX\x00\x00\x00\x00\x00\x00\xc0L?AccelY\x00\x00\x00\x00\x00\x00\xc0L?AccelZ\x00\x00\x00\x00\x00\x00\xc0L?Yaw\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0L?', ## 'rx_opt': '\x00', ## 'source_addr_long': '\x13\xa2\x00@x\xcd9\xff'} expected_info = { 'id': 'rx', 'frame_id': '\x00', 'source_addr': '\x13\xa2\x00\x40\x78\xcd\x39', 'reserved': '\xff\xfe', 'options': '\x02', 'rf_data': '\x00\x0f\x0e/AccelX\x00\x00\x00\x00\x00\x00\xc0L?AccelY\x00\x00\x00\x00\x00\x00\xc0L?AccelZ\x00\x00\x00\x00\x00\x00\xc0L?Yaw\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0L?' } self.maxDiff = None self.assertEqual(info, expected_info)
def setUp(self): """ Create a fake read device for each test """ self.device = FakeReadDevice("test")
def setUp(self): self.xbee = None self.serial = FakeReadDevice([], silent_on_empty=True) self.callback = lambda data: None