diff options
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): |