ya2 · news · projects · code · about

09523b5127a22ebec47268d1e8e3354e28024bb1
[pmachines.git] / tests / test_functional.py
1 from pathlib import Path
2 from datetime import datetime
3 from itertools import product
4 from logging import info
5 import sys
6 if '' in sys.path: sys.path.remove('')
7 sys.path.append(str(Path(__file__).parent.parent.parent))
8 from unittest import TestCase
9 from shutil import rmtree, copy
10 from time import sleep
11 from os import system, remove, environ
12 from os.path import exists, basename, join
13 from glob import glob
14 from panda3d.core import Filename
15 from lib.build.build import exec_cmd, _branch, ver
16
17
18 class FunctionalTests(TestCase):
19
20 def __clean(self):
21 paths = [
22 'tests/functional',
23 str(Path.home()) + '/.local/share/pmachines/tests/functional/',
24 str(Path.home()) + '/.var/app/it.ya2.Pmachines/data/pmachines/tests/functional/',
25 str(Path.home()) + '/.wine/drive_c/users/flavio/AppData/Local/pmachines/tests/functional/']
26 for path in paths:
27 rmtree(path, ignore_errors=True)
28 dirs = [
29 Filename().get_user_appdata_directory(),
30 '/home/flavio/.var/app/it.ya2.Pmachines/data',
31 '/home/flavio/.wine/drive_c/users/flavio/AppData']
32 files = [
33 'pmachines/options.ini',
34 'pmachines/obs_version.txt']
35 for dir_file in product(dirs, files):
36 _file = join(*dir_file)
37 if exists(_file):
38 remove(_file)
39 info('%s removed' % _file)
40 else:
41 info('%s does not exist' % _file)
42 system('pkill -f "pmachines.exe"')
43
44 def __awake(self):
45 system('xdotool key shift')
46
47 def setUp(self):
48 self.__clean()
49
50 def tearDown(self):
51 pass # self.__clean()
52
53 def test_ref(self):
54 info('test_ref')
55 path = 'pmachines/tests/functional_ref_%s/*.png' % _branch()
56 files = glob(join(Filename().get_user_appdata_directory(), path))
57 self.assertGreater(len(files), 1)
58
59 def __similar_images(self, ref_img, tst_img):
60 cmd = 'magick compare -metric NCC %s %s diff.png' % (ref_img, tst_img)
61 res = exec_cmd(cmd)
62 if exists('diff.png'): remove('diff.png')
63 print('compare %s %s: %s' % (ref_img, tst_img, res))
64 return float(res) > .8
65
66 def __test_template(self, cmd, path):
67 if environ.get('FUNCTIONAL') != '1':
68 self.skipTest('skipped functional tests')
69 self.__clean()
70 self.__awake()
71 system('amixer sset Master 0%')
72 ret = system(cmd)
73 self.assertEqual(ret, 0, 'error while executing ' + cmd)
74 files = glob(str(Path.home()) + '/.local/share/pmachines/tests/functional_ref_%s/*.png' % _branch())
75 self.assertGreater(len(files), 1)
76 for fname in files:
77 self.assertTrue(exists(path + basename(fname)), '%s does not exist' % (path + basename(fname)))
78 similar = self.__similar_images(
79 str(Path.home()) + '/.local/share/pmachines/tests/functional_ref_%s/' % _branch() + basename(fname),
80 path + basename(fname)),
81 'error while comparing %s and %s' % (
82 str(Path.home()) + '/.local/share/pmachines/tests/functional_ref_%s/' % _branch() + basename(fname),
83 path + basename(fname))
84 if not similar:
85 timestamp = datetime.now().strftime('%y%m%d%H%M%S%f')
86 copy(path + basename(fname), '~/Desktop/' + basename(fname)[:-4] + timestamp + '.png')
87 self.assertTrue(similar)
88
89 def test_code(self):
90 info('test_code')
91 self.__test_template(
92 'timeout 720s ~/venv/bin/python main.py --functional-test 1 ; '
93 'timeout 720s ~/venv/bin/python main.py --functional-test 2',
94 str(Path.home()) + '/.local/share/pmachines/tests/functional/')
95
96 def test_appimage(self):
97 info('test_appimage')
98 bld_branch = {'master': 'alpha', 'rc': 'rc', 'stable': 'stable'}[_branch()]
99 bld_branch = '' if bld_branch == 'stable' else ('-' + bld_branch)
100 self.__test_template(
101 'timeout 720s ./dist/Pmachines%s-x86_64.AppImage --functional-test 1 ;'
102 'timeout 720s ./dist/Pmachines%s-x86_64.AppImage --functional-test 2' % (bld_branch, bld_branch),
103 str(Path.home()) + '/.local/share/pmachines/tests/functional/')
104
105 def test_flatpak(self):
106 info('test_flatpak')
107 if environ.get('FUNCTIONALPOST') != '1':
108 self.skipTest('skipped functional-post tests')
109 bld_branch = {'master': 'alpha', 'rc': 'rc', 'stable': 'stable'}[_branch()]
110 cmd = 'flatpak update -y it.ya2.Pmachines//%s' % bld_branch
111 info('executing: %s' % cmd)
112 system(cmd)
113 info('executed: %s' % cmd)
114 self.__test_template(
115 'timeout 720s flatpak run it.ya2.Pmachines//%s --functional-test 1 ;'
116 'timeout 720s flatpak run it.ya2.Pmachines//%s --functional-test 2' % (bld_branch, bld_branch),
117 str(Path.home()) + '/.var/app/it.ya2.Pmachines/data/pmachines/tests/functional/')
118
119 # def __update_itchio(self):
120 # system('/home/flavio/.itch/itch')
121 # sleep(5)
122 # system('xdotool mousemove 860 620')
123 # sleep(1)
124 # system('xdotool click 1')
125 # sleep(300)
126 # system('killall itch')
127
128 # def test_itchio(self):
129 # info('test_itchio')
130 # if environ.get('FUNCTIONALPOST') != '1':
131 # self.skipTest('skipped functional-post tests')
132 # if _branch() != 'master':
133 # return
134 # self.__update_itchio()
135 # self.__test_template(
136 # 'timeout 720s /home/flavio/.config/itch/apps/pmachines/pmachines --functional-test 1 ;'
137 # 'timeout 720s /home/flavio/.config/itch/apps/pmachines/pmachines --functional-test 2',
138 # str(Path.home()) + '/.local/share/pmachines/tests/functional/')
139
140 # def test_windows(self):
141 # info('test_windows')
142 # system('pkill -f "pmachines.exe"')
143 # abspath = str(Path(__file__).parent.parent) + '/build/win_amd64/pmachines.exe'
144 # self.__test_template(
145 # 'timeout 720s wine %s --functional-test 1 ; '
146 # 'timeout 720s wine %s --functional-test 2' % (abspath, abspath),
147 # str(Path.home()) + '/.wine/drive_c/users/flavio/AppData/Local/pmachines/tests/functional/')
148
149 def test_versions(self):
150 info('test_versions')
151 if environ.get('FUNCTIONAL') != '1':
152 self.skipTest('skipped functional tests')
153 bld_branch = {'master': 'alpha', 'rc': 'rc', 'stable': 'stable'}[_branch()]
154 with open('/home/flavio/builders/pmachines_builder/last_bld.txt') as f:
155 lines = f.readlines()
156 for line in lines:
157 if line.strip().split()[0] == _branch():
158 commit = line.strip().split()[1][:7]
159 _ver = ver
160 if _branch() == 'stable':
161 with open('/home/flavio/builders/pmachines_builder/pmachines/assets/version.txt') as fver:
162 _ver = fver.read().strip() + '-'
163 exp = '%s-%s' % (_ver, commit)
164 cmds = [
165 ('timeout 720s ./build/manylinux2010_x86_64/pmachines --version', str(Filename.get_user_appdata_directory()) + '/pmachines/obs_version.txt'),
166 ('timeout 720s ./dist/Pmachines-%s-x86_64.AppImage --version' % bld_branch, str(Filename.get_user_appdata_directory()) + '/pmachines/obs_version.txt'),
167 #('timeout 720s wine ./build/win_amd64/pmachines.exe --version', '/home/flavio/.wine/drive_c/users/flavio/AppData/Local/pmachines/obs_version.txt')
168 ]
169 #if environ.get('FUNCTIONALPOST') == '1':
170 # if _branch() == 'master':
171 # self.__update_itchio()
172 # cmds += [('timeout 720s /home/flavio/.config/itch/apps/pmachines/pmachines --version', str(Filename.get_user_appdata_directory()) + '/pmachines/obs_version.txt')]
173 # cmds += [('timeout 720s flatpak run it.ya2.Pmachines//%s --version' % bld_branch, '/home/flavio/.var/app/it.ya2.Pmachines/data/pmachines/obs_version.txt')]
174 system('flatpak update -y it.ya2.Pmachines//%s' % bld_branch)
175 for cmd in cmds:
176 if exists(cmd[1]):
177 remove(cmd[1])
178 info('launching %s' % cmd[0])
179 exec_cmd(cmd[0])
180 with open(cmd[1]) as f:
181 obs = f.read().strip()
182 self.assertEqual(obs, exp, 'during ' + cmd[0])