ya2 · news · projects · code · about

abstract test positions in world units
[pmachines.git] / ya2 / utils / functional.py
CommitLineData
e65a09cf
FC
1from os import getcwd
2from logging import info
8ee66edd
FC
3from shutil import rmtree
4from os import makedirs
5from os.path import join, exists
158b04a8 6from xmlrpc.server import SimpleXMLRPCServer
361d3942 7from threading import Thread
8ee66edd
FC
8from panda3d.core import Filename
9from direct.gui.OnscreenText import OnscreenText
53ddf3c3 10from ya2.build.build import _branch
8ee66edd
FC
11
12
158b04a8
FC
13class RPCServer(SimpleXMLRPCServer):
14
15 def __init__(self, callbacks):
16 super().__init__(('localhost', 6000), allow_none=True)
17 self._callbacks = callbacks
18 self.register_introspection_functions()
19 self.register_function(self.screenshot, 'screenshot')
20 self.register_function(self.enforce_res, 'enforce_res')
21 self.register_function(self.verify, 'verify')
22 self.register_function(self.set_idx, 'set_idx')
23 self.register_function(self.enforce_resolution, 'enforce_resolution')
2d1773b1 24 self.register_function(self.get_pos, 'get_pos')
158b04a8
FC
25 self.register_function(self.destroy, 'destroy')
26
27 def screenshot(self, arg):
28 taskMgr.doMethodLater(.01, self._callbacks[0], 'cb0', [arg])
29
30 def enforce_res(self, arg):
31 taskMgr.doMethodLater(.01, self._callbacks[1], 'cb1', [arg])
32
33 def verify(self):
34 taskMgr.doMethodLater(.01, self._callbacks[2], 'cb2')
35
36 def set_idx(self, arg):
37 taskMgr.doMethodLater(.01, self._callbacks[3], 'cb3', [arg])
38
39 def enforce_resolution(self, arg):
40 taskMgr.doMethodLater(.01, self._callbacks[4], 'cb4', [arg])
41
2d1773b1
FC
42 def get_pos(self, arg):
43 return self._callbacks[5](arg)
44
158b04a8
FC
45 def destroy(self):
46 self._BaseServer__shutdown_request = True
47
48
49class RPCServerThread(Thread):
361d3942
FC
50
51 def __init__(self, callbacks):
067a36db 52 Thread.__init__(self, name='rpc_server')
361d3942
FC
53 self._callbacks = callbacks
54
55 def run(self):
158b04a8
FC
56 self.server = RPCServer(self._callbacks)
57 self.server.serve_forever()
8ee66edd 58
8ee66edd 59
aed9737a 60class FunctionalTest:
361d3942 61
2d1773b1 62 def __init__(self, ref, pos_mgr):
8ee66edd 63 super().__init__()
2d1773b1 64 self._pos_mgr = pos_mgr
e65a09cf
FC
65 RPCServerThread([self._do_screenshot, self._do_enforce_res,
66 self.__verify, self._set_idx,
67 self._do_enforce_resolution, self.__get_pos]).start()
8ee66edd 68 self.txt = OnscreenText('', fg=(1, 0, 0, 1), scale=.16)
067a36db 69 self.txt.name = 'test_txt'
e65a09cf
FC
70 # self._path = ''
71 # if self.eng.is_appimage:
8ee66edd 72 self._path = str(Filename().get_user_appdata_directory())
edeef6f9 73 self._path += '/pmachines/'
8ee66edd
FC
74 self._path += 'tests/functional%s/' % ('_ref' if ref else '')
75 home = '/home/flavio' # we must force this for wine
e65a09cf
FC
76 # if self._path.startswith('/c/users/') and exists(str(Path.home()) +
77 # '/.local/share/flatpak-wine601/default/'):
78 # self._path = str(Path.home()) +
79 # '/.local/share/flatpak-wine601/default/drive_' + self._path[1:]
8ee66edd
FC
80 if self._path.startswith('/c/users/') and exists(home + '/.wine/'):
81 self._path = home + '/.wine/drive_' + self._path[1:]
82 if ref:
83 self._path = join(
84 Filename().get_user_appdata_directory(),
edeef6f9 85 'pmachines/tests/functional_ref_%s/' % _branch())
8ee66edd 86 self._fnames = []
e65a09cf
FC
87 # taskMgr.add(self.on_frame_unpausable, 'on-frame-unpausable')
88 # self._do_screenshots(idx)
8ee66edd 89
6d722600
FC
90 def _set_idx(self, idx):
91 if int(idx) == 1:
92 rmtree(self._path, ignore_errors=True)
93 info('creating dir: %s' % self._path)
94 makedirs(self._path, exist_ok=True)
95
2d1773b1
FC
96 def __get_pos(self, tgt):
97 return self._pos_mgr.get(tgt)
98
361d3942
FC
99 def _do_screenshot(self, name):
100 self._fnames += [self._path + name]
e65a09cf
FC
101 # time = datetime.datetime.now().strftime('%y%m%d%H%M%S')
102 # res = base.win.save_screenshot(
103 # Filename(path or ("yocto%s.png" % time)))
104 # debug('screenshot %s (%s)' % (path or ("yocto%s.png" % time), res))
361d3942
FC
105 res = base.screenshot(self._path + name, False)
106 info('screenshot %s (%s; %s)' % (self._path + name, res, getcwd()))
edeef6f9 107
361d3942
FC
108 def _do_enforce_res(self, res):
109 info('enforce_res %s' % res)
110 messenger.send('enforce_res', [res])
edeef6f9 111
74ed9732
FC
112 def _do_enforce_resolution(self, res):
113 info('enforce resolution %s (callback)' % res)
114 messenger.send('enforce_resolution', [res])
115
361d3942 116 def __verify(self, task):
e65a09cf 117 # files = glob(self._path + '*')
361d3942
FC
118 for fname in self._fnames:
119 info('verifying %s' % fname)
120 assert exists(fname)