refactoring

This commit is contained in:
Stefan Allius
2024-09-24 21:12:51 +02:00
parent 89c2c11ed9
commit d5c369e5fe
23 changed files with 1257 additions and 942 deletions

View File

@@ -2,8 +2,9 @@
import pytest
import asyncio
from itertools import count
from mock import patch
from app.src.async_stream import AsyncStream
from app.src.async_stream import AsyncStream, AsyncIfcImpl
from app.src.gen3.connection_g3 import ConnectionG3
from app.src.gen3.talent import Talent
@@ -60,19 +61,19 @@ class FakeWriter():
def test_method_calls(patch_async_init, patch_talent_init, patch_healthy, patch_async_close, patch_talent_close):
spy1 = patch_async_init
def test_method_calls(patch_talent_init, patch_healthy, patch_async_close, patch_talent_close):
AsyncIfcImpl._ids = count(5)
spy2 = patch_talent_init
spy3 = patch_healthy
spy4 = patch_async_close
spy5 = patch_talent_close
reader = FakeReader()
writer = FakeWriter()
writer = FakeWriter()
id_str = "id_string"
addr = ('proxy.local', 10000)
conn = ConnectionG3(reader, writer, addr,
remote_stream= None, server_side=True, id_str=id_str)
spy1.assert_called_once_with(conn, reader, writer, addr, conn._ifc)
rstream= None, server_side=True, id_str=id_str)
assert 5 == conn._ifc.get_conn_no()
spy2.assert_called_once_with(conn, True, conn._ifc, id_str)
conn.healthy()
@@ -81,4 +82,3 @@ def test_method_calls(patch_async_init, patch_talent_init, patch_healthy, patch_
conn.close()
spy4.assert_called_once()
spy5.assert_called_once()

View File

@@ -2,15 +2,16 @@
import pytest
import asyncio
from itertools import count
from mock import patch
from app.src.singleton import Singleton
from app.src.async_stream import AsyncStream
from app.src.async_stream import AsyncStream, AsyncIfcImpl
from app.src.gen3plus.connection_g3p import ConnectionG3P
from app.src.gen3plus.solarman_v5 import SolarmanV5
@pytest.fixture
def patch_async_init():
with patch.object(AsyncStream, '__init__') as conn:
with patch.object(AsyncStream, '__init__', return_value= None) as conn:
yield conn
@pytest.fixture
@@ -66,18 +67,18 @@ class FakeWriter():
def test_method_calls(patch_async_init, patch_solarman_init, patch_healthy, patch_async_close, patch_solarman_close):
spy1 = patch_async_init
def test_method_calls(patch_solarman_init, patch_healthy, patch_async_close, patch_solarman_close):
AsyncIfcImpl._ids = count(5)
spy2 = patch_solarman_init
spy3 = patch_healthy
spy4 = patch_async_close
spy5 = patch_solarman_close
reader = FakeReader()
writer = FakeWriter()
writer = FakeWriter()
addr = ('proxy.local', 10000)
conn = ConnectionG3P(reader, writer, addr,
remote_stream= None, server_side=True, client_mode=False)
spy1.assert_called_once_with(conn, reader, writer, addr, conn._ifc)
rstream= None, server_side=True, client_mode=False)
assert 5 == conn._ifc.get_conn_no()
spy2.assert_called_once_with(conn, True, False, conn._ifc)
conn.healthy()

View File

@@ -18,7 +18,7 @@ pytest_plugins = ('pytest_asyncio',)
@pytest.fixture(scope="module", autouse=True)
def module_init():
def new_init(cls, cb_mqtt_is_up):
cb_mqtt_is_up()
pass # empty test methos
Singleton._instances.clear()
with patch.object(Mqtt, '__init__', new_init):
@@ -69,6 +69,7 @@ async def test_inverter_cb(config_conn):
assert 'homeassistant/' == Inverter.discovery_prfx
assert 'tsun/' == Inverter.entity_prfx
assert 'test_1/' == Inverter.proxy_node_id
await Inverter._cb_mqtt_is_up()
spy.assert_called_once()
@pytest.mark.asyncio

View File

@@ -132,7 +132,7 @@ async def test_remote_conn(config_conn, patch_open_connection, patch_conn_close)
await inverter.async_create_remote()
await asyncio.sleep(0)
assert inverter.remote_stream
assert inverter.remote.stream
inverter.close()
spy1.assert_called_once()
@@ -151,12 +151,12 @@ async def test_remote_except(config_conn, patch_open_connection, patch_conn_clos
await inverter.async_create_remote()
await asyncio.sleep(0)
assert inverter.remote_stream==None
assert inverter.remote.stream==None
test = TestType.RD_TEST_EXCEPT
await inverter.async_create_remote()
await asyncio.sleep(0)
assert inverter.remote_stream==None
assert inverter.remote.stream==None
inverter.close()
spy1.assert_called_once()

View File

@@ -133,7 +133,7 @@ async def test_remote_conn(config_conn, patch_open_connection, patch_conn_close)
await inverter.async_create_remote()
await asyncio.sleep(0)
assert inverter.remote_stream
assert inverter.remote.stream
inverter.close()
spy1.assert_called_once()
@@ -152,12 +152,12 @@ async def test_remote_except(config_conn, patch_open_connection, patch_conn_clos
await inverter.async_create_remote()
await asyncio.sleep(0)
assert inverter.remote_stream==None
assert inverter.remote.stream==None
test = TestType.RD_TEST_EXCEPT
await inverter.async_create_remote()
await asyncio.sleep(0)
assert inverter.remote_stream==None
assert inverter.remote.stream==None
inverter.close()
spy1.assert_called_once()

View File

@@ -157,8 +157,8 @@ async def test_modbus_conn(patch_open):
async with ModbusConn('test.local', 1234) as stream:
assert stream.node_id == 'G3P'
assert stream.addr == ('test.local', 1234)
assert type(stream._reader) is FakeReader
assert type(stream._writer) is FakeWriter
assert type(stream._ifc._reader) is FakeReader
assert type(stream._ifc._writer) is FakeWriter
assert Infos.stat['proxy']['Inverter_Cnt'] == 1
assert Infos.stat['proxy']['Inverter_Cnt'] == 0
@@ -209,7 +209,7 @@ async def test_modbus_cnf2(config_conn, patch_no_mqtt, patch_open):
test += 1
assert Infos.stat['proxy']['Inverter_Cnt'] == 1
m.shutdown_started = True
m._reader.on_recv.set()
m._ifc._reader.on_recv.set()
del m
assert 1 == test
@@ -236,13 +236,13 @@ async def test_modbus_cnf3(config_conn, patch_no_mqtt, patch_open):
test += 1
if test == 1:
m.shutdown_started = False
m._reader.on_recv.set()
m.ifc._reader.on_recv.set()
await asyncio.sleep(0.1)
assert m.state == State.closed
await asyncio.sleep(0.1)
else:
m.shutdown_started = True
m._reader.on_recv.set()
m.ifc._reader.on_recv.set()
del m
assert 2 == test
@@ -269,13 +269,14 @@ async def test_mqtt_err(config_conn, patch_mqtt_err, patch_open):
test += 1
if test == 1:
m.shutdown_started = False
m._reader.on_recv.set()
m._ifc._reader.on_recv.set()
await asyncio.sleep(0.1)
assert m.state == State.closed
await asyncio.sleep(0.1)
await asyncio.sleep(0.1)
else:
m.shutdown_started = True
m._reader.on_recv.set()
m._ifc._reader.on_recv.set()
del m
await asyncio.sleep(0.01)
@@ -301,13 +302,13 @@ async def test_mqtt_except(config_conn, patch_mqtt_except, patch_open):
test += 1
if test == 1:
m.shutdown_started = False
m._reader.on_recv.set()
m._ifc._reader.on_recv.set()
await asyncio.sleep(0.1)
assert m.state == State.closed
await asyncio.sleep(0.1)
else:
m.shutdown_started = True
m._reader.on_recv.set()
m._ifc._reader.on_recv.set()
del m
await asyncio.sleep(0.01)

View File

@@ -5,7 +5,7 @@ import aiomqtt
import logging
from mock import patch, Mock
from app.src.async_ifc import AsyncIfc
from app.src.async_stream import AsyncIfcImpl
from app.src.singleton import Singleton
from app.src.mqtt import Mqtt
from app.src.modbus import Modbus
@@ -45,8 +45,7 @@ def config_no_conn(test_port):
@pytest.fixture
def spy_at_cmd():
ifc = AsyncIfc()
conn = SolarmanV5(server_side=True, client_mode= False, ifc=ifc)
conn = SolarmanV5(server_side=True, client_mode= False, ifc=AsyncIfcImpl())
conn.node_id = 'inv_2/'
with patch.object(conn, 'send_at_cmd', wraps=conn.send_at_cmd) as wrapped_conn:
yield wrapped_conn
@@ -54,8 +53,7 @@ def spy_at_cmd():
@pytest.fixture
def spy_modbus_cmd():
ifc = AsyncIfc()
conn = SolarmanV5(server_side=True, client_mode= False, ifc=ifc)
conn = SolarmanV5(server_side=True, client_mode= False, ifc=AsyncIfcImpl())
conn.node_id = 'inv_1/'
with patch.object(conn, 'send_modbus_cmd', wraps=conn.send_modbus_cmd) as wrapped_conn:
yield wrapped_conn
@@ -63,8 +61,7 @@ def spy_modbus_cmd():
@pytest.fixture
def spy_modbus_cmd_client():
ifc = AsyncIfc()
conn = SolarmanV5(server_side=False, client_mode= False, ifc=ifc)
conn = SolarmanV5(server_side=False, client_mode= False, ifc=AsyncIfcImpl())
conn.node_id = 'inv_1/'
with patch.object(conn, 'send_modbus_cmd', wraps=conn.send_modbus_cmd) as wrapped_conn:
yield wrapped_conn

View File

@@ -5,7 +5,7 @@ import asyncio
import logging
import random
from math import isclose
from app.src.async_ifc import AsyncIfc
from app.src.async_stream import AsyncIfcImpl, StreamPtr
from app.src.gen3plus.solarman_v5 import SolarmanV5
from app.src.config import Config
from app.src.infos import Infos, Register
@@ -34,14 +34,15 @@ class Mqtt():
class MemoryStream(SolarmanV5):
def __init__(self, msg, chunks = (0,), server_side: bool = True):
_ifc = AsyncIfc()
_ifc = AsyncIfcImpl()
super().__init__(server_side, client_mode=False, ifc=_ifc)
if server_side:
self.mb.timeout = 0.4 # overwrite for faster testing
self.remote = StreamPtr(None)
self.mb_first_timeout = 0.5
self.mb_timeout = 0.5
self.sent_pdu = b''
self.ifc.write.reg_trigger(self.write_cb)
self.ifc.tx_fifo.reg_trigger(self.write_cb)
self.mqtt = Mqtt()
self.__msg = msg
self.__msg_len = len(msg)
@@ -63,7 +64,7 @@ class MemoryStream(SolarmanV5):
def write_cb(self):
if self.test_exception_async_write:
raise RuntimeError("Peer closed.")
self.sent_pdu = self.ifc.write.get()
self.sent_pdu = self.ifc.tx_fifo.get()
def _timestamp(self):
return timestamp
@@ -87,11 +88,11 @@ class MemoryStream(SolarmanV5):
chunk_len = self.__chunks[self.__chunk_idx]
self.__chunk_idx += 1
if chunk_len!=0:
self.ifc.read += self.__msg[self.__offs:chunk_len]
self.ifc.rx_fifo += self.__msg[self.__offs:chunk_len]
copied_bytes = chunk_len - self.__offs
self.__offs = chunk_len
else:
self.ifc.read += self.__msg[self.__offs:]
self.ifc.rx_fifo += self.__msg[self.__offs:]
copied_bytes = self.__msg_len - self.__offs
self.__offs = self.__msg_len
except Exception:
@@ -100,8 +101,8 @@ class MemoryStream(SolarmanV5):
def createClientStream(self, msg, chunks = (0,)):
c = MemoryStream(msg, chunks, False)
self.remote_stream = c
c. remote_stream = self
self.remote.stream = c
c. remote.stream = self
return c
def _SolarmanV5__flush_recv_msg(self) -> None:
@@ -687,9 +688,9 @@ def test_read_message(device_ind_msg):
assert m.control == 0x4110
assert str(m.seq) == '01:00'
assert m.data_len == 0xd4
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.forward.get()==b''
assert m.ifc.rx_get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
m.close()
@@ -708,9 +709,9 @@ def test_invalid_start_byte(invalid_start_byte, device_ind_msg):
assert m.control == 0x4110
assert str(m.seq) == '01:00'
assert m.data_len == 0xd4
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.forward.get()==b''
assert m.ifc.rx_get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 1
m.close()
@@ -728,9 +729,9 @@ def test_invalid_stop_byte(invalid_stop_byte):
assert m.control == 0x4110
assert str(m.seq) == '01:00'
assert m.data_len == 0xd4
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.forward.get()==b''
assert m.ifc.rx_get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 1
m.close()
@@ -753,9 +754,9 @@ def test_invalid_stop_byte2(invalid_stop_byte, device_ind_msg):
assert m.msg_recvd[1]['data_len']==0xd4
assert m.unique_id == None
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.forward.get()==b''
assert m.ifc.rx_get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 1
m.close()
@@ -775,9 +776,9 @@ def test_invalid_stop_start_byte(invalid_stop_byte, invalid_start_byte):
assert m.control == 0x4110
assert str(m.seq) == '01:00'
assert m.data_len == 0xd4
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.forward.get()==b''
assert m.ifc.rx_get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 1
m.close()
@@ -799,9 +800,9 @@ def test_invalid_checksum(invalid_checksum, device_ind_msg):
assert m.msg_recvd[1]['control']==0x4110
assert m.msg_recvd[1]['seq']=='01:00'
assert m.msg_recvd[1]['data_len']==0xd4
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.forward.get()==b''
assert m.ifc.rx_get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 1
m.close()
@@ -821,8 +822,8 @@ def test_read_message_twice(config_no_tsun_inv1, device_ind_msg, device_rsp_msg)
assert m.msg_recvd[1]['control']==0x4110
assert m.msg_recvd[1]['seq']=='01:01'
assert m.msg_recvd[1]['data_len']==0xd4
assert m.ifc.write.get()==device_rsp_msg+device_rsp_msg
assert m.ifc.forward.get()==b''
assert m.ifc.tx_fifo.get()==device_rsp_msg+device_rsp_msg
assert m.ifc.fwd_fifo.get()==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
m.close()
@@ -893,11 +894,11 @@ def test_read_two_messages(config_tsun_allow_all, device_ind_msg, device_rsp_msg
assert m.msg_recvd[1]['data_len']==0x199
assert '02b0' == m.db.get_db_value(Register.SENSOR_LIST, None)
assert 0x02b0 == m.sensor_list
assert m.ifc.forward.get()==device_ind_msg+inverter_ind_msg
assert m.ifc.write.get()==device_rsp_msg+inverter_rsp_msg
assert m.ifc.fwd_fifo.get()==device_ind_msg+inverter_ind_msg
assert m.ifc.tx_fifo.get()==device_rsp_msg+inverter_rsp_msg
m._init_new_client_conn()
assert m.ifc.write.get()==b''
assert m.ifc.tx_fifo.get()==b''
m.close()
def test_read_two_messages2(config_tsun_allow_all, inverter_ind_msg, inverter_ind_msg_81, inverter_rsp_msg, inverter_rsp_msg_81):
@@ -918,11 +919,11 @@ def test_read_two_messages2(config_tsun_allow_all, inverter_ind_msg, inverter_in
assert m.msg_recvd[1]['seq']=='03:03'
assert m.msg_recvd[1]['data_len']==0x199
assert m.time_ofs == 0x33e447a0
assert m.ifc.forward.get()==inverter_ind_msg+inverter_ind_msg_81
assert m.ifc.write.get()==inverter_rsp_msg+inverter_rsp_msg_81
assert m.ifc.fwd_fifo.get()==inverter_ind_msg+inverter_ind_msg_81
assert m.ifc.tx_fifo.get()==inverter_rsp_msg+inverter_rsp_msg_81
m._init_new_client_conn()
assert m.ifc.write.get()==b''
assert m.ifc.tx_fifo.get()==b''
m.close()
def test_read_two_messages3(config_tsun_allow_all, device_ind_msg2, device_rsp_msg2, inverter_ind_msg, inverter_rsp_msg):
@@ -947,11 +948,11 @@ def test_read_two_messages3(config_tsun_allow_all, device_ind_msg2, device_rsp_m
assert m.msg_recvd[1]['data_len']==0xd4
assert '02b0' == m.db.get_db_value(Register.SENSOR_LIST, None)
assert 0x02b0 == m.sensor_list
assert m.ifc.forward.get()==inverter_ind_msg+device_ind_msg2
assert m.ifc.write.get()==inverter_rsp_msg+device_rsp_msg2
assert m.ifc.fwd_fifo.get()==inverter_ind_msg+device_ind_msg2
assert m.ifc.tx_fifo.get()==inverter_rsp_msg+device_rsp_msg2
m._init_new_client_conn()
assert m.ifc.write.get()==b''
assert m.ifc.tx_fifo.get()==b''
m.close()
def test_unkown_frame_code(config_tsun_inv1, inverter_ind_msg_81, inverter_rsp_msg_81):
@@ -966,9 +967,9 @@ def test_unkown_frame_code(config_tsun_inv1, inverter_ind_msg_81, inverter_rsp_m
assert m.control == 0x4210
assert str(m.seq) == '03:03'
assert m.data_len == 0x199
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==inverter_rsp_msg_81
assert m.ifc.forward.get()==inverter_ind_msg_81
assert m.ifc.rx_get()==b''
assert m.ifc.tx_fifo.get()==inverter_rsp_msg_81
assert m.ifc.fwd_fifo.get()==inverter_ind_msg_81
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
m.close()
@@ -984,9 +985,9 @@ def test_unkown_message(config_tsun_inv1, unknown_msg):
assert m.control == 0x5110
assert str(m.seq) == '84:10'
assert m.data_len == 0x0a
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.forward.get()==unknown_msg
assert m.ifc.rx_get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.ifc.fwd_fifo.get()==unknown_msg
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
m.close()
@@ -1002,9 +1003,9 @@ def test_device_rsp(config_tsun_inv1, device_rsp_msg):
assert m.control == 0x1110
assert str(m.seq) == '01:01'
assert m.data_len == 0x0a
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.forward.get()==b''
assert m.ifc.rx_get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
m.close()
@@ -1020,9 +1021,9 @@ def test_inverter_rsp(config_tsun_inv1, inverter_rsp_msg):
assert m.control == 0x1210
assert str(m.seq) == '02:02'
assert m.data_len == 0x0a
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.forward.get()==b''
assert m.ifc.rx_get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
m.close()
@@ -1037,9 +1038,9 @@ def test_heartbeat_ind(config_tsun_inv1, heartbeat_ind_msg, heartbeat_rsp_msg):
assert m.control == 0x4710
assert str(m.seq) == '84:11' # value after sending response
assert m.data_len == 0x01
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==heartbeat_rsp_msg
assert m.ifc.forward.get()==heartbeat_ind_msg
assert m.ifc.rx_get()==b''
assert m.ifc.tx_fifo.get()==heartbeat_rsp_msg
assert m.ifc.fwd_fifo.get()==heartbeat_ind_msg
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
m.close()
@@ -1055,9 +1056,9 @@ def test_heartbeat_ind2(config_tsun_inv1, heartbeat_ind_msg, heartbeat_rsp_msg):
assert m.control == 0x4710
assert str(m.seq) == '84:11' # value after sending response
assert m.data_len == 0x01
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==heartbeat_rsp_msg
assert m.ifc.forward.get()==b''
assert m.ifc.rx_get()==b''
assert m.ifc.tx_fifo.get()==heartbeat_rsp_msg
assert m.ifc.fwd_fifo.get()==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
m.close()
@@ -1073,9 +1074,9 @@ def test_heartbeat_rsp(config_tsun_inv1, heartbeat_rsp_msg):
assert m.control == 0x1710
assert str(m.seq) == '11:84' # value after sending response
assert m.data_len == 0x0a
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.forward.get()==b''
assert m.ifc.rx_get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
m.close()
@@ -1090,15 +1091,15 @@ def test_sync_start_ind(config_tsun_inv1, sync_start_ind_msg, sync_start_rsp_msg
assert m.control == 0x4310
assert str(m.seq) == '0d:0d' # value after sending response
assert m.data_len == 47
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==sync_start_rsp_msg
assert m.ifc.forward.peek()==sync_start_ind_msg
assert m.ifc.rx_get()==b''
assert m.ifc.tx_fifo.get()==sync_start_rsp_msg
assert m.ifc.fwd_fifo.peek()==sync_start_ind_msg
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
m.seq.server_side = False # simulate forawding to TSUN cloud
m._update_header(m.ifc.forward.peek())
m._update_header(m.ifc.fwd_fifo.peek())
assert str(m.seq) == '0d:0e' # value after forwarding indication
assert m.ifc.forward.get()==sync_start_fwd_msg
assert m.ifc.fwd_fifo.get()==sync_start_fwd_msg
m.close()
@@ -1114,9 +1115,9 @@ def test_sync_start_rsp(config_tsun_inv1, sync_start_rsp_msg):
assert m.control == 0x1310
assert str(m.seq) == '0d:0d' # value after sending response
assert m.data_len == 0x0a
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.forward.get()==b''
assert m.ifc.rx_get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
m.close()
@@ -1131,9 +1132,9 @@ def test_sync_end_ind(config_tsun_inv1, sync_end_ind_msg, sync_end_rsp_msg):
assert m.control == 0x4810
assert str(m.seq) == '07:07' # value after sending response
assert m.data_len == 60
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==sync_end_rsp_msg
assert m.ifc.forward.get()==sync_end_ind_msg
assert m.ifc.rx_get()==b''
assert m.ifc.tx_fifo.get()==sync_end_rsp_msg
assert m.ifc.fwd_fifo.get()==sync_end_ind_msg
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
m.close()
@@ -1149,9 +1150,9 @@ def test_sync_end_rsp(config_tsun_inv1, sync_end_rsp_msg):
assert m.control == 0x1810
assert str(m.seq) == '07:07' # value after sending response
assert m.data_len == 0x0a
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.forward.get()==b''
assert m.ifc.rx_get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
m.close()
@@ -1169,9 +1170,9 @@ def test_build_modell_600(config_tsun_allow_all, inverter_ind_msg):
assert '02b0' == m.db.get_db_value(Register.SENSOR_LIST, None)
assert 0 == m.sensor_list # must not been set by an inverter data ind
m.ifc.write.clear() # clear send buffer for next test
m.ifc.tx_clear() # clear send buffer for next test
m._init_new_client_conn()
assert m.ifc.write.get()==b''
assert m.ifc.tx_fifo.get()==b''
m.close()
def test_build_modell_1600(config_tsun_allow_all, inverter_ind_msg1600):
@@ -1235,9 +1236,9 @@ def test_build_logger_modell(config_tsun_allow_all, device_ind_msg):
def test_msg_iterator():
Message._registry.clear()
m1 = SolarmanV5(server_side=True, client_mode=False, ifc=AsyncIfc())
m2 = SolarmanV5(server_side=True, client_mode=False, ifc=AsyncIfc())
m3 = SolarmanV5(server_side=True, client_mode=False, ifc=AsyncIfc())
m1 = SolarmanV5(server_side=True, client_mode=False, ifc=AsyncIfcImpl())
m2 = SolarmanV5(server_side=True, client_mode=False, ifc=AsyncIfcImpl())
m3 = SolarmanV5(server_side=True, client_mode=False, ifc=AsyncIfcImpl())
m3.close()
del m3
test1 = 0
@@ -1255,7 +1256,7 @@ def test_msg_iterator():
assert test2 == 1
def test_proxy_counter():
m = SolarmanV5(server_side=True, client_mode=False, ifc=AsyncIfc())
m = SolarmanV5(server_side=True, client_mode=False, ifc=AsyncIfcImpl())
assert m.new_data == {}
m.db.stat['proxy']['Unknown_Msg'] = 0
Infos.new_stat_data['proxy'] = False
@@ -1279,14 +1280,14 @@ async def test_msg_build_modbus_req(config_tsun_inv1, device_ind_msg, device_rsp
m.read()
assert m.control == 0x4110
assert str(m.seq) == '01:01'
assert m.ifc.write.get()==device_rsp_msg
assert m.ifc.forward.get()==device_ind_msg
assert m.ifc.tx_fifo.get()==device_rsp_msg
assert m.ifc.fwd_fifo.get()==device_ind_msg
await m.send_modbus_cmd(Modbus.WRITE_SINGLE_REG, 0x2008, 0, logging.DEBUG)
assert 0 == m.send_msg_ofs
assert m.ifc.forward.get() == b''
assert m.ifc.fwd_fifo.get() == b''
assert m.sent_pdu == b'' # modbus command must be ignore, cause connection is still not up
assert m.ifc.write.get() == b'' # modbus command must be ignore, cause connection is still not up
assert m.ifc.tx_fifo.get() == b'' # modbus command must be ignore, cause connection is still not up
m.append_msg(inverter_ind_msg)
m.read()
@@ -1296,15 +1297,15 @@ async def test_msg_build_modbus_req(config_tsun_inv1, device_ind_msg, device_rsp
assert m.msg_recvd[0]['seq']=='01:01'
assert m.msg_recvd[1]['control']==0x4210
assert m.msg_recvd[1]['seq']=='02:02'
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==inverter_rsp_msg
assert m.ifc.forward.get()==inverter_ind_msg
assert m.ifc.rx_get()==b''
assert m.ifc.tx_fifo.get()==inverter_rsp_msg
assert m.ifc.fwd_fifo.get()==inverter_ind_msg
await m.send_modbus_cmd(Modbus.WRITE_SINGLE_REG, 0x2008, 0, logging.DEBUG)
assert 0 == m.send_msg_ofs
assert m.ifc.forward.get() == b''
assert m.ifc.fwd_fifo.get() == b''
assert m.sent_pdu == msg_modbus_cmd
assert m.ifc.write.get()== b''
assert m.ifc.tx_fifo.get()== b''
m.close()
@pytest.mark.asyncio
@@ -1314,12 +1315,12 @@ async def test_at_cmd(config_tsun_allow_all, device_ind_msg, device_rsp_msg, inv
m.read() # read device ind
assert m.control == 0x4110
assert str(m.seq) == '01:01'
assert m.ifc.write.get()==device_rsp_msg
assert m.ifc.forward.get()==device_ind_msg
assert m.ifc.tx_fifo.get()==device_rsp_msg
assert m.ifc.fwd_fifo.get()==device_ind_msg
await m.send_at_cmd('AT+TIME=214028,1,60,120')
assert m.ifc.write.get()==b''
assert m.ifc.forward.get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.sent_pdu == b''
assert str(m.seq) == '01:01'
assert m.mqtt.key == ''
@@ -1329,12 +1330,12 @@ async def test_at_cmd(config_tsun_allow_all, device_ind_msg, device_rsp_msg, inv
m.read() # read inverter ind
assert m.control == 0x4210
assert str(m.seq) == '02:02'
assert m.ifc.write.get()==inverter_rsp_msg
assert m.ifc.forward.get()==inverter_ind_msg
assert m.ifc.tx_fifo.get()==inverter_rsp_msg
assert m.ifc.fwd_fifo.get()==inverter_ind_msg
await m.send_at_cmd('AT+TIME=214028,1,60,120')
assert m.ifc.forward.get() == b''
assert m.ifc.write.get()== b''
assert m.ifc.fwd_fifo.get() == b''
assert m.ifc.tx_fifo.get()== b''
assert m.sent_pdu == at_command_ind_msg
m.sent_pdu = bytearray()
@@ -1346,9 +1347,9 @@ async def test_at_cmd(config_tsun_allow_all, device_ind_msg, device_rsp_msg, inv
m.read() # read at resp
assert m.control == 0x1510
assert str(m.seq) == '03:03'
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.forward.get()==b''
assert m.ifc.rx_get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.key == 'at_resp'
assert m.data == "+ok"
@@ -1356,9 +1357,9 @@ async def test_at_cmd(config_tsun_allow_all, device_ind_msg, device_rsp_msg, inv
m.test_exception_async_write = True
await m.send_at_cmd('AT+TIME=214028,1,60,120')
assert m.sent_pdu == b''
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.forward.get()==b''
assert m.ifc.rx_get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.sent_pdu == b''
assert str(m.seq) == '03:04'
assert m.forward_at_cmd_resp == False
@@ -1373,12 +1374,12 @@ async def test_at_cmd_blocked(config_tsun_allow_all, device_ind_msg, device_rsp_
m.read()
assert m.control == 0x4110
assert str(m.seq) == '01:01'
assert m.ifc.write.get()==device_rsp_msg
assert m.ifc.forward.get()==device_ind_msg
assert m.ifc.tx_fifo.get()==device_rsp_msg
assert m.ifc.fwd_fifo.get()==device_ind_msg
await m.send_at_cmd('AT+WEBU')
assert m.ifc.write.get()==b''
assert m.ifc.forward.get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert str(m.seq) == '01:01'
assert m.mqtt.key == ''
assert m.mqtt.data == ""
@@ -1387,14 +1388,14 @@ async def test_at_cmd_blocked(config_tsun_allow_all, device_ind_msg, device_rsp_
m.read()
assert m.control == 0x4210
assert str(m.seq) == '02:02'
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==inverter_rsp_msg
assert m.ifc.forward.get()==inverter_ind_msg
assert m.ifc.rx_get()==b''
assert m.ifc.tx_fifo.get()==inverter_rsp_msg
assert m.ifc.fwd_fifo.get()==inverter_ind_msg
await m.send_at_cmd('AT+WEBU')
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.forward.get()==b''
assert m.ifc.rx_get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert str(m.seq) == '02:02'
assert m.forward_at_cmd_resp == False
assert m.mqtt.key == 'at_resp'
@@ -1416,9 +1417,9 @@ def test_at_cmd_ind(config_tsun_inv1, at_command_ind_msg):
assert m.control == 0x4510
assert str(m.seq) == '03:02'
assert m.data_len == 39
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.forward.get()==at_command_ind_msg
assert m.ifc.rx_get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.ifc.fwd_fifo.get()==at_command_ind_msg
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
assert m.db.stat['proxy']['AT_Command'] == 1
assert m.db.stat['proxy']['AT_Command_Blocked'] == 0
@@ -1440,9 +1441,9 @@ def test_at_cmd_ind_block(config_tsun_inv1, at_command_ind_msg_block):
assert m.control == 0x4510
assert str(m.seq) == '03:02'
assert m.data_len == 23
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.forward.get()==b''
assert m.ifc.rx_get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
assert m.db.stat['proxy']['AT_Command'] == 0
assert m.db.stat['proxy']['AT_Command_Blocked'] == 1
@@ -1462,8 +1463,8 @@ def test_msg_at_command_rsp1(config_tsun_inv1, at_command_rsp_msg):
assert str(m.seq) == '03:03'
assert m.header_len==11
assert m.data_len==17
assert m.ifc.forward.get()==at_command_rsp_msg
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==at_command_rsp_msg
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
assert m.db.stat['proxy']['Modbus_Command'] == 0
m.close()
@@ -1481,8 +1482,8 @@ def test_msg_at_command_rsp2(config_tsun_inv1, at_command_rsp_msg):
assert str(m.seq) == '03:03'
assert m.header_len==11
assert m.data_len==17
assert m.ifc.forward.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
assert m.db.stat['proxy']['Modbus_Command'] == 0
m.close()
@@ -1506,8 +1507,8 @@ def test_msg_modbus_req(config_tsun_inv1, msg_modbus_cmd, msg_modbus_cmd_fwd):
assert str(c.seq) == '03:02'
assert c.header_len==11
assert c.data_len==23
assert c.ifc.forward.get()==b''
assert c.ifc.write.get()==b''
assert c.ifc.fwd_fifo.get()==b''
assert c.ifc.tx_fifo.get()==b''
assert m.sent_pdu == msg_modbus_cmd_fwd
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
assert m.db.stat['proxy']['AT_Command'] == 0
@@ -1533,8 +1534,8 @@ def test_msg_modbus_req2(config_tsun_inv1, msg_modbus_cmd_crc_err):
assert str(c.seq) == '03:02'
assert c.header_len==11
assert c.data_len==23
assert c.ifc.forward.get()==b''
assert c.ifc.write.get()==b''
assert c.ifc.fwd_fifo.get()==b''
assert c.ifc.tx_fifo.get()==b''
assert m.sent_pdu==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
assert m.db.stat['proxy']['AT_Command'] == 0
@@ -1556,8 +1557,8 @@ def test_msg_unknown_cmd_req(config_tsun_inv1, msg_unknown_cmd):
assert str(m.seq) == '03:02'
assert m.header_len==11
assert m.data_len==23
assert m.ifc.forward.get()==msg_unknown_cmd
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==msg_unknown_cmd
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
assert m.db.stat['proxy']['AT_Command'] == 0
assert m.db.stat['proxy']['Modbus_Command'] == 0
@@ -1577,8 +1578,8 @@ def test_msg_modbus_rsp1(config_tsun_inv1, msg_modbus_rsp):
assert str(m.seq) == '03:03'
assert m.header_len==11
assert m.data_len==59
assert m.ifc.forward.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
assert m.db.stat['proxy']['Modbus_Command'] == 0
m.close()
@@ -1601,8 +1602,8 @@ def test_msg_modbus_rsp2(config_tsun_inv1, msg_modbus_rsp):
assert not m.header_valid # must be invalid, since msg was handled and buffer flushed
assert m.mb.err == 0
assert m.msg_count == 1
assert m.ifc.forward.get()==msg_modbus_rsp
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==msg_modbus_rsp
assert m.ifc.tx_fifo.get()==b''
assert m.db.get_db_value(Register.VERSION) == 'V4.0.10'
assert m.new_data['inverter'] == True
m.new_data['inverter'] = False
@@ -1613,8 +1614,8 @@ def test_msg_modbus_rsp2(config_tsun_inv1, msg_modbus_rsp):
assert not m.header_valid # must be invalid, since msg was handled and buffer flushed
assert m.mb.err == 0
assert m.msg_count == 2
assert m.ifc.forward.get()==msg_modbus_rsp
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==msg_modbus_rsp
assert m.ifc.tx_fifo.get()==b''
assert m.db.get_db_value(Register.VERSION) == 'V4.0.10'
assert m.new_data['inverter'] == False
@@ -1638,8 +1639,8 @@ def test_msg_modbus_rsp3(config_tsun_inv1, msg_modbus_rsp):
assert not m.header_valid # must be invalid, since msg was handled and buffer flushed
assert m.mb.err == 0
assert m.msg_count == 1
assert m.ifc.forward.get()==msg_modbus_rsp
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==msg_modbus_rsp
assert m.ifc.tx_fifo.get()==b''
assert m.db.get_db_value(Register.VERSION) == 'V4.0.10'
assert m.new_data['inverter'] == True
m.new_data['inverter'] = False
@@ -1649,8 +1650,8 @@ def test_msg_modbus_rsp3(config_tsun_inv1, msg_modbus_rsp):
assert not m.header_valid # must be invalid, since msg was handled and buffer flushed
assert m.mb.err == 5
assert m.msg_count == 2
assert m.ifc.forward.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.db.get_db_value(Register.VERSION) == 'V4.0.10'
assert m.new_data['inverter'] == False
@@ -1668,8 +1669,8 @@ def test_msg_unknown_rsp(config_tsun_inv1, msg_unknown_cmd_rsp):
assert str(m.seq) == '03:03'
assert m.header_len==11
assert m.data_len==59
assert m.ifc.forward.get()==msg_unknown_cmd_rsp
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==msg_unknown_cmd_rsp
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
assert m.db.stat['proxy']['Modbus_Command'] == 0
m.close()
@@ -1682,8 +1683,8 @@ def test_msg_modbus_invalid(config_tsun_inv1, msg_modbus_invalid):
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.ifc.forward.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
assert m.db.stat['proxy']['Modbus_Command'] == 0
m.close()
@@ -1705,8 +1706,8 @@ def test_msg_modbus_fragment(config_tsun_inv1, msg_modbus_rsp):
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.ifc.forward.get()==msg_modbus_rsp
assert m.ifc.write.get()== b''
assert m.ifc.fwd_fifo.get()==msg_modbus_rsp
assert m.ifc.tx_fifo.get()== b''
assert m.mb.err == 0
assert m.modbus_elms == 20-1 # register 0x300d is unknown, so one value can't be mapped
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
@@ -1729,9 +1730,9 @@ async def test_modbus_polling(config_tsun_inv1, heartbeat_ind_msg, heartbeat_rsp
assert m.control == 0x4710
assert str(m.seq) == '84:11' # value after sending response
assert m.data_len == 0x01
assert m.ifc.read.get()==b''
assert m.ifc.write.get()==heartbeat_rsp_msg
assert m.ifc.forward.get()==heartbeat_ind_msg
assert m.ifc.rx_get()==b''
assert m.ifc.tx_fifo.get()==heartbeat_rsp_msg
assert m.ifc.fwd_fifo.get()==heartbeat_ind_msg
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
assert m.state == State.up
@@ -1740,16 +1741,16 @@ async def test_modbus_polling(config_tsun_inv1, heartbeat_ind_msg, heartbeat_rsp
await asyncio.sleep(0.5)
assert m.sent_pdu==bytearray(b'\xa5\x17\x00\x10E\x12\x84!Ce{\x02\xb0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x03\x30\x00\x000J\xde\x86\x15')
assert m.ifc.write.get()==b''
assert m.ifc.tx_fifo.get()==b''
await asyncio.sleep(0.5)
assert m.sent_pdu==bytearray(b'\xa5\x17\x00\x10E\x13\x84!Ce{\x02\xb0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x03\x30\x00\x000J\xde\x87\x15')
assert m.ifc.write.get()==b''
assert m.ifc.tx_fifo.get()==b''
m.state = State.closed
m.sent_pdu = bytearray()
await asyncio.sleep(0.5)
assert m.sent_pdu==bytearray(b'')
assert m.ifc.write.get()==b''
assert m.ifc.tx_fifo.get()==b''
assert next(m.mb_timer.exp_count) == 4
m.close()
@@ -1771,16 +1772,29 @@ async def test_start_client_mode(config_tsun_inv1, str_test_ip):
assert m.state == State.up
assert m.no_forwarding == True
assert m.ifc.write.get()==b''
assert m.ifc.tx_fifo.get()==b''
assert isclose(m.mb_timeout, 0.5)
assert next(m.mb_timer.exp_count) == 0
await asyncio.sleep(0.5)
assert m.sent_pdu==bytearray(b'\xa5\x17\x00\x10E\x02\x00!Ce{\x02\xb0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x030\x00\x000J\xde\xf2\x15')
assert m.ifc.write.get()==b''
assert m.ifc.tx_fifo.get()==b''
await asyncio.sleep(0.5)
assert m.sent_pdu==bytearray(b'\xa5\x17\x00\x10E\x03\x00!Ce{\x02\xb0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x030\x00\x000J\xde\xf3\x15')
assert m.ifc.write.get()==b''
assert m.ifc.tx_fifo.get()==b''
assert next(m.mb_timer.exp_count) == 3
m.close()
def test_timeout(config_tsun_inv1):
_ = config_tsun_inv1
m = MemoryStream(b'')
assert m.state == State.init
assert SolarmanV5.MAX_START_TIME == m._timeout()
m.state = State.up
m.modbus_polling = True
assert SolarmanV5.MAX_INV_IDLE_TIME == m._timeout()
m.modbus_polling = False
assert SolarmanV5.MAX_DEF_IDLE_TIME == m._timeout()
m.state = State.closed
m.close()

View File

@@ -1,7 +1,7 @@
# test_with_pytest.py
import pytest, logging, asyncio
from math import isclose
from app.src.async_ifc import AsyncIfc
from app.src.async_stream import AsyncIfcImpl, StreamPtr
from app.src.gen3.talent import Talent, Control
from app.src.config import Config
from app.src.infos import Infos, Register
@@ -19,13 +19,15 @@ tracer = logging.getLogger('tracer')
class MemoryStream(Talent):
def __init__(self, msg, chunks = (0,), server_side: bool = True):
super().__init__(server_side, AsyncIfc())
self.ifc = AsyncIfcImpl()
super().__init__(server_side, self.ifc)
if server_side:
self.mb.timeout = 0.4 # overwrite for faster testing
self.remote = StreamPtr(None)
self.mb_first_timeout = 0.5
self.mb_timeout = 0.5
self.sent_pdu = b''
self.ifc.write.reg_trigger(self.write_cb)
self.ifc.tx_fifo.reg_trigger(self.write_cb)
self.__msg = msg
self.__msg_len = len(msg)
self.__chunks = chunks
@@ -35,10 +37,10 @@ class MemoryStream(Talent):
self.addr = 'Test: SrvSide'
self.send_msg_ofs = 0
self.msg_recvd = []
self.remote_stream = None
self.remote.stream = None
def write_cb(self):
self.sent_pdu = self.ifc.write.get()
self.sent_pdu = self.ifc.tx_fifo.get()
def append_msg(self, msg):
@@ -52,11 +54,11 @@ class MemoryStream(Talent):
chunk_len = self.__chunks[self.__chunk_idx]
self.__chunk_idx += 1
if chunk_len!=0:
self.ifc.read += self.__msg[self.__offs:chunk_len]
self.ifc.rx_fifo += self.__msg[self.__offs:chunk_len]
copied_bytes = chunk_len - self.__offs
self.__offs = chunk_len
else:
self.ifc.read += self.__msg[self.__offs:]
self.ifc.rx_fifo += self.__msg[self.__offs:]
copied_bytes = self.__msg_len - self.__offs
self.__offs = self.__msg_len
except Exception:
@@ -71,8 +73,8 @@ class MemoryStream(Talent):
def createClientStream(self, msg, chunks = (0,)):
c = MemoryStream(msg, chunks, False)
self.remote_stream = c
c. remote_stream = self
self.remote.stream = c
c. remote.stream = self
return c
def _Talent__flush_recv_msg(self) -> None:
@@ -741,7 +743,9 @@ def test_read_message(msg_contact_info):
assert m.msg_id==0
assert m.header_len==23
assert m.data_len==25
assert m.ifc.forward.get()==b''
assert m.ifc.rx_get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.ifc.fwd_fifo.get()==b''
m.close()
def test_read_message_twice(config_no_tsun_inv1, msg_inverter_ind):
@@ -761,7 +765,7 @@ def test_read_message_twice(config_no_tsun_inv1, msg_inverter_ind):
assert m.msg_recvd[1]['data_len']==120
assert m.id_str == b"R170000000000001"
assert m.unique_id == 'R170000000000001'
assert m.ifc.forward.get()==b''
assert m.ifc.fwd_fifo.get()==b''
m.close()
def test_read_message_long_id(msg_contact_info_long_id):
@@ -846,15 +850,15 @@ def test_read_two_messages(config_tsun_allow_all, msg2_contact_info,msg_contact_
assert m.msg_recvd[1]['msg_id']==0
assert m.msg_recvd[1]['header_len']==23
assert m.msg_recvd[1]['data_len']==25
assert m.ifc.forward.get()==b''
assert m.ifc.write.get()==msg_contact_rsp + msg_contact_rsp2
assert m.ifc.fwd_fifo.get()==b''
assert m.ifc.tx_fifo.get()==msg_contact_rsp + msg_contact_rsp2
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
m.ifc.write.clear() # clear send buffer for next test
m.ifc.tx_clear() # clear send buffer for next test
m.contact_name = b'solarhub'
m.contact_mail = b'solarhub@123456'
m._init_new_client_conn()
assert m.ifc.write.get()==b'\x00\x00\x00,\x10R170000000000002\x91\x00\x08solarhub\x0fsolarhub@123456'
assert m.ifc.tx_fifo.get()==b'\x00\x00\x00,\x10R170000000000002\x91\x00\x08solarhub\x0fsolarhub@123456'
m.close()
def test_conttact_req(config_tsun_allow_all, msg_contact_info, msg_contact_rsp):
@@ -871,8 +875,8 @@ def test_conttact_req(config_tsun_allow_all, msg_contact_info, msg_contact_rsp):
assert m.msg_id==0
assert m.header_len==23
assert m.data_len==25
assert m.ifc.forward.get()==b''
assert m.ifc.write.get()==msg_contact_rsp
assert m.ifc.fwd_fifo.get()==b''
assert m.ifc.tx_fifo.get()==msg_contact_rsp
m.close()
def test_contact_broken_req(config_tsun_allow_all, msg_contact_info_broken, msg_contact_rsp):
@@ -889,8 +893,8 @@ def test_contact_broken_req(config_tsun_allow_all, msg_contact_info_broken, msg_
assert m.msg_id==0
assert m.header_len==23
assert m.data_len==23
assert m.ifc.forward.get()==b''
assert m.ifc.write.get()==msg_contact_rsp
assert m.ifc.fwd_fifo.get()==b''
assert m.ifc.tx_fifo.get()==msg_contact_rsp
m.close()
def test_conttact_req(config_tsun_allow_all, msg_contact_info, msg_contact_rsp):
@@ -907,8 +911,8 @@ def test_conttact_req(config_tsun_allow_all, msg_contact_info, msg_contact_rsp):
assert m.msg_id==0
assert m.header_len==23
assert m.data_len==25
assert m.ifc.forward.get()==b''
assert m.ifc.write.get()==msg_contact_rsp
assert m.ifc.fwd_fifo.get()==b''
assert m.ifc.tx_fifo.get()==msg_contact_rsp
m.close()
def test_contact_broken_req(config_tsun_allow_all, msg_contact_info_broken, msg_contact_rsp):
@@ -925,8 +929,8 @@ def test_contact_broken_req(config_tsun_allow_all, msg_contact_info_broken, msg_
assert m.msg_id==0
assert m.header_len==23
assert m.data_len==23
assert m.ifc.forward.get()==b''
assert m.ifc.write.get()==msg_contact_rsp
assert m.ifc.fwd_fifo.get()==b''
assert m.ifc.tx_fifo.get()==msg_contact_rsp
m.close()
def test_msg_contact_resp(config_tsun_inv1, msg_contact_rsp):
@@ -944,8 +948,8 @@ def test_msg_contact_resp(config_tsun_inv1, msg_contact_rsp):
assert m.msg_id==0
assert m.header_len==23
assert m.data_len==1
assert m.ifc.forward.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
m.close()
@@ -964,8 +968,8 @@ def test_msg_contact_resp_2(config_tsun_inv1, msg_contact_rsp):
assert m.msg_id==0
assert m.header_len==23
assert m.data_len==1
assert m.ifc.forward.get()==msg_contact_rsp
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==msg_contact_rsp
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
m.close()
@@ -984,8 +988,8 @@ def test_msg_contact_resp_3(config_tsun_inv1, msg_contact_rsp):
assert m.msg_id==0
assert m.header_len==23
assert m.data_len==1
assert m.ifc.forward.get()==msg_contact_rsp
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==msg_contact_rsp
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
m.close()
@@ -1002,8 +1006,8 @@ def test_msg_contact_invalid(config_tsun_inv1, msg_contact_invalid):
assert m.msg_id==0
assert m.header_len==23
assert m.data_len==1
assert m.ifc.forward.get()==msg_contact_invalid
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==msg_contact_invalid
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 1
m.close()
@@ -1023,8 +1027,8 @@ def test_msg_get_time(config_tsun_inv1, msg_get_time):
assert m.ts_offset==0
assert m.data_len==0
assert m.state==State.pend
assert m.ifc.forward.get()==msg_get_time
assert m.ifc.write.get()==b'\x00\x00\x00\x1b\x10R170000000000001\x91"\x00\x00\x01\x89\xc6,_\x00'
assert m.ifc.fwd_fifo.get()==msg_get_time
assert m.ifc.tx_fifo.get()==b'\x00\x00\x00\x1b\x10R170000000000001\x91"\x00\x00\x01\x89\xc6,_\x00'
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
m.close()
@@ -1044,8 +1048,8 @@ def test_msg_get_time_autark(config_no_tsun_inv1, msg_get_time):
assert m.ts_offset==0
assert m.data_len==0
assert m.state==State.received
assert m.ifc.forward.get()==b''
assert m.ifc.write.get()==bytearray(b'\x00\x00\x00\x1b\x10R170000000000001\x91"\x00\x00\x01\x89\xc6,_\x00')
assert m.ifc.fwd_fifo.get()==b''
assert m.ifc.tx_fifo.get()==bytearray(b'\x00\x00\x00\x1b\x10R170000000000001\x91"\x00\x00\x01\x89\xc6,_\x00')
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
m.close()
@@ -1055,7 +1059,7 @@ def test_msg_time_resp(config_tsun_inv1, msg_time_rsp):
m = MemoryStream(msg_time_rsp, (0,), False)
s = MemoryStream(b'', (0,), True)
assert s.ts_offset==0
m.remote_stream = s
m.remote.stream = s
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
@@ -1068,10 +1072,10 @@ def test_msg_time_resp(config_tsun_inv1, msg_time_rsp):
assert m.ts_offset==3600000
assert s.ts_offset==3600000
assert m.data_len==8
assert m.ifc.forward.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
m.remote_stream = None
m.remote.stream = None
s.close()
m.close()
@@ -1089,8 +1093,8 @@ def test_msg_time_resp_autark(config_no_tsun_inv1, msg_time_rsp):
assert m.header_len==23
assert m.ts_offset==3600000
assert m.data_len==8
assert m.ifc.forward.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
m.close()
@@ -1108,8 +1112,8 @@ def test_msg_time_inv_resp(config_tsun_inv1, msg_time_rsp_inv):
assert m.header_len==23
assert m.ts_offset==0
assert m.data_len==4
assert m.ifc.forward.get()==msg_time_rsp_inv
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==msg_time_rsp_inv
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
m.close()
@@ -1127,8 +1131,8 @@ def test_msg_time_invalid(config_tsun_inv1, msg_time_invalid):
assert m.header_len==23
assert m.ts_offset==0
assert m.data_len==0
assert m.ifc.forward.get()==msg_time_invalid
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==msg_time_invalid
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 1
m.close()
@@ -1146,8 +1150,8 @@ def test_msg_time_invalid_autark(config_no_tsun_inv1, msg_time_invalid):
assert m.ts_offset==0
assert m.header_len==23
assert m.data_len==0
assert m.ifc.forward.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 1
m.close()
@@ -1170,8 +1174,8 @@ def test_msg_act_time(config_no_modbus_poll, msg_act_time, msg_act_time_ack):
assert m.header_len==23
assert m.data_len==9
assert m.state == State.up
assert m.ifc.forward.get()==msg_act_time
assert m.ifc.write.get()==msg_act_time_ack
assert m.ifc.fwd_fifo.get()==msg_act_time
assert m.ifc.tx_fifo.get()==msg_act_time_ack
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
assert 125 == m.db.get_db_value(Register.POLLING_INTERVAL, 0)
m.close()
@@ -1194,8 +1198,8 @@ def test_msg_act_time2(config_tsun_inv1, msg_act_time, msg_act_time_ack):
assert m.ts_offset==0
assert m.header_len==23
assert m.data_len==9
assert m.ifc.forward.get()==msg_act_time
assert m.ifc.write.get()==msg_act_time_ack
assert m.ifc.fwd_fifo.get()==msg_act_time
assert m.ifc.tx_fifo.get()==msg_act_time_ack
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
assert 123 == m.db.get_db_value(Register.POLLING_INTERVAL, 0)
m.close()
@@ -1215,8 +1219,8 @@ def test_msg_act_time_ofs(config_tsun_inv1, msg_act_time, msg_act_time_ofs, msg_
assert m.ts_offset==3600
assert m.header_len==23
assert m.data_len==9
assert m.ifc.forward.get()==msg_act_time_ofs
assert m.ifc.write.get()==msg_act_time_ack
assert m.ifc.fwd_fifo.get()==msg_act_time_ofs
assert m.ifc.tx_fifo.get()==msg_act_time_ack
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
m.close()
@@ -1235,8 +1239,8 @@ def test_msg_act_time_ofs2(config_tsun_inv1, msg_act_time, msg_act_time_ofs, msg
assert m.ts_offset==-3600
assert m.header_len==23
assert m.data_len==9
assert m.ifc.forward.get()==msg_act_time
assert m.ifc.write.get()==msg_act_time_ack
assert m.ifc.fwd_fifo.get()==msg_act_time
assert m.ifc.tx_fifo.get()==msg_act_time_ack
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
m.close()
@@ -1255,8 +1259,8 @@ def test_msg_act_time_autark(config_no_tsun_inv1, msg_act_time, msg_act_time_ack
assert m.ts_offset==0
assert m.header_len==23
assert m.data_len==9
assert m.ifc.forward.get()==b''
assert m.ifc.write.get()==msg_act_time_ack
assert m.ifc.fwd_fifo.get()==b''
assert m.ifc.tx_fifo.get()==msg_act_time_ack
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
m.close()
@@ -1273,8 +1277,8 @@ def test_msg_act_time_ack(config_tsun_inv1, msg_act_time_ack):
assert m.msg_id==153
assert m.header_len==23
assert m.data_len==1
assert m.ifc.forward.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
m.close()
@@ -1291,8 +1295,8 @@ def test_msg_act_time_cmd(config_tsun_inv1, msg_act_time_cmd):
assert m.msg_id==153
assert m.header_len==23
assert m.data_len==1
assert m.ifc.forward.get()==msg_act_time_cmd
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==msg_act_time_cmd
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 1
m.close()
@@ -1309,8 +1313,8 @@ def test_msg_act_time_inv(config_tsun_inv1, msg_act_time_inv):
assert m.msg_id==153
assert m.header_len==23
assert m.data_len==8
assert m.ifc.forward.get()==msg_act_time_inv
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==msg_act_time_inv
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
m.close()
@@ -1328,12 +1332,12 @@ def test_msg_cntrl_ind(config_tsun_inv1, msg_controller_ind, msg_controller_ind_
assert m.header_len==23
assert m.data_len==284
m.ts_offset = 0
m._update_header(m.ifc.forward.peek())
assert m.ifc.forward.peek()==msg_controller_ind
m._update_header(m.ifc.fwd_fifo.peek())
assert m.ifc.fwd_fifo.peek()==msg_controller_ind
m.ts_offset = -4096
m._update_header(m.ifc.forward.peek())
assert m.ifc.forward.get()==msg_controller_ind_ts_offs
assert m.ifc.write.get()==msg_controller_ack
m._update_header(m.ifc.fwd_fifo.peek())
assert m.ifc.fwd_fifo.get()==msg_controller_ind_ts_offs
assert m.ifc.tx_fifo.get()==msg_controller_ack
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
m.close()
@@ -1350,8 +1354,8 @@ def test_msg_cntrl_ack(config_tsun_inv1, msg_controller_ack):
assert m.msg_id==113
assert m.header_len==23
assert m.data_len==1
assert m.ifc.forward.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
m.close()
@@ -1369,12 +1373,12 @@ def test_msg_cntrl_invalid(config_tsun_inv1, msg_controller_invalid):
assert m.header_len==23
assert m.data_len==1
m.ts_offset = 0
m._update_header(m.ifc.forward.peek())
assert m.ifc.forward.peek()==msg_controller_invalid
m._update_header(m.ifc.fwd_fifo.peek())
assert m.ifc.fwd_fifo.peek()==msg_controller_invalid
m.ts_offset = -4096
m._update_header(m.ifc.forward.peek())
assert m.ifc.forward.get()==msg_controller_invalid
assert m.ifc.write.get()==b''
m._update_header(m.ifc.fwd_fifo.peek())
assert m.ifc.fwd_fifo.get()==msg_controller_invalid
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 1
m.close()
@@ -1393,12 +1397,12 @@ def test_msg_inv_ind(config_tsun_inv1, msg_inverter_ind, msg_inverter_ind_ts_off
assert m.header_len==23
assert m.data_len==120
m.ts_offset = 0
m._update_header(m.ifc.forward.peek())
assert m.ifc.forward.peek()==msg_inverter_ind
m._update_header(m.ifc.fwd_fifo.peek())
assert m.ifc.fwd_fifo.peek()==msg_inverter_ind
m.ts_offset = +256
m._update_header(m.ifc.forward.peek())
assert m.ifc.forward.get()==msg_inverter_ind_ts_offs
assert m.ifc.write.get()==msg_inverter_ack
m._update_header(m.ifc.fwd_fifo.peek())
assert m.ifc.fwd_fifo.get()==msg_inverter_ind_ts_offs
assert m.ifc.tx_fifo.get()==msg_inverter_ack
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
m.close()
@@ -1420,9 +1424,9 @@ def test_msg_inv_ind1(config_tsun_inv1, msg_inverter_ind2, msg_inverter_ind_ts_o
assert m.header_len==23
assert m.data_len==1263
m.ts_offset = 0
m._update_header(m.ifc.forward.peek())
assert m.ifc.forward.get()==msg_inverter_ind2
assert m.ifc.write.get()==msg_inverter_ack
m._update_header(m.ifc.fwd_fifo.peek())
assert m.ifc.fwd_fifo.get()==msg_inverter_ind2
assert m.ifc.tx_fifo.get()==msg_inverter_ack
assert m.db.get_db_value(Register.TS_GRID) == 1691243349
m.close()
@@ -1444,9 +1448,9 @@ def test_msg_inv_ind2(config_tsun_inv1, msg_inverter_ind_new, msg_inverter_ind_t
assert m.header_len==23
assert m.data_len==1165
m.ts_offset = 0
m._update_header(m.ifc.forward.peek())
assert m.ifc.forward.get()==msg_inverter_ind_new
assert m.ifc.write.get()==msg_inverter_ack
m._update_header(m.ifc.fwd_fifo.peek())
assert m.ifc.fwd_fifo.get()==msg_inverter_ind_new
assert m.ifc.tx_fifo.get()==msg_inverter_ack
assert m.db.get_db_value(Register.INVERTER_STATUS) == None
assert m.db.get_db_value(Register.TS_GRID) == None
m.db.db['grid'] = {'Output_Power': 100}
@@ -1472,9 +1476,9 @@ def test_msg_inv_ind3(config_tsun_inv1, msg_inverter_ind_0w, msg_inverter_ack):
assert m.header_len==23
assert m.data_len==1263
m.ts_offset = 0
m._update_header(m.ifc.forward.peek())
assert m.ifc.forward.get()==msg_inverter_ind_0w
assert m.ifc.write.get()==msg_inverter_ack
m._update_header(m.ifc.fwd_fifo.peek())
assert m.ifc.fwd_fifo.get()==msg_inverter_ind_0w
assert m.ifc.tx_fifo.get()==msg_inverter_ack
assert m.db.get_db_value(Register.INVERTER_STATUS) == 1
assert isclose(m.db.db['grid']['Output_Power'], 0.5)
m.close()
@@ -1496,8 +1500,8 @@ def test_msg_inv_ack(config_tsun_inv1, msg_inverter_ack):
assert m.msg_id==4
assert m.header_len==23
assert m.data_len==1
assert m.ifc.forward.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
m.close()
@@ -1515,12 +1519,12 @@ def test_msg_inv_invalid(config_tsun_inv1, msg_inverter_invalid):
assert m.header_len==23
assert m.data_len==1
m.ts_offset = 0
m._update_header(m.ifc.forward.peek())
assert m.ifc.forward.peek()==msg_inverter_invalid
m._update_header(m.ifc.fwd_fifo.peek())
assert m.ifc.fwd_fifo.peek()==msg_inverter_invalid
m.ts_offset = 256
m._update_header(m.ifc.forward.peek())
assert m.ifc.forward.get()==msg_inverter_invalid
assert m.ifc.write.get()==b''
m._update_header(m.ifc.fwd_fifo.peek())
assert m.ifc.fwd_fifo.get()==msg_inverter_invalid
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 1
m.close()
@@ -1539,12 +1543,12 @@ def test_msg_ota_req(config_tsun_inv1, msg_ota_req):
assert m.header_len==23
assert m.data_len==259
m.ts_offset = 0
m._update_header(m.ifc.forward.peek())
assert m.ifc.forward.peek()==msg_ota_req
m._update_header(m.ifc.fwd_fifo.peek())
assert m.ifc.fwd_fifo.peek()==msg_ota_req
m.ts_offset = 4096
m._update_header(m.ifc.forward.peek())
assert m.ifc.forward.get()==msg_ota_req
assert m.ifc.write.get()==b''
m._update_header(m.ifc.fwd_fifo.peek())
assert m.ifc.fwd_fifo.get()==msg_ota_req
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
assert m.db.stat['proxy']['OTA_Start_Msg'] == 1
m.close()
@@ -1566,12 +1570,12 @@ def test_msg_ota_ack(config_tsun_inv1, msg_ota_ack):
assert m.header_len==23
assert m.data_len==1
m.ts_offset = 0
m._update_header(m.ifc.forward.peek())
assert m.ifc.forward.peek()==msg_ota_ack
m._update_header(m.ifc.fwd_fifo.peek())
assert m.ifc.fwd_fifo.peek()==msg_ota_ack
m.ts_offset = 256
m._update_header(m.ifc.forward.peek())
assert m.ifc.forward.get()==msg_ota_ack
assert m.ifc.write.get()==b''
m._update_header(m.ifc.fwd_fifo.peek())
assert m.ifc.fwd_fifo.get()==msg_ota_ack
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
assert m.db.stat['proxy']['OTA_Start_Msg'] == 0
m.close()
@@ -1591,12 +1595,12 @@ def test_msg_ota_invalid(config_tsun_inv1, msg_ota_invalid):
assert m.header_len==23
assert m.data_len==1
m.ts_offset = 0
m._update_header(m.ifc.forward.peek())
assert m.ifc.forward.peek()==msg_ota_invalid
m._update_header(m.ifc.fwd_fifo.peek())
assert m.ifc.fwd_fifo.peek()==msg_ota_invalid
m.ts_offset = 4096
assert m.ifc.forward.get()==msg_ota_invalid
m._update_header(m.ifc.forward.peek())
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==msg_ota_invalid
m._update_header(m.ifc.fwd_fifo.peek())
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 1
assert m.db.stat['proxy']['OTA_Start_Msg'] == 0
m.close()
@@ -1614,8 +1618,8 @@ def test_msg_unknown(config_tsun_inv1, msg_unknown):
assert m.msg_id==23
assert m.header_len==23
assert m.data_len==4
assert m.ifc.forward.get()==msg_unknown
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==msg_unknown
assert m.ifc.tx_fifo.get()==b''
assert 1 == m.db.stat['proxy']['Unknown_Msg']
m.close()
@@ -1635,9 +1639,9 @@ def test_ctrl_byte():
def test_msg_iterator():
m1 = Talent(server_side=True, ifc=AsyncIfc())
m2 = Talent(server_side=True, ifc=AsyncIfc())
m3 = Talent(server_side=True, ifc=AsyncIfc())
m1 = Talent(server_side=True, ifc=AsyncIfcImpl())
m2 = Talent(server_side=True, ifc=AsyncIfcImpl())
m3 = Talent(server_side=True, ifc=AsyncIfcImpl())
m3.close()
del m3
test1 = 0
@@ -1739,11 +1743,11 @@ def test_msg_modbus_req(config_tsun_inv1, msg_modbus_cmd):
assert c.msg_id==119
assert c.header_len==23
assert c.data_len==13
assert c.ifc.forward.get()==b''
assert c.ifc.write.get()==b''
assert c.ifc.fwd_fifo.get()==b''
assert c.ifc.tx_fifo.get()==b''
assert m.id_str == b"R170000000000001"
assert m.ifc.forward.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.sent_pdu == msg_modbus_cmd
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
assert m.db.stat['proxy']['Modbus_Command'] == 1
@@ -1769,11 +1773,11 @@ def test_msg_modbus_req2(config_tsun_inv1, msg_modbus_cmd):
assert c.msg_id==119
assert c.header_len==23
assert c.data_len==13
assert c.ifc.forward.get()==b''
assert c.ifc.write.get()==b''
assert c.ifc.fwd_fifo.get()==b''
assert c.ifc.tx_fifo.get()==b''
assert m.id_str == b"R170000000000001"
assert m.ifc.forward.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.sent_pdu == b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
assert m.db.stat['proxy']['Modbus_Command'] == 1
@@ -1798,10 +1802,10 @@ def test_msg_modbus_req3(config_tsun_inv1, msg_modbus_cmd_crc_err):
assert c.msg_id==119
assert c.header_len==23
assert c.data_len==13
assert c.ifc.forward.get()==b''
assert c.ifc.write.get()==b''
assert m.ifc.forward.get()==b''
assert m.ifc.write.get()==b''
assert c.ifc.fwd_fifo.get()==b''
assert c.ifc.tx_fifo.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.sent_pdu ==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
assert m.db.stat['proxy']['Modbus_Command'] == 0
@@ -1823,8 +1827,8 @@ def test_msg_modbus_rsp1(config_tsun_inv1, msg_modbus_rsp):
assert m.msg_id==119
assert m.header_len==23
assert m.data_len==13
assert m.ifc.forward.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
assert m.db.stat['proxy']['Modbus_Command'] == 0
m.close()
@@ -1845,8 +1849,8 @@ def test_msg_modbus_cloud_rsp(config_tsun_inv1, msg_modbus_rsp):
assert m.msg_id==119
assert m.header_len==23
assert m.data_len==13
assert m.ifc.forward.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Msg'] == 1
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
assert m.db.stat['proxy']['Modbus_Command'] == 0
@@ -1873,8 +1877,8 @@ def test_msg_modbus_rsp2(config_tsun_inv1, msg_modbus_rsp20):
assert not m.header_valid # must be invalid, since msg was handled and buffer flushed
assert m.mb.err == 5
assert m.msg_count == 2
assert m.ifc.forward.get()==msg_modbus_rsp20
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==msg_modbus_rsp20
assert m.ifc.tx_fifo.get()==b''
assert m.db.db == {'collector': {'Serial_Number': 'R170000000000001'}, 'inverter': {'Version': 'V5.1.09', 'Rated_Power': 300}, 'grid': {'Timestamp': m._utc(), 'Voltage': 225.9, 'Current': 0.41, 'Frequency': 49.99, 'Output_Power': 94.8}, 'env': {'Inverter_Temp': 22}, 'input': {'Timestamp': m._utc(), 'pv1': {'Voltage': 0.8, 'Current': 0.0, 'Power': 0.0}, 'pv2': {'Voltage': 34.5, 'Current': 2.89, 'Power': 99.8}, 'pv3': {'Voltage': 0.0, 'Current': 0.0, 'Power': 0.0}, 'pv4': {'Voltage': 0.0, 'Current': 0.0, 'Power': 0.0}}}
assert m.db.get_db_value(Register.VERSION) == 'V5.1.09'
assert m.db.get_db_value(Register.TS_GRID) == m._utc()
@@ -1903,8 +1907,8 @@ def test_msg_modbus_rsp3(config_tsun_inv1, msg_modbus_rsp21):
assert not m.header_valid # must be invalid, since msg was handled and buffer flushed
assert m.mb.err == 5
assert m.msg_count == 2
assert m.ifc.forward.get()==msg_modbus_rsp21
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==msg_modbus_rsp21
assert m.ifc.tx_fifo.get()==b''
assert m.db.db == {'collector': {'Serial_Number': 'R170000000000001'}, 'inverter': {'Version': 'V5.1.0E', 'Rated_Power': 300}, 'grid': {'Timestamp': m._utc(), 'Voltage': 225.9, 'Current': 0.41, 'Frequency': 49.99, 'Output_Power': 94.8}, 'env': {'Inverter_Temp': 22}, 'input': {'Timestamp': m._utc(), 'pv1': {'Voltage': 0.8, 'Current': 0.0, 'Power': 0.0}, 'pv2': {'Voltage': 34.5, 'Current': 2.89, 'Power': 99.8}, 'pv3': {'Voltage': 0.0, 'Current': 0.0, 'Power': 0.0}, 'pv4': {'Voltage': 0.0, 'Current': 0.0, 'Power': 0.0}}}
assert m.db.get_db_value(Register.VERSION) == 'V5.1.0E'
assert m.db.get_db_value(Register.TS_GRID) == m._utc()
@@ -1932,9 +1936,9 @@ def test_msg_modbus_rsp4(config_tsun_inv1, msg_modbus_rsp21):
assert not m.header_valid # must be invalid, since msg was handled and buffer flushed
assert m.mb.err == 0
assert m.msg_count == 1
assert m.ifc.forward.get()==msg_modbus_rsp21
assert m.ifc.fwd_fifo.get()==msg_modbus_rsp21
assert m.modbus_elms == 19
assert m.ifc.write.get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.db.db == db_values
assert m.db.get_db_value(Register.VERSION) == 'V5.1.0E'
assert m.db.get_db_value(Register.TS_GRID) == m._utc()
@@ -1957,8 +1961,8 @@ def test_msg_modbus_rsp_new(config_tsun_inv1, msg_modbus_rsp20_new):
assert m.msg_id==135
assert m.header_len==23
assert m.data_len==107
assert m.ifc.forward.get()==b''
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==b''
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
assert m.db.stat['proxy']['Modbus_Command'] == 0
m.close()
@@ -1977,8 +1981,8 @@ def test_msg_modbus_invalid(config_tsun_inv1, msg_modbus_inv):
assert m.msg_id==119
assert m.header_len==23
assert m.data_len==13
assert m.ifc.forward.get()==msg_modbus_inv
assert m.ifc.write.get()==b''
assert m.ifc.fwd_fifo.get()==msg_modbus_inv
assert m.ifc.tx_fifo.get()==b''
assert m.db.stat['proxy']['Unknown_Ctrl'] == 1
assert m.db.stat['proxy']['Modbus_Command'] == 0
m.close()
@@ -2006,8 +2010,8 @@ def test_msg_modbus_fragment(config_tsun_inv1, msg_modbus_rsp20):
assert m.msg_id == 119
assert m.header_len == 23
assert m.data_len == 50
assert m.ifc.forward.get()==msg_modbus_rsp20
assert m.ifc.write.get() == b''
assert m.ifc.fwd_fifo.get()==msg_modbus_rsp20
assert m.ifc.tx_fifo.get() == b''
assert m.mb.err == 0
assert m.modbus_elms == 20-1 # register 0x300d is unknown, so one value can't be mapped
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
@@ -2021,15 +2025,15 @@ async def test_msg_build_modbus_req(config_tsun_inv1, msg_modbus_cmd):
m.id_str = b"R170000000000001"
await m.send_modbus_cmd(Modbus.WRITE_SINGLE_REG, 0x2008, 0, logging.DEBUG)
assert 0 == m.send_msg_ofs
assert m.ifc.forward.get() == b''
assert m.ifc.write.get() == b''
assert m.ifc.fwd_fifo.get() == b''
assert m.ifc.tx_fifo.get() == b''
assert m.sent_pdu == b''
m.state = State.up
await m.send_modbus_cmd(Modbus.WRITE_SINGLE_REG, 0x2008, 0, logging.DEBUG)
assert 0 == m.send_msg_ofs
assert m.ifc.forward.get() == b''
assert m.ifc.write.get() == b''
assert m.ifc.fwd_fifo.get() == b''
assert m.ifc.tx_fifo.get() == b''
assert m.sent_pdu == msg_modbus_cmd
m.close()
@@ -2048,8 +2052,8 @@ def test_modbus_no_polling(config_no_modbus_poll, msg_get_time):
assert m.header_len==23
assert m.ts_offset==0
assert m.data_len==0
assert m.ifc.forward.get()==msg_get_time
assert m.ifc.write.get()==b'\x00\x00\x00\x1b\x10R170000000000001\x91"\x00\x00\x01\x89\xc6,_\x00'
assert m.ifc.fwd_fifo.get()==msg_get_time
assert m.ifc.tx_fifo.get()==b'\x00\x00\x00\x1b\x10R170000000000001\x91"\x00\x00\x01\x89\xc6,_\x00'
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
m.close()
@@ -2072,25 +2076,25 @@ async def test_modbus_polling(config_tsun_inv1, msg_inverter_ind):
assert m.header_len==23
assert m.ts_offset==0
assert m.data_len==120
assert m.ifc.forward.get()==msg_inverter_ind
assert m.ifc.write.get()==b'\x00\x00\x00\x14\x10R170000000000001\x99\x04\x01'
assert m.ifc.fwd_fifo.get()==msg_inverter_ind
assert m.ifc.tx_fifo.get()==b'\x00\x00\x00\x14\x10R170000000000001\x99\x04\x01'
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
m.ifc.write.clear() # clear send buffer for next test
m.ifc.tx_clear() # clear send buffer for next test
assert isclose(m.mb_timeout, 0.5)
assert next(m.mb_timer.exp_count) == 0
await asyncio.sleep(0.5)
assert m.sent_pdu==b'\x00\x00\x00 \x10R170000000000001pw\x00\x01\xa3(\x08\x01\x030\x00\x000J\xde'
assert m.ifc.write.get()==b''
assert m.ifc.tx_fifo.get()==b''
await asyncio.sleep(0.5)
assert m.sent_pdu==b'\x00\x00\x00 \x10R170000000000001pw\x00\x01\xa3(\x08\x01\x030\x00\x000J\xde'
assert m.ifc.write.get()==b''
assert m.ifc.tx_fifo.get()==b''
await asyncio.sleep(0.5)
assert m.sent_pdu==b'\x00\x00\x00 \x10R170000000000001pw\x00\x01\xa3(\x08\x01\x03\x20\x00\x00`N"'
assert m.ifc.write.get()==b''
assert m.ifc.tx_fifo.get()==b''
assert next(m.mb_timer.exp_count) == 4
m.close()
@@ -2133,3 +2137,15 @@ def test_multiiple_recv_buf(config_tsun_allow_all, multiple_recv_buf):
assert m.db.stat['proxy']['Invalid_Data_Type'] == 1
m.close()
def test_timeout(config_tsun_inv1):
_ = config_tsun_inv1
m = MemoryStream(b'')
assert m.state == State.init
assert Talent.MAX_START_TIME == m._timeout()
m.state = State.up
m.modbus_polling = True
assert Talent.MAX_INV_IDLE_TIME == m._timeout()
m.modbus_polling = False
assert Talent.MAX_DEF_IDLE_TIME == m._timeout()
m.close()