package edu.stanford.nlp.sempre.cache.test;
import edu.stanford.nlp.sempre.cache.FileStringCache;
import fig.basic.IOUtils;
import fig.basic.MemUsage;
import org.testng.annotations.Test;
import java.io.BufferedReader;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import static org.testng.AssertJUnit.assertEquals;
/**
* @author Roy Frostig
*/
public class StringCacheTest {
private int numLines(BufferedReader in) throws IOException {
int n = 0;
while (in.readLine() != null) n++;
return n;
}
/**
* Check that we flush at the given frequency
* @throws IOException
*/
@SuppressWarnings("deprecation")
@Test(groups = "fs")
public void testFlush() throws IOException {
FileStringCache.opts.appendMode = false;
FileStringCache.opts.capacity = 1;
FileStringCache.opts.flushFrequency = 10;
FileStringCache.opts.verbose = 5;
final String fs = "StringCacheTest-cache.tmp";
final Path fsPath = FileSystems.getDefault().getPath(fs);
Files.deleteIfExists(fsPath);
FileStringCache cache = new FileStringCache();
cache.init(fs);
for (int i = 0; i <= 100; i++) {
String key = "key:" + i;
String val = "val:" + i;
cache.put(key, val);
assertEquals(cache.getNumTouches(), i + 1);
if (i > 0 && i % 10 == 0) {
int lines = numLines(IOUtils.openInHard(fs));
System.out.println("!!! " + lines + " = " + i);
assertEquals(lines, i + 1);
}
}
Files.deleteIfExists(fsPath);
}
/**
* Check that we really do evict at the capacity.
* @throws IOException
*/
@Test(groups = "fs")
public void testEvict() throws IOException {
FileStringCache.opts.appendMode = false;
FileStringCache.opts.capacity = 10;
FileStringCache.opts.flushFrequency = 10;
FileStringCache.opts.verbose = 5;
final String fs = "StringCacheTest-cache.tmp";
final Path fsPath = FileSystems.getDefault().getPath(fs);
Files.deleteIfExists(fsPath);
FileStringCache cache = new FileStringCache();
cache.init(fs);
// Make ~20 MB of string data
String junk20MB = "junk";
while (MemUsage.getBytes(junk20MB) <= 20 * 1024 * 1024)
junk20MB += junk20MB;
// Make ~1 MB of string data
String junk1MB = "junk";
while (MemUsage.getBytes(junk1MB) <= 1024 * 1024)
junk1MB += junk1MB;
// Add something small, to be evicted
cache.put(junk1MB + "1", "test1");
assertEquals(1, cache.size());
assert cache.get(junk1MB + "1").equals("test1");
// Add something small, shouldn't evict anything
cache.put(junk1MB + "2", "test2");
assertEquals(2, cache.size());
assert cache.get(junk1MB + "1").equals("test1");
assert cache.get(junk1MB + "2").equals("test2");
// Add something big, to saturate cache and kick out the small entries.
// Also kicks itself out.
cache.put(junk20MB + "1", "big1");
assertEquals(0, cache.size());
assertEquals(cache.get(junk20MB + "1"), null);
// Do that again.
cache.put(junk20MB + "2", "big2");
assertEquals(0, cache.size());
assertEquals(cache.get(junk20MB + "2"), null);
Files.deleteIfExists(fsPath);
}
}