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 @Override
111 @Before
112 public void setUp() throws Exception {
113 super.setUp();
114
115 final TestRepository<Repository> srv = createTestRepository();
116 final String repoName = srv.getRepository().getDirectory().getName();
117
118 ServletContextHandler app = server.addContext("/git");
119 gs = new GitServlet();
120 gs.setRepositoryResolver(new RepositoryResolver<HttpServletRequest>() {
121 @Override
122 public Repository open(HttpServletRequest req, String name)
123 throws RepositoryNotFoundException,
124 ServiceNotEnabledException {
125 if (!name.equals(repoName))
126 throw new RepositoryNotFoundException(name);
127
128 final Repository db = srv.getRepository();
129 db.incrementOpen();
130 return db;
131 }
132 });
133 gs.setReceivePackFactory(new DefaultReceivePackFactory() {
134 @Override
135 public ReceivePack create(HttpServletRequest req, Repository db)
136 throws ServiceNotEnabledException,
137 ServiceNotAuthorizedException {
138 ReceivePack recv = super.create(req, db);
139 if (maxPackSize > 0)
140 recv.setMaxPackSizeLimit(maxPackSize);
141 if (postHook != null)
142 recv.setPostReceiveHook(postHook);
143 if (preHook != null)
144 recv.setPreReceiveHook(preHook);
145 if (oc != null)
146 recv.setObjectChecker(oc);
147 return recv;
148 }
149
150 });
151 app.addServlet(new ServletHolder(gs), "/*");
152
153 server.setUp();
154
155 srvRepo = srv.getRepository();
156 srvURI = toURIish(app, repoName);
157
158 StoredConfig cfg = srvRepo.getConfig();
159 cfg.setBoolean("http", null, "receivepack", true);
160 cfg.save();
161 }
162
163
164
165
166
167
168
169
170
171 @Test
172 public void testRuntimeExceptionInPreReceiveHook() throws Exception {
173 final TestRepository client = createTestRepository();
174 final RevBlob Q_txt = client
175 .blob("some blob content to measure pack size");
176 final RevCommit Q = client.commit().add("Q", Q_txt).create();
177 final Repository clientRepo = client.getRepository();
178 final String srvBranchName = Constants.R_HEADS + "new.branch";
179 Transport t;
180
181 maxPackSize = 0;
182 postHook = null;
183 preHook = new PreReceiveHook() {
184 @Override
185 public void onPreReceive(ReceivePack rp,
186 Collection<ReceiveCommand> commands) {
187 throw new IllegalStateException();
188 }
189 };
190
191 t = Transport.open(clientRepo, srvURI);
192 try {
193 RemoteRefUpdate update = new RemoteRefUpdate(clientRepo, Q.name(),
194 srvBranchName, false, null, null);
195 try {
196 t.push(NullProgressMonitor.INSTANCE,
197 Collections.singleton(update));
198 fail("should not reach this line");
199 } catch (Exception e) {
200 assertTrue(e instanceof TransportException);
201 }
202 } finally {
203 t.close();
204 }
205 }
206
207
208
209
210
211
212
213 @Test
214 public void testObjectCheckerException() throws Exception {
215 final TestRepository client = createTestRepository();
216 final RevBlob Q_txt = client
217 .blob("some blob content to measure pack size");
218 final RevCommit Q = client.commit().add("Q", Q_txt).create();
219 final Repository clientRepo = client.getRepository();
220 final String srvBranchName = Constants.R_HEADS + "new.branch";
221 Transport t;
222
223 maxPackSize = 0;
224 postHook = null;
225 preHook = null;
226 oc = new ObjectChecker() {
227 @Override
228 public void checkCommit(AnyObjectId id, byte[] raw)
229 throws CorruptObjectException {
230 throw new CorruptObjectException("refusing all commits");
231 }
232 };
233
234 t = Transport.open(clientRepo, srvURI);
235 try {
236 RemoteRefUpdate update = new RemoteRefUpdate(clientRepo, Q.name(),
237 srvBranchName, false, null, null);
238 try {
239 t.push(NullProgressMonitor.INSTANCE,
240 Collections.singleton(update));
241 fail("should not reach this line");
242 } catch (Exception e) {
243 assertTrue(e instanceof TransportException);
244 }
245 } finally {
246 t.close();
247 }
248 }
249
250
251
252
253
254
255
256
257
258
259
260 @Test
261 public void testUnpackErrorWithSubsequentExceptionInPostReceiveHook()
262 throws Exception {
263 final TestRepository client = createTestRepository();
264 final RevBlob Q_txt = client
265 .blob("some blob content to measure pack size");
266 final RevCommit Q = client.commit().add("Q", Q_txt).create();
267 final Repository clientRepo = client.getRepository();
268 final String srvBranchName = Constants.R_HEADS + "new.branch";
269 Transport t;
270
271
272 maxPackSize = 100;
273
274
275 postHook = new PostReceiveHook() {
276 @Override
277 public void onPostReceive(ReceivePack rp,
278 Collection<ReceiveCommand> commands) {
279
280
281
282 rp.getPackSize();
283 }
284 };
285
286 t = Transport.open(clientRepo, srvURI);
287 try {
288 RemoteRefUpdate update = new RemoteRefUpdate(clientRepo, Q.name(),
289 srvBranchName, false, null, null);
290 try {
291 t.push(NullProgressMonitor.INSTANCE,
292 Collections.singleton(update));
293 fail("should not reach this line");
294 } catch (Exception e) {
295 assertTrue(e instanceof TooLargePackException);
296 }
297 } finally {
298 t.close();
299 }
300 }
301 }