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