/* 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:
* David Winslow (Boundless) - initial implementation
*/
package org.locationtech.geogig.storage;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.File;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.rules.TemporaryFolder;
import org.locationtech.geogig.api.Platform;
import org.locationtech.geogig.api.porcelain.ConfigException;
import com.google.common.base.Optional;
public abstract class ConfigDatabaseTest<C extends ConfigDatabase> {
@Rule
public ExpectedException exception = ExpectedException.none();
@Rule
public TemporaryFolder tempFolder = new TemporaryFolder();
C config;
@Before
public final void setUp() {
final File userhome = tempFolder.newFolder("mockUserHomeDir");
final File workingDir = tempFolder.newFolder("mockWorkingDir");
tempFolder.newFolder("mockWorkingDir", ".geogig");
final Platform platform = mock(Platform.class);
when(platform.getUserHome()).thenReturn(userhome);
when(platform.pwd()).thenReturn(workingDir);
config = createDatabase(platform);
}
@After
public final void tearDown() {
destroy(config);
}
protected abstract C createDatabase(final Platform platform);
protected abstract void destroy(C config);
@Test
public void testLocal() {
// Test integer and string
config.put("section.int", 1);
config.put("section.string", "2");
final int one = config.get("section.int", Integer.class).or(-1);
assertEquals(one, 1);
final String two = config.get("section.string").or("-1");
assertEquals(two, "2");
// Test overwriting a value that already exists
config.put("section.string", "3");
final String three = config.get("section.string").or("-1");
assertEquals(three, "3");
}
@Test
public void testGlobal() {
// Test integer and string
config.putGlobal("section.int", 1);
config.putGlobal("section.string", "2");
final int one = config.getGlobal("section.int", Integer.class).or(-1);
assertEquals(one, 1);
final String two = config.getGlobal("section.string").or("-1");
assertEquals(two, "2");
// Test overwriting a value that already exists
config.putGlobal("section.string", "3");
final String three = config.getGlobal("section.string").or("-1");
assertEquals(three, "3");
}
@Test
public void testNoDot() {
exception.expect(ConfigException.class);
config.get("nodot");
}
@Test
public void testNoSection() {
exception.expect(ConfigException.class);
config.get(".int");
}
@Test
public void testNoKey() {
exception.expect(ConfigException.class);
config.get("section.");
}
@Test
public void testNoRepository() {
tempFolder.delete();
exception.expect(ConfigException.class);
config.put("section.int", 1);
}
@Test
public void testNoUserHome() {
final Platform platform = mock(Platform.class);
when(platform.getUserHome()).thenReturn(null);
final ConfigDatabase config = createDatabase(platform);
exception.expect(ConfigException.class);
config.putGlobal("section.int", 1);
}
@Test
public void testNullSectionKeyPair() {
exception.expect(ConfigException.class);
config.get(null);
}
@Test
public void testNullValue() {
config.put("section.null", null);
Optional<String> str = config.get("section.null");
assertFalse(str.isPresent());
}
@Test
public void testNumberFormatException() {
config.put("section.string", "notanumber");
exception.expect(IllegalArgumentException.class);
config.get("section.string", Integer.class);
}
@Test
public void testNoValue() {
Optional<String> str = config.get("doesnt.exist");
assertFalse(str.isPresent());
}
}