def send(self, data): header = Header() header.size = len(data) header.sequence_number = self.send_sequence data = header.to_bytes() + data while True: #TODO: this could be done more elegantly if(len(self.workers) == 0): Log.log("Shutdown multiplexer. No workers found") self.cleanup() sys.exit(0) worker = self.workers[self.send_index][0] #Increment the sequence number and the send_index to send along another worker self.send_index = (1 + self.send_index) % len(self.workers) try: worker.write(data) worker.flush() break except IOError as e: if e.errno == 11: #TODO: whut. Why did I do this? pass else: raise e self.send_sequence = self.send_sequence + 1
def test_header(): header = Header() assert(header.size == 0) assert(header.sequence_number == 0) header.size = 10 header.sequence_number = 23 assert(header.to_string() == "SIZE=10&SEQUENCE=23\n")
def test_worker(): LEFT_WORKER_WRITE = "test_write.fifo" LEFT_WORKER_READ = "test_read.fifo" try: os.mkfifo(LEFT_WORKER_READ) except FileExistsError: pass try: os.mkfifo(LEFT_WORKER_WRITE) except FileExistsError: pass pid = os.fork() if pid == 0: left_read = open(LEFT_WORKER_READ, "rb") left_write = open(LEFT_WORKER_WRITE, "wb") left_worker = worker.Worker(1, left_read, left_write) left_worker.poll() else: pid = os.fork() if pid == 0: right_write = open(LEFT_WORKER_READ, "wb") right_read = open(LEFT_WORKER_WRITE, "rb") right_worker = worker.Worker(2, right_read, right_write) right_worker.poll() else: #these will be fifos.. left_multi_write = worker.Worker.get_read_path(str(1)) left_multi_read = worker.Worker.get_write_path(str(1)) try: os.mkfifo(left_multi_write) except FileExistsError: pass try: os.mkfifo(left_multi_read) except FileExistsError: pass right_multi_write = worker.Worker.get_read_path(str(2)) right_multi_read = worker.Worker.get_write_path(str(2)) try: os.mkfifo(right_multi_write) except FileExistsError: pass try: os.mkfifo(right_multi_read) except FileExistsError: pass left_multi_read = open(left_multi_read, "rb") left_multi_write = open(left_multi_write, "wb") right_multi_read = open(right_multi_read, "rb") right_multi_write = open(right_multi_write, "wb") # left_multi_read = left_multi_read.buffer # left_multi_write = left_multi_write.buffer # right_multi_read = right_multi_read.buffer # right_multi_write = right_multi_write.buffer to_send = bytes("helloworld\n", 'UTF-8') header = Header() header.sequence_number = 1 header.size = len(to_send) left_multi_write.write(b''.join([header.to_bytes(), to_send])) left_multi_write.flush() assert(right_multi_read.readline() == header.to_bytes()) assert(right_multi_read.readline() == to_send) right_multi_write.write(b''.join([header.to_bytes(), to_send])) right_multi_write.flush() assert(left_multi_read.readline() == header.to_bytes()) assert(left_multi_read.readline() == to_send) os.unlink(LEFT_WORKER_WRITE) os.unlink(LEFT_WORKER_READ)