Skip to content

Commit

Permalink
namespace: use liquibase for chimera based tests
Browse files Browse the repository at this point in the history
Acked-by: Gerd Behrmann
Target: master
Require-book: no
Require-notes: no
  • Loading branch information
kofemann committed Nov 19, 2013
1 parent 63ff338 commit 9a30984
Show file tree
Hide file tree
Showing 5 changed files with 118 additions and 88 deletions.
@@ -0,0 +1,24 @@
package org.dcache.chimera.namespace;

import com.jolbox.bonecp.BoneCPDataSource;
import org.dcache.chimera.JdbcFs;

public class ChimeraFsHelper {

private ChimeraFsHelper() {}

public static JdbcFs getFileSystemProvider(String url, String drv, String user,
String pass, String dialect)
{

BoneCPDataSource ds = new BoneCPDataSource();
ds.setJdbcUrl(url);
ds.setUsername(user);
ds.setPassword(pass);
ds.setDriverClass(drv);
ds.setMaxConnectionsPerPartition(2);
ds.setPartitionCount(1);

return new JdbcFs(ds, dialect);
}
}
@@ -1,21 +1,25 @@
package org.dcache.chimera.namespace;

import com.jolbox.bonecp.BoneCPDataSource;
import com.google.common.io.Resources;
import junit.framework.JUnit4TestAdapter;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.EnumSet;
import java.util.List;
import java.util.Properties;

import liquibase.Liquibase;
import liquibase.database.Database;
import liquibase.database.DatabaseFactory;
import liquibase.database.jvm.JdbcConnection;
import liquibase.resource.ClassLoaderResourceAccessor;

import diskCacheV111.namespace.PnfsManagerV3;
import diskCacheV111.util.AccessLatency;
Expand All @@ -38,7 +42,6 @@
import org.dcache.chimera.JdbcFs;
import org.dcache.chimera.UnixPermission;
import org.dcache.chimera.posix.Stat;
import org.dcache.commons.util.SqlHelper;
import org.dcache.namespace.FileAttribute;
import org.dcache.namespace.PosixPermissionHandler;
import org.dcache.vehicles.FileAttributes;
Expand All @@ -50,48 +53,46 @@

public class PnfsManagerTest
{
private final static URL DB_TEST_PROPERTIES
= Resources.getResource("org/dcache/chimera/chimera-test.properties");

private static final String OSM_URI_STEM = "osm://example-osm-instance/";

private PnfsManagerV3 _pnfsManager;
private Connection _conn;
private JdbcFs _fs;
private BoneCPDataSource _ds;

@Before
public void setUp() throws Exception {
/*
* init Chimera DB
*/

Class.forName("org.hsqldb.jdbcDriver");

_conn = DriverManager.getConnection("jdbc:hsqldb:mem:chimeramem", "sa", "");
StringBuilder sql = new StringBuilder();
Properties dbProperties = new Properties();
dbProperties.load(Resources.newInputStreamSupplier(DB_TEST_PROPERTIES).getInput());

BufferedReader dataStr =
new BufferedReader(new InputStreamReader(ClassLoader.getSystemResourceAsStream("org/dcache/chimera/sql/create-hsqldb.sql")));
String inLine;
Class.forName(dbProperties.getProperty("chimera.db.driver"));
_conn = DriverManager.getConnection(dbProperties.getProperty("chimera.db.url"),
dbProperties.getProperty("chimera.db.user"), dbProperties.getProperty("chimera.db.password"));

while ((inLine = dataStr.readLine()) != null) {
sql.append(inLine);
}

String[] statements = sql.toString().split(";");
for (String statement : statements) {
Statement st = _conn.createStatement();
st.executeUpdate(statement);
SqlHelper.tryToClose(st);
}
_conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

_ds = new BoneCPDataSource();
_ds.setJdbcUrl("jdbc:hsqldb:mem:chimeramem");
_ds.setUsername("sa");
_ds.setPassword("");
_ds.getConfig().setMaxConnectionsPerPartition(2); // seems to require >= 2
_ds.getConfig().setMinConnectionsPerPartition(1);
_ds.getConfig().setPartitionCount(1);
Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(_conn));
Liquibase liquibase = new Liquibase("org/dcache/chimera/changelog/changelog-master.xml",
new ClassLoaderResourceAccessor(), database);
// Uncomment the following line when testing with mysql database
/*
* Liquibase liquibase = new Liquibase(changeLogFile, new
* ClassLoaderResourceAccessor(), new JdbcConnection(conn));
*/

_fs = new JdbcFs(_ds, "HsqlDB");
liquibase.update("");
_fs = ChimeraFsHelper.getFileSystemProvider(
dbProperties.getProperty("chimera.db.url"),
dbProperties.getProperty("chimera.db.driver"),
dbProperties.getProperty("chimera.db.user"),
dbProperties.getProperty("chimera.db.password"),
dbProperties.getProperty("chimera.db.dialect"));

ChimeraNameSpaceProvider chimera = new ChimeraNameSpaceProvider();
chimera.setExtractor(new ChimeraOsmStorageInfoExtractor(StorageInfo.DEFAULT_ACCESS_LATENCY, StorageInfo.DEFAULT_RETENTION_POLICY));
Expand Down Expand Up @@ -521,21 +522,11 @@ public void testSetFilePermissions() throws Exception {
@After
public void tearDown() throws Exception
{
_ds.close();
_fs.close();
_conn.createStatement().execute("SHUTDOWN;");
_conn.close();
}

static void tryToClose(Statement o) {
try {
if (o != null) {
o.close();
}
} catch (SQLException e) {
}
}


public static junit.framework.Test suite() {
return new JUnit4TestAdapter(PnfsManagerTest.class);
}
Expand Down
@@ -0,0 +1,8 @@
#
# JDBC properties for Chimera
#
chimera.db.driver=org.hsqldb.jdbcDriver
chimera.db.url=jdbc:hsqldb:mem:chimera
chimera.db.user=sa
chimera.db.password=
chimera.db.dialect=HsqlDB
@@ -1,20 +1,25 @@
package org.dcache.tests.repository;

import com.google.common.base.Charsets;
import com.google.common.io.Resources;
import com.jolbox.bonecp.BoneCPDataSource;

import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import diskCacheV111.util.PnfsId;
import java.net.URL;
import java.util.Properties;
import java.util.UUID;
import javax.sql.DataSource;
import liquibase.Liquibase;
import liquibase.database.Database;
import liquibase.database.DatabaseFactory;
import liquibase.database.jvm.JdbcConnection;
import liquibase.resource.ClassLoaderResourceAccessor;

import org.dcache.chimera.ChimeraFsException;
import org.dcache.chimera.FsInode;
Expand All @@ -25,72 +30,53 @@

public class RepositoryHealerTestChimeraHelper implements FileStore {

private final static URL DB_TEST_PROPERTIES
= Resources.getResource("org/dcache/tests/repository/chimera-test.properties");

private static final String JDBC_URL = "jdbc:hsqldb:mem:";
private static final String USERNAME = "sa";
private static final String PASSWORD = "";

private final UUID uuid = UUID.randomUUID();
private final Connection _conn;
private final JdbcFs _fs;
private final FsInode _rootInode;


public RepositoryHealerTestChimeraHelper() throws Exception {
Properties dbProperties = new Properties();
dbProperties.load(Resources.newInputStreamSupplier(DB_TEST_PROPERTIES).getInput());

Class.forName(dbProperties.getProperty("chimera.db.driver"));

// FIXME: make it configurable
Class.forName("org.hsqldb.jdbcDriver");
DataSource ds = getFileSystemProvider(
dbProperties.getProperty("chimera.db.url") + ":" + UUID.randomUUID(),
dbProperties.getProperty("chimera.db.driver"),
dbProperties.getProperty("chimera.db.user"),
dbProperties.getProperty("chimera.db.password"));

BoneCPDataSource ds = new BoneCPDataSource();
ds.setJdbcUrl(JDBC_URL + uuid);
ds.setUsername(USERNAME);
ds.setPassword(PASSWORD);
ds.getConfig().setMaxConnectionsPerPartition(3); // seems to require >= 3
ds.getConfig().setMinConnectionsPerPartition(1);
ds.getConfig().setPartitionCount(1);

String sql = Resources.toString(Resources.getResource("org/dcache/chimera/sql/create-hsqldb.sql"), Charsets.US_ASCII);
try (Connection conn = ds.getConnection()) {
try (Statement st = conn.createStatement()) {
for (String statement : sql.replace("\n", "").split(";")) {
st.executeUpdate(statement);
}
}
}
_conn = ds.getConnection();

_conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(_conn));
Liquibase liquibase = new Liquibase("org/dcache/chimera/changelog/changelog-master.xml",
new ClassLoaderResourceAccessor(), database);
liquibase.update("");

_fs = new JdbcFs(ds, "HsqlDB");
_fs = new JdbcFs(ds, dbProperties.getProperty("chimera.db.dialect"));
_rootInode = _fs.path2inode("/");
}

public void shutdown()
{
try {
_fs.close();
try (Connection conn = DriverManager.getConnection(JDBC_URL + uuid, USERNAME, PASSWORD)) {
conn.createStatement().execute("SHUTDOWN;");
}
_conn.createStatement().execute("SHUTDOWN;");
//_conn.close();
} catch (SQLException | IOException ignored) {
}
}

public FsInode add(PnfsId pnfsid) throws ChimeraFsException {

return _fs.createFile(_rootInode, pnfsid.toString() );

}


static void tryToClose(Statement o) {
try {
if (o != null) {
o.close();
}
} catch (SQLException e) {

}
}


@Override
public File get(PnfsId id) {
return new HFile(_fs, id.toString() );
Expand Down Expand Up @@ -138,4 +124,17 @@ public List<PnfsId> list() {

return entries;
}

public static BoneCPDataSource getFileSystemProvider(String url, String drv, String user, String pass) {

BoneCPDataSource ds = new BoneCPDataSource();
ds.setJdbcUrl(url);
ds.setUsername(user);
ds.setPassword(pass);
ds.setDriverClass(drv);
ds.setMaxConnectionsPerPartition(3); // looks like we need >= 3
ds.setPartitionCount(1);

return ds;
}
}
@@ -0,0 +1,8 @@
#
# JDBC properties for Chimera
#
chimera.db.driver=org.hsqldb.jdbcDriver
chimera.db.url=jdbc:hsqldb:mem
chimera.db.user=sa
chimera.db.password=
chimera.db.dialect=HsqlDB

0 comments on commit 9a30984

Please sign in to comment.