| 188 | |
| 189 | |
| 190 | class TestEnvironment: |
| 191 | def __init__(self, runner, name, tmp_dir, timeout): |
| 192 | self.runner = runner |
| 193 | self.tmp_dir = tmp_dir |
| 194 | with open(os.path.join(self.tmp_dir, "storage.cfg"), "w", encoding="utf-8") as f: |
| 195 | f.write(f"""\ |
| 196 | add_path . |
| 197 | add_path {relpath(self.runner.data_dir, tmp_dir)} |
| 198 | """) |
| 199 | self.ddnet = os.path.relpath(runner.ddnet, self.tmp_dir) |
| 200 | self.ddnet_server = os.path.relpath(runner.ddnet_server, self.tmp_dir) |
| 201 | self.ddnet_mastersrv = os.path.relpath(runner.ddnet_mastersrv, self.tmp_dir) if runner.ddnet_mastersrv is not None else None |
| 202 | self.run_prefix_args = [] |
| 203 | if self.runner.valgrind_memcheck: |
| 204 | self.run_prefix_args = [ |
| 205 | "valgrind", |
| 206 | "--tool=memcheck", |
| 207 | "--gen-suppressions=all", |
| 208 | "--suppressions={}".format(relpath(os.path.join(runner.repo_dir, "memcheck.supp"), self.tmp_dir)), |
| 209 | "--track-origins=yes", |
| 210 | ] |
| 211 | self.name = name |
| 212 | self.num_clients = 0 |
| 213 | self.num_servers = 0 |
| 214 | self.num_mastersrvs = 0 |
| 215 | self.processes = [] |
| 216 | self.run_id = uuid4() |
| 217 | self.full_stdouts_stderrs = [] |
| 218 | self.test_timeout_queue = Queue() |
| 219 | run_test_timeout_thread(f"{self.name}_timeout", self, self.test_timeout_queue, TimeoutParam(timeout, f"{self.name} test")) |
| 220 | |
| 221 | def __del__(self): |
| 222 | self.kill_all() |
| 223 | |
| 224 | def register_process(self, process, name, full_stdout, full_stderr): |
| 225 | self.processes.append(process) |
| 226 | self.full_stdouts_stderrs.append((name, full_stdout, full_stderr)) |
| 227 | |
| 228 | def register_events_queue(self, queue): |
| 229 | self.test_timeout_queue.put(queue) |
| 230 | |
| 231 | def server(self, *args, **kwargs): |
| 232 | return Server(self, *args, **kwargs) |
| 233 | |
| 234 | def client(self, *args, **kwargs): |
| 235 | return Client(self, *args, **kwargs) |
| 236 | |
| 237 | def mastersrv(self, *args, **kwargs): |
| 238 | return Mastersrv(self, *args, **kwargs) |
| 239 | |
| 240 | def kill_all(self): |
| 241 | for process in self.processes: |
| 242 | if process.poll() is None: |
| 243 | # print("warning: process hasn't terminated") # TODO |
| 244 | process.kill() |
| 245 | while self.processes: |
| 246 | self.processes.pop().wait() |
| 247 | |