diff options
author | Mariano Lopez <mariano.lopez@linux.intel.com> | 2017-01-03 08:18:00 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-01-23 12:05:20 +0000 |
commit | 41e4db0eeaaa19f9f4d425960011b02c29f01c1c (patch) | |
tree | 8b11c1910f5fc94796ad02f7c8e2f2c856061957 /meta | |
parent | b569aa0e0056a97b29577f5bda611ef3dd539db3 (diff) | |
download | poky-41e4db0eeaaa19f9f4d425960011b02c29f01c1c.tar.gz |
runtime/cases/smart.py: Migrate smart tests
This migrates the smart test from the old framework to
the new one. This has its own commit because smart
test was using bb and oe libraries that are available
when exporting the test cases to run in a different host.
Because of the removal of bb and oe libraries index and
packages feeds creation will be managed in testimage bbclass.
[YOCTO #10234]
(From OE-Core rev: 8d64ac4208e8dcb8a6fde6ea2959c9b3edfe2172)
Signed-off-by: Mariano Lopez <mariano.lopez@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
-rw-r--r-- | meta/classes/testimage.bbclass | 53 | ||||
-rw-r--r-- | meta/lib/oeqa/runtime/cases/smart.py | 172 |
2 files changed, 128 insertions, 97 deletions
diff --git a/meta/classes/testimage.bbclass b/meta/classes/testimage.bbclass index 016c1c136a..abcecca472 100644 --- a/meta/classes/testimage.bbclass +++ b/meta/classes/testimage.bbclass | |||
@@ -116,6 +116,10 @@ python do_testimage() { | |||
116 | 116 | ||
117 | testimage_sanity(d) | 117 | testimage_sanity(d) |
118 | 118 | ||
119 | if (d.getVar('IMAGE_PKGTYPE') == 'rpm' | ||
120 | and 'smart' in d.getVar('TEST_SUITES')): | ||
121 | create_rpm_index(d) | ||
122 | |||
119 | testimage_main(d) | 123 | testimage_main(d) |
120 | } | 124 | } |
121 | 125 | ||
@@ -284,6 +288,55 @@ def get_runtime_paths(d): | |||
284 | paths.append(path) | 288 | paths.append(path) |
285 | return paths | 289 | return paths |
286 | 290 | ||
291 | def create_index(arg): | ||
292 | import subprocess | ||
293 | |||
294 | index_cmd = arg | ||
295 | try: | ||
296 | bb.note("Executing '%s' ..." % index_cmd) | ||
297 | result = subprocess.check_output(index_cmd, | ||
298 | stderr=subprocess.STDOUT, | ||
299 | shell=True) | ||
300 | result = result.decode('utf-8') | ||
301 | except subprocess.CalledProcessError as e: | ||
302 | return("Index creation command '%s' failed with return code " | ||
303 | '%d:\n%s' % (e.cmd, e.returncode, e.output.decode("utf-8"))) | ||
304 | if result: | ||
305 | bb.note(result) | ||
306 | return None | ||
307 | |||
308 | def create_rpm_index(d): | ||
309 | # Index RPMs | ||
310 | rpm_createrepo = bb.utils.which(os.getenv('PATH'), "createrepo") | ||
311 | index_cmds = [] | ||
312 | archs = (d.getVar('ALL_MULTILIB_PACKAGE_ARCHS') or '').replace('-', '_') | ||
313 | |||
314 | for arch in archs.split(): | ||
315 | rpm_dir = os.path.join(d.getVar('DEPLOY_DIR_RPM'), arch) | ||
316 | idx_path = os.path.join(d.getVar('WORKDIR'), 'rpm', arch) | ||
317 | db_path = os.path.join(d.getVar('WORKDIR'), 'rpmdb', arch) | ||
318 | |||
319 | if not os.path.isdir(rpm_dir): | ||
320 | continue | ||
321 | if os.path.exists(db_path): | ||
322 | bb.utils.remove(dbpath, True) | ||
323 | |||
324 | lockfilename = os.path.join(d.getVar('DEPLOY_DIR_RPM'), 'rpm.lock') | ||
325 | lf = bb.utils.lockfile(lockfilename, False) | ||
326 | oe.path.copyhardlinktree(rpm_dir, idx_path) | ||
327 | # Full indexes overload a 256MB image so reduce the number of rpms | ||
328 | # in the feed. Filter to p* since we use the psplash packages and | ||
329 | # this leaves some allarch and machine arch packages too. | ||
330 | bb.utils.remove(idx_path + "*/[a-oq-z]*.rpm") | ||
331 | bb.utils.unlockfile(lf) | ||
332 | cmd = '%s --dbpath %s --update -q %s' % (rpm_createrepo, | ||
333 | db_path, idx_path) | ||
334 | |||
335 | # Create repodata | ||
336 | result = create_index(cmd) | ||
337 | if result: | ||
338 | bb.fatal('%s' % ('\n'.join(result))) | ||
339 | |||
287 | def test_create_extract_dirs(d): | 340 | def test_create_extract_dirs(d): |
288 | install_path = d.getVar("TEST_INSTALL_TMP_DIR") | 341 | install_path = d.getVar("TEST_INSTALL_TMP_DIR") |
289 | package_path = d.getVar("TEST_PACKAGED_DIR") | 342 | package_path = d.getVar("TEST_PACKAGED_DIR") |
diff --git a/meta/lib/oeqa/runtime/cases/smart.py b/meta/lib/oeqa/runtime/cases/smart.py index dde1c4d792..9b4d0d2c60 100644 --- a/meta/lib/oeqa/runtime/cases/smart.py +++ b/meta/lib/oeqa/runtime/cases/smart.py | |||
@@ -1,166 +1,142 @@ | |||
1 | import unittest | 1 | import os |
2 | import re | 2 | import re |
3 | import oe | ||
4 | import subprocess | 3 | import subprocess |
5 | from oeqa.oetest import oeRuntimeTest, skipModule | ||
6 | from oeqa.utils.decorators import * | ||
7 | from oeqa.utils.httpserver import HTTPService | 4 | from oeqa.utils.httpserver import HTTPService |
8 | 5 | ||
9 | def setUpModule(): | 6 | from oeqa.runtime.case import OERuntimeTestCase |
10 | if not oeRuntimeTest.hasFeature("package-management"): | 7 | from oeqa.core.decorator.depends import OETestDepends |
11 | skipModule("Image doesn't have package management feature") | 8 | from oeqa.core.decorator.oeid import OETestID |
12 | if not oeRuntimeTest.hasPackage("smartpm"): | 9 | from oeqa.core.decorator.data import skipIfNotDataVar, skipIfNotFeature |
13 | skipModule("Image doesn't have smart installed") | 10 | from oeqa.runtime.decorator.package import OEHasPackage |
14 | if "package_rpm" != oeRuntimeTest.tc.d.getVar("PACKAGE_CLASSES").split()[0]: | ||
15 | skipModule("Rpm is not the primary package manager") | ||
16 | 11 | ||
17 | class SmartTest(oeRuntimeTest): | 12 | class SmartTest(OERuntimeTestCase): |
18 | 13 | ||
19 | @skipUnlessPassed('test_smart_help') | ||
20 | def smart(self, command, expected = 0): | 14 | def smart(self, command, expected = 0): |
21 | command = 'smart %s' % command | 15 | command = 'smart %s' % command |
22 | status, output = self.target.run(command, 1500) | 16 | status, output = self.target.run(command, 1500) |
23 | message = os.linesep.join([command, output]) | 17 | message = os.linesep.join([command, output]) |
24 | self.assertEqual(status, expected, message) | 18 | self.assertEqual(status, expected, message) |
25 | self.assertFalse("Cannot allocate memory" in output, message) | 19 | self.assertFalse('Cannot allocate memory' in output, message) |
26 | return output | 20 | return output |
27 | 21 | ||
28 | class SmartBasicTest(SmartTest): | 22 | class SmartBasicTest(SmartTest): |
29 | 23 | ||
30 | @testcase(716) | 24 | @skipIfNotFeature('package-management', |
31 | @skipUnlessPassed('test_ssh') | 25 | 'Test requires package-management to be in IMAGE_FEATURES') |
26 | @skipIfNotDataVar('PACKAGE_CLASSES', 'package_rpm', | ||
27 | 'RPM is not the primary package manager') | ||
28 | @OEHasPackage(['smartpm']) | ||
29 | @OETestID(716) | ||
30 | @OETestDepends(['ssh.SSHTest.test_ssh']) | ||
32 | def test_smart_help(self): | 31 | def test_smart_help(self): |
33 | self.smart('--help') | 32 | self.smart('--help') |
34 | 33 | ||
35 | @testcase(968) | 34 | @OETestID(968) |
35 | @OETestDepends(['smart.SmartBasicTest.test_smart_help']) | ||
36 | def test_smart_version(self): | 36 | def test_smart_version(self): |
37 | self.smart('--version') | 37 | self.smart('--version') |
38 | 38 | ||
39 | @testcase(721) | 39 | @OETestID(721) |
40 | @OETestDepends(['smart.SmartBasicTest.test_smart_help']) | ||
40 | def test_smart_info(self): | 41 | def test_smart_info(self): |
41 | self.smart('info python-smartpm') | 42 | self.smart('info python-smartpm') |
42 | 43 | ||
43 | @testcase(421) | 44 | @OETestID(421) |
45 | @OETestDepends(['smart.SmartBasicTest.test_smart_help']) | ||
44 | def test_smart_query(self): | 46 | def test_smart_query(self): |
45 | self.smart('query python-smartpm') | 47 | self.smart('query python-smartpm') |
46 | 48 | ||
47 | @testcase(720) | 49 | @OETestID(720) |
50 | @OETestDepends(['smart.SmartBasicTest.test_smart_help']) | ||
48 | def test_smart_search(self): | 51 | def test_smart_search(self): |
49 | self.smart('search python-smartpm') | 52 | self.smart('search python-smartpm') |
50 | 53 | ||
51 | @testcase(722) | 54 | @OETestID(722) |
55 | @OETestDepends(['smart.SmartBasicTest.test_smart_help']) | ||
52 | def test_smart_stats(self): | 56 | def test_smart_stats(self): |
53 | self.smart('stats') | 57 | self.smart('stats') |
54 | 58 | ||
55 | class SmartRepoTest(SmartTest): | 59 | class SmartRepoTest(SmartTest): |
56 | 60 | ||
57 | @classmethod | 61 | @classmethod |
58 | def create_index(self, arg): | 62 | def setUpClass(cls): |
59 | index_cmd = arg | 63 | cls.repolist = [] |
60 | try: | 64 | cls.repo_server = HTTPService(cls.tc.td['WORKDIR'], |
61 | bb.note("Executing '%s' ..." % index_cmd) | 65 | cls.tc.target.server_ip) |
62 | result = subprocess.check_output(index_cmd, stderr=subprocess.STDOUT, shell=True).decode("utf-8") | 66 | cls.repo_server.start() |
63 | except subprocess.CalledProcessError as e: | ||
64 | return("Index creation command '%s' failed with return code %d:\n%s" % | ||
65 | (e.cmd, e.returncode, e.output.decode("utf-8"))) | ||
66 | if result: | ||
67 | bb.note(result) | ||
68 | return None | ||
69 | 67 | ||
70 | @classmethod | 68 | @classmethod |
71 | def setUpClass(self): | 69 | def tearDownClass(cls): |
72 | self.repolist = [] | 70 | cls.repo_server.stop() |
73 | 71 | for repo in cls.repolist: | |
74 | # Index RPMs | 72 | cls.tc.target.run('smart channel -y --remove %s' % repo) |
75 | rpm_createrepo = bb.utils.which(os.getenv('PATH'), "createrepo") | ||
76 | index_cmds = [] | ||
77 | rpm_dirs_found = False | ||
78 | archs = (oeRuntimeTest.tc.d.getVar('ALL_MULTILIB_PACKAGE_ARCHS') or "").replace('-', '_').split() | ||
79 | for arch in archs: | ||
80 | rpm_dir = os.path.join(oeRuntimeTest.tc.d.getVar('DEPLOY_DIR_RPM'), arch) | ||
81 | idx_path = os.path.join(oeRuntimeTest.tc.d.getVar('WORKDIR'), 'rpm', arch) | ||
82 | db_path = os.path.join(oeRuntimeTest.tc.d.getVar('WORKDIR'), 'rpmdb', arch) | ||
83 | if not os.path.isdir(rpm_dir): | ||
84 | continue | ||
85 | if os.path.exists(db_path): | ||
86 | bb.utils.remove(dbpath, True) | ||
87 | lockfilename = oeRuntimeTest.tc.d.getVar('DEPLOY_DIR_RPM') + "/rpm.lock" | ||
88 | lf = bb.utils.lockfile(lockfilename, False) | ||
89 | oe.path.copyhardlinktree(rpm_dir, idx_path) | ||
90 | # Full indexes overload a 256MB image so reduce the number of rpms | ||
91 | # in the feed. Filter to p* since we use the psplash packages and | ||
92 | # this leaves some allarch and machine arch packages too. | ||
93 | bb.utils.remove(idx_path + "*/[a-oq-z]*.rpm") | ||
94 | bb.utils.unlockfile(lf) | ||
95 | index_cmds.append("%s --dbpath %s --update -q %s" % (rpm_createrepo, db_path, idx_path)) | ||
96 | rpm_dirs_found = True | ||
97 | # Create repodata¬ | ||
98 | result = oe.utils.multiprocess_exec(index_cmds, self.create_index) | ||
99 | if result: | ||
100 | bb.fatal('%s' % ('\n'.join(result))) | ||
101 | self.repo_server = HTTPService(oeRuntimeTest.tc.d.getVar('WORKDIR'), oeRuntimeTest.tc.target.server_ip) | ||
102 | self.repo_server.start() | ||
103 | |||
104 | @classmethod | ||
105 | def tearDownClass(self): | ||
106 | self.repo_server.stop() | ||
107 | for i in self.repolist: | ||
108 | oeRuntimeTest.tc.target.run('smart channel -y --remove '+str(i)) | ||
109 | 73 | ||
110 | @testcase(1143) | 74 | @OETestID(1143) |
75 | @OETestDepends(['smart.SmartBasicTest.test_smart_help']) | ||
111 | def test_smart_channel(self): | 76 | def test_smart_channel(self): |
112 | self.smart('channel', 1) | 77 | self.smart('channel', 1) |
113 | 78 | ||
114 | @testcase(719) | 79 | @OETestID(719) |
80 | @OETestDepends(['smart.SmartBasicTest.test_smart_help']) | ||
115 | def test_smart_channel_add(self): | 81 | def test_smart_channel_add(self): |
116 | image_pkgtype = self.tc.d.getVar('IMAGE_PKGTYPE') | 82 | image_pkgtype = self.tc.td['IMAGE_PKGTYPE'] |
117 | deploy_url = 'http://%s:%s/%s' %(self.target.server_ip, self.repo_server.port, image_pkgtype) | 83 | deploy_url = 'http://%s:%s/%s' % (self.target.server_ip, |
118 | pkgarchs = self.tc.d.getVar('PACKAGE_ARCHS').replace("-","_").split() | 84 | self.repo_server.port, |
119 | for arch in os.listdir('%s/%s' % (self.repo_server.root_dir, image_pkgtype)): | 85 | image_pkgtype) |
86 | pkgarchs = self.tc.td['PACKAGE_ARCHS'].replace("-","_").split() | ||
87 | archs = os.listdir(os.path.join(self.repo_server.root_dir, | ||
88 | image_pkgtype)) | ||
89 | for arch in archs: | ||
120 | if arch in pkgarchs: | 90 | if arch in pkgarchs: |
121 | self.smart('channel -y --add {a} type=rpm-md baseurl={u}/{a}'.format(a=arch, u=deploy_url)) | 91 | cmd = ('channel -y --add {a} type=rpm-md ' |
92 | 'baseurl={u}/{a}'.format(a=arch, u=deploy_url)) | ||
93 | self.smart(cmd) | ||
122 | self.repolist.append(arch) | 94 | self.repolist.append(arch) |
123 | self.smart('update') | 95 | self.smart('update') |
124 | 96 | ||
125 | @testcase(969) | 97 | @OETestID(969) |
98 | @OETestDepends(['smart.SmartBasicTest.test_smart_help']) | ||
126 | def test_smart_channel_help(self): | 99 | def test_smart_channel_help(self): |
127 | self.smart('channel --help') | 100 | self.smart('channel --help') |
128 | 101 | ||
129 | @testcase(970) | 102 | @OETestID(970) |
103 | @OETestDepends(['smart.SmartBasicTest.test_smart_help']) | ||
130 | def test_smart_channel_list(self): | 104 | def test_smart_channel_list(self): |
131 | self.smart('channel --list') | 105 | self.smart('channel --list') |
132 | 106 | ||
133 | @testcase(971) | 107 | @OETestID(971) |
108 | @OETestDepends(['smart.SmartBasicTest.test_smart_help']) | ||
134 | def test_smart_channel_show(self): | 109 | def test_smart_channel_show(self): |
135 | self.smart('channel --show') | 110 | self.smart('channel --show') |
136 | 111 | ||
137 | @testcase(717) | 112 | @OETestID(717) |
113 | @OETestDepends(['smart.SmartBasicTest.test_smart_help']) | ||
138 | def test_smart_channel_rpmsys(self): | 114 | def test_smart_channel_rpmsys(self): |
139 | self.smart('channel --show rpmsys') | 115 | self.smart('channel --show rpmsys') |
140 | self.smart('channel --disable rpmsys') | 116 | self.smart('channel --disable rpmsys') |
141 | self.smart('channel --enable rpmsys') | 117 | self.smart('channel --enable rpmsys') |
142 | 118 | ||
143 | @testcase(1144) | 119 | @OETestID(1144) |
144 | @skipUnlessPassed('test_smart_channel_add') | 120 | @OETestDepends(['smart.SmartRepoTest.test_smart_channel_add']) |
145 | def test_smart_install(self): | 121 | def test_smart_install(self): |
146 | self.smart('remove -y psplash-default') | 122 | self.smart('remove -y psplash-default') |
147 | self.smart('install -y psplash-default') | 123 | self.smart('install -y psplash-default') |
148 | 124 | ||
149 | @testcase(728) | 125 | @OETestID(728) |
150 | @skipUnlessPassed('test_smart_install') | 126 | @OETestDepends(['smart.SmartRepoTest.test_smart_install']) |
151 | def test_smart_install_dependency(self): | 127 | def test_smart_install_dependency(self): |
152 | self.smart('remove -y psplash') | 128 | self.smart('remove -y psplash') |
153 | self.smart('install -y psplash-default') | 129 | self.smart('install -y psplash-default') |
154 | 130 | ||
155 | @testcase(723) | 131 | @OETestID(723) |
156 | @skipUnlessPassed('test_smart_channel_add') | 132 | @OETestDepends(['smart.SmartRepoTest.test_smart_channel_add']) |
157 | def test_smart_install_from_disk(self): | 133 | def test_smart_install_from_disk(self): |
158 | self.smart('remove -y psplash-default') | 134 | self.smart('remove -y psplash-default') |
159 | self.smart('download psplash-default') | 135 | self.smart('download psplash-default') |
160 | self.smart('install -y ./psplash-default*') | 136 | self.smart('install -y ./psplash-default*') |
161 | 137 | ||
162 | @testcase(725) | 138 | @OETestID(725) |
163 | @skipUnlessPassed('test_smart_channel_add') | 139 | @OETestDepends(['smart.SmartRepoTest.test_smart_channel_add']) |
164 | def test_smart_install_from_http(self): | 140 | def test_smart_install_from_http(self): |
165 | output = self.smart('download --urls psplash-default') | 141 | output = self.smart('download --urls psplash-default') |
166 | url = re.search('(http://.*/psplash-default.*\.rpm)', output) | 142 | url = re.search('(http://.*/psplash-default.*\.rpm)', output) |
@@ -168,19 +144,20 @@ class SmartRepoTest(SmartTest): | |||
168 | self.smart('remove -y psplash-default') | 144 | self.smart('remove -y psplash-default') |
169 | self.smart('install -y %s' % url.group(0)) | 145 | self.smart('install -y %s' % url.group(0)) |
170 | 146 | ||
171 | @testcase(729) | 147 | @OETestID(729) |
172 | @skipUnlessPassed('test_smart_install') | 148 | @OETestDepends(['smart.SmartRepoTest.test_smart_install']) |
173 | def test_smart_reinstall(self): | 149 | def test_smart_reinstall(self): |
174 | self.smart('reinstall -y psplash-default') | 150 | self.smart('reinstall -y psplash-default') |
175 | 151 | ||
176 | @testcase(727) | 152 | @OETestID(727) |
177 | @skipUnlessPassed('test_smart_channel_add') | 153 | @OETestDepends(['smart.SmartRepoTest.test_smart_channel_add']) |
178 | def test_smart_remote_repo(self): | 154 | def test_smart_remote_repo(self): |
179 | self.smart('update') | 155 | self.smart('update') |
180 | self.smart('install -y psplash') | 156 | self.smart('install -y psplash') |
181 | self.smart('remove -y psplash') | 157 | self.smart('remove -y psplash') |
182 | 158 | ||
183 | @testcase(726) | 159 | @OETestID(726) |
160 | @OETestDepends(['smart.SmartBasicTest.test_smart_help']) | ||
184 | def test_smart_local_dir(self): | 161 | def test_smart_local_dir(self): |
185 | self.target.run('mkdir /tmp/myrpmdir') | 162 | self.target.run('mkdir /tmp/myrpmdir') |
186 | self.smart('channel --add myrpmdir type=rpm-dir path=/tmp/myrpmdir -y') | 163 | self.smart('channel --add myrpmdir type=rpm-dir path=/tmp/myrpmdir -y') |
@@ -198,7 +175,8 @@ class SmartRepoTest(SmartTest): | |||
198 | self.smart('channel --remove myrpmdir -y') | 175 | self.smart('channel --remove myrpmdir -y') |
199 | self.target.run("rm -rf /tmp/myrpmdir") | 176 | self.target.run("rm -rf /tmp/myrpmdir") |
200 | 177 | ||
201 | @testcase(718) | 178 | @OETestID(718) |
179 | @OETestDepends(['smart.SmartBasicTest.test_smart_help']) | ||
202 | def test_smart_add_rpmdir(self): | 180 | def test_smart_add_rpmdir(self): |
203 | self.target.run('mkdir /tmp/myrpmdir') | 181 | self.target.run('mkdir /tmp/myrpmdir') |
204 | self.smart('channel --add myrpmdir type=rpm-dir path=/tmp/myrpmdir -y') | 182 | self.smart('channel --add myrpmdir type=rpm-dir path=/tmp/myrpmdir -y') |
@@ -211,8 +189,8 @@ class SmartRepoTest(SmartTest): | |||
211 | self.smart('channel --remove myrpmdir -y') | 189 | self.smart('channel --remove myrpmdir -y') |
212 | self.target.run("rm -rf /tmp/myrpmdir") | 190 | self.target.run("rm -rf /tmp/myrpmdir") |
213 | 191 | ||
214 | @testcase(731) | 192 | @OETestID(731) |
215 | @skipUnlessPassed('test_smart_channel_add') | 193 | @OETestDepends(['smart.SmartRepoTest.test_smart_channel_add']) |
216 | def test_smart_remove_package(self): | 194 | def test_smart_remove_package(self): |
217 | self.smart('install -y psplash') | 195 | self.smart('install -y psplash') |
218 | self.smart('remove -y psplash') | 196 | self.smart('remove -y psplash') |