package io.rx_cache2.internal.cache;
import io.reactivex.observers.TestObserver;
import io.rx_cache2.internal.Memory;
import io.rx_cache2.internal.Mock;
import io.rx_cache2.internal.Record;
import io.rx_cache2.internal.cache.memory.ReferenceMapMemory;
import io.rx_cache2.internal.common.BaseTest;
import java.util.List;
import org.junit.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;
/**
* Created by victor on 03/03/16.
*/
public class EvictExpiredRecordsPersistenceTest extends BaseTest {
private io.rx_cache2.internal.cache.EvictExpiredRecordsPersistence
evictExpiredRecordsPersistenceUT;
private io.rx_cache2.internal.cache.HasRecordExpired hasRecordExpired;
private io.rx_cache2.internal.cache.TwoLayersCache twoLayersCache;
private Memory memory;
private static final long ONE_SECOND_LIFE = 1000, THIRTY_SECOND_LIFE = 30000, MORE_THAN_ONE_SECOND_LIFE = 1250;
@Override public void setUp() {
super.setUp();
memory = new ReferenceMapMemory();
twoLayersCache = new TwoLayersCache(evictRecord(memory), retrieveRecord(memory), saveRecord(memory));
hasRecordExpired = new io.rx_cache2.internal.cache.HasRecordExpired();
evictExpiredRecordsPersistenceUT = new EvictExpiredRecordsPersistence(memory, disk, hasRecordExpired, null);
}
@Test public void Evict_Just_Expired_Records() {
int recordsCount = 100;
for (int i = 0; i < recordsCount/2; i++) {
twoLayersCache.save(i+"_expired", "", "", new Mock(i+"_expired"), ONE_SECOND_LIFE, true, false);
twoLayersCache.save(i+"_live", "", "", new Mock(i+"_live"), THIRTY_SECOND_LIFE, true, false);
}
waitTime(MORE_THAN_ONE_SECOND_LIFE);
assertThat(disk.allKeys().size(), is(recordsCount));
TestObserver<Integer> testObserver = evictExpiredRecordsPersistenceUT.startEvictingExpiredRecords().test();
testObserver.awaitTerminalEvent();
testObserver.assertNoErrors();
List<String> allKeys = disk.allKeys();
assertThat(allKeys.size(), is(recordsCount / 2));
for (String key : allKeys) {
key = key.substring(0, key.indexOf("$"));
Record<Mock> record = twoLayersCache.retrieve(key, "", "", false, THIRTY_SECOND_LIFE, false);
assert(record.getData().getMessage().contains("live"));
assert(!record.getData().getMessage().contains("expired"));
}
}
private io.rx_cache2.internal.cache.SaveRecord saveRecord(Memory memory) {
return new SaveRecord(memory, disk, 100, new EvictExpirableRecordsPersistence(memory, disk, 100, null), null);
}
private io.rx_cache2.internal.cache.EvictRecord evictRecord(Memory memory) {
return new io.rx_cache2.internal.cache.EvictRecord(memory, disk);
}
private io.rx_cache2.internal.cache.RetrieveRecord retrieveRecord(Memory memory) {
return new io.rx_cache2.internal.cache.RetrieveRecord(memory, disk, new EvictRecord(memory, disk), new HasRecordExpired(), null);
}
}