aboutsummaryrefslogtreecommitdiffstats
path: root/src/test/java/com/googlesource/gerrit/plugins/qtcodereview/QtCommandNewBuildIT.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java/com/googlesource/gerrit/plugins/qtcodereview/QtCommandNewBuildIT.java')
-rw-r--r--src/test/java/com/googlesource/gerrit/plugins/qtcodereview/QtCommandNewBuildIT.java231
1 files changed, 231 insertions, 0 deletions
diff --git a/src/test/java/com/googlesource/gerrit/plugins/qtcodereview/QtCommandNewBuildIT.java b/src/test/java/com/googlesource/gerrit/plugins/qtcodereview/QtCommandNewBuildIT.java
new file mode 100644
index 0000000..f029046
--- /dev/null
+++ b/src/test/java/com/googlesource/gerrit/plugins/qtcodereview/QtCommandNewBuildIT.java
@@ -0,0 +1,231 @@
+// Copyright (C) 2019 The Qt Company
+
+package com.googlesource.gerrit.plugins.qtcodereview;
+
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.acceptance.TestPlugin;
+import com.google.gerrit.acceptance.UseSsh;
+
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+
+import org.eclipse.jgit.revwalk.RevCommit;
+
+import java.util.ArrayList;
+
+import org.junit.Before;
+import org.junit.Test;
+
+@TestPlugin(
+ name = "gerrit-plugin-qt-workflow",
+ sysModule = "com.googlesource.gerrit.plugins.qtcodereview.QtModule",
+ sshModule = "com.googlesource.gerrit.plugins.qtcodereview.QtSshModule"
+)
+
+@UseSsh
+public class QtCommandNewBuildIT extends QtCodeReviewIT {
+
+ private final String BUILDING_MSG = "Added to build ";
+
+ @Before
+ public void SetDefaultPermissions() throws Exception {
+ grant(project, "refs/heads/master", Permission.QT_STAGE, false, REGISTERED_USERS);
+ grant(project, "refs/staging/*", Permission.PUSH, false, adminGroupUuid());
+ grant(project, "refs/builds/*", Permission.CREATE, false, adminGroupUuid());
+ }
+
+ @Test
+ public void singleChange_New_Staged_Integrating() throws Exception {
+ PushOneCommit.Result c = pushCommit("master", "commitmsg1", "file1", "content1");
+ approve(c.getChangeId());
+ QtStage(c);
+
+ RevCommit buildHead = qtNewBuild("master", "test-build-100", c, null);
+ }
+
+ @Test
+ public void multiChange_New_Staged_Integrating() throws Exception {
+ // Push 3 independent commits
+ RevCommit initialHead = getRemoteHead();
+ PushOneCommit.Result c1 = pushCommit("master", "commitmsg1", "file1", "content1");
+ testRepo.reset(initialHead);
+ PushOneCommit.Result c2 = pushCommit("master", "commitmsg2", "file2", "content2");
+ testRepo.reset(initialHead);
+ PushOneCommit.Result c3 = pushCommit("master", "commitmsg3", "file3", "content3");
+ approve(c1.getChangeId());
+ approve(c2.getChangeId());
+ approve(c3.getChangeId());
+ QtStage(c1);
+ QtStage(c2);
+ QtStage(c3);
+
+ RevCommit buildHead = qtNewBuild("master", "test-build-101", c3, null);
+ Change change = c1.getChange().change();
+ assertThat(change.getStatus()).isEqualTo(Change.Status.INTEGRATING);
+ change = c2.getChange().change();
+ assertThat(change.getStatus()).isEqualTo(Change.Status.INTEGRATING);
+ }
+
+
+ @Test
+ public void errorNewBuild_NoPermission() throws Exception {
+ PushOneCommit.Result c = pushCommit("master", "commitmsg1", "file1", "content1");
+ approve(c.getChangeId());
+ QtStage(c);
+
+ String commandStr;
+ commandStr ="gerrit-plugin-qt-workflow staging-new-build";
+ commandStr += " --project " + project.get();
+ commandStr += " --staging-branch master";
+ commandStr += " --build-id test-build-500";
+ String resultStr = userSshSession.exec(commandStr);
+ assertThat(userSshSession.getError()).contains("Authentication failed to access repository");
+ }
+
+ @Test
+ public void errorNewBuild_RepoNotFound() throws Exception {
+ PushOneCommit.Result c = pushCommit("master", "commitmsg1", "file1", "content1");
+ approve(c.getChangeId());
+ QtStage(c);
+
+ String commandStr;
+ commandStr ="gerrit-plugin-qt-workflow staging-new-build";
+ commandStr += " --project notarepo";
+ commandStr += " --staging-branch master";
+ commandStr += " --build-id test-build-500";
+ String resultStr = adminSshSession.exec(commandStr);
+ assertThat(adminSshSession.getError()).contains("project not found");
+ }
+
+ @Test
+ public void errorNewBuild_BuildAlreadyExists() throws Exception {
+ PushOneCommit.Result c = pushCommit("master", "commitmsg1", "file1", "content1");
+ approve(c.getChangeId());
+ QtStage(c);
+
+ RevCommit buildHead = qtNewBuild("master", "test-build-501", c, null);
+ String resultStr = qtNewBuildExpectFail("master", "test-build-501");
+ assertThat(resultStr).contains("Target build already exists!");
+ }
+
+ @Test
+ public void errorNewBuild_NoChanges() throws Exception {
+ RevCommit initialHead = getRemoteHead();
+ PushOneCommit.Result c = pushCommit("master", "commitmsg1", "file1", "content1");
+ approve(c.getChangeId());
+ QtStage(c);
+ QtUnStage(c);
+
+ String resultStr = qtNewBuildExpectFail("master", "test-build-502");
+ assertThat(resultStr).contains("No changes in staging branch. Not creating a build reference");
+ }
+
+ @Test
+ public void errorNewBuild_NoStagingRef() throws Exception {
+ PushOneCommit.Result c = pushCommit("master", "commitmsg1", "file1", "content1");
+
+ String resultStr = qtNewBuildExpectFail("master", "test-build-503");
+ assertThat(resultStr).contains("Staging ref not found!");
+ }
+
+ @Test
+ public void errorNewBuild_NonExistingBranch() throws Exception {
+ PushOneCommit.Result c = pushCommit("master", "commitmsg1", "file1", "content1");
+ approve(c.getChangeId());
+ QtStage(c);
+
+ String resultStr = qtNewBuildExpectFail("invalidbranchname", "test-build-504");
+ assertThat(resultStr).contains("Staging ref not found!");
+ }
+
+ @Test
+ public void errorAmend_Status_Integrating() throws Exception {
+ RevCommit initialHead = getRemoteHead();
+ PushOneCommit.Result c1 = pushCommit("master", "commitmsg1", "file1", "content1");
+ approve(c1.getChangeId());
+ QtStage(c1);
+ RevCommit buildHead = qtNewBuild("master", "test-build-150", c1, null);
+
+ PushOneCommit.Result c2 = amendCommit(c1.getChangeId());
+ c2.assertErrorStatus(" closed");
+
+ RevCommit updatedHead = getRemoteHead(project, "master");
+ assertThat(updatedHead.getId()).isEqualTo(initialHead.getId()); // not updated
+ }
+
+ private RevCommit qtNewBuild(String branch,
+ String buildId,
+ PushOneCommit.Result c,
+ RevCommit expectedHead)
+ throws Exception {
+ String stagingRef = R_STAGING + branch;
+ String branchRef = R_HEADS + branch;
+ String buildRef = R_BUILDS + buildId;
+ String commandStr;
+ RevCommit initialHead = getRemoteHead(project, branchRef);
+
+ commandStr ="gerrit-plugin-qt-workflow staging-new-build";
+ commandStr += " --project " + project.get();
+ commandStr += " --staging-branch " + branch;
+ commandStr += " --build-id " + buildId;
+ String resultStr = adminSshSession.exec(commandStr);
+ assertThat(adminSshSession.getError()).isNull();
+
+ RevCommit updatedHead = getRemoteHead(project, branchRef);
+ assertThat(updatedHead.getId()).isEqualTo(initialHead.getId()); // master is not updated
+
+ RevCommit stagingHead = getRemoteHead(project, stagingRef);
+ assertThat(stagingHead.getId()).isNotEqualTo(initialHead.getId()); // staging is not master
+
+ if (expectedHead == null) {
+ assertCherryPick(stagingHead, c.getCommit(), getCurrentPatchSHA(c));
+ expectedHead = stagingHead;
+ }
+
+ RevCommit buildHead = getRemoteHead(project, buildRef);
+ assertThat(buildHead).isEqualTo(expectedHead); // build ref is updated
+ assertRefUpdatedEvents(buildRef, null, expectedHead);
+
+ resetEvents();
+
+ Change change = c.getChange().change();
+ assertThat(change.getStatus()).isEqualTo(Change.Status.INTEGRATING);
+
+ ArrayList<ChangeMessage> messages = new ArrayList(c.getChange().messages());
+ assertThat(messages.get(messages.size() - 1).getMessage()).contains(BUILDING_MSG + buildId); // check last message
+
+ return buildHead;
+ }
+
+ private String qtNewBuildExpectFail(String branch,
+ String buildId)
+ throws Exception {
+ String stagingRef = R_STAGING + branch;
+ String branchRef = R_HEADS + branch;
+ String commandStr;
+ RevCommit initialHead = getRemoteHead(project, branchRef);
+ RevCommit stagingHeadOld = getRemoteHead(project, stagingRef);
+
+ commandStr ="gerrit-plugin-qt-workflow staging-new-build";
+ commandStr += " --project " + project.get();
+ commandStr += " --staging-branch " + branch;
+ commandStr += " --build-id " + buildId;
+ String resultStr = adminSshSession.exec(commandStr);
+
+ RevCommit updatedHead = getRemoteHead(project, branchRef);
+ if (updatedHead != null) assertThat(updatedHead.getId()).isEqualTo(initialHead.getId()); // master is not updated
+
+ RevCommit stagingHead = getRemoteHead(project, stagingRef);
+ if (stagingHeadOld != null && stagingHead != null) assertThat(stagingHead.getId()).isEqualTo(stagingHeadOld.getId()); // staging is not updated
+
+ return adminSshSession.getError();
+ }
+
+
+}