Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.http_unittest.py @ bf9bd8dd

History | View | Annotate | Download (6 kB)

1
#!/usr/bin/python
2
#
3

    
4
# Copyright (C) 2007, 2008 Google Inc.
5
#
6
# This program is free software; you can redistribute it and/or modify
7
# it under the terms of the GNU General Public License as published by
8
# the Free Software Foundation; either version 2 of the License, or
9
# (at your option) any later version.
10
#
11
# This program is distributed in the hope that it will be useful, but
12
# WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
# General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License
17
# along with this program; if not, write to the Free Software
18
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19
# 02110-1301, USA.
20

    
21

    
22
"""Script for unittesting the http module"""
23

    
24

    
25
import os
26
import unittest
27
import time
28

    
29
from ganeti import http
30

    
31
import ganeti.http.server
32
import ganeti.http.client
33
import ganeti.http.auth
34

    
35

    
36
class TestStartLines(unittest.TestCase):
37
  """Test cases for start line classes"""
38

    
39
  def testClientToServerStartLine(self):
40
    """Test client to server start line (HTTP request)"""
41
    start_line = http.HttpClientToServerStartLine("GET", "/", "HTTP/1.1")
42
    self.assertEqual(str(start_line), "GET / HTTP/1.1")
43

    
44
  def testServerToClientStartLine(self):
45
    """Test server to client start line (HTTP response)"""
46
    start_line = http.HttpServerToClientStartLine("HTTP/1.1", 200, "OK")
47
    self.assertEqual(str(start_line), "HTTP/1.1 200 OK")
48

    
49

    
50
class TestMisc(unittest.TestCase):
51
  """Miscellaneous tests"""
52

    
53
  def _TestDateTimeHeader(self, gmnow, expected):
54
    self.assertEqual(http.server._DateTimeHeader(gmnow=gmnow), expected)
55

    
56
  def testDateTimeHeader(self):
57
    """Test ganeti.http._DateTimeHeader"""
58
    self._TestDateTimeHeader((2008, 1, 2, 3, 4, 5, 3, 0, 0),
59
                             "Thu, 02 Jan 2008 03:04:05 GMT")
60
    self._TestDateTimeHeader((2008, 1, 1, 0, 0, 0, 0, 0, 0),
61
                             "Mon, 01 Jan 2008 00:00:00 GMT")
62
    self._TestDateTimeHeader((2008, 12, 31, 0, 0, 0, 0, 0, 0),
63
                             "Mon, 31 Dec 2008 00:00:00 GMT")
64
    self._TestDateTimeHeader((2008, 12, 31, 23, 59, 59, 0, 0, 0),
65
                             "Mon, 31 Dec 2008 23:59:59 GMT")
66
    self._TestDateTimeHeader((2008, 12, 31, 0, 0, 0, 6, 0, 0),
67
                             "Sun, 31 Dec 2008 00:00:00 GMT")
68

    
69
  def testHttpServerRequest(self):
70
    """Test ganeti.http.server._HttpServerRequest"""
71
    fake_request = http.HttpMessage()
72
    fake_request.start_line = \
73
      http.HttpClientToServerStartLine("GET", "/", "HTTP/1.1")
74
    server_request = http.server._HttpServerRequest(fake_request)
75

    
76
    # These are expected by users of the HTTP server
77
    self.assert_(hasattr(server_request, "request_method"))
78
    self.assert_(hasattr(server_request, "request_path"))
79
    self.assert_(hasattr(server_request, "request_headers"))
80
    self.assert_(hasattr(server_request, "request_body"))
81
    self.assert_(isinstance(server_request.resp_headers, dict))
82
    self.assert_(hasattr(server_request, "private"))
83

    
84
  def testServerSizeLimits(self):
85
    """Test HTTP server size limits"""
86
    message_reader_class = http.server._HttpClientToServerMessageReader
87
    self.assert_(message_reader_class.START_LINE_LENGTH_MAX > 0)
88
    self.assert_(message_reader_class.HEADER_LENGTH_MAX > 0)
89

    
90
  def testClientSizeLimits(self):
91
    """Test HTTP client size limits"""
92
    message_reader_class = http.client._HttpServerToClientMessageReader
93
    self.assert_(message_reader_class.START_LINE_LENGTH_MAX > 0)
94
    self.assert_(message_reader_class.HEADER_LENGTH_MAX > 0)
95

    
96

    
97
class _FakeRequestAuth(http.auth.HttpServerRequestAuthentication):
98
  def __init__(self, realm):
99
    http.auth.HttpServerRequestAuthentication.__init__(self)
100

    
101
    self.realm = realm
102

    
103
  def GetAuthRealm(self, req):
104
    return self.realm
105

    
106

    
107
class TestAuth(unittest.TestCase):
108
  """Authentication tests"""
109

    
110
  hsra = http.auth.HttpServerRequestAuthentication
111

    
112
  def testConstants(self):
113
    self.assertEqual(self.hsra._CLEARTEXT_SCHEME,
114
                     self.hsra._CLEARTEXT_SCHEME.upper())
115
    self.assertEqual(self.hsra._HA1_SCHEME,
116
                     self.hsra._HA1_SCHEME.upper())
117

    
118
  def _testVerifyBasicAuthPassword(self, realm, user, password, expected):
119
    ra = _FakeRequestAuth(realm)
120

    
121
    return ra.VerifyBasicAuthPassword(None, user, password, expected)
122

    
123

    
124
  def testVerifyBasicAuthPassword(self):
125
    tvbap = self._testVerifyBasicAuthPassword
126

    
127
    good_pws = ["pw", "pw{", "pw}", "pw{}", "pw{x}y", "}pw",
128
                "0", "123", "foo...:xyz", "TeST"]
129

    
130
    for pw in good_pws:
131
      # Try cleartext passwords
132
      self.assert_(tvbap("abc", "user", pw, pw))
133
      self.assert_(tvbap("abc", "user", pw, "{cleartext}" + pw))
134
      self.assert_(tvbap("abc", "user", pw, "{ClearText}" + pw))
135
      self.assert_(tvbap("abc", "user", pw, "{CLEARTEXT}" + pw))
136

    
137
      # Try with invalid password
138
      self.failIf(tvbap("abc", "user", pw, "something"))
139

    
140
      # Try with invalid scheme
141
      self.failIf(tvbap("abc", "user", pw, "{000}" + pw))
142
      self.failIf(tvbap("abc", "user", pw, "{unk}" + pw))
143
      self.failIf(tvbap("abc", "user", pw, "{Unk}" + pw))
144
      self.failIf(tvbap("abc", "user", pw, "{UNK}" + pw))
145

    
146
    # Try with invalid scheme format
147
    self.failIf(tvbap("abc", "user", "pw", "{something"))
148

    
149
    # Hash is MD5("user:This is only a test:pw")
150
    self.assert_(tvbap("This is only a test", "user", "pw",
151
                       "{ha1}92ea58ae804481498c257b2f65561a17"))
152
    self.assert_(tvbap("This is only a test", "user", "pw",
153
                       "{HA1}92ea58ae804481498c257b2f65561a17"))
154

    
155
    self.failIf(tvbap(None, "user", "pw",
156
                      "{HA1}92ea58ae804481498c257b2f65561a17"))
157
    self.failIf(tvbap("Admin area", "user", "pw",
158
                      "{HA1}92ea58ae804481498c257b2f65561a17"))
159
    self.failIf(tvbap("This is only a test", "someone", "pw",
160
                      "{HA1}92ea58ae804481498c257b2f65561a17"))
161
    self.failIf(tvbap("This is only a test", "user", "something",
162
                      "{HA1}92ea58ae804481498c257b2f65561a17"))
163

    
164

    
165
if __name__ == '__main__':
166
  unittest.main()