def run(): length = len(data) queue_pid = os.fork() if queue_pid == 0: signal.alarm(120) msgq.setup_signalsock() msgq.register_socket(queue) msgq.run() msgq.cleanup_signalsock() else: try: def killall(signum, frame): os.kill(queue_pid, signal.SIGTERM) os._exit(1) signal.signal(signal.SIGALRM, killall) msg = msgq.preparemsg({"type" : "ping"}, data) now = time.clock() while time.clock() - now < 0.2: out.sendall(msg) # Check the answer (routing, received) = msgq.read_packet(out.fileno(), out) self.assertEqual({"type" : "pong"}, bundy.cc.message.from_wire(routing)) self.assertEqual(data, received) finally: os.kill(queue_pid, signal.SIGTERM)
def run(): length = len(data) queue_pid = os.fork() if queue_pid == 0: signal.alarm(120) msgq.setup_signalsock() msgq.register_socket(queue) msgq.run() msgq.cleanup_signalsock() else: try: def killall(signum, frame): os.kill(queue_pid, signal.SIGTERM) os._exit(1) signal.signal(signal.SIGALRM, killall) msg = msgq.preparemsg({"type": "ping"}, data) now = time.clock() while time.clock() - now < 0.2: out.sendall(msg) # Check the answer (routing, received) = msgq.read_packet(out.fileno(), out) self.assertEqual({"type": "pong"}, bundy.cc.message.from_wire(routing)) self.assertEqual(data, received) finally: os.kill(queue_pid, signal.SIGTERM)
def do_send(self, write, read, control_write, control_read, expect_arrive=True, expect_send_exception=None): """ Makes a msgq object that is talking to itself, run it in a separate thread so we can use and test run(). It is given two sets of connected sockets; write/read, and control_write/control_read. The former may be throwing errors and mangle data to test msgq. The second is mainly used to send msgq the stop command. (Note that the terms 'read' and 'write' are from the msgq point of view, so the test itself writes to 'control_read') Parameters: write: a socket that is used to send the data to read: a socket that is used to read the data from control_write: a second socket for communication with msgq control_read: a second socket for communication with msgq expect_arrive: if True, the read socket is read from, and the data that is read is expected to be the same as the data that has been sent to the write socket. expect_send_exception: if not None, this is the exception that is expected to be raised by msgq """ # Some message and envelope data to send and check env = b'{"env": "foo"}' msg = b'{"msg": "bar"}' msgq = MsgQ() # Don't need a listen_socket msgq.listen_socket = DummySocket msgq.setup_signalsock() msgq.register_socket(write) msgq.register_socket(control_write) # Queue the message for sending msgq.sendmsg(write, env, msg) # Run it in a thread msgq_thread = MsgQThread(msgq) # If we're done, just kill it msgq_thread.start() if expect_arrive: (recv_env, recv_msg) = msgq.read_packet(read.fileno(), read) self.assertEqual(env, recv_env) self.assertEqual(msg, recv_msg) # Tell msgq to stop msg = msgq.preparemsg({"type" : "stop"}) control_read.sendall(msg) # Wait for thread to stop if it hasn't already. # Put in a (long) timeout; the thread *should* stop, but if it # does not, we don't want the test to hang forever msgq_thread.join(60) # Fail the test if it didn't stop self.assertFalse(msgq_thread.isAlive(), "Thread did not stop") # Clean up some internals of msgq (usually called as part of # shutdown, but we skip that one here) msgq.cleanup_signalsock() # Check the exception from the thread, if any # First, if we didn't expect it; reraise it (to make test fail and # show the stacktrace for debugging) if expect_send_exception is None: if msgq_thread.caught_exception is not None: raise msgq_thread.caught_exception else: # If we *did* expect it, fail it there was none self.assertIsNotNone(msgq_thread.caught_exception)
def do_send(self, write, read, control_write, control_read, expect_arrive=True, expect_send_exception=None): """ Makes a msgq object that is talking to itself, run it in a separate thread so we can use and test run(). It is given two sets of connected sockets; write/read, and control_write/control_read. The former may be throwing errors and mangle data to test msgq. The second is mainly used to send msgq the stop command. (Note that the terms 'read' and 'write' are from the msgq point of view, so the test itself writes to 'control_read') Parameters: write: a socket that is used to send the data to read: a socket that is used to read the data from control_write: a second socket for communication with msgq control_read: a second socket for communication with msgq expect_arrive: if True, the read socket is read from, and the data that is read is expected to be the same as the data that has been sent to the write socket. expect_send_exception: if not None, this is the exception that is expected to be raised by msgq """ # Some message and envelope data to send and check env = b'{"env": "foo"}' msg = b'{"msg": "bar"}' msgq = MsgQ() # Don't need a listen_socket msgq.listen_socket = DummySocket msgq.setup_signalsock() msgq.register_socket(write) msgq.register_socket(control_write) # Queue the message for sending msgq.sendmsg(write, env, msg) # Run it in a thread msgq_thread = MsgQThread(msgq) # If we're done, just kill it msgq_thread.start() if expect_arrive: (recv_env, recv_msg) = msgq.read_packet(read.fileno(), read) self.assertEqual(env, recv_env) self.assertEqual(msg, recv_msg) # Tell msgq to stop msg = msgq.preparemsg({"type": "stop"}) control_read.sendall(msg) # Wait for thread to stop if it hasn't already. # Put in a (long) timeout; the thread *should* stop, but if it # does not, we don't want the test to hang forever msgq_thread.join(60) # Fail the test if it didn't stop self.assertFalse(msgq_thread.isAlive(), "Thread did not stop") # Clean up some internals of msgq (usually called as part of # shutdown, but we skip that one here) msgq.cleanup_signalsock() # Check the exception from the thread, if any # First, if we didn't expect it; reraise it (to make test fail and # show the stacktrace for debugging) if expect_send_exception is None: if msgq_thread.caught_exception is not None: raise msgq_thread.caught_exception else: # If we *did* expect it, fail it there was none self.assertIsNotNone(msgq_thread.caught_exception)