blob: 78960bb3291bb2d6c939c2de436eb65cd2330a06 [file] [log] [blame]
// Copyright (C) 2016 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.acceptance.ssh;
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
import com.google.common.collect.Lists;
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.NoHttpd;
import com.google.gerrit.acceptance.PushOneCommit;
import com.google.gerrit.acceptance.SshSession;
import com.google.gerrit.acceptance.UseSsh;
import com.google.gerrit.extensions.api.changes.AddReviewerInput;
import com.google.gerrit.extensions.api.changes.ReviewInput;
import com.google.gerrit.extensions.client.ListChangesOption;
import com.google.gerrit.extensions.client.Side;
import com.google.gerrit.server.data.ChangeAttribute;
import com.google.gson.Gson;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.junit.Test;
@NoHttpd
@UseSsh
public class QueryIT extends AbstractDaemonTest {
private static Gson gson = new Gson();
@Test
public void basicQueryJSON() throws Exception {
String changeId1 = createChange().getChangeId();
String changeId2 = createChange().getChangeId();
List<ChangeAttribute> changes = executeSuccessfulQuery("1234");
assertThat(changes).isEmpty();
changes = executeSuccessfulQuery(changeId1);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).project).isEqualTo(project.toString());
assertThat(changes.get(0).id).isEqualTo(changeId1);
changes = executeSuccessfulQuery(changeId1 + " OR " + changeId2);
assertThat(changes).hasSize(2);
assertThat(changes.get(0).project).isEqualTo(project.toString());
assertThat(changes.get(0).id).isEqualTo(changeId2);
assertThat(changes.get(1).project).isEqualTo(project.toString());
assertThat(changes.get(1).id).isEqualTo(changeId1);
changes = executeSuccessfulQuery("--start=1 " + changeId1 + " OR " + changeId2);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).project).isEqualTo(project.toString());
assertThat(changes.get(0).id).isEqualTo(changeId1);
}
@Test
public void allApprovalsOptionJSON() throws Exception {
String changeId = createChange().getChangeId();
gApi.changes().id(changeId).current().review(ReviewInput.approve());
List<ChangeAttribute> changes = executeSuccessfulQuery(changeId);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).patchSets).isNull();
changes = executeSuccessfulQuery("--all-approvals " + changeId);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).patchSets).isNotNull();
assertThat(changes.get(0).patchSets.get(0).approvals).isNotNull();
assertThat(changes.get(0).patchSets.get(0).approvals).hasSize(1);
}
@Test
public void allReviewersOptionJSON() throws Exception {
String changeId = createChange().getChangeId();
AddReviewerInput in = new AddReviewerInput();
in.reviewer = user.email();
gApi.changes().id(changeId).addReviewer(in);
List<ChangeAttribute> changes = executeSuccessfulQuery(changeId);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).allReviewers).isNull();
changes = executeSuccessfulQuery("--all-reviewers " + changeId);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).allReviewers).isNotNull();
assertThat(changes.get(0).allReviewers).hasSize(1);
}
@Test
public void commitMessageOptionJSON() throws Exception {
String changeId = createChange().getChangeId();
List<ChangeAttribute> changes = executeSuccessfulQuery("--commit-message " + changeId);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).commitMessage).isNotNull();
assertThat(changes.get(0).commitMessage).contains(PushOneCommit.SUBJECT);
}
@Test
public void currentPatchSetOptionJSON() throws Exception {
String changeId = createChange().getChangeId();
amendChange(changeId);
List<ChangeAttribute> changes = executeSuccessfulQuery(changeId);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).currentPatchSet).isNull();
changes = executeSuccessfulQuery("--current-patch-set " + changeId);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).currentPatchSet).isNotNull();
assertThat(changes.get(0).currentPatchSet.number).isEqualTo(2);
gApi.changes().id(changeId).current().review(ReviewInput.approve());
changes = executeSuccessfulQuery("--current-patch-set " + changeId);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).currentPatchSet).isNotNull();
assertThat(changes.get(0).currentPatchSet.approvals).isNotNull();
assertThat(changes.get(0).currentPatchSet.approvals).hasSize(1);
}
@Test
public void patchSetsOptionJSON() throws Exception {
String changeId = createChange().getChangeId();
amendChange(changeId);
amendChange(changeId);
List<ChangeAttribute> changes = executeSuccessfulQuery(changeId);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).patchSets).isNull();
changes = executeSuccessfulQuery("--patch-sets " + changeId);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).patchSets).isNotNull();
assertThat(changes.get(0).patchSets).hasSize(3);
}
@Test
public void shouldFailWithFilesWithoutPatchSetsOrCurrentPatchSetsOption() throws Exception {
String changeId = createChange().getChangeId();
adminSshSession.exec("gerrit query --files " + changeId);
adminSshSession.assertFailure("needs --patch-sets or --current-patch-set");
}
@Test
public void fileOptionJSON() throws Exception {
String changeId = createChange().getChangeId();
List<ChangeAttribute> changes =
executeSuccessfulQuery("--current-patch-set --files " + changeId);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).currentPatchSet.files).isNotNull();
assertThat(changes.get(0).currentPatchSet.files).hasSize(2);
changes = executeSuccessfulQuery("--patch-sets --files " + changeId);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).patchSets.get(0).files).isNotNull();
assertThat(changes.get(0).patchSets.get(0).files).hasSize(2);
gApi.changes().id(changeId).current().review(ReviewInput.approve());
changes = executeSuccessfulQuery("--patch-sets --files --all-approvals " + changeId);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).patchSets.get(0).files).isNotNull();
assertThat(changes.get(0).patchSets.get(0).files).hasSize(2);
assertThat(changes.get(0).patchSets.get(0).approvals).isNotNull();
assertThat(changes.get(0).patchSets.get(0).approvals).hasSize(1);
}
@Test
public void commentOptionJSON() throws Exception {
String changeId = createChange().getChangeId();
List<ChangeAttribute> changes = executeSuccessfulQuery(changeId);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).comments).isNull();
changes = executeSuccessfulQuery("--comments " + changeId);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).comments).isNotNull();
assertThat(changes.get(0).comments).hasSize(1);
}
@Test
public void commentOptionsInCurrentPatchSetJSON() throws Exception {
String changeId = createChange().getChangeId();
ReviewInput review = new ReviewInput();
ReviewInput.CommentInput comment = new ReviewInput.CommentInput();
comment.path = PushOneCommit.FILE_NAME;
comment.side = Side.REVISION;
comment.message = "comment 1";
review.comments = new HashMap<>();
review.comments.put(comment.path, Lists.newArrayList(comment));
gApi.changes().id(changeId).current().review(review);
List<ChangeAttribute> changes = executeSuccessfulQuery("--current-patch-set " + changeId);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).currentPatchSet.comments).isNull();
changes = executeSuccessfulQuery("--current-patch-set --comments " + changeId);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).currentPatchSet.comments).isNotNull();
assertThat(changes.get(0).currentPatchSet.comments).hasSize(1);
}
@Test
public void commentOptionInPatchSetsJSON() throws Exception {
String changeId = createChange().getChangeId();
ReviewInput review = new ReviewInput();
ReviewInput.CommentInput comment = new ReviewInput.CommentInput();
comment.path = PushOneCommit.FILE_NAME;
comment.side = Side.REVISION;
comment.message = "comment 1";
review.comments = new HashMap<>();
review.comments.put(comment.path, Lists.newArrayList(comment));
gApi.changes().id(changeId).current().review(review);
List<ChangeAttribute> changes = executeSuccessfulQuery("--patch-sets " + changeId);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).patchSets.get(0).comments).isNull();
changes = executeSuccessfulQuery("--patch-sets --comments " + changeId);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).patchSets.get(0).comments).isNotNull();
assertThat(changes.get(0).patchSets.get(0).comments).hasSize(1);
changes = executeSuccessfulQuery("--patch-sets --comments --files " + changeId);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).patchSets.get(0).comments).isNotNull();
assertThat(changes.get(0).patchSets.get(0).comments).hasSize(1);
assertThat(changes.get(0).patchSets.get(0).files).isNotNull();
assertThat(changes.get(0).patchSets.get(0).files).hasSize(2);
gApi.changes().id(changeId).current().review(ReviewInput.approve());
changes = executeSuccessfulQuery("--patch-sets --comments --files --all-approvals " + changeId);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).patchSets.get(0).comments).isNotNull();
assertThat(changes.get(0).patchSets.get(0).comments).hasSize(1);
assertThat(changes.get(0).patchSets.get(0).files).isNotNull();
assertThat(changes.get(0).patchSets.get(0).files).hasSize(2);
assertThat(changes.get(0).patchSets.get(0).approvals).isNotNull();
assertThat(changes.get(0).patchSets.get(0).approvals).hasSize(1);
}
@Test
public void dependenciesOptionJSON() throws Exception {
String changeId1 = createChange().getChangeId();
String changeId2 = createChange().getChangeId();
List<ChangeAttribute> changes = executeSuccessfulQuery(changeId1);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).dependsOn).isNull();
changes = executeSuccessfulQuery("--dependencies " + changeId1);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).dependsOn).isNull();
changes = executeSuccessfulQuery(changeId2);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).dependsOn).isNull();
changes = executeSuccessfulQuery("--dependencies " + changeId2);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).dependsOn).isNotNull();
assertThat(changes.get(0).dependsOn).hasSize(1);
}
@Test
public void submitRecordsOptionJSON() throws Exception {
String changeId = createChange().getChangeId();
List<ChangeAttribute> changes = executeSuccessfulQuery(changeId);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).submitRecords).isNull();
changes = executeSuccessfulQuery("--submit-records " + changeId);
assertThat(changes).hasSize(1);
assertThat(changes.get(0).submitRecords).isNotNull();
assertThat(changes.get(0).submitRecords).hasSize(1);
}
@Test
public void allChangeOptionsAreServedWithoutExceptions() throws Exception {
PushOneCommit.Result r = createChange();
// Merge the change so that the result has more data and potentially went through more
// computation while formatting the output, such as labels, reviewers etc.
merge(r);
for (ListChangesOption option : ListChangesOption.values()) {
assertWithMessage("Option: " + option)
.that(gApi.changes().query(r.getChangeId()).withOption(option).get())
.hasSize(1);
}
}
private List<ChangeAttribute> executeSuccessfulQuery(String params, SshSession session)
throws Exception {
String rawResponse = session.exec("gerrit query --format=JSON " + params);
session.assertSuccess();
return getChanges(rawResponse);
}
private List<ChangeAttribute> executeSuccessfulQuery(String params) throws Exception {
return executeSuccessfulQuery(params, adminSshSession);
}
private static List<ChangeAttribute> getChanges(String rawResponse) {
String[] lines = rawResponse.split("\\n");
List<ChangeAttribute> changes = new ArrayList<>(lines.length - 1);
for (int i = 0; i < lines.length - 1; i++) {
changes.add(gson.fromJson(lines[i], ChangeAttribute.class));
}
return changes;
}
}