Browse Source

UploadPackTest: use Consumer to set up UploadPack

Use a Consumer instead of several nullable variables to further
configure UploadPack. This is in preparation for a test in a subsequent
patch needing further customization of the UploadPack object before
invoking it.

Change-Id: I074dff92c711a5ba74558bb4b06c42c115fb9b7f
Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
tags/v5.5.0.201908280940-m3
Jonathan Tan 5 years ago
parent
commit
16856f5a80

+ 70
- 43
org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackTest.java View File

import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.function.Consumer;


import org.eclipse.jgit.dircache.DirCache; import org.eclipse.jgit.dircache.DirCache;
import org.eclipse.jgit.dircache.DirCacheBuilder; import org.eclipse.jgit.dircache.DirCacheBuilder;
* Invokes UploadPack with protocol v2 and sends it the given lines, * Invokes UploadPack with protocol v2 and sends it the given lines,
* and returns UploadPack's output stream. * and returns UploadPack's output stream.
*/ */
private ByteArrayInputStream uploadPackV2Setup(RequestPolicy requestPolicy,
RefFilter refFilter, ProtocolV2Hook hook, String... inputLines)
private ByteArrayInputStream uploadPackV2Setup(
Consumer<UploadPack> postConstructionSetup, String... inputLines)
throws Exception { throws Exception {


ByteArrayInputStream send = linesAsInputStream(inputLines); ByteArrayInputStream send = linesAsInputStream(inputLines);


server.getConfig().setString("protocol", null, "version", "2"); server.getConfig().setString("protocol", null, "version", "2");
UploadPack up = new UploadPack(server); UploadPack up = new UploadPack(server);
if (requestPolicy != null)
up.setRequestPolicy(requestPolicy);
if (refFilter != null)
up.setRefFilter(refFilter);
up.setExtraParameters(Sets.of("version=2"));
if (hook != null) {
up.setProtocolV2Hook(hook);
if (postConstructionSetup != null) {
postConstructionSetup.accept(up);
} }
up.setExtraParameters(Sets.of("version=2"));


ByteArrayOutputStream recv = new ByteArrayOutputStream(); ByteArrayOutputStream recv = new ByteArrayOutputStream();
up.upload(send, recv, null); up.upload(send, recv, null);
try (ByteArrayOutputStream send = new ByteArrayOutputStream()) { try (ByteArrayOutputStream send = new ByteArrayOutputStream()) {
PacketLineOut pckOut = new PacketLineOut(send); PacketLineOut pckOut = new PacketLineOut(send);
for (String line : inputLines) { for (String line : inputLines) {
Objects.requireNonNull(line);
if (PacketLineIn.isEnd(line)) { if (PacketLineIn.isEnd(line)) {
pckOut.end(); pckOut.end();
} else if (PacketLineIn.isDelimiter(line)) { } else if (PacketLineIn.isDelimiter(line)) {
* Returns UploadPack's output stream, not including the capability * Returns UploadPack's output stream, not including the capability
* advertisement by the server. * advertisement by the server.
*/ */
private ByteArrayInputStream uploadPackV2(RequestPolicy requestPolicy,
RefFilter refFilter, ProtocolV2Hook hook, String... inputLines)
private ByteArrayInputStream uploadPackV2(
Consumer<UploadPack> postConstructionSetup,
String... inputLines)
throws Exception { throws Exception {
ByteArrayInputStream recvStream = ByteArrayInputStream recvStream =
uploadPackV2Setup(requestPolicy, refFilter, hook, inputLines);
uploadPackV2Setup(postConstructionSetup, inputLines);
PacketLineIn pckIn = new PacketLineIn(recvStream); PacketLineIn pckIn = new PacketLineIn(recvStream);


// drain capabilities // drain capabilities
} }


private ByteArrayInputStream uploadPackV2(String... inputLines) throws Exception { private ByteArrayInputStream uploadPackV2(String... inputLines) throws Exception {
return uploadPackV2(null, null, null, inputLines);
return uploadPackV2(null, inputLines);
} }


private static class TestV2Hook implements ProtocolV2Hook { private static class TestV2Hook implements ProtocolV2Hook {
@Test @Test
public void testV2Capabilities() throws Exception { public void testV2Capabilities() throws Exception {
TestV2Hook hook = new TestV2Hook(); TestV2Hook hook = new TestV2Hook();
ByteArrayInputStream recvStream =
uploadPackV2Setup(null, null, hook, PacketLineIn.end());
ByteArrayInputStream recvStream = uploadPackV2Setup(
(UploadPack up) -> {up.setProtocolV2Hook(hook);},
PacketLineIn.end());
PacketLineIn pckIn = new PacketLineIn(recvStream); PacketLineIn pckIn = new PacketLineIn(recvStream);
assertThat(hook.capabilitiesRequest, notNullValue()); assertThat(hook.capabilitiesRequest, notNullValue());
assertThat(pckIn.readString(), is("version 2")); assertThat(pckIn.readString(), is("version 2"));
String fetchCapability) throws Exception { String fetchCapability) throws Exception {
server.getConfig().setBoolean(configSection, null, configName, true); server.getConfig().setBoolean(configSection, null, configName, true);
ByteArrayInputStream recvStream = ByteArrayInputStream recvStream =
uploadPackV2Setup(null, null, null, PacketLineIn.end());
uploadPackV2Setup(null, PacketLineIn.end());
PacketLineIn pckIn = new PacketLineIn(recvStream); PacketLineIn pckIn = new PacketLineIn(recvStream);


assertThat(pckIn.readString(), is("version 2")); assertThat(pckIn.readString(), is("version 2"));


private void checkUnadvertisedIfUnallowed(String fetchCapability) throws Exception { private void checkUnadvertisedIfUnallowed(String fetchCapability) throws Exception {
ByteArrayInputStream recvStream = ByteArrayInputStream recvStream =
uploadPackV2Setup(null, null, null, PacketLineIn.end());
uploadPackV2Setup(null, PacketLineIn.end());
PacketLineIn pckIn = new PacketLineIn(recvStream); PacketLineIn pckIn = new PacketLineIn(recvStream);


assertThat(pckIn.readString(), is("version 2")); assertThat(pckIn.readString(), is("version 2"));
server.getConfig().setBoolean("uploadpack", null, "allowrefinwant", true); server.getConfig().setBoolean("uploadpack", null, "allowrefinwant", true);
server.getConfig().setBoolean("uploadpack", null, "advertiserefinwant", false); server.getConfig().setBoolean("uploadpack", null, "advertiserefinwant", false);
ByteArrayInputStream recvStream = ByteArrayInputStream recvStream =
uploadPackV2Setup(null, null, null, PacketLineIn.end());
uploadPackV2Setup(null, PacketLineIn.end());
PacketLineIn pckIn = new PacketLineIn(recvStream); PacketLineIn pckIn = new PacketLineIn(recvStream);


assertThat(pckIn.readString(), is("version 2")); assertThat(pckIn.readString(), is("version 2"));
remote.update("refs/tags/tag", tag); remote.update("refs/tags/tag", tag);


TestV2Hook hook = new TestV2Hook(); TestV2Hook hook = new TestV2Hook();
ByteArrayInputStream recvStream = uploadPackV2(null, null, hook,
ByteArrayInputStream recvStream = uploadPackV2(
(UploadPack up) -> {up.setProtocolV2Hook(hook);},
"command=ls-refs\n", PacketLineIn.end()); "command=ls-refs\n", PacketLineIn.end());
PacketLineIn pckIn = new PacketLineIn(recvStream); PacketLineIn pckIn = new PacketLineIn(recvStream);


PacketLineIn.end() }; PacketLineIn.end() };


TestV2Hook testHook = new TestV2Hook(); TestV2Hook testHook = new TestV2Hook();
uploadPackV2Setup(null, null, testHook, lines);
uploadPackV2Setup((UploadPack up) -> {up.setProtocolV2Hook(testHook);}, lines);


LsRefsV2Request req = testHook.lsRefsRequest; LsRefsV2Request req = testHook.lsRefsRequest;
assertEquals(2, req.getServerOptions().size()); assertEquals(2, req.getServerOptions().size());
remote.update("branch1", advertized); remote.update("branch1", advertized);


// This works // This works
uploadPackV2(RequestPolicy.ADVERTISED, null, null, "command=fetch\n",
PacketLineIn.delimiter(), "want " + advertized.name() + "\n",
PacketLineIn.end());
uploadPackV2(
(UploadPack up) -> {up.setRequestPolicy(RequestPolicy.ADVERTISED);},
"command=fetch\n",
PacketLineIn.delimiter(),
"want " + advertized.name() + "\n",
PacketLineIn.end());


// This doesn't // This doesn't
UploadPackInternalServerErrorException e = assertThrows( UploadPackInternalServerErrorException e = assertThrows(
UploadPackInternalServerErrorException.class, UploadPackInternalServerErrorException.class,
() -> uploadPackV2(RequestPolicy.ADVERTISED, null, null,
() -> uploadPackV2(
(UploadPack up) -> {up.setRequestPolicy(RequestPolicy.ADVERTISED);},
"command=fetch\n", PacketLineIn.delimiter(), "command=fetch\n", PacketLineIn.delimiter(),
"want " + unadvertized.name() + "\n", "want " + unadvertized.name() + "\n",
PacketLineIn.end())); PacketLineIn.end()));
remote.update("branch1", advertized); remote.update("branch1", advertized);


// This works // This works
uploadPackV2(RequestPolicy.REACHABLE_COMMIT, null, null,
"command=fetch\n", PacketLineIn.delimiter(),
"want " + reachable.name() + "\n", PacketLineIn.end());
uploadPackV2(
(UploadPack up) -> {up.setRequestPolicy(RequestPolicy.REACHABLE_COMMIT);},
"command=fetch\n",
PacketLineIn.delimiter(),
"want " + reachable.name() + "\n",
PacketLineIn.end());


// This doesn't // This doesn't
UploadPackInternalServerErrorException e = assertThrows( UploadPackInternalServerErrorException e = assertThrows(
UploadPackInternalServerErrorException.class, UploadPackInternalServerErrorException.class,
() -> uploadPackV2(RequestPolicy.REACHABLE_COMMIT, null, null,
() -> uploadPackV2(
(UploadPack up) -> {up.setRequestPolicy(RequestPolicy.REACHABLE_COMMIT);},
"command=fetch\n", PacketLineIn.delimiter(), "command=fetch\n", PacketLineIn.delimiter(),
"want " + unreachable.name() + "\n", "want " + unreachable.name() + "\n",
PacketLineIn.end())); PacketLineIn.end()));
remote.update("secret", tip); remote.update("secret", tip);


// This works // This works
uploadPackV2(RequestPolicy.TIP, new RejectAllRefFilter(), null,
"command=fetch\n", PacketLineIn.delimiter(),
"want " + tip.name() + "\n", PacketLineIn.end());
uploadPackV2(
(UploadPack up) -> {
up.setRequestPolicy(RequestPolicy.TIP);
up.setRefFilter(new RejectAllRefFilter());
},
"command=fetch\n",
PacketLineIn.delimiter(),
"want " + tip.name() + "\n",
PacketLineIn.end());


// This doesn't // This doesn't
UploadPackInternalServerErrorException e = assertThrows( UploadPackInternalServerErrorException e = assertThrows(
UploadPackInternalServerErrorException.class, UploadPackInternalServerErrorException.class,
() -> uploadPackV2(RequestPolicy.TIP, new RejectAllRefFilter(),
null, "command=fetch\n", PacketLineIn.delimiter(),
() -> uploadPackV2(
(UploadPack up) -> {
up.setRequestPolicy(RequestPolicy.TIP);
up.setRefFilter(new RejectAllRefFilter());
},
"command=fetch\n", PacketLineIn.delimiter(),
"want " + parentOfTip.name() + "\n", "want " + parentOfTip.name() + "\n",
PacketLineIn.end())); PacketLineIn.end()));
assertThat(e.getCause().getMessage(), assertThat(e.getCause().getMessage(),
remote.update("secret", tip); remote.update("secret", tip);


// This works // This works
uploadPackV2(RequestPolicy.REACHABLE_COMMIT_TIP,
new RejectAllRefFilter(), null, "command=fetch\n",
uploadPackV2(
(UploadPack up) -> {
up.setRequestPolicy(RequestPolicy.REACHABLE_COMMIT_TIP);
up.setRefFilter(new RejectAllRefFilter());
},
"command=fetch\n",
PacketLineIn.delimiter(), "want " + parentOfTip.name() + "\n", PacketLineIn.delimiter(), "want " + parentOfTip.name() + "\n",
PacketLineIn.end()); PacketLineIn.end());


// This doesn't // This doesn't
UploadPackInternalServerErrorException e = assertThrows( UploadPackInternalServerErrorException e = assertThrows(
UploadPackInternalServerErrorException.class, UploadPackInternalServerErrorException.class,
() -> uploadPackV2(RequestPolicy.REACHABLE_COMMIT_TIP,
new RejectAllRefFilter(), null, "command=fetch\n",
() -> uploadPackV2(
(UploadPack up) -> {
up.setRequestPolicy(RequestPolicy.REACHABLE_COMMIT_TIP);
up.setRefFilter(new RejectAllRefFilter());
},
"command=fetch\n",
PacketLineIn.delimiter(), PacketLineIn.delimiter(),
"want " + unreachable.name() + "\n", "want " + unreachable.name() + "\n",
PacketLineIn.end())); PacketLineIn.end()));


// Exercise to make sure that even unreachable commits can be fetched // Exercise to make sure that even unreachable commits can be fetched
uploadPackV2( uploadPackV2(
RequestPolicy.ANY,
null,
null,
(UploadPack up) -> {up.setRequestPolicy(RequestPolicy.ANY);},
"command=fetch\n", "command=fetch\n",
PacketLineIn.delimiter(), PacketLineIn.delimiter(),
"want " + unreachable.name() + "\n", "want " + unreachable.name() + "\n",
PacketLineIn.end() }; PacketLineIn.end() };


TestV2Hook testHook = new TestV2Hook(); TestV2Hook testHook = new TestV2Hook();
uploadPackV2Setup(null, null, testHook, lines);
uploadPackV2Setup((UploadPack up) -> {up.setProtocolV2Hook(testHook);}, lines);


FetchV2Request req = testHook.fetchRequest; FetchV2Request req = testHook.fetchRequest;
assertNotNull(req); assertNotNull(req);
input.add("done\n"); input.add("done\n");
input.add(PacketLineIn.end()); input.add(PacketLineIn.end());
ByteArrayInputStream recvStream = ByteArrayInputStream recvStream =
uploadPackV2(RequestPolicy.ANY, /*refFilter=*/null,
/*hook=*/null, input.toArray(new String[0]));
uploadPackV2(
(UploadPack up) -> {up.setRequestPolicy(RequestPolicy.ANY);},
input.toArray(new String[0]));
PacketLineIn pckIn = new PacketLineIn(recvStream); PacketLineIn pckIn = new PacketLineIn(recvStream);
assertThat(pckIn.readString(), is("packfile")); assertThat(pckIn.readString(), is("packfile"));
parsePack(recvStream); parsePack(recvStream);

Loading…
Cancel
Save