<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">&lt;<a href="mailto:daniel.alexandrux.istrate@intel.com" target="_blank">daniel.alexandrux.istrate@intel.com</a>&gt;</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 &lt;<a href="mailto:daniel.alexandrux.istrate@intel.com">daniel.alexandrux.istrate@intel.com</a>&gt;<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>
+        &quot;&quot;&quot;<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 &lt;<a href="mailto:ionutx.chisanovici@intel.com">ionutx.chisanovici@intel.com</a>&gt;<br>
+        AutomatedBy: Daniel Istrate &lt;<a href="mailto:daniel.alexandrux.istrate@intel.com">daniel.alexandrux.istrate@intel.com</a>&gt;<br>
+        &quot;&quot;&quot;<br>
+<br>
+        test_user = &#39;tester&#39;<br>
+        root_user = &#39;root&#39;<br>
+        prompt = r&#39;qemux86:\S+[$#]\s+&#39;<br>
+        tap_inf_ip = &#39;192.168.7.2&#39;<br>
+<br>
+        features = &#39;EXTRA_IMAGE_FEATURES += &quot;ssh-server-openssh empty-root-password&quot;\n&#39;<br>
+        features += &#39;INHERIT += &quot;extrausers&quot;\n&#39;<br>
+        features += &#39;EXTRA_USERS_PARAMS = &quot;useradd -p \&#39;\&#39; {}; usermod -s /bin/sh {};&quot;&#39;.format(test_user, test_user)<br>
+<br>
+        # Append &#39;features&#39; to local.conf<br>
+        self.append_config(features)<br>
+<br>
+        # Build a core-image-minimal<br>
+        ret = bitbake(&#39;core-image-minimal&#39;)<br>
+        self.assertEqual(0, ret.status, &#39;Failed to build a core-image-minimal&#39;)<br>
+<br>
+        rm_ssh_keys_cmd = &#39;ssh-keygen -f &quot;{}/.ssh/known_hosts&quot; -R {}&#39;.format(expanduser(&#39;~&#39;), 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, &#39;Failed to delete ssh keys for qemu host.&#39;)<br>
+<br>
+        # Boot qemu image<br>
+        proc_qemu = pexpect.spawn(&#39;runqemu qemux86 nographic&#39;)<br>
+        try:<br>
+            proc_qemu.expect(&#39;qemux86 login:&#39;, timeout=100)<br>
+        except:<br>
+            system(&#39;pkill qemu&#39;)<br>
+            proc_qemu.close()<br>
+            self.fail(&#39;Failed to start qemu.&#39;)<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(&#39;ssh {} -l {}&#39;.format(tap_inf_ip, user))<br>
+            index = proc_ssh.expect([&#39;Are you sure you want to continue connecting&#39;, prompt, pexpect.TIMEOUT, pexpect.EOF])<br>
+            if index == 0:<br>
+                proc_ssh.sendline(&#39;yes&#39;)<br>
+                try:<br>
+                    proc_ssh.expect(prompt)<br>
+                except:<br>
+                    system(&#39;pkill qemu&#39;)<br>
+                    proc_qemu.close()<br>
+                    proc_ssh.terminate()<br>
+                    self.fail(&#39;Failed to ssh with {} user into qemu.&#39;.format(user))<br>
+            elif index == 1:<br>
+                # user successfully logged in with empty password<br>
+                pass<br>
+            elif index == 2:<br>
+                system(&#39;pkill qemu&#39;)<br>
+                proc_qemu.close()<br>
+                proc_ssh.terminate()<br>
+                self.fail(&#39;Failed to ssh with {} user into qemu (timeout).&#39;.format(user))<br>
+            else:<br>
+                system(&#39;pkill qemu&#39;)<br>
+                proc_qemu.close()<br>
+                proc_ssh.terminate()<br>
+                self.fail(&#39;Failed to ssh with {} user into qemu (eof).&#39;.format(user))<br>
+<br>
+        # Cleanup<br>
+        system(&#39;pkill qemu&#39;)<br>
+        proc_qemu.close()<br>
+        proc_ssh.terminate()<br>
+        ret = runCmd(rm_ssh_keys_cmd)<br>
+        self.assertEqual(0, ret.status, &#39;Failed to delete ssh keys for qemu host (at cleanup).&#39;)<br>
+<br>
+    @testcase(1115)<br>
+    def test_all_users_can_connect_via_ssh_without_password(self):<br>
+        &quot;&quot;&quot;<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 &lt;<a href="mailto:ionutx.chisanovici@intel.com">ionutx.chisanovici@intel.com</a>&gt;<br>
+        AutomatedBy: Daniel Istrate &lt;<a href="mailto:daniel.alexandrux.istrate@intel.com">daniel.alexandrux.istrate@intel.com</a>&gt;<br>
+        &quot;&quot;&quot;<br>
+        test_user = &#39;tester&#39;<br>
+        root_user = &#39;root&#39;<br>
+        prompt = r&#39;qemux86:\S+[$#]\s+&#39;<br>
+        tap_inf_ip = &#39;192.168.7.2&#39;<br>
+<br>
+        features = &#39;EXTRA_IMAGE_FEATURES += &quot;ssh-server-openssh allow-empty-password&quot;\n&#39;<br>
+        features += &#39;INHERIT += &quot;extrausers&quot;\n&#39;<br>
+        features += &#39;EXTRA_USERS_PARAMS = &quot;useradd -p \&#39;\&#39; {}; usermod -s /bin/sh {};&quot;&#39;.format(test_user, test_user)<br>
+<br>
+        # Append &#39;features&#39; to local.conf<br>
+        self.append_config(features)<br>
+<br>
+        # Build a core-image-minimal<br>
+        ret = bitbake(&#39;core-image-minimal&#39;)<br>
+        self.assertEqual(0, ret.status, &#39;Failed to build a core-image-minimal&#39;)<br>
+<br>
+        rm_ssh_keys_cmd = &#39;ssh-keygen -f &quot;{}/.ssh/known_hosts&quot; -R {}&#39;.format(expanduser(&#39;~&#39;), 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, &#39;Failed to delete ssh keys for qemu host.&#39;)<br>
+<br>
+        # Boot qemu image<br>
+        proc_qemu = pexpect.spawn(&#39;runqemu qemux86 nographic&#39;)<br>
+        try:<br>
+            proc_qemu.expect(&#39;qemux86 login:&#39;, timeout=100)<br>
+        except:<br>
+            system(&#39;pkill qemu&#39;)<br>
+            proc_qemu.close()<br>
+            self.fail(&#39;Failed to start qemu.&#39;)<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(&#39;ssh {} -l {}&#39;.format(tap_inf_ip, user))<br>
+            index = proc_ssh.expect([&#39;Are you sure you want to continue connecting&#39;, prompt, pexpect.TIMEOUT, pexpect.EOF])<br>
+            if index == 0:<br>
+                proc_ssh.sendline(&#39;yes&#39;)<br>
+                try:<br>
+                    proc_ssh.expect(prompt)<br>
+                except:<br>
+                    system(&#39;pkill qemu&#39;)<br>
+                    proc_qemu.close()<br>
+                    proc_ssh.terminate()<br>
+                    self.fail(&#39;Failed to ssh with {} user into qemu.&#39;.format(user))<br>
+            elif index == 1:<br>
+                # user successfully logged in with empty password<br>
+                pass<br>
+            elif index == 2:<br>
+                system(&#39;pkill qemu&#39;)<br>
+                proc_qemu.close()<br>
+                proc_ssh.terminate()<br>
+                self.fail(&#39;Failed to ssh with {} user into qemu (timeout).&#39;.format(user))<br>
+            else:<br>
+                system(&#39;pkill qemu&#39;)<br>
+                proc_qemu.close()<br>
+                proc_ssh.terminate()<br>
+                self.fail(&#39;Failed to ssh with {} user into qemu (eof).&#39;.format(user))<br>
+<br>
+        # Cleanup<br>
+        system(&#39;pkill qemu&#39;)<br>
+        proc_qemu.close()<br>
+        proc_ssh.terminate()<br>
+        ret = runCmd(rm_ssh_keys_cmd)<br>
+        self.assertEqual(0, ret.status, &#39;Failed to delete ssh keys for qemu host (at cleanup).&#39;)<br>
+<br>
+    @testcase(1114)<br>
+    def test_rpm_version_4_support_on_image(self):<br>
+        &quot;&quot;&quot;<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 &lt;<a href="mailto:ionutx.chisanovici@intel.com">ionutx.chisanovici@intel.com</a>&gt;<br>
+        AutomatedBy: Daniel Istrate &lt;<a href="mailto:daniel.alexandrux.istrate@intel.com">daniel.alexandrux.istrate@intel.com</a>&gt;<br>
+        &quot;&quot;&quot;<br>
+<br>
+        root_user = &#39;root&#39;<br>
+        prompt = &#39;{}@qemux86:~# &#39;.format(root_user)<br>
+        rpm_version = &#39;4.11.2&#39;<br>
+        features = &#39;IMAGE_INSTALL_append = &quot; rpm&quot;\n&#39;<br>
+        features += &#39;PREFERRED_VERSION_rpm = &quot;{}&quot;\n&#39;.format(rpm_version)<br>
+        features += &#39;PREFERRED_VERSION_rpm-native = &quot;{}&quot;\n&#39;.format(rpm_version)<br>
+        features += &#39;RPMROOTFSDEPENDS_remove = &quot;rpmresolve-native:do_populate_sysroot&quot;&#39;<br>
+<br>
+        # Append &#39;features&#39; to local.conf<br>
+        self.append_config(features)<br>
+<br>
+        # Build a core-image-minimal<br>
+        ret = bitbake(&#39;core-image-minimal&#39;)<br>
+        self.assertEqual(0, ret.status, &#39;Failed to build a core-image-minimal&#39;)<br>
+<br>
+        # Boot qemu image &amp; get rpm version<br>
+        proc_qemu = pexpect.spawn(&#39;runqemu qemux86 nographic&#39;)<br>
+        try:<br>
+            proc_qemu.expect(&#39;qemux86 login:&#39;, timeout=100)<br>
+            proc_qemu.sendline(root_user)<br>
+            proc_qemu.expect(prompt)<br>
+            proc_qemu.sendline(&#39;rpm --version&#39;)<br>
+            proc_qemu.expect(prompt)<br>
+        except:<br>
+            system(&#39;pkill qemu&#39;)<br>
+            proc_qemu.close()<br>
+            self.fail(&#39;Failed to boot qemu.&#39;)<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(&#39;pkill qemu&#39;)<br>
+            proc_qemu.close()<br>
+            self.fail(&#39;RPM version is not {}, found instead {}.&#39;.format(rpm_version, found_rpm_version))<br>
+<br>
+        # Cleanup (close qemu)<br>
+        system(&#39;pkill qemu&#39;)<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>