Skip to content

Commit

Permalink
Add tests for dep initiator activate method.
Browse files Browse the repository at this point in the history
  • Loading branch information
nehpetsde committed May 16, 2017
1 parent da5e326 commit 856fa3b
Show file tree
Hide file tree
Showing 2 changed files with 149 additions and 9 deletions.
23 changes: 14 additions & 9 deletions src/nfc/dep.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,11 @@ def __init__(self, clf):
self.gbt = None # general bytes from target
self.pni = None # dep packet number information
self.rwt = None # target response waiting time
self.acm = None # active communication mode flag
self._acm = None # active communication mode flag

@property
def acm(self):
return bool(self._acm)

def __str__(self):
msg = "NFC-DEP Initiator {brty} {mode} mode MIU={miu} RWT={rwt:.6f}"
Expand All @@ -99,8 +103,8 @@ def activate(self, target=None, **options):
self.gbi = options.get('gbi', '')[0:48]
self.brs = min(max(0, options.get('brs', 2)), 2)
self.lri = min(max(0, options.get('lri', 3)), 3)
if self.acm is None or 'acm' in options:
self.acm = bool(options.get('acm', True))
if self._acm is None or 'acm' in options:
self._acm = bool(options.get('acm', True))

assert self.did is None or 0 <= self.did <= 255
assert self.nad is None or 0 <= self.nad <= 255
Expand All @@ -114,17 +118,18 @@ def activate(self, target=None, **options):

if self.target is None and self.acm is True:
log.debug("searching active communication mode target at 106A")
target = nfc.clf.RemoteTarget("106A", atr_req=atr_req.encode())
tg = nfc.clf.RemoteTarget("106A", atr_req=atr_req.encode())
try:
target = self.clf.sense(target, iterations=2, interval=0.1)
if target:
atr_res = ATR_RES.decode(target.atr_res)
self.target = self.clf.sense(tg, iterations=2, interval=0.1)
except nfc.clf.UnsupportedTargetError:
self.acm = False
self._acm = False
except nfc.clf.CommunicationError:
pass
else:
self.target = target
if self.target:
atr_res = ATR_RES.decode(self.target.atr_res)
else:
self._acm = None

if self.target is None:
log.debug("searching passive communication mode target at 106A")
Expand Down
135 changes: 135 additions & 0 deletions tests/test_dep.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
# -*- coding: latin-1 -*-
from __future__ import absolute_import, division

import nfc
import nfc.dep

import pytest
from pytest_mock import mocker # noqa: F401
# from mock import call

import logging
logging.basicConfig(level=logging.DEBUG-1)
logging_level = logging.getLogger().getEffectiveLevel()
logging.getLogger("nfc.dep").setLevel(logging_level)


def HEX(s):
return bytearray.fromhex(s)


@pytest.fixture()
def target():
target = nfc.clf.RemoteTarget("106A")
target.sens_res = HEX("4400")
target.sel_res = HEX("00")
target.sdd_res = HEX("0102030405060708")
return target


@pytest.fixture() # noqa: F811
def clf(mocker):
clf = nfc.ContactlessFrontend()
mocker.patch.object(clf, 'exchange', autospec=True)
mocker.patch.object(clf, 'sense', autospec=True)
clf.sense.return_value = None
return clf


class TestInitiator:
atr_res = 'D501 01FE0102030405060708 0000000832 46666D010113'
atr_res_frame = '18' + atr_res

@pytest.fixture()
def dep(self, clf):
return nfc.dep.Initiator(clf)

def test_activate_active_no_target_found(self, dep):
assert dep.activate(acm=True) is None
assert dep.clf.sense.call_count == 3

@pytest.mark.parametrize("brty", ["106A", "212F", "424F"])
def test_activate_active_target_without_psl(self, dep, brty):
target = nfc.clf.RemoteTarget(brty, atr_res=HEX(self.atr_res))
dep.clf.sense.return_value = target
assert dep.activate(None, brs=0) == HEX('46666D010113')
assert isinstance(dep.target, nfc.clf.RemoteTarget)
assert dep.target.brty == brty
assert dep.acm is True

@pytest.mark.parametrize("brs, brty", [(1, "212F"), (2, "424F")])
def test_activate_active_target_106_with_psl(self, dep, brs, brty):
target = nfc.clf.RemoteTarget("106A", atr_res=HEX(self.atr_res))
dep.clf.sense.return_value = target
dep.clf.exchange.side_effect = [HEX('F0 04 D50500')]
assert dep.activate(None, brs=brs) == HEX('46666D010113')
assert isinstance(dep.target, nfc.clf.RemoteTarget)
assert dep.target.brty == brty
assert dep.acm is True

@pytest.mark.parametrize("brs, brty", [(1, "212F"), (2, "424F")])
def test_activate_active_target_212_with_psl(self, dep, brs, brty):
target = nfc.clf.RemoteTarget("212F", atr_res=HEX(self.atr_res))
dep.clf.sense.return_value = target
dep.clf.exchange.side_effect = [HEX('04 D50500')]
assert dep.activate(None, brs=brs) == HEX('46666D010113')
assert isinstance(dep.target, nfc.clf.RemoteTarget)
assert dep.target.brty == brty
assert dep.acm is True

def test_activate_psl_res_communication_error(self, dep):
target = nfc.clf.RemoteTarget("106A", atr_res=HEX(self.atr_res))
dep.clf.sense.return_value = target
dep.clf.exchange.side_effect = [nfc.clf.CommunicationError]
assert dep.activate() is None

def test_activate_passive_no_target_found(self, dep):
assert dep.activate(acm=False) is None
assert dep.clf.sense.call_count == 2

def test_activate_passive_target_106(self, dep):
target = nfc.clf.RemoteTarget("106A")
target.sens_res = HEX('0101')
target.sdd_res = HEX('01020304')
target.sel_res = HEX('40')
dep.clf.sense.side_effect = [None, target]
dep.clf.exchange.side_effect = [HEX('F0' + self.atr_res_frame)]
assert dep.activate(None, brs=0) == HEX('46666D010113')
assert isinstance(dep.target, nfc.clf.RemoteTarget)
assert dep.target.brty == "106A"
assert dep.acm is False

def test_activate_passive_target_212(self, dep):
target = nfc.clf.RemoteTarget("212F")
target.sensf_res = HEX('01 01FE010203040506 0000000000000000')
dep.clf.sense.side_effect = [None, None, target]
dep.clf.exchange.side_effect = [HEX(self.atr_res_frame)]
assert dep.activate(None, brs=1) == HEX('46666D010113')
assert isinstance(dep.target, nfc.clf.RemoteTarget)
assert dep.target.brty == "212F"
assert dep.acm is False

def test_activate_atr_res_communication_error(self, dep):
target = nfc.clf.RemoteTarget("212F")
target.sensf_res = HEX('01 01FE010203040506 0000000000000000')
dep.clf.sense.side_effect = [None, None, target]
dep.clf.exchange.side_effect = [nfc.clf.CommunicationError]
assert dep.activate(None, brs=1) is None

def test_activate_active_target_unsupported_error(self, dep):
dep.clf.sense.side_effect = [
nfc.clf.UnsupportedTargetError, None, None, None, None,
]
assert dep.activate() is None
assert dep.clf.sense.call_count == 3
assert dep.activate() is None
assert dep.clf.sense.call_count == 5

def test_activate_active_target_communication_error(self, dep):
dep.clf.sense.side_effect = [
nfc.clf.CommunicationError, None, None, None, None, None,
]
assert dep.activate() is None
assert dep.clf.sense.call_count == 3
assert dep.activate() is None
assert dep.clf.sense.call_count == 6

0 comments on commit 856fa3b

Please sign in to comment.