summaryrefslogtreecommitdiffstats
path: root/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java
diff options
context:
space:
mode:
Diffstat (limited to 'gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java')
-rw-r--r--gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java152
1 files changed, 152 insertions, 0 deletions
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
new file mode 100644
index 0000000000..fe138c6ef6
--- /dev/null
+++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java
@@ -0,0 +1,152 @@
+// Copyright (C) 2009 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.testutil;
+
+import com.google.gerrit.reviewdb.CurrentSchemaVersion;
+import com.google.gerrit.reviewdb.ReviewDb;
+import com.google.gerrit.reviewdb.SystemConfig;
+import com.google.gerrit.server.config.SystemConfigProvider;
+import com.google.gerrit.server.schema.Current;
+import com.google.gerrit.server.schema.SchemaCreator;
+import com.google.gerrit.server.schema.SchemaVersion;
+import com.google.gwtorm.client.OrmException;
+import com.google.gwtorm.client.SchemaFactory;
+import com.google.gwtorm.jdbc.Database;
+import com.google.gwtorm.jdbc.SimpleDataSource;
+import com.google.inject.Guice;
+import com.google.inject.Key;
+import com.google.inject.Provider;
+
+import junit.framework.TestCase;
+
+import java.io.File;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Properties;
+
+import javax.sql.DataSource;
+
+/**
+ * An in-memory test instance of {@link ReviewDb} database.
+ * <p>
+ * Test classes should create one instance of this class for each unique test
+ * database they want to use. When the tests needing this instance are complete,
+ * ensure that {@link #drop(InMemoryDatabase)} is called to free the resources so
+ * the JVM running the unit tests doesn't run out of heap space.
+ */
+public class InMemoryDatabase implements SchemaFactory<ReviewDb> {
+ private static int dbCnt;
+
+ private static synchronized DataSource newDataSource() throws SQLException {
+ final Properties p = new Properties();
+ p.setProperty("driver", org.h2.Driver.class.getName());
+ p.setProperty("url", "jdbc:h2:mem:" + "Test_" + (++dbCnt));
+ final DataSource dataSource = new SimpleDataSource(p);
+ return dataSource;
+ }
+
+ /** Drop the database from memory; does nothing if the instance was null. */
+ public static void drop(final InMemoryDatabase db) {
+ if (db != null) {
+ db.drop();
+ }
+ }
+
+ private Connection openHandle;
+ private Database<ReviewDb> database;
+ private boolean created;
+ private SchemaVersion schemaVersion;
+
+ public InMemoryDatabase() throws OrmException {
+ try {
+ final DataSource dataSource = newDataSource();
+
+ // Open one connection. This will peg the database into memory
+ // until someone calls drop on us, allowing subsequent connections
+ // opened against the same URL to go to the same set of tables.
+ //
+ openHandle = dataSource.getConnection();
+
+ // Build the access layer around the connection factory.
+ //
+ database = new Database<ReviewDb>(dataSource, ReviewDb.class);
+
+ schemaVersion =
+ Guice.createInjector(new SchemaVersion.Module()).getBinding(
+ Key.get(SchemaVersion.class, Current.class)).getProvider().get();
+ } catch (SQLException e) {
+ throw new OrmException(e);
+ }
+ }
+
+ public Database<ReviewDb> getDatabase() {
+ return database;
+ }
+
+ @Override
+ public ReviewDb open() throws OrmException {
+ return getDatabase().open();
+ }
+
+ /** Ensure the database schema has been created and initialized. */
+ public InMemoryDatabase create() throws OrmException {
+ if (!created) {
+ created = true;
+ final ReviewDb c = open();
+ try {
+ new SchemaCreator(new File("."), schemaVersion).create(c);
+ } finally {
+ c.close();
+ }
+ }
+ return this;
+ }
+
+ /** Drop this database from memory so it no longer exists. */
+ public void drop() {
+ if (openHandle != null) {
+ try {
+ openHandle.close();
+ } catch (SQLException e) {
+ System.err.println("WARNING: Cannot close database connection");
+ e.printStackTrace(System.err);
+ }
+ openHandle = null;
+ database = null;
+ }
+ }
+
+ public SystemConfig getSystemConfig() {
+ return new SystemConfigProvider(this, new Provider<SchemaVersion>() {
+ public SchemaVersion get() {
+ return schemaVersion;
+ }
+ }).get();
+ }
+
+ public CurrentSchemaVersion getSchemaVersion() throws OrmException {
+ final ReviewDb c = open();
+ try {
+ return c.schemaVersion().get(new CurrentSchemaVersion.Key());
+ } finally {
+ c.close();
+ }
+ }
+
+ public void assertSchemaVersion() throws OrmException {
+ final CurrentSchemaVersion act = getSchemaVersion();
+ TestCase.assertEquals(schemaVersion.getVersionNbr(), act.versionNbr);
+ }
+}