/**
* Logback: the reliable, generic, fast and flexible logging framework.
* Copyright (C) 1999-2015, QOS.ch. All rights reserved.
*
* This program and the accompanying materials are dual-licensed under
* either the terms of the Eclipse Public License v1.0 as published by
* the Eclipse Foundation
*
* or (per the licensee's choosing)
*
* under the terms of the GNU Lesser General Public License version 2.1
* as published by the Free Software Foundation.
*/
package ch.qos.logback.classic.turbo.lru;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Simulator {
Random random;
int worldSize;
int get2PutRatio;
boolean multiThreaded;
public Simulator(int worldSize, int get2PutRatio, boolean multiThreaded) {
this.worldSize = worldSize;
this.get2PutRatio = get2PutRatio;
long seed = System.nanoTime();
// System.out.println("seed is "+seed);
random = new Random(seed);
this.multiThreaded = multiThreaded;
}
public List<Event> generateScenario(int len) {
List<Event> scenario = new ArrayList<Event>();
for (int i = 0; i < len; i++) {
int r = random.nextInt(get2PutRatio);
boolean put = false;
if (r == 0) {
put = true;
}
r = random.nextInt(worldSize);
Event<String> e = new Event<String>(put, String.valueOf(r));
scenario.add(e);
}
return scenario;
}
public void simulate(List<Event> scenario, LRUCache<String, String> lruCache, T_LRUCache<String> tlruCache) {
for (Event<String> e : scenario) {
if (e.put) {
lruCache.put(e.k, e.k);
tlruCache.put(e.k);
} else {
String r0 = lruCache.get(e.k);
String r1 = tlruCache.get(e.k);
if (!multiThreaded) {
// if the simulation is used in a multi-threaded
// context, then the state of lruCache may be different than
// that of tlruCache. In single threaded mode, they should
// return the same values all the time
if (r0 != null) {
assertEquals(r0, e.k);
}
assertEquals(r0, r1);
}
}
}
}
// void compareAndDumpIfDifferent(LRUCache<String, String> lruCache,
// T_LRUCache<String> tlruCache) {
// lruCache.dump();
// tlruCache.dump();
// if(!lruCache.keyList().equals(tlruCache.ketList())) {
// lruCache.dump();
// tlruCache.dump();
// throw new AssertionFailedError("s");
// }
// }
}