diff --git a/lib/http/server.py b/lib/http/server.py index b9e77cee79b4f57c2cc64c008e4e19567b656b64..2b87d6716abad6e447de595545258d8e35a12180 100644 --- a/lib/http/server.py +++ b/lib/http/server.py @@ -59,11 +59,15 @@ DEFAULT_ERROR_MESSAGE = """\ """ -def _DateTimeHeader(): +def _DateTimeHeader(gmnow=None): """Return the current date and time formatted for a message header. + The time MUST be in the GMT timezone. + """ - (year, month, day, hh, mm, ss, wd, _, _) = time.gmtime() + if gmnow is None: + gmnow = time.gmtime() + (year, month, day, hh, mm, ss, wd, _, _) = gmnow return ("%s, %02d %3s %4d %02d:%02d:%02d GMT" % (WEEKDAYNAME[wd], day, MONTHNAME[month], year, hh, mm, ss)) diff --git a/test/ganeti.http_unittest.py b/test/ganeti.http_unittest.py index c10c0000e4b7c40051f94bb2109877a2998c9ca0..da71f7f7aaec374b91f58954d2abee117269965a 100755 --- a/test/ganeti.http_unittest.py +++ b/test/ganeti.http_unittest.py @@ -24,13 +24,72 @@ import os import unittest -import tempfile import time from ganeti import http +import ganeti.http.server +import ganeti.http.client -# TODO: Write unittests + +class TestStartLines(unittest.TestCase): + """Test cases for start line classes""" + + def testClientToServerStartLine(self): + """Test client to server start line (HTTP request)""" + start_line = http.HttpClientToServerStartLine("GET", "/", "HTTP/1.1") + self.assertEqual(str(start_line), "GET / HTTP/1.1") + + def testServerToClientStartLine(self): + """Test server to client start line (HTTP response)""" + start_line = http.HttpServerToClientStartLine("HTTP/1.1", 200, "OK") + self.assertEqual(str(start_line), "HTTP/1.1 200 OK") + + +class TestMisc(unittest.TestCase): + """Miscellaneous tests""" + + def _TestDateTimeHeader(self, gmnow, expected): + self.assertEqual(http.server._DateTimeHeader(gmnow=gmnow), expected) + + def testDateTimeHeader(self): + """Test ganeti.http._DateTimeHeader""" + self._TestDateTimeHeader((2008, 1, 2, 3, 4, 5, 3, 0, 0), + "Thu, 02 Jan 2008 03:04:05 GMT") + self._TestDateTimeHeader((2008, 1, 1, 0, 0, 0, 0, 0, 0), + "Mon, 01 Jan 2008 00:00:00 GMT") + self._TestDateTimeHeader((2008, 12, 31, 0, 0, 0, 0, 0, 0), + "Mon, 31 Dec 2008 00:00:00 GMT") + self._TestDateTimeHeader((2008, 12, 31, 23, 59, 59, 0, 0, 0), + "Mon, 31 Dec 2008 23:59:59 GMT") + self._TestDateTimeHeader((2008, 12, 31, 0, 0, 0, 6, 0, 0), + "Sun, 31 Dec 2008 00:00:00 GMT") + + def testHttpServerRequest(self): + """Test ganeti.http.server._HttpServerRequest""" + fake_request = http.HttpMessage() + fake_request.start_line = \ + http.HttpClientToServerStartLine("GET", "/", "HTTP/1.1") + server_request = http.server._HttpServerRequest(fake_request) + + # These are expected by users of the HTTP server + self.assert_(hasattr(server_request, "request_method")) + self.assert_(hasattr(server_request, "request_path")) + self.assert_(hasattr(server_request, "request_headers")) + self.assert_(hasattr(server_request, "request_body")) + self.assert_(isinstance(server_request.resp_headers, dict)) + + def testServerSizeLimits(self): + """Test HTTP server size limits""" + message_reader_class = http.server._HttpClientToServerMessageReader + self.assert_(message_reader_class.START_LINE_LENGTH_MAX > 0) + self.assert_(message_reader_class.HEADER_LENGTH_MAX > 0) + + def testClientSizeLimits(self): + """Test HTTP client size limits""" + message_reader_class = http.client._HttpServerToClientMessageReader + self.assert_(message_reader_class.START_LINE_LENGTH_MAX > 0) + self.assert_(message_reader_class.HEADER_LENGTH_MAX > 0) if __name__ == '__main__':