1
2
3
4
5
6
7
8
9
10
11 package org.eclipse.jgit.http.test;
12
13 import static org.junit.Assert.assertEquals;
14 import static org.junit.Assert.fail;
15
16 import java.util.Collections;
17
18 import javax.servlet.http.HttpServletRequest;
19
20 import org.eclipse.jetty.servlet.ServletContextHandler;
21 import org.eclipse.jetty.servlet.ServletHolder;
22 import org.eclipse.jgit.errors.RemoteRepositoryException;
23 import org.eclipse.jgit.errors.RepositoryNotFoundException;
24 import org.eclipse.jgit.http.server.GitServlet;
25 import org.eclipse.jgit.http.server.resolver.DefaultReceivePackFactory;
26 import org.eclipse.jgit.junit.TestRepository;
27 import org.eclipse.jgit.lib.Constants;
28 import org.eclipse.jgit.lib.NullProgressMonitor;
29 import org.eclipse.jgit.lib.ObjectId;
30 import org.eclipse.jgit.lib.Repository;
31 import org.eclipse.jgit.lib.StoredConfig;
32 import org.eclipse.jgit.revwalk.RevBlob;
33 import org.eclipse.jgit.revwalk.RevCommit;
34 import org.eclipse.jgit.transport.ReceivePack;
35 import org.eclipse.jgit.transport.RemoteRefUpdate;
36 import org.eclipse.jgit.transport.Transport;
37 import org.eclipse.jgit.transport.URIish;
38 import org.eclipse.jgit.transport.http.HttpConnectionFactory;
39 import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
40 import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
41 import org.junit.Before;
42 import org.junit.Test;
43
44 public class AdvertiseErrorTest extends AllFactoriesHttpTestCase {
45
46 private Repository remoteRepository;
47
48 private URIish remoteURI;
49
50 public AdvertiseErrorTest(HttpConnectionFactory cf) {
51 super(cf);
52 }
53
54 @Override
55 @Before
56 public void setUp() throws Exception {
57 super.setUp();
58
59 final TestRepository<Repository> src = createTestRepository();
60 final String srcName = src.getRepository().getDirectory().getName();
61
62 ServletContextHandler app = server.addContext("/git");
63 GitServlet gs = new GitServlet();
64 gs.setRepositoryResolver((HttpServletRequest req, String name) -> {
65 if (!name.equals(srcName)) {
66 throw new RepositoryNotFoundException(name);
67 }
68 final Repository db = src.getRepository();
69 db.incrementOpen();
70 return db;
71 });
72 gs.setReceivePackFactory(new DefaultReceivePackFactory() {
73 @Override
74 public ReceivePack create(HttpServletRequest req, Repository db)
75 throws ServiceNotEnabledException,
76 ServiceNotAuthorizedException {
77 ReceivePack rp = super.create(req, db);
78 rp.sendError("message line 1");
79 rp.sendError("no soup for you!");
80 rp.sendError("come back next year!");
81 return rp;
82 }
83
84 });
85 app.addServlet(new ServletHolder(gs), "/*");
86
87 server.setUp();
88
89 remoteRepository = src.getRepository();
90 remoteURI = toURIish(app, srcName);
91
92 StoredConfig cfg = remoteRepository.getConfig();
93 cfg.setBoolean("http", null, "receivepack", true);
94 cfg.save();
95 }
96
97 @Test
98 public void testPush_CreateBranch() throws Exception {
99 final TestRepository src = createTestRepository();
100 final RevBlob Q_txt = src.blob("new text");
101 final RevCommit Q = src.commit().add("Q", Q_txt).create();
102 final Repository db = src.getRepository();
103 final String dstName = Constants.R_HEADS + "new.branch";
104 try (Transport t = Transport.open(db, remoteURI)) {
105 final String srcExpr = Q.name();
106 final boolean forceUpdate = false;
107 final String localName = null;
108 final ObjectId oldId = null;
109
110 RemoteRefUpdate update = new RemoteRefUpdate(src.getRepository(),
111 srcExpr, dstName, forceUpdate, localName, oldId);
112 try {
113 t.push(NullProgressMonitor.INSTANCE, Collections
114 .singleton(update));
115 fail("push completed without throwing exception");
116 } catch (RemoteRepositoryException error) {
117 assertEquals(remoteURI + ": message line 1\n"
118 + "no soup for you!\n"
119 + "come back next year!",
120 error.getMessage());
121 }
122 }
123 }
124 }