Add cgit compatibility testing framework.
[jelmer/dulwich-libgit2.git] / dulwich / tests / compat / test_web.py
1 # test_web.py -- Compatibilty tests for the git web server.
2 # Copyright (C) 2010 Google, Inc.
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; version 2
7 # of the License or (at your option) any later version of
8 # the License.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18 # MA  02110-1301, USA.
19
20 """Compatibilty tests between Dulwich and the cgit HTTP server.
21
22 Warning: these tests should be fairly stable, but when writing/debugging new
23 tests, deadlocks may freeze the test process such that it cannot be Ctrl-C'ed.
24 On *nix, you can kill the tests with Ctrl-Z, "kill %".
25 """
26
27 import sys
28 import threading
29 import unittest
30 from wsgiref import simple_server
31
32 import nose
33
34 from dulwich.repo import (
35     Repo,
36     )
37 from dulwich.server import (
38     GitBackend,
39     )
40 from dulwich.web import (
41     HTTPGitApplication,
42     )
43
44 from dulwich.tests.utils import (
45     open_repo,
46     tear_down_repo,
47     )
48 from server_utils import (
49     ServerTests,
50     ShutdownServerMixIn,
51     )
52 from utils import (
53     CompatTestCase,
54     )
55
56
57 if getattr(simple_server.WSGIServer, 'shutdown', None):
58     WSGIServer = simple_server.WSGIServer
59 else:
60     class WSGIServer(ShutdownServerMixIn, simple_server.WSGIServer):
61         """Subclass of WSGIServer that can be shut down."""
62
63         def __init__(self, *args, **kwargs):
64             # BaseServer is old-style so we have to call both __init__s
65             ShutdownServerMixIn.__init__(self)
66             simple_server.WSGIServer.__init__(self, *args, **kwargs)
67
68         serve = ShutdownServerMixIn.serve_forever
69
70
71 class WebTests(ServerTests):
72     """Base tests for web server tests.
73
74     Contains utility and setUp/tearDown methods, but does non inherit from
75     TestCase so tests are not automatically run.
76     """
77
78     protocol = 'http'
79
80     def _start_server(self, repo):
81         app = self._make_app(GitBackend(repo))
82         dul_server = simple_server.make_server('localhost', 0, app,
83                                                server_class=WSGIServer)
84         threading.Thread(target=dul_server.serve_forever).start()
85         self._server = dul_server
86         _, port = dul_server.socket.getsockname()
87         return port
88
89
90 class SmartWebTestCase(WebTests, CompatTestCase):
91     """Test cases for smart HTTP server."""
92
93     min_git_version = (1, 6, 6)
94
95     def setUp(self):
96         WebTests.setUp(self)
97         CompatTestCase.setUp(self)
98
99     def tearDown(self):
100         WebTests.tearDown(self)
101         CompatTestCase.tearDown(self)
102
103     def _make_app(self, backend):
104         return HTTPGitApplication(backend)
105
106     def test_push_to_dulwich(self):
107         # TODO(dborowitz): enable after merging thin pack fixes.
108         raise nose.SkipTest('Skipping push test due to known pack bug.')
109
110
111 class DumbWebTestCase(WebTests, CompatTestCase):
112     """Test cases for dumb HTTP server."""
113
114     def setUp(self):
115         WebTests.setUp(self)
116         CompatTestCase.setUp(self)
117
118     def tearDown(self):
119         WebTests.tearDown(self)
120         CompatTestCase.tearDown(self)
121
122     def _make_app(self, backend):
123         return HTTPGitApplication(backend, dumb=True)
124
125     def test_push_to_dulwich(self):
126         # Note: remove this if dumb pushing is supported
127         raise nose.SkipTest('Dumb web pushing not supported.')