class TestRequestStream(ScalyrTestCase):
    def setUp(self):
        super(TestRequestStream, self).setUp()
        self.__fake_socket = FakeSocket()
        self.__fake_run_state = FakeRunState()

        parser = LineRequestParser(10)
        self.__request_stream = RequestStream(self.__fake_socket,
                                              parser.parse_request,
                                              max_buffer_size=10,
                                              max_request_size=10)

    def test_basic_case(self):
        # Basic case of just a single line.
        self.__fake_socket.add_input('Hi there\n')
        self.assertEquals(self.read_request(), 'Hi there\n')
        self.assertEquals(self.total_times_slept(), 1)
        self.assertEquals(self.buffer_size(), 0)

        self.assertIsNone(self.read_request())

    def test_multiple_lines(self):
        self.__fake_socket.add_input('Hi\nBye\nOk\n')
        self.assertEquals(self.read_request(), 'Hi\n')
        self.assertEquals(self.buffer_size(), 10)
        self.assertEquals(self.read_request(), 'Bye\n')
        self.assertEquals(self.read_request(), 'Ok\n')
        self.assertEquals(self.total_times_slept(), 1)
        self.assertEquals(self.buffer_size(), 0)
        self.assertFalse(self.at_end())

        self.assertIsNone(self.read_request())

    def test_broken_lines(self):
        self.__fake_socket.add_input('Hi there')
        self.assertIsNone(self.read_request())
        self.__fake_socket.add_input('\n')
        self.assertEquals(self.read_request(), 'Hi there\n')
        self.assertEquals(self.total_times_slept(), 2)
        self.assertEquals(self.buffer_size(), 0)
        self.assertFalse(self.at_end())

    def test_request_too_long(self):
        self.__fake_socket.add_input('0123456789')
        self.assertRaises(RequestSizeExceeded, self.read_request)
        self.assertFalse(self.at_end())

    def test_full_compaction(self):
        self.__fake_socket.add_input('012\n345678')
        self.assertEquals(self.read_request(), '012\n')
        self.assertEquals(self.total_times_slept(), 1)
        self.assertEquals(self.buffer_size(), 10)
        self.assertFalse(self.at_end())

        self.assertIsNone(self.read_request())
        self.assertEquals(self.buffer_size(), 6)

        self.__fake_socket.add_input('\n')
        self.assertEquals(self.read_request(), '345678\n')
        self.assertEquals(self.total_times_slept(), 3)
        self.assertEquals(self.buffer_size(), 0)

    def test_close(self):
        self.__fake_socket.add_input('Hi there\n')
        self.__fake_socket.close()

        self.assertEquals(self.read_request(), 'Hi there\n')
        self.assertEquals(self.total_times_slept(), 1)
        self.assertEquals(self.buffer_size(), 0)
        self.assertIsNone(self.read_request())
        self.assertTrue(self.at_end())
        self.assertEquals(self.total_times_slept(), 2)

    def read_request(self):
        return self.__request_stream.read_request(
            run_state=self.__fake_run_state)

    def total_times_slept(self):
        return self.__fake_run_state.total_times_slept

    def buffer_size(self):
        return self.__request_stream.get_buffer_size()

    def at_end(self):
        return self.__request_stream.at_end()
class TestRequestStream(ScalyrTestCase):
    def setUp(self):
        self.__fake_socket = FakeSocket()
        self.__fake_run_state = FakeRunState()

        parser = LineRequestParser(10)
        self.__request_stream = RequestStream(self.__fake_socket, parser.parse_request, max_buffer_size=10,
                                              max_request_size=10)

    def test_basic_case(self):
        # Basic case of just a single line.
        self.__fake_socket.add_input('Hi there\n')
        self.assertEquals(self.read_request(), 'Hi there\n')
        self.assertEquals(self.total_times_slept(), 1)
        self.assertEquals(self.buffer_size(), 0)

        self.assertIsNone(self.read_request())

    def test_multiple_lines(self):
        self.__fake_socket.add_input('Hi\nBye\nOk\n')
        self.assertEquals(self.read_request(), 'Hi\n')
        self.assertEquals(self.buffer_size(), 10)
        self.assertEquals(self.read_request(), 'Bye\n')
        self.assertEquals(self.read_request(), 'Ok\n')
        self.assertEquals(self.total_times_slept(), 1)
        self.assertEquals(self.buffer_size(), 0)
        self.assertFalse(self.at_end())

        self.assertIsNone(self.read_request())

    def test_broken_lines(self):
        self.__fake_socket.add_input('Hi there')
        self.assertIsNone(self.read_request())
        self.__fake_socket.add_input('\n')
        self.assertEquals(self.read_request(), 'Hi there\n')
        self.assertEquals(self.total_times_slept(), 2)
        self.assertEquals(self.buffer_size(), 0)
        self.assertFalse(self.at_end())

    def test_request_too_long(self):
        self.__fake_socket.add_input('0123456789')
        self.assertRaises(RequestSizeExceeded, self.read_request)
        self.assertFalse(self.at_end())
    
    def test_full_compaction(self):
        self.__fake_socket.add_input('012\n345678')
        self.assertEquals(self.read_request(), '012\n')
        self.assertEquals(self.total_times_slept(), 1)
        self.assertEquals(self.buffer_size(), 10)
        self.assertFalse(self.at_end())

        self.assertIsNone(self.read_request())
        self.assertEquals(self.buffer_size(), 6)

        self.__fake_socket.add_input('\n')
        self.assertEquals(self.read_request(), '345678\n')
        self.assertEquals(self.total_times_slept(), 3)
        self.assertEquals(self.buffer_size(), 0)

    def test_close(self):
        self.__fake_socket.add_input('Hi there\n')
        self.__fake_socket.close()

        self.assertEquals(self.read_request(), 'Hi there\n')
        self.assertEquals(self.total_times_slept(), 1)
        self.assertEquals(self.buffer_size(), 0)
        self.assertIsNone(self.read_request())
        self.assertTrue(self.at_end())
        self.assertEquals(self.total_times_slept(), 2)

    def read_request(self):
        return self.__request_stream.read_request(run_state=self.__fake_run_state)

    def total_times_slept(self):
        return self.__fake_run_state.total_times_slept

    def buffer_size(self):
        return self.__request_stream.get_buffer_size()

    def at_end(self):
        return self.__request_stream.at_end()