diff --git a/gerrit-server/BUCK b/gerrit-server/BUCK index 8181fe3a0a..57665c6a9a 100644 --- a/gerrit-server/BUCK +++ b/gerrit-server/BUCK @@ -102,7 +102,9 @@ java_test( '//gerrit-antlr:query_exception', '//gerrit-antlr:query_parser', '//gerrit-common:server', + '//gerrit-cache-h2:cache-h2', '//gerrit-extension-api:api', + '//gerrit-lucene:lucene', '//gerrit-reviewdb:server', '//lib:easymock', '//lib:guava', @@ -111,6 +113,7 @@ java_test( '//lib:junit', '//lib/antlr:java_runtime', '//lib/guice:guice', + '//lib/guice:guice-servlet', '//lib/jgit:jgit', '//lib/jgit:junit', '//lib/prolog:prolog-cafe', diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaCreatorTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaCreatorTest.java index b376d11d17..e58266f017 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaCreatorTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaCreatorTest.java @@ -24,8 +24,10 @@ import com.google.gerrit.server.config.AllProjectsName; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.gerrit.server.git.ProjectConfig; import com.google.gerrit.testutil.InMemoryDatabase; +import com.google.gerrit.testutil.InMemoryModule; import com.google.gwtorm.jdbc.JdbcSchema; import com.google.gwtorm.server.OrmException; +import com.google.inject.Inject; import junit.framework.TestCase; @@ -39,12 +41,19 @@ import java.util.Arrays; import java.util.List; public class SchemaCreatorTest extends TestCase { + @Inject + private AllProjectsName allProjects; + + @Inject + private GitRepositoryManager repoManager; + + @Inject private InMemoryDatabase db; @Override protected void setUp() throws Exception { super.setUp(); - db = new InMemoryDatabase(); + new InMemoryModule().inject(this); } @Override @@ -89,10 +98,8 @@ public class SchemaCreatorTest extends TestCase { private LabelTypes getLabelTypes() throws Exception { db.create(); - AllProjectsName allProjects = db.getInstance(AllProjectsName.class); ProjectConfig c = new ProjectConfig(allProjects); - Repository repo = db.getInstance(GitRepositoryManager.class) - .openRepository(allProjects); + Repository repo = repoManager.openRepository(allProjects); try { c.load(repo); return new LabelTypes( diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaUpdaterTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaUpdaterTest.java index bdd22587dc..880d0e1cec 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaUpdaterTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaUpdaterTest.java @@ -51,7 +51,7 @@ public class SchemaUpdaterTest extends TestCase { @Override protected void setUp() throws Exception { super.setUp(); - db = new InMemoryDatabase(); + db = InMemoryDatabase.newDatabase(); } @Override 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 303c497760..a1e68d06a0 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 @@ -14,40 +14,22 @@ package com.google.gerrit.testutil; -import static com.google.inject.Scopes.SINGLETON; - 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.GerritPersonIdent; -import com.google.gerrit.server.GerritPersonIdentProvider; -import com.google.gerrit.server.config.AllProjectsName; -import com.google.gerrit.server.config.AllProjectsNameProvider; -import com.google.gerrit.server.config.AnonymousCowardName; -import com.google.gerrit.server.config.AnonymousCowardNameProvider; -import com.google.gerrit.server.config.GerritServerConfig; -import com.google.gerrit.server.config.SitePath; -import com.google.gerrit.server.git.GitRepositoryManager; -import com.google.gerrit.server.schema.Current; -import com.google.gerrit.server.schema.DataSourceType; import com.google.gerrit.server.schema.SchemaCreator; import com.google.gerrit.server.schema.SchemaVersion; import com.google.gwtorm.jdbc.Database; import com.google.gwtorm.jdbc.SimpleDataSource; import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.SchemaFactory; -import com.google.inject.AbstractModule; import com.google.inject.Guice; -import com.google.inject.Injector; -import com.google.inject.Key; +import com.google.inject.Inject; import junit.framework.TestCase; import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.Config; -import org.eclipse.jgit.lib.PersonIdent; -import java.io.File; import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; @@ -64,6 +46,11 @@ import javax.sql.DataSource; * the JVM running the unit tests doesn't run out of heap space. */ public class InMemoryDatabase implements SchemaFactory { + public static InMemoryDatabase newDatabase() { + return Guice.createInjector(new InMemoryModule()) + .getInstance(InMemoryDatabase.class); + } + private static int dbCnt; private static synchronized DataSource newDataSource() throws SQLException { @@ -81,15 +68,21 @@ public class InMemoryDatabase implements SchemaFactory { } } + private final SchemaVersion schemaVersion; + private final SchemaCreator schemaCreator; + private Connection openHandle; private Database database; private boolean created; - private SchemaVersion schemaVersion; - private Injector injector; - public InMemoryDatabase() throws OrmException { + @Inject + InMemoryDatabase(SchemaVersion schemaVersion, + SchemaCreator schemaCreator) throws OrmException { + this.schemaVersion = schemaVersion; + this.schemaCreator = schemaCreator; + try { - final DataSource dataSource = newDataSource(); + DataSource dataSource = newDataSource(); // Open one connection. This will peg the database into memory // until someone calls drop on us, allowing subsequent connections @@ -101,54 +94,11 @@ public class InMemoryDatabase implements SchemaFactory { // database = new Database(dataSource, ReviewDb.class); - injector = Guice.createInjector(new AbstractModule() { - @Override - protected void configure() { - install(new SchemaVersion.Module()); - - bind(File.class) // - .annotatedWith(SitePath.class) // - .toInstance(new File(".")); - - Config cfg = new Config(); - cfg.setString("gerrit", null, "basePath", "git"); - cfg.setString("gerrit", null, "allProjects", "Test-Projects"); - cfg.setString("user", null, "name", "Gerrit Code Review"); - cfg.setString("user", null, "email", "gerrit@localhost"); - - bind(Config.class) // - .annotatedWith(GerritServerConfig.class) // - .toInstance(cfg); - - bind(PersonIdent.class) // - .annotatedWith(GerritPersonIdent.class) // - .toProvider(GerritPersonIdentProvider.class); - - bind(AllProjectsName.class) // - .toProvider(AllProjectsNameProvider.class); - - bind(GitRepositoryManager.class) // - .to(InMemoryRepositoryManager.class).in(SINGLETON); - - bind(String.class) // - .annotatedWith(AnonymousCowardName.class) // - .toProvider(AnonymousCowardNameProvider.class); - - bind(DataSourceType.class) // - .to(InMemoryH2Type.class); - } - }); - schemaVersion = injector.getInstance( - Key.get(SchemaVersion.class, Current.class)); } catch (SQLException e) { throw new OrmException(e); } } - public T getInstance(Class clazz) { - return injector.getInstance(clazz); - } - public Database getDatabase() { return database; } @@ -165,7 +115,7 @@ public class InMemoryDatabase implements SchemaFactory { final ReviewDb c = open(); try { try { - getInstance(SchemaCreator.class).create(c); + schemaCreator.create(c); } catch (IOException e) { throw new OrmException("Cannot create in-memory database", e); } catch (ConfigInvalidException e) { 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 new file mode 100644 index 0000000000..39c28688b5 --- /dev/null +++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryModule.java @@ -0,0 +1,183 @@ +// Copyright (C) 2013 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.server.git; + +package com.google.gerrit.testutil; + +import static com.google.common.base.Preconditions.checkState; +import static com.google.inject.Scopes.SINGLETON; + +import com.google.gerrit.common.ChangeHooks; +import com.google.gerrit.common.DisabledChangeHooks; +import com.google.gerrit.lucene.LuceneIndexModule; +import com.google.gerrit.reviewdb.client.AuthType; +import com.google.gerrit.reviewdb.server.ReviewDb; +import com.google.gerrit.server.GerritPersonIdent; +import com.google.gerrit.server.GerritPersonIdentProvider; +import com.google.gerrit.server.RemotePeer; +import com.google.gerrit.server.cache.h2.DefaultCacheFactory; +import com.google.gerrit.server.config.AllProjectsName; +import com.google.gerrit.server.config.AllProjectsNameProvider; +import com.google.gerrit.server.config.AnonymousCowardName; +import com.google.gerrit.server.config.AnonymousCowardNameProvider; +import com.google.gerrit.server.config.CanonicalWebUrlModule; +import com.google.gerrit.server.config.CanonicalWebUrlProvider; +import com.google.gerrit.server.config.FactoryModule; +import com.google.gerrit.server.config.GerritGlobalModule; +import com.google.gerrit.server.config.GerritServerConfig; +import com.google.gerrit.server.config.SitePath; +import com.google.gerrit.server.config.TrackingFooters; +import com.google.gerrit.server.config.TrackingFootersProvider; +import com.google.gerrit.server.git.GitRepositoryManager; +import com.google.gerrit.server.git.PerThreadRequestScope; +import com.google.gerrit.server.index.ChangeSchemas; +import com.google.gerrit.server.index.IndexModule; +import com.google.gerrit.server.index.IndexModule.IndexType; +import com.google.gerrit.server.index.NoIndexModule; +import com.google.gerrit.server.mail.SignedTokenEmailTokenVerifier; +import com.google.gerrit.server.mail.SmtpEmailSender; +import com.google.gerrit.server.schema.Current; +import com.google.gerrit.server.schema.DataSourceType; +import com.google.gerrit.server.schema.SchemaCreator; +import com.google.gerrit.server.schema.SchemaVersion; +import com.google.gerrit.server.ssh.NoSshKeyCache; +import com.google.gwtorm.server.OrmException; +import com.google.gwtorm.server.SchemaFactory; +import com.google.inject.AbstractModule; +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.Provider; +import com.google.inject.Provides; +import com.google.inject.ProvisionException; +import com.google.inject.Singleton; +import com.google.inject.TypeLiteral; +import com.google.inject.servlet.RequestScoped; + +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.PersonIdent; + +import java.io.File; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.net.UnknownHostException; + +public class InMemoryModule extends FactoryModule { + public static Config newDefaultConfig() { + Config cfg = new Config(); + cfg.setEnum("auth", null, "type", AuthType.DEVELOPMENT_BECOME_ANY_ACCOUNT); + cfg.setString("gerrit", null, "basePath", "git"); + cfg.setString("gerrit", null, "allProjects", "Test-Projects"); + cfg.setString("user", null, "name", "Gerrit Code Review"); + cfg.setString("user", null, "email", "gerrit@localhost"); + cfg.setBoolean("sendemail", null, "enable", false); + cfg.setString("cache", null, "directory", null); + return cfg; + } + + private final Config cfg; + + public InMemoryModule() { + this(newDefaultConfig()); + } + + public InMemoryModule(Config cfg) { + this.cfg = cfg; + } + + public void inject(Object instance) { + Guice.createInjector(this).injectMembers(instance); + } + + @Override + protected void configure() { + // For simplicity, don't create child injectors, just use this one to get a + // few required modules. + Injector cfgInjector = Guice.createInjector(new AbstractModule() { + @Override + protected void configure() { + bind(Config.class).annotatedWith(GerritServerConfig.class) + .toInstance(cfg); + } + }); + install(cfgInjector.getInstance(GerritGlobalModule.class)); + + bindScope(RequestScoped.class, PerThreadRequestScope.REQUEST); + + install(new SchemaVersion.Module()); + + bind(File.class).annotatedWith(SitePath.class).toInstance(new File(".")); + bind(Config.class).annotatedWith(GerritServerConfig.class).toInstance(cfg); + try { + bind(SocketAddress.class).annotatedWith(RemotePeer.class) + .toInstance(new InetSocketAddress(InetAddress.getLocalHost(), 1234)); + } catch (UnknownHostException e) { + ProvisionException pe = new ProvisionException(e.getMessage()); + pe.initCause(e); + throw pe; + } + bind(PersonIdent.class) + .annotatedWith(GerritPersonIdent.class) + .toProvider(GerritPersonIdentProvider.class); + bind(String.class) + .annotatedWith(AnonymousCowardName.class) + .toProvider(AnonymousCowardNameProvider.class); + bind(AllProjectsName.class) + .toProvider(AllProjectsNameProvider.class); + bind(GitRepositoryManager.class) + .to(InMemoryRepositoryManager.class); + bind(InMemoryRepositoryManager.class).in(SINGLETON); + bind(TrackingFooters.class).toProvider(TrackingFootersProvider.class) + .in(SINGLETON); + + bind(DataSourceType.class) + .to(InMemoryH2Type.class); + bind(new TypeLiteral>() {}) + .to(InMemoryDatabase.class); + + bind(ChangeHooks.class).to(DisabledChangeHooks.class); + install(NoSshKeyCache.module()); + install(new CanonicalWebUrlModule() { + @Override + protected Class> provider() { + return CanonicalWebUrlProvider.class; + } + }); + install(new DefaultCacheFactory.Module()); + install(new SmtpEmailSender.Module()); + install(new SignedTokenEmailTokenVerifier.Module()); + + IndexType indexType = IndexModule.getIndexType(cfgInjector); + switch (indexType) { + case LUCENE: + int version = cfg.getInt("index", "lucene", "testVersion", -1); + checkState(ChangeSchemas.ALL.containsKey(version), + "invalid index.lucene.testVersion %s", version); + install(new LuceneIndexModule(version, 0, null)); + break; + case SQL: + install(new NoIndexModule()); + break; + default: + throw new ProvisionException( + "index type unsupported in tests: " + indexType); + } + } + + @Provides + @Singleton + InMemoryDatabase getInMemoryDatabase(@Current SchemaVersion schemaVersion, + SchemaCreator schemaCreator) throws OrmException { + return new InMemoryDatabase(schemaVersion, schemaCreator); + } +}