From 3e7eba9998673a7cbd44a5065bde708952575bd2 Mon Sep 17 00:00:00 2001 From: Stefan Allius Date: Fri, 17 Nov 2023 23:59:34 +0100 Subject: [PATCH] improve test coverage --- app/src/messages.py | 6 ++-- app/tests/test_messages.py | 71 ++++++++++++++++++++++++++++++++------ 2 files changed, 63 insertions(+), 14 deletions(-) diff --git a/app/src/messages.py b/app/src/messages.py index db0a600..157ed2e 100644 --- a/app/src/messages.py +++ b/app/src/messages.py @@ -207,7 +207,7 @@ class Message(metaclass=IterRegistry): type += 'S' return switch.get(type, '???') - def __timestamp(self): + def _timestamp(self): # pragma: no cover if False: # utc as epoche ts = time.time() @@ -313,7 +313,7 @@ class Message(metaclass=IterRegistry): tsun = Config.get('tsun') if tsun['enabled']: if self.ctrl.is_resp(): - ts = self.__timestamp() + ts = self._timestamp() result = struct.unpack_from('!q', self._recv_buffer, self.header_len) logger.debug(f'tsun-time: {result[0]:08x}' @@ -323,7 +323,7 @@ class Message(metaclass=IterRegistry): self.forward(self._recv_buffer, self.header_len+self.data_len) else: if self.ctrl.is_ind(): - ts = self.__timestamp() + ts = self._timestamp() logger.debug(f'time: {ts:08x}') self.__build_header(0x99) diff --git a/app/tests/test_messages.py b/app/tests/test_messages.py index 79ebb42..f0c81a9 100644 --- a/app/tests/test_messages.py +++ b/app/tests/test_messages.py @@ -42,6 +42,8 @@ class MemoryStream(Message): pass return copied_bytes + def _timestamp(self): + return 1700260990000 def _Message__flush_recv_msg(self) -> None: super()._Message__flush_recv_msg() @@ -112,7 +114,7 @@ def MsgInverterInd(): # Data indication from the controller msg = b'\x00\x00\x00\x8b\x10R170000000000001\x91\x04\x01\x90\x00\x01\x10R170000000000001' msg += b'\x01\x00\x00\x01\x89\xc6\x63\x61\x08' msg += b'\x00\x00\x00\x06\x00\x00\x00\x0a\x54\x08\x4d\x69\x63\x72\x6f\x69\x6e\x76\x00\x00\x00\x14\x54\x04\x54\x53\x55\x4e\x00\x00\x00\x1E\x54\x07\x56\x35\x2e\x30\x2e\x31\x31\x00\x00\x00\x28' - msg += b'\x54\x10\x54\x31\x37\x45\x37\x33\x30\x37\x30\x32\x31\x44\x30\x30\x36\x41\x00\x00\x00\x32\x54\x0a\x54\x53\x4f\x4c\x2d\x4d\x53\x36\x30\x30\x00\x00\x00\x3c\x54\x05\x41\x2c\x42\x2c\x43' + msg += b'\x54\x10T170000000000001\x00\x00\x00\x32\x54\x0a\x54\x53\x4f\x4c\x2d\x4d\x53\x36\x30\x30\x00\x00\x00\x3c\x54\x05\x41\x2c\x42\x2c\x43' return msg @pytest.fixture @@ -127,15 +129,6 @@ def MsgInverterInvalid(): # Get Time Request message def MsgUnknown(): # Get Time Request message return b'\x00\x00\x00\x17\x10R170000000000001\x91\x17\x01\x02\x03\x04' -@pytest.fixture -def MsgGetTime(): # Get Time Request message - return b'\x00\x00\x00\x13\x10R170000000000001\x91\x22' - - -@pytest.fixture -def MsgTimeResp(): # Get Time Resonse message - return b'\x00\x00\x00\x1b\x10R170000000000001\x99\x22\x00\x00\x01\x89\xc6\x63\x4d\x80' - @pytest.fixture def ConfigTsunAllowAll(): Config.config = {'tsun':{'enabled': True}, 'inverters':{'allow_all':True}} @@ -304,6 +297,7 @@ def test_msg_contact_resp(ConfigTsunInv1, MsgContactResp): assert m.header_len==23 assert m.data_len==1 assert m._forward_buffer==b'' + assert m._send_buffer==b'' assert m.db.stat['proxy']['Unknown_Ctrl'] == 0 m.close() @@ -339,10 +333,47 @@ def test_msg_get_time(ConfigTsunInv1, MsgGetTime): assert m.header_len==23 assert m.data_len==0 assert m._forward_buffer==MsgGetTime + assert m._send_buffer==b'' assert m.db.stat['proxy']['Unknown_Ctrl'] == 0 m.close() -def test_msg_time_resp(ConfigNoTsunInv1, MsgTimeResp): +def test_msg_get_time_autark(ConfigNoTsunInv1, MsgGetTime): + ConfigNoTsunInv1 + m = MemoryStream(MsgGetTime, (0,)) + m.db.stat['proxy']['Unknown_Ctrl'] = 0 + m.read() # read complete msg, and dispatch msg + assert not m.header_valid # must be invalid, since msg was handled and buffer flushed + assert m.msg_count == 1 + assert m.id_str == b"R170000000000001" + assert m.unique_id == 'R170000000000001' + assert int(m.ctrl)==145 + assert m.msg_id==34 + assert m.header_len==23 + assert m.data_len==0 + assert m._forward_buffer==b'' + assert m._send_buffer==b'\x00\x00\x00\x1b\x10R170000000000001\x99"\x00\x00\x01\x8b\xdfs\xcc0' + assert m.db.stat['proxy']['Unknown_Ctrl'] == 0 + m.close() + +def test_msg_time_resp(ConfigTsunInv1, MsgTimeResp): + ConfigTsunInv1 + m = MemoryStream(MsgTimeResp, (0,), False) + m.db.stat['proxy']['Unknown_Ctrl'] = 0 + m.read() # read complete msg, and dispatch msg + assert not m.header_valid # must be invalid, since msg was handled and buffer flushed + assert m.msg_count == 1 + assert m.id_str == b"R170000000000001" + assert m.unique_id == 'R170000000000001' + assert int(m.ctrl)==153 + assert m.msg_id==34 + assert m.header_len==23 + assert m.data_len==8 + assert m._forward_buffer==MsgTimeResp + assert m._send_buffer==b'' + assert m.db.stat['proxy']['Unknown_Ctrl'] == 0 + m.close() + +def test_msg_time_resp_autark(ConfigNoTsunInv1, MsgTimeResp): ConfigNoTsunInv1 m = MemoryStream(MsgTimeResp, (0,), False) m.db.stat['proxy']['Unknown_Ctrl'] = 0 @@ -356,6 +387,7 @@ def test_msg_time_resp(ConfigNoTsunInv1, MsgTimeResp): assert m.header_len==23 assert m.data_len==8 assert m._forward_buffer==b'' + assert m._send_buffer==b'' assert m.db.stat['proxy']['Unknown_Ctrl'] == 0 m.close() @@ -377,6 +409,23 @@ def test_msg_time_invalid(ConfigTsunInv1, MsgTimeInvalid): assert m.db.stat['proxy']['Unknown_Ctrl'] == 1 m.close() +def test_msg_time_invalid_autark(ConfigNoTsunInv1, MsgTimeInvalid): + ConfigNoTsunInv1 + m = MemoryStream(MsgTimeInvalid, (0,), False) + m.db.stat['proxy']['Unknown_Ctrl'] = 0 + m.read() # read complete msg, and dispatch msg + assert not m.header_valid # must be invalid, since msg was handled and buffer flushed + assert m.msg_count == 1 + assert m.id_str == b"R170000000000001" + assert m.unique_id == 'R170000000000001' + assert int(m.ctrl)==148 + assert m.msg_id==34 + assert m.header_len==23 + assert m.data_len==0 + assert m._forward_buffer==b'' + assert m._send_buffer==b'' + assert m.db.stat['proxy']['Unknown_Ctrl'] == 1 + m.close() def test_msg_cntrl_ind(ConfigTsunInv1, MsgControllerInd, MsgControllerAck): ConfigTsunInv1