def test_push_back(self): reader, writer = os.pipe() try: data = 'Lorem ipsum dolor sit.' assert os.write(writer, data) == len(data) loop = EventLoop() state = [1] @loop.push_back_reader(reader, max_block_size=5) def new_block(data, push_back): if state[0] == 1: assert data == 'Lorem' elif state[0] == 2: assert data == ' ipsu' push_back(data) elif state[0] == 3: assert data == ' ipsum dol' push_back('d') push_back('ol') elif state[0] == 4: assert data == 'dolor si' elif state[0] == 5: assert data == 't.' loop.stop() else: assert False state[0] += 1 loop.run() assert state[0] == 6 finally: os.close(reader) os.close(writer)
def test_pipe(self): reader, writer = os.pipe() try: loop = EventLoop() nb_reads = [0] nb_writes = [0] duration = .1 interval = .0095 expected_nb = 10 assert expected_nb == duration // interval # Avoid a race condition between the loop stop and the last read. assert expected_nb < duration / interval start = time.time() loop.add_timer(duration)(loop.stop) @loop.add_timer(interval, repeat=True) def write_something(): assert os.write(writer, 'foo') == 3 nb_writes[0] += 1 @loop.block_reader(reader) def incoming(data): assert data == 'foo' nb_reads[0] += 1 loop.run() assert round(time.time() - start, 2) == duration assert nb_writes[0] == expected_nb, nb_writes assert nb_reads[0] == expected_nb, nb_reads finally: os.close(reader) os.close(writer)
def _simple(self, reader, writer): loop = EventLoop() nb_reads = [0] @loop.block_reader(reader) def incoming(data): assert data == 'foo' nb_reads[0] += 1 loop.stop() assert os.write(writer, 'foo') == 3 loop.run() assert nb_reads[0] == 1
def test_timing(self): reader, writer = os.pipe() try: loop = EventLoop() data = [ 'Lorem ipsum\n', 'dolor\nsit\namet, ', 'consectetur', ' adipiscing ', 'elit.\nAliquam magna dolor, ', # no newline character at the end ] # Reverse because list.pop() pops at the end. data = data[::-1] @loop.add_timer(.01, repeat=True) def slow_write(): if data: os.write(writer, data.pop()) else: loop.stop() lines = [] @loop.line_reader(reader) def new_line(line): lines.append(line) expected_time = { 'L': .01, 'd': .02, 's': .02, 'a': .05}[line[0]] assert round(time.time() - start, 2) == expected_time time.sleep(.02) # Reset so that the timing is correct in spite of the sleep we # just did. slow_write.reset() start = time.time() loop.run() assert lines == [ 'Lorem ipsum\n', 'dolor\n', 'sit\n', 'amet, consectetur adipiscing elit.\n' ] finally: os.close(reader) os.close(writer)
def test_packets(self): reader, writer = os.pipe() try: loop = EventLoop() original_packets = [ 'foo', '', 'Lorem ipsum dolor sit amet.', '42', ] packets = [] def callback(packet): packets.append(packet) assert packet_reader.dropped_bytes == { 1: 0, 2: 1, 3: 3, 4: 6 }[len(packets)] if len(packets) == len(original_packets): loop.stop() def write(data): assert os.write(writer, data) == len(data) for i, packet in enumerate(original_packets): write('blah'[:i]) # non-packet garbage write(PacketReader.PACKET_DELIMITER) write(chr(len(packet) + 1)) write(packet) # Choose a very small block size on purpose to (hopefully) # test more code paths such as half packets packet_reader = PacketReader(loop, reader, callback, max_block_size=3) loop.run() assert packets == original_packets finally: os.close(reader) os.close(writer)
def test_line_reader(self): reader, writer = os.pipe() try: loop = EventLoop() data = [ 'Lorem ipsum\n', 'dolor\nsit\namet, ', 'consectetur', ' adipiscing ', 'elit.\nAliquam magna dolor, ', # no newline character at the end ] # Reverse because list.pop() pops at the end. data = data[::-1] start = time.time() @loop.add_timer(.01, repeat=True) def slow_write(): if data: d = data.pop() assert os.write(writer, d) == len(d) else: loop.stop() lines = [] loop.line_reader(reader, max_block_size=5)(lines.append) loop.run() assert lines == [ 'Lorem ipsum\n', 'dolor\n', 'sit\n', 'amet, consectetur adipiscing elit.\n' ] finally: os.close(reader) os.close(writer)
logging.info("src fd:%s listing server port:%s", self.server_sock.fileno(), port) self.loop = None # type: EventLoop def handle_event(self, sock, fd, mode): # type: (socket.socket,int,int) -> None if sock == self.server_sock: local_sock, addr = sock.accept() logging.info("receive event fd:%s addr:%s", local_sock.fileno(), addr) TCPEvent(local_sock, self.loop) else: raise Exception("no this socket") def add_loop(self, loop): # type: (EventLoop) -> None self.loop = loop loop.add(self.server_sock, POLL_IN | POLL_ERR, self) if __name__ == '__main__': server_port = 1082 logging.basicConfig( level=logging.DEBUG, format= '%(asctime)s,%(msecs)d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s' ) loop = EventLoop() TCPServerEvent(server_port).add_loop(loop) loop.run()