package org.eclipse.viatra.solver.data.map.tests.fuzz; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Random; import java.util.stream.Stream; import org.eclipse.viatra.solver.data.map.ContinousHashProvider; import org.eclipse.viatra.solver.data.map.VersionedMapStore; import org.eclipse.viatra.solver.data.map.VersionedMapStoreImpl; import org.eclipse.viatra.solver.data.map.internal.VersionedMapImpl; import org.eclipse.viatra.solver.data.map.tests.fuzz.utils.FuzzTestUtils; import org.eclipse.viatra.solver.data.map.tests.utils.MapTestEnvironment; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Timeout; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; class SharedStoreFuzzTest { private void runFuzzTest(String scenario, int seed, int steps, int maxKey, int maxValue, int commitFrequency, boolean evilHash) { String[] values = MapTestEnvironment.prepareValues(maxValue); ContinousHashProvider chp = MapTestEnvironment.prepareHashProvider(evilHash); List> stores = VersionedMapStoreImpl.createSharedVersionedMapStores(5, chp, values[0]); iterativeRandomPutsAndCommitsThenRestore(scenario, stores, steps, maxKey, values, seed, commitFrequency); } private void iterativeRandomPutsAndCommitsThenRestore(String scenario, List> stores, int steps, int maxKey, String[] values, int seed, int commitFrequency) { // 1. maps with versions Random r = new Random(seed); List> versioneds = new LinkedList<>(); for(VersionedMapStore store : stores) { versioneds.add((VersionedMapImpl) store.createMap()); } List> index2Version = new LinkedList<>(); for(int i = 0; i()); } for (int i = 0; i < steps; i++) { int stepIndex = i + 1; for (int storeIndex = 0; storeIndex> reference = new LinkedList<>(); for(VersionedMapStore store : stores) { reference.add((VersionedMapImpl) store.createMap()); } r = new Random(seed); for (int i = 0; i < steps; i++) { int index = i + 1; for (int storeIndex = 0; storeIndex parametrizedFastFuzz() { return FuzzTestUtils.permutationWithSize(new Object[] { FuzzTestUtils.FAST_STEP_COUNT }, new Object[] { 3, 32, 32 * 32 }, new Object[] { 2, 3 }, new Object[] { 1, 10, 100 }, new Object[] { 1, 2, 3 }, new Object[] { false, true }); } @ParameterizedTest(name = "Shared Store {index}/{0} Steps={1} Keys={2} Values={3} commit frequency={4} seed={5} evil-hash={6}") @MethodSource @Tag("smoke") @Tag("slow") void parametrizedSlowFuzz(int tests, int steps, int noKeys, int noValues, int commitFrequency, int seed, boolean evilHash) { runFuzzTest("SharedS" + steps + "K" + noKeys + "V" + noValues + "s" + seed, seed, steps, noKeys, noValues, commitFrequency, evilHash); } static Stream parametrizedSlowFuzz() { return FuzzTestUtils.changeStepCount(RestoreFuzzTest.parametrizedFastFuzz(), 1); } }