/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package com.github.geophile.erdo;
import com.github.geophile.erdo.apiimpl.DatabaseOnDisk;
import com.github.geophile.erdo.util.FileUtil;
import junit.framework.Assert;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
// A more thorough test of put. OrderedMapTest. testPut only tests duplicate keys in a single tree.
// There are subtleties in handling them across trees, and especially DiskMaps. So this uses DatabaseOnDisk,
// not DisklessTestDatabase.
public class OrderedMapPutTest
{
@BeforeClass
public static void beforeClass() throws IOException
{
DB_DIRECTORY = new File(FileUtil.tempDirectory(), DB_NAME);
FACTORY = new TestFactory();
}
@Before
public void before()
{
FileUtil.deleteDirectory(DB_DIRECTORY);
}
@After
public void after()
{
FACTORY.reset();
}
@Test
public void testPut()
throws IOException,
InterruptedException,
DeadlockException,
TransactionRolledBackException
{
Configuration configuration = Configuration.defaultConfiguration();
configuration.consolidationMinSizeBytes(0);
/*
// For FractalConsolidationPlanner2
configuration.consolidationMinMapsToConsolidate(1);
configuration.consolidationAllOrNoneMaxLargestMapCoverage(1.0);
// For AllOrNone2ConsolidationPlanner
configuration.consolidationMinMapsToConsolidate(2);
*/
// For FractalConsolidationPlanner
configuration.consolidationMinSizeBytes(0);
configuration.consolidationMinMapsToConsolidate(0);
Database db = DatabaseOnDisk.createDatabase(DB_DIRECTORY, FACTORY);
Assert.assertTrue(N >= 4);
Assert.assertTrue(N % 2 == 0);
OrderedMap map = db.createMap(MAP_NAME, RecordFactory.simpleRecordFactory(TestKey.class, TestRecord.class));
// Load map with keys 0..N-1 in one transaction
for (int id = 0; id < N; id++) {
AbstractRecord replaced = map.put(TestRecord.createRecord(id, "first"));
Assert.assertNull(replaced);
}
db.commitTransaction();
// Load same map with keys N/2..2N-1 in a different transaction
for (int id = N / 2; id < 2 * N; id++) {
AbstractRecord replaced = map.put(TestRecord.createRecord(id, "second"));
if (id < N) {
Assert.assertEquals(id, ((TestKey) replaced.key()).key());
Assert.assertEquals("first", ((TestRecord) replaced).stringValue());
} else {
Assert.assertNull(replaced);
}
}
db.commitTransaction();
// Wait for consolidation. DB_DIRECTORY/forest should have one tree
File forestDirectory = new File(DB_DIRECTORY, "forest");
int count;
do {
count = forestDirectory.listFiles(PROPERTIES_FILE_FILTER).length;
if (count > 1) {
Thread.sleep(500);
}
} while (count > 1);
Cursor cursor = map.first();
TestRecord record;
int expected = 0;
while ((record = (TestRecord) cursor.next()) != null) {
Assert.assertEquals(expected, record.key().key());
if (expected < N / 2) {
Assert.assertEquals("first", record.stringValue());
} else {
Assert.assertEquals("second", record.stringValue());
}
expected++;
}
Assert.assertEquals(2 * N, expected);
db.close();
}
// TODO: similar test for delete
private static final FilenameFilter PROPERTIES_FILE_FILTER = new FilenameFilter()
{
public boolean accept(File dir, String name)
{
return name.endsWith(".properties");
}
};
private static TestFactory FACTORY;
private static final String MAP_NAME = "map";
private static final int N = 10;
private static final String DB_NAME = "erdo";
private static File DB_DIRECTORY;
}