Message ID | 20220923154810.2932500-1-ross.burton@arm.com |
---|---|
State | New |
Headers | show |
Series | oeqa/runtime/dnf: streamline test case | expand |
Hi, On 23/09/2022 16:48:10+0100, Ross Burton wrote: > The DNF test case exercises a lot of functionality that we don't really > care about in the runtime QA: we mainly care that DNF is capable of > connecting to a remote repository and installing a package. > Specifically, we don't need to exercise so many different ways of > installing or the installroot functionality: if an image has been built > then it's clearly functional. > > Also, change the package that we install/reinstall to netbase and > friends from run-postinsts, as run-postinsts has non-trivial > side-effects such as causing systemd to reload, which might be causing > issues for other tests being ran. > > [ YOCTO #14787 ], hopefully > This is the cause of https://autobuilder.yoctoproject.org/typhoon/#/builders/79/builds/4168/steps/14/logs/stdio > Signed-off-by: Ross Burton <ross.burton@arm.com> > --- > meta/classes-recipe/testimage.bbclass | 6 +- > meta/lib/oeqa/runtime/cases/dnf.py | 182 +++++--------------------- > 2 files changed, 34 insertions(+), 154 deletions(-) > > diff --git a/meta/classes-recipe/testimage.bbclass b/meta/classes-recipe/testimage.bbclass > index 819c7d2bf4c..d53f1a3d6f1 100644 > --- a/meta/classes-recipe/testimage.bbclass > +++ b/meta/classes-recipe/testimage.bbclass > @@ -468,10 +468,8 @@ def create_rpm_index(d): > package_list = glob.glob(idx_path + "*/*.rpm") > > for pkg in package_list: > - if os.path.basename(pkg).startswith(("curl-ptest")): > - bb.utils.remove(pkg) > - > - if not os.path.basename(pkg).startswith(("rpm", "run-postinsts", "busybox", "bash", "update-alternatives", "libc6", "curl", "musl")): > + basename = os.path.basename(pkg) > + if basename.startswith("curl-ptest") or not basename.startswith("curl"): > bb.utils.remove(pkg) > > bb.utils.unlockfile(lf) > diff --git a/meta/lib/oeqa/runtime/cases/dnf.py b/meta/lib/oeqa/runtime/cases/dnf.py > index e0b91090b20..ef8bebfec0e 100644 > --- a/meta/lib/oeqa/runtime/cases/dnf.py > +++ b/meta/lib/oeqa/runtime/cases/dnf.py > @@ -5,53 +5,14 @@ > # > > import os > -import re > -import subprocess > from oeqa.utils.httpserver import HTTPService > > from oeqa.runtime.case import OERuntimeTestCase > from oeqa.core.decorator.depends import OETestDepends > -from oeqa.core.decorator.data import skipIfNotDataVar, skipIfNotFeature, skipIfInDataVar, skipIfNotInDataVar > +from oeqa.core.decorator.data import skipIfNotDataVar, skipIfNotFeature > from oeqa.runtime.decorator.package import OEHasPackage > > class DnfTest(OERuntimeTestCase): > - > - def dnf(self, command, expected = 0): > - command = 'dnf %s' % command > - status, output = self.target.run(command, 1500) > - message = os.linesep.join([command, output]) > - self.assertEqual(status, expected, message) > - return output > - > -class DnfBasicTest(DnfTest): > - > - @skipIfNotFeature('package-management', > - 'Test requires package-management to be in IMAGE_FEATURES') > - @skipIfNotDataVar('IMAGE_PKGTYPE', 'rpm', > - 'RPM is not the primary package manager') > - @OEHasPackage(['dnf']) > - @OETestDepends(['ssh.SSHTest.test_ssh']) > - def test_dnf_help(self): > - self.dnf('--help') > - > - @OETestDepends(['dnf.DnfBasicTest.test_dnf_help']) > - def test_dnf_version(self): > - self.dnf('--version') > - > - @OETestDepends(['dnf.DnfBasicTest.test_dnf_help']) > - def test_dnf_info(self): > - self.dnf('info dnf') > - > - @OETestDepends(['dnf.DnfBasicTest.test_dnf_help']) > - def test_dnf_search(self): > - self.dnf('search dnf') > - > - @OETestDepends(['dnf.DnfBasicTest.test_dnf_help']) > - def test_dnf_history(self): > - self.dnf('history') > - > -class DnfRepoTest(DnfTest): > - > @classmethod > def setUpClass(cls): > cls.repo_server = HTTPService(os.path.join(cls.tc.td['WORKDIR'], 'oe-testimage-repo'), > @@ -63,6 +24,13 @@ class DnfRepoTest(DnfTest): > def tearDownClass(cls): > cls.repo_server.stop() > > + def dnf(self, command, expected = 0): > + command = 'dnf %s' % command > + status, output = self.target.run(command, 1500) > + message = os.linesep.join([command, output]) > + self.assertEqual(status, expected, message) > + return output > + > def dnf_with_repo(self, command): > pkgarchs = os.listdir(os.path.join(self.tc.td['WORKDIR'], 'oe-testimage-repo')) > deploy_url = 'http://%s:%s/' %(self.target.server_ip, self.repo_server.port) > @@ -71,123 +39,37 @@ class DnfRepoTest(DnfTest): > output = self.dnf(" ".join(cmdlinerepoopts) + " --nogpgcheck " + command) > return output > > - @OETestDepends(['dnf.DnfBasicTest.test_dnf_help']) > + @skipIfNotFeature('package-management', > + 'Test requires package-management to be in IMAGE_FEATURES') > + @skipIfNotDataVar('IMAGE_PKGTYPE', 'rpm', > + 'RPM is not the primary package manager') > + @OEHasPackage(['dnf']) > + @OETestDepends(['ssh.SSHTest.test_ssh']) > + def test_dnf_help(self): > + self.dnf('--help') > + > + @OETestDepends(['dnf.DnfTest.test_dnf_help']) > def test_dnf_makecache(self): > self.dnf_with_repo('makecache') > > - > -# Does not work when repo is specified on the command line > -# @OETestDepends(['dnf.DnfRepoTest.test_dnf_makecache']) > -# def test_dnf_repolist(self): > -# self.dnf_with_repo('repolist') > - > - @OETestDepends(['dnf.DnfRepoTest.test_dnf_makecache']) > + @OETestDepends(['dnf.DnfTest.test_dnf_makecache']) > def test_dnf_repoinfo(self): > - self.dnf_with_repo('repoinfo') > + output = self.dnf_with_repo('repoinfo') > + self.assertIn("Added oe-testimage-repo-noarch", output) > > - @OETestDepends(['dnf.DnfRepoTest.test_dnf_makecache']) > + @OETestDepends(['dnf.DnfTest.test_dnf_makecache']) > def test_dnf_install(self): > - output = self.dnf_with_repo('list run-postinsts-dev') > - if 'Installed Packages' in output: > - self.dnf_with_repo('remove -y run-postinsts-dev') > - self.dnf_with_repo('install -y run-postinsts-dev') > + self.dnf_with_repo('remove -y curl-dev') > + self.dnf_with_repo('install -y curl-dev') > > - @OETestDepends(['dnf.DnfRepoTest.test_dnf_install']) > - def test_dnf_install_dependency(self): > - self.dnf_with_repo('remove -y run-postinsts') > - self.dnf_with_repo('install -y run-postinsts-dev') > - > - @OETestDepends(['dnf.DnfRepoTest.test_dnf_install_dependency']) > - def test_dnf_install_from_disk(self): > - self.dnf_with_repo('remove -y run-postinsts-dev') > - self.dnf_with_repo('install -y --downloadonly run-postinsts-dev') > - status, output = self.target.run('find /var/cache/dnf -name run-postinsts-dev*rpm', 1500) > - self.assertEqual(status, 0, output) > - self.dnf_with_repo('install -y %s' % output) > - > - @OETestDepends(['dnf.DnfRepoTest.test_dnf_install_from_disk']) > - def test_dnf_install_from_http(self): > - output = subprocess.check_output('%s %s -name run-postinsts-dev*' % (bb.utils.which(os.getenv('PATH'), "find"), > - os.path.join(self.tc.td['WORKDIR'], 'oe-testimage-repo')), shell=True).decode("utf-8") > - rpm_path = output.split("/")[-2] + "/" + output.split("/")[-1] > - url = 'http://%s:%s/%s' %(self.target.server_ip, self.repo_server.port, rpm_path) > - self.dnf_with_repo('remove -y run-postinsts-dev') > - self.dnf_with_repo('install -y %s' % url) > - > - @OETestDepends(['dnf.DnfRepoTest.test_dnf_install']) > + @OETestDepends(['dnf.DnfTest.test_dnf_makecache']) > def test_dnf_reinstall(self): > - self.dnf_with_repo('reinstall -y run-postinsts-dev') > - > - @OETestDepends(['dnf.DnfRepoTest.test_dnf_makecache']) > - @skipIfInDataVar('DISTRO_FEATURES', 'usrmerge', 'Test run when not enable usrmerge') > - @OEHasPackage('busybox') > - def test_dnf_installroot(self): > - rootpath = '/home/root/chroot/test' > - #Copy necessary files to avoid errors with not yet installed tools on > - #installroot directory. > - self.target.run('mkdir -p %s/etc' % rootpath, 1500) > - self.target.run('mkdir -p %s/bin %s/sbin %s/usr/bin %s/usr/sbin' % (rootpath, rootpath, rootpath, rootpath), 1500) > - self.target.run('mkdir -p %s/dev' % rootpath, 1500) > - #Handle different architectures lib dirs > - self.target.run('mkdir -p %s/lib' % rootpath, 1500) > - self.target.run('mkdir -p %s/libx32' % rootpath, 1500) > - self.target.run('mkdir -p %s/lib64' % rootpath, 1500) > - self.target.run('cp /lib/libtinfo.so.5 %s/lib' % rootpath, 1500) > - self.target.run('cp /libx32/libtinfo.so.5 %s/libx32' % rootpath, 1500) > - self.target.run('cp /lib64/libtinfo.so.5 %s/lib64' % rootpath, 1500) > - self.target.run('cp -r /etc/rpm %s/etc' % rootpath, 1500) > - self.target.run('cp -r /etc/dnf %s/etc' % rootpath, 1500) > - self.target.run('cp /bin/sh %s/bin' % rootpath, 1500) > - self.target.run('mount -o bind /dev %s/dev/' % rootpath, 1500) > - self.dnf_with_repo('install --installroot=%s -v -y --rpmverbosity=debug busybox run-postinsts' % rootpath) > - status, output = self.target.run('test -e %s/var/cache/dnf' % rootpath, 1500) > - self.assertEqual(0, status, output) > - status, output = self.target.run('test -e %s/bin/busybox' % rootpath, 1500) > - self.assertEqual(0, status, output) > - > - @OETestDepends(['dnf.DnfRepoTest.test_dnf_makecache']) > - @skipIfNotInDataVar('DISTRO_FEATURES', 'usrmerge', 'Test run when enable usrmerge') > - @OEHasPackage('busybox') > - def test_dnf_installroot_usrmerge(self): > - rootpath = '/home/root/chroot/test' > - #Copy necessary files to avoid errors with not yet installed tools on > - #installroot directory. > - self.target.run('mkdir -p %s/etc' % rootpath, 1500) > - self.target.run('mkdir -p %s/usr/bin %s/usr/sbin' % (rootpath, rootpath), 1500) > - self.target.run('ln -sf -r %s/usr/bin %s/bin' % (rootpath, rootpath), 1500) > - self.target.run('ln -sf -r %s/usr/sbin %s/sbin' % (rootpath, rootpath), 1500) > - self.target.run('mkdir -p %s/dev' % rootpath, 1500) > - #Handle different architectures lib dirs > - self.target.run('mkdir -p %s/usr/lib' % rootpath, 1500) > - self.target.run('mkdir -p %s/usr/libx32' % rootpath, 1500) > - self.target.run('mkdir -p %s/usr/lib64' % rootpath, 1500) > - self.target.run('cp /lib/libtinfo.so.5 %s/usr/lib' % rootpath, 1500) > - self.target.run('cp /libx32/libtinfo.so.5 %s/usr/libx32' % rootpath, 1500) > - self.target.run('cp /lib64/libtinfo.so.5 %s/usr/lib64' % rootpath, 1500) > - self.target.run('ln -sf -r %s/lib %s/usr/lib' % (rootpath,rootpath), 1500) > - self.target.run('ln -sf -r %s/libx32 %s/usr/libx32' % (rootpath,rootpath), 1500) > - self.target.run('ln -sf -r %s/lib64 %s/usr/lib64' % (rootpath,rootpath), 1500) > - self.target.run('cp -r /etc/rpm %s/etc' % rootpath, 1500) > - self.target.run('cp -r /etc/dnf %s/etc' % rootpath, 1500) > - self.target.run('cp /bin/sh %s/bin' % rootpath, 1500) > - self.target.run('mount -o bind /dev %s/dev/' % rootpath, 1500) > - self.dnf_with_repo('install --installroot=%s -v -y --rpmverbosity=debug busybox run-postinsts' % rootpath) > - status, output = self.target.run('test -e %s/var/cache/dnf' % rootpath, 1500) > - self.assertEqual(0, status, output) > - status, output = self.target.run('test -e %s/bin/busybox' % rootpath, 1500) > - self.assertEqual(0, status, output) > + self.dnf_with_repo('reinstall -y curl') > > - @OETestDepends(['dnf.DnfRepoTest.test_dnf_makecache']) > + @OETestDepends(['dnf.DnfTest.test_dnf_makecache']) > def test_dnf_exclude(self): > - excludepkg = 'curl-dev' > - self.dnf_with_repo('install -y curl*') > - self.dnf('list %s' % excludepkg, 0) > - #Avoid remove dependencies to skip some errors on different archs and images > - self.dnf_with_repo('remove --setopt=clean_requirements_on_remove=0 -y curl*') > - #check curl-dev is not installed adter removing all curl occurrences > - status, output = self.target.run('dnf list --installed | grep %s'% excludepkg, 1500) > - self.assertEqual(1, status, "%s was not removed, is listed as installed"%excludepkg) > - self.dnf_with_repo('install -y --exclude=%s --exclude=curl-staticdev curl*' % excludepkg) > - #check curl-dev is not installed after being excluded > - status, output = self.target.run('dnf list --installed | grep %s'% excludepkg , 1500) > - self.assertEqual(1, status, "%s was not excluded, is listed as installed"%excludepkg) > + self.dnf_with_repo('remove -y curl-dev') > + self.dnf_with_repo('install -y --exclude=curl-dev curl*') > + output = self.dnf('list --installed curl*') > + self.assertIn("curl.", output) > + self.assertNotIn("curl-dev.", output) > -- > 2.34.1 > > > -=-=-=-=-=-=-=-=-=-=-=- > Links: You receive all messages sent to this group. > View/Reply Online (#171000): https://lists.openembedded.org/g/openembedded-core/message/171000 > Mute This Topic: https://lists.openembedded.org/mt/93872994/3617179 > Group Owner: openembedded-core+owner@lists.openembedded.org > Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [alexandre.belloni@bootlin.com] > -=-=-=-=-=-=-=-=-=-=-=- >
diff --git a/meta/classes-recipe/testimage.bbclass b/meta/classes-recipe/testimage.bbclass index 819c7d2bf4c..d53f1a3d6f1 100644 --- a/meta/classes-recipe/testimage.bbclass +++ b/meta/classes-recipe/testimage.bbclass @@ -468,10 +468,8 @@ def create_rpm_index(d): package_list = glob.glob(idx_path + "*/*.rpm") for pkg in package_list: - if os.path.basename(pkg).startswith(("curl-ptest")): - bb.utils.remove(pkg) - - if not os.path.basename(pkg).startswith(("rpm", "run-postinsts", "busybox", "bash", "update-alternatives", "libc6", "curl", "musl")): + basename = os.path.basename(pkg) + if basename.startswith("curl-ptest") or not basename.startswith("curl"): bb.utils.remove(pkg) bb.utils.unlockfile(lf) diff --git a/meta/lib/oeqa/runtime/cases/dnf.py b/meta/lib/oeqa/runtime/cases/dnf.py index e0b91090b20..ef8bebfec0e 100644 --- a/meta/lib/oeqa/runtime/cases/dnf.py +++ b/meta/lib/oeqa/runtime/cases/dnf.py @@ -5,53 +5,14 @@ # import os -import re -import subprocess from oeqa.utils.httpserver import HTTPService from oeqa.runtime.case import OERuntimeTestCase from oeqa.core.decorator.depends import OETestDepends -from oeqa.core.decorator.data import skipIfNotDataVar, skipIfNotFeature, skipIfInDataVar, skipIfNotInDataVar +from oeqa.core.decorator.data import skipIfNotDataVar, skipIfNotFeature from oeqa.runtime.decorator.package import OEHasPackage class DnfTest(OERuntimeTestCase): - - def dnf(self, command, expected = 0): - command = 'dnf %s' % command - status, output = self.target.run(command, 1500) - message = os.linesep.join([command, output]) - self.assertEqual(status, expected, message) - return output - -class DnfBasicTest(DnfTest): - - @skipIfNotFeature('package-management', - 'Test requires package-management to be in IMAGE_FEATURES') - @skipIfNotDataVar('IMAGE_PKGTYPE', 'rpm', - 'RPM is not the primary package manager') - @OEHasPackage(['dnf']) - @OETestDepends(['ssh.SSHTest.test_ssh']) - def test_dnf_help(self): - self.dnf('--help') - - @OETestDepends(['dnf.DnfBasicTest.test_dnf_help']) - def test_dnf_version(self): - self.dnf('--version') - - @OETestDepends(['dnf.DnfBasicTest.test_dnf_help']) - def test_dnf_info(self): - self.dnf('info dnf') - - @OETestDepends(['dnf.DnfBasicTest.test_dnf_help']) - def test_dnf_search(self): - self.dnf('search dnf') - - @OETestDepends(['dnf.DnfBasicTest.test_dnf_help']) - def test_dnf_history(self): - self.dnf('history') - -class DnfRepoTest(DnfTest): - @classmethod def setUpClass(cls): cls.repo_server = HTTPService(os.path.join(cls.tc.td['WORKDIR'], 'oe-testimage-repo'), @@ -63,6 +24,13 @@ class DnfRepoTest(DnfTest): def tearDownClass(cls): cls.repo_server.stop() + def dnf(self, command, expected = 0): + command = 'dnf %s' % command + status, output = self.target.run(command, 1500) + message = os.linesep.join([command, output]) + self.assertEqual(status, expected, message) + return output + def dnf_with_repo(self, command): pkgarchs = os.listdir(os.path.join(self.tc.td['WORKDIR'], 'oe-testimage-repo')) deploy_url = 'http://%s:%s/' %(self.target.server_ip, self.repo_server.port) @@ -71,123 +39,37 @@ class DnfRepoTest(DnfTest): output = self.dnf(" ".join(cmdlinerepoopts) + " --nogpgcheck " + command) return output - @OETestDepends(['dnf.DnfBasicTest.test_dnf_help']) + @skipIfNotFeature('package-management', + 'Test requires package-management to be in IMAGE_FEATURES') + @skipIfNotDataVar('IMAGE_PKGTYPE', 'rpm', + 'RPM is not the primary package manager') + @OEHasPackage(['dnf']) + @OETestDepends(['ssh.SSHTest.test_ssh']) + def test_dnf_help(self): + self.dnf('--help') + + @OETestDepends(['dnf.DnfTest.test_dnf_help']) def test_dnf_makecache(self): self.dnf_with_repo('makecache') - -# Does not work when repo is specified on the command line -# @OETestDepends(['dnf.DnfRepoTest.test_dnf_makecache']) -# def test_dnf_repolist(self): -# self.dnf_with_repo('repolist') - - @OETestDepends(['dnf.DnfRepoTest.test_dnf_makecache']) + @OETestDepends(['dnf.DnfTest.test_dnf_makecache']) def test_dnf_repoinfo(self): - self.dnf_with_repo('repoinfo') + output = self.dnf_with_repo('repoinfo') + self.assertIn("Added oe-testimage-repo-noarch", output) - @OETestDepends(['dnf.DnfRepoTest.test_dnf_makecache']) + @OETestDepends(['dnf.DnfTest.test_dnf_makecache']) def test_dnf_install(self): - output = self.dnf_with_repo('list run-postinsts-dev') - if 'Installed Packages' in output: - self.dnf_with_repo('remove -y run-postinsts-dev') - self.dnf_with_repo('install -y run-postinsts-dev') + self.dnf_with_repo('remove -y curl-dev') + self.dnf_with_repo('install -y curl-dev') - @OETestDepends(['dnf.DnfRepoTest.test_dnf_install']) - def test_dnf_install_dependency(self): - self.dnf_with_repo('remove -y run-postinsts') - self.dnf_with_repo('install -y run-postinsts-dev') - - @OETestDepends(['dnf.DnfRepoTest.test_dnf_install_dependency']) - def test_dnf_install_from_disk(self): - self.dnf_with_repo('remove -y run-postinsts-dev') - self.dnf_with_repo('install -y --downloadonly run-postinsts-dev') - status, output = self.target.run('find /var/cache/dnf -name run-postinsts-dev*rpm', 1500) - self.assertEqual(status, 0, output) - self.dnf_with_repo('install -y %s' % output) - - @OETestDepends(['dnf.DnfRepoTest.test_dnf_install_from_disk']) - def test_dnf_install_from_http(self): - output = subprocess.check_output('%s %s -name run-postinsts-dev*' % (bb.utils.which(os.getenv('PATH'), "find"), - os.path.join(self.tc.td['WORKDIR'], 'oe-testimage-repo')), shell=True).decode("utf-8") - rpm_path = output.split("/")[-2] + "/" + output.split("/")[-1] - url = 'http://%s:%s/%s' %(self.target.server_ip, self.repo_server.port, rpm_path) - self.dnf_with_repo('remove -y run-postinsts-dev') - self.dnf_with_repo('install -y %s' % url) - - @OETestDepends(['dnf.DnfRepoTest.test_dnf_install']) + @OETestDepends(['dnf.DnfTest.test_dnf_makecache']) def test_dnf_reinstall(self): - self.dnf_with_repo('reinstall -y run-postinsts-dev') - - @OETestDepends(['dnf.DnfRepoTest.test_dnf_makecache']) - @skipIfInDataVar('DISTRO_FEATURES', 'usrmerge', 'Test run when not enable usrmerge') - @OEHasPackage('busybox') - def test_dnf_installroot(self): - rootpath = '/home/root/chroot/test' - #Copy necessary files to avoid errors with not yet installed tools on - #installroot directory. - self.target.run('mkdir -p %s/etc' % rootpath, 1500) - self.target.run('mkdir -p %s/bin %s/sbin %s/usr/bin %s/usr/sbin' % (rootpath, rootpath, rootpath, rootpath), 1500) - self.target.run('mkdir -p %s/dev' % rootpath, 1500) - #Handle different architectures lib dirs - self.target.run('mkdir -p %s/lib' % rootpath, 1500) - self.target.run('mkdir -p %s/libx32' % rootpath, 1500) - self.target.run('mkdir -p %s/lib64' % rootpath, 1500) - self.target.run('cp /lib/libtinfo.so.5 %s/lib' % rootpath, 1500) - self.target.run('cp /libx32/libtinfo.so.5 %s/libx32' % rootpath, 1500) - self.target.run('cp /lib64/libtinfo.so.5 %s/lib64' % rootpath, 1500) - self.target.run('cp -r /etc/rpm %s/etc' % rootpath, 1500) - self.target.run('cp -r /etc/dnf %s/etc' % rootpath, 1500) - self.target.run('cp /bin/sh %s/bin' % rootpath, 1500) - self.target.run('mount -o bind /dev %s/dev/' % rootpath, 1500) - self.dnf_with_repo('install --installroot=%s -v -y --rpmverbosity=debug busybox run-postinsts' % rootpath) - status, output = self.target.run('test -e %s/var/cache/dnf' % rootpath, 1500) - self.assertEqual(0, status, output) - status, output = self.target.run('test -e %s/bin/busybox' % rootpath, 1500) - self.assertEqual(0, status, output) - - @OETestDepends(['dnf.DnfRepoTest.test_dnf_makecache']) - @skipIfNotInDataVar('DISTRO_FEATURES', 'usrmerge', 'Test run when enable usrmerge') - @OEHasPackage('busybox') - def test_dnf_installroot_usrmerge(self): - rootpath = '/home/root/chroot/test' - #Copy necessary files to avoid errors with not yet installed tools on - #installroot directory. - self.target.run('mkdir -p %s/etc' % rootpath, 1500) - self.target.run('mkdir -p %s/usr/bin %s/usr/sbin' % (rootpath, rootpath), 1500) - self.target.run('ln -sf -r %s/usr/bin %s/bin' % (rootpath, rootpath), 1500) - self.target.run('ln -sf -r %s/usr/sbin %s/sbin' % (rootpath, rootpath), 1500) - self.target.run('mkdir -p %s/dev' % rootpath, 1500) - #Handle different architectures lib dirs - self.target.run('mkdir -p %s/usr/lib' % rootpath, 1500) - self.target.run('mkdir -p %s/usr/libx32' % rootpath, 1500) - self.target.run('mkdir -p %s/usr/lib64' % rootpath, 1500) - self.target.run('cp /lib/libtinfo.so.5 %s/usr/lib' % rootpath, 1500) - self.target.run('cp /libx32/libtinfo.so.5 %s/usr/libx32' % rootpath, 1500) - self.target.run('cp /lib64/libtinfo.so.5 %s/usr/lib64' % rootpath, 1500) - self.target.run('ln -sf -r %s/lib %s/usr/lib' % (rootpath,rootpath), 1500) - self.target.run('ln -sf -r %s/libx32 %s/usr/libx32' % (rootpath,rootpath), 1500) - self.target.run('ln -sf -r %s/lib64 %s/usr/lib64' % (rootpath,rootpath), 1500) - self.target.run('cp -r /etc/rpm %s/etc' % rootpath, 1500) - self.target.run('cp -r /etc/dnf %s/etc' % rootpath, 1500) - self.target.run('cp /bin/sh %s/bin' % rootpath, 1500) - self.target.run('mount -o bind /dev %s/dev/' % rootpath, 1500) - self.dnf_with_repo('install --installroot=%s -v -y --rpmverbosity=debug busybox run-postinsts' % rootpath) - status, output = self.target.run('test -e %s/var/cache/dnf' % rootpath, 1500) - self.assertEqual(0, status, output) - status, output = self.target.run('test -e %s/bin/busybox' % rootpath, 1500) - self.assertEqual(0, status, output) + self.dnf_with_repo('reinstall -y curl') - @OETestDepends(['dnf.DnfRepoTest.test_dnf_makecache']) + @OETestDepends(['dnf.DnfTest.test_dnf_makecache']) def test_dnf_exclude(self): - excludepkg = 'curl-dev' - self.dnf_with_repo('install -y curl*') - self.dnf('list %s' % excludepkg, 0) - #Avoid remove dependencies to skip some errors on different archs and images - self.dnf_with_repo('remove --setopt=clean_requirements_on_remove=0 -y curl*') - #check curl-dev is not installed adter removing all curl occurrences - status, output = self.target.run('dnf list --installed | grep %s'% excludepkg, 1500) - self.assertEqual(1, status, "%s was not removed, is listed as installed"%excludepkg) - self.dnf_with_repo('install -y --exclude=%s --exclude=curl-staticdev curl*' % excludepkg) - #check curl-dev is not installed after being excluded - status, output = self.target.run('dnf list --installed | grep %s'% excludepkg , 1500) - self.assertEqual(1, status, "%s was not excluded, is listed as installed"%excludepkg) + self.dnf_with_repo('remove -y curl-dev') + self.dnf_with_repo('install -y --exclude=curl-dev curl*') + output = self.dnf('list --installed curl*') + self.assertIn("curl.", output) + self.assertNotIn("curl-dev.", output)
The DNF test case exercises a lot of functionality that we don't really care about in the runtime QA: we mainly care that DNF is capable of connecting to a remote repository and installing a package. Specifically, we don't need to exercise so many different ways of installing or the installroot functionality: if an image has been built then it's clearly functional. Also, change the package that we install/reinstall to netbase and friends from run-postinsts, as run-postinsts has non-trivial side-effects such as causing systemd to reload, which might be causing issues for other tests being ran. [ YOCTO #14787 ], hopefully Signed-off-by: Ross Burton <ross.burton@arm.com> --- meta/classes-recipe/testimage.bbclass | 6 +- meta/lib/oeqa/runtime/cases/dnf.py | 182 +++++--------------------- 2 files changed, 34 insertions(+), 154 deletions(-)