Skip to content

Commit

Permalink
Add tests for send_cmd_recv_rsp with tt1 target.
Browse files Browse the repository at this point in the history
  • Loading branch information
nehpetsde committed Mar 23, 2017
1 parent e8ca57b commit 4906e02
Show file tree
Hide file tree
Showing 6 changed files with 294 additions and 5 deletions.
2 changes: 1 addition & 1 deletion src/nfc/clf/pn532.py
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,7 @@ def _tt1_send_cmd_recv_rsp(self, data, timeout):
self.chipset.write_register(("CIU_ManualRCV", 0x20)) # enable parity
fifo_level = self.chipset.read_register("CIU_FIFOLevel")
if fifo_level == 0:
raise nfc.clf.TimeoutError
raise nfc.clf.TimeoutError("no tt1 response data in ciu fifo")
data = self.chipset.read_register(*(fifo_level * ["CIU_FIFOData"]))
data = ''.join(["{:08b}".format(octet)[::-1] for octet in data])
data = [int(data[i:i+8][::-1], 2) for i in range(0, len(data)-8, 9)]
Expand Down
2 changes: 1 addition & 1 deletion src/nfc/clf/pn533.py
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,7 @@ def _tt1_send_cmd_recv_rsp(self, data, timeout):
self.chipset.write_register(("CIU_ManualRCV", 0x00)) # enable parity
fifo_level = self.chipset.read_register("CIU_FIFOLevel")
if fifo_level == 0:
raise nfc.clf.TimeoutError
raise nfc.clf.TimeoutError("no tt1 response data in ciu fifo")
data = self.chipset.read_register(*(fifo_level * ["CIU_FIFOData"]))
data = ''.join(["{:08b}".format(octet)[::-1] for octet in data])
data = [int(data[i:i+8][::-1], 2) for i in range(0, len(data)-8, 9)]
Expand Down
1 change: 1 addition & 0 deletions src/nfc/clf/pn53x.py
Original file line number Diff line number Diff line change
Expand Up @@ -653,6 +653,7 @@ def framing(brty):
# Send the command data and return the response. All cases
# where a response is not received raise either an IOError
# or one of the nfc.clf.CommunicationError specializations.
data = bytearray(data) if not isinstance(data, bytearray) else data
try:
if target.sens_res and not target.atr_res:
if target.rid_res: # TT1
Expand Down
19 changes: 19 additions & 0 deletions tests/base_clf_pn53x.py
Original file line number Diff line number Diff line change
Expand Up @@ -493,6 +493,25 @@ def pn53x_test_sense_tta_target_is_tt1(self, device):
]
return device.sense_tta(nfc.clf.RemoteTarget('106A'))

def pn53x_test_send_cmd_recv_rsp_tt1_cmd(self, device, target, cmd_code):
assert target and target.sens_res and target.rid_res
device.chipset.transport.write.reset_mock()
device.chipset.transport.read.reset_mock()
device.chipset.transport.read.side_effect = [
ACK(), self.reg_rsp('00 00 00'), # ReadRegister
ACK(), RSP('09 00'), # WriteRegister
ACK(), RSP('33'), # RFConfiguration
ACK(), RSP('41 00343536'), # InDataExchange
]
cmd = bytes(HEX(cmd_code) + b'123')
assert device.send_cmd_recv_rsp(target, cmd, 1.0) == b'456'
assert device.chipset.transport.write.mock_calls == [call(_) for _ in [
CMD('06 6302 6303 6305'), # ReadRegister
CMD('08 630200 630300 630540'), # WriteRegister
CMD('32 020a0b0f'), # RFConfiguration
CMD('40 01' + cmd_code + '313233'), # InDataExchange
]]

def pn53x_test_sense_tta_target_is_tt2(self, device):
device.chipset.transport.read.side_effect = [
ACK(), RSP('4B 0101004400070416c6c2d73881'), # InListPassiveTarget
Expand Down
110 changes: 107 additions & 3 deletions tests/test_clf_pn532.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import pytest
from pytest_mock import mocker # noqa: F401
from mock import call, MagicMock, PropertyMock
import itertools

import base_clf_pn53x
from base_clf_pn53x import CMD, RSP, ACK, NAK, ERR, HEX # noqa: F401
Expand All @@ -31,8 +32,6 @@ def transport(mocker):
transport.tty = MagicMock()
type(transport.tty).port = PropertyMock(return_value='/dev/ttyS0')
type(transport.tty).baudrate = PropertyMock(return_value=115200)
# transport._manufacturer_name = "Manufacturer Name"
# transport._product_name = "Product Name"
return transport


Expand Down Expand Up @@ -485,14 +484,119 @@ def test_sense_tta_no_target_found(self, device):
def test_sense_tta_target_is_tt1(self, device):
target = self.pn53x_test_sense_tta_target_is_tt1(device)
assert isinstance(target, nfc.clf.RemoteTarget)
assert target.rid_res == HEX('1148B2565400')
assert target.rid_res == HEX('1148 B2565400')
assert target.sens_res == HEX('000C')
assert device.chipset.transport.write.mock_calls == [call(_) for _ in [
CMD('4A 0100'), # InListPassiveTarget
CMD('06 6339'), # ReadRegister
CMD('4A 0104'), # InListPassiveTarget
CMD('40 0178000000000000'), # InDataExchange
]]
return target

@pytest.mark.parametrize("cmd_code", ['00', '01', '1A', '53', '72'])
def test_send_cmd_recv_rsp_tt1_cmd(self, device, cmd_code):
target = self.test_sense_tta_target_is_tt1(device)
self.pn53x_test_send_cmd_recv_rsp_tt1_cmd(device, target, cmd_code)

@pytest.mark.parametrize("cmd_code, crcb1, crcb2", [
('02', '29', 'b7'),
('1B', '77', 'f0'),
('54', 'fc', '2c'),
])
def test_send_cmd_recv_rsp_tt1_fifo(self, device, cmd_code, crcb1, crcb2):
target = self.test_sense_tta_target_is_tt1(device)
device.chipset.transport.write.reset_mock()
device.chipset.transport.read.reset_mock()
device.chipset.transport.read.side_effect = [
ACK(), self.reg_rsp('00 00 00'), # ReadRegister
ACK(), RSP('09 00'), # WriteRegister
ACK(), RSP('33'), # RFConfiguration
ACK(), RSP('09 00'), # WriteRegister
ACK(), RSP('09 00'), # WriteRegister
ACK(), self.reg_rsp('05'), # ReadRegister
ACK(), self.reg_rsp('00 01 1E 7D 08'), # ReadRegister
]
cmd = HEX('%s 10 0000000000000000' % cmd_code) + target.rid_res[2:6]
assert device.send_cmd_recv_rsp(target, cmd, 1.0) == HEX('0000')
assert device.chipset.transport.write.mock_calls == [call(_) for _ in [
CMD('06 6302 6303 6305'), # ReadRegister
CMD('08 630200 630300 630540'), # WriteRegister
CMD('32 020a0b0f'), # RFConfiguration
CMD('08 6339%s 633d07 633104 633d00 630d30'
' 633910 633104 633107'
' 633900 633104 633107'
' 633900 633104 633107'
' 633900 633104 633107'
' 633900 633104 633107'
' 633900 633104 633107'
' 633900 633104 633107'
' 633900 633104 633107'
' 633900 633104 633107'
' 6339b2 633104 633107'
' 633956 633104 633107'
' 633954 633104 633107'
' 633900 633104 633107'
' 6339%s 633104 633107'
' 6339%s 633104 633107'
' 633108' % (cmd_code, crcb1, crcb2)), # WriteRegister
CMD('08 630d20'), # WriteRegister
CMD('06 633a'), # ReadRegister
CMD('06 6339 6339 6339 6339 6339'), # ReadRegister
]]

def test_send_cmd_recv_rsp_tt1_rseg(self, device):
target = self.test_sense_tta_target_is_tt1(device)
device.chipset.transport.write.reset_mock()
device.chipset.transport.read.reset_mock()
device.chipset.transport.read.side_effect = [
ACK(), self.reg_rsp('00 00 00'), # ReadRegister
ACK(), RSP('09 00'), # WriteRegister
ACK(), RSP('33'), # RFConfiguration
] + list(itertools.chain.from_iterable([[
ACK(), RSP('09 00'), # WriteRegister
ACK(), RSP('09 00'), # WriteRegister
ACK(), self.reg_rsp('05'), # ReadRegister
ACK(), self.reg_rsp('00 01 1E 7D 08'), # ReadRegister
] for _ in range(16)]))
cmd = HEX('10 10 0000000000000000') + target.rid_res[2:6]
rsp = device.send_cmd_recv_rsp(target, cmd, 1.0)
assert rsp == HEX('10 00000000 00000000 00000000 00000000')

def test_send_cmd_recv_rsp_tt1_fifo_with_timeout(self, device):
target = self.test_sense_tta_target_is_tt1(device)
device.chipset.transport.write.reset_mock()
device.chipset.transport.read.reset_mock()
device.chipset.transport.read.side_effect = [
ACK(), self.reg_rsp('00 00 00'), # ReadRegister
ACK(), RSP('09 00'), # WriteRegister
ACK(), RSP('33'), # RFConfiguration
ACK(), RSP('09 00'), # WriteRegister
ACK(), RSP('09 00'), # WriteRegister
ACK(), self.reg_rsp('00'), # ReadRegister
]
cmd = HEX('02 10 0000000000000000') + target.rid_res[2:6]
with pytest.raises(nfc.clf.TimeoutError) as excinfo:
device.send_cmd_recv_rsp(target, cmd, 1.0)
assert str(excinfo.value) == "no tt1 response data in ciu fifo"

def test_send_cmd_recv_rsp_tt1_fifo_with_crc_error(self, device):
target = self.test_sense_tta_target_is_tt1(device)
device.chipset.transport.write.reset_mock()
device.chipset.transport.read.reset_mock()
device.chipset.transport.read.side_effect = [
ACK(), self.reg_rsp('00 00 00'), # ReadRegister
ACK(), RSP('09 00'), # WriteRegister
ACK(), RSP('33'), # RFConfiguration
ACK(), RSP('09 00'), # WriteRegister
ACK(), RSP('09 00'), # WriteRegister
ACK(), self.reg_rsp('05'), # ReadRegister
ACK(), self.reg_rsp('00 01 1E 00 00'), # ReadRegister
]
cmd = HEX('02 10 0000000000000000') + target.rid_res[2:6]
with pytest.raises(nfc.clf.TransmissionError) as excinfo:
device.send_cmd_recv_rsp(target, cmd, 1.0)
assert str(excinfo.value) == "crc_b check error"

def test_sense_tta_target_is_tt2(self, device):
target = self.pn53x_test_sense_tta_target_is_tt2(device)
Expand Down

0 comments on commit 4906e02

Please sign in to comment.