1 from os
import getcwd
, makedirs
2 from logging
import info
3 from shutil
import rmtree
4 from os
.path
import join
, exists
5 from pathlib
import Path
6 from xmlrpc
.server
import SimpleXMLRPCServer
7 from threading
import Thread
8 from collections
import namedtuple
9 from panda3d
.core
import Filename
10 from direct
.gui
.OnscreenText
import OnscreenText
11 from ya2
.build
.build
import _branch
14 class RPCServer(SimpleXMLRPCServer
):
16 def __init__(self
, callbacks
):
17 super().__init
__(('localhost', 7000), allow_none
=True)
18 self
.__callbacks
= callbacks
19 self
.register_introspection_functions()
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')
26 self
.register_function(self
.destroy
, 'destroy')
28 def __screenshot(self
, argument
):
29 # refactor: these methods should not depend on taskMgr
30 # since i can't write unit tests for them
31 taskMgr
.do_method_later(.01, self
.__callbacks
.screenshot
, 'rpc_screenshot', [argument
])
33 def __enforce_result(self
, argument
):
34 taskMgr
.do_method_later(.01, self
.__callbacks
.enforce_result
, 'rpc_enforce_result', [argument
])
37 taskMgr
.do_method_later(.01, self
.__callbacks
.verify
, 'rpc_verify')
39 def __set_index(self
, argument
):
40 taskMgr
.do_method_later(.01, self
.__callbacks
.set_index
, 'rpc_set_index', [argument
])
42 def __enforce_resolution(self
, argument
):
43 taskMgr
.do_method_later(.01, self
.__callbacks
.enforce_resolution
, 'rpc_enforce_resolution', [argument
])
45 def get_position(self
, arg
):
46 return self
.__callbacks
.get_position(arg
)
49 self
._BaseServer
__shutdown
_request
= True
52 class RPCServerThread(Thread
):
54 def __init__(self
, callbacks
):
55 Thread
.__init
__(self
, name
='rpc_server')
56 self
.__callbacks
= callbacks
59 self
.__server
= RPCServer(self
.__callbacks
)
60 self
.__server
.serve_forever()
65 def __init__(self
, creating_references
, position_manager
, app_name
):
66 self
.__creating
_references
= creating_references
67 self
.__position
_manager
= position_manager
68 self
.__app
_name
= app_name
69 Callbacks
= namedtuple('Callbacks', 'screenshot enforce_result verify set_index enforce_resolution get_position')
70 callbacks
= Callbacks(self
.__screenshot
,
71 self
.__enforce
_result
,
74 self
.__enforce
_resolution
,
76 RPCServerThread(callbacks
).start()
77 self
.__debug
_text
= OnscreenText('', fg
=(1, 0, 0, 1), scale
=.16)
78 self
.__debug
_text
.name
= 'test_txt'
80 self
.__file
_names
= []
83 self
.__set
_path
_base
_case
()
84 self
.__set
_path
_wine
()
85 self
.__set
_path
_references
()
87 def __set_path_base_case(self
):
88 self
.__path
= str(Filename().get_user_appdata_directory())
89 self
.__path
+= f
'/{self.__app_name}/'
90 self
.__path
+= f
'tests/functional{"_ref" if self.__creating_references else ""}/'
92 def __set_path_wine(self
):
94 if self
.__path
.startswith('/c/users/') and exists(home
+ '/.wine/'):
95 self
.__path
= home
+ '/.wine/drive_' + self
.__path
[1:]
97 def __set_path_references(self
):
98 if self
.__creating
_references
:
100 Filename().get_user_appdata_directory(),
101 f
'{self.__app_name}/tests/functional_ref_%s/' % _branch())
103 def __set_index(self
, idx
):
104 if int(idx
) == 1: rmtree(self
.__path
, ignore_errors
=True)
105 info(f
'creating dir: {self.__path}')
106 makedirs(self
.__path
, exist_ok
=True)
108 def __get_position(self
, target
):
109 return self
.__position
_manager
[target
]
111 def __screenshot(self
, name
):
112 self
.__file
_names
+= [self
.__path
+ name
]
113 r
= base
.screenshot(self
.__path
+ name
, False)
114 info(f
'screenshot {self.__path + name} ({r}; {getcwd()})')
116 def __enforce_result(self
, result
):
117 info(f
'enforce_result {result}')
118 messenger
.send('enforce_result', [result
])
120 def __enforce_resolution(self
, resolution
):
121 info(f
'enforce resolution {resolution} (callback)')
122 messenger
.send('enforce_resolution', [resolution
])
124 def __verify(self
, task
):
125 for f
in self
.__file
_names
:
126 info(f
'verifying {f}')