Skip to content

Commit

Permalink
Add tests for clf.listen and clf.connect with card options.
Browse files Browse the repository at this point in the history
  • Loading branch information
nehpetsde committed Apr 2, 2017
1 parent 2361129 commit a90c6aa
Show file tree
Hide file tree
Showing 2 changed files with 120 additions and 12 deletions.
14 changes: 7 additions & 7 deletions src/nfc/clf/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -992,10 +992,6 @@ def listen_dep(target, timeout):

assert isinstance(target, LocalTarget), \
"invalid target argument type: %r" % target
assert target.brty[-1:] in ('A', 'B', 'F'), \
"technology can be A/B/F but not %r" % target.brty[-1:]
assert target.brty[:-1] in ('106', '212', '424', '848'), \
"bitrate can be 106/212/424/848 but not %r" % target.brty[:-1]

with self.lock:
if self.device is None:
Expand All @@ -1008,15 +1004,19 @@ def listen_dep(target, timeout):
if target.atr_res is not None:
log.debug(info, timeout, "DEP")
self.target = listen_dep(target, timeout)
elif target.brty.endswith('A'):
elif target.brty in ('106A', '212A', '424A'):
log.debug(info, timeout, target)
self.target = listen_tta(target, timeout)
elif target.brty.endswith('B'):
elif target.brty in ('106B', '212B', '424B', '848B'):
log.debug(info, timeout, target)
self.target = listen_ttb(target, timeout)
elif target.brty.endswith('F'):
elif target.brty in ('212F', '424F'):
log.debug(info, timeout, target)
self.target = listen_ttf(target, timeout)
else:
errmsg = "unsupported bitrate technology type {}"
raise ValueError(errmsg.format(target.brty))

return self.target

def exchange(self, send_data, timeout):
Expand Down
118 changes: 113 additions & 5 deletions tests/test_clf_init.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,11 +123,6 @@ def test_connect_rdwr_defaults(self, clf, terminate):
rdwr_options = {'iterations': 1}
assert clf.connect(rdwr=rdwr_options, terminate=terminate) is None

def test_connect_card_defaults(self, clf, terminate):
terminate.side_effect = [False, True]
card_options = {'on-startup': lambda _: nfc.clf.LocalTarget('212F')}
assert clf.connect(card=card_options, terminate=terminate) is None

@pytest.mark.parametrize("error", [
IOError, nfc.clf.UnsupportedTargetError, KeyboardInterrupt,
])
Expand Down Expand Up @@ -241,6 +236,77 @@ def test_connect_rdwr_tag_activation_fails(self, clf, terminate):
rdwr_options = {'iterations': 1}
assert clf.connect(rdwr=rdwr_options, terminate=terminate) is None

def _test_connect_card_defaults(self, clf, terminate):
terminate.side_effect = [False, True]
card_options = {'on-startup': lambda _: nfc.clf.LocalTarget('212F')}
assert clf.connect(card=card_options, terminate=terminate) is None

def test_connect_card_as_tt3_target(self, clf, terminate):
terminate.side_effect = [False, False, True]
target = nfc.clf.LocalTarget('212F')
target.sensf_req = HEX('0012FC0103')
target.sensf_res = HEX('0102FE010203040506FFFFFFFFFFFFFFFF12FC')
target.tt3_cmd = HEX('0602fe010203040506010b00018000')
clf.device.listen_ttf.return_value = target
clf.device.send_rsp_recv_cmd.return_value = HEX('0012FC0103')
card_options = {'target': target, 'on-startup': lambda t: target}
assert clf.connect(card=card_options, terminate=terminate) is True

def test_connect_card_and_broken_link_error(self, clf, terminate):
terminate.side_effect = [False, False, True]
target = nfc.clf.LocalTarget('212F')
target.sensf_req = HEX('0012FC0103')
target.sensf_res = HEX('0102FE010203040506FFFFFFFFFFFFFFFF12FC')
target.tt3_cmd = HEX('0602fe010203040506010b00018000')
clf.device.listen_ttf.return_value = target
clf.device.send_rsp_recv_cmd.side_effect = nfc.clf.BrokenLinkError
card_options = {'target': target, 'on-startup': lambda t: target}
assert clf.connect(card=card_options, terminate=terminate) is True

def test_connect_card_and_communication_error(self, clf, terminate):
terminate.side_effect = [False, False, True]
target = nfc.clf.LocalTarget('212F')
target.sensf_req = HEX('0012FC0103')
target.sensf_res = HEX('0102FE010203040506FFFFFFFFFFFFFFFF12FC')
target.tt3_cmd = HEX('0602fe010203040506010b00018000')
clf.device.listen_ttf.return_value = target
clf.device.send_rsp_recv_cmd.side_effect = nfc.clf.CommunicationError
card_options = {'target': target, 'on-startup': lambda t: target}
assert clf.connect(card=card_options, terminate=terminate) is True

def test_connect_card_and_leave_on_connect(self, clf, terminate):
terminate.side_effect = [False, False, True]
target = nfc.clf.LocalTarget('212F')
target.sensf_req = HEX('0012FC0103')
target.sensf_res = HEX('0102FE010203040506FFFFFFFFFFFFFFFF12FC')
target.tt3_cmd = HEX('0602fe010203040506010b00018000')
clf.device.listen_ttf.return_value = target
card_options = {'target': target, 'on-startup': lambda t: target,
'on-connect': lambda tag: False}
tag = clf.connect(card=card_options, terminate=terminate)
assert isinstance(tag, nfc.tag.TagEmulation)

def test_connect_card_emulate_tag_returns_none(self, clf, terminate):
terminate.side_effect = [False, False, True]
target = nfc.clf.LocalTarget('212F')
target.sensf_req = HEX('0012FC0103')
target.sensf_res = HEX('0102FE010203040506FFFFFFFFFFFFFFFF12FC')
target.tt3_cmd = HEX('')
clf.device.listen_ttf.return_value = target
card_options = {'target': target, 'on-startup': lambda t: target}
assert clf.connect(card=card_options, terminate=terminate) is None

def test_connect_card_with_on_discover_false(self, clf, terminate):
terminate.side_effect = [False, False, True]
target = nfc.clf.LocalTarget('212F')
target.sensf_req = HEX('0012FC0103')
target.sensf_res = HEX('0102FE010203040506FFFFFFFFFFFFFFFF12FC')
target.tt3_cmd = HEX('0602fe010203040506010b00018000')
clf.device.listen_ttf.return_value = target
card_options = {'target': target, 'on-startup': lambda t: target,
'on-discover': lambda tag: False}
assert clf.connect(card=card_options, terminate=terminate) is None

#
# SENSE
#
Expand Down Expand Up @@ -337,6 +403,48 @@ def test_sense_ttb_found_tt4_target(self, clf):
assert isinstance(res_target, nfc.clf.RemoteTarget)
clf.device.sense_ttb.assert_called_once_with(req_target)

#
# LISTEN
#

def test_listen_without_device(self, clf):
clf.device = None
with pytest.raises(IOError) as excinfo:
clf.listen(nfc.clf.LocalTarget('106A'), 1.0)
assert excinfo.value.errno == errno.ENODEV

def test_listen_for_tta_target(self, clf):
target = nfc.clf.LocalTarget('106A')
clf.device.listen_tta.return_value = target
assert clf.listen(target, 1.0) is target

def test_listen_for_ttb_target(self, clf):
target = nfc.clf.LocalTarget('106B')
clf.device.listen_ttb.return_value = target
assert clf.listen(target, 1.0) is target

def test_listen_for_ttf_target(self, clf):
target = nfc.clf.LocalTarget('212F')
clf.device.listen_ttf.return_value = target
assert clf.listen(target, 1.0) is target

def test_listen_for_dep_target(self, clf):
target = nfc.clf.LocalTarget('106A')
target.atr_req = HEX('D400 30313233343536373839 00000000')
target.atr_res = HEX('D501 66f6e98d1c13dfe56de4 0000000700')
clf.device.listen_dep.return_value = target
assert clf.listen(target, 1.0) is target
target.atr_req = HEX('D400 30313233343536373839 000000')
assert clf.listen(target, 1.0) is None
target.atr_req = None
assert clf.listen(target, 1.0) is None

def test_listen_for_xxx_target(self, clf):
target = nfc.clf.LocalTarget('xxx')
with pytest.raises(ValueError) as excinfo:
clf.listen(target, 1.0)
assert str(excinfo.value) == "unsupported bitrate technology type xxx"


class TestRemoteTarget(object):
@pytest.mark.parametrize("brty, send, recv, kwargs", [
Expand Down

0 comments on commit a90c6aa

Please sign in to comment.