devtool: Split tests into multiple classes

This allows better parallelism between the different tests as currently
this block takes the longest time to execute. devtool tests are still
all grouped into the "devtool" module for ease of exection.

This also makes it easier to execute some subset of devtool tests for
testing devtool changes.

(From OE-Core rev: 84f19e78d9b1f3d634cf1d46ce48f24670199d0b)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Richard Purdie 2018-07-13 21:59:22 +00:00
parent 9a8d6d9fd2
commit 5ddf7fff99

View File

@ -78,6 +78,58 @@ def tearDownModule():
class DevtoolBase(OESelftestTestCase): class DevtoolBase(OESelftestTestCase):
@classmethod
def setUpClass(cls):
super(DevtoolBase, cls).setUpClass()
bb_vars = get_bb_vars(['TOPDIR', 'SSTATE_DIR'])
cls.original_sstate = bb_vars['SSTATE_DIR']
cls.devtool_sstate = os.path.join(bb_vars['TOPDIR'], 'sstate_devtool')
cls.sstate_conf = 'SSTATE_DIR = "%s"\n' % cls.devtool_sstate
cls.sstate_conf += ('SSTATE_MIRRORS += "file://.* file:///%s/PATH"\n'
% cls.original_sstate)
@classmethod
def tearDownClass(cls):
cls.logger.debug('Deleting devtool sstate cache on %s' % cls.devtool_sstate)
runCmd('rm -rf %s' % cls.devtool_sstate)
super(DevtoolBase, cls).tearDownClass()
def setUp(self):
"""Test case setup function"""
super(DevtoolBase, self).setUp()
self.workspacedir = os.path.join(self.builddir, 'workspace')
self.assertTrue(not os.path.exists(self.workspacedir),
'This test cannot be run with a workspace directory '
'under the build directory')
self.append_config(self.sstate_conf)
def _check_src_repo(self, repo_dir):
"""Check srctree git repository"""
self.assertTrue(os.path.isdir(os.path.join(repo_dir, '.git')),
'git repository for external source tree not found')
result = runCmd('git status --porcelain', cwd=repo_dir)
self.assertEqual(result.output.strip(), "",
'Created git repo is not clean')
result = runCmd('git symbolic-ref HEAD', cwd=repo_dir)
self.assertEqual(result.output.strip(), "refs/heads/devtool",
'Wrong branch in git repo')
def _check_repo_status(self, repo_dir, expected_status):
"""Check the worktree status of a repository"""
result = runCmd('git status . --porcelain',
cwd=repo_dir)
for line in result.output.splitlines():
for ind, (f_status, fn_re) in enumerate(expected_status):
if re.match(fn_re, line[3:]):
if f_status != line[:2]:
self.fail('Unexpected status in line: %s' % line)
expected_status.pop(ind)
break
else:
self.fail('Unexpected modified file in line: %s' % line)
if expected_status:
self.fail('Missing file changes: %s' % expected_status)
def _test_recipe_contents(self, recipefile, checkvars, checkinherits): def _test_recipe_contents(self, recipefile, checkvars, checkinherits):
with open(recipefile, 'r') as f: with open(recipefile, 'r') as f:
invar = None invar = None
@ -181,58 +233,6 @@ class DevtoolBase(OESelftestTestCase):
class DevtoolTests(DevtoolBase): class DevtoolTests(DevtoolBase):
@classmethod
def setUpClass(cls):
super(DevtoolTests, cls).setUpClass()
bb_vars = get_bb_vars(['TOPDIR', 'SSTATE_DIR'])
cls.original_sstate = bb_vars['SSTATE_DIR']
cls.devtool_sstate = os.path.join(bb_vars['TOPDIR'], 'sstate_devtool')
cls.sstate_conf = 'SSTATE_DIR = "%s"\n' % cls.devtool_sstate
cls.sstate_conf += ('SSTATE_MIRRORS += "file://.* file:///%s/PATH"\n'
% cls.original_sstate)
@classmethod
def tearDownClass(cls):
cls.logger.debug('Deleting devtool sstate cache on %s' % cls.devtool_sstate)
runCmd('rm -rf %s' % cls.devtool_sstate)
super(DevtoolTests, cls).tearDownClass()
def setUp(self):
"""Test case setup function"""
super(DevtoolTests, self).setUp()
self.workspacedir = os.path.join(self.builddir, 'workspace')
self.assertTrue(not os.path.exists(self.workspacedir),
'This test cannot be run with a workspace directory '
'under the build directory')
self.append_config(self.sstate_conf)
def _check_src_repo(self, repo_dir):
"""Check srctree git repository"""
self.assertTrue(os.path.isdir(os.path.join(repo_dir, '.git')),
'git repository for external source tree not found')
result = runCmd('git status --porcelain', cwd=repo_dir)
self.assertEqual(result.output.strip(), "",
'Created git repo is not clean')
result = runCmd('git symbolic-ref HEAD', cwd=repo_dir)
self.assertEqual(result.output.strip(), "refs/heads/devtool",
'Wrong branch in git repo')
def _check_repo_status(self, repo_dir, expected_status):
"""Check the worktree status of a repository"""
result = runCmd('git status . --porcelain',
cwd=repo_dir)
for line in result.output.splitlines():
for ind, (f_status, fn_re) in enumerate(expected_status):
if re.match(fn_re, line[3:]):
if f_status != line[:2]:
self.fail('Unexpected status in line: %s' % line)
expected_status.pop(ind)
break
else:
self.fail('Unexpected modified file in line: %s' % line)
if expected_status:
self.fail('Missing file changes: %s' % expected_status)
@OETestID(1158) @OETestID(1158)
def test_create_workspace(self): def test_create_workspace(self):
# Check preconditions # Check preconditions
@ -254,6 +254,8 @@ class DevtoolTests(DevtoolBase):
self.assertNotIn(tempdir, result.output) self.assertNotIn(tempdir, result.output)
self.assertIn(self.workspacedir, result.output) self.assertIn(self.workspacedir, result.output)
class DevtoolAddTests(DevtoolBase):
@OETestID(1159) @OETestID(1159)
def test_devtool_add(self): def test_devtool_add(self):
# Fetch source # Fetch source
@ -509,6 +511,8 @@ class DevtoolTests(DevtoolBase):
checkvars['SRC_URI'] = url.replace(testver, '${PV}') checkvars['SRC_URI'] = url.replace(testver, '${PV}')
self._test_recipe_contents(recipefile, checkvars, []) self._test_recipe_contents(recipefile, checkvars, [])
class DevtoolModifyTests(DevtoolBase):
@OETestID(1164) @OETestID(1164)
def test_devtool_modify(self): def test_devtool_modify(self):
import oe.path import oe.path
@ -754,6 +758,7 @@ class DevtoolTests(DevtoolBase):
self._check_src_repo(tempdir) self._check_src_repo(tempdir)
# This is probably sufficient # This is probably sufficient
class DevtoolUpdateTests(DevtoolBase):
@OETestID(1169) @OETestID(1169)
def test_devtool_update_recipe(self): def test_devtool_update_recipe(self):
@ -1170,6 +1175,8 @@ class DevtoolTests(DevtoolBase):
expected_status = [] expected_status = []
self._check_repo_status(os.path.dirname(recipefile), expected_status) self._check_repo_status(os.path.dirname(recipefile), expected_status)
class DevtoolExtractTests(DevtoolBase):
@OETestID(1163) @OETestID(1163)
def test_devtool_extract(self): def test_devtool_extract(self):
tempdir = tempfile.mkdtemp(prefix='devtoolqa') tempdir = tempfile.mkdtemp(prefix='devtoolqa')
@ -1339,6 +1346,8 @@ class DevtoolTests(DevtoolBase):
if reqpkgs: if reqpkgs:
self.fail('The following packages were not present in the image as expected: %s' % ', '.join(reqpkgs)) self.fail('The following packages were not present in the image as expected: %s' % ', '.join(reqpkgs))
class DevtoolUpgradeTests(DevtoolBase):
@OETestID(1367) @OETestID(1367)
def test_devtool_upgrade(self): def test_devtool_upgrade(self):
# Check preconditions # Check preconditions