diff options
Diffstat (limited to 'java/com/google/gerrit/testing/TestChanges.java')
-rw-r--r-- | java/com/google/gerrit/testing/TestChanges.java | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/java/com/google/gerrit/testing/TestChanges.java b/java/com/google/gerrit/testing/TestChanges.java new file mode 100644 index 0000000000..8e752faa63 --- /dev/null +++ b/java/com/google/gerrit/testing/TestChanges.java @@ -0,0 +1,136 @@ +// Copyright (C) 2014 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.testing; + +import static com.google.common.base.MoreObjects.firstNonNull; + +import com.google.common.collect.Ordering; +import com.google.gerrit.extensions.config.FactoryModule; +import com.google.gerrit.reviewdb.client.Account; +import com.google.gerrit.reviewdb.client.Branch; +import com.google.gerrit.reviewdb.client.Change; +import com.google.gerrit.reviewdb.client.PatchSet; +import com.google.gerrit.reviewdb.client.PatchSetInfo; +import com.google.gerrit.reviewdb.client.Project; +import com.google.gerrit.reviewdb.client.RevId; +import com.google.gerrit.server.CurrentUser; +import com.google.gerrit.server.git.GitRepositoryManager; +import com.google.gerrit.server.notedb.AbstractChangeNotes; +import com.google.gerrit.server.notedb.ChangeNotes; +import com.google.gerrit.server.notedb.ChangeUpdate; +import com.google.gerrit.server.notedb.NotesMigration; +import com.google.gerrit.server.util.time.TimeUtil; +import com.google.inject.Injector; +import java.util.TimeZone; +import java.util.concurrent.atomic.AtomicInteger; +import org.eclipse.jgit.junit.TestRepository; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.PersonIdent; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.Repository; + +/** + * Utility functions to create and manipulate Change, ChangeUpdate, and ChangeControl objects for + * testing. + */ +public class TestChanges { + private static final AtomicInteger nextChangeId = new AtomicInteger(1); + + public static Change newChange(Project.NameKey project, Account.Id userId) { + return newChange(project, userId, nextChangeId.getAndIncrement()); + } + + public static Change newChange(Project.NameKey project, Account.Id userId, int id) { + Change.Id changeId = new Change.Id(id); + Change c = + new Change( + new Change.Key("Iabcd1234abcd1234abcd1234abcd1234abcd1234"), + changeId, + userId, + new Branch.NameKey(project, "master"), + TimeUtil.nowTs()); + incrementPatchSet(c); + return c; + } + + public static PatchSet newPatchSet(PatchSet.Id id, ObjectId revision, Account.Id userId) { + return newPatchSet(id, revision.name(), userId); + } + + public static PatchSet newPatchSet(PatchSet.Id id, String revision, Account.Id userId) { + PatchSet ps = new PatchSet(id); + ps.setRevision(new RevId(revision)); + ps.setUploader(userId); + ps.setCreatedOn(TimeUtil.nowTs()); + return ps; + } + + public static ChangeUpdate newUpdate(Injector injector, Change c, CurrentUser user) + throws Exception { + injector = + injector.createChildInjector( + new FactoryModule() { + @Override + public void configure() { + bind(CurrentUser.class).toInstance(user); + } + }); + ChangeUpdate update = + injector + .getInstance(ChangeUpdate.Factory.class) + .create( + new ChangeNotes(injector.getInstance(AbstractChangeNotes.Args.class), c).load(), + user, + TimeUtil.nowTs(), + Ordering.<String>natural()); + + ChangeNotes notes = update.getNotes(); + boolean hasPatchSets = notes.getPatchSets() != null && !notes.getPatchSets().isEmpty(); + NotesMigration migration = injector.getInstance(NotesMigration.class); + if (hasPatchSets || !migration.readChanges()) { + return update; + } + + // Change doesn't exist yet. NoteDb requires that there be a commit for the + // first patch set, so create one. + GitRepositoryManager repoManager = injector.getInstance(GitRepositoryManager.class); + try (Repository repo = repoManager.openRepository(c.getProject())) { + TestRepository<Repository> tr = new TestRepository<>(repo); + PersonIdent ident = + user.asIdentifiedUser().newCommitterIdent(update.getWhen(), TimeZone.getDefault()); + TestRepository<Repository>.CommitBuilder cb = + tr.commit() + .author(ident) + .committer(ident) + .message(firstNonNull(c.getSubject(), "Test change")); + Ref parent = repo.exactRef(c.getDest().get()); + if (parent != null) { + cb.parent(tr.getRevWalk().parseCommit(parent.getObjectId())); + } + update.setBranch(c.getDest().get()); + update.setChangeId(c.getKey().get()); + update.setCommit(tr.getRevWalk(), cb.create()); + return update; + } + } + + public static void incrementPatchSet(Change change) { + PatchSet.Id curr = change.currentPatchSetId(); + PatchSetInfo ps = + new PatchSetInfo(new PatchSet.Id(change.getId(), curr != null ? curr.get() + 1 : 1)); + ps.setSubject("Change subject"); + change.setCurrentPatchSet(ps); + } +} |