summaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit.test/tst
diff options
context:
space:
mode:
authorJosh Brown <sjoshbrown@google.com>2022-11-01 20:51:48 +0000
committerJosh Brown <sjoshbrown@google.com>2022-11-02 16:13:22 -0400
commitfe9aeb02e616863bf0f19a4beb03c0916ca57c5d (patch)
tree649a1f295d25d081f70ecae9eb21ccd8c661f001 /org.eclipse.jgit.test/tst
parent7b0a71a5e9916f0782eb24056a35b376373fdf59 (diff)
downloadjgit-fe9aeb02e616863bf0f19a4beb03c0916ca57c5d.tar.gz
jgit-fe9aeb02e616863bf0f19a4beb03c0916ca57c5d.zip
UploadPack: Receive and parse client session-id
Before this change JGit did not support the session-id capability implemented by native Git in UploadPack. This change implements advertising the capability from the server and parsing the session-id received from the client during an UploadPack operation. Enable the transfer.advertisesid config setting to advertise the capability from the server. The client may send a session-id capability in response. If received, the value from this is parsed and available via the getClientSID method on the UploadPack object. This change does not add the capability to send a session-id from the JGit client. https://git-scm.com/docs/gitprotocol-capabilities#_session_idsession_id Change-Id: Ib1b6929ff1b3a4528e767925b5e5c44b5d18182f Signed-off-by: Josh Brown <sjoshbrown@google.com>
Diffstat (limited to 'org.eclipse.jgit.test/tst')
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/ProtocolV0ParserTest.java19
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/ProtocolV2ParserTest.java24
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackTest.java42
3 files changed, 85 insertions, 0 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/ProtocolV0ParserTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/ProtocolV0ParserTest.java
index b2a4af30ab..61b7fb619a 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/ProtocolV0ParserTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/ProtocolV0ParserTest.java
@@ -98,6 +98,25 @@ public class ProtocolV0ParserTest {
"f900c8326a43303685c46b279b9f70411bff1a4b"));
}
+ @Test
+ public void testRecvWantsWithSessionID()
+ throws PackProtocolException, IOException {
+ PacketLineIn pckIn = formatAsPacketLine(String.join(" ", "want",
+ "4624442d68ee402a94364191085b77137618633e", "thin-pack",
+ "agent=JGit.test/0.0.1", "session-id=client-session-id", "\n"),
+ "want f900c8326a43303685c46b279b9f70411bff1a4b\n",
+ PacketLineIn.end());
+ ProtocolV0Parser parser = new ProtocolV0Parser(defaultConfig());
+ FetchV0Request request = parser.recvWants(pckIn);
+ assertTrue(request.getClientCapabilities()
+ .contains(GitProtocolConstants.OPTION_THIN_PACK));
+ assertEquals(1, request.getClientCapabilities().size());
+ assertEquals("client-session-id", request.getClientSID());
+ assertThat(request.getWantIds(),
+ hasOnlyObjectIds("4624442d68ee402a94364191085b77137618633e",
+ "f900c8326a43303685c46b279b9f70411bff1a4b"));
+ }
+
/*
* First round of protocol v0 negotiation. Client send wants, no
* capabilities.
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/ProtocolV2ParserTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/ProtocolV2ParserTest.java
index 167b5b72c6..bab4a36cc4 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/ProtocolV2ParserTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/ProtocolV2ParserTest.java
@@ -361,4 +361,28 @@ public class ProtocolV2ParserTest {
assertEquals(2, req.getRefPrefixes().size());
assertThat(req.getRefPrefixes(), hasItems("refs/for", "refs/heads"));
}
+
+ @Test
+ public void testFetchWithSessionID() throws IOException {
+ PacketLineIn pckIn = formatAsPacketLine("session-id=the.client.sid",
+ PacketLineIn.end());
+
+ ProtocolV2Parser parser = new ProtocolV2Parser(
+ ConfigBuilder.start().allowFilter().done());
+ FetchV2Request request = parser.parseFetchRequest(pckIn);
+
+ assertEquals("the.client.sid", request.getClientSID());
+ }
+
+ @Test
+ public void testLsRefsWithSessionID() throws IOException {
+ PacketLineIn pckIn = formatAsPacketLine("session-id=the.client.sid",
+ PacketLineIn.delimiter(), PacketLineIn.end());
+
+ ProtocolV2Parser parser = new ProtocolV2Parser(
+ ConfigBuilder.getDefault());
+ LsRefsV2Request req = parser.parseLsRefsRequest(pckIn);
+
+ assertEquals("the.client.sid", req.getClientSID());
+ }
}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackTest.java
index 7131905850..df48afef35 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackTest.java
@@ -2429,6 +2429,24 @@ public class UploadPackTest {
}
@Test
+ public void testGetSessionIDValueProtocolV0() throws Exception {
+ RevCommit one = remote.commit().message("1").create();
+ remote.update("one", one);
+
+ UploadPack up = new UploadPack(server);
+ ByteArrayInputStream send = linesAsInputStream(
+ "want " + one.getName() + " agent=JGit-test/1.2.3"
+ + " session-id=client-session-id\n",
+ PacketLineIn.end(),
+ "have 11cedf1b796d44207da702f7d420684022fc0f09\n", "done\n");
+
+ ByteArrayOutputStream recv = new ByteArrayOutputStream();
+ up.upload(send, recv, null);
+
+ assertEquals(up.getClientSID(), "client-session-id");
+ }
+
+ @Test
public void testGetPeerAgentProtocolV2() throws Exception {
server.getConfig().setString(ConfigConstants.CONFIG_PROTOCOL_SECTION,
null, ConfigConstants.CONFIG_KEY_VERSION,
@@ -2452,6 +2470,30 @@ public class UploadPackTest {
assertEquals(up.getPeerUserAgent(), "JGit-test/1.2.4");
}
+ @Test
+ public void testGetSessionIDValueProtocolV2() throws Exception {
+ server.getConfig().setString(ConfigConstants.CONFIG_PROTOCOL_SECTION,
+ null, ConfigConstants.CONFIG_KEY_VERSION,
+ TransferConfig.ProtocolVersion.V2.version());
+
+ RevCommit one = remote.commit().message("1").create();
+ remote.update("one", one);
+
+ UploadPack up = new UploadPack(server);
+ up.setExtraParameters(Sets.of("version=2"));
+
+ ByteArrayInputStream send = linesAsInputStream("command=fetch\n",
+ "agent=JGit-test/1.2.4\n", "session-id=client-session-id\n",
+ PacketLineIn.delimiter(), "want " + one.getName() + "\n",
+ "have 11cedf1b796d44207da702f7d420684022fc0f09\n", "done\n",
+ PacketLineIn.end());
+
+ ByteArrayOutputStream recv = new ByteArrayOutputStream();
+ up.upload(send, recv, null);
+
+ assertEquals(up.getClientSID(), "client-session-id");
+ }
+
private static class RejectAllRefFilter implements RefFilter {
@Override
public Map<String, Ref> filter(Map<String, Ref> refs) {