From 302f52469a38a311c64e1dbeaef49fbb49fea208 Mon Sep 17 00:00:00 2001 From: Mike Kinney Date: Tue, 21 Dec 2021 14:47:05 -0800 Subject: [PATCH] add unit tests for toRadio, sendData() and sendPosition(); found and fixed Exception without raise --- meshtastic/mesh_interface.py | 6 ++- meshtastic/tests/test_mesh_interface.py | 68 +++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/meshtastic/mesh_interface.py b/meshtastic/mesh_interface.py index fee9166..ce74979 100644 --- a/meshtastic/mesh_interface.py +++ b/meshtastic/mesh_interface.py @@ -227,8 +227,9 @@ class MeshInterface: data = data.SerializeToString() logging.debug(f"len(data): {len(data)}") + logging.debug(f"mesh_pb2.Constants.DATA_PAYLOAD_LEN: {mesh_pb2.Constants.DATA_PAYLOAD_LEN}") if len(data) > mesh_pb2.Constants.DATA_PAYLOAD_LEN: - Exception("Data payload too big") + raise Exception("Data payload too big") if portNum == portnums_pb2.PortNum.UNKNOWN_APP: # we are now more strict wrt port numbers our_exit("Warning: A non-zero port number must be specified") @@ -261,12 +262,15 @@ class MeshInterface: p = mesh_pb2.Position() if latitude != 0.0: p.latitude_i = int(latitude / 1e-7) + logging.debug(f'p.latitude_i:{p.latitude_i}') if longitude != 0.0: p.longitude_i = int(longitude / 1e-7) + logging.debug(f'p.longitude_i:{p.longitude_i}') if altitude != 0: p.altitude = int(altitude) + logging.debug(f'p.altitude:{p.altitude}') if timeSec == 0: timeSec = time.time() # returns unix timestamp in seconds diff --git a/meshtastic/tests/test_mesh_interface.py b/meshtastic/tests/test_mesh_interface.py index 9429911..98a6b9a 100644 --- a/meshtastic/tests/test_mesh_interface.py +++ b/meshtastic/tests/test_mesh_interface.py @@ -216,3 +216,71 @@ def test_handleFromRadio_with_node_info_tbeam_with_bad_data(reset_globals, caplo with caplog.at_level(logging.DEBUG): iface._startConfig() iface._handleFromRadio(from_radio_bytes) + + +@pytest.mark.unit +def test_MeshInterface_sendToRadioImpl(caplog, reset_globals): + """Test _sendToRadioImp()""" + iface = MeshInterface(noProto=True) + with caplog.at_level(logging.DEBUG): + iface._sendToRadioImpl('foo') + assert re.search(r'Subclass must provide toradio', caplog.text, re.MULTILINE) + iface.close() + + +@pytest.mark.unit +def test_MeshInterface_sendToRadio_no_proto(caplog, reset_globals): + """Test sendToRadio()""" + iface = MeshInterface() + with caplog.at_level(logging.DEBUG): + iface._sendToRadioImpl('foo') + assert re.search(r'Subclass must provide toradio', caplog.text, re.MULTILINE) + iface.close() + + +@pytest.mark.unit +def test_sendData_too_long(caplog, reset_globals): + """Test when data payload is too big""" + iface = MeshInterface(noProto=True) + some_large_text = b'This is a long text that will be too long for send text.' + some_large_text += b'This is a long text that will be too long for send text.' + some_large_text += b'This is a long text that will be too long for send text.' + some_large_text += b'This is a long text that will be too long for send text.' + some_large_text += b'This is a long text that will be too long for send text.' + some_large_text += b'This is a long text that will be too long for send text.' + some_large_text += b'This is a long text that will be too long for send text.' + some_large_text += b'This is a long text that will be too long for send text.' + some_large_text += b'This is a long text that will be too long for send text.' + some_large_text += b'This is a long text that will be too long for send text.' + some_large_text += b'This is a long text that will be too long for send text.' + some_large_text += b'This is a long text that will be too long for send text.' + with caplog.at_level(logging.DEBUG): + with pytest.raises(Exception) as pytest_wrapped_e: + iface.sendData(some_large_text) + assert re.search('Data payload too big', caplog.text, re.MULTILINE) + assert pytest_wrapped_e.type == Exception + iface.close() + + +@pytest.mark.unit +def test_sendData_unknown_app(capsys, reset_globals): + """Test sendData when unknown app""" + iface = MeshInterface(noProto=True) + with pytest.raises(SystemExit) as pytest_wrapped_e: + iface.sendData(b'hello', portNum=0) + out, err = capsys.readouterr() + assert re.search(r'Warning: A non-zero port number', out, re.MULTILINE) + assert err == '' + assert pytest_wrapped_e.type == SystemExit + assert pytest_wrapped_e.value.code == 1 + + +@pytest.mark.unit +def test_sendPosition_with_a_position(caplog, reset_globals): + """Test sendPosition when lat/long/alt""" + iface = MeshInterface(noProto=True) + with caplog.at_level(logging.DEBUG): + iface.sendPosition(latitude=40.8, longitude=-111.86, altitude=201) + assert re.search(r'p.latitude_i:408', caplog.text, re.MULTILINE) + assert re.search(r'p.longitude_i:-11186', caplog.text, re.MULTILINE) + assert re.search(r'p.altitude:201', caplog.text, re.MULTILINE)