Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 27 additions & 17 deletions tests/test_commander.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,25 +19,33 @@
TEST_TIMEOUT = Timeout("test", 1.0)


@patch("maxcube.commander.Connection", spec=True)
class TestCommander(TestCase):
""" Test Max! Cube command handler """

def init(self, ClassMock):
self.connection = ClassMock.return_value
def setUp(self):
patcher = patch("maxcube.commander.Connection", spec=True)
self.addCleanup(patcher.stop)
self.ClassMock = patcher.start()
self.connection = self.ClassMock.return_value
self.commander = Commander("host", 1234)

def testDisconnectIsNoopIfAlreadyDisconnected(self, ClassMock):
def init(self, ClassMock):
# For backwards compatibility, but prefer setUp
if ClassMock is not None:
self.connection = ClassMock.return_value
self.commander = Commander("host", 1234)

def testDisconnectIsNoopIfAlreadyDisconnected(self, ClassMock=None):
self.init(ClassMock)
self.commander.disconnect()

ClassMock.assert_not_called()
self.ClassMock.assert_not_called()

self.connection.send.assert_not_called()
self.connection.recv.assert_not_called()
self.connection.close.assert_not_called()

def testUpdateOpensNewNonPersistantConnectionAndClosesIt(self, ClassMock):
def testUpdateOpensNewNonPersistantConnectionAndClosesIt(self, ClassMock=None):
messages = [Message("H"), Message("L")]
self.init(ClassMock)
self.commander.use_persistent_connection = False
Expand All @@ -49,7 +57,7 @@ def testUpdateOpensNewNonPersistantConnectionAndClosesIt(self, ClassMock):
self.assertEqual(2, self.connection.recv.call_count)
self.connection.close.assert_called_once()

def testUpdateSendsCommandAfterAfterTimeout(self, ClassMock):
def testUpdateSendsCommandAfterAfterTimeout(self, ClassMock=None):
messages = [Message("H"), None]
self.init(ClassMock)
self.connection.recv.side_effect = messages
Expand All @@ -70,6 +78,8 @@ def testUpdateSendsCommandAfterAfterTimeout(self, ClassMock):
self.connection.close.assert_not_called()

def testSendRadioMsgAutoconnects(self, ClassMock=None):
if ClassMock is None:
ClassMock = self.ClassMock
self.init(ClassMock)
self.connection.recv.side_effect = [
L_CMD_SUCCESS, # connection preamble
Expand All @@ -96,8 +106,8 @@ def testSendRadioMsgOpensNewNonPersistentConnectionAndClosesIt(
self.assertEqual(2, self.connection.recv.call_count)
self.connection.close.assert_called_once()

def testSendRadioMsgReusesConnection(self, ClassMock):
self.testSendRadioMsgAutoconnects()
def testSendRadioMsgReusesConnection(self, ClassMock=None):
self.testSendRadioMsgAutoconnects(None)

self.connection.send.reset_mock()
self.connection.recv.reset_mock()
Expand All @@ -110,19 +120,19 @@ def testSendRadioMsgReusesConnection(self, ClassMock):
self.connection.close.assert_not_called()

def testSendRadioMsgClosesConnectionOnErrorAndRetriesIfReusingConnection(
self, ClassMock
self, ClassMock=None
):
self.testSendRadioMsgAutoconnects()
self.testSendRadioMsgAutoconnects(None)

self.connection.recv.reset_mock()
self.connection.send.reset_mock()
self.connection.recv.side_effect = [
None, # First read before first try
]
self.connection.send.reset_mock()
self.connection.send.side_effect = [OSError]

newConnection = MagicMock(Connection)
ClassMock.side_effect = [newConnection]
newConnection = MagicMock()
self.ClassMock.side_effect = [newConnection]
newConnection.recv.side_effect = [
L_CMD_SUCCESS, # Connection preamble
S_CMD_SUCCESS,
Expand All @@ -143,7 +153,7 @@ def __send_radio_msg(self, msg: Message, deadline: Deadline):
deadlineMock.return_value = deadline
return self.commander.send_radio_msg(msg)

def testSendRadioMsgShouldNotRetryOnErrorWhenConnectionIsNew(self, ClassMock):
def testSendRadioMsgShouldNotRetryOnErrorWhenConnectionIsNew(self, ClassMock=None):
self.init(ClassMock)
self.connection.recv.side_effect = [L_CMD_SUCCESS]
self.connection.send.side_effect = [OSError]
Expand All @@ -158,7 +168,7 @@ def testSendRadioMsgShouldNotRetryOnErrorWhenConnectionIsNew(self, ClassMock):
self.connection.recv.assert_called_once()
self.connection.close.assert_called_once()

def testSendRadioMsgFailsOnLogicalError(self, ClassMock):
def testSendRadioMsgFailsOnLogicalError(self, ClassMock=None):
self.init(ClassMock)
self.connection.recv.side_effect = [L_CMD_SUCCESS, S_CMD_ERROR]

Expand All @@ -172,7 +182,7 @@ def testSendRadioMsgFailsOnLogicalError(self, ClassMock):
self.connection.close.assert_not_called()
deadline.remaining.assert_not_called()

def testSendRadioMsgRetriesOnThrottlingError(self, ClassMock):
def testSendRadioMsgRetriesOnThrottlingError(self, ClassMock=None):
self.init(ClassMock)
self.connection.recv.side_effect = [L_CMD_SUCCESS, S_CMD_THROTTLE_ERROR]

Expand Down