summaryrefslogtreecommitdiffstats
path: root/meta/lib/oeqa/selftest/imagefeatures.py
diff options
context:
space:
mode:
authorDaniel Istrate <daniel.alexandrux.istrate@intel.com>2015-07-21 15:54:40 +0300
committerRichard Purdie <richard.purdie@linuxfoundation.org>2015-07-21 23:56:17 +0100
commitd6fa512d90c6baabda6fb3daa1f9ca3da2b08a79 (patch)
tree3eb2933978d4d139b91a1f77c63b58a03f2faed0 /meta/lib/oeqa/selftest/imagefeatures.py
parentaa05be4882eed830c2fc91f93653223edfab2a0c (diff)
downloadpoky-d6fa512d90c6baabda6fb3daa1f9ca3da2b08a79.tar.gz
oeqa/selftest: Fix imagefeature testcases not to interfere with testimage on AB
[YOCTO #8017] - selftest does not use pkill qemu [YOCTO #7976] - tests do not touch .ssh/known_hosts - don't hardcode qemu IP [YOCTO #8027] - use qemu nographic Extra: removed unnecessary assert for bitbake and runCmd status (From OE-Core rev: f58df3a630b774083934171463b2b07add29dc0e) Signed-off-by: Daniel Istrate <daniel.alexandrux.istrate@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/lib/oeqa/selftest/imagefeatures.py')
-rw-r--r--meta/lib/oeqa/selftest/imagefeatures.py148
1 files changed, 48 insertions, 100 deletions
diff --git a/meta/lib/oeqa/selftest/imagefeatures.py b/meta/lib/oeqa/selftest/imagefeatures.py
index e0e424dada..70ebbe4321 100644
--- a/meta/lib/oeqa/selftest/imagefeatures.py
+++ b/meta/lib/oeqa/selftest/imagefeatures.py
@@ -2,13 +2,20 @@ from oeqa.selftest.base import oeSelfTest
2from oeqa.utils.commands import runCmd, bitbake, get_bb_var 2from oeqa.utils.commands import runCmd, bitbake, get_bb_var
3from oeqa.utils.decorators import testcase 3from oeqa.utils.decorators import testcase
4import pexpect 4import pexpect
5from os.path import expanduser, isfile 5from os.path import isfile
6from os import system 6from os import system, killpg
7import glob 7import glob
8import signal
8 9
9 10
10class ImageFeatures(oeSelfTest): 11class ImageFeatures(oeSelfTest):
11 12
13 test_user = 'tester'
14 root_user = 'root'
15 prompt = r'qemux86:\S+[$#]\s+'
16 ssh_cmd = "ssh {} -l {} -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no"
17 get_ip_patt = r'\s+ip=(?P<qemu_ip>(\d+.){3}\d+)::'
18
12 @testcase(1107) 19 @testcase(1107)
13 def test_non_root_user_can_connect_via_ssh_without_password(self): 20 def test_non_root_user_can_connect_via_ssh_without_password(self):
14 """ 21 """
@@ -20,69 +27,45 @@ class ImageFeatures(oeSelfTest):
20 AutomatedBy: Daniel Istrate <daniel.alexandrux.istrate@intel.com> 27 AutomatedBy: Daniel Istrate <daniel.alexandrux.istrate@intel.com>
21 """ 28 """
22 29
23 test_user = 'tester'
24 root_user = 'root'
25 prompt = r'qemux86:\S+[$#]\s+'
26 tap_inf_ip = '192.168.7.2'
27
28 features = 'EXTRA_IMAGE_FEATURES += "ssh-server-openssh empty-root-password"\n' 30 features = 'EXTRA_IMAGE_FEATURES += "ssh-server-openssh empty-root-password"\n'
29 features += 'INHERIT += "extrausers"\n' 31 features += 'INHERIT += "extrausers"\n'
30 features += 'EXTRA_USERS_PARAMS = "useradd -p \'\' {}; usermod -s /bin/sh {};"'.format(test_user, test_user) 32 features += 'EXTRA_USERS_PARAMS = "useradd -p \'\' {}; usermod -s /bin/sh {};"'.format(self.test_user, self.test_user)
31 33
32 # Append 'features' to local.conf 34 # Append 'features' to local.conf
33 self.append_config(features) 35 self.append_config(features)
34 36
35 # Build a core-image-minimal 37 # Build a core-image-minimal
36 ret = bitbake('core-image-minimal') 38 bitbake('core-image-minimal')
37 self.assertEqual(0, ret.status, 'Failed to build a core-image-minimal')
38
39 rm_ssh_keys_cmd = 'ssh-keygen -f "{}/.ssh/known_hosts" -R {}'.format(expanduser('~'), tap_inf_ip)
40 # Delete the ssh keys for 192.168.7.2 (qemu)
41 ret = runCmd(rm_ssh_keys_cmd)
42 self.assertEqual(0, ret.status, 'Failed to delete ssh keys for qemu host.')
43 39
44 # Boot qemu image 40 # Boot qemu image
45 proc_qemu = pexpect.spawn('runqemu qemux86 nographic') 41 proc_qemu = pexpect.spawn('runqemu qemux86 nographic')
46 try: 42 try:
43 proc_qemu.expect(self.get_ip_patt, timeout=100)
44 qemu_ip = proc_qemu.match.group('qemu_ip')
47 proc_qemu.expect('qemux86 login:', timeout=100) 45 proc_qemu.expect('qemux86 login:', timeout=100)
48 except: 46 except:
49 system('pkill qemu') 47 killpg(proc_qemu.pid, signal.SIGTERM)
50 proc_qemu.close()
51 self.fail('Failed to start qemu.') 48 self.fail('Failed to start qemu.')
52 49
53 # Attempt to ssh with each user into qemu with empty password 50 # Attempt to ssh with each user into qemu with empty password
54 for user in [root_user, test_user]: 51 for user in [self.root_user, self.test_user]:
55 proc_ssh = pexpect.spawn('ssh {} -l {}'.format(tap_inf_ip, user)) 52 proc_ssh = pexpect.spawn(self.ssh_cmd.format(qemu_ip, user))
56 index = proc_ssh.expect(['Are you sure you want to continue connecting', prompt, pexpect.TIMEOUT, pexpect.EOF]) 53 index = proc_ssh.expect([self.prompt, pexpect.TIMEOUT, pexpect.EOF])
57 if index == 0: 54 if index == 0:
58 proc_ssh.sendline('yes')
59 try:
60 proc_ssh.expect(prompt)
61 except:
62 system('pkill qemu')
63 proc_qemu.close()
64 proc_ssh.terminate()
65 self.fail('Failed to ssh with {} user into qemu.'.format(user))
66 elif index == 1:
67 # user successfully logged in with empty password 55 # user successfully logged in with empty password
68 pass 56 pass
69 elif index == 2: 57 elif index == 1:
70 system('pkill qemu') 58 killpg(proc_qemu.pid, signal.SIGTERM)
71 proc_qemu.close()
72 proc_ssh.terminate() 59 proc_ssh.terminate()
73 self.fail('Failed to ssh with {} user into qemu (timeout).'.format(user)) 60 self.fail('Failed to ssh with {} user into qemu (timeout).'.format(user))
74 else: 61 else:
75 system('pkill qemu') 62 killpg(proc_qemu.pid, signal.SIGTERM)
76 proc_qemu.close()
77 proc_ssh.terminate() 63 proc_ssh.terminate()
78 self.fail('Failed to ssh with {} user into qemu (eof).'.format(user)) 64 self.fail('Failed to ssh with {} user into qemu (eof).'.format(user))
65 proc_ssh.terminate()
79 66
80 # Cleanup 67 # Cleanup
81 system('pkill qemu') 68 killpg(proc_qemu.pid, signal.SIGTERM)
82 proc_qemu.close()
83 proc_ssh.terminate()
84 ret = runCmd(rm_ssh_keys_cmd)
85 self.assertEqual(0, ret.status, 'Failed to delete ssh keys for qemu host (at cleanup).')
86 69
87 @testcase(1115) 70 @testcase(1115)
88 def test_all_users_can_connect_via_ssh_without_password(self): 71 def test_all_users_can_connect_via_ssh_without_password(self):
@@ -93,69 +76,46 @@ class ImageFeatures(oeSelfTest):
93 Author: Ionut Chisanovici <ionutx.chisanovici@intel.com> 76 Author: Ionut Chisanovici <ionutx.chisanovici@intel.com>
94 AutomatedBy: Daniel Istrate <daniel.alexandrux.istrate@intel.com> 77 AutomatedBy: Daniel Istrate <daniel.alexandrux.istrate@intel.com>
95 """ 78 """
96 test_user = 'tester'
97 root_user = 'root'
98 prompt = r'qemux86:\S+[$#]\s+'
99 tap_inf_ip = '192.168.7.2'
100 79
101 features = 'EXTRA_IMAGE_FEATURES += "ssh-server-openssh allow-empty-password"\n' 80 features = 'EXTRA_IMAGE_FEATURES += "ssh-server-openssh allow-empty-password"\n'
102 features += 'INHERIT += "extrausers"\n' 81 features += 'INHERIT += "extrausers"\n'
103 features += 'EXTRA_USERS_PARAMS = "useradd -p \'\' {}; usermod -s /bin/sh {};"'.format(test_user, test_user) 82 features += 'EXTRA_USERS_PARAMS = "useradd -p \'\' {}; usermod -s /bin/sh {};"'.format(self.test_user, self.test_user)
104 83
105 # Append 'features' to local.conf 84 # Append 'features' to local.conf
106 self.append_config(features) 85 self.append_config(features)
107 86
108 # Build a core-image-minimal 87 # Build a core-image-minimal
109 ret = bitbake('core-image-minimal') 88 bitbake('core-image-minimal')
110 self.assertEqual(0, ret.status, 'Failed to build a core-image-minimal')
111
112 rm_ssh_keys_cmd = 'ssh-keygen -f "{}/.ssh/known_hosts" -R {}'.format(expanduser('~'), tap_inf_ip)
113 # Delete the ssh keys for 192.168.7.2 (qemu)
114 ret = runCmd(rm_ssh_keys_cmd)
115 self.assertEqual(0, ret.status, 'Failed to delete ssh keys for qemu host.')
116 89
117 # Boot qemu image 90 # Boot qemu image
118 proc_qemu = pexpect.spawn('runqemu qemux86 nographic') 91 proc_qemu = pexpect.spawn('runqemu qemux86 nographic')
119 try: 92 try:
93 proc_qemu.expect(self.get_ip_patt, timeout=100)
94 qemu_ip = proc_qemu.match.group('qemu_ip')
120 proc_qemu.expect('qemux86 login:', timeout=100) 95 proc_qemu.expect('qemux86 login:', timeout=100)
121 except: 96 except:
122 system('pkill qemu') 97 killpg(proc_qemu.pid, signal.SIGTERM)
123 proc_qemu.close()
124 self.fail('Failed to start qemu.') 98 self.fail('Failed to start qemu.')
125 99
126 # Attempt to ssh with each user into qemu with empty password 100 # Attempt to ssh with each user into qemu with empty password
127 for user in [root_user, test_user]: 101 for user in [self.root_user, self.test_user]:
128 proc_ssh = pexpect.spawn('ssh {} -l {}'.format(tap_inf_ip, user)) 102 proc_ssh = pexpect.spawn(self.ssh_cmd.format(qemu_ip, user))
129 index = proc_ssh.expect(['Are you sure you want to continue connecting', prompt, pexpect.TIMEOUT, pexpect.EOF]) 103 index = proc_ssh.expect([self.prompt, pexpect.TIMEOUT, pexpect.EOF])
130 if index == 0: 104 if index == 0:
131 proc_ssh.sendline('yes')
132 try:
133 proc_ssh.expect(prompt)
134 except:
135 system('pkill qemu')
136 proc_qemu.close()
137 proc_ssh.terminate()
138 self.fail('Failed to ssh with {} user into qemu.'.format(user))
139 elif index == 1:
140 # user successfully logged in with empty password 105 # user successfully logged in with empty password
141 pass 106 pass
142 elif index == 2: 107 elif index == 1:
143 system('pkill qemu') 108 killpg(proc_qemu.pid, signal.SIGTERM)
144 proc_qemu.close()
145 proc_ssh.terminate() 109 proc_ssh.terminate()
146 self.fail('Failed to ssh with {} user into qemu (timeout).'.format(user)) 110 self.fail('Failed to ssh with {} user into qemu (timeout).'.format(user))
147 else: 111 else:
148 system('pkill qemu') 112 killpg(proc_qemu.pid, signal.SIGTERM)
149 proc_qemu.close()
150 proc_ssh.terminate() 113 proc_ssh.terminate()
151 self.fail('Failed to ssh with {} user into qemu (eof).'.format(user)) 114 self.fail('Failed to ssh with {} user into qemu (eof).'.format(user))
115 proc_ssh.terminate()
152 116
153 # Cleanup 117 # Cleanup
154 system('pkill qemu') 118 killpg(proc_qemu.pid, signal.SIGTERM)
155 proc_qemu.close()
156 proc_ssh.terminate()
157 ret = runCmd(rm_ssh_keys_cmd)
158 self.assertEqual(0, ret.status, 'Failed to delete ssh keys for qemu host (at cleanup).')
159 119
160 @testcase(1114) 120 @testcase(1114)
161 def test_rpm_version_4_support_on_image(self): 121 def test_rpm_version_4_support_on_image(self):
@@ -167,8 +127,6 @@ class ImageFeatures(oeSelfTest):
167 AutomatedBy: Daniel Istrate <daniel.alexandrux.istrate@intel.com> 127 AutomatedBy: Daniel Istrate <daniel.alexandrux.istrate@intel.com>
168 """ 128 """
169 129
170 root_user = 'root'
171 prompt = '{}@qemux86:~# '.format(root_user)
172 rpm_version = '4.11.2' 130 rpm_version = '4.11.2'
173 features = 'IMAGE_INSTALL_append = " rpm"\n' 131 features = 'IMAGE_INSTALL_append = " rpm"\n'
174 features += 'PREFERRED_VERSION_rpm = "{}"\n'.format(rpm_version) 132 features += 'PREFERRED_VERSION_rpm = "{}"\n'.format(rpm_version)
@@ -179,33 +137,28 @@ class ImageFeatures(oeSelfTest):
179 self.append_config(features) 137 self.append_config(features)
180 138
181 # Build a core-image-minimal 139 # Build a core-image-minimal
182 ret = bitbake('core-image-minimal') 140 bitbake('core-image-minimal')
183 self.assertEqual(0, ret.status, 'Failed to build a core-image-minimal')
184 141
185 # Boot qemu image & get rpm version 142 # Boot qemu image & get rpm version
186 proc_qemu = pexpect.spawn('runqemu qemux86 nographic') 143 proc_qemu = pexpect.spawn('runqemu qemux86 nographic')
187 try: 144 try:
188 proc_qemu.expect('qemux86 login:', timeout=100) 145 proc_qemu.expect('qemux86 login:', timeout=100)
189 proc_qemu.sendline(root_user) 146 proc_qemu.sendline(self.root_user)
190 proc_qemu.expect(prompt) 147 proc_qemu.expect(self.prompt)
191 proc_qemu.sendline('rpm --version') 148 proc_qemu.sendline('rpm --version')
192 proc_qemu.expect(prompt) 149 proc_qemu.expect(self.prompt)
193 except: 150 except:
194 system('pkill qemu') 151 killpg(proc_qemu.pid, signal.SIGTERM)
195 proc_qemu.close()
196 self.fail('Failed to boot qemu.') 152 self.fail('Failed to boot qemu.')
197 153
198 found_rpm_version = proc_qemu.before 154 found_rpm_version = proc_qemu.before
199 155
200 # Make sure the retrieved rpm version is the expected one 156 # Make sure the retrieved rpm version is the expected one
201 if rpm_version not in found_rpm_version: 157 self.assertIn(rpm_version, found_rpm_version,
202 system('pkill qemu') 158 'RPM version is not {}, found instead {}.'.format(rpm_version, found_rpm_version))
203 proc_qemu.close()
204 self.fail('RPM version is not {}, found instead {}.'.format(rpm_version, found_rpm_version))
205 159
206 # Cleanup (close qemu) 160 # Cleanup (close qemu)
207 system('pkill qemu') 161 killpg(proc_qemu.pid, signal.SIGTERM)
208 proc_qemu.close()
209 162
210 @testcase(1116) 163 @testcase(1116)
211 def test_clutter_image_can_be_built(self): 164 def test_clutter_image_can_be_built(self):
@@ -218,8 +171,7 @@ class ImageFeatures(oeSelfTest):
218 """ 171 """
219 172
220 # Build a core-image-clutter 173 # Build a core-image-clutter
221 ret = bitbake('core-image-clutter') 174 bitbake('core-image-clutter')
222 self.assertEqual(0, ret.status, 'Failed to build core-image-clutter')
223 175
224 @testcase(1117) 176 @testcase(1117)
225 def test_wayland_support_in_image(self): 177 def test_wayland_support_in_image(self):
@@ -239,8 +191,7 @@ class ImageFeatures(oeSelfTest):
239 self.append_config(features) 191 self.append_config(features)
240 192
241 # Build a core-image-weston 193 # Build a core-image-weston
242 ret = bitbake('core-image-weston') 194 bitbake('core-image-weston')
243 self.assertEqual(0, ret.status, 'Failed to build a core-image-weston')
244 195
245 196
246class Gummiboot(oeSelfTest): 197class Gummiboot(oeSelfTest):
@@ -263,8 +214,7 @@ class Gummiboot(oeSelfTest):
263 self.add_command_to_tearDown('rm -rf ' + self.meta_intel_dir) 214 self.add_command_to_tearDown('rm -rf ' + self.meta_intel_dir)
264 215
265 # Clone meta-intel 216 # Clone meta-intel
266 ret = runCmd('git clone ' + meta_intel_repo + ' ' + self.meta_intel_dir) 217 runCmd('git clone ' + meta_intel_repo + ' ' + self.meta_intel_dir)
267 self.assertEqual(0, ret.status, 'Failed to clone meta-intel.')
268 218
269 # Add meta-intel and meta-nuc layers in conf/bblayers.conf 219 # Add meta-intel and meta-nuc layers in conf/bblayers.conf
270 features = 'BBLAYERS += "' + self.meta_intel_dir + ' ' + meta_nuc_dir + '"' 220 features = 'BBLAYERS += "' + self.meta_intel_dir + ' ' + meta_nuc_dir + '"'
@@ -278,8 +228,7 @@ class Gummiboot(oeSelfTest):
278 # Run "bitbake syslinux syslinux-native parted-native dosfstools-native mtools-native core-image-minimal " 228 # Run "bitbake syslinux syslinux-native parted-native dosfstools-native mtools-native core-image-minimal "
279 # to build a nuc/efi gummiboot image 229 # to build a nuc/efi gummiboot image
280 230
281 ret = bitbake('syslinux syslinux-native parted-native dosfstools-native mtools-native core-image-minimal') 231 bitbake('syslinux syslinux-native parted-native dosfstools-native mtools-native core-image-minimal')
282 self.assertEqual(0, ret.status, 'Failed to build a core-image-minimal')
283 232
284 @testcase(1101) 233 @testcase(1101)
285 def test_efi_gummiboot_images_can_be_build(self): 234 def test_efi_gummiboot_images_can_be_build(self):
@@ -310,8 +259,7 @@ class Gummiboot(oeSelfTest):
310 259
311 # Create efi/gummiboot installation images 260 # Create efi/gummiboot installation images
312 wic_create_cmd = 'wic create mkgummidisk -e core-image-minimal' 261 wic_create_cmd = 'wic create mkgummidisk -e core-image-minimal'
313 ret = runCmd(wic_create_cmd) 262 runCmd(wic_create_cmd)
314 self.assertEqual(0, ret.status, 'Failed to create efi/gummiboot installation images.')
315 263
316 # Verify that a .direct file was created 264 # Verify that a .direct file was created
317 direct_file = '/var/tmp/wic/build/*.direct' 265 direct_file = '/var/tmp/wic/build/*.direct'