diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/ObjectIdMatcher.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/ObjectIdMatcher.java new file mode 100644 index 000000000..4c6e0f0ad --- /dev/null +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/ObjectIdMatcher.java @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2018, Google LLC. + * and other copyright owners as documented in the project's IP log. + * + * This program and the accompanying materials are made available + * under the terms of the Eclipse Distribution License v1.0 which + * accompanies this distribution, is reproduced below, and is + * available at http://www.eclipse.org/org/documents/edl-v10.php + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * - Neither the name of the Eclipse Foundation, Inc. nor the + * names of its contributors may be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.eclipse.jgit.transport; + +import java.util.Collection; +import java.util.Set; +import java.util.stream.Collectors; + +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Sets; +import org.hamcrest.Description; +import org.hamcrest.Factory; +import org.hamcrest.Matcher; +import org.hamcrest.TypeSafeMatcher; + +/** + * Multiple tests check that a collection of ObjectIds contain certain SHA1 + * (written as strings). This matcher hides the ObjectId to string conversion to + * make the assertion more readable: + * + * assertThat(req.getWantsIds(), hasOnlyObjectIds("123123", "234234")); + */ +class ObjectIdMatcher extends TypeSafeMatcher> { + + private final Set expectedOids; + + private ObjectIdMatcher(Set oids) { + this.expectedOids = oids.stream().map(ObjectId::fromString) + .collect(Collectors.toSet()); + } + + @Override + public void describeTo(Description desc) { + desc.appendText("Object ids:"); + desc.appendValueList("<", ",", ">", expectedOids); + } + + @Override + protected boolean matchesSafely(Collection resultOids) { + return resultOids.containsAll(expectedOids) + && expectedOids.containsAll(resultOids); + } + + /** + * Assert that all and only the received {@link ObjectId object ids} are in + * the expected set. + *

+ * ObjectIds are compared by SHA1. + * + * @param oids + * Object ids to examine. + * @return true if examined and specified sets contains exactly the same + * elements. + */ + @Factory + static Matcher> hasOnlyObjectIds( + String... oids) { + return new ObjectIdMatcher(Sets.of(oids)); + } +} \ No newline at end of file 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 7cfe66fe9..6b1cbdd54 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 @@ -48,20 +48,17 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; +import static org.eclipse.jgit.transport.ObjectIdMatcher.hasOnlyObjectIds; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.util.Collection; -import java.util.List; -import java.util.stream.Collectors; import org.eclipse.jgit.errors.PackProtocolException; import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription; import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.Config; -import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.revwalk.RevCommit; import org.junit.Before; import org.junit.Rule; @@ -139,12 +136,6 @@ private static PacketLineIn formatAsPacketLine(String... inputLines) return new PacketLineIn(new ByteArrayInputStream(send.toByteArray())); } - private static List objIdsAsStrings(Collection objIds) { - // TODO(ifrade) Translate this to a matcher, so it would read as - // assertThat(req.wantsIds(), hasObjectIds("...", "...")) - return objIds.stream().map(ObjectId::name).collect(Collectors.toList()); - } - /* * Succesful fetch with the basic core commands of the protocol. */ @@ -171,11 +162,11 @@ public void testFetchBasicArguments() .contains(GitProtocolConstants.OPTION_INCLUDE_TAG)); assertTrue(request.getClientCapabilities() .contains(GitProtocolConstants.CAPABILITY_OFS_DELTA)); - assertThat(objIdsAsStrings(request.getWantIds()), - hasItems("4624442d68ee402a94364191085b77137618633e", + assertThat(request.getWantIds(), + hasOnlyObjectIds("4624442d68ee402a94364191085b77137618633e", "f900c8326a43303685c46b279b9f70411bff1a4b")); - assertThat(objIdsAsStrings(request.getPeerHas()), - hasItems("554f6e41067b9e3e565b6988a8294fac1cb78f4b", + assertThat(request.getPeerHas(), + hasOnlyObjectIds("554f6e41067b9e3e565b6988a8294fac1cb78f4b", "abc760ab9ad72f08209943251b36cb886a578f87")); assertTrue(request.getWantedRefs().isEmpty()); assertTrue(request.wasDoneReceived()); @@ -194,8 +185,8 @@ public void testFetchWithShallow_deepen() throws IOException { ConfigBuilder.getDefault()); FetchV2Request request = parser.parseFetchRequest(pckIn, testRepo.getRepository().getRefDatabase()); - assertThat(objIdsAsStrings(request.getClientShallowCommits()), - hasItems("28274d02c489f4c7e68153056e9061a46f62d7a0", + assertThat(request.getClientShallowCommits(), + hasOnlyObjectIds("28274d02c489f4c7e68153056e9061a46f62d7a0", "145e683b229dcab9d0e2ccb01b386f9ecc17d29d")); assertTrue(request.getDeepenNotRefs().isEmpty()); assertEquals(15, request.getDepth()); @@ -214,8 +205,8 @@ public void testFetchWithShallow_deepenNot() throws IOException { ConfigBuilder.getDefault()); FetchV2Request request = parser.parseFetchRequest(pckIn, testRepo.getRepository().getRefDatabase()); - assertThat(objIdsAsStrings(request.getClientShallowCommits()), - hasItems("28274d02c489f4c7e68153056e9061a46f62d7a0", + assertThat(request.getClientShallowCommits(), + hasOnlyObjectIds("28274d02c489f4c7e68153056e9061a46f62d7a0", "145e683b229dcab9d0e2ccb01b386f9ecc17d29d")); assertThat(request.getDeepenNotRefs(), hasItems("a08595f76159b09d57553e37a5123f1091bb13e7")); @@ -232,8 +223,8 @@ public void testFetchWithShallow_deepenSince() throws IOException { ConfigBuilder.getDefault()); FetchV2Request request = parser.parseFetchRequest(pckIn, testRepo.getRepository().getRefDatabase()); - assertThat(objIdsAsStrings(request.getClientShallowCommits()), - hasItems("28274d02c489f4c7e68153056e9061a46f62d7a0", + assertThat(request.getClientShallowCommits(), + hasOnlyObjectIds("28274d02c489f4c7e68153056e9061a46f62d7a0", "145e683b229dcab9d0e2ccb01b386f9ecc17d29d")); assertEquals(123123123, request.getDeepenSince()); } @@ -309,9 +300,9 @@ public void testFetchWithRefInWant() throws Exception { assertThat(request.getWantedRefs().keySet(), hasItems("refs/heads/branchA")); assertEquals(2, request.getWantIds().size()); - assertThat(objIdsAsStrings(request.getWantIds()), - hasItems("e4980cdc48cfa1301493ca94eb70523f6788b819", - one.getName())); + assertThat(request.getWantIds(), hasOnlyObjectIds( + "e4980cdc48cfa1301493ca94eb70523f6788b819", + one.getName())); } @Test