diff options
Diffstat (limited to 'javatests/com/google/gerrit/server/group/db/GroupNameNotesTest.java')
-rw-r--r-- | javatests/com/google/gerrit/server/group/db/GroupNameNotesTest.java | 603 |
1 files changed, 603 insertions, 0 deletions
diff --git a/javatests/com/google/gerrit/server/group/db/GroupNameNotesTest.java b/javatests/com/google/gerrit/server/group/db/GroupNameNotesTest.java new file mode 100644 index 0000000000..42d01e2bfd --- /dev/null +++ b/javatests/com/google/gerrit/server/group/db/GroupNameNotesTest.java @@ -0,0 +1,603 @@ +// Copyright (C) 2017 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.server.group.db; + +import static com.google.common.truth.Truth.assertThat; +import static com.google.common.truth.Truth.assert_; +import static com.google.gerrit.extensions.common.testing.CommitInfoSubject.assertThat; +import static com.google.gerrit.reviewdb.client.RefNames.REFS_GROUPNAMES; +import static com.google.gerrit.truth.OptionalSubject.assertThat; +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.eclipse.jgit.lib.Constants.OBJ_BLOB; + +import com.google.common.collect.ImmutableList; +import com.google.gerrit.common.data.GroupReference; +import com.google.gerrit.common.data.testing.GroupReferenceSubject; +import com.google.gerrit.extensions.common.CommitInfo; +import com.google.gerrit.extensions.common.testing.CommitInfoSubject; +import com.google.gerrit.reviewdb.client.AccountGroup; +import com.google.gerrit.reviewdb.client.Project; +import com.google.gerrit.reviewdb.client.RefNames; +import com.google.gerrit.server.config.AllUsersName; +import com.google.gerrit.server.config.AllUsersNameProvider; +import com.google.gerrit.server.extensions.events.GitReferenceUpdated; +import com.google.gerrit.server.git.meta.MetaDataUpdate; +import com.google.gerrit.server.update.RefUpdateUtil; +import com.google.gerrit.server.util.time.TimeUtil; +import com.google.gerrit.testing.GitTestUtil; +import com.google.gerrit.testing.TestTimeUtil; +import com.google.gerrit.truth.ListSubject; +import com.google.gerrit.truth.OptionalSubject; +import com.google.gwtorm.client.KeyUtil; +import com.google.gwtorm.server.OrmDuplicateKeyException; +import com.google.gwtorm.server.StandardKeyEncoder; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; +import org.eclipse.jgit.errors.ConfigInvalidException; +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.BatchRefUpdate; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.ObjectInserter; +import org.eclipse.jgit.lib.ObjectReader; +import org.eclipse.jgit.lib.PersonIdent; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.notes.NoteMap; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.revwalk.RevWalk; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +public class GroupNameNotesTest { + static { + KeyUtil.setEncoderImpl(new StandardKeyEncoder()); + } + + private static final String SERVER_NAME = "Gerrit Server"; + private static final String SERVER_EMAIL = "noreply@gerritcodereview.com"; + private static final TimeZone TZ = TimeZone.getTimeZone("America/Los_Angeles"); + + @Rule public ExpectedException expectedException = ExpectedException.none(); + + private final AccountGroup.UUID groupUuid = new AccountGroup.UUID("users-XYZ"); + private final AccountGroup.NameKey groupName = new AccountGroup.NameKey("users"); + + private AtomicInteger idCounter; + private AllUsersName allUsersName; + private Repository repo; + + @Before + public void setUp() { + TestTimeUtil.resetWithClockStep(1, TimeUnit.SECONDS); + idCounter = new AtomicInteger(); + allUsersName = new AllUsersName(AllUsersNameProvider.DEFAULT); + repo = new InMemoryRepository(new DfsRepositoryDescription(AllUsersNameProvider.DEFAULT)); + } + + @After + public void tearDown() { + TestTimeUtil.useSystemTime(); + } + + @Test + public void newGroupCanBeCreated() throws Exception { + createGroup(groupUuid, groupName); + + Optional<GroupReference> groupReference = loadGroup(groupName); + assertThatGroup(groupReference).value().groupUuid().isEqualTo(groupUuid); + assertThatGroup(groupReference).value().name().isEqualTo(groupName.get()); + } + + @Test + public void uuidOfNewGroupMustNotBeNull() throws Exception { + expectedException.expect(NullPointerException.class); + GroupNameNotes.forNewGroup(allUsersName, repo, null, groupName); + } + + @Test + public void nameOfNewGroupMustNotBeNull() throws Exception { + expectedException.expect(NullPointerException.class); + GroupNameNotes.forNewGroup(allUsersName, repo, groupUuid, null); + } + + @Test + public void nameOfNewGroupMayBeEmpty() throws Exception { + AccountGroup.NameKey emptyName = new AccountGroup.NameKey(""); + createGroup(groupUuid, emptyName); + + Optional<GroupReference> groupReference = loadGroup(emptyName); + assertThatGroup(groupReference).value().name().isEqualTo(""); + } + + @Test + public void newGroupMustNotReuseNameOfAnotherGroup() throws Exception { + createGroup(groupUuid, groupName); + + AccountGroup.UUID anotherGroupUuid = new AccountGroup.UUID("AnotherGroup"); + expectedException.expect(OrmDuplicateKeyException.class); + expectedException.expectMessage(groupName.get()); + GroupNameNotes.forNewGroup(allUsersName, repo, anotherGroupUuid, groupName); + } + + @Test + public void newGroupMayReuseUuidOfAnotherGroup() throws Exception { + createGroup(groupUuid, groupName); + + AccountGroup.NameKey anotherName = new AccountGroup.NameKey("admins"); + createGroup(groupUuid, anotherName); + + Optional<GroupReference> group1 = loadGroup(groupName); + assertThatGroup(group1).value().groupUuid().isEqualTo(groupUuid); + Optional<GroupReference> group2 = loadGroup(anotherName); + assertThatGroup(group2).value().groupUuid().isEqualTo(groupUuid); + } + + @Test + public void groupCanBeRenamed() throws Exception { + createGroup(groupUuid, groupName); + + AccountGroup.NameKey anotherName = new AccountGroup.NameKey("admins"); + renameGroup(groupUuid, groupName, anotherName); + + Optional<GroupReference> groupReference = loadGroup(anotherName); + assertThatGroup(groupReference).value().groupUuid().isEqualTo(groupUuid); + assertThatGroup(groupReference).value().name().isEqualTo(anotherName.get()); + } + + @Test + public void previousNameOfGroupCannotBeUsedAfterRename() throws Exception { + createGroup(groupUuid, groupName); + + AccountGroup.NameKey anotherName = new AccountGroup.NameKey("admins"); + renameGroup(groupUuid, groupName, anotherName); + + Optional<GroupReference> group = loadGroup(groupName); + assertThatGroup(group).isAbsent(); + } + + @Test + public void groupCannotBeRenamedToNull() throws Exception { + createGroup(groupUuid, groupName); + + expectedException.expect(NullPointerException.class); + GroupNameNotes.forRename(allUsersName, repo, groupUuid, groupName, null); + } + + @Test + public void oldNameOfGroupMustBeSpecifiedForRename() throws Exception { + createGroup(groupUuid, groupName); + + AccountGroup.NameKey anotherName = new AccountGroup.NameKey("admins"); + expectedException.expect(NullPointerException.class); + GroupNameNotes.forRename(allUsersName, repo, groupUuid, null, anotherName); + } + + @Test + public void groupCannotBeRenamedWhenOldNameIsWrong() throws Exception { + createGroup(groupUuid, groupName); + + AccountGroup.NameKey anotherOldName = new AccountGroup.NameKey("contributors"); + AccountGroup.NameKey anotherName = new AccountGroup.NameKey("admins"); + expectedException.expect(ConfigInvalidException.class); + expectedException.expectMessage(anotherOldName.get()); + GroupNameNotes.forRename(allUsersName, repo, groupUuid, anotherOldName, anotherName); + } + + @Test + public void groupCannotBeRenamedToNameOfAnotherGroup() throws Exception { + createGroup(groupUuid, groupName); + AccountGroup.UUID anotherGroupUuid = new AccountGroup.UUID("admins-ABC"); + AccountGroup.NameKey anotherGroupName = new AccountGroup.NameKey("admins"); + createGroup(anotherGroupUuid, anotherGroupName); + + expectedException.expect(OrmDuplicateKeyException.class); + expectedException.expectMessage(anotherGroupName.get()); + GroupNameNotes.forRename(allUsersName, repo, groupUuid, groupName, anotherGroupName); + } + + @Test + public void groupCannotBeRenamedWithoutSpecifiedUuid() throws Exception { + createGroup(groupUuid, groupName); + + AccountGroup.NameKey anotherName = new AccountGroup.NameKey("admins"); + expectedException.expect(NullPointerException.class); + GroupNameNotes.forRename(allUsersName, repo, null, groupName, anotherName); + } + + @Test + public void groupCannotBeRenamedWhenUuidIsWrong() throws Exception { + createGroup(groupUuid, groupName); + + AccountGroup.UUID anotherGroupUuid = new AccountGroup.UUID("admins-ABC"); + AccountGroup.NameKey anotherName = new AccountGroup.NameKey("admins"); + expectedException.expect(ConfigInvalidException.class); + expectedException.expectMessage(groupUuid.get()); + GroupNameNotes.forRename(allUsersName, repo, anotherGroupUuid, groupName, anotherName); + } + + @Test + public void firstGroupCreationCreatesARootCommit() throws Exception { + createGroup(groupUuid, groupName); + + Ref ref = repo.exactRef(RefNames.REFS_GROUPNAMES); + assertThat(ref.getObjectId()).isNotNull(); + + try (RevWalk revWalk = new RevWalk(repo)) { + RevCommit revCommit = revWalk.parseCommit(ref.getObjectId()); + assertThat(revCommit.getParentCount()).isEqualTo(0); + } + } + + @Test + public void furtherGroupCreationAppendsACommit() throws Exception { + createGroup(groupUuid, groupName); + ImmutableList<CommitInfo> commitsAfterCreation = log(); + + AccountGroup.UUID anotherGroupUuid = new AccountGroup.UUID("admins-ABC"); + AccountGroup.NameKey anotherName = new AccountGroup.NameKey("admins"); + createGroup(anotherGroupUuid, anotherName); + + ImmutableList<CommitInfo> commitsAfterFurtherGroup = log(); + assertThatCommits(commitsAfterFurtherGroup).containsAllIn(commitsAfterCreation); + assertThatCommits(commitsAfterFurtherGroup).lastElement().isNotIn(commitsAfterCreation); + } + + @Test + public void groupRenamingAppendsACommit() throws Exception { + createGroup(groupUuid, groupName); + ImmutableList<CommitInfo> commitsAfterCreation = log(); + + AccountGroup.NameKey anotherName = new AccountGroup.NameKey("admins"); + renameGroup(groupUuid, groupName, anotherName); + + ImmutableList<CommitInfo> commitsAfterRename = log(); + assertThatCommits(commitsAfterRename).containsAllIn(commitsAfterCreation); + assertThatCommits(commitsAfterRename).lastElement().isNotIn(commitsAfterCreation); + } + + @Test + public void newCommitIsNotCreatedForRedundantNameUpdate() throws Exception { + createGroup(groupUuid, groupName); + ImmutableList<CommitInfo> commitsAfterCreation = log(); + + renameGroup(groupUuid, groupName, groupName); + + ImmutableList<CommitInfo> commitsAfterRename = log(); + assertThatCommits(commitsAfterRename).isEqualTo(commitsAfterCreation); + } + + @Test + public void newCommitIsNotCreatedWhenCommittingGroupCreationTwice() throws Exception { + GroupNameNotes groupNameNotes = + GroupNameNotes.forNewGroup(allUsersName, repo, groupUuid, groupName); + + commit(groupNameNotes); + ImmutableList<CommitInfo> commitsAfterFirstCommit = log(); + commit(groupNameNotes); + ImmutableList<CommitInfo> commitsAfterSecondCommit = log(); + + assertThatCommits(commitsAfterSecondCommit).isEqualTo(commitsAfterFirstCommit); + } + + @Test + public void newCommitIsNotCreatedWhenCommittingGroupRenamingTwice() throws Exception { + createGroup(groupUuid, groupName); + + AccountGroup.NameKey anotherName = new AccountGroup.NameKey("admins"); + GroupNameNotes groupNameNotes = + GroupNameNotes.forRename(allUsersName, repo, groupUuid, groupName, anotherName); + + commit(groupNameNotes); + ImmutableList<CommitInfo> commitsAfterFirstCommit = log(); + commit(groupNameNotes); + ImmutableList<CommitInfo> commitsAfterSecondCommit = log(); + + assertThatCommits(commitsAfterSecondCommit).isEqualTo(commitsAfterFirstCommit); + } + + @Test + public void commitMessageMentionsGroupCreation() throws Exception { + createGroup(groupUuid, groupName); + + ImmutableList<CommitInfo> commits = log(); + assertThatCommits(commits).lastElement().message().contains("Create"); + assertThatCommits(commits).lastElement().message().contains(groupName.get()); + } + + @Test + public void commitMessageMentionsGroupRenaming() throws Exception { + createGroup(groupUuid, groupName); + + AccountGroup.NameKey anotherName = new AccountGroup.NameKey("admins"); + renameGroup(groupUuid, groupName, anotherName); + + ImmutableList<CommitInfo> commits = log(); + assertThatCommits(commits).lastElement().message().contains("Rename"); + assertThatCommits(commits).lastElement().message().contains(groupName.get()); + assertThatCommits(commits).lastElement().message().contains(anotherName.get()); + } + + @Test + public void nonExistentNotesRefIsEquivalentToNonExistentGroup() throws Exception { + Optional<GroupReference> group = loadGroup(groupName); + + assertThatGroup(group).isAbsent(); + } + + @Test + public void nonExistentGroupCannotBeLoaded() throws Exception { + createGroup(new AccountGroup.UUID("contributors-MN"), new AccountGroup.NameKey("contributors")); + createGroup(groupUuid, groupName); + + Optional<GroupReference> group = loadGroup(new AccountGroup.NameKey("admins")); + assertThatGroup(group).isAbsent(); + } + + @Test + public void specificGroupCanBeLoaded() throws Exception { + createGroup(new AccountGroup.UUID("contributors-MN"), new AccountGroup.NameKey("contributors")); + createGroup(groupUuid, groupName); + createGroup(new AccountGroup.UUID("admins-ABC"), new AccountGroup.NameKey("admins")); + + Optional<GroupReference> group = loadGroup(groupName); + assertThatGroup(group).value().groupUuid().isEqualTo(groupUuid); + } + + @Test + public void nonExistentNotesRefIsEquivalentToNotAnyExistingGroups() throws Exception { + ImmutableList<GroupReference> allGroups = GroupNameNotes.loadAllGroups(repo); + + assertThat(allGroups).isEmpty(); + } + + @Test + public void allGroupsCanBeLoaded() throws Exception { + AccountGroup.UUID groupUuid1 = new AccountGroup.UUID("contributors-MN"); + AccountGroup.NameKey groupName1 = new AccountGroup.NameKey("contributors"); + createGroup(groupUuid1, groupName1); + AccountGroup.UUID groupUuid2 = new AccountGroup.UUID("admins-ABC"); + AccountGroup.NameKey groupName2 = new AccountGroup.NameKey("admins"); + createGroup(groupUuid2, groupName2); + + ImmutableList<GroupReference> allGroups = GroupNameNotes.loadAllGroups(repo); + + GroupReference group1 = new GroupReference(groupUuid1, groupName1.get()); + GroupReference group2 = new GroupReference(groupUuid2, groupName2.get()); + assertThat(allGroups).containsExactly(group1, group2); + } + + @Test + public void loadedGroupsContainGroupsWithDuplicateGroupUuids() throws Exception { + createGroup(groupUuid, groupName); + AccountGroup.NameKey anotherGroupName = new AccountGroup.NameKey("admins"); + createGroup(groupUuid, anotherGroupName); + + ImmutableList<GroupReference> allGroups = GroupNameNotes.loadAllGroups(repo); + + GroupReference group1 = new GroupReference(groupUuid, groupName.get()); + GroupReference group2 = new GroupReference(groupUuid, anotherGroupName.get()); + assertThat(allGroups).containsExactly(group1, group2); + } + + @Test + public void updateGroupNames() throws Exception { + GroupReference g1 = newGroup("a"); + GroupReference g2 = newGroup("b"); + + PersonIdent ident = newPersonIdent(); + updateAllGroups(ident, g1, g2); + + ImmutableList<CommitInfo> log = log(); + assertThat(log).hasSize(1); + assertThat(log.get(0)).parents().isEmpty(); + assertThat(log.get(0)).message().isEqualTo("Store 2 group names"); + assertThat(log.get(0)).author().matches(ident); + assertThat(log.get(0)).committer().matches(ident); + + assertThat(GroupNameNotes.loadAllGroups(repo)).containsExactly(g1, g2); + + // Updating the same set of names is a no-op. + String commit = log.get(0).commit; + updateAllGroups(newPersonIdent(), g1, g2); + log = log(); + assertThat(log).hasSize(1); + assertThat(log.get(0)).commit().isEqualTo(commit); + } + + @Test + public void updateGroupNamesOverwritesExistingNotes() throws Exception { + GroupReference g1 = newGroup("a"); + GroupReference g2 = newGroup("b"); + + TestRepository<?> tr = new TestRepository<>(repo); + ObjectId k1 = getNoteKey(g1); + ObjectId k2 = getNoteKey(g2); + ObjectId k3 = GroupNameNotes.getNoteKey(new AccountGroup.NameKey("c")); + PersonIdent ident = newPersonIdent(); + ObjectId origCommitId = + tr.branch(REFS_GROUPNAMES) + .commit() + .message("Prepopulate group name") + .author(ident) + .committer(ident) + .add(k1.name(), "[group]\n\tuuid = a-1\n\tname = a\nanotherKey = foo\n") + .add(k2.name(), "[group]\n\tuuid = a-1\n\tname = b\n") + .add(k3.name(), "[group]\n\tuuid = c-3\n\tname = c\n") + .create() + .copy(); + + ident = newPersonIdent(); + updateAllGroups(ident, g1, g2); + + assertThat(GroupNameNotes.loadAllGroups(repo)).containsExactly(g1, g2); + + ImmutableList<CommitInfo> log = log(); + assertThat(log).hasSize(2); + assertThat(log.get(0)).commit().isEqualTo(origCommitId.name()); + + assertThat(log.get(1)).message().isEqualTo("Store 2 group names"); + assertThat(log.get(1)).author().matches(ident); + assertThat(log.get(1)).committer().matches(ident); + + // Old note content was overwritten. + assertThat(readNameNote(g1)).isEqualTo("[group]\n\tuuid = a-1\n\tname = a\n"); + } + + @Test + public void updateGroupNamesWithEmptyCollectionClearsAllNotes() throws Exception { + GroupReference g1 = newGroup("a"); + GroupReference g2 = newGroup("b"); + + PersonIdent ident = newPersonIdent(); + updateAllGroups(ident, g1, g2); + + assertThat(GroupNameNotes.loadAllGroups(repo)).containsExactly(g1, g2); + + updateAllGroups(ident); + + assertThat(GroupNameNotes.loadAllGroups(repo)).isEmpty(); + + ImmutableList<CommitInfo> log = log(); + assertThat(log).hasSize(2); + assertThat(log.get(1)).message().isEqualTo("Store 0 group names"); + } + + @Test + public void updateGroupNamesRejectsNonOneToOneGroupReferences() throws Exception { + assertIllegalArgument( + new GroupReference(new AccountGroup.UUID("uuid1"), "name1"), + new GroupReference(new AccountGroup.UUID("uuid1"), "name2")); + assertIllegalArgument( + new GroupReference(new AccountGroup.UUID("uuid1"), "name1"), + new GroupReference(new AccountGroup.UUID("uuid2"), "name1")); + assertIllegalArgument( + new GroupReference(new AccountGroup.UUID("uuid1"), "name1"), + new GroupReference(new AccountGroup.UUID("uuid1"), "name1")); + } + + @Test + public void emptyGroupName() throws Exception { + GroupReference g = newGroup(""); + updateAllGroups(newPersonIdent(), g); + + assertThat(GroupNameNotes.loadAllGroups(repo)).containsExactly(g); + assertThat(readNameNote(g)).isEqualTo("[group]\n\tuuid = -1\n\tname = \n"); + } + + private void createGroup(AccountGroup.UUID groupUuid, AccountGroup.NameKey groupName) + throws Exception { + GroupNameNotes groupNameNotes = + GroupNameNotes.forNewGroup(allUsersName, repo, groupUuid, groupName); + commit(groupNameNotes); + } + + private void renameGroup( + AccountGroup.UUID groupUuid, AccountGroup.NameKey oldName, AccountGroup.NameKey newName) + throws Exception { + GroupNameNotes groupNameNotes = + GroupNameNotes.forRename(allUsersName, repo, groupUuid, oldName, newName); + commit(groupNameNotes); + } + + private Optional<GroupReference> loadGroup(AccountGroup.NameKey groupName) throws Exception { + return GroupNameNotes.loadGroup(repo, groupName); + } + + private void commit(GroupNameNotes groupNameNotes) throws IOException { + try (MetaDataUpdate metaDataUpdate = createMetaDataUpdate()) { + groupNameNotes.commit(metaDataUpdate); + } + } + + private MetaDataUpdate createMetaDataUpdate() { + PersonIdent serverIdent = newPersonIdent(); + + MetaDataUpdate metaDataUpdate = + new MetaDataUpdate( + GitReferenceUpdated.DISABLED, new Project.NameKey("Test Repository"), repo); + metaDataUpdate.getCommitBuilder().setCommitter(serverIdent); + metaDataUpdate.getCommitBuilder().setAuthor(serverIdent); + return metaDataUpdate; + } + + private GroupReference newGroup(String name) { + int id = idCounter.incrementAndGet(); + return new GroupReference(new AccountGroup.UUID(name + "-" + id), name); + } + + private static PersonIdent newPersonIdent() { + return new PersonIdent(SERVER_NAME, SERVER_EMAIL, TimeUtil.nowTs(), TZ); + } + + private static ObjectId getNoteKey(GroupReference g) { + return GroupNameNotes.getNoteKey(new AccountGroup.NameKey(g.getName())); + } + + private void updateAllGroups(PersonIdent ident, GroupReference... groupRefs) throws Exception { + try (ObjectInserter inserter = repo.newObjectInserter()) { + BatchRefUpdate bru = repo.getRefDatabase().newBatchUpdate(); + GroupNameNotes.updateAllGroups(repo, inserter, bru, Arrays.asList(groupRefs), ident); + inserter.flush(); + RefUpdateUtil.executeChecked(bru, repo); + } + } + + private void assertIllegalArgument(GroupReference... groupRefs) throws Exception { + try (ObjectInserter inserter = repo.newObjectInserter()) { + BatchRefUpdate bru = repo.getRefDatabase().newBatchUpdate(); + PersonIdent ident = newPersonIdent(); + try { + GroupNameNotes.updateAllGroups(repo, inserter, bru, Arrays.asList(groupRefs), ident); + assert_().fail("Expected IllegalArgumentException"); + } catch (IllegalArgumentException e) { + assertThat(e).hasMessageThat().isEqualTo(GroupNameNotes.UNIQUE_REF_ERROR); + } + } + } + + private ImmutableList<CommitInfo> log() throws Exception { + return GitTestUtil.log(repo, REFS_GROUPNAMES); + } + + private String readNameNote(GroupReference g) throws Exception { + ObjectId k = getNoteKey(g); + try (RevWalk rw = new RevWalk(repo)) { + ObjectReader reader = rw.getObjectReader(); + Ref ref = repo.exactRef(RefNames.REFS_GROUPNAMES); + NoteMap noteMap = NoteMap.read(reader, rw.parseCommit(ref.getObjectId())); + return new String(reader.open(noteMap.get(k), OBJ_BLOB).getCachedBytes(), UTF_8); + } + } + + private static OptionalSubject<GroupReferenceSubject, GroupReference> assertThatGroup( + Optional<GroupReference> group) { + return assertThat(group, GroupReferenceSubject::assertThat); + } + + private static ListSubject<CommitInfoSubject, CommitInfo> assertThatCommits( + List<CommitInfo> commits) { + return ListSubject.assertThat(commits, CommitInfoSubject::assertThat); + } +} |