summaryrefslogtreecommitdiff
path: root/test/test_determinism.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/test_determinism.py')
-rw-r--r--test/test_determinism.py50
1 files changed, 50 insertions, 0 deletions
diff --git a/test/test_determinism.py b/test/test_determinism.py
new file mode 100644
index 0000000..0d40fcb
--- /dev/null
+++ b/test/test_determinism.py
@@ -0,0 +1,50 @@
+# file : test/test_determinism.py
+# project : Salis-VM
+# author : Paul Oliver <contact@pauloliver.dev>
+#
+# This test ensures simulator produces deterministic results.
+# Resulting save, eva and DB files must be exactly the same for all simulations,
+# whenever the same seed value is used.
+
+import hashlib
+import os
+
+from test_general import SalisTest
+
+class TestDeterminism(SalisTest):
+ SIM_OPTS = {
+ "anc": "55a",
+ "anc_path": "anc",
+ "name": "determinism.sim",
+ "ui_path": "test/ui",
+ "vm_arch": "v1",
+ }
+
+ SIM_OPTS_ASA4 = SIM_OPTS | {"ui": "asa4"}
+ SIM_OPTS_PUSH = SIM_OPTS | {"ui": "push"}
+
+ def get_asa4_sums(self):
+ self.run_ui_test(**self.SIM_OPTS_ASA4, clones=2, cores=2, mvec_pow=16, seed=8765432, data_push_pow=20, sync_pow=16, auto_save_pow=20)
+ sim_path = f"{self.tempdir.name}/{self.SIM_OPTS["name"]}"
+ auto_saves = sorted(f"{sim_path}/{f}" for f in os.listdir(sim_path))
+ auto_saves = filter(lambda f: f.startswith(f"{sim_path}/{self.SIM_OPTS["name"]}-"), auto_saves)
+ auto_saves = list(auto_saves)[:4]
+ evas = sorted(f"{sim_path}/evas/{f}" for f in os.listdir(f"{sim_path}/evas"))
+ evas = list(evas)[:4]
+ return {f: hashlib.md5(open(f, "rb").read()).hexdigest() for f in auto_saves + evas}
+
+ def get_db_sums(self):
+ self.run_ui_test(**self.SIM_OPTS_PUSH, clones=2, cores=2, mvec_pow=16, seed=8765432, data_push_pow=20, sync_pow=16, auto_save_pow=20)
+ sim_path = f"{self.tempdir.name}/{self.SIM_OPTS["name"]}"
+ db_path = f"{sim_path}/{self.SIM_OPTS["name"]}.sqlite3"
+ return hashlib.md5(open(db_path, "rb").read()).hexdigest()
+
+ def test_deterministic_saves_and_evas(self):
+ sums_1 = self.get_asa4_sums()
+ sums_2 = self.get_asa4_sums()
+ self.assertEqual(sums_1, sums_2)
+
+ def test_deterministic_db(self):
+ sum_1 = self.get_db_sums()
+ sum_2 = self.get_db_sums()
+ self.assertEqual(sum_1, sum_2)