Merge branch 'stable-3.1'

* stable-3.1:
  Import from com.google.inject rather than javax.inject
  ProjectCache: Remove declarations of unthrown IOException
  ProjectIT: Remove unused executor
  e2e-tests: Collapse the load-tests directory level
  ChangeSubmitRequirementIT: Show that submit rules are cached on change query
  Update git submodules
  Update git submodules
  Update git submodules
  QueryChangeIT: Rename to QueryChangesIT
  QueryChangeIT: Backport moreChangesIndicatorDoesNotWronglyCopyToUnrelatedChanges
  Backport QueryChangeIT
  JettyServer: Stop using deprecated SslContextFactory constructor

Change-Id: Idf396f762f59eb91c813de985b1bb1b6f11d13c1
diff --git a/e2e-tests/load-tests/.gitignore b/e2e-tests/.gitignore
similarity index 100%
rename from e2e-tests/load-tests/.gitignore
rename to e2e-tests/.gitignore
diff --git a/e2e-tests/load-tests/Dockerfile b/e2e-tests/Dockerfile
similarity index 100%
rename from e2e-tests/load-tests/Dockerfile
rename to e2e-tests/Dockerfile
diff --git a/e2e-tests/load-tests/README.md b/e2e-tests/README.md
similarity index 100%
rename from e2e-tests/load-tests/README.md
rename to e2e-tests/README.md
diff --git a/e2e-tests/load-tests/build.sbt b/e2e-tests/build.sbt
similarity index 100%
rename from e2e-tests/load-tests/build.sbt
rename to e2e-tests/build.sbt
diff --git a/e2e-tests/load-tests/project/Dependencies.scala b/e2e-tests/project/Dependencies.scala
similarity index 100%
rename from e2e-tests/load-tests/project/Dependencies.scala
rename to e2e-tests/project/Dependencies.scala
diff --git a/e2e-tests/load-tests/project/build.properties b/e2e-tests/project/build.properties
similarity index 100%
rename from e2e-tests/load-tests/project/build.properties
rename to e2e-tests/project/build.properties
diff --git a/e2e-tests/load-tests/project/plugins.sbt b/e2e-tests/project/plugins.sbt
similarity index 100%
rename from e2e-tests/load-tests/project/plugins.sbt
rename to e2e-tests/project/plugins.sbt
diff --git a/e2e-tests/load-tests/src/test/resources/application.conf b/e2e-tests/src/test/resources/application.conf
similarity index 100%
rename from e2e-tests/load-tests/src/test/resources/application.conf
rename to e2e-tests/src/test/resources/application.conf
diff --git a/e2e-tests/load-tests/src/test/resources/data/CloneUsingBothProtocols.json b/e2e-tests/src/test/resources/data/CloneUsingBothProtocols.json
similarity index 100%
rename from e2e-tests/load-tests/src/test/resources/data/CloneUsingBothProtocols.json
rename to e2e-tests/src/test/resources/data/CloneUsingBothProtocols.json
diff --git a/e2e-tests/load-tests/src/test/resources/data/ReplayRecordsFromFeeder.json b/e2e-tests/src/test/resources/data/ReplayRecordsFromFeeder.json
similarity index 100%
rename from e2e-tests/load-tests/src/test/resources/data/ReplayRecordsFromFeeder.json
rename to e2e-tests/src/test/resources/data/ReplayRecordsFromFeeder.json
diff --git a/e2e-tests/load-tests/src/test/resources/gatling.conf b/e2e-tests/src/test/resources/gatling.conf
similarity index 100%
rename from e2e-tests/load-tests/src/test/resources/gatling.conf
rename to e2e-tests/src/test/resources/gatling.conf
diff --git a/e2e-tests/load-tests/src/test/resources/hooks/commit-msg b/e2e-tests/src/test/resources/hooks/commit-msg
similarity index 100%
rename from e2e-tests/load-tests/src/test/resources/hooks/commit-msg
rename to e2e-tests/src/test/resources/hooks/commit-msg
diff --git a/e2e-tests/load-tests/src/test/resources/logback.xml b/e2e-tests/src/test/resources/logback.xml
similarity index 100%
rename from e2e-tests/load-tests/src/test/resources/logback.xml
rename to e2e-tests/src/test/resources/logback.xml
diff --git a/e2e-tests/load-tests/src/test/scala/com/google/gerrit/scenarios/CloneUsingBothProtocols.scala b/e2e-tests/src/test/scala/com/google/gerrit/scenarios/CloneUsingBothProtocols.scala
similarity index 100%
rename from e2e-tests/load-tests/src/test/scala/com/google/gerrit/scenarios/CloneUsingBothProtocols.scala
rename to e2e-tests/src/test/scala/com/google/gerrit/scenarios/CloneUsingBothProtocols.scala
diff --git a/e2e-tests/load-tests/src/test/scala/com/google/gerrit/scenarios/GitSimulation.scala b/e2e-tests/src/test/scala/com/google/gerrit/scenarios/GitSimulation.scala
similarity index 100%
rename from e2e-tests/load-tests/src/test/scala/com/google/gerrit/scenarios/GitSimulation.scala
rename to e2e-tests/src/test/scala/com/google/gerrit/scenarios/GitSimulation.scala
diff --git a/e2e-tests/load-tests/src/test/scala/com/google/gerrit/scenarios/ReplayRecordsFromFeeder.scala b/e2e-tests/src/test/scala/com/google/gerrit/scenarios/ReplayRecordsFromFeeder.scala
similarity index 100%
rename from e2e-tests/load-tests/src/test/scala/com/google/gerrit/scenarios/ReplayRecordsFromFeeder.scala
rename to e2e-tests/src/test/scala/com/google/gerrit/scenarios/ReplayRecordsFromFeeder.scala
diff --git a/java/com/google/gerrit/server/git/UsersSelfAdvertiseRefsHook.java b/java/com/google/gerrit/server/git/UsersSelfAdvertiseRefsHook.java
index 169ae32..6c1879e 100644
--- a/java/com/google/gerrit/server/git/UsersSelfAdvertiseRefsHook.java
+++ b/java/com/google/gerrit/server/git/UsersSelfAdvertiseRefsHook.java
@@ -18,11 +18,11 @@
 import com.google.gerrit.entities.Account;
 import com.google.gerrit.entities.RefNames;
 import com.google.gerrit.server.CurrentUser;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
 import java.io.IOException;
 import java.util.Map;
-import javax.inject.Inject;
-import javax.inject.Provider;
-import javax.inject.Singleton;
 import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.lib.RefDatabase;
 import org.eclipse.jgit.lib.SymbolicRef;
diff --git a/java/com/google/gerrit/server/notedb/AllUsersAsyncUpdate.java b/java/com/google/gerrit/server/notedb/AllUsersAsyncUpdate.java
index 030cfb2..5417494 100644
--- a/java/com/google/gerrit/server/notedb/AllUsersAsyncUpdate.java
+++ b/java/com/google/gerrit/server/notedb/AllUsersAsyncUpdate.java
@@ -25,11 +25,11 @@
 import com.google.gerrit.server.FanOutExecutor;
 import com.google.gerrit.server.config.AllUsersName;
 import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.inject.Inject;
 import java.io.IOException;
 import java.util.Map;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
-import javax.inject.Inject;
 import org.eclipse.jgit.lib.BatchRefUpdate;
 import org.eclipse.jgit.lib.PersonIdent;
 import org.eclipse.jgit.transport.PushCertificate;
diff --git a/javatests/com/google/gerrit/acceptance/api/change/ChangeSubmitRequirementIT.java b/javatests/com/google/gerrit/acceptance/api/change/ChangeSubmitRequirementIT.java
index 4d76074..a704f0c 100644
--- a/javatests/com/google/gerrit/acceptance/api/change/ChangeSubmitRequirementIT.java
+++ b/javatests/com/google/gerrit/acceptance/api/change/ChangeSubmitRequirementIT.java
@@ -28,9 +28,13 @@
 import com.google.gerrit.extensions.config.FactoryModule;
 import com.google.gerrit.server.query.change.ChangeData;
 import com.google.gerrit.server.rules.SubmitRule;
+import com.google.inject.Inject;
 import com.google.inject.Module;
+import com.google.inject.Singleton;
 import java.util.ArrayList;
+import java.util.List;
 import java.util.Optional;
+import java.util.concurrent.atomic.AtomicBoolean;
 import org.junit.Test;
 
 public class ChangeSubmitRequirementIT extends AbstractDaemonTest {
@@ -56,22 +60,63 @@
     };
   }
 
+  @Inject CustomSubmitRule rule;
+
   @Test
-  public void checkSubmitRequirementIsPropagated() throws Exception {
+  public void submitRequirementIsPropagated() throws Exception {
+    rule.block(false);
     PushOneCommit.Result r = createChange();
 
     ChangeInfo result = gApi.changes().id(r.getChangeId()).get();
+    assertThat(result.requirements).isEmpty();
+
+    rule.block(true);
+    result = gApi.changes().id(r.getChangeId()).get();
     assertThat(result.requirements).containsExactly(reqInfo);
   }
 
+  @Test
+  public void submitRequirementIsPropagatedInQuery() throws Exception {
+    rule.block(false);
+    PushOneCommit.Result r = createChange();
+
+    String query = "status:open project:" + project.get();
+    List<ChangeInfo> result = gApi.changes().query(query).get();
+    assertThat(result).hasSize(1);
+    assertThat(result.get(0).requirements).isEmpty();
+
+    // Submit rule behavior is changed, but the query still returns
+    // the previous result from the index
+    rule.block(true);
+    result = gApi.changes().query(query).get();
+    assertThat(result).hasSize(1);
+    assertThat(result.get(0).requirements).isEmpty();
+
+    // The submit rule result is updated after the change is reindexed
+    gApi.changes().id(r.getChangeId()).index();
+    result = gApi.changes().query(query).get();
+    assertThat(result).hasSize(1);
+    assertThat(result.get(0).requirements).containsExactly(reqInfo);
+  }
+
+  @Singleton
   private static class CustomSubmitRule implements SubmitRule {
+    private final AtomicBoolean block = new AtomicBoolean(true);
+
+    public void block(boolean block) {
+      this.block.set(block);
+    }
+
     @Override
     public Optional<SubmitRecord> evaluate(ChangeData changeData) {
-      SubmitRecord record = new SubmitRecord();
-      record.labels = new ArrayList<>();
-      record.status = SubmitRecord.Status.NOT_READY;
-      record.requirements = ImmutableList.of(req);
-      return Optional.of(record);
+      if (block.get()) {
+        SubmitRecord record = new SubmitRecord();
+        record.labels = new ArrayList<>();
+        record.status = SubmitRecord.Status.NOT_READY;
+        record.requirements = ImmutableList.of(req);
+        return Optional.of(record);
+      }
+      return Optional.empty();
     }
   }
 }
diff --git a/javatests/com/google/gerrit/acceptance/api/change/QueryChangeIT.java b/javatests/com/google/gerrit/acceptance/api/change/QueryChangesIT.java
similarity index 99%
rename from javatests/com/google/gerrit/acceptance/api/change/QueryChangeIT.java
rename to javatests/com/google/gerrit/acceptance/api/change/QueryChangesIT.java
index 92ef02c..448f347 100644
--- a/javatests/com/google/gerrit/acceptance/api/change/QueryChangeIT.java
+++ b/javatests/com/google/gerrit/acceptance/api/change/QueryChangesIT.java
@@ -46,7 +46,7 @@
 import org.junit.Test;
 
 @NoHttpd
-public class QueryChangeIT extends AbstractDaemonTest {
+public class QueryChangesIT extends AbstractDaemonTest {
   @Inject private AccountOperations accountOperations;
   @Inject private ProjectOperations projectOperations;
   @Inject private Provider<QueryChanges> queryChangesProvider;