Exemplo n.º 1
0
 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)
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
    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)
Exemplo n.º 5
0
    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)
Exemplo n.º 6
0
 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)
Exemplo n.º 7
0
        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()