def test_plm_ack_sent(test_db, test_entry_dev1_ctrl, test_entry_dev1_resp): # delete 2nd entry and then re-add the first test_db.add_entry(test_entry_dev1_ctrl) test_db.add_entry(test_entry_dev1_resp) assert len(test_db) == 2 handler = Handler.ModemDbModify(test_db, test_entry_dev1_ctrl) db_flags = Msg.DbFlags(in_use=True, is_controller=test_entry_dev1_ctrl.is_controller, is_last_rec=False) msg = Msg.OutAllLinkUpdate(Msg.OutAllLinkUpdate.Cmd.DELETE, db_flags, test_entry_dev1_ctrl.group, test_entry_dev1_ctrl.addr, data=None) # Add update to delete 2nd entry handler.add_update(msg, test_entry_dev1_resp) # Then restore the first db_flags = Msg.DbFlags(in_use=True, is_controller=test_entry_dev1_ctrl.is_controller, is_last_rec=False) msg2 = Msg.OutAllLinkUpdate(Msg.OutAllLinkUpdate.Cmd.ADD_CONTROLLER, db_flags, test_entry_dev1_ctrl.group, test_entry_dev1_ctrl.addr, test_entry_dev1_ctrl.data) handler.add_update(msg2, test_entry_dev1_ctrl) # try prior to sent msg.is_ack = True ret = handler.msg_received(test_db.device.protocol, msg) assert ret == Msg.UNKNOWN assert not handler._PLM_sent # Signal Sent handler.sending_message(msg) assert handler._PLM_sent # signal first delete ack msg.is_ack = True handler.msg_received(test_db.device.protocol, msg) assert len(test_db) == 1 # signal second delete ack prior to sent ret = handler.msg_received(test_db.device.protocol, msg) assert ret == Msg.UNKNOWN # Signal Sent handler.sending_message(msg) assert handler._PLM_sent # signal second delete ack handler.msg_received(test_db.device.protocol, msg) assert len(test_db) == 0 # signal final add ack # Signal Sent handler.sending_message(msg) assert handler._PLM_sent msg2.is_ack = True handler.msg_received(test_db.device.protocol, msg2) assert len(test_db) == 1 assert test_db.entries[0] == test_entry_dev1_ctrl
def test_delete_post_two_second(self, test_device, test_entry_dev1_ctrl, test_entry_dev1_resp, caplog): # add_on_device(self, entry, on_done=None) # test deleting the second of two entries test_device.add_entry(test_entry_dev1_ctrl) test_device.add_entry(test_entry_dev1_resp) test_device._delete_on_device_post_search(test_entry_dev1_resp) assert (test_device.device.protocol.sent[0].msg.cmd == Msg.OutAllLinkUpdate.Cmd.DELETE) db_flags = Msg.DbFlags.from_bytes(bytes(1)) sent = test_device.device.protocol.sent[0] assert (sent.msg.to_bytes() == Msg.OutAllLinkUpdate( Msg.OutAllLinkUpdate.Cmd.DELETE, db_flags, test_entry_dev1_resp.group, test_entry_dev1_resp.addr, bytes(3)).to_bytes()) assert len(sent.handler.next) == 2 assert (sent.handler.next[0][0].to_bytes() == Msg.OutAllLinkUpdate( Msg.OutAllLinkUpdate.Cmd.DELETE, db_flags, test_entry_dev1_resp.group, test_entry_dev1_resp.addr, bytes(3)).to_bytes()) db_flags = Msg.DbFlags( in_use=True, is_controller=test_entry_dev1_ctrl.is_controller, is_last_rec=False) assert (sent.handler.next[1][0].to_bytes() == Msg.OutAllLinkUpdate( Msg.OutAllLinkUpdate.Cmd.ADD_CONTROLLER, db_flags, test_entry_dev1_ctrl.group, test_entry_dev1_ctrl.addr, test_entry_dev1_ctrl.data).to_bytes())
def test_update_nak(self, test_db, test_entry_dev1_ctrl, test_entry_dev1_ctrl_mod): test_db.add_entry(test_entry_dev1_ctrl) assert len(test_db) == 1 handler = Handler.ModemDbModify(test_db, test_entry_dev1_ctrl_mod, existing_entry=test_entry_dev1_ctrl) handler._PLM_sent = True handler._PLM_ACK = True db_flags = Msg.DbFlags( in_use=True, is_controller=test_entry_dev1_ctrl.is_controller, is_last_rec=False) msg = Msg.OutAllLinkUpdate(Msg.OutAllLinkUpdate.Cmd.UPDATE, db_flags, test_entry_dev1_ctrl_mod.group, test_entry_dev1_ctrl_mod.addr, data=bytes(3), is_ack=False) handler.msg_received(test_db.device.protocol, msg) # entry should still be there, it gets updated on next ack assert len(test_db) == 1 assert len(test_db.device.protocol.sent) == 1 assert (test_db.device.protocol.sent[0].msg.cmd == Msg.OutAllLinkUpdate.Cmd.ADD_CONTROLLER) assert handler.is_retry
def test_delete_post_one(self, test_device, test_entry_dev1_ctrl, caplog): # add_on_device(self, entry, on_done=None) # test delete of a single entry test_device.add_entry(test_entry_dev1_ctrl) test_device._delete_on_device_post_search(test_entry_dev1_ctrl) assert (test_device.device.protocol.sent[0].msg.cmd == Msg.OutAllLinkUpdate.Cmd.DELETE) db_flags = Msg.DbFlags.from_bytes(bytes(1)) assert (test_device.device.protocol.sent[0].msg.to_bytes() == Msg.OutAllLinkUpdate(Msg.OutAllLinkUpdate.Cmd.DELETE, db_flags, test_entry_dev1_ctrl.group, test_entry_dev1_ctrl.addr, bytes(3)).to_bytes())
def test_nack(self, test_db, test_entry_dev1_ctrl): handler = Handler.ModemDbSearch(test_db) db_flags = Msg.DbFlags( in_use=True, is_controller=test_entry_dev1_ctrl.is_controller, is_last_rec=False) msg = Msg.OutAllLinkUpdate(Msg.OutAllLinkUpdate.Cmd.EXISTS, db_flags, test_entry_dev1_ctrl.group, test_entry_dev1_ctrl.addr, data=None, is_ack=False) ret = handler.msg_received(test_db.device.protocol, msg) assert ret == Msg.FINISHED
def test_delete_post_two_first(self, test_device, test_entry_dev1_ctrl, test_entry_dev1_resp, caplog): # add_on_device(self, entry, on_done=None) # test deleting the first of two entries test_device.add_entry(test_entry_dev1_ctrl) test_device.add_entry(test_entry_dev1_resp) test_device._delete_on_device_post_search(test_entry_dev1_ctrl) assert (test_device.device.protocol.sent[0].msg.cmd == Msg.OutAllLinkUpdate.Cmd.DELETE) db_flags = Msg.DbFlags.from_bytes(bytes(1)) sent = test_device.device.protocol.sent[0] assert (sent.msg.to_bytes() == Msg.OutAllLinkUpdate( Msg.OutAllLinkUpdate.Cmd.DELETE, db_flags, test_entry_dev1_ctrl.group, test_entry_dev1_ctrl.addr, bytes(3)).to_bytes()) assert len(sent.handler.next) == 0
def test_delete(self, test_db, test_entry_dev1_ctrl): # delete, no next test_db.add_entry(test_entry_dev1_ctrl) assert len(test_db) == 1 handler = Handler.ModemDbModify(test_db, test_entry_dev1_ctrl) db_flags = Msg.DbFlags( in_use=True, is_controller=test_entry_dev1_ctrl.is_controller, is_last_rec=False) msg = Msg.OutAllLinkUpdate(Msg.OutAllLinkUpdate.Cmd.DELETE, db_flags, test_entry_dev1_ctrl.group, test_entry_dev1_ctrl.addr, data=None, is_ack=True) handler.msg_received(test_db.device.protocol, msg) assert len(test_db) == 0
def test_add(self, test_db, test_entry_dev1_ctrl): # add clean assert len(test_db) == 0 handler = Handler.ModemDbModify(test_db, test_entry_dev1_ctrl) db_flags = Msg.DbFlags( in_use=True, is_controller=test_entry_dev1_ctrl.is_controller, is_last_rec=False) msg = Msg.OutAllLinkUpdate(Msg.OutAllLinkUpdate.Cmd.ADD_CONTROLLER, db_flags, test_entry_dev1_ctrl.group, test_entry_dev1_ctrl.addr, data=bytes(3), is_ack=True) handler.msg_received(test_db.device.protocol, msg) assert len(test_db) == 1 assert test_db.entries[0] == test_entry_dev1_ctrl
def test_prevent_loop(self, test_db, test_entry_dev1_ctrl, caplog): handler = Handler.ModemDbModify(test_db, test_entry_dev1_ctrl_mod, existing_entry=test_entry_dev1_ctrl) handler.is_retry = True db_flags = Msg.DbFlags( in_use=True, is_controller=test_entry_dev1_ctrl.is_controller, is_last_rec=False) msg = Msg.OutAllLinkUpdate(Msg.OutAllLinkUpdate.Cmd.UPDATE, db_flags, test_entry_dev1_ctrl.group, test_entry_dev1_ctrl.addr, data=bytes(3), is_ack=False) handler.msg_received(test_db.device.protocol, msg) # This should fail to prevent infinite loops assert "db update failed" in caplog.text
def test_delete_nak(self, test_db, test_entry_dev1_ctrl, caplog): # delete, no next test_db.add_entry(test_entry_dev1_ctrl) assert len(test_db) == 1 handler = Handler.ModemDbModify(test_db, test_entry_dev1_ctrl) handler._PLM_sent = True handler._PLM_ACK = True db_flags = Msg.DbFlags( in_use=True, is_controller=test_entry_dev1_ctrl.is_controller, is_last_rec=False) msg = Msg.OutAllLinkUpdate(Msg.OutAllLinkUpdate.Cmd.DELETE, db_flags, test_entry_dev1_ctrl.group, test_entry_dev1_ctrl.addr, data=None, is_ack=False) handler.msg_received(test_db.device.protocol, msg) assert len(test_db) == 1 assert "db update failed" in caplog.text
def test_add_nak(self, test_db, test_entry_dev1_ctrl): assert len(test_db) == 0 handler = Handler.ModemDbModify(test_db, test_entry_dev1_ctrl) db_flags = Msg.DbFlags( in_use=True, is_controller=test_entry_dev1_ctrl.is_controller, is_last_rec=False) msg = Msg.OutAllLinkUpdate(Msg.OutAllLinkUpdate.Cmd.ADD_CONTROLLER, db_flags, test_entry_dev1_ctrl.group, test_entry_dev1_ctrl.addr, data=bytes(3), is_ack=False) handler.msg_received(test_db.device.protocol, msg) # entry should be added assert len(test_db) == 1 assert len(test_db.device.protocol.sent) == 1 assert (test_db.device.protocol.sent[0].msg.cmd == Msg.OutAllLinkUpdate.Cmd.UPDATE) assert handler.is_retry
def test_update(self, test_db, test_entry_dev1_ctrl, test_entry_dev1_ctrl_mod): # update clean test_db.add_entry(test_entry_dev1_ctrl) assert len(test_db) == 1 handler = Handler.ModemDbModify(test_db, test_entry_dev1_ctrl_mod, existing_entry=test_entry_dev1_ctrl) db_flags = Msg.DbFlags( in_use=True, is_controller=test_entry_dev1_ctrl.is_controller, is_last_rec=False) msg = Msg.OutAllLinkUpdate(Msg.OutAllLinkUpdate.Cmd.UPDATE, db_flags, test_entry_dev1_ctrl.group, test_entry_dev1_ctrl.addr, data=bytes(3), is_ack=True) handler.msg_received(test_db.device.protocol, msg) assert len(test_db) == 1 assert test_db.entries[0].data == test_entry_dev1_ctrl_mod.data
def test_plm_sent(self, test_db, tmpdir): db_flags = Msg.DbFlags(in_use=True, is_controller=False, is_last_rec=False) handler = Handler.ModemDbSearch(test_db) assert not handler._PLM_sent #Try a message prior to sent msg = Msg.OutAllLinkUpdate(Msg.OutAllLinkUpdate.Cmd.EXISTS, db_flags, 0x01, 0x01, data=None, is_ack=True) ret = handler.msg_received(test_db.device.protocol, msg) assert ret == Msg.UNKNOWN # Signal Sent handler.sending_message(msg) assert handler._PLM_sent #Try a message after sent ret = handler.msg_received(test_db.device.protocol, msg) assert ret == Msg.CONTINUE