1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 package org.eclipse.jgit.http.test;
44
45 import static org.junit.Assert.assertTrue;
46 import static org.junit.Assert.fail;
47
48 import java.util.Collection;
49 import java.util.Collections;
50
51 import javax.servlet.http.HttpServletRequest;
52
53 import org.eclipse.jetty.servlet.ServletContextHandler;
54 import org.eclipse.jetty.servlet.ServletHolder;
55 import org.eclipse.jgit.errors.CorruptObjectException;
56 import org.eclipse.jgit.errors.RepositoryNotFoundException;
57 import org.eclipse.jgit.errors.TooLargePackException;
58 import org.eclipse.jgit.errors.TransportException;
59 import org.eclipse.jgit.http.server.GitServlet;
60 import org.eclipse.jgit.http.server.resolver.DefaultReceivePackFactory;
61 import org.eclipse.jgit.junit.TestRepository;
62 import org.eclipse.jgit.junit.http.HttpTestCase;
63 import org.eclipse.jgit.lib.AnyObjectId;
64 import org.eclipse.jgit.lib.Constants;
65 import org.eclipse.jgit.lib.NullProgressMonitor;
66 import org.eclipse.jgit.lib.ObjectChecker;
67 import org.eclipse.jgit.lib.Repository;
68 import org.eclipse.jgit.lib.StoredConfig;
69 import org.eclipse.jgit.revwalk.RevBlob;
70 import org.eclipse.jgit.revwalk.RevCommit;
71 import org.eclipse.jgit.transport.PostReceiveHook;
72 import org.eclipse.jgit.transport.PreReceiveHook;
73 import org.eclipse.jgit.transport.ReceiveCommand;
74 import org.eclipse.jgit.transport.ReceivePack;
75 import org.eclipse.jgit.transport.RemoteRefUpdate;
76 import org.eclipse.jgit.transport.Transport;
77 import org.eclipse.jgit.transport.URIish;
78 import org.eclipse.jgit.transport.resolver.RepositoryResolver;
79 import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
80 import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
81 import org.junit.Before;
82 import org.junit.Test;
83
84
85
86
87
88
89 public class GitServletResponseTests extends HttpTestCase {
90 private Repository srvRepo;
91
92 private URIish srvURI;
93
94 private GitServlet gs;
95
96 private long maxPackSize = 0;
97
98
99 private PostReceiveHook postHook = null;
100
101 private PreReceiveHook preHook = null;
102
103 private ObjectChecker oc = null;
104
105
106
107
108
109
110 @Before
111 public void setUp() throws Exception {
112 super.setUp();
113
114 final TestRepository<Repository> srv = createTestRepository();
115 final String repoName = srv.getRepository().getDirectory().getName();
116
117 ServletContextHandler app = server.addContext("/git");
118 gs = new GitServlet();
119 gs.setRepositoryResolver(new RepositoryResolver<HttpServletRequest>() {
120 public Repository open(HttpServletRequest req, String name)
121 throws RepositoryNotFoundException,
122 ServiceNotEnabledException {
123 if (!name.equals(repoName))
124 throw new RepositoryNotFoundException(name);
125
126 final Repository db = srv.getRepository();
127 db.incrementOpen();
128 return db;
129 }
130 });
131 gs.setReceivePackFactory(new DefaultReceivePackFactory() {
132 public ReceivePack create(HttpServletRequest req, Repository db)
133 throws ServiceNotEnabledException,
134 ServiceNotAuthorizedException {
135 ReceivePack recv = super.create(req, db);
136 if (maxPackSize > 0)
137 recv.setMaxPackSizeLimit(maxPackSize);
138 if (postHook != null)
139 recv.setPostReceiveHook(postHook);
140 if (preHook != null)
141 recv.setPreReceiveHook(preHook);
142 if (oc != null)
143 recv.setObjectChecker(oc);
144 return recv;
145 }
146
147 });
148 app.addServlet(new ServletHolder(gs), "/*");
149
150 server.setUp();
151
152 srvRepo = srv.getRepository();
153 srvURI = toURIish(app, repoName);
154
155 StoredConfig cfg = srvRepo.getConfig();
156 cfg.setBoolean("http", null, "receivepack", true);
157 cfg.save();
158 }
159
160
161
162
163
164
165
166
167
168 @Test
169 public void testRuntimeExceptionInPreReceiveHook() throws Exception {
170 final TestRepository client = createTestRepository();
171 final RevBlob Q_txt = client
172 .blob("some blob content to measure pack size");
173 final RevCommit Q = client.commit().add("Q", Q_txt).create();
174 final Repository clientRepo = client.getRepository();
175 final String srvBranchName = Constants.R_HEADS + "new.branch";
176 Transport t;
177
178 maxPackSize = 0;
179 postHook = null;
180 preHook = new PreReceiveHook() {
181 @Override
182 public void onPreReceive(ReceivePack rp,
183 Collection<ReceiveCommand> commands) {
184 throw new IllegalStateException();
185 }
186 };
187
188 t = Transport.open(clientRepo, srvURI);
189 try {
190 RemoteRefUpdate update = new RemoteRefUpdate(clientRepo, Q.name(),
191 srvBranchName, false, null, null);
192 try {
193 t.push(NullProgressMonitor.INSTANCE,
194 Collections.singleton(update));
195 fail("should not reach this line");
196 } catch (Exception e) {
197 assertTrue(e instanceof TransportException);
198 }
199 } finally {
200 t.close();
201 }
202 }
203
204
205
206
207
208
209
210 @Test
211 public void testObjectCheckerException() throws Exception {
212 final TestRepository client = createTestRepository();
213 final RevBlob Q_txt = client
214 .blob("some blob content to measure pack size");
215 final RevCommit Q = client.commit().add("Q", Q_txt).create();
216 final Repository clientRepo = client.getRepository();
217 final String srvBranchName = Constants.R_HEADS + "new.branch";
218 Transport t;
219
220 maxPackSize = 0;
221 postHook = null;
222 preHook = null;
223 oc = new ObjectChecker() {
224 @Override
225 public void checkCommit(AnyObjectId id, byte[] raw)
226 throws CorruptObjectException {
227 throw new CorruptObjectException("refusing all commits");
228 }
229 };
230
231 t = Transport.open(clientRepo, srvURI);
232 try {
233 RemoteRefUpdate update = new RemoteRefUpdate(clientRepo, Q.name(),
234 srvBranchName, false, null, null);
235 try {
236 t.push(NullProgressMonitor.INSTANCE,
237 Collections.singleton(update));
238 fail("should not reach this line");
239 } catch (Exception e) {
240 assertTrue(e instanceof TransportException);
241 }
242 } finally {
243 t.close();
244 }
245 }
246
247
248
249
250
251
252
253
254
255
256
257 @Test
258 public void testUnpackErrorWithSubsequentExceptionInPostReceiveHook()
259 throws Exception {
260 final TestRepository client = createTestRepository();
261 final RevBlob Q_txt = client
262 .blob("some blob content to measure pack size");
263 final RevCommit Q = client.commit().add("Q", Q_txt).create();
264 final Repository clientRepo = client.getRepository();
265 final String srvBranchName = Constants.R_HEADS + "new.branch";
266 Transport t;
267
268
269 maxPackSize = 400;
270
271
272 postHook = new PostReceiveHook() {
273 public void onPostReceive(ReceivePack rp,
274 Collection<ReceiveCommand> commands) {
275
276
277
278 rp.getPackSize();
279 }
280 };
281
282 t = Transport.open(clientRepo, srvURI);
283 try {
284 RemoteRefUpdate update = new RemoteRefUpdate(clientRepo, Q.name(),
285 srvBranchName, false, null, null);
286 try {
287 t.push(NullProgressMonitor.INSTANCE,
288 Collections.singleton(update));
289 fail("should not reach this line");
290 } catch (Exception e) {
291 assertTrue(e instanceof TooLargePackException);
292 }
293 } finally {
294 t.close();
295 }
296 }
297 }