-
Notifications
You must be signed in to change notification settings - Fork 251
Expand file tree
/
Copy pathrun_tests.py
More file actions
136 lines (110 loc) · 4.1 KB
/
run_tests.py
File metadata and controls
136 lines (110 loc) · 4.1 KB
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import shlex
import sys
from time import sleep
from subprocess import Popen, PIPE, TimeoutExpired
from typing import Optional
import os
import argparse
tests_list = [
# "test_arbitrator",
"test_annotations",
"test_arrays",
"test_binary",
"test_builtin",
"test_const",
# "test_callbacks",
"test_enums",
"test_lists",
"test_struct",
"test_typedef",
# "test_unions"
]
PYTHON_TESTS_PATH = r"..\python_impl_tests"
def to_pascal_case(text: str, separator: str = "_") -> str:
return "".join([i.capitalize() for i in text.split("_")])
def python_server_test_cmd(test_name: str) -> list[str]:
return shlex.split(
f"pytest {test_name}/{test_name}.py --server"
)
class Runner:
def __init__(self, server: str, client: str, port: int = 12345, mvn: str = "mvn", host="localhost"):
self.port = port
self.host = host
self.mvn = mvn
if server == "java":
self.server = self.java_server
elif server == "py":
self.server = self.python_server
else:
raise AttributeError
if client == "java":
self.client = self.java_client
elif client == "py":
self.client = self.python_client
else:
raise AttributeError
def execute_test(self, test_name: str):
print("=================================")
print(f"Running test case: {test_case}")
print("=================================")
server = self.server(test_name)
sleep(1)
client = self.client(test_name)
try:
print("============ SERVER =============")
stdout, stderr = server.communicate(timeout=10)
except TimeoutExpired:
print("ERROR: TIMEOUT")
server.kill()
stdout, stderr = server.communicate()
print(stdout.decode(errors="ignore"))
print(stderr.decode())
print("=================================")
try:
print("============ CLIENT =============")
stdout, stderr = client.communicate(timeout=10)
except TimeoutExpired:
print("ERROR: TIMEOUT")
client.kill()
stdout, stderr = client.communicate()
print(stdout.decode(errors="ignore"))
print(stderr.decode())
def java_client(self, test_name: str):
return Popen(
f"{self.mvn} test -Dtest={to_pascal_case(test_name)} -Dclient "
f"-Dport={self.port} -Dhost={self.host}",
stdout=PIPE, stderr=PIPE
)
def java_server(self, test_name: str):
return Popen(
f"{self.mvn} test -Dtest={to_pascal_case(test_name)}Server -Dserver "
f"-Dport={self.port} -Dhost={self.host}",
stdout=PIPE, stderr=PIPE
)
def python_client(self, test_name: str):
return Popen(
f"pytest {test_name}/{test_name}.py --client --port {self.port} --host {self.host}",
cwd=PYTHON_TESTS_PATH,
stdout=PIPE, stderr=PIPE
)
def python_server(self, test_name: str):
return Popen(
f"pytest {test_name}/{test_name}.py --server --port {self.port} --host {self.host}",
cwd=PYTHON_TESTS_PATH,
stdout=PIPE, stderr=PIPE
)
if __name__ == '__main__':
parser = argparse.ArgumentParser(
formatter_class=argparse.RawDescriptionHelpFormatter,
description="Run Java and Python tests.")
# Options
parser.add_argument("-s", "--server", default="java", choices=["java", "py"],
help="Select server side implementation: java or py")
parser.add_argument("-c", "--client", default="java", choices=["java", "py"],
help="Select client side implementation: java or py")
parser.add_argument("-m", "--maven", default="mvn", help="Path to Maven executable")
parser.add_argument("-p", "--port", default=12345, type=int, help="Port")
args = parser.parse_args()
runner = Runner(args.server, args.client, args.port, args.maven)
for test_case in tests_list:
runner.execute_test(test_case)