/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2000, 2015 Oracle and/or its affiliates. All rights reserved.
*
*/
package com.sleepycat.collections.test.serial;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import com.sleepycat.bind.serial.SerialBinding;
import com.sleepycat.bind.serial.StoredClassCatalog;
import com.sleepycat.collections.StoredMap;
import com.sleepycat.collections.TransactionRunner;
import com.sleepycat.collections.TransactionWorker;
import com.sleepycat.compat.DbCompat;
import com.sleepycat.db.Database;
import com.sleepycat.db.DatabaseConfig;
import com.sleepycat.db.Environment;
import com.sleepycat.util.test.SharedTestUtils;
import com.sleepycat.util.test.TestBase;
import com.sleepycat.util.test.TestEnv;
/**
* Runs part one of the StoredClassCatalogTest. This part is run with the
* old/original version of TestSerial in the classpath. It creates a fresh
* environment and databases containing serialized versions of the old class.
* When StoredClassCatalogTest is run, it will read these objects from the
* database created here.
*
* @author Mark Hayes
*/
@RunWith(Parameterized.class)
public class StoredClassCatalogTestInit extends TestBase
implements TransactionWorker {
static final String CATALOG_FILE = StoredClassCatalogTest.CATALOG_FILE;
static final String STORE_FILE = StoredClassCatalogTest.STORE_FILE;
@Parameters
public static List<Object[]> genParams() {
List<Object[]> params = new ArrayList<Object[]>();
for (TestEnv testEnv : TestEnv.ALL)
params.add(new Object[]{testEnv});
return params;
}
private TestEnv testEnv;
private Environment env;
private StoredClassCatalog catalog;
private Database store;
private Map map;
private TransactionRunner runner;
public StoredClassCatalogTestInit(TestEnv testEnv) {
this.testEnv = testEnv;
customName = StoredClassCatalogTest.makeTestName(testEnv);
}
@Before
public void setUp()
throws Exception {
SharedTestUtils.printTestName(customName);
env = testEnv.open(customName);
runner = new TransactionRunner(env);
catalog = new StoredClassCatalog(openDb(CATALOG_FILE));
SerialBinding keyBinding = new SerialBinding(catalog, String.class);
SerialBinding valueBinding =
new SerialBinding(catalog, TestSerial.class);
store = openDb(STORE_FILE);
map = new StoredMap(store, keyBinding, valueBinding, true);
}
private Database openDb(String file)
throws Exception {
DatabaseConfig config = new DatabaseConfig();
DbCompat.setTypeBtree(config);
config.setTransactional(testEnv.isTxnMode());
config.setAllowCreate(true);
return DbCompat.testOpenDatabase(env, null, file, null, config);
}
@After
public void tearDown()
throws Exception {
try {
if (catalog != null) {
catalog.close();
catalog.close(); // should have no effect
}
if (store != null) {
store.close();
}
if (env != null) {
env.close();
}
/*
* Copy environment generated by this test to test dest dir.
* Since the environment is necessary for StoreClassCatalogTest.
*/
SharedTestUtils.copyDir(testEnv.getDirectory(customName, false),
new File(SharedTestUtils.getDestDir(), customName));
} catch (Exception e) {
System.err.println("Ignored exception during tearDown: ");
e.printStackTrace();
} finally {
/* Ensure that GC can cleanup. */
catalog = null;
store = null;
env = null;
testEnv = null;
map = null;
runner = null;
}
}
@Test
public void runTest()
throws Exception {
runner.run(this);
}
public void doWork() {
TestSerial one = new TestSerial(null);
TestSerial two = new TestSerial(one);
assertNull("Likely the classpath contains the wrong version of the" +
" TestSerial class, the 'original' version is required",
one.getStringField());
assertNull(two.getStringField());
map.put("one", one);
map.put("two", two);
one = (TestSerial) map.get("one");
two = (TestSerial) map.get("two");
assertEquals(one, two.getOther());
assertNull(one.getStringField());
assertNull(two.getStringField());
}
}