def test_waitForResponse(self): pkts = [AP.PingPDU(True, 1, 2, 3), AP.ResponsePDU(True, 10, 20, 30, 0, 0, 0), AP.ResponsePDU(True, 5, 23, 100, 0, 0, 0), AP.ResponsePDU(True, 42, 23, 100, 0, 0, 0), AP.ResponsePDU(True, 100, 200, 300, 0, 0, 0)] opkt = AP.PingPDU(True, 42, 23, 100) def packetEater_jig(self): self.receivedPackets.append(pkts.pop(0)) p = AX.PacketControl(None, None) p.packetEater = (lambda : packetEater_jig(p)) p.spinGap = 0 # Test with session id match required ret = p.waitForResponse(opkt) self.assertEqual(pkts, [AP.ResponsePDU(True, 100, 200, 300, 0, 0, 0)]) self.assertEqual(ret, AP.ResponsePDU(True, 42, 23, 100, 0, 0, 0)) # Test ignoring session id pkts = [AP.PingPDU(True, 1, 2, 3), AP.ResponsePDU(True, 10, 20, 30, 0, 0, 0), AP.ResponsePDU(True, 5, 23, 100, 0, 0, 0), AP.ResponsePDU(True, 42, 23, 100, 0, 0, 0)] ret = p.waitForResponse(opkt, True) self.assertEqual(pkts, [AP.ResponsePDU(True, 42, 23, 100, 0, 0, 0)]) self.assertEqual(ret, AP.ResponsePDU(True, 5, 23, 100, 0, 0, 0))
def test_handle_ResponsePDU(self): cbreturn = [] def callback(pkt, origpkt): cbreturn.append((pkt, origpkt)) opkt = AP.PingPDU(True, 42, 4, 50) incorrect_rpkt = AP.ResponsePDU(True, 23, 1, 99, 0, 0, 0) correct_rpkt = AP.ResponsePDU(True, 42, 4, 50, 0, 0, 0) sock = jigs.SocketJig() p = AX.PacketControl(sock, None) p.sessionID = 42 p.packetLog = {(42, 4, 50): (30.0, opkt, callback)} # Test non-expected response (likely to happen in a timeout) p.handle_ResponsePDU(incorrect_rpkt) self.assertEqual(p.packetLog, {(42, 4, 50): (30.0, opkt, callback)}) # Test expected response p.handle_ResponsePDU(correct_rpkt) self.assertEqual(p.packetLog, {})
def test_sendPacket(self): sock = jigs.SocketJig() p = AX.PacketControl(sock, None) testpkt = AP.PingPDU(True, 0, 1, 2, "fake") # Test not expecting reply p.sendPacket(testpkt, False) self.assertEqual(sock.data, [b"\x01\r\x18\x00" b"\x00\x00\x00\x00\x00\x00\x00\x01" b"\x00\x00\x00\x02\x00\x00\x00\x08" b"\x00\x00\x00\x04fake"]) self.assertEqual(p.packetLog, {}) sock.data = [] # Test expecting reply p.sendPacket(testpkt, True, callback="foo") self.assertEqual(sock.data, [b"\x01\r\x18\x00" b"\x00\x00\x00\x00\x00\x00\x00\x01" b"\x00\x00\x00\x02\x00\x00\x00\x08" b"\x00\x00\x00\x04fake"]) self.assertEqual(p.packetLog, {(0, 1, 2): (30.0, testpkt, "foo")})
def test__doloop(self): # need jigs for # time pkts = [] # recpTimes = [] handler_calls = [0] def packetEater_jig(self): self.receivedPackets = pkts self.lastReception = recpTime def pinghandler_jig(self): handler_calls[0] += 1 faketimemod = jigs.TimeModuleJig() sock = jigs.SocketJig() p = AX.PacketControl(sock, None) p.packetEater = (lambda: packetEater_jig(p)) p.checkResponses = (lambda: None) p.pduHandlers[AP.PDU_PING] = pinghandler_jig p.sessionID = 42 try: timetemp = AX.time AX.time = faketimemod # Test first time, no reception recpTime = None faketimemod.time_returns = [] p._doloop() self.assertEqual(sock.data, []) # Test wrong session ID pkts = [AP.PingPDU(True, 13, 0, 0)] recpTime = 50 faketimemod.time_returns = [55] p._doloop() self.assertEqual(len(sock.data), 1) sentPkt = AP.decode_packet(sock.data[0])[0] respPkt = AP.ResponsePDU(True, 13, 0, 0, 0, AP.RSPERR_NOT_OPEN, 0) self.assertEqual(sentPkt, respPkt) # Test unimplemented packet type faketimemod.time_returns = [55] sock.data = [] pkts = [AP.PingPDU(True, 42, 0, 0)] pkts[0].pduType = 1337 # spoof the type p._doloop() self.assertEqual(sock.data, []) self.assertEqual(handler_calls, [0]) # Test successful faketimemod.time_returns = [55] sock.data = [] pkts = [AP.PingPDU(True, 42, 0, 0)] p._doloop() self.assertEqual(sock.data, []) self.assertEqual(handler_calls, [1]) # Test pinging handler_calls = [0] faketimemod.time_returns = [120] sock.data = [] p._doloop() self.assertEqual(len(sock.data), 1) sentPkt = AP.decode_packet(sock.data[0])[0] respPkt = AP.PingPDU(True, 42, 5, 1) self.assertEqual(sentPkt, respPkt) self.assertEqual(handler_calls, [0]) finally: AX.time = timetemp