From c3fe0838cc114dcf90bcbf1e5ff4cfb58197125f Mon Sep 17 00:00:00 2001 From: Edwin Kempin Date: Wed, 25 Jan 2017 15:39:21 +0100 Subject: [PATCH] Make indexes available during init invoked by tests Tests do site initialization, but during this site initialization the indexes were not available. Due to this SchemaCreator had to do a null check on the search index when indexing new groups. Add the necessary Guice bindings to make the indexes available during init that is triggered by tests and ensure that the indexes are properly started before and stopped after the site initialization. Change-Id: Id2bd2157239f39395e594438fe877253a4906704 Signed-off-by: Edwin Kempin --- gerrit-server/BUILD | 1 + .../index/change/ChangeIndexDefinition.java | 3 +- .../gerrit/server/schema/SchemaCreator.java | 4 +- .../gerrit/server/project/RefControlTest.java | 9 +++- .../gerrit/testutil/InMemoryDatabase.java | 44 +++++++++++++------ .../gerrit/testutil/InMemoryModule.java | 15 +++++-- 6 files changed, 55 insertions(+), 21 deletions(-) diff --git a/gerrit-server/BUILD b/gerrit-server/BUILD index bbe9653e2b..17496e824e 100644 --- a/gerrit-server/BUILD +++ b/gerrit-server/BUILD @@ -124,6 +124,7 @@ java_library( "//lib/powermock:powermock-module-junit4-common", ], deps = TESTUTIL_DEPS + [ + "//gerrit-pgm:init", "//lib/auto:auto-value", "//lib/easymock:easymock", "//lib/powermock:powermock-api-easymock", diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexDefinition.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexDefinition.java index 1fd8a82652..2f1e4bb30a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexDefinition.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexDefinition.java @@ -14,6 +14,7 @@ package com.google.gerrit.server.index.change; +import com.google.gerrit.common.Nullable; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.server.index.IndexDefinition; import com.google.gerrit.server.query.change.ChangeData; @@ -27,7 +28,7 @@ public class ChangeIndexDefinition ChangeIndexDefinition( ChangeIndexCollection indexCollection, ChangeIndex.Factory indexFactory, - AllChangesIndexer allChangesIndexer) { + @Nullable AllChangesIndexer allChangesIndexer) { super(ChangeSchemaDefinitions.INSTANCE, indexCollection, indexFactory, Providers.of(allChangesIndexer)); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaCreator.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaCreator.java index 7ac1d9c888..1d80b27bcb 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaCreator.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaCreator.java @@ -118,9 +118,7 @@ public class SchemaCreator { } private void index(AccountGroup group) throws IOException { - if (indexCollection.getSearchIndex() != null) { - indexCollection.getSearchIndex().replace(group); - } + indexCollection.getSearchIndex().replace(group); } private AccountGroup newGroup(ReviewDb c, String name, AccountGroup.UUID uuid) diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java index ee1203d3d7..e2efc4a54b 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java @@ -57,6 +57,7 @@ import com.google.gerrit.server.config.AllUsersName; import com.google.gerrit.server.config.AllUsersNameProvider; import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.server.git.ProjectConfig; +import com.google.gerrit.server.index.SingleVersionModule.SingleVersionListener; import com.google.gerrit.server.query.change.InternalChangeQuery; import com.google.gerrit.server.schema.SchemaCreator; import com.google.gerrit.server.util.RequestContext; @@ -240,6 +241,7 @@ public class RefControlTest { @Inject private CapabilityCollection.Factory capabilityCollectionFactory; @Inject private CapabilityControl.Factory capabilityControlFactory; @Inject private SchemaCreator schemaCreator; + @Inject private SingleVersionListener singleVersionListener; @Inject private InMemoryDatabase schemaFactory; @Inject private ThreadLocalRequestContext requestContext; @Inject private Provider queryProvider; @@ -317,7 +319,12 @@ public class RefControlTest { } db = schemaFactory.open(); - schemaCreator.create(db); + singleVersionListener.start(); + try { + schemaCreator.create(db); + } finally { + singleVersionListener.stop(); + } Cache c = CacheBuilder.newBuilder().build(); diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java index bb729892e4..ae0a23aa5b 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java +++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java @@ -17,10 +17,13 @@ package com.google.gerrit.testutil; import static com.google.common.truth.Truth.assertThat; import com.google.gerrit.lifecycle.LifecycleManager; +import com.google.gerrit.pgm.init.index.elasticsearch.ElasticIndexModuleOnInit; +import com.google.gerrit.pgm.init.index.lucene.LuceneIndexModuleOnInit; import com.google.gerrit.reviewdb.client.CurrentSchemaVersion; import com.google.gerrit.reviewdb.client.SystemConfig; import com.google.gerrit.reviewdb.server.ReviewDb; -import com.google.gerrit.server.index.group.GroupIndexCollection; +import com.google.gerrit.server.index.IndexModule; +import com.google.gerrit.server.index.SingleVersionModule.SingleVersionListener; import com.google.gerrit.server.schema.SchemaCreator; import com.google.gerrit.server.schema.SchemaVersion; import com.google.gwtorm.jdbc.Database; @@ -73,6 +76,8 @@ public class InMemoryDatabase implements SchemaFactory { } private final SchemaCreator schemaCreator; + private final SingleVersionListener singleVersionListener; + private Connection openHandle; private Database database; @@ -80,25 +85,35 @@ public class InMemoryDatabase implements SchemaFactory { @Inject InMemoryDatabase(Injector injector) throws OrmException { - // Don't inject SchemaCreator directly. - // SchemaCreator needs to get GroupIndexCollection injected, but - // GroupIndexCollection was not bound yet. Creating a child injector with a - // binding for GroupIndexCollection to create an instance of SchemaCreator - // prevents that Guice creates a just-in-time binding for - // GroupIndexCollection in the root injector. If a binding for - // GroupIndexCollection is created in the root injector then IndexModule - // fails to create this binding later, because it already exists. - this(injector.createChildInjector(new AbstractModule() { + Injector childInjector = injector.createChildInjector(new AbstractModule() { @Override protected void configure() { - bind(GroupIndexCollection.class); + switch (IndexModule.getIndexType(injector)) { + case LUCENE: + install(new LuceneIndexModuleOnInit()); + break; + case ELASTICSEARCH: + install(new ElasticIndexModuleOnInit()); + break; + default: + throw new IllegalStateException("unsupported index.type"); + } } - }).getInstance(SchemaCreator.class)); + }); + this.schemaCreator = childInjector.getInstance(SchemaCreator.class); + this.singleVersionListener = + childInjector.getInstance(SingleVersionListener.class); + initDatabase(); } - InMemoryDatabase(SchemaCreator schemaCreator) throws OrmException { + InMemoryDatabase(SchemaCreator schemaCreator, + SingleVersionListener singleVersionListener) throws OrmException { this.schemaCreator = schemaCreator; + this.singleVersionListener = singleVersionListener; + initDatabase(); + } + private void initDatabase() throws OrmException { try { DataSource dataSource = newDataSource(); @@ -131,9 +146,12 @@ public class InMemoryDatabase implements SchemaFactory { if (!created) { created = true; try (ReviewDb c = open()) { + singleVersionListener.start(); schemaCreator.create(c); } catch (IOException | ConfigInvalidException e) { throw new OrmException("Cannot create in-memory database", e); + } finally { + singleVersionListener.stop(); } } return this; diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryModule.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryModule.java index 71401d7b75..254c7e7b94 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryModule.java +++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryModule.java @@ -49,7 +49,11 @@ import com.google.gerrit.server.git.PerThreadRequestScope; import com.google.gerrit.server.git.SearchingChangeCacheImpl; import com.google.gerrit.server.git.SendEmailExecutor; import com.google.gerrit.server.index.IndexModule.IndexType; +import com.google.gerrit.server.index.SingleVersionModule.SingleVersionListener; +import com.google.gerrit.server.index.account.AllAccountsIndexer; +import com.google.gerrit.server.index.change.AllChangesIndexer; import com.google.gerrit.server.index.change.ChangeSchemaDefinitions; +import com.google.gerrit.server.index.group.AllGroupsIndexer; import com.google.gerrit.server.mail.SignedTokenEmailTokenVerifier; import com.google.gerrit.server.notedb.ChangeBundleReader; import com.google.gerrit.server.notedb.GwtormChangeBundleReader; @@ -73,6 +77,7 @@ import com.google.inject.ProvisionException; import com.google.inject.Singleton; import com.google.inject.TypeLiteral; import com.google.inject.servlet.RequestScoped; +import com.google.inject.util.Providers; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.PersonIdent; @@ -209,6 +214,10 @@ public class InMemoryModule extends FactoryModule { install(new GpgModule(cfg)); install(new H2AccountPatchReviewStore.InMemoryModule()); + bind(AllAccountsIndexer.class).toProvider(Providers.of(null)); + bind(AllChangesIndexer.class).toProvider(Providers.of(null)); + bind(AllGroupsIndexer.class).toProvider(Providers.of(null)); + IndexType indexType = null; try { indexType = cfg.getEnum("index", null, "type", IndexType.LUCENE); @@ -239,9 +248,9 @@ public class InMemoryModule extends FactoryModule { @Provides @Singleton - InMemoryDatabase getInMemoryDatabase(SchemaCreator schemaCreator) - throws OrmException { - return new InMemoryDatabase(schemaCreator); + InMemoryDatabase getInMemoryDatabase(SchemaCreator schemaCreator, + SingleVersionListener singleVersionListener) throws OrmException { + return new InMemoryDatabase(schemaCreator, singleVersionListener); } private Module luceneIndexModule() {