def create_layer(self, params): address = isotp.Address(isotp.AddressingMode.Normal_11bits, txid=self.TXID, rxid=self.RXID) return isotp.TransportLayer(txfn=self.stack_txfn, rxfn=self.stack_rxfn, address=address, params=params)
def setUp(self): params = { 'stmin' : 1, 'blocksize' : 8, 'squash_stmin_requirement' : False, 'rx_flowcontrol_timeout' : 1000, 'rx_consecutive_frame_timeout' : 1000, 'wftmax' : 0 } address = isotp.Address(isotp.AddressingMode.Normal_11bits, txid=self.TXID, rxid=self.RXID) self.stack = isotp.TransportLayer(txfn=self.stack_txfn, rxfn=self.stack_rxfn, address=address, error_handler = self.error_handler, params = params) self.error_triggered = {} self.init_test_case()
def test_single_frame_only_function_tatype(self): tatype = isotp.TargetAddressType.Functional address = isotp.Address(isotp.AddressingMode.Normal_11bits, txid=1, rxid=2) layer = isotp.TransportLayer(txfn=self.stack_txfn, rxfn=self.stack_rxfn, address=address) layer.send(self.make_payload(7), tatype) with self.assertRaises(ValueError): layer.send(self.make_payload(8), tatype) address = isotp.Address(isotp.AddressingMode.Normal_29bits, txid=1, rxid=2) layer = isotp.TransportLayer(txfn=self.stack_txfn, rxfn=self.stack_rxfn, address=address) layer.send(self.make_payload(7), tatype) with self.assertRaises(ValueError): layer.send(self.make_payload(8), tatype) address = isotp.Address(isotp.AddressingMode.NormalFixed_29bits, source_address=1, target_address=2) layer = isotp.TransportLayer(txfn=self.stack_txfn, rxfn=self.stack_rxfn, address=address) layer.send(self.make_payload(7), tatype) with self.assertRaises(ValueError): layer.send(self.make_payload(8), tatype) address = isotp.Address(isotp.AddressingMode.Extended_11bits, txid=1, rxid=2, target_address=3) layer = isotp.TransportLayer(txfn=self.stack_txfn, rxfn=self.stack_rxfn, address=address) layer.send(self.make_payload(6), tatype) with self.assertRaises(ValueError): layer.send(self.make_payload(7), tatype) address = isotp.Address(isotp.AddressingMode.Extended_29bits, txid=1, rxid=2, target_address=3) layer = isotp.TransportLayer(txfn=self.stack_txfn, rxfn=self.stack_rxfn, address=address) layer.send(self.make_payload(6), tatype) with self.assertRaises(ValueError): layer.send(self.make_payload(7), tatype) address = isotp.Address(isotp.AddressingMode.Mixed_11bits, txid=1, rxid=2, address_extension=3) layer = isotp.TransportLayer(txfn=self.stack_txfn, rxfn=self.stack_rxfn, address=address) layer.send(self.make_payload(6), tatype) with self.assertRaises(ValueError): layer.send(self.make_payload(7), tatype) address = isotp.Address(isotp.AddressingMode.Mixed_29bits, source_address=1, target_address=2, address_extension=3) layer = isotp.TransportLayer(txfn=self.stack_txfn, rxfn=self.stack_rxfn, address=address) layer.send(self.make_payload(6), tatype) with self.assertRaises(ValueError): layer.send(self.make_payload(7), tatype)
def test_11bits_mixed_through_layer(self): functional = isotp.TargetAddressType.Functional physical = isotp.TargetAddressType.Physical txid = 0x123 rxid = 0x456 ae = 0x99 address = isotp.Address(isotp.AddressingMode.Mixed_11bits, txid=txid, rxid=rxid, address_extension=ae) layer = isotp.TransportLayer(txfn=self.stack_txfn, rxfn=self.stack_rxfn, address=address, params={ 'stmin': 0, 'blocksize': 0 }) # Receive Single frame - Physical / Functional self.simulate_rx_msg( Message(arbitration_id=rxid, data=bytearray([ae, 0x03, 0x01, 0x02, 0x03]), extended_id=False)) layer.process() frame = layer.recv() self.assertIsNotNone(frame) self.assertEqual(frame, b'\x01\x02\x03') # Receive multiframe - Physical layer.reset() self.simulate_rx_msg( Message(arbitration_id=rxid, data=bytearray( [ae, 0x10, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05]), extended_id=False)) layer.process() self.assert_sent_flow_control(prefix=[ae], stmin=0, blocksize=0) self.simulate_rx_msg( Message(arbitration_id=rxid, data=bytearray([ae, 0x21, 0x06, 0x07, 0x08]), extended_id=False)) layer.process() frame = layer.recv() self.assertIsNotNone(frame) self.assertEqual(frame, b'\x01\x02\x03\x04\x05\x06\x07\x08') #Transmit single frame - Physical layer.reset() layer.send(b'\x04\x05\x06', physical) layer.process() msg = self.get_tx_can_msg() self.assertIsNotNone(msg) self.assertEqual(msg.arbitration_id, txid) self.assertEqual(msg.data, bytearray([ae, 0x03, 0x04, 0x05, 0x06])) self.assertFalse(msg.is_extended_id) #Transmit single frame - Functional layer.reset() layer.send(b'\x04\x05\x06', functional) layer.process() msg = self.get_tx_can_msg() self.assertIsNotNone(msg) self.assertEqual(msg.arbitration_id, txid) self.assertEqual(msg.data, bytearray([ae, 0x03, 0x04, 0x05, 0x06])) self.assertFalse(msg.is_extended_id) # Transmit multiframe - Physical layer.reset() layer.send(b'\x04\x05\x06\x07\x08\x09\x0A\x0B', physical) layer.process() msg = self.get_tx_can_msg() self.assertIsNotNone(msg) self.assertEqual(msg.arbitration_id, txid) self.assertEqual( msg.data, bytearray([ae, 0x10, 0x08, 0x04, 0x05, 0x06, 0x07, 0x08])) self.assertFalse(msg.is_extended_id) self.simulate_rx_msg( Message(arbitration_id=rxid, data=self.make_flow_control_data(flow_status=0, stmin=0, blocksize=0, prefix=[ae]), extended_id=False)) layer.process() msg = self.get_tx_can_msg() self.assertIsNotNone(msg) self.assertEqual(msg.arbitration_id, txid) self.assertEqual(msg.data, bytearray([ae, 0x21, 0x09, 0x0A, 0x0B])) self.assertFalse(msg.is_extended_id)
def test_11bits_extended_through_layer(self): functional = isotp.TargetAddressType.Functional physical = isotp.TargetAddressType.Physical txid = 0x123 rxid = 0x456 sa = 0x55 ta = 0xAA address = isotp.Address(isotp.AddressingMode.Extended_11bits, txid=txid, rxid=rxid, source_address=sa, target_address=ta) layer = isotp.TransportLayer(txfn=self.stack_txfn, rxfn=self.stack_rxfn, address=address, params={ 'stmin': 0, 'blocksize': 0 }) # Receive Single frame - Physical / Functional self.simulate_rx_msg( Message(arbitration_id=rxid, data=bytearray([sa, 0x03, 0x01, 0x02, 0x03]), extended_id=False)) layer.process() frame = layer.recv() self.assertIsNotNone(frame) self.assertEqual(frame, b'\x01\x02\x03') # Receive multiframe - Physical layer.reset() self.simulate_rx_msg( Message(arbitration_id=rxid, data=bytearray( [sa, 0x10, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05]), extended_id=False)) layer.process() self.assert_sent_flow_control(prefix=[ta], stmin=0, blocksize=0) self.simulate_rx_msg( Message(arbitration_id=rxid, data=bytearray([sa, 0x21, 0x06, 0x07, 0x08]), extended_id=False)) layer.process() frame = layer.recv() self.assertIsNotNone(frame) self.assertEqual(frame, b'\x01\x02\x03\x04\x05\x06\x07\x08') #Transmit single frame - Physical layer.reset() layer.send(b'\x04\x05\x06', physical) layer.process() msg = self.get_tx_can_msg() self.assertIsNotNone(msg) self.assertEqual(msg.arbitration_id, txid) self.assertEqual(msg.data, bytearray([ta, 0x03, 0x04, 0x05, 0x06])) self.assertFalse(msg.is_extended_id) #Transmit single frame - Functional layer.reset() layer.send(b'\x04\x05\x06', functional) layer.process() msg = self.get_tx_can_msg() self.assertIsNotNone(msg) self.assertEqual(msg.arbitration_id, txid) self.assertEqual(msg.data, bytearray([ta, 0x03, 0x04, 0x05, 0x06])) self.assertFalse(msg.is_extended_id) #Transmit single frame - Functional; txdl=32 layer.reset() layer.params.set('tx_data_length', 32) layer.send(b'\x55' * 29, functional) layer.process() msg = self.get_tx_can_msg() self.assertIsNotNone(msg) self.assertEqual(msg.arbitration_id, txid) self.assertEqual(msg.data, bytearray([ta, 0x00, 29] + [0x55] * 29)) self.assertFalse(msg.is_extended_id) #Transmit single frame - Functional; txdl=32 with self.assertRaises(ValueError): layer.reset() layer.params.set('tx_data_length', 32) layer.send(b'\x55' * 30, functional) layer.params.set('tx_data_length', 8) # Transmit single frame with payload length 7 - Physical; txdl=16...64 for tx_len in (12, 16, 20, 24, 32, 48, 64): layer.reset() layer.params.set("tx_data_length", tx_len) layer.send(b'\x55' * 7) layer.process() msg = self.get_tx_can_msg() self.assertIsNotNone(msg) self.assertEqual(msg.arbitration_id, txid) self.assertEqual( msg.data, bytearray([ta, 0x00, 0x07] + [0x55] * 7 + [0xCC] * 2)) self.assertFalse(msg.is_extended_id) layer.params.set("tx_data_length", 8) # Transmit multiframe - Physical layer.reset() layer.send(b'\x04\x05\x06\x07\x08\x09\x0A\x0B', physical) layer.process() msg = self.get_tx_can_msg() self.assertIsNotNone(msg) self.assertEqual(msg.arbitration_id, txid) self.assertEqual( msg.data, bytearray([ta, 0x10, 0x08, 0x04, 0x05, 0x06, 0x07, 0x08])) self.assertFalse(msg.is_extended_id) self.simulate_rx_msg( Message(arbitration_id=rxid, data=self.make_flow_control_data(flow_status=0, stmin=0, blocksize=0, prefix=[sa]), extended_id=False)) layer.process() msg = self.get_tx_can_msg() self.assertIsNotNone(msg) self.assertEqual(msg.arbitration_id, txid) self.assertEqual(msg.data, bytearray([ta, 0x21, 0x09, 0x0A, 0x0B])) self.assertFalse(msg.is_extended_id)
def test_29bits_normal_fixed_through_layer(self): functional = isotp.TargetAddressType.Functional physical = isotp.TargetAddressType.Physical ta = 0x55 sa = 0xAA rxid_physical = 0x18DAAA55 rxid_functional = 0x18DBAA55 txid_physical = 0x18DA55AA txid_functional = 0x18DB55AA address = isotp.Address(isotp.AddressingMode.NormalFixed_29bits, target_address=ta, source_address=sa) layer = isotp.TransportLayer(txfn=self.stack_txfn, rxfn=self.stack_rxfn, address=address, params={ 'stmin': 0, 'blocksize': 0 }) # Receive Single frame - Physical self.simulate_rx_msg( Message(arbitration_id=rxid_physical, data=bytearray([0x03, 0x01, 0x02, 0x03]), extended_id=True)) layer.process() frame = layer.recv() self.assertIsNotNone(frame) self.assertEqual(frame, b'\x01\x02\x03') # Receive Single frame - Functional layer.reset() self.simulate_rx_msg( Message(arbitration_id=rxid_functional, data=bytearray([0x03, 0x01, 0x02, 0x03]), extended_id=True)) layer.process() frame = layer.recv() self.assertIsNotNone(frame) self.assertEqual(frame, b'\x01\x02\x03') # Receive multiframe - Physical layer.reset() self.simulate_rx_msg( Message(arbitration_id=rxid_physical, data=bytearray( [0x10, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06]), extended_id=True)) layer.process() self.assert_sent_flow_control(stmin=0, blocksize=0) self.simulate_rx_msg( Message(arbitration_id=rxid_physical, data=bytearray([0x21, 0x07, 0x08]), extended_id=True)) layer.process() frame = layer.recv() self.assertIsNotNone(frame) self.assertEqual(frame, b'\x01\x02\x03\x04\x05\x06\x07\x08') #Transmit single frame - Physical layer.reset() layer.send(b'\x04\x05\x06', physical) layer.process() msg = self.get_tx_can_msg() self.assertIsNotNone(msg) self.assertEqual(msg.arbitration_id, txid_physical) self.assertEqual(msg.data, bytearray([0x03, 0x04, 0x05, 0x06])) self.assertTrue(msg.is_extended_id) #Transmit single frame - Functional layer.reset() layer.send(b'\x04\x05\x06', functional) layer.process() msg = self.get_tx_can_msg() self.assertIsNotNone(msg) self.assertEqual(msg.arbitration_id, txid_functional) self.assertEqual(msg.data, bytearray([0x03, 0x04, 0x05, 0x06])) self.assertTrue(msg.is_extended_id) # Transmit multiframe - Physical layer.reset() layer.send(b'\x04\x05\x06\x07\x08\x09\x0A\x0B', physical) layer.process() msg = self.get_tx_can_msg() self.assertIsNotNone(msg) self.assertEqual(msg.arbitration_id, txid_physical) self.assertEqual( msg.data, bytearray([0x10, 0x08, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09])) self.assertTrue(msg.is_extended_id) self.simulate_rx_msg( Message(arbitration_id=rxid_physical, data=self.make_flow_control_data(flow_status=0, stmin=0, blocksize=0), extended_id=True)) layer.process() msg = self.get_tx_can_msg() self.assertIsNotNone(msg) self.assertEqual(msg.arbitration_id, txid_physical) self.assertEqual(msg.data, bytearray([0x21, 0x0A, 0x0B])) self.assertTrue(msg.is_extended_id)
def test_11bits_normal_through_layer(self): functional = isotp.TargetAddressType.Functional physical = isotp.TargetAddressType.Physical rxid = 0x123 txid = 0x456 address = isotp.Address(isotp.AddressingMode.Normal_11bits, txid=txid, rxid=rxid) layer = isotp.TransportLayer(txfn=self.stack_txfn, rxfn=self.stack_rxfn, address=address, params={ 'stmin': 0, 'blocksize': 0 }) # Receive Single frame - Physical self.simulate_rx_msg( Message(arbitration_id=rxid, data=bytearray([0x03, 0x01, 0x02, 0x03]), extended_id=False)) layer.process() frame = layer.recv() self.assertIsNotNone(frame) self.assertEqual(frame, b'\x01\x02\x03') # Receive Single frame - Functional layer.reset() self.simulate_rx_msg( Message(arbitration_id=rxid, data=bytearray([0x03, 0x01, 0x02, 0x03]), extended_id=False)) layer.process() frame = layer.recv() self.assertIsNotNone(frame) self.assertEqual(frame, b'\x01\x02\x03') # Receive multiframe - Physical layer.reset() self.simulate_rx_msg( Message(arbitration_id=rxid, data=bytearray( [0x10, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06]), extended_id=False)) layer.process() self.assert_sent_flow_control(stmin=0, blocksize=0) self.simulate_rx_msg( Message(arbitration_id=rxid, data=bytearray([0x21, 0x07, 0x08]), extended_id=False)) layer.process() frame = layer.recv() self.assertIsNotNone(frame) self.assertEqual(frame, b'\x01\x02\x03\x04\x05\x06\x07\x08') #Transmit single frame - Physical / Functional layer.reset() layer.send(b'\x04\x05\x06', physical) layer.process() msg = self.get_tx_can_msg() self.assertIsNotNone(msg) self.assertEqual(msg.arbitration_id, txid) self.assertEqual(msg.data, bytearray([0x03, 0x04, 0x05, 0x06])) self.assertFalse(msg.is_extended_id) #Transmit single frame - Functional : tx_dl = 32 layer.reset() layer.params.set('tx_data_length', 32) layer.send(b'\xAA' * 30, functional) layer.process() msg = self.get_tx_can_msg() self.assertIsNotNone(msg) self.assertEqual(msg.arbitration_id, txid) self.assertEqual(msg.data, bytearray([0x00, 30] + [0xaa] * 30)) self.assertFalse(msg.is_extended_id) with self.assertRaises(ValueError): layer.reset() layer.params.set('tx_data_length', 32) layer.send(b'\x04' * 31, functional) layer.params.set('tx_data_length', 8) # Transmit multiframe - Physical layer.reset() layer.send(b'\x04\x05\x06\x07\x08\x09\x0A\x0B', physical) layer.process() msg = self.get_tx_can_msg() self.assertIsNotNone(msg) self.assertEqual(msg.arbitration_id, txid) self.assertEqual( msg.data, bytearray([0x10, 0x08, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09])) self.assertFalse(msg.is_extended_id) self.simulate_rx_msg( Message(arbitration_id=rxid, data=self.make_flow_control_data(flow_status=0, stmin=0, blocksize=0), extended_id=False)) layer.process() msg = self.get_tx_can_msg() self.assertIsNotNone(msg) self.assertEqual(msg.arbitration_id, txid) self.assertEqual(msg.data, bytearray([0x21, 0x0A, 0x0B])) self.assertFalse(msg.is_extended_id)