package net.jxta.impl.cm.bdb;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import net.jxta.impl.cm.AbstractCmTest;
import net.jxta.impl.cm.AdvertisementCache;
import net.jxta.impl.cm.bdb.BerkeleyDbAdvertisementCache;
import net.jxta.impl.util.threads.TaskManager;
import static org.junit.Assert.*;
public class BerkeleyDbAdvertisementCacheTest extends AbstractCmTest {
private TaskManager taskManager;
@Before
@Override
public void setUp() throws Exception {
taskManager = new TaskManager();
super.setUp();
}
@After
@Override
public void tearDown() throws Exception {
super.tearDown();
taskManager.shutdown();
}
@Override
public AdvertisementCache createWrappedCache(String areaName) throws Exception {
return new BerkeleyDbAdvertisementCache(testRootDir.toURI(), areaName, taskManager, false);
}
@Override
public String getCacheClassName() {
return BerkeleyDbAdvertisementCache.class.getName();
}
@Test
public void testGarbageCollection() throws Exception {
fakeTimer.currentTime = 0;
cm.save("a", "b", adv, 10000L, 10000L);
cm.garbageCollect();
assertEquals(0, ((BerkeleyDbAdvertisementCache)wrappedCache).getExpiryCount());
fakeTimer.currentTime = 20000L;
cm.garbageCollect();
assertEquals(1, ((BerkeleyDbAdvertisementCache)wrappedCache).getExpiryCount());
// should return to 0 after each call
assertEquals(0, ((BerkeleyDbAdvertisementCache)wrappedCache).getExpiryCount());
assertNull(cm.getInputStream("a", "b"));
assertEquals(-1, cm.getLifetime("a", "b"));
assertEquals(-1, cm.getExpirationtime("a", "b"));
cm.save("a", "1", createPeerAdvert(groupId, "PeerA"), 15000L, 15000L); // expires @ 35000
cm.save("a", "2", createPeerAdvert(groupId, "PeerB"), 12000L, 12000L); // expires @ 32000
cm.save("a", "3", createPeerAdvert(groupId, "PeerC"), 12000L, 12000L); // expires @ 32000
cm.save("a", "4", createPeerAdvert(groupId, "PeerD"), 18000L, 18000L); // expires @ 38000
fakeTimer.currentTime = 34000L;
cm.garbageCollect();
assertEquals(2, ((BerkeleyDbAdvertisementCache)wrappedCache).getExpiryCount());
List<InputStream> search = cm.search("a", "Name", "Peer*", 100, null);
checkContains(extractNames(search), "PeerA", "PeerD");
fakeTimer.currentTime = 35500L;
cm.garbageCollect();
assertEquals(1, ((BerkeleyDbAdvertisementCache)wrappedCache).getExpiryCount());
search = cm.search("a", "Name", "Peer*", 100, null);
checkContains(extractNames(search), "PeerD");
fakeTimer.currentTime = 40000L;
cm.garbageCollect();
assertEquals(1, ((BerkeleyDbAdvertisementCache)wrappedCache).getExpiryCount());
search = cm.search("a", "Name", "Peer*", 100, null);
assertEquals(0, search.size());
}
@Test
public void testCreation_withStoreRootThatIsAFile() throws Exception {
File testRoot = File.createTempFile("bdbtest", null);
try {
new BerkeleyDbAdvertisementCache(testRoot.toURI(), "test", taskManager);
fail("IOException expected");
} catch(IOException e) {
assertTrue("Error message does not contain expected prefix: " + e.getMessage(), e.getMessage().startsWith("Provided store root URI does not point to a directory: "));
}
}
}