Rev 9312 | Rev 9314 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
9249 | Boppan | 1 | #!/usr/bin/python3 |
9312 | Boppan | 2 | # Copyright 2021 Magomed Kostoev |
9249 | Boppan | 3 | # Published under MIT License |
4 | |||
5 | import os |
||
6 | import sys |
||
7 | from importlib.machinery import SourceFileLoader |
||
9310 | Boppan | 8 | from shutil import which |
9249 | Boppan | 9 | import timeit |
10 | import urllib.request |
||
11 | import subprocess |
||
12 | |||
13 | sys.path.append('test') |
||
14 | import common |
||
15 | |||
16 | root_dir = os.getcwd() |
||
17 | tests = [] |
||
18 | |||
19 | def log(s, end = "\n"): |
||
20 | print(s, end = end, flush = True) |
||
21 | |||
22 | def execute(s, mute = False): |
||
23 | mute = ">/dev/null" if mute else "" |
||
24 | code = os.system(f"{s}{mute}") |
||
25 | if code: |
||
26 | print(f"Command returned {code}: \"{s}\"") |
||
27 | exit(-1) |
||
28 | |||
29 | def stage(name, command, mute = False): |
||
30 | print(f"{name}... ", end = "") |
||
31 | execute(command, mute = mute) |
||
32 | print("Done.") |
||
33 | |||
9310 | Boppan | 34 | def tool_exists(name): |
35 | assert(type(name) == str) |
||
36 | return which(name) != None |
||
37 | |||
38 | def check_tools(tools): |
||
39 | assert(type(tools) == tuple) |
||
40 | for name_package_pair in tools: |
||
41 | assert(type(name_package_pair) == tuple) |
||
42 | assert(len(name_package_pair) == 2) |
||
43 | assert(type(name_package_pair[0]) == str) |
||
44 | assert(type(name_package_pair[1]) == str) |
||
45 | |||
46 | not_exists = [] |
||
47 | for name, package in tools: |
||
48 | if not tool_exists(name): |
||
49 | not_exists.append((name, package)) |
||
50 | if len(not_exists) != 0: |
||
51 | log("Sorry, I can't find some tools:") |
||
9311 | Boppan | 52 | |
53 | header_name = "Name" |
||
54 | header_package = "Package (probably)" |
||
55 | |||
56 | max_name_len = len(header_name) |
||
57 | max_package_name_len = len(header_package) |
||
9310 | Boppan | 58 | for name, package in not_exists: |
59 | if len(package) > max_package_name_len: |
||
60 | max_package_name_len = len(package) |
||
61 | if len(name) > max_name_len: |
||
62 | max_name_len = len(name) |
||
63 | |||
64 | def draw_row(name, package): |
||
65 | log(f" | {name.ljust(max_name_len)} | {package.ljust(max_package_name_len)} |") |
||
66 | |||
67 | def draw_line(): |
||
68 | log(f" +-{'-' * max_name_len}-+-{'-' * max_package_name_len}-+") |
||
69 | |||
70 | draw_line() |
||
9311 | Boppan | 71 | draw_row(header_name, header_package) |
9310 | Boppan | 72 | draw_line() |
73 | for name, package in not_exists: |
||
74 | draw_row(name, package) |
||
75 | draw_line() |
||
76 | exit() |
||
77 | |||
9313 | Boppan | 78 | if __name__ == "__main__": |
79 | # Check available tools |
||
80 | tools = (("mcopy", "mtools"), |
||
81 | ("qemu-system-i386", "qemu-system-x86"), |
||
82 | ("wget", "wget"), |
||
83 | ("fasm", "fasm")) |
||
84 | check_tools(tools) |
||
85 | |||
86 | # Get IMG |
||
87 | if not os.path.exists("kolibri_test.img"): |
||
88 | if len(sys.argv) == 1: |
||
89 | execute("wget -q --show-progress http://builds.kolibrios.org/eng/data/data/kolibri.img -O kolibri_test.img") |
||
90 | else: |
||
91 | builds_eng = sys.argv[1] |
||
92 | execute(f"cp {builds_eng}/data/data/kolibri.img kolibri_test.img") |
||
93 | |||
94 | # Remove old kernel (may fail if we removed it before so no check here) |
||
95 | os.system("mdel -i kolibri_test.img ::kernel.mnt > /dev/null") |
||
96 | |||
97 | # Check free space after kernel remove |
||
98 | free_clusters = int(subprocess.check_output("mdu -i kolibri_test.img :: -s", shell=True).split()[-1]) |
||
99 | floppy_image_clusters = 2880 |
||
100 | if floppy_image_clusters - free_clusters < 500: |
||
101 | # Remove unuseful files from IMG if lesser than 500 sectors |
||
102 | execute("mdeltree -i kolibri_test.img ::GAMES", mute = True) |
||
103 | execute("mdeltree -i kolibri_test.img ::DEMOS", mute = True) |
||
104 | execute("mdeltree -i kolibri_test.img ::3D", mute = True) |
||
105 | |||
106 | # Get test kernel |
||
107 | if not os.path.exists("kernel.mnt.pretest"): |
||
108 | if len(sys.argv) == 1: |
||
109 | with open("lang.inc", "w") as lang_inc: |
||
110 | lang_inc.write("lang fix en\n") |
||
111 | execute("fasm bootbios.asm bootbios.bin.pretest -dpretest_build=1") |
||
112 | execute("fasm -m 65536 kernel.asm kernel.mnt.pretest -dpretest_build=1 -ddebug_com_base=0xe9") |
||
113 | else: |
||
114 | builds_eng = sys.argv[1] |
||
115 | execute(f"cp {builds_eng}/data/kernel/trunk/kernel.mnt.pretest kernel.mnt.pretest", mute = True) |
||
116 | |||
117 | # Put the kernel into IMG |
||
118 | execute("mcopy -D o -i kolibri_test.img kernel.mnt.pretest ::kernel.mnt", mute = True) |
||
119 | |||
120 | # Collect tests from test folder (not recursively yet) |
||
121 | for test_folder in os.listdir("test"): |
||
122 | test_folder_path = f"test/{test_folder}" |
||
123 | test_file = f"{test_folder_path}/test.py" |
||
124 | |||
125 | if not os.path.isdir(test_folder_path): |
||
126 | continue |
||
127 | |||
128 | if os.path.exists(test_file): |
||
129 | tests.append(test_folder_path) |
||
130 | |||
131 | # Execute each test |
||
132 | test_number = 1 |
||
133 | for test in tests: |
||
134 | test_dir = f"{root_dir}/{test}" |
||
135 | |||
136 | os.chdir(test_dir) |
||
137 | print(f"[{test_number}/{len(tests)}] {test}... ", end = "", flush=True) |
||
138 | start = timeit.default_timer() |
||
139 | try: |
||
140 | SourceFileLoader("test", "test.py").load_module().run() |
||
141 | except common.TestTimeoutException: |
||
142 | result = "TIMEOUT" |
||
143 | except common.TestFailureException: |
||
144 | result = "FAILURE" |
||
145 | else: |
||
146 | result = "SUCCESS" |
||
147 | finish = timeit.default_timer() |
||
148 | print(f"{result} ({finish - start:.2f} seconds)") |
||
149 | os.chdir(root_dir) |
||
150 | |||
151 | test_number += 1> |
||
152 |