/* Copyright (c) 2014 Boundless and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Distribution License v1.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/org/documents/edl-v10.html
*
* Contributors:
* Gabriel Roldan (Boundless) - initial implementation
*/
package org.locationtech.geogig.storage.bdbje;
import java.io.File;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.locationtech.geogig.api.RevObject;
import org.locationtech.geogig.api.RevTree;
import org.locationtech.geogig.api.TestPlatform;
import org.locationtech.geogig.repository.Hints;
import org.locationtech.geogig.storage.ConfigDatabase;
import org.locationtech.geogig.storage.ObjectDatabase;
import org.locationtech.geogig.storage.fs.IniFileConfigDatabase;
public class JEObjectDatabaseTest extends Assert {
@Rule
public TemporaryFolder folder = new TemporaryFolder();
private TestPlatform platform;
private Hints hints;
private ObjectDatabase db;
// instance variable so its reused as if it were the singleton in the guice config
private EnvironmentBuilder envProvider;
@Before
public void setUp() {
File root = folder.getRoot();
folder.newFolder(".geogig");
File home = folder.newFolder("home");
platform = new TestPlatform(root);
platform.setUserHome(home);
hints = new Hints();
envProvider = new EnvironmentBuilder(platform);
}
private ObjectDatabase createDb() {
ConfigDatabase configDB = new IniFileConfigDatabase(platform);
JEObjectDatabase db = new JEObjectDatabase_v0_1(configDB, envProvider, hints);
db.open();
return db;
}
@After
public void tearDown() {
if (db != null) {
db.close();
}
}
@Test
public void testReadOnlyHint() {
hints.set(Hints.OBJECTS_READ_ONLY, Boolean.TRUE);
db = createDb();
RevObject obj = RevTree.EMPTY;
try {
db.put(obj);
fail("Expected UOE on read only hint");
} catch (UnsupportedOperationException e) {
assertTrue(true);
}
}
@Test
public void testReadOnlyHintPreservedOnReopen() {
hints.set(Hints.OBJECTS_READ_ONLY, Boolean.TRUE);
db = createDb();
RevObject obj = RevTree.EMPTY;
try {
db.put(obj);
fail("Expected UOE on read only hint");
} catch (UnsupportedOperationException e) {
assertTrue(true);
}
db.close();
db.open();
try {
db.put(obj);
fail("Expected UOE on read only hint");
} catch (UnsupportedOperationException e) {
assertTrue(true);
}
}
@Test
public void testReadOnlyHint2() {
hints.set(Hints.OBJECTS_READ_ONLY, Boolean.TRUE);
db = createDb();
RevObject obj = RevTree.EMPTY;
try {
db.put(obj);
fail("Expected UOE on read only hint");
} catch (UnsupportedOperationException e) {
assertTrue(true);
}
db.close();
hints.set(Hints.OBJECTS_READ_ONLY, Boolean.FALSE);
db = createDb();
Assert.assertTrue(db.put(obj));
}
@Test
public void testReadOnlyHint3() {
hints.set(Hints.OBJECTS_READ_ONLY, Boolean.TRUE);
db = createDb();
RevObject obj = RevTree.EMPTY;
try {
db.put(obj);
fail("Expected UOE on read only hint");
} catch (UnsupportedOperationException e) {
assertTrue(true);
}
hints.set(Hints.OBJECTS_READ_ONLY, Boolean.FALSE);
ObjectDatabase db2 = createDb();
Assert.assertTrue(db2.put(obj));
db.close();
db2.close();
}
public void testMultipleInstances() {
ObjectDatabase db1 = createDb();
ObjectDatabase db2 = createDb();
RevObject obj = RevTree.EMPTY;
assertTrue(db1.put(obj));
db1.close();
assertFalse(db2.put(obj));
db2.close();
RevObject revObject = db.get(obj.getId());
assertEquals(obj, revObject);
}
}