--- /dev/null
+/*
+ * 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<Collection<ObjectId>> {
+
+ private final Set<ObjectId> expectedOids;
+
+ private ObjectIdMatcher(Set<String> 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<ObjectId> resultOids) {
+ return resultOids.containsAll(expectedOids)
+ && expectedOids.containsAll(resultOids);
+ }
+
+ /**
+ * Assert that all and only the received {@link ObjectId object ids} are in
+ * the expected set.
+ * <p>
+ * 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<Collection<ObjectId>> hasOnlyObjectIds(
+ String... oids) {
+ return new ObjectIdMatcher(Sets.of(oids));
+ }
+}
\ No newline at end of file
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;
return new PacketLineIn(new ByteArrayInputStream(send.toByteArray()));
}
- private static List<String> objIdsAsStrings(Collection<ObjectId> 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.
*/
.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());
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());
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"));
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());
}
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