<div dir="ltr">Instead of expecting a future developer to read the patch to see what happened, please explain what the new test cases are in the commit log.<div><br></div><div>Ross</div></div><div class="gmail_extra"><br><div class="gmail_quote">On 22 June 2015 at 10:28, Daniel Istrate <span dir="ltr"><<a href="mailto:daniel.alexandrux.istrate@intel.com" target="_blank">daniel.alexandrux.istrate@intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Signed-off-by: Daniel Istrate <<a href="mailto:daniel.alexandrux.istrate@intel.com">daniel.alexandrux.istrate@intel.com</a>><br>
---<br>
meta/lib/oeqa/selftest/imagefeatures.py | 206 ++++++++++++++++++++++++++++++++<br>
1 file changed, 206 insertions(+)<br>
create mode 100644 meta/lib/oeqa/selftest/imagefeatures.py<br>
<br>
diff --git a/meta/lib/oeqa/selftest/imagefeatures.py b/meta/lib/oeqa/selftest/imagefeatures.py<br>
new file mode 100644<br>
index 0000000..f697956<br>
--- /dev/null<br>
+++ b/meta/lib/oeqa/selftest/imagefeatures.py<br>
@@ -0,0 +1,206 @@<br>
+from oeqa.selftest.base import oeSelfTest<br>
+from oeqa.utils.commands import runCmd, bitbake<br>
+from oeqa.utils.decorators import testcase<br>
+import pexpect<br>
+from os.path import expanduser<br>
+from os import system<br>
+<br>
+class ImageFeatures(oeSelfTest):<br>
+<br>
+ @testcase(1107)<br>
+ def test_non_root_user_can_connect_via_ssh_without_password(self):<br>
+ """<br>
+ Summary: Check if non root user can connect via ssh without password<br>
+ Expected: 1. Connection to the image via ssh using root user without providing a password should be allowed.<br>
+ 2. Connection to the image via ssh using tester user without providing a password should be allowed.<br>
+ Product: oe-core<br>
+ Author: Ionut Chisanovici <<a href="mailto:ionutx.chisanovici@intel.com">ionutx.chisanovici@intel.com</a>><br>
+ AutomatedBy: Daniel Istrate <<a href="mailto:daniel.alexandrux.istrate@intel.com">daniel.alexandrux.istrate@intel.com</a>><br>
+ """<br>
+<br>
+ test_user = 'tester'<br>
+ root_user = 'root'<br>
+ prompt = r'qemux86:\S+[$#]\s+'<br>
+ tap_inf_ip = '192.168.7.2'<br>
+<br>
+ features = 'EXTRA_IMAGE_FEATURES += "ssh-server-openssh empty-root-password"\n'<br>
+ features += 'INHERIT += "extrausers"\n'<br>
+ features += 'EXTRA_USERS_PARAMS = "useradd -p \'\' {}; usermod -s /bin/sh {};"'.format(test_user, test_user)<br>
+<br>
+ # Append 'features' to local.conf<br>
+ self.append_config(features)<br>
+<br>
+ # Build a core-image-minimal<br>
+ ret = bitbake('core-image-minimal')<br>
+ self.assertEqual(0, ret.status, 'Failed to build a core-image-minimal')<br>
+<br>
+ rm_ssh_keys_cmd = 'ssh-keygen -f "{}/.ssh/known_hosts" -R {}'.format(expanduser('~'), tap_inf_ip)<br>
+ # Delete the ssh keys for 192.168.7.2 (qemu)<br>
+ ret = runCmd(rm_ssh_keys_cmd)<br>
+ self.assertEqual(0, ret.status, 'Failed to delete ssh keys for qemu host.')<br>
+<br>
+ # Boot qemu image<br>
+ proc_qemu = pexpect.spawn('runqemu qemux86 nographic')<br>
+ try:<br>
+ proc_qemu.expect('qemux86 login:', timeout=100)<br>
+ except:<br>
+ system('pkill qemu')<br>
+ proc_qemu.close()<br>
+ self.fail('Failed to start qemu.')<br>
+<br>
+ # Attempt to ssh with each user into qemu with empty password<br>
+ for user in [root_user, test_user]:<br>
+ proc_ssh = pexpect.spawn('ssh {} -l {}'.format(tap_inf_ip, user))<br>
+ index = proc_ssh.expect(['Are you sure you want to continue connecting', prompt, pexpect.TIMEOUT, pexpect.EOF])<br>
+ if index == 0:<br>
+ proc_ssh.sendline('yes')<br>
+ try:<br>
+ proc_ssh.expect(prompt)<br>
+ except:<br>
+ system('pkill qemu')<br>
+ proc_qemu.close()<br>
+ proc_ssh.terminate()<br>
+ self.fail('Failed to ssh with {} user into qemu.'.format(user))<br>
+ elif index == 1:<br>
+ # user successfully logged in with empty password<br>
+ pass<br>
+ elif index == 2:<br>
+ system('pkill qemu')<br>
+ proc_qemu.close()<br>
+ proc_ssh.terminate()<br>
+ self.fail('Failed to ssh with {} user into qemu (timeout).'.format(user))<br>
+ else:<br>
+ system('pkill qemu')<br>
+ proc_qemu.close()<br>
+ proc_ssh.terminate()<br>
+ self.fail('Failed to ssh with {} user into qemu (eof).'.format(user))<br>
+<br>
+ # Cleanup<br>
+ system('pkill qemu')<br>
+ proc_qemu.close()<br>
+ proc_ssh.terminate()<br>
+ ret = runCmd(rm_ssh_keys_cmd)<br>
+ self.assertEqual(0, ret.status, 'Failed to delete ssh keys for qemu host (at cleanup).')<br>
+<br>
+ @testcase(1115)<br>
+ def test_all_users_can_connect_via_ssh_without_password(self):<br>
+ """<br>
+ Summary: Check if all users can connect via ssh without password<br>
+ Expected: 1. Connection to the image via ssh using root or tester user without providing a password should be allowed.<br>
+ Product: oe-core<br>
+ Author: Ionut Chisanovici <<a href="mailto:ionutx.chisanovici@intel.com">ionutx.chisanovici@intel.com</a>><br>
+ AutomatedBy: Daniel Istrate <<a href="mailto:daniel.alexandrux.istrate@intel.com">daniel.alexandrux.istrate@intel.com</a>><br>
+ """<br>
+ test_user = 'tester'<br>
+ root_user = 'root'<br>
+ prompt = r'qemux86:\S+[$#]\s+'<br>
+ tap_inf_ip = '192.168.7.2'<br>
+<br>
+ features = 'EXTRA_IMAGE_FEATURES += "ssh-server-openssh allow-empty-password"\n'<br>
+ features += 'INHERIT += "extrausers"\n'<br>
+ features += 'EXTRA_USERS_PARAMS = "useradd -p \'\' {}; usermod -s /bin/sh {};"'.format(test_user, test_user)<br>
+<br>
+ # Append 'features' to local.conf<br>
+ self.append_config(features)<br>
+<br>
+ # Build a core-image-minimal<br>
+ ret = bitbake('core-image-minimal')<br>
+ self.assertEqual(0, ret.status, 'Failed to build a core-image-minimal')<br>
+<br>
+ rm_ssh_keys_cmd = 'ssh-keygen -f "{}/.ssh/known_hosts" -R {}'.format(expanduser('~'), tap_inf_ip)<br>
+ # Delete the ssh keys for 192.168.7.2 (qemu)<br>
+ ret = runCmd(rm_ssh_keys_cmd)<br>
+ self.assertEqual(0, ret.status, 'Failed to delete ssh keys for qemu host.')<br>
+<br>
+ # Boot qemu image<br>
+ proc_qemu = pexpect.spawn('runqemu qemux86 nographic')<br>
+ try:<br>
+ proc_qemu.expect('qemux86 login:', timeout=100)<br>
+ except:<br>
+ system('pkill qemu')<br>
+ proc_qemu.close()<br>
+ self.fail('Failed to start qemu.')<br>
+<br>
+ # Attempt to ssh with each user into qemu with empty password<br>
+ for user in [root_user, test_user]:<br>
+ proc_ssh = pexpect.spawn('ssh {} -l {}'.format(tap_inf_ip, user))<br>
+ index = proc_ssh.expect(['Are you sure you want to continue connecting', prompt, pexpect.TIMEOUT, pexpect.EOF])<br>
+ if index == 0:<br>
+ proc_ssh.sendline('yes')<br>
+ try:<br>
+ proc_ssh.expect(prompt)<br>
+ except:<br>
+ system('pkill qemu')<br>
+ proc_qemu.close()<br>
+ proc_ssh.terminate()<br>
+ self.fail('Failed to ssh with {} user into qemu.'.format(user))<br>
+ elif index == 1:<br>
+ # user successfully logged in with empty password<br>
+ pass<br>
+ elif index == 2:<br>
+ system('pkill qemu')<br>
+ proc_qemu.close()<br>
+ proc_ssh.terminate()<br>
+ self.fail('Failed to ssh with {} user into qemu (timeout).'.format(user))<br>
+ else:<br>
+ system('pkill qemu')<br>
+ proc_qemu.close()<br>
+ proc_ssh.terminate()<br>
+ self.fail('Failed to ssh with {} user into qemu (eof).'.format(user))<br>
+<br>
+ # Cleanup<br>
+ system('pkill qemu')<br>
+ proc_qemu.close()<br>
+ proc_ssh.terminate()<br>
+ ret = runCmd(rm_ssh_keys_cmd)<br>
+ self.assertEqual(0, ret.status, 'Failed to delete ssh keys for qemu host (at cleanup).')<br>
+<br>
+ @testcase(1114)<br>
+ def test_rpm_version_4_support_on_image(self):<br>
+ """<br>
+ Summary: Check rpm version 4 support on image<br>
+ Expected: Rpm version must be 4.11.2<br>
+ Product: oe-core<br>
+ Author: Ionut Chisanovici <<a href="mailto:ionutx.chisanovici@intel.com">ionutx.chisanovici@intel.com</a>><br>
+ AutomatedBy: Daniel Istrate <<a href="mailto:daniel.alexandrux.istrate@intel.com">daniel.alexandrux.istrate@intel.com</a>><br>
+ """<br>
+<br>
+ root_user = 'root'<br>
+ prompt = '{}@qemux86:~# '.format(root_user)<br>
+ rpm_version = '4.11.2'<br>
+ features = 'IMAGE_INSTALL_append = " rpm"\n'<br>
+ features += 'PREFERRED_VERSION_rpm = "{}"\n'.format(rpm_version)<br>
+ features += 'PREFERRED_VERSION_rpm-native = "{}"\n'.format(rpm_version)<br>
+ features += 'RPMROOTFSDEPENDS_remove = "rpmresolve-native:do_populate_sysroot"'<br>
+<br>
+ # Append 'features' to local.conf<br>
+ self.append_config(features)<br>
+<br>
+ # Build a core-image-minimal<br>
+ ret = bitbake('core-image-minimal')<br>
+ self.assertEqual(0, ret.status, 'Failed to build a core-image-minimal')<br>
+<br>
+ # Boot qemu image & get rpm version<br>
+ proc_qemu = pexpect.spawn('runqemu qemux86 nographic')<br>
+ try:<br>
+ proc_qemu.expect('qemux86 login:', timeout=100)<br>
+ proc_qemu.sendline(root_user)<br>
+ proc_qemu.expect(prompt)<br>
+ proc_qemu.sendline('rpm --version')<br>
+ proc_qemu.expect(prompt)<br>
+ except:<br>
+ system('pkill qemu')<br>
+ proc_qemu.close()<br>
+ self.fail('Failed to boot qemu.')<br>
+<br>
+ found_rpm_version = proc_qemu.before<br>
+<br>
+ # Make sure the retrieved rpm version is the expected one<br>
+ if rpm_version not in found_rpm_version:<br>
+ system('pkill qemu')<br>
+ proc_qemu.close()<br>
+ self.fail('RPM version is not {}, found instead {}.'.format(rpm_version, found_rpm_version))<br>
+<br>
+ # Cleanup (close qemu)<br>
+ system('pkill qemu')<br>
+ proc_qemu.close()<br>
\ No newline at end of file<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.1.4<br>
<br>
--<br>
_______________________________________________<br>
Openembedded-core mailing list<br>
<a href="mailto:Openembedded-core@lists.openembedded.org">Openembedded-core@lists.openembedded.org</a><br>
<a href="http://lists.openembedded.org/mailman/listinfo/openembedded-core" rel="noreferrer" target="_blank">http://lists.openembedded.org/mailman/listinfo/openembedded-core</a><br>
</font></span></blockquote></div><br></div>