Skip to content

Commit

Permalink
Add tests for TTY class in nfc/clf/transport.py
Browse files Browse the repository at this point in the history
  • Loading branch information
nehpetsde committed Mar 29, 2017
1 parent f28d6ab commit a4f7ec5
Show file tree
Hide file tree
Showing 3 changed files with 173 additions and 4 deletions.
4 changes: 2 additions & 2 deletions src/nfc/clf/transport.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
import os
import re
import errno
import termios
import serial.tools.list_ports
from binascii import hexlify

try:
Expand Down Expand Up @@ -54,7 +56,6 @@ def find(cls, path):
match = PATH.match(path)

if match and match.group(1) == "tty":
import termios
if re.match(r'^\D+\d+$', match.group(2)):
TTYS = re.compile(r'^tty{0}$'.format(match.group(2)))
elif re.match(r'^\D+$', match.group(2)):
Expand Down Expand Up @@ -100,7 +101,6 @@ def find(cls, path):
if re.match(r'^\d+$', match.group(2)):
return ["COM" + match.group(2)], match.group(3), False
if re.match(r'^$', match.group(2)):
import serial.tools.list_ports
ports = [p[0] for p in serial.tools.list_ports.comports()]
log.debug('serial ports: %s', ' '.join([p for p in ports]))
return ports, match.group(3), True
Expand Down
3 changes: 1 addition & 2 deletions tests/test_clf_arygon.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,10 @@
from base_clf_pn53x import HEX, RSP, ACK, STD_FRAME, EXT_FRAME

import logging
logging.basicConfig(level=logging.DEBUG-1)
logging.basicConfig(level=logging.WARN)
logging_level = logging.getLogger().getEffectiveLevel()
logging.getLogger("nfc.clf").setLevel(logging_level)
logging.getLogger("nfc.clf.arygon").setLevel(logging_level)
logging.getLogger("nfc.clf.transport").setLevel(logging_level)


def CMD(hexstr):
Expand Down
170 changes: 170 additions & 0 deletions tests/test_clf_transport.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
# -*- coding: latin-1 -*-
from __future__ import absolute_import, division

import nfc
import nfc.clf
import nfc.clf.transport

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

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


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


class TestTTY(object):
@pytest.mark.parametrize("path, nodes, tcgetattr, found", [ # noqa: F811
('tty', ['stderr', 'urandom'], [],
None),
('tty', ['stderr', 'ttyS0', 'ttyACM0', 'urandom'], [True, True],
(['/dev/ttyACM0', '/dev/ttyS0'], '', True)),
('tty', ['stderr', 'ttyACM0', 'ttyAMA0', 'urandom'], [True, True],
(['/dev/ttyACM0', '/dev/ttyAMA0'], '', True)),
('tty', ['stderr', 'ttyAMA0', 'ttyUSB0', 'urandom'], [True, True],
(['/dev/ttyAMA0', '/dev/ttyUSB0'], '', True)),
('tty', ['stderr', 'ttyS0', 'ttyS1', 'urandom'], [True, termios.error],
(['/dev/ttyS0'], '', True)),
('tty:S0', ['stderr', 'ttyS0', 'ttyS1', 'urandom'], [True, True],
(['/dev/ttyS0'], '', False)),
('tty:S', ['stderr', 'ttyS0', 'ttyS1', 'urandom'], [True, True],
(['/dev/ttyS0', '/dev/ttyS1'], '', True)),
('tty:0', ['stderr', 'ttyS0', 'ttyS1', 'urandom'], [True, True],
None),
('tty:S0:drv', ['stderr', 'ttyS0', 'ttyS1', 'urandom'], [True, True],
(['/dev/ttyS0'], 'drv', False)),
('tty:S:drv', ['stderr', 'ttyS0', 'ttyS1', 'urandom'], [True, True],
(['/dev/ttyS0', '/dev/ttyS1'], 'drv', True)),
('tty:0:drv', ['stderr', 'ttyS0', 'ttyS1', 'urandom'], [True, True],
None),
('tty::drv', ['stderr', 'ttyS0', 'ttyS1', 'urandom'], [True, True],
(['/dev/ttyS0', '/dev/ttyS1'], 'drv', True)),
('tty', ['stderr', 'ttyS0', 'ttyACM0', 'urandom'], [IOError, True],
(['/dev/ttyS0'], '', True)),
('tty:S0', ['stderr', 'ttyS0', 'ttyACM0', 'urandom'], [IOError],
IOError),
('com', [('COM1',), ('COM2',), ('COM3',)], [],
(['COM1', 'COM2', 'COM3'], '', True)),
('com:2', [('COM1',), ('COM2',), ('COM3',)], [],
(['COM2'], '', False)),
('com:COM3', [('COM1',), ('COM2',), ('COM3',)], [],
(['COM3'], '', False)),
('com:X', [('COM1',), ('COM2',), ('COM3',)], [],
None),
('comport', [('COM1',), ('COM2',), ('COM3',)], [],
None),
('', [('COM1',), ('COM2',), ('COM3',)], [],
None),
])
def test_find(self, mocker, path, nodes, tcgetattr, found):
module = 'nfc.clf.transport'
mocker.patch(module+'.open')
mocker.patch(module+'.termios.tcgetattr').side_effect = tcgetattr
mocker.patch(module+'.os.listdir').return_value = nodes
mocker.patch(module+'.serial.tools.list_ports.comports') \
.return_value = nodes
if not found == IOError:
assert nfc.clf.transport.TTY.find(path) == found
else:
with pytest.raises(IOError):
nfc.clf.transport.TTY.find(path)

@pytest.fixture() # noqa: F811
def serial(self, mocker):
return mocker.patch('nfc.clf.transport.serial.Serial', autospec=True)

@pytest.fixture() # noqa: F811
def tty(self, serial):
tty = nfc.clf.transport.TTY('/dev/ttyUSB0')
serial.assert_called_with('/dev/ttyUSB0', 115200, timeout=0.05)
serial.return_value.port = '/dev/ttyUSB0'
serial.return_value.baudrate = 115200
return tty

def test_manufacturer_name(self, serial, tty):
assert tty.manufacturer_name is None

def test_product_name(self, serial, tty):
assert tty.product_name is None

def test_port(self, serial, tty):
assert tty.port == '/dev/ttyUSB0'
tty.tty = None
assert tty.port == ''

def test_baudrate(self, serial, tty):
assert tty.baudrate == 115200
tty.baudrate = 9600
assert tty.baudrate == 9600
tty.tty = None
assert tty.baudrate == 0
tty.baudrate = 9600
assert tty.baudrate == 0

def test_read(self, serial, tty):
serial.return_value.read.side_effect = [
HEX('0000ff00ff00'),
]
assert tty.read(0) == b'\x00\x00\xff\x00\xff\x00'
assert serial.return_value.read.mock_calls == [call(6)]
assert tty.tty.timeout == 0.05

serial.return_value.read.reset_mock()
serial.return_value.read.side_effect = [
HEX('0000ff03fbd5'), HEX('01020000'),
]
assert tty.read(51) == b'\x00\x00\xff\x03\xfb\xd5\x01\x02\x00\x00'
assert serial.return_value.read.mock_calls == [call(6), call(4)]
assert tty.tty.timeout == 0.051

serial.return_value.read.reset_mock()
serial.return_value.read.side_effect = [
HEX('0000ffffff01'), HEX('01fed5'), bytearray(256) + HEX('2b00'),
]
tty.read(100)
assert serial.return_value.read.mock_calls == [
call(6), call(3), call(258),
]
assert tty.tty.timeout == 0.1

serial.return_value.read.reset_mock()
serial.return_value.read.side_effect = [HEX('')]
with pytest.raises(IOError) as excinfo:
tty.read(1100)
assert excinfo.value.errno == errno.ETIMEDOUT
assert serial.return_value.read.mock_calls == [call(6)]
assert tty.tty.timeout == 1.1

tty.tty = None
assert tty.read(1000) is None

def test_write(self, serial, tty):
tty.write(b'12')
serial.return_value.flushInput.assert_called_with()
serial.return_value.write.assert_called_with(b'12')

serial.return_value.write.side_effect = [
nfc.clf.transport.serial.SerialTimeoutException,
]
with pytest.raises(IOError) as excinfo:
tty.write(b'12')
assert excinfo.value.errno == errno.EIO

tty.tty = None
assert tty.write(b'12') is None

def test_close(self, serial, tty):
tty.close()
serial.return_value.flushOutput.assert_called_with()
serial.return_value.close.assert_called_with()
assert tty.tty is None
tty.close()

0 comments on commit a4f7ec5

Please sign in to comment.