summaryrefslogtreecommitdiff
path: root/test/test_determinism.py
blob: 0d40fcb785ce06a816a6d54421ac12fd9dc37e37 (plain)
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)