package focusedCrawler.util.persistence; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.nullValue; import static org.junit.Assert.assertThat; import java.util.Arrays; import java.util.Comparator; import java.util.List; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameter; import org.junit.runners.Parameterized.Parameters; import focusedCrawler.link.frontier.LinkRelevance; @RunWith(Parameterized.class) public class PersistentHashtableTest { @Rule // a new temp folder is created for each test case public TemporaryFolder tempFolder = new TemporaryFolder(); @Parameter public PersistentHashtable.DB database; /* * This test runs multiple times for each of the following parameters, * to make sure that it works with all underlying database implementations. */ @Parameters public static Iterable<? extends Object> data() { return Arrays.asList(PersistentHashtable.DB.BERKELEYDB, PersistentHashtable.DB.ROCKSDB); } @Test public void shouldAddAndGetKey() throws Exception { // given PersistentHashtable<String> ht = new PersistentHashtable<>(tempFolder.newFolder().toString(), 1000, String.class, database); // when ht.put("my_key", "123"); // then assertThat(ht.get("my_key"), is("123")); } @Test public void shouldCheckIfKeyExists() throws Exception { // given PersistentHashtable<String> ht = new PersistentHashtable<>(tempFolder.newFolder().toString(), 1000, String.class, database); // when ht.put("my_existent_key", "123"); // then assertThat(ht.get("my_existent_key"), is("123")); assertThat(ht.get("unexistent"), is(nullValue())); } @Test public void shouldPersistDataIntoHastable() throws Exception { // given int cacheSize = 1; String folder = tempFolder.newFolder().toString(); PersistentHashtable<String> ht = new PersistentHashtable<>(folder, cacheSize, String.class, database); // when ht.put("my_key1", "111"); ht.put("my_key2", "222"); ht.put("http://foo.com/index.php&a=1", "333"); ht.close(); ht = new PersistentHashtable<>(folder, cacheSize, String.class, database); // then assertThat(ht.get("my_key1"), is("111")); assertThat(ht.get("my_key2"), is("222")); assertThat(ht.get("http://foo.com/index.php&a=1"), is("333")); } @Test public void shouldReturnOrderedTupleSet() throws Exception { // given int cacheSize = 1; String folder = tempFolder.newFolder().toString(); PersistentHashtable<LinkRelevance> ht = new PersistentHashtable<>(folder, cacheSize, LinkRelevance.class, database); Comparator<LinkRelevance > linkRelevanceComparator = new Comparator<LinkRelevance >() { public int compare(LinkRelevance o1, LinkRelevance o2) { return Double.compare(o2.getRelevance(), o1.getRelevance()); } }; // when ht.put("http://bar.com", new LinkRelevance("http://bar.com", 2d)); ht.put("http://foo.com", new LinkRelevance("http://foo.com", 1d)); ht.put("http://zoo.com", new LinkRelevance("http://bar.com", 3d)); ht.commit(); List<Tuple<LinkRelevance>> keys = ht.orderedSet(linkRelevanceComparator); // then assertThat(keys.size(), is(3)); assertThat(keys.get(0).getValue().getRelevance(), is(3d)); assertThat(keys.get(1).getValue().getRelevance(), is(2d)); assertThat(keys.get(2).getValue().getRelevance(), is(1d)); } @Test public void shouldIterateOverTuples() throws Exception { // given PersistentHashtable<Integer> ht = new PersistentHashtable<>(tempFolder.newFolder().toString(), 1000, Integer.class, database); ht.put("1", 1); ht.put("2", 2); ht.put("3", 3); ht.commit(); // when try(TupleIterator<Integer> it = ht.iterator()) { // then Tuple<Integer> tuple; assertThat(it.hasNext(), is(true)); tuple = it.next(); assertThat(tuple.getKey(), is("1")); assertThat(tuple.getValue(), is(1)); assertThat(it.hasNext(), is(true)); tuple = it.next(); assertThat(tuple.getKey(), is("2")); assertThat(tuple.getValue(), is(2)); assertThat(it.hasNext(), is(true)); tuple = it.next(); assertThat(tuple.getKey(), is("3")); assertThat(tuple.getValue(), is(3)); assertThat(it.hasNext(), is(false)); assertThat(it.next(), is(nullValue())); } } @Test public void shoudNotCrashWhenIterateOverEmptyHashtable() throws Exception { // given PersistentHashtable<Integer> ht = new PersistentHashtable<>(tempFolder.newFolder().toString(), 1000, Integer.class, database); // when try(TupleIterator<Integer> it = ht.iterator()) { // then assertThat(it.hasNext(), is(false)); assertThat(it.next(), is(nullValue())); } } }