1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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)
|