diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2018-11-26 17:00:10 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2018-11-27 22:13:11 +0000 |
commit | 0c1e13ca441b74eb4693ddfee91ed59cc9cc66ba (patch) | |
tree | 0be58199397665a597e5ae292693329480c1940d /meta/lib/oeqa | |
parent | 05edac6a961bfce0a0cd03db62b3bd61352daf99 (diff) | |
download | poky-0c1e13ca441b74eb4693ddfee91ed59cc9cc66ba.tar.gz |
oeqa/selftest/signing: Allow tests not to need gpg on the host
We ideally don't want to use gpg from the host. This is straightforward for package
management but not for sstate.
For sstate, create a second build directory to run the test in using gnupg-native
from the original build directory.
(From OE-Core rev: 10afa94c3f0d7eb7524a26deda86949073d55fde)
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/lib/oeqa')
-rw-r--r-- | meta/lib/oeqa/selftest/cases/signing.py | 67 |
1 files changed, 48 insertions, 19 deletions
diff --git a/meta/lib/oeqa/selftest/cases/signing.py b/meta/lib/oeqa/selftest/cases/signing.py index 97e9cfd44d..76c587a5c2 100644 --- a/meta/lib/oeqa/selftest/cases/signing.py +++ b/meta/lib/oeqa/selftest/cases/signing.py | |||
@@ -1,10 +1,12 @@ | |||
1 | from oeqa.selftest.case import OESelftestTestCase | 1 | from oeqa.selftest.case import OESelftestTestCase |
2 | from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars | 2 | from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars |
3 | import os | 3 | import os |
4 | import oe | ||
4 | import glob | 5 | import glob |
5 | import re | 6 | import re |
6 | import shutil | 7 | import shutil |
7 | import tempfile | 8 | import tempfile |
9 | from contextlib import contextmanager | ||
8 | from oeqa.core.decorator.oeid import OETestID | 10 | from oeqa.core.decorator.oeid import OETestID |
9 | from oeqa.utils.ftools import write_file | 11 | from oeqa.utils.ftools import write_file |
10 | 12 | ||
@@ -16,9 +18,7 @@ class Signing(OESelftestTestCase): | |||
16 | secret_key_path = "" | 18 | secret_key_path = "" |
17 | 19 | ||
18 | def setup_gpg(self): | 20 | def setup_gpg(self): |
19 | # Check that we can find the gpg binary and fail early if we can't | 21 | bitbake('gnupg-native -c addto_recipe_sysroot') |
20 | if not shutil.which("gpg"): | ||
21 | self.skipTest('gpg binary not found') | ||
22 | 22 | ||
23 | self.gpg_dir = tempfile.mkdtemp(prefix="oeqa-signing-") | 23 | self.gpg_dir = tempfile.mkdtemp(prefix="oeqa-signing-") |
24 | self.track_for_cleanup(self.gpg_dir) | 24 | self.track_for_cleanup(self.gpg_dir) |
@@ -26,7 +26,30 @@ class Signing(OESelftestTestCase): | |||
26 | self.pub_key_path = os.path.join(self.testlayer_path, 'files', 'signing', "key.pub") | 26 | self.pub_key_path = os.path.join(self.testlayer_path, 'files', 'signing', "key.pub") |
27 | self.secret_key_path = os.path.join(self.testlayer_path, 'files', 'signing', "key.secret") | 27 | self.secret_key_path = os.path.join(self.testlayer_path, 'files', 'signing', "key.secret") |
28 | 28 | ||
29 | runCmd('gpg --batch --homedir %s --import %s %s' % (self.gpg_dir, self.pub_key_path, self.secret_key_path)) | 29 | nsysroot = get_bb_var("RECIPE_SYSROOT_NATIVE", "gnupg-native") |
30 | runCmd('gpg --batch --homedir %s --import %s %s' % (self.gpg_dir, self.pub_key_path, self.secret_key_path), native_sysroot=nsysroot) | ||
31 | return nsysroot + get_bb_var("bindir_native") | ||
32 | |||
33 | |||
34 | @contextmanager | ||
35 | def create_new_builddir(self, builddir, newbuilddir): | ||
36 | bb.utils.mkdirhier(newbuilddir) | ||
37 | oe.path.copytree(builddir + "/conf", newbuilddir + "/conf") | ||
38 | oe.path.copytree(builddir + "/cache", newbuilddir + "/cache") | ||
39 | |||
40 | origenv = os.environ.copy() | ||
41 | |||
42 | for e in os.environ: | ||
43 | if builddir in os.environ[e]: | ||
44 | os.environ[e] = os.environ[e].replace(builddir, newbuilddir) | ||
45 | |||
46 | os.chdir(newbuilddir) | ||
47 | try: | ||
48 | yield | ||
49 | finally: | ||
50 | for e in origenv: | ||
51 | os.environ[e] = origenv[e] | ||
52 | os.chdir(builddir) | ||
30 | 53 | ||
31 | @OETestID(1362) | 54 | @OETestID(1362) |
32 | def test_signing_packages(self): | 55 | def test_signing_packages(self): |
@@ -105,13 +128,12 @@ class Signing(OESelftestTestCase): | |||
105 | 128 | ||
106 | test_recipe = 'ed' | 129 | test_recipe = 'ed' |
107 | 130 | ||
108 | builddir = os.environ.get('BUILDDIR') | 131 | # Since we need gpg but we can't use gpg-native for sstate signatures, we |
132 | # build gpg-native in our original builddir then run the tests in a second one. | ||
133 | builddir = os.environ.get('BUILDDIR') + "-testsign" | ||
109 | sstatedir = os.path.join(builddir, 'test-sstate') | 134 | sstatedir = os.path.join(builddir, 'test-sstate') |
110 | 135 | ||
111 | self.setup_gpg() | 136 | nsysroot = self.setup_gpg() |
112 | |||
113 | self.add_command_to_tearDown('bitbake -c clean %s' % test_recipe) | ||
114 | self.add_command_to_tearDown('rm -rf %s' % sstatedir) | ||
115 | 137 | ||
116 | feature = 'SSTATE_SIG_KEY ?= "testuser"\n' | 138 | feature = 'SSTATE_SIG_KEY ?= "testuser"\n' |
117 | feature += 'SSTATE_SIG_PASSPHRASE ?= "test123"\n' | 139 | feature += 'SSTATE_SIG_PASSPHRASE ?= "test123"\n' |
@@ -123,19 +145,26 @@ class Signing(OESelftestTestCase): | |||
123 | 145 | ||
124 | self.write_config(feature) | 146 | self.write_config(feature) |
125 | 147 | ||
126 | bitbake('-c clean %s' % test_recipe) | 148 | with self.create_new_builddir(os.environ['BUILDDIR'], builddir): |
127 | bitbake(test_recipe) | 149 | |
150 | os.environ["PATH"] = nsysroot + ":" + os.environ["PATH"] | ||
151 | self.add_command_to_tearDown('bitbake -c clean %s' % test_recipe) | ||
152 | self.add_command_to_tearDown('rm -rf %s' % sstatedir) | ||
153 | self.add_command_to_tearDown('rm -rf %s' % builddir) | ||
154 | |||
155 | bitbake('-c clean %s' % test_recipe) | ||
156 | bitbake(test_recipe) | ||
128 | 157 | ||
129 | recipe_sig = glob.glob(sstatedir + '/*/*:ed:*_package.tgz.sig') | 158 | recipe_sig = glob.glob(sstatedir + '/*/*:ed:*_package.tgz.sig') |
130 | recipe_tgz = glob.glob(sstatedir + '/*/*:ed:*_package.tgz') | 159 | recipe_tgz = glob.glob(sstatedir + '/*/*:ed:*_package.tgz') |
131 | 160 | ||
132 | self.assertEqual(len(recipe_sig), 1, 'Failed to find .sig file.') | 161 | self.assertEqual(len(recipe_sig), 1, 'Failed to find .sig file.') |
133 | self.assertEqual(len(recipe_tgz), 1, 'Failed to find .tgz file.') | 162 | self.assertEqual(len(recipe_tgz), 1, 'Failed to find .tgz file.') |
134 | 163 | ||
135 | ret = runCmd('gpg --homedir %s --verify %s %s' % (self.gpg_dir, recipe_sig[0], recipe_tgz[0])) | 164 | ret = runCmd('gpg --homedir %s --verify %s %s' % (self.gpg_dir, recipe_sig[0], recipe_tgz[0])) |
136 | # gpg: Signature made Thu 22 Oct 2015 01:45:09 PM EEST using RSA key ID 61EEFB30 | 165 | # gpg: Signature made Thu 22 Oct 2015 01:45:09 PM EEST using RSA key ID 61EEFB30 |
137 | # gpg: Good signature from "testuser (nocomment) <testuser@email.com>" | 166 | # gpg: Good signature from "testuser (nocomment) <testuser@email.com>" |
138 | self.assertIn('gpg: Good signature from', ret.output, 'Package signed incorrectly.') | 167 | self.assertIn('gpg: Good signature from', ret.output, 'Package signed incorrectly.') |
139 | 168 | ||
140 | 169 | ||
141 | class LockedSignatures(OESelftestTestCase): | 170 | class LockedSignatures(OESelftestTestCase): |