package org.basex.index;
import static org.basex.util.Token.*;
import static org.junit.Assert.*;
import java.util.*;
import org.junit.*;
/**
* Tests for {@link IndexCache}.
*
* @author BaseX Team 2005-17, BSD License
* @author Dimitar Popov
*/
public final class IndexCacheTest {
/** Test instance. */
private IndexCache cache;
/** Set up method. */
@Before
public void setUp() {
cache = new IndexCache();
}
/** Test for method {@link IndexCache#get(byte[])}. */
@Test
public void testGetNotExisting() {
for(int i = 0; i < 4000; ++i) {
final byte[] key = token("keyAdd" + i);
final long pointer = i + 5000L;
cache.add(key, i, pointer);
assertCacheEntry(key, i, pointer);
}
assertNull(cache.get(token("keyAdd" + 4000)));
}
/** Test for method {@link IndexCache#add(byte[], int, long)}. */
@Test
public void testAdd() {
for(int i = 0; i < 4000; ++i) {
final byte[] key = token("keyAdd" + i);
final long pointer = i + 5000L;
cache.add(key, i, pointer);
assertCacheEntry(key, i, pointer);
}
}
/** Test for method {@link IndexCache#add(byte[], int, long)}: update. */
@Test
public void testUpdate() {
final byte[] key = token("keyUpdate");
final int size = 10;
final long pointer = 12L;
cache.add(key, size - 1, pointer - 1L);
cache.add(key, size, pointer);
assertCacheEntry(key, size, pointer);
}
/** Test for method {@link IndexCache#delete(byte[])}. */
@Test
public void testDelete() {
final byte[] key = token("keyDelete");
final int size = 10;
final long pointer = 12L;
cache.add(key, size, pointer);
cache.delete(key);
assertNull(cache.get(key));
}
/**
* Test that new records can be continuously added without hitting
* {@link OutOfMemoryError}.
*/
@Test
@Ignore("Start this test with a small heap size (e.g. -Xmx64m)")
public void testPerformance() {
final Random random = new Random(System.nanoTime());
while(true) {
final byte[] key = new byte[100];
random.nextBytes(key);
final int size = random.nextInt();
final long pointer = random.nextLong();
cache.add(key, size, pointer);
}
}
/**
* Assert a cache entry is found in the cache.
* @param key key
* @param size number of index hits
* @param pointer pointer to id list
*/
private void assertCacheEntry(final byte[] key, final int size, final long pointer) {
final IndexEntry entry = cache.get(key);
assertEquals(entry.size, size);
assertEquals(entry.offset, pointer);
}
}