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.assertNotNull;
15 import static org.junit.Assert.assertTrue;
16
17 import java.io.ByteArrayOutputStream;
18 import java.io.OutputStream;
19 import java.util.Collection;
20 import java.util.Collections;
21 import java.util.List;
22
23 import javax.servlet.http.HttpServletRequest;
24
25 import org.eclipse.jetty.servlet.ServletContextHandler;
26 import org.eclipse.jetty.servlet.ServletHolder;
27 import org.eclipse.jgit.errors.RepositoryNotFoundException;
28 import org.eclipse.jgit.http.server.GitServlet;
29 import org.eclipse.jgit.http.server.resolver.DefaultReceivePackFactory;
30 import org.eclipse.jgit.junit.TestRepository;
31 import org.eclipse.jgit.junit.http.AccessEvent;
32 import org.eclipse.jgit.lib.Constants;
33 import org.eclipse.jgit.lib.NullProgressMonitor;
34 import org.eclipse.jgit.lib.ObjectId;
35 import org.eclipse.jgit.lib.Repository;
36 import org.eclipse.jgit.lib.StoredConfig;
37 import org.eclipse.jgit.revwalk.RevBlob;
38 import org.eclipse.jgit.revwalk.RevCommit;
39 import org.eclipse.jgit.transport.PushResult;
40 import org.eclipse.jgit.transport.ReceiveCommand;
41 import org.eclipse.jgit.transport.ReceivePack;
42 import org.eclipse.jgit.transport.RemoteRefUpdate;
43 import org.eclipse.jgit.transport.Transport;
44 import org.eclipse.jgit.transport.URIish;
45 import org.eclipse.jgit.transport.http.HttpConnectionFactory;
46 import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
47 import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
48 import org.junit.Before;
49 import org.junit.Test;
50
51 public class HookMessageTest extends AllFactoriesHttpTestCase {
52
53 private Repository remoteRepository;
54
55 private URIish remoteURI;
56
57 public HookMessageTest(HttpConnectionFactory cf) {
58 super(cf);
59 }
60
61 @Override
62 @Before
63 public void setUp() throws Exception {
64 super.setUp();
65
66 final TestRepository<Repository> src = createTestRepository();
67 final String srcName = src.getRepository().getDirectory().getName();
68
69 ServletContextHandler app = server.addContext("/git");
70 GitServlet gs = new GitServlet();
71 gs.setRepositoryResolver((HttpServletRequest req, String name) -> {
72 if (!name.equals(srcName)) {
73 throw new RepositoryNotFoundException(name);
74 }
75 final Repository db = src.getRepository();
76 db.incrementOpen();
77 return db;
78 });
79 gs.setReceivePackFactory(new DefaultReceivePackFactory() {
80 @Override
81 public ReceivePack create(HttpServletRequest req, Repository db)
82 throws ServiceNotEnabledException,
83 ServiceNotAuthorizedException {
84 ReceivePack recv = super.create(req, db);
85 recv.setPreReceiveHook((ReceivePack rp,
86 Collection<ReceiveCommand> commands) -> {
87 rp.sendMessage("message line 1");
88 rp.sendError("no soup for you!");
89 rp.sendMessage("come back next year!");
90 });
91 return recv;
92 }
93
94 });
95 app.addServlet(new ServletHolder(gs), "/*");
96
97 server.setUp();
98
99 remoteRepository = src.getRepository();
100 addRepoToClose(remoteRepository);
101 remoteURI = toURIish(app, srcName);
102
103 StoredConfig cfg = remoteRepository.getConfig();
104 cfg.setBoolean("http", null, "receivepack", true);
105 cfg.save();
106 }
107
108 @Test
109 public void testPush_CreateBranch() throws Exception {
110 final TestRepository src = createTestRepository();
111 final RevBlob Q_txt = src.blob("new text");
112 final RevCommit Q = src.commit().add("Q", Q_txt).create();
113 final Repository db = src.getRepository();
114 final String dstName = Constants.R_HEADS + "new.branch";
115 PushResult result;
116
117 try (Transport t = Transport.open(db, remoteURI)) {
118 final String srcExpr = Q.name();
119 final boolean forceUpdate = false;
120 final String localName = null;
121 final ObjectId oldId = null;
122
123 RemoteRefUpdate update = new RemoteRefUpdate(src.getRepository(),
124 srcExpr, dstName, forceUpdate, localName, oldId);
125 result = t.push(NullProgressMonitor.INSTANCE, Collections
126 .singleton(update));
127 }
128
129 assertTrue(remoteRepository.getObjectDatabase().has(Q_txt));
130 assertNotNull("has " + dstName, remoteRepository.exactRef(dstName));
131 assertEquals(Q, remoteRepository.exactRef(dstName).getObjectId());
132 fsck(remoteRepository, Q);
133
134 List<AccessEvent> requests = getRequests();
135 assertEquals(2, requests.size());
136
137 AccessEvent service = requests.get(1);
138 assertEquals("POST", service.getMethod());
139 assertEquals(join(remoteURI, "git-receive-pack"), service.getPath());
140 assertEquals(200, service.getStatus());
141
142 assertEquals("message line 1\n"
143 + "error: no soup for you!\n"
144 + "come back next year!\n",
145 result.getMessages());
146 }
147
148 @Test
149 public void testPush_HookMessagesToOutputStream() throws Exception {
150 final TestRepository src = createTestRepository();
151 final RevBlob Q_txt = src.blob("new text");
152 final RevCommit Q = src.commit().add("Q", Q_txt).create();
153 final Repository db = src.getRepository();
154 final String dstName = Constants.R_HEADS + "new.branch";
155 PushResult result;
156
157 OutputStream out = new ByteArrayOutputStream();
158 try (Transport t = Transport.open(db, remoteURI)) {
159 final String srcExpr = Q.name();
160 final boolean forceUpdate = false;
161 final String localName = null;
162 final ObjectId oldId = null;
163
164 RemoteRefUpdate update = new RemoteRefUpdate(src.getRepository(),
165 srcExpr, dstName, forceUpdate, localName, oldId);
166 result = t.push(NullProgressMonitor.INSTANCE,
167 Collections.singleton(update), out);
168 }
169
170 String expectedMessage = "message line 1\n"
171 + "error: no soup for you!\n"
172 + "come back next year!\n";
173 assertEquals(expectedMessage,
174 result.getMessages());
175
176 assertEquals(expectedMessage, out.toString());
177 }
178
179 }