Commit | Line | Data |
---|---|---|
d68aeda7 | 1 | from os import getcwd, makedirs |
e65a09cf | 2 | from logging import info |
8ee66edd | 3 | from shutil import rmtree |
8ee66edd | 4 | from os.path import join, exists |
d68aeda7 | 5 | from pathlib import Path |
158b04a8 | 6 | from xmlrpc.server import SimpleXMLRPCServer |
361d3942 | 7 | from threading import Thread |
d68aeda7 | 8 | from collections import namedtuple |
8ee66edd FC |
9 | from panda3d.core import Filename |
10 | from direct.gui.OnscreenText import OnscreenText | |
53ddf3c3 | 11 | from ya2.build.build import _branch |
8ee66edd FC |
12 | |
13 | ||
158b04a8 FC |
14 | class RPCServer(SimpleXMLRPCServer): |
15 | ||
16 | def __init__(self, callbacks): | |
a33967c7 | 17 | super().__init__(('localhost', 7000), allow_none=True) |
d68aeda7 | 18 | self.__callbacks = callbacks |
158b04a8 | 19 | self.register_introspection_functions() |
d68aeda7 FC |
20 | self.register_function(self.__screenshot, 'screenshot') |
21 | self.register_function(self.__enforce_result, 'enforce_result') | |
22 | self.register_function(self.__verify, 'verify') | |
23 | self.register_function(self.__set_index, 'set_index') | |
24 | self.register_function(self.__enforce_resolution, 'enforce_resolution') | |
25 | self.register_function(self.get_position, 'get_position') | |
158b04a8 FC |
26 | self.register_function(self.destroy, 'destroy') |
27 | ||
d68aeda7 FC |
28 | def __screenshot(self, argument): |
29 | # refactor: these methods should not depend on taskMgr | |
30 | # since i can't write unit tests for them | |
2dec6110 | 31 | info(f'RPCServer::__screnshot {argument}') |
d68aeda7 | 32 | taskMgr.do_method_later(.01, self.__callbacks.screenshot, 'rpc_screenshot', [argument]) |
158b04a8 | 33 | |
d68aeda7 | 34 | def __enforce_result(self, argument): |
2dec6110 | 35 | info(f'RPCServer::__enforce_result {argument}') |
d68aeda7 | 36 | taskMgr.do_method_later(.01, self.__callbacks.enforce_result, 'rpc_enforce_result', [argument]) |
158b04a8 | 37 | |
d68aeda7 | 38 | def __verify(self): |
2dec6110 | 39 | info(f'RPCServer::__verify') |
d68aeda7 | 40 | taskMgr.do_method_later(.01, self.__callbacks.verify, 'rpc_verify') |
158b04a8 | 41 | |
d68aeda7 | 42 | def __set_index(self, argument): |
2dec6110 | 43 | info(f'RPCServer::__set_index {argument}') |
d68aeda7 | 44 | taskMgr.do_method_later(.01, self.__callbacks.set_index, 'rpc_set_index', [argument]) |
158b04a8 | 45 | |
d68aeda7 | 46 | def __enforce_resolution(self, argument): |
2dec6110 | 47 | info(f'RPCServer::__enforce_resolution {argument}') |
d68aeda7 | 48 | taskMgr.do_method_later(.01, self.__callbacks.enforce_resolution, 'rpc_enforce_resolution', [argument]) |
158b04a8 | 49 | |
d68aeda7 | 50 | def get_position(self, arg): |
2dec6110 | 51 | info(f'RPCServer::get_position {arg}') |
d68aeda7 | 52 | return self.__callbacks.get_position(arg) |
2d1773b1 | 53 | |
158b04a8 | 54 | def destroy(self): |
2dec6110 | 55 | info('RPCServer::destroy') |
158b04a8 FC |
56 | self._BaseServer__shutdown_request = True |
57 | ||
58 | ||
59 | class RPCServerThread(Thread): | |
361d3942 FC |
60 | |
61 | def __init__(self, callbacks): | |
067a36db | 62 | Thread.__init__(self, name='rpc_server') |
d68aeda7 | 63 | self.__callbacks = callbacks |
361d3942 FC |
64 | |
65 | def run(self): | |
d68aeda7 FC |
66 | self.__server = RPCServer(self.__callbacks) |
67 | self.__server.serve_forever() | |
8ee66edd | 68 | |
8ee66edd | 69 | |
aed9737a | 70 | class FunctionalTest: |
361d3942 | 71 | |
d68aeda7 FC |
72 | def __init__(self, creating_references, position_manager, app_name): |
73 | self.__creating_references = creating_references | |
74 | self.__position_manager = position_manager | |
75 | self.__app_name = app_name | |
76 | Callbacks = namedtuple('Callbacks', 'screenshot enforce_result verify set_index enforce_resolution get_position') | |
77 | callbacks = Callbacks(self.__screenshot, | |
78 | self.__enforce_result, | |
79 | self.__verify, | |
80 | self.__set_index, | |
81 | self.__enforce_resolution, | |
82 | self.__get_position) | |
83 | RPCServerThread(callbacks).start() | |
84 | self.__debug_text = OnscreenText('', fg=(1, 0, 0, 1), scale=.16) | |
85 | self.__debug_text.name = 'test_txt' | |
86 | self.__set_path() | |
87 | self.__file_names = [] | |
88 | ||
89 | def __set_path(self): | |
90 | self.__set_path_base_case() | |
91 | self.__set_path_wine() | |
92 | self.__set_path_references() | |
93 | ||
94 | def __set_path_base_case(self): | |
95 | self.__path = str(Filename().get_user_appdata_directory()) | |
96 | self.__path += f'/{self.__app_name}/' | |
97 | self.__path += f'tests/functional{"_ref" if self.__creating_references else ""}/' | |
98 | ||
99 | def __set_path_wine(self): | |
0c36d0bf | 100 | home = str(Path.home()) |
80042030 FC |
101 | p = self.__path[1] + ':' + self.__path[2:].replace('/', '\\') |
102 | info(f"__set_path_wine: {self.__path} {home} {p}") | |
103 | #if self.__path.startswith('/c/users/') and exists(home + '/.wine/'): | |
104 | # self.__path = home + '/.wine/drive_' + self.__path[1:] | |
105 | if self.__path.startswith('/c/users/'): | |
106 | self.__path = p | |
d68aeda7 FC |
107 | |
108 | def __set_path_references(self): | |
109 | if self.__creating_references: | |
110 | self.__path = join( | |
8ee66edd | 111 | Filename().get_user_appdata_directory(), |
d68aeda7 FC |
112 | f'{self.__app_name}/tests/functional_ref_%s/' % _branch()) |
113 | ||
114 | def __set_index(self, idx): | |
115 | if int(idx) == 1: rmtree(self.__path, ignore_errors=True) | |
116 | info(f'creating dir: {self.__path}') | |
117 | makedirs(self.__path, exist_ok=True) | |
118 | ||
119 | def __get_position(self, target): | |
2dec6110 FC |
120 | info(f'FunctionalTest::__get_position {target}') |
121 | if target not in self.__position_manager or not target: | |
122 | info(f'{self.__position_manager=}') | |
63d69e94 | 123 | return self.__position_manager[target] |
d68aeda7 FC |
124 | |
125 | def __screenshot(self, name): | |
d68aeda7 FC |
126 | self.__file_names += [self.__path + name] |
127 | r = base.screenshot(self.__path + name, False) | |
128 | info(f'screenshot {self.__path + name} ({r}; {getcwd()})') | |
129 | ||
130 | def __enforce_result(self, result): | |
131 | info(f'enforce_result {result}') | |
132 | messenger.send('enforce_result', [result]) | |
133 | ||
134 | def __enforce_resolution(self, resolution): | |
135 | info(f'enforce resolution {resolution} (callback)') | |
136 | messenger.send('enforce_resolution', [resolution]) | |
74ed9732 | 137 | |
361d3942 | 138 | def __verify(self, task): |
d68aeda7 FC |
139 | for f in self.__file_names: |
140 | info(f'verifying {f}') | |
141 | assert exists(f) |