1
2import re, datetime
3import tests, debug
4from common import TestCommon
5from results import PassFailResult, RowResults
6from itertools import product
7
8@tests.add_test
9class MdbBench(TestCommon):
10    '''mdbbench'''
11    name = "mdbbench"
12
13    #resets = ["random_nat_ram", "propszrand_nat_ram", "szprob_cp_nat_ram"]
14    resets = ["szprob_cp_nat_ram"]
15    counts = [1<<x for x in range(5, 13+1)]
16    #counts = [1<<10]
17    impls = ["mdb_bench", "mdb_bench_old"]
18    measures = [
19        "insert_one",
20        "remove_one",
21        "iterate_1",
22        "iterate_10",
23        "iterate_100",
24        "iterate_1000",
25        "has_copies",
26        "has_ancestors",
27        "has_descendants",
28    ]
29    impl_measures = {
30        "mdb_bench": [
31            "query_address"
32        ],
33    }
34    dump = True
35
36    def get_build_targets(self, build, machine):
37        targets = super(MdbBench, self).get_build_targets(build, machine)
38        for impl in self.impls:
39            targets.append('%s/sbin/%s' % (machine.get_bootarch(), impl))
40        return targets
41
42    def run_one(self, build, machine, testdir, count, measure, reset, impl, runs):
43        debug.log('running %s m=%s c=%s' % (impl, measure, count))
44        yield "[mdb_bench of %s]\n" % impl
45        modules = self.get_modules(build, machine)
46        bench_args = ["count=%s"%count, "reset=%s"%reset, "runs=%d"%runs, "measure=%s"%measure]
47        modules.add_module(impl, bench_args)
48        self.boot(machine, modules)
49        self.set_timeout(datetime.timedelta(hours=1))
50        for line in self.collect_data(machine):
51            yield line
52
53    def run(self, build, machine, testdir):
54        for c, m, r, i in product(self.counts, self.measures, self.resets, self.impls):
55            for l in self.run_one(build, machine, testdir, c, m, r, i, 1000):
56                yield l
57
58        for i in set(self.impls) & set(self.impl_measures.keys()):
59            for c, m, r in product(self.counts, self.impl_measures[i], self.resets):
60                for l in self.run_one(build, machine, testdir, c, m, r, i, 1000):
61                    yield l
62
63        if self.dump:
64            for c, r in product(self.counts, self.resets):
65                for l in self.run_one(build, machine, testdir, c, "dump", r, "mdb_bench", 10):
66                    yield l
67
68    def process_data(self, testdir, rawiter):
69        results = RowResults(['impl', 'reset', 'measure', 'count', 'ticks'])
70        caps = RowResults(['run', 'reset', 'count', 'base', 'bits', 'flags'], name="caps")
71        impl = None
72        reset = None
73        measure = None
74        count = None
75        dumping = False
76        for line in rawiter:
77            m = re.match(r"\[mdb_bench of (\w+)\]", line)
78            if m:
79                impl = m.group(1)
80                continue
81            m = re.match(r"\[mdb_bench dumping\]", line)
82            if m:
83                dumping = True
84            if self.boot_phase:
85                continue
86            m = re.match(r"([^:/]+)/(\d+):dump:([^:]+): 0x([0-9a-fA-F]+)/(\d+) ([c.][a.][d.])", line)
87            if m:
88                caps.add_row([m.group(3), m.group(1), m.group(2), m.group(4), m.group(5), m.group(6)])
89                continue
90            m = re.match(r"([^:]+):([^:]+): (\d+)/(\d+)", line)
91            if m:
92                reset = m.group(1)
93                measure = m.group(2)
94                count = m.group(4)
95                ticks = m.group(3)
96                results.add_row([impl, reset, measure, count, ticks])
97                continue
98
99        results = [results]
100        if dumping:
101            results.append(caps)
102        return results
103