From d82c28f33bdf4dc07c074827372b9802c04b0d5c Mon Sep 17 00:00:00 2001 From: Patrick Hiesel Date: Wed, 2 Oct 2019 17:13:04 +0200 Subject: [PATCH] Fix bug that omitted sending change twice when serving multiple queries Bug: Issue 11467 Change-Id: I2573e29f5bd0f7672111f05dffbd099ccdac837e --- .../gerrit/server/change/ChangeJson.java | 1 + .../acceptance/api/change/QueryChangeIT.java | 61 +++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 javatests/com/google/gerrit/acceptance/api/change/QueryChangeIT.java diff --git a/java/com/google/gerrit/server/change/ChangeJson.java b/java/com/google/gerrit/server/change/ChangeJson.java index a3c2e926de..d50e740ce5 100644 --- a/java/com/google/gerrit/server/change/ChangeJson.java +++ b/java/com/google/gerrit/server/change/ChangeJson.java @@ -418,6 +418,7 @@ public class ChangeJson { for (ChangeData cd : changes) { ChangeInfo i = cache.get(cd.getId()); if (i != null) { + changeInfos.add(i); continue; } try { diff --git a/javatests/com/google/gerrit/acceptance/api/change/QueryChangeIT.java b/javatests/com/google/gerrit/acceptance/api/change/QueryChangeIT.java new file mode 100644 index 0000000000..76166e16fc --- /dev/null +++ b/javatests/com/google/gerrit/acceptance/api/change/QueryChangeIT.java @@ -0,0 +1,61 @@ +// Copyright (C) 2019 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.api.change; + +import static com.google.common.truth.Truth.assertThat; + +import com.google.common.collect.ImmutableList; +import com.google.gerrit.acceptance.AbstractDaemonTest; +import com.google.gerrit.acceptance.NoHttpd; +import com.google.gerrit.extensions.common.ChangeInfo; +import com.google.gerrit.extensions.restapi.TopLevelResource; +import com.google.gerrit.server.restapi.change.QueryChanges; +import com.google.inject.Inject; +import com.google.inject.Provider; +import java.util.List; +import org.junit.Test; + +@NoHttpd +public class QueryChangeIT extends AbstractDaemonTest { + + @Inject private Provider queryChangesProvider; + + @Test + @SuppressWarnings("unchecked") + public void multipleQueriesInOneRequestCanContainSameChange() throws Exception { + String cId1 = createChange().getChangeId(); + String cId2 = createChange().getChangeId(); + int numericId1 = gApi.changes().id(cId1).get()._number; + int numericId2 = gApi.changes().id(cId2).get()._number; + + gApi.changes().id(cId2).setWorkInProgress(); + + QueryChanges queryChanges = queryChangesProvider.get(); + + queryChanges.addQuery("is:open"); + queryChanges.addQuery("is:wip"); + + List> result = + (List>) queryChanges.apply(TopLevelResource.INSTANCE).value(); + assertThat(result).hasSize(2); + assertThat(result.get(0)).hasSize(2); + assertThat(result.get(1)).hasSize(1); + + List firstResultIds = + ImmutableList.of(result.get(0).get(0)._number, result.get(0).get(1)._number); + assertThat(firstResultIds).containsExactly(numericId1, numericId2); + assertThat(result.get(1).get(0)._number).isEqualTo(numericId2); + } +}