View Javadoc
1   /**
2    * Logback: the reliable, generic, fast and flexible logging framework.
3    * Copyright (C) 1999-2015, QOS.ch. All rights reserved.
4    *
5    * This program and the accompanying materials are dual-licensed under
6    * either the terms of the Eclipse Public License v1.0 as published by
7    * the Eclipse Foundation
8    *
9    *   or (per the licensee's choosing)
10   *
11   * under the terms of the GNU Lesser General Public License version 2.1
12   * as published by the Free Software Foundation.
13   */
14  package ch.qos.logback.classic.turbo.lru;
15  
16  import java.util.ArrayList;
17  import java.util.List;
18  import java.util.Random;
19  
20  import static org.junit.jupiter.api.Assertions.assertEquals;
21  
22  public class Simulator {
23  
24      Random random;
25  
26      int worldSize;
27      int get2PutRatio;
28      boolean multiThreaded;
29  
30      public Simulator(int worldSize, int get2PutRatio, boolean multiThreaded) {
31          this.worldSize = worldSize;
32          this.get2PutRatio = get2PutRatio;
33          long seed = System.nanoTime();
34          // System.out.println("seed is "+seed);
35          random = new Random(seed);
36          this.multiThreaded = multiThreaded;
37      }
38  
39      public List<Event<String>> generateScenario(int len) {
40          List<Event<String>> scenario = new ArrayList<>();
41  
42          for (int i = 0; i < len; i++) {
43  
44              int r = random.nextInt(get2PutRatio);
45              boolean put = false;
46              if (r == 0) {
47                  put = true;
48              }
49              r = random.nextInt(worldSize);
50              Event<String> e = new Event<>(put, String.valueOf(r));
51              scenario.add(e);
52          }
53          return scenario;
54      }
55  
56      public void simulate(List<Event<String>> scenario, LRUCache<String, String> lruCache,
57              T_LRUCache<String> tlruCache) {
58          for (Event<String> e : scenario) {
59              if (e.put) {
60                  lruCache.put(e.k, e.k);
61                  tlruCache.put(e.k);
62              } else {
63                  String r0 = lruCache.get(e.k);
64                  String r1 = tlruCache.get(e.k);
65                  if (!multiThreaded) {
66                      // if the simulation is used in a multithreaded
67                      // context, then the state of lruCache may be different than
68                      // that of tlruCache. In single threaded mode, they should
69                      // return the same values all the time
70                      if (r0 != null) {
71                          assertEquals(r0, e.k);
72                      }
73                      assertEquals(r0, r1);
74                  }
75              }
76          }
77      }
78  
79      // void compareAndDumpIfDifferent(LRUCache<String, String> lruCache,
80      // T_LRUCache<String> tlruCache) {
81      // lruCache.dump();
82      // tlruCache.dump();
83      // if(!lruCache.keyList().equals(tlruCache.ketList())) {
84      // lruCache.dump();
85      // tlruCache.dump();
86      // throw new AssertionFailedError("s");
87      // }
88      // }
89  }