1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.omid.tso;
19
20 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory;
22 import org.testng.annotations.Test;
23
24 import java.util.Random;
25 import java.util.Set;
26 import java.util.TreeSet;
27
28 import static org.testng.Assert.assertEquals;
29 import static org.testng.Assert.assertTrue;
30
31 public class TestLongCache {
32
33 private static final Logger LOG = LoggerFactory.getLogger(TestLongCache.class);
34
35 private static final long TEST_VALUE = 1000;
36
37 private Random random = new Random(System.currentTimeMillis());
38
39 @Test(timeOut = 10_000)
40 public void testAddAndGetElems() {
41
42
43 final int CACHE_SIZE = 10_000_000;
44 final int CACHE_ASSOCIATIVITY = 32;
45 LongCache cache = new LongCache(CACHE_SIZE, CACHE_ASSOCIATIVITY);
46
47
48 for (int i = 0; i < 1000; i++) {
49 long position = random.nextLong();
50 assertEquals(cache.get(position), 0L);
51 }
52
53 Set<Long> testedKeys = new TreeSet<>();
54
55 for (int i = 0; i < 1000; i++) {
56 long position = random.nextLong();
57 cache.set(position, TEST_VALUE);
58 testedKeys.add(position);
59 }
60
61
62 for (long key : testedKeys) {
63 assertEquals(cache.get(key), TEST_VALUE);
64 }
65
66 }
67
68 @Test(timeOut = 10_000)
69 public void testEntriesAge() {
70
71 final int entries = 1000;
72
73 LongCache cache = new LongCache(entries, 16);
74
75 int removals = 0;
76 long totalAge = 0;
77 double tempStdDev = 0;
78 double tempAvg = 0;
79
80 int i = 0;
81 int largestDeletedTimestamp = 0;
82 for (; i < entries * 10; ++i) {
83 long removed = cache.set(random.nextLong(), i);
84 if (removed > largestDeletedTimestamp) {
85 largestDeletedTimestamp = (int) removed;
86 }
87 }
88
89 long time = System.nanoTime();
90 for (; i < entries * 100; ++i) {
91 long removed = cache.set(random.nextLong(), i);
92 if (removed > largestDeletedTimestamp) {
93 largestDeletedTimestamp = (int) removed;
94 }
95 int gap = i - largestDeletedTimestamp;
96 removals++;
97 totalAge += gap;
98 double oldAvg = tempAvg;
99 tempAvg += (gap - tempAvg) / removals;
100 tempStdDev += (gap - oldAvg) * (gap - tempAvg);
101 }
102 long elapsed = System.nanoTime() - time;
103 LOG.info("Elapsed (ms): " + (elapsed / (double) 1000));
104
105 double avgGap = totalAge / (double) removals;
106 LOG.info("Avg gap: " + (tempAvg));
107 LOG.info("Std dev gap: " + Math.sqrt((tempStdDev / entries)));
108 assertTrue(avgGap > entries * 0.6, "avgGap should be greater than entries * 0.6");
109
110 }
111 }