aboutsummaryrefslogtreecommitdiffstats
path: root/store/src/test/java/org/eclipse/viatra/solver/data/map/tests/fuzz/MultiThreadFuzzTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'store/src/test/java/org/eclipse/viatra/solver/data/map/tests/fuzz/MultiThreadFuzzTest.java')
-rw-r--r--store/src/test/java/org/eclipse/viatra/solver/data/map/tests/fuzz/MultiThreadFuzzTest.java96
1 files changed, 96 insertions, 0 deletions
diff --git a/store/src/test/java/org/eclipse/viatra/solver/data/map/tests/fuzz/MultiThreadFuzzTest.java b/store/src/test/java/org/eclipse/viatra/solver/data/map/tests/fuzz/MultiThreadFuzzTest.java
new file mode 100644
index 00000000..c3a3e8ea
--- /dev/null
+++ b/store/src/test/java/org/eclipse/viatra/solver/data/map/tests/fuzz/MultiThreadFuzzTest.java
@@ -0,0 +1,96 @@
1package org.eclipse.viatra.solver.data.map.tests.fuzz;
2
3import static org.junit.jupiter.api.Assertions.assertEquals;
4import static org.junit.jupiter.api.Assertions.fail;
5
6import java.util.Collections;
7import java.util.LinkedList;
8import java.util.List;
9import java.util.stream.Stream;
10
11import org.eclipse.viatra.solver.data.map.ContinousHashProvider;
12import org.eclipse.viatra.solver.data.map.VersionedMapStore;
13import org.eclipse.viatra.solver.data.map.VersionedMapStoreImpl;
14import org.eclipse.viatra.solver.data.map.tests.fuzz.utils.FuzzTestUtils;
15import org.eclipse.viatra.solver.data.map.tests.utils.MapTestEnvironment;
16import org.junit.jupiter.api.Tag;
17import org.junit.jupiter.api.Timeout;
18import org.junit.jupiter.params.ParameterizedTest;
19import org.junit.jupiter.params.provider.Arguments;
20import org.junit.jupiter.params.provider.MethodSource;
21
22class MultiThreadFuzzTest {
23 public static final int noThreads = 32;
24
25 private void runFuzzTest(String scenario, int seed, int steps, int maxKey, int maxValue, int commitFrequency,
26 boolean evilHash) {
27 String[] values = MapTestEnvironment.prepareValues(maxValue);
28 ContinousHashProvider<Integer> chp = MapTestEnvironment.prepareHashProvider(evilHash);
29
30 VersionedMapStore<Integer, String> store = new VersionedMapStoreImpl<Integer, String>(chp, values[0]);
31
32 // initialize runnables
33 MultiThreadTestRunnable[] runnables = new MultiThreadTestRunnable[noThreads];
34 for(int i = 0; i<noThreads; i++) {
35 runnables[i] = new MultiThreadTestRunnable(scenario+"-T"+(i+1), store, steps, maxKey, values, seed, commitFrequency);
36 }
37
38 // initialize threads
39 Thread[] threads = new Thread[noThreads];
40 for(int i = 0; i<noThreads; i++) {
41 threads[i] = new Thread(runnables[i]);
42 }
43
44 // start threads;
45 for(int i = 0; i<noThreads; i++) {
46 threads[i].start();
47 }
48
49 // wait all the threads;
50 for(int i = 0; i<noThreads; i++) {
51 try {
52 threads[i].join();
53 } catch (InterruptedException e) {
54 fail("Thread "+i+" interrupted.");
55 }
56 }
57
58 // collect errors
59 List<Throwable> errors = new LinkedList<>();
60 for(int i = 0; i<noThreads; i++) {
61 errors.addAll(runnables[i].getErrors());
62 }
63
64 assertEquals(Collections.EMPTY_LIST, errors);
65 }
66
67 @ParameterizedTest(name = "Multithread {index}/{0} Steps={1} Keys={2} Values={3} commit frequency={4} seed={5} evil-hash={6}")
68 @MethodSource
69 @Timeout(value = 10)
70 @Tag("fuzz")
71 void parametrizedFastFuzz(int tests, int steps, int noKeys, int noValues, int commitFrequency, int seed,
72 boolean evilHash) {
73 runFuzzTest("MultithreadS" + steps + "K" + noKeys + "V" + noValues + "CF" + commitFrequency + "s" + seed, seed, steps, noKeys, noValues,
74 commitFrequency, evilHash);
75 }
76
77 static Stream<Arguments> parametrizedFastFuzz() {
78 return FuzzTestUtils.permutationWithSize(new Object[] { FuzzTestUtils.FAST_STEP_COUNT }, new Object[] { 3, 32, 32 * 32 },
79 new Object[] { 2, 3 }, new Object[] { 10, 100 }, new Object[] { 1, 2, 3 },
80 new Object[] { false, true });
81 }
82
83 @ParameterizedTest(name = "Multithread {index}/{0} Steps={1} Keys={2} Values={3} commit frequency={4} seed={5} evil-hash={6}")
84 @MethodSource
85 @Tag("fuzz")
86 @Tag("slow")
87 void parametrizedSlowFuzz(int tests, int steps, int noKeys, int noValues, int commitFrequency, int seed,
88 boolean evilHash) {
89 runFuzzTest("RestoreS" + steps + "K" + noKeys + "V" + noValues + "s" + seed, seed, steps, noKeys, noValues,
90 commitFrequency, evilHash);
91 }
92
93 static Stream<Arguments> parametrizedSlowFuzz() {
94 return FuzzTestUtils.changeStepCount(RestoreFuzzTest.parametrizedFastFuzz(), 1);
95 }
96}