blob: 9c9b4b341111c6519d9fdffdf3f90c583de45145 [file] [log] [blame]
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001from oeqa.selftest.case import OESelftestTestCase
2from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars, runqemu
3from oeqa.utils.sshcontrol import SSHControl
4from oeqa.core.decorator.oeid import OETestID
5import os
6import re
7import tempfile
8import shutil
9
10class TestExport(OESelftestTestCase):
11
12 @classmethod
13 def tearDownClass(cls):
14 runCmd("rm -rf /tmp/sdk")
15 super(TestExport, cls).tearDownClass()
16
17 @OETestID(1499)
18 def test_testexport_basic(self):
19 """
20 Summary: Check basic testexport functionality with only ping test enabled.
21 Expected: 1. testexport directory must be created.
22 2. runexported.py must run without any error/exception.
23 3. ping test must succeed.
24 Product: oe-core
25 Author: Mariano Lopez <mariano.lopez@intel.com>
26 """
27
28 features = 'INHERIT += "testexport"\n'
29 # These aren't the actual IP addresses but testexport class needs something defined
30 features += 'TEST_SERVER_IP = "192.168.7.1"\n'
31 features += 'TEST_TARGET_IP = "192.168.7.1"\n'
32 features += 'TEST_SUITES = "ping"\n'
33 self.write_config(features)
34
35 # Build tesexport for core-image-minimal
36 bitbake('core-image-minimal')
37 bitbake('-c testexport core-image-minimal')
38
39 testexport_dir = get_bb_var('TEST_EXPORT_DIR', 'core-image-minimal')
40
41 # Verify if TEST_EXPORT_DIR was created
42 isdir = os.path.isdir(testexport_dir)
43 self.assertEqual(True, isdir, 'Failed to create testexport dir: %s' % testexport_dir)
44
45 with runqemu('core-image-minimal') as qemu:
46 # Attempt to run runexported.py to perform ping test
47 test_path = os.path.join(testexport_dir, "oe-test")
48 data_file = os.path.join(testexport_dir, 'data', 'testdata.json')
49 manifest = os.path.join(testexport_dir, 'data', 'manifest')
50 cmd = ("%s runtime --test-data-file %s --packages-manifest %s "
51 "--target-ip %s --server-ip %s --quiet"
52 % (test_path, data_file, manifest, qemu.ip, qemu.server_ip))
53 result = runCmd(cmd)
54 # Verify ping test was succesful
55 self.assertEqual(0, result.status, 'oe-test runtime returned a non 0 status')
56
57 @OETestID(1641)
58 def test_testexport_sdk(self):
59 """
60 Summary: Check sdk functionality for testexport.
61 Expected: 1. testexport directory must be created.
62 2. SDK tarball must exists.
63 3. Uncompressing of tarball must succeed.
64 4. Check if the SDK directory is added to PATH.
65 5. Run tar from the SDK directory.
66 Product: oe-core
67 Author: Mariano Lopez <mariano.lopez@intel.com>
68 """
69
70 features = 'INHERIT += "testexport"\n'
71 # These aren't the actual IP addresses but testexport class needs something defined
72 features += 'TEST_SERVER_IP = "192.168.7.1"\n'
73 features += 'TEST_TARGET_IP = "192.168.7.1"\n'
74 features += 'TEST_SUITES = "ping"\n'
75 features += 'TEST_EXPORT_SDK_ENABLED = "1"\n'
76 features += 'TEST_EXPORT_SDK_PACKAGES = "nativesdk-tar"\n'
77 self.write_config(features)
78
79 # Build tesexport for core-image-minimal
80 bitbake('core-image-minimal')
81 bitbake('-c testexport core-image-minimal')
82
83 needed_vars = ['TEST_EXPORT_DIR', 'TEST_EXPORT_SDK_DIR', 'TEST_EXPORT_SDK_NAME']
84 bb_vars = get_bb_vars(needed_vars, 'core-image-minimal')
85 testexport_dir = bb_vars['TEST_EXPORT_DIR']
86 sdk_dir = bb_vars['TEST_EXPORT_SDK_DIR']
87 sdk_name = bb_vars['TEST_EXPORT_SDK_NAME']
88
89 # Check for SDK
90 tarball_name = "%s.sh" % sdk_name
91 tarball_path = os.path.join(testexport_dir, sdk_dir, tarball_name)
92 msg = "Couldn't find SDK tarball: %s" % tarball_path
93 self.assertEqual(os.path.isfile(tarball_path), True, msg)
94
95 # Extract SDK and run tar from SDK
96 result = runCmd("%s -y -d /tmp/sdk" % tarball_path)
97 self.assertEqual(0, result.status, "Couldn't extract SDK")
98
99 env_script = result.output.split()[-1]
100 result = runCmd(". %s; which tar" % env_script, shell=True)
101 self.assertEqual(0, result.status, "Couldn't setup SDK environment")
102 is_sdk_tar = True if "/tmp/sdk" in result.output else False
103 self.assertTrue(is_sdk_tar, "Couldn't setup SDK environment")
104
105 tar_sdk = result.output
106 result = runCmd("%s --version" % tar_sdk)
107 self.assertEqual(0, result.status, "Couldn't run tar from SDK")
108
109
110class TestImage(OESelftestTestCase):
111
112 @OETestID(1644)
113 def test_testimage_install(self):
114 """
115 Summary: Check install packages functionality for testimage/testexport.
116 Expected: 1. Import tests from a directory other than meta.
117 2. Check install/uninstall of socat.
118 Product: oe-core
119 Author: Mariano Lopez <mariano.lopez@intel.com>
120 """
121 if get_bb_var('DISTRO') == 'poky-tiny':
122 self.skipTest('core-image-full-cmdline not buildable for poky-tiny')
123
124 features = 'INHERIT += "testimage"\n'
125 features += 'TEST_SUITES = "ping ssh selftest"\n'
126 self.write_config(features)
127
128 # Build core-image-sato and testimage
129 bitbake('core-image-full-cmdline socat')
130 bitbake('-c testimage core-image-full-cmdline')
131
132 @OETestID(1883)
133 def test_testimage_dnf(self):
134 """
135 Summary: Check package feeds functionality for dnf
136 Expected: 1. Check that remote package feeds can be accessed
137 Product: oe-core
138 Author: Alexander Kanavin <alexander.kanavin@intel.com>
139 """
140 if get_bb_var('DISTRO') == 'poky-tiny':
141 self.skipTest('core-image-full-cmdline not buildable for poky-tiny')
142
143 features = 'INHERIT += "testimage"\n'
144 features += 'TEST_SUITES = "ping ssh dnf_runtime dnf.DnfBasicTest.test_dnf_help"\n'
145 # We don't yet know what the server ip and port will be - they will be patched
146 # in at the start of the on-image test
147 features += 'PACKAGE_FEED_URIS = "http://bogus_ip:bogus_port"\n'
148 features += 'EXTRA_IMAGE_FEATURES += "package-management"\n'
149 features += 'PACKAGE_CLASSES = "package_rpm"\n'
150
151 # Enable package feed signing
152 self.gpg_home = tempfile.mkdtemp(prefix="oeqa-feed-sign-")
153 signing_key_dir = os.path.join(self.testlayer_path, 'files', 'signing')
154 runCmd('gpg --batch --homedir %s --import %s' % (self.gpg_home, os.path.join(signing_key_dir, 'key.secret')))
155 features += 'INHERIT += "sign_package_feed"\n'
156 features += 'PACKAGE_FEED_GPG_NAME = "testuser"\n'
157 features += 'PACKAGE_FEED_GPG_PASSPHRASE_FILE = "%s"\n' % os.path.join(signing_key_dir, 'key.passphrase')
158 features += 'GPG_PATH = "%s"\n' % self.gpg_home
159 self.write_config(features)
160
161 # Build core-image-sato and testimage
162 bitbake('core-image-full-cmdline socat')
163 bitbake('-c testimage core-image-full-cmdline')
164
165 # remove the oeqa-feed-sign temporal directory
166 shutil.rmtree(self.gpg_home, ignore_errors=True)
167
168class Postinst(OESelftestTestCase):
169 @OETestID(1540)
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500170 @OETestID(1545)
171 def test_postinst_rootfs_and_boot(self):
172 """
173 Summary: The purpose of this test case is to verify Post-installation
174 scripts are called when rootfs is created and also test
175 that script can be delayed to run at first boot.
176 Dependencies: NA
177 Steps: 1. Add proper configuration to local.conf file
178 2. Build a "core-image-minimal" image
179 3. Verify that file created by postinst_rootfs recipe is
180 present on rootfs dir.
181 4. Boot the image created on qemu and verify that the file
182 created by postinst_boot recipe is present on image.
183 Expected: The files are successfully created during rootfs and boot
184 time for 3 different package managers: rpm,ipk,deb and
185 for initialization managers: sysvinit and systemd.
186
187 """
Brad Bishop316dfdd2018-06-25 12:45:53 -0400188
189 import oe.path
190
191 vars = get_bb_vars(("IMAGE_ROOTFS", "sysconfdir"), "core-image-minimal")
192 rootfs = vars["IMAGE_ROOTFS"]
193 self.assertIsNotNone(rootfs)
194 sysconfdir = vars["sysconfdir"]
195 self.assertIsNotNone(sysconfdir)
196 # Need to use oe.path here as sysconfdir starts with /
197 hosttestdir = oe.path.join(rootfs, sysconfdir, "postinst-test")
198 targettestdir = os.path.join(sysconfdir, "postinst-test")
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500199
200 for init_manager in ("sysvinit", "systemd"):
201 for classes in ("package_rpm", "package_deb", "package_ipk"):
202 with self.subTest(init_manager=init_manager, package_class=classes):
Brad Bishop316dfdd2018-06-25 12:45:53 -0400203 features = 'CORE_IMAGE_EXTRA_INSTALL = "postinst-delayed-b"\n'
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500204 features += 'IMAGE_FEATURES += "package-management empty-root-password"\n'
205 features += 'PACKAGE_CLASSES = "%s"\n' % classes
206 if init_manager == "systemd":
207 features += 'DISTRO_FEATURES_append = " systemd"\n'
208 features += 'VIRTUAL-RUNTIME_init_manager = "systemd"\n'
209 features += 'DISTRO_FEATURES_BACKFILL_CONSIDERED = "sysvinit"\n'
210 features += 'VIRTUAL-RUNTIME_initscripts = ""\n'
211 self.write_config(features)
212
213 bitbake('core-image-minimal')
214
Brad Bishop316dfdd2018-06-25 12:45:53 -0400215 self.assertTrue(os.path.isfile(os.path.join(hosttestdir, "rootfs")),
216 "rootfs state file was not created")
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500217
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500218 with runqemu('core-image-minimal') as qemu:
Brad Bishop316dfdd2018-06-25 12:45:53 -0400219 # Make the test echo a string and search for that as
220 # run_serial()'s status code is useless.'
221 for filename in ("rootfs", "delayed-a", "delayed-b"):
222 status, output = qemu.run_serial("test -f %s && echo found" % os.path.join(targettestdir, filename))
223 self.assertEqual(output, "found", "%s was not present on boot" % filename)
224
225
226
227 def test_failing_postinst(self):
228 """
229 Summary: The purpose of this test case is to verify that post-installation
230 scripts that contain errors are properly reported.
231 Expected: The scriptlet failure is properly reported.
232 The file that is created after the error in the scriptlet is not present.
233 Product: oe-core
234 Author: Alexander Kanavin <alexander.kanavin@intel.com>
235 """
236
237 import oe.path
238
239 vars = get_bb_vars(("IMAGE_ROOTFS", "sysconfdir"), "core-image-minimal")
240 rootfs = vars["IMAGE_ROOTFS"]
241 self.assertIsNotNone(rootfs)
242 sysconfdir = vars["sysconfdir"]
243 self.assertIsNotNone(sysconfdir)
244 # Need to use oe.path here as sysconfdir starts with /
245 hosttestdir = oe.path.join(rootfs, sysconfdir, "postinst-test")
246
247 for classes in ("package_rpm", "package_deb", "package_ipk"):
248 with self.subTest(package_class=classes):
249 features = 'CORE_IMAGE_EXTRA_INSTALL = "postinst-rootfs-failing"\n'
250 features += 'PACKAGE_CLASSES = "%s"\n' % classes
251 self.write_config(features)
252 bb_result = bitbake('core-image-minimal')
253 self.assertGreaterEqual(bb_result.output.find("Intentionally failing postinstall scriptlets of ['postinst-rootfs-failing'] to defer them to first boot is deprecated."), 0,
254 "Warning about a failed scriptlet not found in bitbake output: %s" %(bb_result.output))
255
256 self.assertTrue(os.path.isfile(os.path.join(hosttestdir, "rootfs-before-failure")),
257 "rootfs-before-failure file was not created")
258 self.assertFalse(os.path.isfile(os.path.join(hosttestdir, "rootfs-after-failure")),
259 "rootfs-after-failure file was created")
260