You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

BasePackConnectionTest.java 8.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. /*
  2. * Copyright (C) 2020, Lee Worrall and others
  3. *
  4. * This program and the accompanying materials are made available under the
  5. * terms of the Eclipse Distribution License v. 1.0 which is available at
  6. * https://www.eclipse.org/org/documents/edl-v10.php.
  7. *
  8. * SPDX-License-Identifier: BSD-3-Clause
  9. */
  10. package org.eclipse.jgit.transport;
  11. import static org.hamcrest.MatcherAssert.assertThat;
  12. import static org.hamcrest.Matchers.hasKey;
  13. import static org.hamcrest.Matchers.instanceOf;
  14. import static org.hamcrest.Matchers.not;
  15. import static org.junit.Assert.assertEquals;
  16. import static org.junit.Assert.assertSame;
  17. import java.util.Arrays;
  18. import java.util.HashMap;
  19. import java.util.LinkedHashMap;
  20. import java.util.Map;
  21. import org.eclipse.jgit.lib.ObjectId;
  22. import org.eclipse.jgit.lib.ObjectIdRef;
  23. import org.eclipse.jgit.lib.Ref;
  24. import org.eclipse.jgit.lib.SymbolicRef;
  25. import org.junit.Test;
  26. public class BasePackConnectionTest {
  27. @Test
  28. public void testExtractSymRefsFromCapabilities() {
  29. final Map<String, String> symRefs = BasePackConnection
  30. .extractSymRefsFromCapabilities(
  31. Arrays.asList("symref=HEAD:refs/heads/main",
  32. "symref=refs/heads/sym:refs/heads/other"));
  33. assertEquals(2, symRefs.size());
  34. assertEquals("refs/heads/main", symRefs.get("HEAD"));
  35. assertEquals("refs/heads/other", symRefs.get("refs/heads/sym"));
  36. }
  37. @Test
  38. public void testUpdateWithSymRefsAdds() {
  39. final Ref mainRef = new ObjectIdRef.Unpeeled(Ref.Storage.LOOSE,
  40. "refs/heads/main", ObjectId.fromString(
  41. "0000000000000000000000000000000000000001"));
  42. final Map<String, Ref> refMap = new HashMap<>();
  43. refMap.put(mainRef.getName(), mainRef);
  44. refMap.put("refs/heads/other",
  45. new ObjectIdRef.Unpeeled(Ref.Storage.LOOSE, "refs/heads/other",
  46. ObjectId.fromString(
  47. "0000000000000000000000000000000000000002")));
  48. final Map<String, String> symRefs = new HashMap<>();
  49. symRefs.put("HEAD", "refs/heads/main");
  50. BasePackConnection.updateWithSymRefs(refMap, symRefs);
  51. assertThat(refMap, hasKey("HEAD"));
  52. final Ref headRef = refMap.get("HEAD");
  53. assertThat(headRef, instanceOf(SymbolicRef.class));
  54. final SymbolicRef headSymRef = (SymbolicRef) headRef;
  55. assertEquals("HEAD", headSymRef.getName());
  56. assertSame(mainRef, headSymRef.getTarget());
  57. }
  58. @Test
  59. public void testUpdateWithSymRefsReplaces() {
  60. final Ref mainRef = new ObjectIdRef.Unpeeled(Ref.Storage.LOOSE,
  61. "refs/heads/main", ObjectId.fromString(
  62. "0000000000000000000000000000000000000001"));
  63. final Map<String, Ref> refMap = new HashMap<>();
  64. refMap.put(mainRef.getName(), mainRef);
  65. refMap.put("HEAD", new ObjectIdRef.Unpeeled(Ref.Storage.LOOSE, "HEAD",
  66. mainRef.getObjectId()));
  67. refMap.put("refs/heads/other",
  68. new ObjectIdRef.Unpeeled(Ref.Storage.LOOSE, "refs/heads/other",
  69. ObjectId.fromString(
  70. "0000000000000000000000000000000000000002")));
  71. final Map<String, String> symRefs = new HashMap<>();
  72. symRefs.put("HEAD", "refs/heads/main");
  73. BasePackConnection.updateWithSymRefs(refMap, symRefs);
  74. assertThat(refMap, hasKey("HEAD"));
  75. final Ref headRef = refMap.get("HEAD");
  76. assertThat(headRef, instanceOf(SymbolicRef.class));
  77. final SymbolicRef headSymRef = (SymbolicRef) headRef;
  78. assertEquals("HEAD", headSymRef.getName());
  79. assertSame(mainRef, headSymRef.getTarget());
  80. }
  81. @Test
  82. public void testUpdateWithSymRefsWithIndirectsAdds() {
  83. final Ref mainRef = new ObjectIdRef.Unpeeled(Ref.Storage.LOOSE,
  84. "refs/heads/main", ObjectId.fromString(
  85. "0000000000000000000000000000000000000001"));
  86. final Map<String, Ref> refMap = new HashMap<>();
  87. refMap.put(mainRef.getName(), mainRef);
  88. refMap.put("refs/heads/other",
  89. new ObjectIdRef.Unpeeled(Ref.Storage.LOOSE, "refs/heads/other",
  90. ObjectId.fromString(
  91. "0000000000000000000000000000000000000002")));
  92. final Map<String, String> symRefs = new LinkedHashMap<>(); // Ordered
  93. symRefs.put("refs/heads/sym3", "refs/heads/sym2"); // Forward reference
  94. symRefs.put("refs/heads/sym1", "refs/heads/main");
  95. symRefs.put("refs/heads/sym2", "refs/heads/sym1"); // Backward reference
  96. BasePackConnection.updateWithSymRefs(refMap, symRefs);
  97. assertThat(refMap, hasKey("refs/heads/sym1"));
  98. final Ref sym1Ref = refMap.get("refs/heads/sym1");
  99. assertThat(sym1Ref, instanceOf(SymbolicRef.class));
  100. final SymbolicRef sym1SymRef = (SymbolicRef) sym1Ref;
  101. assertEquals("refs/heads/sym1", sym1SymRef.getName());
  102. assertSame(mainRef, sym1SymRef.getTarget());
  103. assertThat(refMap, hasKey("refs/heads/sym2"));
  104. final Ref sym2Ref = refMap.get("refs/heads/sym2");
  105. assertThat(sym2Ref, instanceOf(SymbolicRef.class));
  106. final SymbolicRef sym2SymRef = (SymbolicRef) sym2Ref;
  107. assertEquals("refs/heads/sym2", sym2SymRef.getName());
  108. assertSame(sym1SymRef, sym2SymRef.getTarget());
  109. assertThat(refMap, hasKey("refs/heads/sym3"));
  110. final Ref sym3Ref = refMap.get("refs/heads/sym3");
  111. assertThat(sym3Ref, instanceOf(SymbolicRef.class));
  112. final SymbolicRef sym3SymRef = (SymbolicRef) sym3Ref;
  113. assertEquals("refs/heads/sym3", sym3SymRef.getName());
  114. assertSame(sym2SymRef, sym3SymRef.getTarget());
  115. }
  116. @Test
  117. public void testUpdateWithSymRefsWithIndirectsReplaces() {
  118. final Ref mainRef = new ObjectIdRef.Unpeeled(Ref.Storage.LOOSE,
  119. "refs/heads/main", ObjectId.fromString(
  120. "0000000000000000000000000000000000000001"));
  121. final Map<String, Ref> refMap = new HashMap<>();
  122. refMap.put(mainRef.getName(), mainRef);
  123. refMap.put("refs/heads/sym1", new ObjectIdRef.Unpeeled(
  124. Ref.Storage.LOOSE, "refs/heads/sym1", mainRef.getObjectId()));
  125. refMap.put("refs/heads/sym2", new ObjectIdRef.Unpeeled(
  126. Ref.Storage.LOOSE, "refs/heads/sym2", mainRef.getObjectId()));
  127. refMap.put("refs/heads/sym3", new ObjectIdRef.Unpeeled(
  128. Ref.Storage.LOOSE, "refs/heads/sym3", mainRef.getObjectId()));
  129. refMap.put("refs/heads/other",
  130. new ObjectIdRef.Unpeeled(Ref.Storage.LOOSE, "refs/heads/other",
  131. ObjectId.fromString(
  132. "0000000000000000000000000000000000000002")));
  133. final Map<String, String> symRefs = new LinkedHashMap<>(); // Ordered
  134. symRefs.put("refs/heads/sym3", "refs/heads/sym2"); // Forward reference
  135. symRefs.put("refs/heads/sym1", "refs/heads/main");
  136. symRefs.put("refs/heads/sym2", "refs/heads/sym1"); // Backward reference
  137. BasePackConnection.updateWithSymRefs(refMap, symRefs);
  138. assertThat(refMap, hasKey("refs/heads/sym1"));
  139. final Ref sym1Ref = refMap.get("refs/heads/sym1");
  140. assertThat(sym1Ref, instanceOf(SymbolicRef.class));
  141. final SymbolicRef sym1SymRef = (SymbolicRef) sym1Ref;
  142. assertEquals("refs/heads/sym1", sym1SymRef.getName());
  143. assertSame(mainRef, sym1SymRef.getTarget());
  144. assertThat(refMap, hasKey("refs/heads/sym2"));
  145. final Ref sym2Ref = refMap.get("refs/heads/sym2");
  146. assertThat(sym2Ref, instanceOf(SymbolicRef.class));
  147. final SymbolicRef sym2SymRef = (SymbolicRef) sym2Ref;
  148. assertEquals("refs/heads/sym2", sym2SymRef.getName());
  149. assertSame(sym1SymRef, sym2SymRef.getTarget());
  150. assertThat(refMap, hasKey("refs/heads/sym3"));
  151. final Ref sym3Ref = refMap.get("refs/heads/sym3");
  152. assertThat(sym3Ref, instanceOf(SymbolicRef.class));
  153. final SymbolicRef sym3SymRef = (SymbolicRef) sym3Ref;
  154. assertEquals("refs/heads/sym3", sym3SymRef.getName());
  155. assertSame(sym2SymRef, sym3SymRef.getTarget());
  156. }
  157. @Test
  158. public void testUpdateWithSymRefsIgnoresSelfReference() {
  159. final Ref mainRef = new ObjectIdRef.Unpeeled(Ref.Storage.LOOSE,
  160. "refs/heads/main", ObjectId.fromString(
  161. "0000000000000000000000000000000000000001"));
  162. final Map<String, Ref> refMap = new HashMap<>();
  163. refMap.put(mainRef.getName(), mainRef);
  164. refMap.put("refs/heads/other",
  165. new ObjectIdRef.Unpeeled(Ref.Storage.LOOSE, "refs/heads/other",
  166. ObjectId.fromString(
  167. "0000000000000000000000000000000000000002")));
  168. final Map<String, String> symRefs = new LinkedHashMap<>();
  169. symRefs.put("refs/heads/sym1", "refs/heads/sym1");
  170. BasePackConnection.updateWithSymRefs(refMap, symRefs);
  171. assertEquals(2, refMap.size());
  172. assertThat(refMap, not(hasKey("refs/heads/sym1")));
  173. }
  174. @Test
  175. public void testUpdateWithSymRefsIgnoreCircularReference() {
  176. final Ref mainRef = new ObjectIdRef.Unpeeled(Ref.Storage.LOOSE,
  177. "refs/heads/main", ObjectId.fromString(
  178. "0000000000000000000000000000000000000001"));
  179. final Map<String, Ref> refMap = new HashMap<>();
  180. refMap.put(mainRef.getName(), mainRef);
  181. refMap.put("refs/heads/other",
  182. new ObjectIdRef.Unpeeled(Ref.Storage.LOOSE, "refs/heads/other",
  183. ObjectId.fromString(
  184. "0000000000000000000000000000000000000002")));
  185. final Map<String, String> symRefs = new LinkedHashMap<>();
  186. symRefs.put("refs/heads/sym2", "refs/heads/sym1");
  187. symRefs.put("refs/heads/sym1", "refs/heads/sym2");
  188. BasePackConnection.updateWithSymRefs(refMap, symRefs);
  189. assertEquals(2, refMap.size());
  190. assertThat(refMap, not(hasKey("refs/heads/sym1")));
  191. assertThat(refMap, not(hasKey("refs/heads/sym2")));
  192. }
  193. }