All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/33] Sumo next patch review
@ 2019-04-10 13:11 Armin Kuster
  2019-04-10 13:11 ` [PATCH 01/33] oeqa/manual: transfer manual test cases from testopia to oeqa Armin Kuster
                   ` (32 more replies)
  0 siblings, 33 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

Here are the next batch for sumo. Please review and reply in two days.
Base line they passed a-full

The following changes since commit 0a2db923fd17019d07d88204b355aa46590f0b97:

  build-appliance-image: Update to sumo head revision (2019-03-27 23:21:58 +0000)

are available in the git repository at:

  git://git.openembedded.org/openembedded-core-contrib stable/sumo-next
  http://cgit.openembedded.org/openembedded-core-contrib/log/?h=stable/sumo-next

Chen Qi (2):
  pkgdata.py: avoid target-sdk-dummy-provides to mess things up
  logging: use warning instead warn

Davis, Michael (1):
  wic: Support for changing the imager.

Geoff Parker (1):
  wic: make engine.py:get_partitions() resilient to parted/dmidecode
    stderr output

Kai Kang (1):
  wic: search nonarch STAGING_DATADIR for multilib

Khem Raj (1):
  lib/oe: Fix collections ABCs DeprecationWarning in Python 3.7+

Leonardo Augusto (1):
  scripts/lib/wic/engine: Fix cp's target path for ext* filesystems

Mazliana (1):
  oeqa/manual/bsp-hw.json: add non-IA tests

Richard Purdie (9):
  oeqa/manual: Remove bitbake-selftest execution
  oeqa/manual/build-appliance: Drop test which is already automated
  resulttool: Allow store to work on single files
  resulttool: Allow extraction of ptest data
  scripts/wic: Be consistent about how we call bitbake
  wic/engine: Fix missing parted autobuilder failures
  oeqa/selftest/devtool: Ensure dbus is built befoe running test
  oeqa: Default to buffer mode for tests
  devtool: Split tests into multiple classes

Robert Yang (1):
  oeqa/manual/bsp-qemu.json: Update for QEMU_USE_KVM

Ross Burton (1):
  wic: use explicit errno import

Sudhir Sharma (1):
  oeqa/manual: Add manual runtime 'compliance' testcases to json

William Bourque (1):
  wic/engine.py: Load paths from PATH environment variable

Yeoh Ee Peng (8):
  oeqa/manual: transfer manual test cases from testopia to oeqa
  oeqa/manual/toaster: transfer manual toaster test cases to oeqa
  oeqa/manual/toaster: updated test id naming
  resulttool: Enable report for single result file
  resulttool/manualexecution: Standardize input check
  resulttool/manualexecution: Enable display full steps without press
    enter
  resulttool/manualexecution: Fixed step sorted by integer
  resulttool/manualexecution: Refactor and simplify codebase

sangeeta jain (4):
  oeqa/manual/sdk.json: Updated toolchain tarball to core-image-sato
  oeqa/manual/bsp-hw.json: test id updated and obsolete test cases
    removed
  oeqa/manual/compliance-test.json: test id updated and missing test
    cases added
  oeqa/manual/kernel-dev.json: test id updated

 meta/lib/oe/maketype.py                          |    9 +-
 meta/lib/oe/terminal.py                          |    6 +-
 meta/lib/oeqa/core/context.py                    |    2 +-
 meta/lib/oeqa/core/runner.py                     |    5 -
 meta/lib/oeqa/manual/abat.patch                  |   64 +
 meta/lib/oeqa/manual/bsp-hw.json                 | 1286 +++++++++++
 meta/lib/oeqa/manual/bsp-qemu.json               |  222 ++
 meta/lib/oeqa/manual/build-appliance.json        |   96 +
 meta/lib/oeqa/manual/compliance-test.json        |  194 ++
 meta/lib/oeqa/manual/crops.json                  |  294 +++
 meta/lib/oeqa/manual/eclipse-plugin.json         |  322 +++
 meta/lib/oeqa/manual/kernel-dev.json             |  200 ++
 meta/lib/oeqa/manual/oe-core.json                |  264 +++
 meta/lib/oeqa/manual/sdk.json                    |   32 +
 meta/lib/oeqa/manual/toaster-managed-mode.json   | 2572 ++++++++++++++++++++++
 meta/lib/oeqa/manual/toaster-unmanaged-mode.json | 1170 ++++++++++
 meta/lib/oeqa/selftest/cases/devtool.py          |  115 +-
 meta/lib/oeqa/selftest/cases/efibootpartition.py |    1 -
 meta/lib/oeqa/selftest/cases/imagefeatures.py    |    2 -
 meta/lib/oeqa/selftest/cases/pkgdata.py          |    1 +
 meta/lib/oeqa/selftest/cases/runqemu.py          |    2 -
 meta/lib/oeqa/selftest/context.py                |    2 +-
 meta/lib/oeqa/utils/qemurunner.py                |    4 +-
 scripts/combo-layer                              |    2 +-
 scripts/contrib/verify-homepage.py               |    2 +-
 scripts/lib/devtool/export.py                    |    2 +-
 scripts/lib/devtool/import.py                    |    8 +-
 scripts/lib/devtool/standard.py                  |   16 +-
 scripts/lib/devtool/upgrade.py                   |    6 +-
 scripts/lib/recipetool/append.py                 |   14 +-
 scripts/lib/recipetool/create.py                 |    4 +-
 scripts/lib/recipetool/create_kmod.py            |    2 +-
 scripts/lib/recipetool/create_npm.py             |    6 +-
 scripts/lib/recipetool/newappend.py              |    4 +-
 scripts/lib/resulttool/manualexecution.py        |   61 +-
 scripts/lib/resulttool/resultutils.py            |   39 +-
 scripts/lib/resulttool/store.py                  |   23 +-
 scripts/lib/wic/engine.py                        |   26 +-
 scripts/lib/wic/filemap.py                       |    9 +-
 scripts/lib/wic/plugins/source/bootimg-pcbios.py |   10 +-
 scripts/resulttool                               |   10 -
 scripts/runqemu                                  |   16 +-
 scripts/wic                                      |   18 +-
 43 files changed, 6941 insertions(+), 202 deletions(-)
 create mode 100644 meta/lib/oeqa/manual/abat.patch
 create mode 100644 meta/lib/oeqa/manual/bsp-hw.json
 create mode 100644 meta/lib/oeqa/manual/bsp-qemu.json
 create mode 100644 meta/lib/oeqa/manual/build-appliance.json
 create mode 100644 meta/lib/oeqa/manual/compliance-test.json
 create mode 100644 meta/lib/oeqa/manual/crops.json
 create mode 100644 meta/lib/oeqa/manual/eclipse-plugin.json
 create mode 100644 meta/lib/oeqa/manual/kernel-dev.json
 create mode 100644 meta/lib/oeqa/manual/oe-core.json
 create mode 100644 meta/lib/oeqa/manual/sdk.json
 create mode 100644 meta/lib/oeqa/manual/toaster-managed-mode.json
 create mode 100644 meta/lib/oeqa/manual/toaster-unmanaged-mode.json

-- 
2.7.4



^ permalink raw reply	[flat|nested] 34+ messages in thread

* [PATCH 01/33] oeqa/manual: transfer manual test cases from testopia to oeqa
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 02/33] oeqa/manual: Remove bitbake-selftest execution Armin Kuster
                   ` (31 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Yeoh Ee Peng <ee.peng.yeoh@intel.com>

As part of the solution to replace Testopia, manual test cases
need to be migrated to OEQA. These manual test case json files
will serve two use cases.

Use case#1: as input to the future commandline-based manual test
runner script, where this script will display actions and expected
result information in user friendly text, then it will capture
user input for test result and log, finally it will write test
result and log into existing standardize test result json format
from OEQA framework for automated tests.

Use case#2: QA will open and read these json file manually for
planning manual test execution. Any reader interested in
understanding manual test cases will open and read these files.

Signed-off-by: Yeoh Ee Peng <ee.peng.yeoh@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 meta/lib/oeqa/manual/abat.patch           |   64 ++
 meta/lib/oeqa/manual/bsp-hw.json          | 1200 +++++++++++++++++++++++++++++
 meta/lib/oeqa/manual/bsp-qemu.json        |  222 ++++++
 meta/lib/oeqa/manual/build-appliance.json |  122 +++
 meta/lib/oeqa/manual/crops.json           |  294 +++++++
 meta/lib/oeqa/manual/eclipse-plugin.json  |  322 ++++++++
 meta/lib/oeqa/manual/kernel-dev.json      |  200 +++++
 meta/lib/oeqa/manual/oe-core.json         |  294 +++++++
 meta/lib/oeqa/manual/sdk.json             |   32 +
 9 files changed, 2750 insertions(+)
 create mode 100644 meta/lib/oeqa/manual/abat.patch
 create mode 100644 meta/lib/oeqa/manual/bsp-hw.json
 create mode 100644 meta/lib/oeqa/manual/bsp-qemu.json
 create mode 100644 meta/lib/oeqa/manual/build-appliance.json
 create mode 100644 meta/lib/oeqa/manual/crops.json
 create mode 100644 meta/lib/oeqa/manual/eclipse-plugin.json
 create mode 100644 meta/lib/oeqa/manual/kernel-dev.json
 create mode 100644 meta/lib/oeqa/manual/oe-core.json
 create mode 100644 meta/lib/oeqa/manual/sdk.json

diff --git a/meta/lib/oeqa/manual/abat.patch b/meta/lib/oeqa/manual/abat.patch
new file mode 100644
index 0000000..1541ac8
--- /dev/null
+++ b/meta/lib/oeqa/manual/abat.patch
@@ -0,0 +1,64 @@
+########
+diff --git a/glxgears_check.sh b/glxgears_check.sh
+index 17622b8..c4d3b97 100755
+--- a/glxgears_check.sh
++++ b/glxgears_check.sh
+@@ -31,7 +31,7 @@ else
+ 
+     sleep 6
+ 
+-    XPID=$( ps ax | awk '{print $1, $5}' | grep glxgears | awk '{print $1}')
++    XPID=$( ps | awk '{print $1, $5}' | grep glxgears | awk '{print $1}')
+     if [ ! -z "$XPID" ]; then
+         kill -9 $XPID >/dev/null 2>&1
+         echo "glxgears can run, PASS!"
+diff --git a/x_close.sh b/x_close.sh
+index e287be1..3429f1a 100755
+--- a/x_close.sh
++++ b/x_close.sh
+@@ -22,7 +22,7 @@
+ #
+ function close_proc(){
+ echo "kill process Xorg"
+-XPID=$(  ps ax | awk '{print $1, $5}' | egrep "X$|Xorg$" | awk '{print $1}')
++XPID=$(  ps | awk '{print $1, $6}' | egrep "X$|Xorg$" | awk '{print $1}')
+ if [ ! -z "$XPID" ]; then
+     kill $XPID
+     sleep 4
+diff --git a/x_start.sh b/x_start.sh
+index 9cf6eab..2305796 100755
+--- a/x_start.sh
++++ b/x_start.sh
+@@ -24,7 +24,7 @@
+ X_ERROR=0
+ 
+ #test whether X has started
+-PXID=$(ps ax |awk '{print $1,$5}' |egrep "Xorg$|X$" |grep -v grep | awk '{print $1}')
++PXID=$(ps |awk '{print $1,$6}' |egrep "Xorg$|X$" |grep -v grep | awk '{print $1}')
+ if [ ! -z "$PXID" ]; then
+     echo "[WARNING] Xorg has started!"
+     XORG_STATUS="started"
+@@ -35,9 +35,11 @@ else
+     #start up the x server
+     echo "Start up the X server for test in display $DISPLAY................"
+ 
+-    $XORG_DIR/bin/X >/dev/null 2>&1 &
++    #$XORG_DIR/bin/X >/dev/null 2>&1 &
++    #sleep 8
++    #xterm &
++    /etc/init.d/xserver-nodm start &
+     sleep 8
+-    xterm &
+ fi
+     XLOG_FILE=/var/log/Xorg.0.log
+     [ -f $XORG_DIR/var/log/Xorg.0.log ] && XLOG_FILE=$XORG_DIR/var/log/Xorg.0.log
+@@ -54,7 +56,7 @@ fi
+         X_ERROR=1
+     fi
+ 
+-    XPID=$( ps ax | awk '{print $1, $5}' | egrep "X$|Xorg$" |grep -v grep| awk '{print $1}')
++    XPID=$( ps | awk '{print $1, $6}' | egrep "X$|Xorg$" |grep -v grep| awk '{print $1}')
+     if [ -z "$XPID" ]; then
+         echo "Start up X server FAIL!"
+  echo
+########
\ No newline at end of file
diff --git a/meta/lib/oeqa/manual/bsp-hw.json b/meta/lib/oeqa/manual/bsp-hw.json
new file mode 100644
index 0000000..a2b1d3e
--- /dev/null
+++ b/meta/lib/oeqa/manual/bsp-hw.json
@@ -0,0 +1,1200 @@
+[
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-tools.rpm_-__install_dependency_package",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Get a not previously installed RPM package or build one on local machine, which should have run-time dependency.For example, \"mc\" (Midnight Commander, which is a visual file manager) should depend on \"ncurses-terminfo\".   \n\n$ bitbake mc  \n\n\n",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Copy the package into a system folder (for example /home/root/rpm_packages).  \n\n\n",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "Run \"rpm -ivh package_name\" and check the output, for example \"rpm -ivh mc.rpm*\" should report the dependency on \"ncurses-terminfo\".\n\n\n\n",
+                    "expected_results": "3 . rpm command should report message when some RPM installation depends on other packages."
+                }
+            },
+            "summary": "rpm_-__install_dependency_package"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.boot_and_install_from_USB",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "plugin usb which contains live image burned",
+                    "expected_results": "User can choose install system from usb stick onto harddisk from boot menu or command line option \n"
+                },
+                "2": {
+                    "action": "configure device BIOS to firstly boot from USB if necessary",
+                    "expected_results": "Installed system can boot up"
+                },
+                "3": {
+                    "action": "boot the device and select option \"Install\" from boot menu",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "proceed through default install process",
+                    "expected_results": ""
+                },
+                "5": {
+                    "action": "Remove USB, and reboot into new installed system. \nNote:   If installation was successfully completed and received this message \"\"(sdx): Volume was not properly unmounted...Please run fsck.\"\" ignore it because this was whitelisted according to bug 9652.",
+                    "expected_results": ""
+                }
+            },
+            "summary": "boot_and_install_from_USB"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.live_boot_from_USB",
+            "author": [
+                {
+                    "email": "juan.fernandox.ramos.frayle@intel.com",
+                    "name": "juan.fernandox.ramos.frayle@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Plugin usb which contains live image burned.",
+                    "expected_results": "User can choose boot from live image on usb stick from boot menu or command line option"
+                },
+                "2": {
+                    "action": "Configure device BIOS to firstly boot from USB if necessary.",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "Reboot the device and boot from USB stick.",
+                    "expected_results": "Live image can boot up with usb stick"
+                }				
+            },
+            "summary": "live_boot_from_USB"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.boot_from_runlevel_3",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Boot into system and edit /etc/inittab to make sure that system enter at the run level 3 by default, this is done by changing the line   \n\n\nid:5:initdefault  \n\nto  \n\nid:3:initdefault  \n\n",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Reboot system, and press \"Tab\" to enter \"grub\"",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "Get into the \"kernel\" line with the edit option  \"e\" and add \"psplash=false text\" at the end line.",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "Press \"F10\" or \"ctrl+x\" to boot system",
+                    "expected_results": ""
+                },
+                "5": {
+                    "action": "If system ask you for a login type \"root\"",
+                    "expected_results": "System should boot to run level 3, showing the command prompt."
+                }
+            },
+            "summary": "boot_from_runlevel_3"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.boot_from_runlevel_5",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Boot into system and edit /etc/inittab to make sure that system enter at the run level 5 by default, this is done by changing the line   \n\nid:3:initdefault  \n\nto  \n\nid:5:initdefault  \n\n",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Reboot system, and press \"Tab\" to enter \"grub\"",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "Get into the \"kernel\" line with the edit option  \"e\" and add \"psplash=false text\" at the end line.",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "Press \"F10\" or \"ctrl+x\" to boot system \nNote: The test is only for sato image.",
+                    "expected_results": "System should boot to runlevel 5 ."
+                }
+            },
+            "summary": "boot_from_runlevel_5"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.shutdown_system",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "boot system",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "launch terminal and run \"shutdown -h now\" or \"poweroff\"",
+                    "expected_results": "System can be shutdown successfully . "
+                }
+            },
+            "summary": "shutdown_system"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.reboot_system",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "boot system",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "launch terminal and run \"reboot\"",
+                    "expected_results": "System can reboot successfully . "
+                }
+            },
+            "summary": "reboot_system"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.switch_among_multi_applications_and_desktop",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "launch several applications(like contacts, file manager, notes, etc)",
+                    "expected_results": "user could switch among multi applications and desktop"
+                },
+                "2": {
+                    "action": "launch terminal",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "switch among multi applications and desktop",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "close applications \nNote: The case is for sato image only. ",
+                    "expected_results": ""
+                }
+            },
+            "summary": "switch_among_multi_applications_and_desktop"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.USB_-_mount",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Boot system \n\n",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Plug USB stick, it should be mount in  /run/media/sd(x) If X-window system does not start and show USB device, then use the terminal to mount it, following the next steps: \na. Locate the usb stick (usually it is on /dev/sdb) \nb. Create a directory with \"mkdir stick\"  (so you will have such a path as: /home/root/stick). \nc. Run the command  \"mount  /dev/sdb  /home/root/stick\" to mount  USB device on it. \n\n",
+                    "expected_results": "USB device should be mounted in  /run/media/sd(x)  \nor in  /home/root/stick  \n\n"
+                },
+                "3": {
+                    "action": "Then you can access USB stick (/home/root/stick) via Terminal or GUI  and try various commands and actions like \"cp\", \"mv\", \"touch\" and \"rm\".  Type \"dmesg\" command and check for recent mounted devices.",
+                    "expected_results": "Basic commands work properly. The system sends a notification in \"dmesg\" command, showing that the USB stick is accessible and the device is mounted ."
+                }
+            },
+            "summary": "USB_-_mount"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.USB_-_read_files",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "boot system",
+                    "expected_results": "view/copy successfully"
+                },
+                "2": {
+                    "action": "plug usb stick",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "view files in usb by file browser",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "copy some files from usb to local hardware",
+                    "expected_results": ""
+                }
+            },
+            "summary": "USB_-_read_files"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.USB_-_umount",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "boot system",
+                    "expected_results": "usb directory in file browser automatically missed"
+                },
+                "2": {
+                    "action": "plug usb stick",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "view files in usb by file browser \n4.unplug usb",
+                    "expected_results": ""
+                }
+            },
+            "summary": "USB_-_umount"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.USB_-_write_files",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "boot system",
+                    "expected_results": "create/copy successfully"
+                },
+                "2": {
+                    "action": "plug usb stick",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "create files in usb \n4.copy some files from local hardware to usb",
+                    "expected_results": ""
+                }
+            },
+            "summary": "USB_-_write_files"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.ethernet_static_ip_set_in_connman",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Boot the system and check internet connection is on . ",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Launch connmand-properties (up-right corner on desktop)",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "Choose  Ethernet device and set a valid static ip address for it. \nFor example, in our internal network, we can set as following: \nip address: 10.239.48.xxx \nMask: 255.255.255.0 \nGateway (Broadcast): 10.239.48.255",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "Check the Network configuration with \"ifconfig\"",
+                    "expected_results": "Static IP was set successfully  \n"
+                },
+                "5": {
+                    "action": "ping to another IP adress",
+                    "expected_results": "Ping works correclty\n"
+                }
+            },
+            "summary": "ethernet_static_ip_set_in_connman"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.ethernet_get_IP_in_connman_via_DHCP",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Launch connmand-properties (up-right corner on your desktop). ",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Check if Ethernet device can work properly with static IP, doing \"ping XXX.XXX.XXX.XXX\", once this is set.",
+                    "expected_results": "Ping executed successfully .  \n\n"
+                },
+                "3": {
+                    "action": "Then choose DHCP method for Ethernet device in connmand-properties.",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "Check with 'ifconfig\" and \"ping\" if Ethernet device get IP address via DHCP.",
+                    "expected_results": "Ethernet device can get dynamic IP address via DHCP in connmand ."
+                }
+            },
+            "summary": "ethernet_get_IP_in_connman_via_DHCP"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-tools.connman_offline_mode_in_connman-gnome",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Launch connman-properties after system booting \n\n",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "choose \"offline mode\" and check the connection of all network interfaces ",
+                    "expected_results": "All connection should be off after clicking \"offline mode\" . "
+                }
+            },
+            "summary": "connman_offline_mode_in_connman-gnome"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.X_server_can_start_up_with_runlevel_5_boot",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "boot up system with default runlevel  \n\n",
+                    "expected_results": "X server can start up well and desktop display has no problem .  \n\n"
+                },
+                "2": {
+                    "action": "type runlevel at command prompt",
+                    "expected_results": "Output:N 5"
+                }
+            },
+            "summary": "X_server_can_start_up_with_runlevel_5_boot"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.standby",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "boot system and launch terminal; check output of \"date\" and launch script \"continue.sh\"",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "echo \"mem\" > /sys/power/state",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "After system go into S3 mode, move mouse or press any key to make it resume (on NUC press power button)",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "Check \"date\" and script \"continue.sh\"",
+                    "expected_results": ""
+                },
+                "5": {
+                    "action": "Check if application can work as normal \ncontinue.sh as below: \n \n#!/bin/sh \n \ni=1 \nwhile [ 0 ] \ndo \n echo $i \n sleep 1 \n i=$((i+1)) \ndone ",
+                    "expected_results": "Screen should resume back and script can run continuously incrementing the i's value from where it was before going to standby state. Date should be the same with the corresponding time increment."
+                }
+            },
+            "summary": "standby"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.check_CPU_utilization_after_standby",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Start up system",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "run \"top\" command and check if there is any process eating CPU time",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "make system into standby and resume it",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "run \"top\" command and check if there is any difference with the data before standby",
+                    "expected_results": "There should be no big difference before/after standby with \"top\" . "
+                }
+            },
+            "summary": "check_CPU_utilization_after_standby"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.Test_if_LAN_device_works_well_after_resume_from_suspend_state",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "boot system and launch terminal",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "echo \"mem\" > /sys/power/state",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "After system go into S3 mode, move mouse or press any key to make it resume",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "check ping status  \n\nNote: This TC apply only for core-image-full-cmd and core-image-lsb .",
+                    "expected_results": "ping should always work before/after standby"
+                }
+            },
+            "summary": "Test_if_LAN_device_works_well_after_resume_from_suspend_state"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.Test_if_usb_hid_device_works_well_after_resume_from_suspend_state",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "boot system and launch terminal",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "echo \"mem\" > /sys/power/state",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "After system go into S3 mode, resume the device by pressing the power button or using HID devices",
+                    "expected_results": "Devices resumes "
+                },
+                "4": {
+                    "action": "check usb mouse and keyboard",
+                    "expected_results": "Usb mouse and keyboard should work"
+                }
+            },
+            "summary": "Test_if_usb_hid_device_works_well_after_resume_from_suspend_state"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-tools.click_terminal_icon_on_X_desktop",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "After system launch and X start up, click terminal icon on desktop",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Check if only one terminal window launched and no other problem met",
+                    "expected_results": "There should be no problem after launching terminal . "
+                }
+            },
+            "summary": "click_terminal_icon_on_X_desktop"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-tools.Add_multiple_files_in_media_player",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Launch media player",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Add multiple files(5 files) in media player at same time (ogg or wav)",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "Verify the sound.",
+                    "expected_results": "Media player should be OK with this action, it reproduce files correctly."
+                }
+            },
+            "summary": "Add_multiple_files_in_media_player"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.check_bash_in_image",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "After system is up, check if bash command exists with command \"which bash\"",
+                    "expected_results": "bash command should exist in image giving something as below  \"/bin/bash\""
+                }
+            },
+            "summary": "check_bash_in_image"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.MicroSD_-__mount",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "boot system",
+                    "expected_results": "system notify that MicroSDis accessible"
+                },
+                "2": {
+                    "action": "plug MicroSD card",
+                    "expected_results": ""
+                }
+            },
+            "summary": "MicroSD_-__mount"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.MicroSD_-__read_files",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "boot system",
+                    "expected_results": "view/copy successfully"
+                },
+                "2": {
+                    "action": "plug MicroSD card",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "view files inMicroSD by file browser",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "copy some files fromMicroSD to local hardware",
+                    "expected_results": ""
+                }
+            },
+            "summary": "MicroSD_-__read_files"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.MicroSD_-__umount",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "boot system",
+                    "expected_results": "MicroSD in file browser automatically missed . "
+                },
+                "2": {
+                    "action": "plug MicroSD card",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "view files in MicroSDby file browser",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "unplug MicroSD",
+                    "expected_results": ""
+                }				
+            },
+            "summary": "MicroSD_-__umount"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.MicroSD_-__write_files",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "boot system",
+                    "expected_results": "create/copy successfully"
+                },
+                "2": {
+                    "action": "plug MicroSD card",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "create files in MicroSD",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "copy some files from local hardware to MicroSD",
+                    "expected_results": ""
+                }
+            },
+            "summary": "MicroSD_-__write_files"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-tools.video_-_libva_check_(ogg_video_play)",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "check if libva is installed on system (or libogg)",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "copy sample ogg file to system",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "launch media player can play the ogg file",
+                    "expected_results": "ogg file can be played without problem when libva is used (or libogg) "
+                }
+            },
+            "summary": "video_-_libva_check_(ogg_video_play)"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-tools.media_player_-_unable_to_play_MPEG-1_without_\"commercial\"_flag",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Copy sample MPEG-1 file to a system without the \"commercial\" flag.",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Launch media player and make sure it cannot play the MPEG-1 file.",
+                    "expected_results": "MPEG-1 file can not be played on images without the \"commercial\" flag. "
+                }
+            },
+            "summary": "media_player_-_unable_to_play_MPEG-1_without_\"commercial\"_flag"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-tools.media_player_-_play_video_(ogv)",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "copy sample ogv file to system",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "launch media player and make sure it can play the ogv file",
+                    "expected_results": "ogv file can be played without problem"
+                }
+            },
+            "summary": "media_player_-_play_video_(ogv)"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-tools.media_player_-_stop/play_button_(ogv)",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "copy sample ogv file to system",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "launch media player can play the ogv file",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "click \"stop\" button to stop playing",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "click \"start\" button to resume playing",
+                    "expected_results": "ogv file can be start/stop without problem"
+                }
+            },
+            "summary": "media_player_-_stop/play_button_(ogv)"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-tools.audio_-_play_(ogg)_with_HDMI",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "copy sample ogg file to system",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "connect system with a monitor with HDMI",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "launch media player and play the ogg file",
+                    "expected_results": "ogg file can be played without problem with HDMI"
+                }
+            },
+            "summary": "audio_-_play_(ogg)_with_HDMI"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-tools.audio_-_play_(wav)_with_HDMI",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "copy sample wav file to system",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "connect system with a monitor with HDMI",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "launch media player and play the wav file",
+                    "expected_results": "wav file can be played without problem, with HDMI"
+                }
+            },
+            "summary": "audio_-_play_(wav)_with_HDMI"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-tools.Graphics_-_ABAT",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Download ABAT test suite from internal git repository, git clone git://tinderbox.sh.intel.com/git/abat",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Apply following patch to make it work on yocto environment",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "Run \"./abat.sh\" to run ABAT test refer to abat.patch",
+                    "expected_results": "All ABAT test should pass. \nNote : If below 3 fails appears ignore them. \n- start up X server fail.. due is already up \n- module [intel_agp] \n- module [i915]"
+                }
+            },
+            "summary": "Graphics_-_ABAT"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-tools.Graphics_-_x11perf_-_2D",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Run \"x11perf -aa10text\" and \"x11perf -rgb10text\"",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Get the FPS result and compare it with upstream graphics data on Sandybridge",
+                    "expected_results": "There should not be big regression between Yocto and upstream linux . "
+                }
+            },
+            "summary": "Graphics_-_x11perf_-_2D"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-oe-core.Test_Run_Integrity_-_Check_that_image_is_buildable",
+            "author": [
+                {
+                    "email": "corneliux.stoicescu@intel.com",
+                    "name": "corneliux.stoicescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Check that image can be built using either of the following methods:  \n\n",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Check that image is built by autobuilder \nPlease check at: https://autobuilder.yocto.io/pub/releases/ \nChoose the target release that you are validating.  \n\n",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "Build image yourself \nPreferred to build an core-image-sato-dev to ease the process of the dependent test cases in this run. \nNote: Please set MACHINE in conf/local.conf ",
+                    "expected_results": "If either method fails, this test case will be failed and dependent test cases will be blocked. "
+                }
+            },
+            "summary": "Test_Run_Integrity_-_Check_that_image_is_buildable"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.Check_if_SATA_disk_can_work_correctly",
+            "author": [
+                {
+                    "email": "yi.zhao@windriver.com",
+                    "name": "yi.zhao@windriver.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Run fdisk command to create partition on SATA disk. ",
+                    "expected_results": "The SATA device can mount, umount, read and write. "
+                },
+                "2": {
+                    "action": "Mount/Umount \n  mke2fs /dev/sda1 \n  mount -t ext2 /dev/sda1 /mnt/disk  \n  umount /mnt/disk",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "Read/Write (filesystem) \n  touch /mnt/disk/test.txt \n  echo abcd > /mnt/disk/test.txt \n  cat /mnt/disk/test.txt",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "Read/Write (raw) \n  dd if=/dev/sda1 of=/tmp/test bs=1k count=1k  \n  This command will read 1MB from /dev/sda1 to /tmp/test",
+                    "expected_results": ""
+                }
+            },
+            "summary": "Check_if_SATA_disk_can_work_correctly"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.Install_and_boot_from_USB-drive_to_HDD-drive",
+            "author": [
+                {
+                    "email": "david.israelx.rodriguez.castellanos@intel.com",
+                    "name": "david.israelx.rodriguez.castellanos@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Get a HDD drive.",
+                    "expected_results": "User can choose install system from USB stick on HDD drive from boot menu or command line option \n"
+                },
+                "2": {
+                    "action": "Plugin USB which contains live image burned (USB1).",
+                    "expected_results": "Installed system can boot up."
+                },
+                "3": {
+                    "action": "Configure device BIOS to firstly boot from USB if necessary",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "Boot the device and select option \"Install\"  from boot menu.",
+                    "expected_results": ""
+                },
+                "5": {
+                    "action": "Make sure that the divice in which image is going to be installed is the HDD drive.",
+                    "expected_results": ""
+                },
+                "6": {
+                    "action": "Proceed through default install process.",
+                    "expected_results": ""
+                },
+                "7": {
+                    "action": "Remove USB1, and reboot into new installed system.",
+                    "expected_results": ""
+                }
+            },
+            "summary": "Install_and_boot_from_USB-drive_to_HDD-drive"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.Install_and_boot_from_USB-drive_to_SD-drive",
+            "author": [
+                {
+                    "email": "david.israelx.rodriguez.castellanos@intel.com",
+                    "name": "david.israelx.rodriguez.castellanos@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Get a SD-drive with enough free space to install an image.",
+                    "expected_results": "User can choose install system from USB stick on SD-drive from boot menu or command line option. \n"
+                },
+                "2": {
+                    "action": "Plugin USB which contains live image burned (USB1).",
+                    "expected_results": "Installed system can boot up."
+                },
+                "3": {
+                    "action": "Configure device BIOS to firstly boot from USB if necessary",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "Boot the device and select option \"Install\"  from boot menu.",
+                    "expected_results": ""
+                },
+                "5": {
+                    "action": "Make sure that the device in which image is going to be installed is the SD-drive.",
+                    "expected_results": ""
+                },
+                "6": {
+                    "action": "Proceed through default install process.",
+                    "expected_results": ""
+                },
+                "7": {
+                    "action": "Remove USB1, and reboot into new installed system.",
+                    "expected_results": ""
+                }
+            },
+            "summary": "Install_and_boot_from_USB-drive_to_SD-drive"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.Test_boot_on_serial_communication_SD",
+            "author": [
+                {
+                    "email": "juan.fernandox.ramos.frayle@intel.com",
+                    "name": "juan.fernandox.ramos.frayle@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "1.- Create a yocto project image in a SD card \nexample \n2 - Configure a connection like shown in the link avobe: \nhttps://wiki.yoctoproject.org/wiki/MinnowMax_board_Serial_video_connection_guide \n3 - Verify the Minow Max board is connected to the host \n4 - Boot the system to desktop \n5 - Open a Terminal and check the IP  \nIn Terminal type $ifconfig\"",
+                    "expected_results": "Verify you can create a live image  \n"
+                }
+            },
+            "summary": "Test_boot_on_serial_communication_SD"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.Test_boot_on_serial_communication_HDD",
+            "author": [
+                {
+                    "email": "juan.fernandox.ramos.frayle@intel.com",
+                    "name": "juan.fernandox.ramos.frayle@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "1 - Create a yocto project image in a HDD \nexample \n2 - Configure a connection like shown in the link avobe: \nhttps://wiki.yoctoproject.org/wiki/MinnowMax_board_Serial_video_connection_guide \n3 - Verify the Minow Max board is connected to the host \n4 - Boot the system to desktop \n5 - Open a Terminal and check the IP  \nIn Terminal type $ifconfig\"> ",
+                    "expected_results": "Verify you can create a live image  \n"
+                }
+            },
+            "summary": "Test_boot_on_serial_communication_HDD"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.Test_boot_on_serial_communication_USB",
+            "author": [
+                {
+                    "email": "juan.fernandox.ramos.frayle@intel.com",
+                    "name": "juan.fernandox.ramos.frayle@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "1.- Create a yocto project image in a USB \nexample <dd if= core-image-sato-sdk.hddimg of =/dev/sdb>",
+                    "expected_results": "Verify you can create a live image  \n"
+                },
+                "2": {
+                    "action": "Configure a connection like shown in the link avobe: \nhttps://wiki.yoctoproject.org/wiki/MinnowMax_board_Serial_video_connection_guide\n\n",
+                    "expected_results": "Video signal is present and not delayed \n"
+                },
+                "3": {
+                    "action": " Verify the Minow Max board is connected to the host",
+                    "expected_results": "Verify the system boot ok and no errors are present \n"
+                },
+                "4": {
+                    "action": " Boot the system to desktop",
+                    "expected_results": " Check that a valid IP is retrieved"
+                },
+                "5": {
+                    "action": " Open a Terminal and check the IP  \nIn Terminal type $ifconfig\" ",
+                    "expected_results": ""
+                }
+            },
+            "summary": "Test_boot_on_serial_communication_USB"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-hw.bsps-runtime.Test_Seek_bar_and_volume_control",
+            "author": [
+                {
+                    "email": "juan.fernandox.ramos.frayle@intel.com",
+                    "name": "juan.fernandox.ramos.frayle@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Run media player and load a media file ",
+                    "expected_results": "Media player correctly open audio/video file \n"
+                },
+                "2": {
+                    "action": "Verify that seek and volume control are present ",
+                    "expected_results": "Seek bar and volume control are present \n"
+                },
+                "3": {
+                    "action": "Verify that selecting the speaker icon opens the volume control",
+                    "expected_results": "Volume control bar must appear \n"
+                },
+                "4": {
+                    "action": "Verify you can increase and decrease volume level with the volume control",
+                    "expected_results": "Volume level must be increased and decreased \n"
+                },
+                "5": {
+                    "action": "Observe that slider on the seek bar moves along with the video/audio play",
+                    "expected_results": "Video/audio file can be played and slider moves along with the video/audio play \n"
+                },
+                "6": {
+                    "action": "Verify you can navigate the video with the slider back and forward",
+                    "expected_results": "The slider can move back and forward in the seek bar \n"
+                },
+                "7": {
+                    "action": "Verify that seek and volume control are functional in full screen mode",
+                    "expected_results": "Press the full screen mode icon, seek bar and volume control must work fine \n"
+                },
+                "8": {
+                    "action": "Verify that pressing << or >> while playing a file makes the slide goes slow/backwards or faster",
+                    "expected_results": "Verify << and >> works correctly"
+                }
+            },
+            "summary": "Test_Seek_bar_and_volume_control"
+        }
+    }
+]
\ No newline at end of file
diff --git a/meta/lib/oeqa/manual/bsp-qemu.json b/meta/lib/oeqa/manual/bsp-qemu.json
new file mode 100644
index 0000000..1260af4
--- /dev/null
+++ b/meta/lib/oeqa/manual/bsp-qemu.json
@@ -0,0 +1,222 @@
+[
+  {
+    "test": {
+      "@alias": "bsps-qemu.bsps-tools.qemu_can_be_started_with_KVM_enabled",
+      "author": [
+        {
+          "email": "alexandru.c.georgescu@intel.com",
+          "name": "alexandru.c.georgescu@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Build a kernel with KVM enabled  \n\nIn Local.conf add  \n\nQEMU_USE_KVM = \"${@ 'intel-corei7-64 intel-core2-32 qemux86 qemux86-64' if os.access('/dev/kvm', os.R_OK|os.W_OK) else '' }\"  \n\n ",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Start qemu with option \"kvm\" with runqemu \n    a. If you start qemu with kvm failed, maybe it is because host not install kvm and vhost_net module. Follow below link to install them. \n    b. vhost_test refer:  https://wiki.yoctoproject.org/wiki/Running_an_x86_Yocto_Linux_image_under_QEMU_KVM \n    c. kvm refer: https://wiki.yoctoproject.org/wiki/How_to_enable_KVM_for_Poky_qemu",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Check if qemu starts up and if kvm_intel module is used",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "If kvm_intel module is not used when starting qemu, it will show 0 in \"Used by\" column when you run \"lsmod | grep kvm_intel\" ",
+          "expected_results": "KVM enabled with qemu \nExecute \"lsmod | grep kvm_intel\" from your host twice, before and after you \nstart the qemu with kvm option. Before start, the number should be 0, \nafter start, the number should bigger than 0."
+        }
+      },
+      "summary": "qemu_can_be_started_with_KVM_enabled"
+    }
+  },
+  {
+    "test": {
+      "@alias": "bsps-qemu.bsps-tools.Post-installation_logging",
+      "author": [
+        {
+          "email": "yi.zhao@windriver.com",
+          "name": "yi.zhao@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Download the poky source and set environment \n",
+          "expected_results": "The /var/log/postinstall.log should exist in the first boot. The content of this log is like below:  \n\nRunning postinst /etc/rpm-postinsts/man... \nList directory to check the output log \nbin \nboot \ndev \netc \nhome \nlib \nlost+found \nmedia \nmnt \nproc \nrun \nsbin \nsys \ntmp \nusr \nvar \nList nonexist directory to check the stderr redirection log \nls: /nonexist: No such file or directory "
+        },
+        "2": {
+          "action": "Add the following lines to a .bb file. For expample, meta/recipes-connectivity/openssh/openssh_6.2p2.bb:   \n\npkg_postinst_ontarget_${PN} () {  \n       #!/bin/sh -e  \n       if [ x\"$D\" = \"x\" ]; then  \n       echo \"List directory to check the output log\"  \n       ls /  \n       echo \"List nonexist directory to check the stderr redirection log\"  \n       ls /nonexist  \n       else  \n       exit 1  \n       fi  \n}  \n\nMake sure the feature \"debug-tweaks\" is added in conf/local.conf \n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Add ssh-server-openssh to EXTRA_IMAGE_FEATURES in local.conf \n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Build core-image-minimal \n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Boot up the image and check the /var/log/postinstall.log  ",
+          "expected_results": ""
+        }
+      },
+      "summary": "Post-installation_logging"
+    }
+  },
+  {
+    "test": {
+      "@alias": "bsps-qemu.bsps-tools.Add_user_with_cleartext_type_password_during_filesystem_construction",
+      "author": [
+        {
+          "email": "ke.zou@windriver.com",
+          "name": "ke.zou@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Download the poky source and set the environment  \n\n",
+          "expected_results": "No error during image building procedure. \n"
+        },
+        "2": {
+          "action": "Add the following lines in conf/local.conf  \n\nINHERIT += \"extrausers\"  \n\nEXTRA_USERS_PARAMS = \"\\ \nuseradd -s /bin/sh -P 'tester3' tester3;\\ \n\"  \n\nThe above settings do the following things: \na. Add a user tester3 with cleartext password 'tester3' ",
+          "expected_results": "Image can boot up \n"
+        },
+        "3": {
+          "action": "Build the image\n ",
+          "expected_results": "Login with user name \"tester3\" and password \"tester3\" "
+        }
+      },
+      "summary": "Add_user_with_cleartext_type_password_during_filesystem_construction"
+    }
+  },
+  {
+    "test": {
+      "@alias": "bsps-qemu.bsps-tools.rpm_-__install_dependency_package",
+      "author": [
+        {
+          "email": "alexandru.c.georgescu@intel.com",
+          "name": "alexandru.c.georgescu@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Get a not previously installed RPM package or build one on local machine, which should have run-time dependency.For example, \"mc\" (Midnight Commander, which is a visual file manager) should depend on \"ncurses-terminfo\".   \n\n$ bitbake mc  \n\n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Copy the package into a system folder (for example /home/root/rpm_packages).  \n\n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Run \"rpm -ivh package_name\" and check the output, for example \"rpm -ivh mc.rpm*\" should report the dependency on \"ncurses-terminfo\".\n\n\n\n",
+          "expected_results": "3 . rpm command should report message when some RPM installation depends on other packages."
+        }
+      },
+      "summary": "rpm_-__install_dependency_package"
+    }
+  },
+  {
+    "test": {
+      "@alias": "bsps-qemu.bsps-tools.Check_rpm_install/removal_log_file_size(auto)",
+      "author": [
+        {
+          "email": "alexandru.c.georgescu@intel.com",
+          "name": "alexandru.c.georgescu@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Get some rpm or other kind of installation packages.  \n\n",
+          "expected_results": "Steps 1- 4 (more than 2.3) \nEach file will occupy around 10MB, and there should be some method to keep rpm log in a small size. (the size of the db of RPMs must not be taking so much space)  \nStep 5 (less than or equal to 2.3)\nThe size on /var/lib/rpm/ must keep around 30MB"
+        },
+        "2": {
+          "action": "After system is up, check the size of log file named as \"log.xxxxxx\" on  /var/lib/rpm/log  \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "After several install/removal of packages, with either of the install/removal commands   (rpm/smart/zypper/dnf install/removal), check again the size of log file.  \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "For packages installation, there will be some database files under /var/lib/rpm/, named as \"__db.xxx\" and there will be some log files   \nunder /var/lib/rpm/log, named as \"\"log.xxxxxx\"\".   \n\nNote: You will only see the log.xxxx on /var/lib/rpm/log mentioned above if the poky version is minor than 2.3.For poky 2.3 or major versions this has been modified and the package RPM4 does not show the logs.xxxx. if major, follow the next step.  \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Repeat steps (1 and 3)  and check the size of /var/lib/rpm/  \n\nMore info: https://bugzilla.yoctoproject.org/show_bug.cgi?id=9259",
+          "expected_results": ""
+        }
+      },
+      "summary": "Check_rpm_install/removal_log_file_size"
+    }
+  },
+  {
+    "test": {
+      "@alias": "bsps-qemu.bsps-runtime.only_one_connmand_in_background(auto)",
+      "author": [
+        {
+          "email": "alexandru.c.georgescu@intel.com",
+          "name": "alexandru.c.georgescu@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Boot system",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Run \"ps aux |grep connmand\" or \"ps -ef | grep connmand\" or \"ps | grep connmand\"",
+          "expected_results": "Connmand (connection manager, used to manage internet connections)  should be shown as an active process \n\n"
+        },
+        "3": {
+          "action": "Run command \"connmand\" to try to launch to a second connmand process",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Check, with \"ps\" connmand  if a second connmand can be generated ",
+          "expected_results": "There should be only one connmand process instance in background ."
+        }
+      },
+      "summary": "only_one_connmand_in_background"
+    }
+  },
+  {
+    "test": {
+      "@alias": "bsps-qemu.bsps-runtime.X_server_can_start_up_with_runlevel_5_boot",
+      "author": [
+        {
+          "email": "alexandru.c.georgescu@intel.com",
+          "name": "alexandru.c.georgescu@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "boot up system with default runlevel  \n\n",
+          "expected_results": "X server can start up well and desktop display has no problem .  \n\n"
+        },
+        "2": {
+          "action": "type runlevel at command prompt",
+          "expected_results": "Output:N 5"
+        }
+      },
+      "summary": "X_server_can_start_up_with_runlevel_5_boot"
+    }
+  },
+  {
+    "test": {
+      "@alias": "bsps-qemu.bsps-runtime.check_bash_in_image",
+      "author": [
+        {
+          "email": "alexandru.c.georgescu@intel.com",
+          "name": "alexandru.c.georgescu@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "After system is up, check if bash command exists with command \"which bash\"",
+          "expected_results": "bash command should exist in image giving something as below  \"/bin/bash\""
+        }
+      },
+      "summary": "check_bash_in_image"
+    }
+  }
+]
\ No newline at end of file
diff --git a/meta/lib/oeqa/manual/build-appliance.json b/meta/lib/oeqa/manual/build-appliance.json
new file mode 100644
index 0000000..b8f8927
--- /dev/null
+++ b/meta/lib/oeqa/manual/build-appliance.json
@@ -0,0 +1,122 @@
+[
+    {
+        "test": {
+            "@alias": "build-appliance.build-appliance.Bitbake_build-appliance-image",
+            "author": [
+                {
+                    "email": "alexandru.c.georgescu@intel.com",
+                    "name": "alexandru.c.georgescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Get poky source code and prepare the build environment",
+                    "expected_results": "bitbake build-appliance-image is successful  "
+                },
+                "2": {
+                    "action": "Set MACHINE to qemux86 and add the following line to conf/local.conf :  SRCREV_pn-build-appliance-image = \"${AUTOREV}\"",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "Run \"bitbake build-appliance-image\" \n \n",
+                    "expected_results": ""
+                }
+            },
+            "summary": "Bitbake_build-appliance-image"
+        }
+    },
+    {
+        "test": {
+            "@alias": "build-appliance.build-appliance.Build_core-image-minimal_with_build-appliance-image",
+            "author": [
+                {
+                    "email": "corneliux.stoicescu@intel.com",
+                    "name": "corneliux.stoicescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Build with AUTOREV or download from Autobuilder an image for Yocto Build Appliance.  ",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Boot the image under VMWare Player.  ",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "Build qemux86 core-image-minimal using bitbake command line in the build-appliance-image  ",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "Launch the image just built using runqemu.  ",
+                    "expected_results": "core-image-minimal should build and boot. "
+                }
+            },
+            "summary": "Build_core-image-minimal_with_build-appliance-image"
+        }
+    },
+    {
+        "test": {
+            "@alias": "build-appliance.build-appliance.Build_a_image_without_error_(added_recipe)",
+            "author": [
+                {
+                    "email": "sstncr@gmail.com",
+                    "name": "sstncr@gmail.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Launch Build Appliance",
+                    "expected_results": "User could build a image without error and the added package is in the image"
+                },
+                "2": {
+                    "action": "Set \"Machine\" in conf/local.conf, for example, qemuarm",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "Install a new package to the image, for example, acpid. Set the following line in conf/local.conf: IMAGE_INSTALL_append = \" acpid\"",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "Build a image using bitbake command line, for example, bitbake core-image-minimal",
+                    "expected_results": ""
+                },
+                "5": {
+                    "action": "After build finished, launch the image and check if the added package built into image",
+                    "expected_results": ""
+                }
+            },
+            "summary": "Build_a_image_without_error_(added_recipe)."
+        }
+    },
+    {
+        "test": {
+            "@alias": "build-appliance.build-appliance.Create_core-image-sato-sdk_using_build_appliance",
+            "author": [
+                {
+                    "email": "ee.peng.yeoh@intel.com",
+                    "name": "ee.peng.yeoh@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Build with AUTOREV or download from Autobuilder an image for Yocto Build Appliance.  ",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Boot the image under VMWare Player.  ",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "Build qemux86 core-image-sato-sdk using bitbake command line in the build-appliance-image  ",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "Launch the image just built using runqemu. ",
+                    "expected_results": ""
+                }
+            },
+            "summary": "Create_core-image-sato-sdk_using_build_appliance"
+        }
+    }
+]
\ No newline at end of file
diff --git a/meta/lib/oeqa/manual/crops.json b/meta/lib/oeqa/manual/crops.json
new file mode 100644
index 0000000..1cf3c8f
--- /dev/null
+++ b/meta/lib/oeqa/manual/crops.json
@@ -0,0 +1,294 @@
+[
+    {
+        "test": {
+            "@alias": "crops-default.crops-default.sdkext_eSDK_devtool_build_make",
+            "author": [
+                {
+                    "email": "francisco.j.pedraza.gonzalez@intel.com",
+                    "name": "francisco.j.pedraza.gonzalez@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "IMPORTANT NOTE: The firsts 5 steps refer to configuration of the environment to run the rest of the steps. These only apply for CROPS-eSDK.    \n\n\n\n",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": " Initiate your Crops-esdk environment as it says in wiki https://github.com/crops/docker-win-mac-docs/wiki   \n\n",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "Create the following tree of files  <crops-esdk-workdir-workspace>/sdkext/files/myapp <crops-esdk-workdir-workspace>/sdkext/files/myapp_cmake   \n\n\n",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": " Create the following files withing the myapp directory  myapp.c and the Makefile. Write the following inside of each file: \n---------------------------------------- \nMakefile should contain  \n\nall: myapp  \n\nmyapp: myapp.o \n\t$(CC) $(LDFLAGS) $< -o $@  \n\nmyapp.o: myapp.c  \n\t$(CC) $(CFLAGS) -c $< -o $@ \n\nclean: \n\trm -rf myapp.o myapp  \n\n-----------------------------  \nmyapp.c  shold contain  \n\n\n#include <stdio.h>    \n\nint \nmain(int argc, char *argv[]) \n{ \n\tprintf(\"Hello world\\n\"); \n \n\treturn 0; \n} \n------------------------------------  \n\n",
+                    "expected_results": "be sure that the indentations on the makefile are tabs not spaces.  \n\n"
+                },
+                "5": {
+                    "action": " Create the following files within the myapp_cmake directory CMakeLists.txt and myapp.c. Write the following inside each file:  \n\n------------------------------------ \nCMakeLists.txt should contain:  \n\ncmake_minimum_required (VERSION 2.6) \nproject (myapp) \n# The version number. \nset (myapp_VERSION_MAJOR 1) \nset (myapp_VERSION_MINOR 0)  \n\n# add the executable \nadd_executable (myapp myapp.c)  \n\ninstall(TARGETS myapp \nRUNTIME DESTINATION bin)  \n\n------------------------------------------ \nmyapp.c should contain:  \n\n#include <stdio.h>     \n\nint  \nmain(int argc, char *argv[])  \n{ \n\tprintf(\"Hello world\\n\");  \n\n\treturn 0; \n} \n-------------------------------------------------  \n\n",
+                    "expected_results": "Be sure that the indentations on CMakeLists.txt is tabs not spaces."
+                },
+                "6": {
+                    "action": " source environment-setup-i586-poky-linux  \n\n",
+                    "expected_results": "This should output a message that says SDK environment now set up; additionally you may now run devtool to perform development tasks etc etc ...   \n\n"
+                },
+                "7": {
+                    "action": " run command which devtool  \n\n",
+                    "expected_results": "this should output the directory of the devtool script and it should be within the sdk workdir you are working in.  \n\n  "
+                },
+                "8": {
+                    "action": "devtool add myapp <directory>(this is myapp dir)    \n\n\n",
+                    "expected_results": "The directory you should input is the myapp directory. This should automatically create the recipe myapp.bb under <crops-esdk-workdir-workspace>/recipes/myapp/myapp.bb"
+                },
+                "9": {
+                    "action": " devtool build myapp  \n\n",
+                    "expected_results": "This should compile an image"
+                },
+                "10": {
+                    "action": " devtool reset myapp  ",
+                    "expected_results": "This cleans sysroot of the myapp recipe, but it leaves the source tree intact. meaning it does not erase."
+                }
+            },
+            "summary": "sdkext_eSDK_devtool_build_make"
+        }
+    },
+    {
+        "test": {
+            "@alias": "crops-default.crops-default.sdkext_devtool_build_esdk_package",
+            "author": [
+                {
+                    "email": "francisco.j.pedraza.gonzalez@intel.com",
+                    "name": "francisco.j.pedraza.gonzalez@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "IMPORTANT NOTE: The firsts 5 steps refer to configuration of the environment to run the rest of the steps. These only apply for CROPS-eSDK.    \n\n\n\n",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": " Initiate your Crops-esdk environment as it says in wiki https://github.com/crops/docker-win-mac-docs/wiki   \n\n",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": " Create the following tree of files    <crops-esdk-workdir-workspace>/sdkext/files/myapp/ \n <crops-esdk-workdir-workspace>/sdkext/files/myapp_cmake  \n\n",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": " Create the following files withing the myapp directory  myapp.c and the Makefile. Write the following inside of each file: \n---------------------------------------- \nMakefile should contain  \n\nall: myapp  \n\nmyapp: myapp.o \n\t$(CC) $(LDFLAGS) $< -o $@ \n\nmyapp.o: myapp.c  \n\t$(CC) $(CFLAGS) -c $< -o $@ \n\nclean: \n\trm -rf myapp.o myapp  \n\n-----------------------------  \nmyapp.c  shold contain  \n\n#include <stdio.h>   \n\nint \nmain(int argc, char *argv[]) \n{ \n\tprintf(\"Hello world\\n\"); \n \n\treturn 0; \n} \n------------------------------------  \n\n",
+                    "expected_results": "be sure that the indentations on the makefile are tabs not spaces.  \n\n"
+                },
+                "5": {
+                    "action": " Create the following files within the myapp_cmake directory CMakeLists.txt and myapp.c. Write the following inside each file:  \n\n------------------------------------ \nCMakeLists.txt should contain:  \n\ncmake_minimum_required (VERSION 2.6) \nproject (myapp) \n# The version number. \nset (myapp_VERSION_MAJOR 1) \nset (myapp_VERSION_MINOR 0)  \n\n# add the executable \nadd_executable (myapp myapp.c)  \n\ninstall(TARGETS myapp \nRUNTIME DESTINATION bin)  \n\n------------------------------------------ \nmyapp.c should contain:  \n\n#include<stdio.h>     \n\nint  \nmain(int argc, char *argv[])  \n{ \n\tprintf(\"Hello world\\n\");  \n\n\treturn 0; \n} \n-------------------------------------------------  \n\n",
+                    "expected_results": "Be sure that the indentations on CMakeLists.txt is tabs not spaces.  \n\n"
+                },
+                "6": {
+                    "action": " source environment-setup-i586-poky-linux  \n\n",
+                    "expected_results": "This should output a message that says SDK environment now set up; additionally you may now run devtool to perform development tasks etc etc ...  \n\n"
+                },
+                "7": {
+                    "action": " run command which devtool  \n\n",
+                    "expected_results": " this should output the directory of the devtool script and it should be within the sdk workdir you are working in.  \n\n"
+                },
+                "8": {
+                    "action": " devtool add myapp <directory>  (this is myapp dir)  \n\n",
+                    "expected_results": " The directory you should input is the myapp directory. This should automatically create the recipe myapp.bb under <crops-esdk-workdir-workspace>/recipes/myapp/myapp.bb  \n\n"
+                },
+                "9": {
+                    "action": " devtool package myapp  \n\n",
+                    "expected_results": " you should expect a package creation of myapp and it should be under the  /tmp/deploy/  \n\n"
+                },
+                "10": {
+                    "action": " devtool reset myapp  ",
+                    "expected_results": "This cleans sysroot of the myapp recipe, but it leaves the source tree intact. meaning it does not erase.\n</package_format>"
+                }
+            },
+            "summary": "sdkext_devtool_build_esdk_package"
+        }
+    },
+    {
+        "test": {
+            "@alias": "crops-default.crops-default.sdkext_devtool_build_cmake",
+            "author": [
+                {
+                    "email": "francisco.j.pedraza.gonzalez@intel.com",
+                    "name": "francisco.j.pedraza.gonzalez@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "IMPORTANT NOTE: The firsts 5 steps refer to configuration of the environment to run the rest of the steps. These only apply for CROPS-eSDK.    \n\n\n\n",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": " Initiate your Crops-esdk environment as it says in wiki https://github.com/crops/docker-win-mac-docs/wiki   \n\n",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": " Create the following tree of files    <crops-esdk-workdir-workspace>/sdkext/files/myapp \n <crops-esdk-workdir-workspace>/sdkext/files/myapp_cmake  \n\n",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": " Create the following files withing the myapp directory  myapp.c and the Makefile. Write the following inside of each file: \n---------------------------------------- \nMakefile should contain  \n\nall: myapp  \n\nmyapp: myapp.o \n\t$(CC) $(LDFLAGS) $< -o $@ \n\nmyapp.o: myapp.c  \n\t$(CC) $(CFLAGS) -c $< -o $@ \n\nclean: \n\trm -rf myapp.o myapp  \n\n-----------------------------  \nmyapp.c  shold contain  \n\n#include <stdio.h>   \n\nint \nmain(int argc, char *argv[]) \n{ \n\tprintf(\"Hello world\\n\"); \n \n\treturn 0; \n} \n------------------------------------  \n\n",
+                    "expected_results": "be sure that the indentations on the makefile are tabs not spaces.   \n\n"
+                },
+                "5": {
+                    "action": " Create the following files within the myapp_cmake directory CMakeLists.txt and myapp.c. Write the following inside each file:  \n\n------------------------------------ \nCMakeLists.txt should contain:  \n\ncmake_minimum_required (VERSION 2.6) \nproject (myapp) \n# The version number. \nset (myapp_VERSION_MAJOR 1) \nset (myapp_VERSION_MINOR 0)  \n\n# add the executable \nadd_executable (myapp myapp.c)  \n\ninstall(TARGETS myapp \nRUNTIME DESTINATION bin)  \n\n------------------------------------------ \nmyapp.c should contain:  \n\n#include    \n\nint  \nmain(int argc, char *argv[])  \n{ \n\tprintf(\"Hello world\\n\");  \n\n\treturn 0; \n} \n-------------------------------------------------  \n\n",
+                    "expected_results": "Be sure that the indentations on CMakeLists.txt is tabs not spaces.  \n\n"
+                },
+                "6": {
+                    "action": " source environment-setup-i586-poky-linux  \n\n",
+                    "expected_results": "This should output a message that says SDK environment now set up; additionally you may now run devtool to perform development tasks etc etc ...  \n\n"
+                },
+                "7": {
+                    "action": " run command which devtool  \n\n",
+                    "expected_results": "this should output the directory of the devtool script and it should be within the sdk workdir you are working in.  \n\n"
+                },
+                "8": {
+                    "action": " devtool add myapp <directory>   (this is myapp_cmake dir)  \n\n",
+                    "expected_results": "The directory you should input is the myapp_cmake directory. This should automatically create the recipe myapp.bb under <crops-esdk-workdir-workspace>/recipes/myapp/myapp.bb  \n\n"
+                },
+                "9": {
+                    "action": " devtool build myapp  \n\n",
+                    "expected_results": "This should compile an image  \n\n"
+                },
+                "10": {
+                    "action": " devtool reset myapp  ",
+                    "expected_results": "This cleans sysroot of the myapp recipe, but it leaves the source tree intact. meaning it does not erase.  "
+                }
+            },
+            "summary": "sdkext_devtool_build_cmake"
+        }
+    },
+    {
+        "test": {
+            "@alias": "crops-default.crops-default.sdkext_extend_autotools_recipe_creation",
+            "author": [
+                {
+                    "email": "francisco.j.pedraza.gonzalez@intel.com",
+                    "name": "francisco.j.pedraza.gonzalez@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "IMPORTANT NOTE: The firsts 2 steps refer to configuration of the environment to run the rest of the steps. These only apply for CROPS-eSDK.    \n\n\n\n",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Initiate your Crops-esdk environment as it says in wiki https://github.com/crops/docker-win-mac-docs/wiki   \n\n",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": " source environment-setup-i586-poky-linux  \n\n",
+                    "expected_results": " This should output a message that says SDK environment now set up; additionally you may now run devtool to perform development tasks etc etc ...   \n\n"
+                },
+                "4": {
+                    "action": "run command which devtool  \n\n",
+                    "expected_results": "this should output the directory of the devtool script and it should be within the sdk workdir you are working in.   \n\n"
+                },
+                "5": {
+                    "action": "devtool sdk-install -s libxml2  \n\n",
+                    "expected_results": "this should install libxml2   \n\n"
+                },
+                "6": {
+                    "action": "devtool add librdfa  https://github.com/rdfa/librdfa  \n\n",
+                    "expected_results": "This should automatically create the recipe librdfa.bb under /recipes/librdfa/librdfa.bb   \n\n"
+                },
+                "7": {
+                    "action": "devtool build librdfa  \n\n",
+                    "expected_results": "This should compile   \n\n"
+                },
+                "8": {
+                    "action": "devtool reset librdfa  ",
+                    "expected_results": "This cleans sysroot of the librdfa recipe, but it leaves the source tree intact. meaning it does not erase."
+                }
+            },
+            "summary": "sdkext_extend_autotools_recipe_creation"
+        }
+    },
+    {
+        "test": {
+            "@alias": "crops-default.crops-default.sdkext_devtool_kernelmodule",
+            "author": [
+                {
+                    "email": "francisco.j.pedraza.gonzalez@intel.com",
+                    "name": "francisco.j.pedraza.gonzalez@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "IMPORTANT NOTE: The firsts 2 steps refer to configuration of the environment to run the rest of the steps. These only apply for CROPS-eSDK.    \n\n\n",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": " Initiate your Crops-esdk environment as it says in wiki https://github.com/crops/docker-win-mac-docs/wiki   \n\n",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "source environment-setup-i586-poky-linux   \n\n",
+                    "expected_results": "This should output a message that says SDK environment now set up; additionally you may now run devtool to perform development tasks etc etc ...   \n \n"
+                },
+                "4": {
+                    "action": "run command which devtool  \n\n",
+                    "expected_results": "this should output the directory of the devtool script and it should be within the sdk workdir you are working in.   \n\n"
+                },
+                "5": {
+                    "action": "devtool add v4l2loopback-driver  https://github.com/umlaeute/v4l2loopback.git   \n\n",
+                    "expected_results": "This should automatically create the recipe v4l2loopback-driver.bb under <crops-esdk-workdir-workspace>/recipes/v4l2loopback-driver/v4l2loopback-driver.bb "
+                },
+                "6": {
+                    "action": "devtool build v4l2loopback-driver   \n\n",
+                    "expected_results": "This should compile an image   \n\n"
+                },
+                "7": {
+                    "action": "devtool reset v4l2loopback-driver   ",
+                    "expected_results": "This cleans sysroot of the v4l2loopback-driver recipe, but it leaves the source tree intact. meaning it does not erase."
+                }
+            },
+            "summary": "sdkext_devtool_kernelmodule"
+        }
+    },
+    {
+        "test": {
+            "@alias": "crops-default.crops-default.sdkext_recipes_for_nodejs",
+            "author": [
+                {
+                    "email": "francisco.j.pedraza.gonzalez@intel.com",
+                    "name": "francisco.j.pedraza.gonzalez@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "IMPORTANT NOTE: The firsts 2 steps refer to configuration of the environment to run the rest of the steps. These only apply for CROPS-eSDK.    \n\n\nlets say variable npm = npm://registry.npmjs.org;name=winston;version=2.2.0   \n\n",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Initiate your Crops-esdk environment as it says in wiki https://github.com/crops/docker-win-mac-docs/wiki   \n\n",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "source environment-setup-i586-poky-linux   \n\n",
+                    "expected_results": "This should output a message that says SDK environment now set up; additionally you may now run devtool to perform development tasks etc etc ...   \n\n"
+                },
+                "4": {
+                    "action": "run command which devtool   \n\n",
+                    "expected_results": "this should output the directory of the devtool script and it should be within the sdk workdir you are working in.  \n\n"
+                },
+                "5": {
+                    "action": " 4a) git clone git://git.openembedded.org/meta-openembedded in  layers/build  directory   \n \n4b) Add meta-openembedded/meta-oe in bblayer.conf as mentioned below: ${SDKBASEMETAPATH}/layers/build/meta-openembedded/meta-oe \\   \n\n4c) devtool add \"npm://registry.npmjs.org;name=npm;version=2.2.0\"   \n\n",
+                    "expected_results": " This should automatically create the recipe npm.bb under /recipes/npm/npm.bb  \n\n"
+                },
+                "6": {
+                    "action": "devtool build npm   \n\n",
+                    "expected_results": "This should compile an image  \n\n"
+                },
+                "7": {
+                    "action": " devtool reset npm",
+                    "expected_results": "This cleans sysroot of the npm recipe, but it leaves the source tree intact. meaning it does not erase."
+                }
+            },
+            "summary": "sdkext_recipes_for_nodejs"
+        }
+    }
+]
\ No newline at end of file
diff --git a/meta/lib/oeqa/manual/eclipse-plugin.json b/meta/lib/oeqa/manual/eclipse-plugin.json
new file mode 100644
index 0000000..9869150
--- /dev/null
+++ b/meta/lib/oeqa/manual/eclipse-plugin.json
@@ -0,0 +1,322 @@
+[
+    {
+        "test": {
+            "@alias": "eclipse-plugin.eclipse-plugin.support_SSH_connection_to_Target",
+            "author": [
+                {
+                    "email": "ee.peng.yeoh@intel.com",
+                    "name": "ee.peng.yeoh@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "In Eclipse, swich to Remote System Explorer to create a connention baseed on SSH, input the remote target IP address as the Host name, make sure disable the proxy in Window->Preferences->General->Network Connection, set Direct as Active Provider field.  ",
+                    "expected_results": "the connection based on SSH could be set up."
+                },
+                "2": {
+                    "action": "Configure connection from Eclipse: Run->Run Configurations->C/C++ Remote Application\\ ->New Connection->General->SSH Only  ",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "Then right click to connect, input the user ID and password.  ",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "expand the connection, it will show the Sftp Files etc.   \nNOTE. Might need to change dropbear to openssh and add the packagegroup-core-eclipse-debug recipe",
+                    "expected_results": ""
+                }
+            },
+            "summary": "support_SSH_connection_to_Target"
+        }
+    },
+    {
+        "test": {
+            "@alias": "eclipse-plugin.eclipse-plugin.Launch_QEMU_from_Eclipse",
+            "author": [
+                {
+                    "email": "ee.peng.yeoh@intel.com",
+                    "name": "ee.peng.yeoh@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Set the Yocto ADT's toolchain root location, sysroot location and kernel, in the menu Window -> Preferences -> Yocto ADT.   \n \n",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "wget  autobuilder.yoctoproject.org/pub/releases//machines/qemu/qemux86/qemu (ex:core-image-sato-sdk-qemux86-date-rootfs-tar-bz2) \nsource /opt/poky/version/environment-setup-i585-poky-linux  \n\nExtract qemu with runqemu-extract-sdk /home/user/file(ex.core-image-sato-sdk-qemux86.bz2) \n/home/user/qemux86-sato-sdk  \n\n",
+                    "expected_results": " Qemu can be lauched normally."
+                },
+                "3": {
+                    "action": "(a)Point to the Toolchain:  \n \nIf you are using a stand-alone pre-built toolchain, you should be pointing to the /opt/poky/{test-version} directory as Toolchain Root Location. This is the default location for toolchains installed by the ADT Installer or by hand. If ADT is installed in other location, use that location as Toolchain location.\nIf you are using a system-derived toolchain, the path you provide for the Toolchain Root Location field is the Yocto Project's build directory.  \n \n           E.g:/home/user/yocto/poky/build \n",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "(b)Specify the Sysroot Location: \nSysroot Location is the location where the root filesystem for the target hardware is created on the development system by the ADT Installer (SYSROOT in step 2 of the case ADT installer Installation).  \n   \n         Local :     e.g: /home/user/qemux86-sato-sdk \nUsing ADT : e.g :/home/user/test-yocto/qemux86  \n\n",
+                    "expected_results": ""
+                },
+                "5": {
+                    "action": "(c)Select the Target Architecture:  \n \nThe target architecture is the type of hardware you are going to use or emulate. Use the pull-down Target Architecture menu to make your selection.  \n \n\n",
+                    "expected_results": ""
+                },
+                "6": {
+                    "action": "(d) QEMU: \nSelect this option if you will be using the QEMU emulator. Specify the Kernel matching the QEMU architecture you are using. \n      wget  autobuilder.yoctoproject.org/pub/releases//machines/qemu/qemux86/bzImage-qemux86.bin \n      e.g: /home/$USER/yocto/adt-installer/download_image/bzImage-qemux86.bin  \n\n",
+                    "expected_results": ""
+                },	
+                "7": {
+                    "action": "(e) select OK to save the settings.  \n\n\n1: In the Eclipse toolbar, expose the Run -> External Tools menu. Your image should appear as a selectable menu item.  \n2: Select your image in the navigation pane to launch the emulator in a new window. \n3: If needed, enter your host root password in the shell window at the prompt. This sets up a Tap 0 connection needed for running in user-space NFS mode. \n",
+                    "expected_results": ""
+                }				
+            },
+            "summary": "Launch_QEMU_from_Eclipse"
+        }
+    },
+    {
+        "test": {
+            "@alias": "eclipse-plugin.eclipse-plugin.Relocatable_SDK_-_C_-_Build_Hello_World_ANSI_C_Autotools_Project",
+            "author": [
+                {
+                    "email": "ee.peng.yeoh@intel.com",
+                    "name": "ee.peng.yeoh@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Launch a QEMU of target enviroment.(Reference to case \"ADT - Launch qemu by eclipse\") ",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Select File -> New -> Project.",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "Double click C/C++.",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "Click C or C++ Project to create the project.",
+                    "expected_results": ""
+                },
+                "5": {
+                    "action": "Expand Yocto ADT Project.",
+                    "expected_results": ""
+                },
+                "6": {
+                    "action": "Select Hello World ANSI C Autotools Project.",
+                    "expected_results": ""
+                },
+                "7": {
+                    "action": "Put a name in the Project name. Do not use hyphens as part of the name. \n \n",
+                    "expected_results": ""
+                },
+                "8": {
+                    "action": "Click Next.",
+                    "expected_results": ""
+                },
+                "9": {
+                    "action": "Add information in the Author and Copyright notice fields. \n1",
+                    "expected_results": ""
+                },
+                "10": {
+                    "action": "Click Finish. \n1",
+                    "expected_results": ""
+                },
+                "11": {
+                    "action": "If the \"open perspective\" prompt appears, click \"Yes\" so that you open the C/C++ perspective. \n1",
+                    "expected_results": ""
+                },
+                "12": {
+                    "action": "In the Project Explorer window, right click the project -> Reconfigure project. \n1",
+                    "expected_results": ""
+                },
+                "13": {
+                    "action": "In the Project Explorer window, right click the project -> Build project. \n1",
+                    "expected_results": "Under the Project files, a new folder appears called Binaries. This indicates that the compilation have been successful and the project binary have been created. \n"
+                },
+                "14": {
+                    "action": "Right click it again and Run as -> Run Configurations.  \n\t\t\tUnder Run Configurations expand \"C/C++ Remote Application\". A configuration for the current project should appear. Clicking it will display the configuration settings. \n\t\t\tin \"C/C++ Application\" field input Remote Absolute File path for C/C++ Application. e.g.: /home/root/myapplication \n\t\t\tIn \"Connection\" drop-down list make sure a TCF connection is set up for your target. If not, create a new one by clicking the New button. \n1",
+                    "expected_results": "step 14 to step 16 -> Build succeed and the console outputs Hello world, you can also check the output on target."
+                },
+                "15": {
+                    "action": "After all settings are done, select the Run button on the bottom right corner \n\n1",
+                    "expected_results": ""
+                },
+                "16": {
+                    "action": "Repeat the steps 14-15, but instead of using Run Configurations use Debug Configurations: \nRight click it again and Debug as -> Debug Configurations \nUnder Debug Configurations expand \"C/C++ Remote Application\". A configuration for the current project should appear. Clicking it will display the configuration settings. \nin \"C/C++ Application\" field input Remote Absolute File path for C/C++ Application.\ne.g.: /home/root/myapplication \nIn \"Connection\" drop-down list make sure a TCF connection is set up for your target. If not, create a new one by clicking the New button \n1",
+                    "expected_results": ""
+                },
+                "17": {
+                    "action": "After all settings are done, select the Debug button on the bottom right corner",
+                    "expected_results": ""
+                }
+            },
+            "summary": "Relocatable_SDK_-_C_-_Build_Hello_World_ANSI_C_Autotools_Project"
+        }
+    },
+    {
+        "test": {
+            "@alias": "eclipse-plugin.eclipse-plugin.Relocatable_SDK_-_C++_-_Build_Hello_World_C++_Autotools_project",
+            "author": [
+                {
+                    "email": "ee.peng.yeoh@intel.com",
+                    "name": "ee.peng.yeoh@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Launch a QEMU of target enviroment.(Reference to case \"ADT - Launch qemu by eclipse\") ",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Select File -> New -> Project. ",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "Double click C/C++. ",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "Click C or C++ Project to create the project. ",
+                    "expected_results": ""
+                },
+                "5": {
+                    "action": "Expand Yocto ADT Project. ",
+                    "expected_results": ""
+                },
+                "6": {
+                    "action": "Select Hello World ANSI C++ Autotools Project. ",
+                    "expected_results": ""
+                },
+                "7": {
+                    "action": "Put a name in the Project name. Do not use hyphens as part of the name.  \n \n",
+                    "expected_results": ""
+                },
+                "8": {
+                    "action": "Click Next.",
+                    "expected_results": ""
+                },
+                "9": {
+                    "action": "Add information in the Author and Copyright notice fields.",
+                    "expected_results": ""
+                },
+                "10": {
+                    "action": "Click Finish. \n1",
+                    "expected_results": ""
+                },
+                "11": {
+                    "action": "If the \"open perspective\" prompt appears, click \"Yes\" so that you open the C/C++ perspective. \n1",
+                    "expected_results": ""
+                },
+                "12": {
+                    "action": "In the Project Explorer window, right click the project -> Reconfigure project. \n1",
+                    "expected_results": ""
+                },
+                "13": {
+                    "action": "In the Project Explorer window, right click the project -> Build project. \n\n1",
+                    "expected_results": "under the Project files, a new folder appears called Binaries. This indicates that the compilation have been successful and the project binary have been created.  \n"
+                },
+                "14": {
+                    "action": "Right click it again and Run as -> Run Configurations. \n\t\t\tUnder Run Configurations expand \"C/C++ Remote Application\". A configuration for the current project should appear. Clicking it will display the configuration settings. \n\t\t\tin \"C/C++ Application\" field input Remote Absolute File path for C/C++ Application. e.g.: /home/root/myapplication \n\t\t\tIn \"Connection\" drop-down list make sure a TCF connection is set up for your target. If not, create a new one by clicking the New button. \n1",
+                    "expected_results": "step 14 to step 16 -> Build succeed and the console outputs Hello world, you can also check the output on target."
+                },
+                "15": {
+                    "action": "After all settings are done, select the Run button on the bottom right corner \n\n1",
+                    "expected_results": ""
+                },
+                "16": {
+                    "action": "Repeat the steps 14-15, but instead of using Run Configurations use Debug Configurations: \n\t\tRight click it again and Debug as -> Debug Configurations \n\t\tUnder Debug Configurations expand \"C/C++ Remote Application\". A configuration for the current project should appear. Clicking it will display the configuration settings. \n\t\tin \"C/C++ Application\" field input Remote Absolute File path for C/C++ Application. \n\t\te.g.: /home/root/myapplication \n\t\tIn \"Connection\" drop-down list make sure a TCF connection is set up for your target. If not, create a new one by clicking the New button \n1",
+                    "expected_results": ""
+                },
+                "17": {
+                    "action": "After all settings are done, select the Debug button on the bottom right corner",
+                    "expected_results": ""
+                }
+            },
+            "summary": "Relocatable_SDK_-_C++_-_Build_Hello_World_C++_Autotools_project"
+        }
+    },
+    {
+        "test": {
+            "@alias": "eclipse-plugin.eclipse-plugin.Build_Eclipse_Plugin_from_source",
+            "author": [
+                {
+                    "email": "laurentiu.serban@intel.com",
+                    "name": "laurentiu.serban@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Clone eclipse-poky source.   \n    \n    - git clone git://git.yoctoproject.org/eclipse-poky  \n\n",
+                    "expected_results": "Eclipse plugin is successfully installed  \n\nDocumentation is there. For example if you have release yocto-2.0.1 you will found on   http://autobuilder.yoctoproject.org/pub/releases/yocto-2.0.1/eclipse-plugin/mars/  archive with documentation like org.yocto.doc-development-$date.zip  \n  \n"
+                },
+                "2": {
+                    "action": "Checkout correct tag.  \n\n    - git checkout <eclipse-version>/<yocto-version> \n\n",
+                    "expected_results": "After plugin is build you must have  4 archive in foder scripts from eclipse-poky:  \n     - org.yocto.bc - mars-master-$date.zip  \n     - org.yocto.doc - mars-master-$date.zip    --> documentation  \n     - org.yocto.sdk - mars-master-$date.zip       \n     - org.yocto.sdk - mars-master-$date.-archive.zip  --> plugin  "
+                },
+                "3": {
+                    "action": "Move to scripts/ folder.  \n\n",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "Run ./setup.sh  \n\n",
+                    "expected_results": ""
+                },
+                "5": {
+                    "action": "When the script finishes, it prompts a command to issue to build the plugin. It should look similar to the following:  \n\n$ ECLIPSE_HOME=/eclipse-poky/scripts/eclipse ./build.sh /&1 | tee -a build.log  \n\nHere, the three arguments to the build script are tag name, branch for documentation and release name.  \n\n",
+                    "expected_results": ""
+                },
+                "6": {
+                    "action": "On an eclipse without the Yocto Plugin, select \"Install New Software\" from Help pull-down menu  \n\n",
+                    "expected_results": ""
+                },
+                "7": {
+                    "action": "Select Add and from the dialog choose Archive...  Look for the *archive.zip file that was built previously with the build.sh script. Click OK.  \n\n",
+                    "expected_results": ""
+                },
+                "8": {
+                    "action": "Select all components and proceed with Installation of plugin. Restarting eclipse might be required.\n",
+                    "expected_results": ""
+                }
+            },
+            "summary": "Build_Eclipse_Plugin_from_source"
+        }
+    },
+    {
+        "test": {
+            "@alias": "eclipse-plugin.eclipse-plugin.Eclipse_Poky_installation_and_setup",
+            "author": [
+                {
+                    "email": "ee.peng.yeoh@intel.com",
+                    "name": "ee.peng.yeoh@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Install SDK  \n\ta)Download https://autobuilder.yocto.io/pub/releases//toolchain/x86_64/poky-glibc-x86_64-core-\timage-sato-i586-toolchain-.sh  \n\tb)Run the SDK installer and accept the default installation directory ",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Install \"Eclipse IDE for C/C++ Developers\" Oxygen release (4.7.0)  \n\ta) Go to https://www.eclipse.org/downloads/packages/all, click \"Oxygen R\"  \n\tb) Click to download the build for your OS  \n\tc) Click \"Download\" button to download from a mirror  \n\td) Run \"tar xf\" to extract the downloaded archive  ",
+                    "expected_result": ""
+                },
+                "3": {
+                    "action": "Install \"Eclipse IDE for C/C++ Developers\" Oxygen release (4.7.0) (Continue)  \n\te) Run \"eclipse/eclipse\" to start Eclipse  \n\tf) Optional step for host machine within Intel network: In Eclipse workbench window, go to \"Window\" menu -> \"Preferences...\".  \n\tg) In \"Preferences\" dialog, go to \"General\" -> \"Network Connections\", set \"Active Provider\" to \"Manual\". In \"Proxy \tentries\" table, select HTTP and click \"Edit\" and enter host \"proxy-chain.intel.com\" port 911, click OK. Repeat for HTTPS with port 912 \nClick OK to close \"Preferences\" dialog.  \n\th) Go to \"File\" menu -> \"Restart\" to restart Eclipse for proxy settings to take effect. ",
+                    "expected_result": ""
+                },
+                "4": {
+                    "action": "Install Eclipse Poky plugins  \n\ta) Download https://autobuilder.yocto.io/pub/releases/<yocto-version>/eclipse-plugin/<eclipse-version>/org.yocto.sdk-development-<date>-archive.zip   \n\tb) In Eclipse workbench window, go to \"Help\" menu -> \"Install New Software...\"  \n\tc) In \"Install\" dialog, click \"Add...\" button  \n\td) In \"Add Repository\" dialog, enter \"Eclipse Poky\" for (repository) Name, click \"Archive...\"  ",
+                    "expected_results": ""
+                },
+                "5": {
+                    "action": "Install Eclipse Poky plugins (continue)  \n\te) In \"Repository archive\" browse dialog, select the downloaded Eclipse Poky repository archive  \n\tf) Back in \"Add Repository\" dialog, click \"OK\"  \n\tg) Back in \"Install\" dialog, make sure \"Work with:\" is set to \"Eclipse Poky\" repository, tick \"Yocto Project \tDocumentation Plug-in\" and \"Yocto Project SDK Plug-in\", click \"Next >\" and verify plugins/features name/version, \tclick \"Next >\" and accept license agreement, click \"Finish\"  \n\th) If \"Security Warning\" dialog appears, click \"OK\" to install unsigned content.  \n\ti) In \"Software Updates\" dialog, click \"Yes\" to restart Eclipse to complete Eclipse Poky plugins installation. ",
+                    "expected_results": ""
+                },
+                "6": {
+                    "action": "Setup Eclipse Poky to use SDK  \n\ta) In Eclipse workbench window, go to \"Window\" menu -> \"Preferences\".  \n\tb) In \"Preferences\" window, go to \"Yocto Project SDK\", in \"Cross Compiler Options\" frame, select \"Standalone pre-\tbuilt toolchain\".  ",
+                    "expected_results": "Eclipse Poky plugins installed and running successfully, e.g. observe that \"Yocto Project Tools\" menu is available on Eclipse workbench window."
+                }
+            },
+            "summary": "Eclipse_Poky_installation_and_setup"
+        }
+    }
+]
\ No newline at end of file
diff --git a/meta/lib/oeqa/manual/kernel-dev.json b/meta/lib/oeqa/manual/kernel-dev.json
new file mode 100644
index 0000000..c93b4dd
--- /dev/null
+++ b/meta/lib/oeqa/manual/kernel-dev.json
@@ -0,0 +1,200 @@
+[
+    {
+        "test": {
+            "@alias": "kernel-configuration.kernel-configuration.TCTEMP_2.3_MANUAL_Kernel_dev_defconfig",
+            "author": [
+                {
+                    "email": "ee.peng.yeoh@intel.com",
+                    "name": "ee.peng.yeoh@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Follow the Set Up procedure to complete the common and specific prerequisites for this test case. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Setup https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Prerequisites_7  ",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Execute the test case steps asdocumented on the \"Kernel Development Test Cases\" wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Steps_7",
+                    "expected_results": "Review expected results on thethe \"Kernel Development Test Cases\"wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Expected_Results_7"
+                }
+            },
+            "summary": "TCTEMP_2.3_MANUAL_Kernel_dev_defconfig"
+        }
+    },
+    {
+        "test": {
+            "@alias": "kernel-configuration.kernel-configuration.TCTEMP_2.3_MANUAL_Kernel_dev_defconfig+fragments",
+            "author": [
+                {
+                    "email": "ee.peng.yeoh@intel.com",
+                    "name": "ee.peng.yeoh@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Follow the Set Up procedure to complete the common and specific prerequisites for this test case. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Setup https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Prerequisites_8  ",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Execute the test case steps asdocumented on the \"Kernel Development Test Cases\" wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Steps_8",
+                    "expected_results": "Review expected results on thethe \"Kernel Development Test Cases\"wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Expected_Results_8"
+                }
+            },
+            "summary": "TCTEMP_2.3_MANUAL_Kernel_dev_defconfig+fragments"
+        }
+    },
+    {
+        "test": {
+            "@alias": "kernel-configuration.kernel-configuration.TCTEMP_2.3_MANUAL_Kernel_dev_Applying_patches",
+            "author": [
+                {
+                    "email": "ee.peng.yeoh@intel.com",
+                    "name": "ee.peng.yeoh@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Follow the Set Up procedure to complete the common and specific prerequisites for this test case. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Setup https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Prerequisites  ",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Execute the test case steps asdocumented on the \"Kernel Development Test Cases\" wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Steps",
+                    "expected_results": "Review expected results on thethe \"Kernel Development Test Cases\"wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Expected_Results"
+                }
+            },
+            "summary": "TCTEMP_2.3_MANUAL_Kernel_dev_Applying_patches"
+        }
+    },
+    {
+        "test": {
+            "@alias": "kernel-configuration.kernel-configuration.TCTEMP_2.3_MANUAL_Kernel_dev_linux-yocto-local-source",
+            "author": [
+                {
+                    "email": "ee.peng.yeoh@intel.com",
+                    "name": "ee.peng.yeoh@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Follow the Set Up procedure to complete the common and specific prerequisites for this test case. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Setup https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Prerequisites_2  ",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Execute the test case steps asdocumented on the \"Kernel Development Test Cases\" wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Steps_2",
+                    "expected_results": "Review expected results on thethe \"Kernel Development Test Cases\"wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Expected_Results_2"
+                }
+            },
+            "summary": "TCTEMP_2.3_MANUAL_Kernel_dev_linux-yocto-local-source"
+        }
+    },
+    {
+        "test": {
+            "@alias": "kernel-configuration.kernel-configuration.TCTEMP_2.3_MANUAL_Kernel_dev_linux-yocto-custom-local-source",
+            "author": [
+                {
+                    "email": "ee.peng.yeoh@intel.com",
+                    "name": "ee.peng.yeoh@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Follow the Set Up procedure to complete the common and specific prerequisites for this test case. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Setup https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Prerequisites_3  ",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Execute the test case steps asdocumented on the \"Kernel Development Test Cases\" wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Steps_3",
+                    "expected_results": "Review expected results on thethe \"Kernel Development Test Cases\"wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Expected_Results_3"
+                }
+            },
+            "summary": "TCTEMP_2.3_MANUAL_Kernel_dev_linux-yocto-custom-local-source"
+        }
+    },
+    {
+        "test": {
+            "@alias": "kernel-configuration.kernel-configuration.TCTEMP_2.3_MANUAL_Kernel_dev_recipe-space_meta",
+            "author": [
+                {
+                    "email": "ee.peng.yeoh@intel.com",
+                    "name": "ee.peng.yeoh@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Follow the Set Up procedure to complete the common and specific prerequisites for this test case. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Setup https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Prerequisites_5  ",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Execute the test case steps asdocumented on the \"Kernel Development Test Cases\" wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Steps_5",
+                    "expected_results": "Review expected results on thethe \"Kernel Development Test Cases\"wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Expected_Results_5"
+                }
+            },
+            "summary": "TCTEMP_2.3_MANUAL_Kernel_dev_recipe-space_meta"
+        }
+    },
+    {
+        "test": {
+            "@alias": "kernel-configuration.kernel-configuration.TCTEMP_2.3_MANUAL_Kernel_dev_External_source",
+            "author": [
+                {
+                    "email": "ee.peng.yeoh@intel.com",
+                    "name": "ee.peng.yeoh@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Follow the Set Up procedure to complete the common and specific prerequisites for this test case. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Setup https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Prerequisites_6  ",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Execute the test case steps asdocumented on the \"Kernel Development Test Cases\" wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Steps_6",
+                    "expected_results": "Review expected results on thethe \"Kernel Development Test Cases\"wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Expected_Results_6"
+                }
+            },
+            "summary": "TCTEMP_2.3_MANUAL_Kernel_dev_External_source"
+        }
+    },
+    {
+        "test": {
+            "@alias": "kernel-configuration.kernel-configuration.TCTEMP_2.3_MANUAL_Kernel_dev_building_external_modules(hello-mod)",
+            "author": [
+                {
+                    "email": "ee.peng.yeoh@intel.com",
+                    "name": "ee.peng.yeoh@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Follow the Set Up procedure to complete the common and specific prerequisites for this test case. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Setup https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Prerequisites_10  ",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Execute the test case steps asdocumented on the \"Kernel Development Test Cases\" wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Setup_10",
+                    "expected_results": "Review expected results on thethe \"Kernel Development Test Cases\"wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Expected_Results_10"
+                }
+            },
+            "summary": "TCTEMP_2.3_MANUAL_Kernel_dev_building_external_modules(hello-mod)"
+        }
+    },
+    {
+        "test": {
+            "@alias": "kernel-configuration.kernel-configuration.TCTEMP_2.3_MANUAL_Kernel_dev_local_parallel_meta",
+            "author": [
+                {
+                    "email": "ee.peng.yeoh@intel.com",
+                    "name": "ee.peng.yeoh@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Follow the Set Up procedure to complete the common and specific prerequisites for this test case. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Setup https://wikioproject.org/wiki/Kernel_Development_Test_Cases#Prerequisites_4  ",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Execute the test case steps asdocumented on the \"Kernel Development Test Cases\" wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Steps_4",
+                    "expected_results": "Review expected results on thethe \"Kernel Development Test Cases\"wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Expected_Results_4"
+                }
+            },
+            "summary": "TCTEMP_2.3_MANUAL_Kernel_dev_local_parallel_meta"
+        }
+    }
+]
\ No newline at end of file
diff --git a/meta/lib/oeqa/manual/oe-core.json b/meta/lib/oeqa/manual/oe-core.json
new file mode 100644
index 0000000..3e2f321
--- /dev/null
+++ b/meta/lib/oeqa/manual/oe-core.json
@@ -0,0 +1,294 @@
+[
+  {
+    "test": {
+      "@alias": "oe-core.scripts.Use_scripts/pybootchartgui/pybootchartgui.py_to_generate_build_profiles",
+      "author": [
+        {
+          "email": "alexandru.c.georgescu@intel.com",
+          "name": "alexandru.c.georgescu@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Run a build for a recipe (e.g. core-image-minimal)",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Run the profiling script, ../scripts/pybootchartgui/pybootchartgui.py  tmp/buildstats/    \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Verify the results ",
+          "expected_results": "The scripts generates svg files with the profiling results . "
+        }
+      },
+      "summary": "Use_scripts/pybootchartgui/pybootchartgui.py_to_generate_build_profiles"
+    }
+  },
+  {
+    "test": {
+      "@alias": "oe-core.scripts.Crosstap_script_check",
+      "author": [
+        {
+          "email": "alexandru.c.georgescu@intel.com",
+          "name": "alexandru.c.georgescu@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Create the trace_open.stp script as follows in the host machine:  \n\n\nprobe syscall.open     \n\n{  \n\n\n        printf (\"%s(%d) open (%s)\\n\", execname(), pid(), argstr)  \n\n}  \n\n\n\nif the above failed, then create the below instead.  \n\nprobe syscall.open \n{ \n  printf (\"%s(%d) open\\n\", execname(), pid()) \n\n}  \n \n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Add 'tools-profile' and 'ssh-server-openssh' to EXTRA_IMAGE_FEATURES in local.conf \n\n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Build a core-image-minimal image, build systemtap-native. Start the image under qemu. \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Make sure that the ssh service is started on the Qemu machine. \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "From the host machine poky build_dir, run \"crosstap root@192.168.7.2 trace_open.stp\".",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "In QEMU, try to open some applications, such as open a terminal, input some command,  \n\n",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "Check the host machine, \"crosstap\" has related output. \n\n\n\nNOTE:  Do not build the kernel from shared state(sstate-cache) for this to work.",
+          "expected_results": "The script should successfully connect to the qemu machine and there \nshould be presented a list of services(pid, process name) which run on \nthe qemu machine. "
+        }
+      },
+      "summary": "Crosstap_script_check"
+    }
+  },
+  {
+    "test": {
+      "@alias": "oe-core.scripts.List_all_the_PACKAGECONFIG's_flags",
+      "author": [
+        {
+          "email": "yi.zhao@windriver.com",
+          "name": "yi.zhao@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": " Download the poky source and setup the environment. ",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Run \"../scripts/contrib/list-packageconfig-flags.py\" ",
+          "expected_results": "In step 2, will list available pkgs which have PACKAGECONFIG flags:  \nPACKAGE NAME (or RECIPE NAME)           PACKAGECONFIG FLAGS  \n==============================================================  \nalsa-tools-1.0.26.1                                         defaultval gtk+  \navahi-ui-0.6.31                                                defaultval python  \nbluez4-4.101                                                alsa defaultval pie  \n"
+        },
+        "3": {
+          "action": "Run \"../scripts/contrib/list-packageconfig-flags.py -f\" ",
+          "expected_results": "In step 3, will list available PACKAGECONFIG flags and all affected pkgs  \nPACKAGECONFIG FLAG       PACKAGE NAMES (or RECIPE NAMES)  \n====================================  \n3g                             connman-1.16  \n        \navahi                        cups-1.6.3  pulseaudio-4.0  \nbeecrypt                   rpm-5.4.9  rpm-native-5.4.9  \n"
+        },
+        "4": {
+          "action": "Run \"../scripts/contrib/list-packageconfig-flags.py -a\" ",
+          "expected_results": "In step 4, will list all pkgs and PACKAGECONFIG information:  \n==================================================  \ngtk+-2.24.18  \n/home/jiahongxu/yocto/poky/meta/recipes-gnome/gtk+/gtk+_2.24.18.bb  \nPACKAGECONFIG x11  \nPACKAGECONFIG[x11] --with-x=yes --with-gdktarget=x11,--with-x=no,${X11DEPENDS}  \nxf86-video-intel-2.21.9  \n/home/jiahongxu/yocto/poky/meta/recipes-graphics/xorg-driver/xf86-video-intel_2.21.9.bb  \nPACKAGECONFIG None  \nPACKAGECONFIG[xvmc] --enable-xvmc,--disable-xvmc,libxvmc  \nPACKAGECONFIG[sna] --enable-sna,--disable-sna  \n"
+        },
+        "5": {
+          "action": "Run \"../scripts/contrib/list-packageconfig-flags.py -p\"   ",
+          "expected_results": "In step 5, will list pkgs with preferred version:  \nPACKAGE NAME (or RECIPE NAME)              PACKAGECONFIG FLAGS  \n===================================================  \nalsa-tools-1.0.26.1                                           defaultval gtk+  \navahi-ui-0.6.31                                                   defaultval python  \nbluez4-4.101                                                       alsa defaultval pie  \nbluez5-5.7                                                            alsa defaultval obex-profiles  \n\n\n\n "
+        }
+      },
+      "summary": "List_all_the_PACKAGECONFIG's_flags"
+    }
+  },
+  {
+    "test": {
+      "@alias": "oe-core.bitbake.Test_bitbake_menuconfig",
+      "author": [
+        {
+          "email": "jose.perez.carranza@intel.com",
+          "name": "jose.perez.carranza@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "clone poky  \n \n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "cd poky   \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "source oe-init-build-env && cd build    \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "set below in local.conf   \n\n  \tMACHINE = \"qemux86\"  \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "bitbake linux-yocto -c kernel_configme -f   \n\n",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "bitbake linux-yocto -c menuconfig   \n\n",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "Once menuconfig launches, use the interface to navigate through the selections and \n   enable option \"64-bit kernel\"  \n\n",
+          "expected_results": ""
+        },
+        "8": {
+          "action": "Save changes and set name of the file as \"test.config\"  ",
+          "expected_results": "Open file:  \n \npoky/build//tmp/work/qemux86-poky-linux/linux-yocto/4.X.X+*/linux-qemux86-standard-build/test.config   \n  \n \n\nand verify that changes are present in the file as follows:   \n \nCONFIG_64BIT=y  \n \nCONFIG_X86_64=y"
+        }
+      },
+      "summary": "Test_bitbake_menuconfig"
+    }
+  },
+  {
+    "test": {
+      "@alias": "oe-core.bitbake.test_bitbake_devshell",
+      "author": [
+        {
+          "email": "jose.perez.carranza@intel.com",
+          "name": "jose.perez.carranza@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "clone poky ",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "cd poky  ",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "source oe-init-build-env && cd build ",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "bitbake matchbox-desktop ",
+          "expected_results": "Package was build correctly "
+        },
+        "5": {
+          "action": "bitbake matchbox-desktop -c devshell ",
+          "expected_results": "A terminal with a shell prompt within the OpenEmbedded build environment is opened "
+        },
+        "6": {
+          "action": "Verify that \"matchbox-desktop\" binary file is not created under\"src\" directory ",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "Run command:./configure && make ",
+          "expected_results": "Verify that \"matchbox-desktop\" binary file was created successfully under \"src/\" directory "
+        },
+        "8": {
+          "action": "Exit fromthe devshell terminal,exit ",
+          "expected_results": "Terminal back to the build directory"
+        }
+      },
+      "summary": "test_bitbake_devshell"
+    }
+  },
+  {
+    "test": {
+      "@alias": "oe-core.bitbake.test_dependency_explorer_is_launched",
+      "author": [
+        {
+          "email": "jose.perez.carranza@intel.com",
+          "name": "jose.perez.carranza@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "clone poky ",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "cd poky ",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "source oe-init-build-env ",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "bitbake core-image-full-cmdline   \n",
+          "expected_results": "Image should be successfully built   \n"
+        },
+        "5": {
+          "action": "bitbake -u taskexp -g core-image-full-cmdline    \n\nNOTE: To execute the last command of this test, it's necessary that the machine is executing an X11 server, or if that's not the case (for example, if running the test on a headless server), it is required to enable ssh X11 forwarding on both, the server and the client, and have the X11 server running on the client.    \n\nThe instructions to enable X11 forwarding vary between distributions. But for example, these are the steps to enable it between a server running openSUSE Leap 42.1 and a client with Fedora 24:  \nA. On the server, make sure /home//.ssh/config contains the line:  \n     ForwardX11 yes  \nB. On the server, make sure xauth is installed by running:  \n      which xauth  \nC. On the client, connect to the server, enabling X11 forwarding, for example by using:  \n      ssh -X user@server    \nNOTE 2: depexp was renamed to taskexp on 2.3 M4",
+          "expected_results": "Verify that a \"dependency explorer\" is opened and file \n   dependencies are listed  "
+        }
+      },
+      "summary": "test_dependency_explorer_is_launched"
+    }
+  },
+  {
+    "test": {
+      "@alias": "oe-core.bitbake.test_bitbake_sane_error_for_invalid_layer",
+      "author": [
+        {
+          "email": "jose.perez.carranza@intel.com",
+          "name": "jose.perez.carranza@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "clone poky  \n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "cd poky  \n \n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "source oe-init-build-env && cd build  \n \n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Add a invalid layer to conf/bblayers.conf  \"<poky dir>/my-invalid-layer\" \n\t\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "bitbake core-image-minimal",
+          "expected_results": "Below error should be displayed:\n\"ERROR: Layer directory  does not exist! Please check BBLAYERS in <poky dir>/<build dir>/conf/bblayers.conf\""
+        }
+      },
+      "summary": "test_bitbake_sane_error_for_invalid_layer"
+    }
+  },
+  {
+    "test": {
+      "@alias": "oe-core.bitbake.Test_bitbake-selftest",
+      "author": [
+        {
+          "email": "jair.de.jesus.gonzalez.plascencia@intel.com",
+          "name": "jair.de.jesus.gonzalez.plascencia@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "clone poky ",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "cd poky ",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "source oe-init-build-env ",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "bitbake-selftest -v\n",
+          "expected_results": "All test cases are executed and no errors are reported.\n"
+        }
+      },
+      "summary": "Test_bitbake-selftest"
+    }
+  }
+]
\ No newline at end of file
diff --git a/meta/lib/oeqa/manual/sdk.json b/meta/lib/oeqa/manual/sdk.json
new file mode 100644
index 0000000..6475586
--- /dev/null
+++ b/meta/lib/oeqa/manual/sdk.json
@@ -0,0 +1,32 @@
+[
+    {
+        "test": {
+            "@alias": "sdk.sdk_runqemu.test_sdk_toolchain_can_run_multiple_QEMU_machines_under_UNFS",
+            "author": [
+                {
+                    "email": "ee.peng.yeoh@intel.com",
+                    "name": "ee.peng.yeoh@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Prepare kernel, rootfs tar.bz2 image, and qemu configuration  \n    \ta. Download kernel, rootfs tar.bz2 image and qemu configuration from public autobuilder webpage  \n    \tb. Goto https://autobuilder.yocto.io/pub/releases/<target_release>/machines/qemu/qemux86/ \n    \tc. Download  \n    \t  \ti. rootfs tar.bz2: core-image-sato-sdk-qemux86.tar.bz2 \n      \t\tii. kernel: bzImage-qemux86.bin \n      \t\tiii. qemu configuration: core-image-sato-sdk-qemux86.qemuboot.conf ",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Download & install sdk toolchain from public autobuilder \n    \ta. Goto https://autobuilder.yocto.io/pub/releases/<target_release>/toolchain/x86_64/ \n    \tb. Download poky-glibc-x86_64-core-image-sato-sdk-<type-arch>-toolchain-<release-version>.sh \n    \tc. Run command: poky-glibc-x86_64-core-image-sato-sdk-<type-arch>-toolchain-<release-version>.sh",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "Extract rootfs twice into two images \n    \ta. Run 2 commands below:  \n                  runqemu-extract-sdk core-image-sato-sdk-qemux86.tar.bz2 qemux86_rootfs_image1  \n                  runqemu-extract-sdk core-image-sato-sdk-qemux86.tar.bz2 qemux86_rootfs_image2",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": " From the 2 terminals, start qemu to boot up both two images \n    \ta. Run 2 commands below:  \n                  runqemu core-image-sato-sdk-qemux86.qemuboot.conf qemux86_rootfs_image1  \n                  runqemu core-image-sato-sdk-qemux86.qemuboot.conf qemux86_rootfs_image2 ",
+                    "expected_results": "Expect both qemu to boot up successfully."
+                }
+            },
+            "summary": "test_sdk_toolchain_can_run_multiple_QEMU_machines_under_UNFS"
+        }
+    }
+]
\ No newline at end of file
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 02/33] oeqa/manual: Remove bitbake-selftest execution
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
  2019-04-10 13:11 ` [PATCH 01/33] oeqa/manual: transfer manual test cases from testopia to oeqa Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 03/33] oeqa/manual/build-appliance: Drop test which is already automated Armin Kuster
                   ` (30 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Richard Purdie <richard.purdie@linuxfoundation.org>

The autobuilder runs bitbake-selftest already so we don't need
to execute this manually.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 meta/lib/oeqa/manual/oe-core.json | 30 ------------------------------
 1 file changed, 30 deletions(-)

diff --git a/meta/lib/oeqa/manual/oe-core.json b/meta/lib/oeqa/manual/oe-core.json
index 3e2f321..0e8f01a 100644
--- a/meta/lib/oeqa/manual/oe-core.json
+++ b/meta/lib/oeqa/manual/oe-core.json
@@ -260,35 +260,5 @@
       },
       "summary": "test_bitbake_sane_error_for_invalid_layer"
     }
-  },
-  {
-    "test": {
-      "@alias": "oe-core.bitbake.Test_bitbake-selftest",
-      "author": [
-        {
-          "email": "jair.de.jesus.gonzalez.plascencia@intel.com",
-          "name": "jair.de.jesus.gonzalez.plascencia@intel.com"
-        }
-      ],
-      "execution": {
-        "1": {
-          "action": "clone poky ",
-          "expected_results": ""
-        },
-        "2": {
-          "action": "cd poky ",
-          "expected_results": ""
-        },
-        "3": {
-          "action": "source oe-init-build-env ",
-          "expected_results": ""
-        },
-        "4": {
-          "action": "bitbake-selftest -v\n",
-          "expected_results": "All test cases are executed and no errors are reported.\n"
-        }
-      },
-      "summary": "Test_bitbake-selftest"
-    }
   }
 ]
\ No newline at end of file
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 03/33] oeqa/manual/build-appliance: Drop test which is already automated
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
  2019-04-10 13:11 ` [PATCH 01/33] oeqa/manual: transfer manual test cases from testopia to oeqa Armin Kuster
  2019-04-10 13:11 ` [PATCH 02/33] oeqa/manual: Remove bitbake-selftest execution Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 04/33] oeqa/manual/bsp-qemu.json: Update for QEMU_USE_KVM Armin Kuster
                   ` (29 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Richard Purdie <richard.purdie@linuxfoundation.org>

The nightly-build-appliance target already tests this particular build.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 meta/lib/oeqa/manual/build-appliance.json | 26 --------------------------
 1 file changed, 26 deletions(-)

diff --git a/meta/lib/oeqa/manual/build-appliance.json b/meta/lib/oeqa/manual/build-appliance.json
index b8f8927..70f8c72 100644
--- a/meta/lib/oeqa/manual/build-appliance.json
+++ b/meta/lib/oeqa/manual/build-appliance.json
@@ -1,32 +1,6 @@
 [
     {
         "test": {
-            "@alias": "build-appliance.build-appliance.Bitbake_build-appliance-image",
-            "author": [
-                {
-                    "email": "alexandru.c.georgescu@intel.com",
-                    "name": "alexandru.c.georgescu@intel.com"
-                }
-            ],
-            "execution": {
-                "1": {
-                    "action": "Get poky source code and prepare the build environment",
-                    "expected_results": "bitbake build-appliance-image is successful  "
-                },
-                "2": {
-                    "action": "Set MACHINE to qemux86 and add the following line to conf/local.conf :  SRCREV_pn-build-appliance-image = \"${AUTOREV}\"",
-                    "expected_results": ""
-                },
-                "3": {
-                    "action": "Run \"bitbake build-appliance-image\" \n \n",
-                    "expected_results": ""
-                }
-            },
-            "summary": "Bitbake_build-appliance-image"
-        }
-    },
-    {
-        "test": {
             "@alias": "build-appliance.build-appliance.Build_core-image-minimal_with_build-appliance-image",
             "author": [
                 {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 04/33] oeqa/manual/bsp-qemu.json: Update for QEMU_USE_KVM
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (2 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 03/33] oeqa/manual/build-appliance: Drop test which is already automated Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 05/33] oeqa/manual: Add manual runtime 'compliance' testcases to json Armin Kuster
                   ` (28 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Robert Yang <liezhi.yang@windriver.com>

Now QEMU_USE_KVM can only be boolean, can not contain MACHINE any more.

Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 meta/lib/oeqa/manual/bsp-qemu.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/meta/lib/oeqa/manual/bsp-qemu.json b/meta/lib/oeqa/manual/bsp-qemu.json
index 1260af4..cf51b6a 100644
--- a/meta/lib/oeqa/manual/bsp-qemu.json
+++ b/meta/lib/oeqa/manual/bsp-qemu.json
@@ -10,7 +10,7 @@
       ],
       "execution": {
         "1": {
-          "action": "Build a kernel with KVM enabled  \n\nIn Local.conf add  \n\nQEMU_USE_KVM = \"${@ 'intel-corei7-64 intel-core2-32 qemux86 qemux86-64' if os.access('/dev/kvm', os.R_OK|os.W_OK) else '' }\"  \n\n ",
+          "action": "Build a kernel with KVM enabled  \n\nIn Local.conf add  \n\nQEMU_USE_KVM = \"${@ '1' if os.access('/dev/kvm', os.R_OK|os.W_OK) else '0' }\"  \n\n ",
           "expected_results": ""
         },
         "2": {
@@ -219,4 +219,4 @@
       "summary": "check_bash_in_image"
     }
   }
-]
\ No newline at end of file
+]
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 05/33] oeqa/manual: Add manual runtime 'compliance' testcases to json
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (3 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 04/33] oeqa/manual/bsp-qemu.json: Update for QEMU_USE_KVM Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 06/33] oeqa/manual/sdk.json: Updated toolchain tarball to core-image-sato Armin Kuster
                   ` (27 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Sudhir Sharma <sudhirx.sharma@intel.com>

Added json file for compliance test cases to the manual runtime tests

Signed-off-by: Sudhir Sharma <sudhirx.sharma@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 meta/lib/oeqa/manual/compliance-test.json | 142 ++++++++++++++++++++++++++++++
 1 file changed, 142 insertions(+)
 create mode 100644 meta/lib/oeqa/manual/compliance-test.json

diff --git a/meta/lib/oeqa/manual/compliance-test.json b/meta/lib/oeqa/manual/compliance-test.json
new file mode 100644
index 0000000..7adf8a1
--- /dev/null
+++ b/meta/lib/oeqa/manual/compliance-test.json
@@ -0,0 +1,142 @@
+[
+    {
+        "test": {
+            "@alias": "configuration.configuration.LTP_subset_test_suite",
+            "author": [
+                {
+                    "email": "corneliux.stoicescu@intel.com",
+                    "name": "corneliux.stoicescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "For real hardware, run following component, \nsyscalls \nfs \nfsx \ndio \nio \nmm \nipc \nsched \nmath \nnptl \npty \nadmin_tools \ntimers \ncommands  \n\nFor QEMU, run following component \nsyscalls \nmm \nipc \nsched \nmath \nnptl \npty \nadmin_tools \ncommands \n\nRun Instructions: \nLTP download: http://sourceforge.net/projects/ltp/files/LTP%20Source/ltp-20120401/ltp-full-20120401.bz2/download  \n\n(link is outdated, always use the last version released or the one found in the image)  \n\n\n\nbuild steps: refer to http://ltp.sourceforge.net  \n\nRun steps:",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Build LTP with toolchain or in sdk image. Or use a sato-sdk image which has LTP already included in /opt/ltp",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "For QEMU, create the qemu target with \"-m 512\", which makes some memory stress cases pass. For some issues, we could only set 128M for qemuarm and 256M for qemumips.",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "Copy LTP folder into target, for example, /opt/ltp if you have built it yourself. Modify the default scenario file \"scenario_groups/default\", remove test suites not to be tested",
+                    "expected_results": ""
+                },
+                "5": {
+                    "action": "Comment runtests/sched: hackbench, which is not suitable to run in emulators. Reminder (comment it also for Sugarbay Devices).",
+                    "expected_results": ""
+                },
+                "6": {
+                    "action": "Comment oom01, oom02, oom03, oom04 in runtest/mm, which consume lots of memory",
+                    "expected_results": ""
+                },
+                "7": {
+                    "action": "From /opt/ltp run: ./runltp -p -l result-M2-20101218.log -C result-M2-20101218.fail -d /opt/ltp/tmp &> result-M2-20101218.fulllog \n\n",
+                    "expected_results": "Check the result on wiki, https://wiki.yoctoproject.org/wiki/LTP_result, there should be no regression failure met."
+                }
+            },
+            "summary": "LTP_subset_test_suite"
+        }
+    },
+    {
+        "test": {
+            "@alias": "configuration.configuration.POSIX_subset_test_suite",
+            "author": [
+                {
+                    "email": "corneliux.stoicescu@intel.com",
+                    "name": "corneliux.stoicescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "In a sato-sdk image go to /opt/ltp or get latest LTP sourcecode,  download location is  http://sourceforge.net/projects/ltp/files/LTP%20Source/  and install it.",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Go into the folder of LTP, and posix_testsuite is under testcases/open_posix_testsuite/",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "Run connmand: make generate-makefiles",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "Run connmand: make conformance-all",
+                    "expected_results": ""
+                },
+                "5": {
+                    "action": "Run connmand: make conformance-test (this step may show errors, ignore them)",
+                    "expected_results": ""
+                },
+                "6": {
+                    "action": "Run connmand: make tools-all",
+                    "expected_results": ""
+                },
+                "7": {
+                    "action": "Run connmand: sh posix.sh > posix.log, posix.sh as below:  \n \n#!/bin/sh \n./bin/run-posix-option-group-test.sh AIO \n./bin/run-posix-option-group-test.sh MEM \n./bin/run-posix-option-group-test.sh MSG \n./bin/run-posix-option-group-test.sh SEM \n./bin/run-posix-option-group-test.sh SIG \n./bin/run-posix-option-group-test.sh THR \n./bin/run-posix-option-group-test.sh TMR \n./bin/run-posix-option-group-test.sh TPS  \n \n",
+                    "expected_results": ""
+                },
+                "8": {
+                    "action": "Check the posix.log after testing is finished",
+                    "expected_results": "Compare the test result on wiki, https://wiki.yoctoproject.org/wiki/Posix_result, there should be no more regression failures met."
+                }
+            },
+            "summary": "POSIX_subset_test_suite"
+        }
+    },
+    {
+        "test": {
+            "@alias": "configuration.configuration.LSB_subset_test_suite",
+            "author": [
+                {
+                    "email": "corneliux.stoicescu@intel.com",
+                    "name": "corneliux.stoicescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Get lsd-sdk image and install it on target device or start the image(if it is QEMU) with option \"-m 512M\"",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Comment in /opt/lsb-test/session any tests you don't want to run.",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "Run /usr/bin/LSB_Test.sh which should download the LSB suite and set it up. Some packages may fail to download because their location changed on ftp.linuxfoundation.org. You need to manually update /opt/lsb-test/packages_list",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "Tests should start automatically, you can use the web interface to reconfigure the setup. ",
+                    "expected_results": "Check the result on wiki https://wiki.yoctoproject.org/wiki/LSB_Result No regression failures should be met."
+                }
+            },
+            "summary": "LSB_subset_test_suite"
+        }
+    },
+    {
+        "test": {
+            "@alias": "General_Runtime.General_Runtime.stress_test_-_Genericx86-64",
+            "author": [
+                {
+                    "email": "corneliux.stoicescu@intel.com",
+                    "name": "corneliux.stoicescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Bootup with core-image-lsb-sdk image",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Execute the crashme test with below command  \n\n./opt/ltp/runltp f  crashme",
+                    "expected_results": "The stress testing should not make the target crash. Check CPU usage and basic functionality of the system after the tests are over. "
+                }
+            },
+            "summary": "stress_test_-_Genericx86-64"
+        }
+    }
+]
\ No newline at end of file
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 06/33] oeqa/manual/sdk.json: Updated toolchain tarball to core-image-sato
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (4 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 05/33] oeqa/manual: Add manual runtime 'compliance' testcases to json Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 07/33] oeqa/manual/bsp-hw.json: add non-IA tests Armin Kuster
                   ` (26 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: sangeeta jain <sangeeta.jain@intel.com>

Manual test step for SDK is updated. Previously toolchain was "poky-glibc-x86_64-core-image-sato-sdk<type-arch>-toolchain-<release-version>.sh"
But toochain for core-image-sato-sdk is not available in releases after 2.1, hence changed it to "poky-glibc-x86_64-core-image-sato-<type-arch>-toolchain-<release-version>.sh

Other less significant update is to add exepcted result in intermediate test steps.

Signed-off-by: sangeeta jain <sangeeta.jain@intel.com>

"poky-glibc-x86_64-core-image-sato-<type-arch>-toolchain-<release-version>.sh"

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 meta/lib/oeqa/manual/sdk.json | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/meta/lib/oeqa/manual/sdk.json b/meta/lib/oeqa/manual/sdk.json
index 6475586..434982f 100644
--- a/meta/lib/oeqa/manual/sdk.json
+++ b/meta/lib/oeqa/manual/sdk.json
@@ -1,7 +1,7 @@
 [
     {
         "test": {
-            "@alias": "sdk.sdk_runqemu.test_sdk_toolchain_can_run_multiple_QEMU_machines_under_UNFS",
+            "@alias": "sdk.sdk_runqemu.test_install_cross_toolchain_can_run_multiple_qemu_for_x86",
             "author": [
                 {
                     "email": "ee.peng.yeoh@intel.com",
@@ -11,22 +11,22 @@
             "execution": {
                 "1": {
                     "action": "Prepare kernel, rootfs tar.bz2 image, and qemu configuration  \n    \ta. Download kernel, rootfs tar.bz2 image and qemu configuration from public autobuilder webpage  \n    \tb. Goto https://autobuilder.yocto.io/pub/releases/<target_release>/machines/qemu/qemux86/ \n    \tc. Download  \n    \t  \ti. rootfs tar.bz2: core-image-sato-sdk-qemux86.tar.bz2 \n      \t\tii. kernel: bzImage-qemux86.bin \n      \t\tiii. qemu configuration: core-image-sato-sdk-qemux86.qemuboot.conf ",
-                    "expected_results": ""
+                    "expected_results": "Download completes successfully."
                 },
                 "2": {
-                    "action": "Download & install sdk toolchain from public autobuilder \n    \ta. Goto https://autobuilder.yocto.io/pub/releases/<target_release>/toolchain/x86_64/ \n    \tb. Download poky-glibc-x86_64-core-image-sato-sdk-<type-arch>-toolchain-<release-version>.sh \n    \tc. Run command: poky-glibc-x86_64-core-image-sato-sdk-<type-arch>-toolchain-<release-version>.sh",
-                    "expected_results": ""
+                    "action": "Download & install toolchain tarball matching your host from public autobuilder \n    \ta. Goto https://autobuilder.yocto.io/pub/releases/<target_release>/toolchain/x86_64/ \n    \tb. Download poky-glibc-x86_64-core-image-sato-<type-arch>-toolchain-<release-version>.sh \n    \tc. Run command: poky-glibc-x86_64-core-image-sato-<type-arch>-toolchain-<release-version>.sh \n    \td. After installation toolchain  Run source command :   source  /toolchain-installed-path/environment-setup-<architecture name>-poky-linux",
+                    "expected_results": "Toolchain gets installed successfully."
                 },
                 "3": {
                     "action": "Extract rootfs twice into two images \n    \ta. Run 2 commands below:  \n                  runqemu-extract-sdk core-image-sato-sdk-qemux86.tar.bz2 qemux86_rootfs_image1  \n                  runqemu-extract-sdk core-image-sato-sdk-qemux86.tar.bz2 qemux86_rootfs_image2",
-                    "expected_results": ""
+                    "expected_results": "Both images build successfully."
                 },
                 "4": {
-                    "action": " From the 2 terminals, start qemu to boot up both two images \n    \ta. Run 2 commands below:  \n                  runqemu core-image-sato-sdk-qemux86.qemuboot.conf qemux86_rootfs_image1  \n                  runqemu core-image-sato-sdk-qemux86.qemuboot.conf qemux86_rootfs_image2 ",
+                    "action": " From the 2 terminals, start qemu to boot up both two images \n    \ta. Run 2 commands below:  \n                  runqemu <kernel-name> core-image-sato-sdk-qemux86.qemuboot.conf qemux86_rootfs_image1  \n                  runqemu <kernel-name> core-image-sato-sdk-qemux86.qemuboot.conf qemux86_rootfs_image2 ",
                     "expected_results": "Expect both qemu to boot up successfully."
                 }
             },
-            "summary": "test_sdk_toolchain_can_run_multiple_QEMU_machines_under_UNFS"
+            "summary": "test_install_cross_toolchain_can_run_multiple_qemu_for_x86"
         }
     }
 ]
\ No newline at end of file
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 07/33] oeqa/manual/bsp-hw.json: add non-IA tests
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (5 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 06/33] oeqa/manual/sdk.json: Updated toolchain tarball to core-image-sato Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 08/33] oeqa/manual/bsp-hw.json: test id updated and obsolete test cases removed Armin Kuster
                   ` (25 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Mazliana <mazliana.mohamad@intel.com>

QA team found that 10 manual bsp test cases from Testopia for
Beaglebone, EdgeRouter, and MPC need to be up streamed

[YOCTO #12650]

Signed-off-by: Mazliana <mazliana.mohamad@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 meta/lib/oeqa/manual/bsp-hw.json | 260 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 260 insertions(+)

diff --git a/meta/lib/oeqa/manual/bsp-hw.json b/meta/lib/oeqa/manual/bsp-hw.json
index a2b1d3e..2bbf4b2 100644
--- a/meta/lib/oeqa/manual/bsp-hw.json
+++ b/meta/lib/oeqa/manual/bsp-hw.json
@@ -1196,5 +1196,265 @@
             },
             "summary": "Test_Seek_bar_and_volume_control"
         }
+    },
+    {
+        "test": {
+            "@alias": "bsps-runtime.bsps-runtime.Check_if_watchdog_can_reset_the_target_system",
+            "author": [
+                {
+                    "email": "yi.zhao@windriver.com",
+                    "name": "yi.zhao@windriver.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "1.Check if watchdog device exist in /dev/ directory. Run command echo 1 > /dev/watchdog and wait for 60s. Then, the target will reboot.",
+                    "expected_results": "The watchdog device exist in /dev/ directory and can reboot the target.\n"
+                }
+            },
+            "summary": "Check_if_watchdog_can_reset_the_target_system"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-runtime.bsps-runtime.Check_if_RTC_(Real_Time_Clock)_can_work_correctly",
+            "author": [
+                {
+                    "email": "yi.zhao@windriver.com",
+                    "name": "yi.zhao@windriver.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Read time from RTC registers.  root@localhost:/root> hwclock -r  Sun Mar 22 04:05:47 1970 -0.001948 seconds ",
+                    "expected_results": "Can read and set the time from RTC.\n"
+                },
+                "2": {
+                    "action": "Set system current time  root@localhost:/root> date 062309452008 ",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "Synchronize the system current time to RTC registers  root@localhost:/root> hwclock -w ",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "Read time from RTC registers  root@localhost:/root> hwclock -r ",
+                    "expected_results": ""
+                },
+                "5": {
+                    "action": "Reboot target and read time from RTC again\n",
+                    "expected_results": ""
+                }
+            },
+            "summary": "Check_if_RTC_(Real_Time_Clock)_can_work_correctly"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-runtime.bsps-runtime.Check_if_target_can_support_EEPROM",
+            "author": [
+                {
+                    "email": "yi.zhao@windriver.com",
+                    "name": "yi.zhao@windriver.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Check eeprom device exist in /sys/bus/i2c/devices/ ",
+                    "expected_results": "Hexdump can read data from eeprom.\n"
+                },
+                "2": {
+                    "action": "Run \"hexdump eeprom\" commandroot@mpc8315e-rdb:/sys/bus/i2c/devices/1-0051> hexdump eeprom0000000 9210 0b02 0211 0009 0b52 0108 0c00 3c000000010 6978 6930 6911 208c 7003 3c3c 00f0 8381\u2026\n",
+                    "expected_results": ""
+                }
+            },
+            "summary": "Check_if_target_can_support_EEPROM"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-tools.bsps-tools.smart_add_rpm-dir_channel_(auto)",
+            "author": [
+                {
+                    "email": "corneliux.stoicescu@intel.com",
+                    "name": "corneliux.stoicescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Build out packages with poky tree and copy the deploy/rpm directory to target directory. ",
+                    "expected_results": "The command should add a rpm-dir channel with smart. "
+                },
+                "2": {
+                    "action": "On target, run \"smart channel --add myrpmdir type=rpm-dir path=/path/to/tmp/deploy/rpm/i586\". ",
+                    "expected_results": "Run \"smart channel --show myrpmdir\" can show the information about the channel:\n[myrpmdir] \ntype = rpm-dir \npath = /path/to/tmp/deploy/rpm/i586"
+                },
+                "3": {
+                    "action": "Run \"smart channel --show myrpmdir\" and check the output. ",
+                    "expected_results": "After disable the channel, run \"smart channel --show myrpmdir\" would show:\n[myrpmdir] \ntype = rpm-dir \ndisabled = yes \npath = /path/to/tmp/deploy/rpm/i586"
+                },
+                "4": {
+                    "action": "Run \"smart channel --disable myrpmdir\" to diable the channel. ",
+                    "expected_results": ""
+                },
+                "5": {
+                    "action": "Run \"smart channel --show myrpmdir\" and check the output.",
+                    "expected_results": ""
+                }
+            },
+            "summary": "smart_add_rpm-dir_channel"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-tools.bsps-tools.smart_install_package_from_a_local_directory_(auto)",
+            "author": [
+                {
+                    "email": "corneliux.stoicescu@intel.com",
+                    "name": "corneliux.stoicescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Copy packages directory to target and add a rpm-dir channel with \nsmart. Make sure this channel and the default rpm-sys channel are \nenabled.",
+                    "expected_results": "The package \"groff\" should be installed."
+                },
+                "2": {
+                    "action": "Run \"smart install package_name\" to install a package from the deploy/rpm/i586 directory. For example, \"smart install groff\".",
+                    "expected_results": ""
+                }
+            },
+            "summary": "smart_install_package_from_a_local_directory"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-tools.bsps-tools.smart_install_package_from_a_remote_repomd_repository_(auto)",
+            "author": [
+                {
+                    "email": "corneliux.stoicescu@intel.com",
+                    "name": "corneliux.stoicescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Follow procedure in \"https://wiki.yoctoproject.org/wiki/Rpm%27s_Repository_Setup_for_QA\" to create a rpm-md-channel and updatechannelinformation with smart. ",
+                    "expected_results": ""
+                },
+                "2": {
+                    "action": "Make sure this channel and the default rpm-sys channel are enabled with \"smart channel --show\". ",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "Run \"smart install \" to install a package from the remote repository. For example, \"smart install groff\" ",
+                    "expected_results": "The package should be installed. At the example \"groff\" should be installed correctly."
+                }
+            },
+            "summary": "smart_install_package_from_a_remote_repomd_repository"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-tools.bsps-tools.smart_remove_package_(auto)",
+            "author": [
+                {
+                    "email": "corneliux.stoicescu@intel.com",
+                    "name": "corneliux.stoicescu@intel.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Run \"smart remove \" and check the output, for example \"smart remove groff\"",
+                    "expected_results": "The package should be removed . At the example \"groff\" should be removed.\n"
+                }
+            },
+            "summary": "smart_remove_package"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-meta-yocto.bsps-meta-yocto.System_can_boot_up_via_NFS",
+            "author": [
+                {
+                    "email": "yi.zhao@windriver.com",
+                    "name": "yi.zhao@windriver.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Connect the board's first serial port to your workstation and then start up your favourite serial terminal so that you will be able to interact with the serial console. If you don't have a favourite, picocom is suggested:   $ picocom /dev/ttyS0 -b 115200 ",
+                    "expected_results": "The system can boot up without problem\n"
+                },
+                "2": {
+                    "action": "Power up or reset the board and press a key on the terminal when prompted to get to the U-Boot command line ",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "Set up the environment in U-Boot:  => setenv ipaddr   => setenv serverip   ",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "Download the kernel and boot:  => tftp tftp $loadaddr vmlinux => bootoctlinux $loadaddr coremask=0x3 root=/dev/nfs rw nfsroot=: ip=::::edgerouter:eth0:off mtdparts=phys_mapped_flash:512k(boot0),512k(boot1),64k@3072k(eeprom)\n",
+                    "expected_results": ""
+                }
+            },
+            "summary": "System_can_boot_up_via_NFS"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-meta-yocto.bsps-meta-yocto.System_can_boot_up_via_USB",
+            "author": [
+                {
+                    "email": "yi.zhao@windriver.com",
+                    "name": "yi.zhao@windriver.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "Copy the kernel and rootfs to the USB stick.  # mount /dev/sda2 /media/sda2  # tar -xvjpf core-image-minimal-XXX.tar.bz2 -C /media/sda2  # cp vmlinux /media/sda2/boot/vmlinux  # umount /media/sda2 ",
+                    "expected_results": "The system should boot up via USB\n"
+                },
+                "2": {
+                    "action": "Reboot the board and press a key on the terminal when prompted to get to the U-Boot command line  # reboot ",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "Load the kernel and boot: => ext2load usb 0:2 $loadaddr boot/vmlinux => bootoctlinux $loadaddr coremask=0x3 root=/dev/sda2 rw rootwait mtdparts=phys_mapped_flash:512k(boot0),512k(boot1),64k@3072k(eeprom)",
+                    "expected_results": ""
+                }
+            },
+            "summary": "System_can_boot_up_via_USB"
+        }
+    },
+    {
+        "test": {
+            "@alias": "bsps-meta-yocto.bsps-meta-yocto.Boot_from_JFFS2_image",
+            "author": [
+                {
+                    "email": "yi.zhao@windriver.com",
+                    "name": "yi.zhao@windriver.com"
+                }
+            ],
+            "execution": {
+                "1": {
+                    "action": "First boot the board with NFS root. ",
+                    "expected_results": "The system can boot up without problem\n"
+                },
+                "2": {
+                    "action": "Install mtd-utils package. Erase the MTD partition which will be used as root: $ flash_eraseall /dev/mtd3 ",
+                    "expected_results": ""
+                },
+                "3": {
+                    "action": "Copy the JFFS2 image to the MTD partition: $ flashcp core-image-minimal-mpc8315e-rdb.jffs2 /dev/mtd3 ",
+                    "expected_results": ""
+                },
+                "4": {
+                    "action": "Then reboot the board and set up the environment in U-Boot: => setenv bootargs root=/dev/mtdblock3 rootfstype=jffs2 console=ttyS0,115200 ",
+                    "expected_results": ""
+                }
+            },
+            "summary": "Boot_from_JFFS2_image"
+        }
     }
 ]
\ No newline at end of file
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 08/33] oeqa/manual/bsp-hw.json: test id updated and obsolete test cases removed
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (6 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 07/33] oeqa/manual/bsp-hw.json: add non-IA tests Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 09/33] oeqa/manual/compliance-test.json: test id updated and missing test cases added Armin Kuster
                   ` (24 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: sangeeta jain <sangeeta.jain@intel.com>

Two changes made in oeqa/manual/bsp-hw.json:

1. All test id (eg. @alias) inside manual testcase file shall follow the same test id naming
convention from oeqa automated tests (eg. selftest, runtime, sdk, etc), where the
test id consists of  <test_module>.<test_suite>.<test_function>. Furthermore,
there shall be only 1 unique test_module per each manual testcases file.

This file was using more than 1 unique test_module for testcases.
Furthermore, some of the testcases were defined using different test_suite where it was not
needed. This patch fix the manual testcases file to have only 1 unique
test_module as well as test_suite to simplify test id naming.

2. As per review by Intel and Windriver team, 7 testcases were found obsolete. Removed 7 testcases.

Signed-off-by: sangeeta jain <sangeeta.jain@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 meta/lib/oeqa/manual/bsp-hw.json | 266 +++++++--------------------------------
 1 file changed, 46 insertions(+), 220 deletions(-)

diff --git a/meta/lib/oeqa/manual/bsp-hw.json b/meta/lib/oeqa/manual/bsp-hw.json
index 2bbf4b2..4b7c76f 100644
--- a/meta/lib/oeqa/manual/bsp-hw.json
+++ b/meta/lib/oeqa/manual/bsp-hw.json
@@ -1,7 +1,7 @@
 [
     {
         "test": {
-            "@alias": "bsps-hw.bsps-tools.rpm_-__install_dependency_package",
+            "@alias": "bsps-hw.bsps-hw.rpm_-__install_dependency_package",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -27,7 +27,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.boot_and_install_from_USB",
+            "@alias": "bsps-hw.bsps-hw.boot_and_install_from_USB",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -61,7 +61,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.live_boot_from_USB",
+            "@alias": "bsps-hw.bsps-hw.live_boot_from_USB",
             "author": [
                 {
                     "email": "juan.fernandox.ramos.frayle@intel.com",
@@ -87,7 +87,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.boot_from_runlevel_3",
+            "@alias": "bsps-hw.bsps-hw.boot_from_runlevel_3",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -121,7 +121,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.boot_from_runlevel_5",
+            "@alias": "bsps-hw.bsps-hw.boot_from_runlevel_5",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -151,7 +151,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.shutdown_system",
+            "@alias": "bsps-hw.bsps-hw.shutdown_system",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -173,7 +173,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.reboot_system",
+            "@alias": "bsps-hw.bsps-hw.reboot_system",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -195,7 +195,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.switch_among_multi_applications_and_desktop",
+            "@alias": "bsps-hw.bsps-hw.switch_among_multi_applications_and_desktop",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -225,7 +225,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.USB_-_mount",
+            "@alias": "bsps-hw.bsps-hw.USB_-_mount",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -251,7 +251,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.USB_-_read_files",
+            "@alias": "bsps-hw.bsps-hw.USB_-_read_files",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -281,7 +281,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.USB_-_umount",
+            "@alias": "bsps-hw.bsps-hw.USB_-_umount",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -307,7 +307,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.USB_-_write_files",
+            "@alias": "bsps-hw.bsps-hw.USB_-_write_files",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -333,7 +333,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.ethernet_static_ip_set_in_connman",
+            "@alias": "bsps-hw.bsps-hw.ethernet_static_ip_set_in_connman",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -367,7 +367,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.ethernet_get_IP_in_connman_via_DHCP",
+            "@alias": "bsps-hw.bsps-hw.ethernet_get_IP_in_connman_via_DHCP",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -397,7 +397,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-tools.connman_offline_mode_in_connman-gnome",
+            "@alias": "bsps-hw.bsps-hw.connman_offline_mode_in_connman-gnome",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -419,7 +419,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.X_server_can_start_up_with_runlevel_5_boot",
+            "@alias": "bsps-hw.bsps-hw.X_server_can_start_up_with_runlevel_5_boot",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -441,7 +441,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.standby",
+            "@alias": "bsps-hw.bsps-hw.standby",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -475,7 +475,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.check_CPU_utilization_after_standby",
+            "@alias": "bsps-hw.bsps-hw.check_CPU_utilization_after_standby",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -505,7 +505,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.Test_if_LAN_device_works_well_after_resume_from_suspend_state",
+            "@alias": "bsps-hw.bsps-hw.Test_if_LAN_device_works_well_after_resume_from_suspend_state",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -535,7 +535,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.Test_if_usb_hid_device_works_well_after_resume_from_suspend_state",
+            "@alias": "bsps-hw.bsps-hw.Test_if_usb_hid_device_works_well_after_resume_from_suspend_state",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -565,7 +565,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-tools.click_terminal_icon_on_X_desktop",
+            "@alias": "bsps-hw.bsps-hw.click_terminal_icon_on_X_desktop",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -587,7 +587,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-tools.Add_multiple_files_in_media_player",
+            "@alias": "bsps-hw.bsps-hw.Add_multiple_files_in_media_player",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -613,7 +613,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.check_bash_in_image",
+            "@alias": "bsps-hw.bsps-hw.check_bash_in_image",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -631,7 +631,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.MicroSD_-__mount",
+            "@alias": "bsps-hw.bsps-hw.MicroSD_-__mount",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -653,7 +653,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.MicroSD_-__read_files",
+            "@alias": "bsps-hw.bsps-hw.MicroSD_-__read_files",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -683,7 +683,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.MicroSD_-__umount",
+            "@alias": "bsps-hw.bsps-hw.MicroSD_-__umount",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -713,7 +713,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.MicroSD_-__write_files",
+            "@alias": "bsps-hw.bsps-hw.MicroSD_-__write_files",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -743,7 +743,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-tools.video_-_libva_check_(ogg_video_play)",
+            "@alias": "bsps-hw.bsps-hw.video_-_libva_check_(ogg_video_play)",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -769,29 +769,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-tools.media_player_-_unable_to_play_MPEG-1_without_\"commercial\"_flag",
-            "author": [
-                {
-                    "email": "alexandru.c.georgescu@intel.com",
-                    "name": "alexandru.c.georgescu@intel.com"
-                }
-            ],
-            "execution": {
-                "1": {
-                    "action": "Copy sample MPEG-1 file to a system without the \"commercial\" flag.",
-                    "expected_results": ""
-                },
-                "2": {
-                    "action": "Launch media player and make sure it cannot play the MPEG-1 file.",
-                    "expected_results": "MPEG-1 file can not be played on images without the \"commercial\" flag. "
-                }
-            },
-            "summary": "media_player_-_unable_to_play_MPEG-1_without_\"commercial\"_flag"
-        }
-    },
-    {
-        "test": {
-            "@alias": "bsps-hw.bsps-tools.media_player_-_play_video_(ogv)",
+            "@alias": "bsps-hw.bsps-hw.media_player_-_play_video_(ogv)",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -813,7 +791,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-tools.media_player_-_stop/play_button_(ogv)",
+            "@alias": "bsps-hw.bsps-hw.media_player_-_stop/play_button_(ogv)",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -843,7 +821,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-tools.audio_-_play_(ogg)_with_HDMI",
+            "@alias": "bsps-hw.bsps-hw.audio_-_play_(ogg)_with_HDMI",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -869,7 +847,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-tools.audio_-_play_(wav)_with_HDMI",
+            "@alias": "bsps-hw.bsps-hw.audio_-_play_(wav)_with_HDMI",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -895,7 +873,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-tools.Graphics_-_ABAT",
+            "@alias": "bsps-hw.bsps-hw.Graphics_-_ABAT",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -921,7 +899,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-tools.Graphics_-_x11perf_-_2D",
+            "@alias": "bsps-hw.bsps-hw.Graphics_-_x11perf_-_2D",
             "author": [
                 {
                     "email": "alexandru.c.georgescu@intel.com",
@@ -943,33 +921,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-oe-core.Test_Run_Integrity_-_Check_that_image_is_buildable",
-            "author": [
-                {
-                    "email": "corneliux.stoicescu@intel.com",
-                    "name": "corneliux.stoicescu@intel.com"
-                }
-            ],
-            "execution": {
-                "1": {
-                    "action": "Check that image can be built using either of the following methods:  \n\n",
-                    "expected_results": ""
-                },
-                "2": {
-                    "action": "Check that image is built by autobuilder \nPlease check at: https://autobuilder.yocto.io/pub/releases/ \nChoose the target release that you are validating.  \n\n",
-                    "expected_results": ""
-                },
-                "3": {
-                    "action": "Build image yourself \nPreferred to build an core-image-sato-dev to ease the process of the dependent test cases in this run. \nNote: Please set MACHINE in conf/local.conf ",
-                    "expected_results": "If either method fails, this test case will be failed and dependent test cases will be blocked. "
-                }
-            },
-            "summary": "Test_Run_Integrity_-_Check_that_image_is_buildable"
-        }
-    },
-    {
-        "test": {
-            "@alias": "bsps-hw.bsps-runtime.Check_if_SATA_disk_can_work_correctly",
+            "@alias": "bsps-hw.bsps-hw.Check_if_SATA_disk_can_work_correctly",
             "author": [
                 {
                     "email": "yi.zhao@windriver.com",
@@ -999,7 +951,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.Install_and_boot_from_USB-drive_to_HDD-drive",
+            "@alias": "bsps-hw.bsps-hw.Install_and_boot_from_USB-drive_to_HDD-drive",
             "author": [
                 {
                     "email": "david.israelx.rodriguez.castellanos@intel.com",
@@ -1041,7 +993,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.Install_and_boot_from_USB-drive_to_SD-drive",
+            "@alias": "bsps-hw.bsps-hw.Install_and_boot_from_USB-drive_to_SD-drive",
             "author": [
                 {
                     "email": "david.israelx.rodriguez.castellanos@intel.com",
@@ -1083,7 +1035,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.Test_boot_on_serial_communication_SD",
+            "@alias": "bsps-hw.bsps-hw.Test_boot_on_serial_communication_SD",
             "author": [
                 {
                     "email": "juan.fernandox.ramos.frayle@intel.com",
@@ -1101,7 +1053,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.Test_boot_on_serial_communication_HDD",
+            "@alias": "bsps-hw.bsps-hw.Test_boot_on_serial_communication_HDD",
             "author": [
                 {
                     "email": "juan.fernandox.ramos.frayle@intel.com",
@@ -1119,7 +1071,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.Test_boot_on_serial_communication_USB",
+            "@alias": "bsps-hw.bsps-hw.Test_boot_on_serial_communication_USB",
             "author": [
                 {
                     "email": "juan.fernandox.ramos.frayle@intel.com",
@@ -1153,7 +1105,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-hw.bsps-runtime.Test_Seek_bar_and_volume_control",
+            "@alias": "bsps-hw.bsps-hw.Test_Seek_bar_and_volume_control",
             "author": [
                 {
                     "email": "juan.fernandox.ramos.frayle@intel.com",
@@ -1199,7 +1151,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-runtime.bsps-runtime.Check_if_watchdog_can_reset_the_target_system",
+            "@alias": "bsps-hw.bsps-hw.Check_if_watchdog_can_reset_the_target_system",
             "author": [
                 {
                     "email": "yi.zhao@windriver.com",
@@ -1217,7 +1169,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-runtime.bsps-runtime.Check_if_RTC_(Real_Time_Clock)_can_work_correctly",
+            "@alias": "bsps-hw.bsps-hw.Check_if_RTC_(Real_Time_Clock)_can_work_correctly",
             "author": [
                 {
                     "email": "yi.zhao@windriver.com",
@@ -1251,7 +1203,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-runtime.bsps-runtime.Check_if_target_can_support_EEPROM",
+            "@alias": "bsps-hw.bsps-hw.Check_if_target_can_support_EEPROM",
             "author": [
                 {
                     "email": "yi.zhao@windriver.com",
@@ -1273,107 +1225,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-tools.bsps-tools.smart_add_rpm-dir_channel_(auto)",
-            "author": [
-                {
-                    "email": "corneliux.stoicescu@intel.com",
-                    "name": "corneliux.stoicescu@intel.com"
-                }
-            ],
-            "execution": {
-                "1": {
-                    "action": "Build out packages with poky tree and copy the deploy/rpm directory to target directory. ",
-                    "expected_results": "The command should add a rpm-dir channel with smart. "
-                },
-                "2": {
-                    "action": "On target, run \"smart channel --add myrpmdir type=rpm-dir path=/path/to/tmp/deploy/rpm/i586\". ",
-                    "expected_results": "Run \"smart channel --show myrpmdir\" can show the information about the channel:\n[myrpmdir] \ntype = rpm-dir \npath = /path/to/tmp/deploy/rpm/i586"
-                },
-                "3": {
-                    "action": "Run \"smart channel --show myrpmdir\" and check the output. ",
-                    "expected_results": "After disable the channel, run \"smart channel --show myrpmdir\" would show:\n[myrpmdir] \ntype = rpm-dir \ndisabled = yes \npath = /path/to/tmp/deploy/rpm/i586"
-                },
-                "4": {
-                    "action": "Run \"smart channel --disable myrpmdir\" to diable the channel. ",
-                    "expected_results": ""
-                },
-                "5": {
-                    "action": "Run \"smart channel --show myrpmdir\" and check the output.",
-                    "expected_results": ""
-                }
-            },
-            "summary": "smart_add_rpm-dir_channel"
-        }
-    },
-    {
-        "test": {
-            "@alias": "bsps-tools.bsps-tools.smart_install_package_from_a_local_directory_(auto)",
-            "author": [
-                {
-                    "email": "corneliux.stoicescu@intel.com",
-                    "name": "corneliux.stoicescu@intel.com"
-                }
-            ],
-            "execution": {
-                "1": {
-                    "action": "Copy packages directory to target and add a rpm-dir channel with \nsmart. Make sure this channel and the default rpm-sys channel are \nenabled.",
-                    "expected_results": "The package \"groff\" should be installed."
-                },
-                "2": {
-                    "action": "Run \"smart install package_name\" to install a package from the deploy/rpm/i586 directory. For example, \"smart install groff\".",
-                    "expected_results": ""
-                }
-            },
-            "summary": "smart_install_package_from_a_local_directory"
-        }
-    },
-    {
-        "test": {
-            "@alias": "bsps-tools.bsps-tools.smart_install_package_from_a_remote_repomd_repository_(auto)",
-            "author": [
-                {
-                    "email": "corneliux.stoicescu@intel.com",
-                    "name": "corneliux.stoicescu@intel.com"
-                }
-            ],
-            "execution": {
-                "1": {
-                    "action": "Follow procedure in \"https://wiki.yoctoproject.org/wiki/Rpm%27s_Repository_Setup_for_QA\" to create a rpm-md-channel and updatechannelinformation with smart. ",
-                    "expected_results": ""
-                },
-                "2": {
-                    "action": "Make sure this channel and the default rpm-sys channel are enabled with \"smart channel --show\". ",
-                    "expected_results": ""
-                },
-                "3": {
-                    "action": "Run \"smart install \" to install a package from the remote repository. For example, \"smart install groff\" ",
-                    "expected_results": "The package should be installed. At the example \"groff\" should be installed correctly."
-                }
-            },
-            "summary": "smart_install_package_from_a_remote_repomd_repository"
-        }
-    },
-    {
-        "test": {
-            "@alias": "bsps-tools.bsps-tools.smart_remove_package_(auto)",
-            "author": [
-                {
-                    "email": "corneliux.stoicescu@intel.com",
-                    "name": "corneliux.stoicescu@intel.com"
-                }
-            ],
-            "execution": {
-                "1": {
-                    "action": "Run \"smart remove \" and check the output, for example \"smart remove groff\"",
-                    "expected_results": "The package should be removed . At the example \"groff\" should be removed.\n"
-                }
-            },
-            "summary": "smart_remove_package"
-        }
-    },
-    {
-        "test": {
-            "@alias": "bsps-meta-yocto.bsps-meta-yocto.System_can_boot_up_via_NFS",
+            "@alias": "bsps-hw.bsps-hw.System_can_boot_up_via_NFS",
             "author": [
                 {
                     "email": "yi.zhao@windriver.com",
@@ -1403,33 +1255,7 @@
     },
     {
         "test": {
-            "@alias": "bsps-meta-yocto.bsps-meta-yocto.System_can_boot_up_via_USB",
-            "author": [
-                {
-                    "email": "yi.zhao@windriver.com",
-                    "name": "yi.zhao@windriver.com"
-                }
-            ],
-            "execution": {
-                "1": {
-                    "action": "Copy the kernel and rootfs to the USB stick.  # mount /dev/sda2 /media/sda2  # tar -xvjpf core-image-minimal-XXX.tar.bz2 -C /media/sda2  # cp vmlinux /media/sda2/boot/vmlinux  # umount /media/sda2 ",
-                    "expected_results": "The system should boot up via USB\n"
-                },
-                "2": {
-                    "action": "Reboot the board and press a key on the terminal when prompted to get to the U-Boot command line  # reboot ",
-                    "expected_results": ""
-                },
-                "3": {
-                    "action": "Load the kernel and boot: => ext2load usb 0:2 $loadaddr boot/vmlinux => bootoctlinux $loadaddr coremask=0x3 root=/dev/sda2 rw rootwait mtdparts=phys_mapped_flash:512k(boot0),512k(boot1),64k@3072k(eeprom)",
-                    "expected_results": ""
-                }
-            },
-            "summary": "System_can_boot_up_via_USB"
-        }
-    },
-    {
-        "test": {
-            "@alias": "bsps-meta-yocto.bsps-meta-yocto.Boot_from_JFFS2_image",
+            "@alias": "bsps-hw.bsps-hw.Boot_from_JFFS2_image",
             "author": [
                 {
                     "email": "yi.zhao@windriver.com",
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 09/33] oeqa/manual/compliance-test.json: test id updated and missing test cases added
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (7 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 08/33] oeqa/manual/bsp-hw.json: test id updated and obsolete test cases removed Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 10/33] oeqa/manual/kernel-dev.json: test id updated Armin Kuster
                   ` (23 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: sangeeta jain <sangeeta.jain@intel.com>

Two changes made in oeqa/manual/compliance-test.json:

1. All test id (eg. @alias) inside manual testcase file shall follow the same test id
naming convention from oeqa automated tests (eg. selftest, runtime, sdk, etc), where
the test id consists of  <test_module>.<test_suite>.<test_function>. Furthermore,
there shall be only 1 unique test_module per each manual testcases file.

This file was using more than 1 unique test_module for testcases. Furthermore, some of
the testcases were defined using different test_suite where it was not needed. This patch
fix the manual testcases file to have only 1 unique test_module as well as test_suite to
simplify test id naming.

2. Added 2 missing test cases for Beaglebone Stress Test.

Signed-off-by: sangeeta jain <sangeeta.jain@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 meta/lib/oeqa/manual/compliance-test.json | 60 ++++++++++++++++++++++++++++---
 1 file changed, 56 insertions(+), 4 deletions(-)

diff --git a/meta/lib/oeqa/manual/compliance-test.json b/meta/lib/oeqa/manual/compliance-test.json
index 7adf8a1..982f0b4 100644
--- a/meta/lib/oeqa/manual/compliance-test.json
+++ b/meta/lib/oeqa/manual/compliance-test.json
@@ -1,7 +1,7 @@
 [
     {
         "test": {
-            "@alias": "configuration.configuration.LTP_subset_test_suite",
+            "@alias": "compliance-test.compliance-test.LTP_subset_test_suite",
             "author": [
                 {
                     "email": "corneliux.stoicescu@intel.com",
@@ -43,7 +43,7 @@
     },
     {
         "test": {
-            "@alias": "configuration.configuration.POSIX_subset_test_suite",
+            "@alias": "compliance-test.compliance-test.POSIX_subset_test_suite",
             "author": [
                 {
                     "email": "corneliux.stoicescu@intel.com",
@@ -89,7 +89,7 @@
     },
     {
         "test": {
-            "@alias": "configuration.configuration.LSB_subset_test_suite",
+            "@alias": "compliance-test.compliance-test.LSB_subset_test_suite",
             "author": [
                 {
                     "email": "corneliux.stoicescu@intel.com",
@@ -119,7 +119,7 @@
     },
     {
         "test": {
-            "@alias": "General_Runtime.General_Runtime.stress_test_-_Genericx86-64",
+            "@alias": "compliance-test.compliance-test.stress_test_-_Genericx86-64",
             "author": [
                 {
                     "email": "corneliux.stoicescu@intel.com",
@@ -138,5 +138,57 @@
             },
             "summary": "stress_test_-_Genericx86-64"
         }
+    },
+     {
+    "test": {
+      "@alias": "compliance-test.compliance-test.stress_test_-_- crashme_-_-Beaglebone",
+      "author": [
+        {
+          "email": "corneliux.stoicescu@intel.com",
+          "name": "corneliux.stoicescu@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": " Get crashme from http://people.delphiforums.com/gjc/crashme.html",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Follow the setup steps on above URL, build crashme in target",
+          "expected_results": ""
+        },
+        "3": {
+          "action": " Run crashme for 24 hours",
+          "expected_results": "Target should not crash with the program."
+        }
+      },
+      "summary": "stress_test_-_crashme_-Beaglebone"
+    }
+  },
+  {
+    "test": {
+      "@alias": "compliance-test.compliance-test.stress_test_-_ltp_-Beaglebone",
+      "author": [
+        {
+          "email": "corneliux.stoicescu@intel.com",
+          "name": "corneliux.stoicescu@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Build LTP with toolchain or in sdk image",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Copy LTP folder into target, for example, /opt/ltp. Modify script,  testscripts/ltpstress.sh, set Iostat=1, NO_NETWORK=1",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "cd testscripts/ && ./ltpstress.sh",
+          "expected_results": "This stress case will run for 24 hours Check the result\ntarget should not crash with the program "
+        }
+      },
+      "summary": "stress_test_-_-ltp_-Beaglebone"
     }
+  }
 ]
\ No newline at end of file
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 10/33] oeqa/manual/kernel-dev.json: test id updated
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (8 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 09/33] oeqa/manual/compliance-test.json: test id updated and missing test cases added Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 11/33] oeqa/manual/toaster: transfer manual toaster test cases to oeqa Armin Kuster
                   ` (22 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: sangeeta jain <sangeeta.jain@intel.com>

All test id (eg. @alias) inside manual testcase file shall follow the same test id
naming convention from oeqa automated tests (eg. selftest, runtime, sdk, etc), where
the test id consists of  <test_module>.<test_suite>.<test_function>. Furthermore,
there shall be only 1 unique test_module per each manual testcases file.

This file was using more than 1 unique test_module for testcases. Furthermore,
some of the testcases were defined using different test_suite where it was not needed.
This patch fix the manual testcases file to have only 1 unique test_module
as well as test_suite to simplify test id naming.

Signed-off-by: sangeeta jain <sangeeta.jain@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 meta/lib/oeqa/manual/kernel-dev.json | 36 ++++++++++++++++++------------------
 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/meta/lib/oeqa/manual/kernel-dev.json b/meta/lib/oeqa/manual/kernel-dev.json
index c93b4dd..0dd9919 100644
--- a/meta/lib/oeqa/manual/kernel-dev.json
+++ b/meta/lib/oeqa/manual/kernel-dev.json
@@ -1,7 +1,7 @@
 [
     {
         "test": {
-            "@alias": "kernel-configuration.kernel-configuration.TCTEMP_2.3_MANUAL_Kernel_dev_defconfig",
+            "@alias": "kernel-dev.kernel-dev.Kernel_dev_defconfig",
             "author": [
                 {
                     "email": "ee.peng.yeoh@intel.com",
@@ -18,12 +18,12 @@
                     "expected_results": "Review expected results on thethe \"Kernel Development Test Cases\"wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Expected_Results_7"
                 }
             },
-            "summary": "TCTEMP_2.3_MANUAL_Kernel_dev_defconfig"
+            "summary": "Kernel_dev_defconfig"
         }
     },
     {
         "test": {
-            "@alias": "kernel-configuration.kernel-configuration.TCTEMP_2.3_MANUAL_Kernel_dev_defconfig+fragments",
+            "@alias": "kernel-dev.kernel-dev.Kernel_dev_defconfig+fragments",
             "author": [
                 {
                     "email": "ee.peng.yeoh@intel.com",
@@ -40,12 +40,12 @@
                     "expected_results": "Review expected results on thethe \"Kernel Development Test Cases\"wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Expected_Results_8"
                 }
             },
-            "summary": "TCTEMP_2.3_MANUAL_Kernel_dev_defconfig+fragments"
+            "summary": "Kernel_dev_defconfig+fragments"
         }
     },
     {
         "test": {
-            "@alias": "kernel-configuration.kernel-configuration.TCTEMP_2.3_MANUAL_Kernel_dev_Applying_patches",
+            "@alias": "kernel-dev.kernel-dev.Kernel_dev_Applying_patches",
             "author": [
                 {
                     "email": "ee.peng.yeoh@intel.com",
@@ -62,12 +62,12 @@
                     "expected_results": "Review expected results on thethe \"Kernel Development Test Cases\"wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Expected_Results"
                 }
             },
-            "summary": "TCTEMP_2.3_MANUAL_Kernel_dev_Applying_patches"
+            "summary": "Kernel_dev_Applying_patches"
         }
     },
     {
         "test": {
-            "@alias": "kernel-configuration.kernel-configuration.TCTEMP_2.3_MANUAL_Kernel_dev_linux-yocto-local-source",
+            "@alias": "kernel-dev.kernel-dev.Kernel_dev_linux-yocto-local-source",
             "author": [
                 {
                     "email": "ee.peng.yeoh@intel.com",
@@ -84,12 +84,12 @@
                     "expected_results": "Review expected results on thethe \"Kernel Development Test Cases\"wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Expected_Results_2"
                 }
             },
-            "summary": "TCTEMP_2.3_MANUAL_Kernel_dev_linux-yocto-local-source"
+            "summary": "Kernel_dev_linux-yocto-local-source"
         }
     },
     {
         "test": {
-            "@alias": "kernel-configuration.kernel-configuration.TCTEMP_2.3_MANUAL_Kernel_dev_linux-yocto-custom-local-source",
+            "@alias": "kernel-dev.kernel-dev.Kernel_dev_linux-yocto-custom-local-source",
             "author": [
                 {
                     "email": "ee.peng.yeoh@intel.com",
@@ -106,12 +106,12 @@
                     "expected_results": "Review expected results on thethe \"Kernel Development Test Cases\"wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Expected_Results_3"
                 }
             },
-            "summary": "TCTEMP_2.3_MANUAL_Kernel_dev_linux-yocto-custom-local-source"
+            "summary": "Kernel_dev_linux-yocto-custom-local-source"
         }
     },
     {
         "test": {
-            "@alias": "kernel-configuration.kernel-configuration.TCTEMP_2.3_MANUAL_Kernel_dev_recipe-space_meta",
+            "@alias": "kernel-dev.kernel-dev.Kernel_dev_recipe-space_meta",
             "author": [
                 {
                     "email": "ee.peng.yeoh@intel.com",
@@ -128,12 +128,12 @@
                     "expected_results": "Review expected results on thethe \"Kernel Development Test Cases\"wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Expected_Results_5"
                 }
             },
-            "summary": "TCTEMP_2.3_MANUAL_Kernel_dev_recipe-space_meta"
+            "summary": "Kernel_dev_recipe-space_meta"
         }
     },
     {
         "test": {
-            "@alias": "kernel-configuration.kernel-configuration.TCTEMP_2.3_MANUAL_Kernel_dev_External_source",
+            "@alias": "kernel-dev.kernel-dev.Kernel_dev_External_source",
             "author": [
                 {
                     "email": "ee.peng.yeoh@intel.com",
@@ -150,12 +150,12 @@
                     "expected_results": "Review expected results on thethe \"Kernel Development Test Cases\"wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Expected_Results_6"
                 }
             },
-            "summary": "TCTEMP_2.3_MANUAL_Kernel_dev_External_source"
+            "summary": "Kernel_dev_External_source"
         }
     },
     {
         "test": {
-            "@alias": "kernel-configuration.kernel-configuration.TCTEMP_2.3_MANUAL_Kernel_dev_building_external_modules(hello-mod)",
+            "@alias": "kernel-dev.kernel-dev.Kernel_dev_building_external_modules(hello-mod)",
             "author": [
                 {
                     "email": "ee.peng.yeoh@intel.com",
@@ -172,12 +172,12 @@
                     "expected_results": "Review expected results on thethe \"Kernel Development Test Cases\"wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Expected_Results_10"
                 }
             },
-            "summary": "TCTEMP_2.3_MANUAL_Kernel_dev_building_external_modules(hello-mod)"
+            "summary": "Kernel_dev_building_external_modules(hello-mod)"
         }
     },
     {
         "test": {
-            "@alias": "kernel-configuration.kernel-configuration.TCTEMP_2.3_MANUAL_Kernel_dev_local_parallel_meta",
+            "@alias": "kernel-dev.kernel-dev.Kernel_dev_local_parallel_meta",
             "author": [
                 {
                     "email": "ee.peng.yeoh@intel.com",
@@ -194,7 +194,7 @@
                     "expected_results": "Review expected results on thethe \"Kernel Development Test Cases\"wiki. https://wiki.yoctoproject.org/wiki/Kernel_Development_Test_Cases#Expected_Results_4"
                 }
             },
-            "summary": "TCTEMP_2.3_MANUAL_Kernel_dev_local_parallel_meta"
+            "summary": "Kernel_dev_local_parallel_meta"
         }
     }
 ]
\ No newline at end of file
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 11/33] oeqa/manual/toaster: transfer manual toaster test cases to oeqa
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (9 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 10/33] oeqa/manual/kernel-dev.json: test id updated Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 12/33] oeqa/manual/toaster: updated test id naming Armin Kuster
                   ` (21 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Yeoh Ee Peng <ee.peng.yeoh@intel.com>

As part of the solution to replace Testopia, manual test cases
need to be migrated to OEQA. These manual test case json files
will serve two use cases.

Use case#1: as input to the future commandline-based manual test
runner script, where this script will display actions and expected
result information in user friendly text, then it will capture
user input for test result and log, finally it will write test
result and log into existing standardize test result json format
from OEQA framework for automated tests.

Use case#2: QA will open and read these json file manually for
planning manual test execution. Any reader interested in
understanding manual test cases will open and read these files.

Signed-off-by: Yeoh Ee Peng <ee.peng.yeoh@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 meta/lib/oeqa/manual/toaster-managed-mode.json   | 2572 ++++++++++++++++++++++
 meta/lib/oeqa/manual/toaster-unmanaged-mode.json | 1170 ++++++++++
 2 files changed, 3742 insertions(+)
 create mode 100644 meta/lib/oeqa/manual/toaster-managed-mode.json
 create mode 100644 meta/lib/oeqa/manual/toaster-unmanaged-mode.json

diff --git a/meta/lib/oeqa/manual/toaster-managed-mode.json b/meta/lib/oeqa/manual/toaster-managed-mode.json
new file mode 100644
index 0000000..ba0658f
--- /dev/null
+++ b/meta/lib/oeqa/manual/toaster-managed-mode.json
@@ -0,0 +1,2572 @@
+[
+  {
+    "test": {
+      "@alias": "toaster.toaster.All_layers:_default_view",
+      "author": [
+        {
+          "email": "stanciux.mihail@intel.com",
+          "name": "stanciux.mihail@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": " Access a project page, either by creating a new project or accessing an existing project from the \"All builds\" table.",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "On the project page click on the \"View compatible layers\" link situated on the right-hand side, mid-page, under the \"Project configuration\" menu, in the \"Layers\" table.",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Check that the table is populated with the default layers (eg. meta-yocto-bsp, meta-yocto)",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Check that by default the following columns are shown: Layer, Summary, Revision, Dependencies and Add/Delete",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Check that the \"Revision\" entries match the release entry from the main project page, in the project details section.",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "Check that only one instance of the core layers (openembedded-core, meta-yocto and meta-yocto-bsp) shows in this table, and that instance has a branch that matches the selected project release from the main project page.",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "Check that in the \"Dependencies\" column some of the layers should have a square box with a number in it. When clicking on it, a small popup should appear containing a list of other layers required for this layer to work. Every layer listed here should also be a link to the layer's detail page. \n \n",
+          "expected_results": ""
+        },
+        "8": {
+          "action": "From the \"Edit columns\" menu, activate the \"Git repository URL\" and the \"Subdirectory\" columns. In \"Git repository URL\": all the entries should have a link to the external site where the layer was  downloaded from.  Similarly, in \"Subdirectory\" links should exist, if a subdirectory entry is present.",
+          "expected_results": "All mentioned elements should be present and functional."
+        }
+      },
+      "summary": "All_layers:_default_view"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.All_layers:_Add/delete_layers",
+      "author": [
+        {
+          "email": "stanciux.mihail@intel.com",
+          "name": "stanciux.mihail@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": " Access a project page, either by creating a new project or accessing an existing project from the \"All builds\" table. \n\n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "On the project page click on the \"View compatible layers\" link situated on the right-hand side, mid-page, under the \"Project configuration\" menus, in the \"Layers\" table.  \n\n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Check that the Add/delete column is enabled. \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Add a new layer \nPick a layer that hasn't been added to the project. \n \nClick on the \"Add layer\" button present in the \"Add/delete\" column. \nIf the layer has unsatisfied dependencies a dialog will appear listing the dependencies (in alphabetical order), each of them with a checkbox so that you can select / deselect them. All checkboxes are checked by default. If you click the \"Cancel\" button the dialog closes. If you click the \"Add layers\" button, the layers are added to the project. \n\nMake sure to uncheck at least 1 of the dependencies so you can check that only the checked dependencies are added, and not the unchecked one(s). ",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Check that the \"Add layer\" button fades out and is replaced temporarily by a message like \"1 layer added\" and then it is replaced by the \"Delete layer\" button. \nCheck that a confirmation message is displayed at the top of the page similar to \"You have added 1 layer to project_name_here: meta-yocto-bsp\". \n\n",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "Delete an existing layer \nPick a layer that's already been added to the project. \nClick on the \"Delete layer\" button present in the \"Add/delete\" column. \nCheck that once the button is pressed, it fades out and is replaced temporarily by the message \"1 layer deleted\" and then it is replaced by the \"Add layer\" button. \nCheck that a confirmation is displayed at the top of the page similar to \"You have deleted 1 layer from project_name_here: meta-yocto-bsp\". ",
+          "expected_results": "All actions should complete successfully."
+        }
+      },
+      "summary": "All_layers:_Add/delete_layers"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.All_targets:_Default_view",
+      "author": [
+        {
+          "email": "stanciux.mihail@intel.com",
+          "name": "stanciux.mihail@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": " Access a project page, either by creating a new project or accessing an existing project from the \"All builds\" table. \n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": " If no images exist in the project, build an image by inserting \"core-image-minimal\" in the \"Recipes\" field and press the \"Build\" button. Wait for the image to finish building. \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "On the project page click on the \"Image Recipes\" link situated in the left-handed side of the page, under the \"Project configuration\" menus, in the \"COMPATIBLE METADATA\" table. \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Check that \"Compatible image recipes\" table is populated. \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Check that the following columns are shown by default: \n\t\tImage recipe \n\t\tDescription \n \n\t\tLayer \n\t\tBuild \n\t\t     Version ",
+          "expected_results": ""
+        }
+      },
+      "summary": "All_targets:_Default_view"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Configuration_variables:_default_view",
+      "author": [
+        {
+          "email": "stanciux.mihail@intel.com",
+          "name": "stanciux.mihail@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": " Access a project page, either by creating a new project or accessing an existing project from the \"All builds\" table.  \n\n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "In the main project page, click on \"BitBake variables\" in the left-hand side of the page, under the \"CONFIGURATION\" menu.  \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Check that default values are as follows: \n\tDISTRO - poky \n\tIMAGE_FSTYPES - ext3 jffs2 tar.bz2 \n\tIMAGE_INSTALL_append - \"Not set\" \n\tPACKAGE_CLASES - package_rpm \n        SSTATE_DIR  - /homeDirectory/poky/sstate-cache \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Check that under the \"Add variable\" section, the \"Variable\" field has the default text \"Type variable name\" present, the \"Value\" field has the default text \"Type variable value\" present and that the \"Add variable\" button is inactive. \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Check that under the \"Add variable\" section, there is text present that describes the variables that Toaster cannot modify. ",
+          "expected_results": "All mentioned elements should be present and functional."
+        }
+      },
+      "summary": "Configuration_variables:_default_view"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Configuration_variables:_Test_UI_elements",
+      "author": [
+        {
+          "email": "stanciux.mihail@intel.com",
+          "name": "stanciux.mihail@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": " Access a project page, either by creating a new project or accessing an existing project from the \"All builds\" table. \n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "In the main project page, click on \"BitBake variables\" in the left-hand side of the page, under the \"CONFIGURATION\" menu. \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "DISTRO: \n\t- check that the \"change\" icon is present (represented by a pen icon) \n\t- click on the \"change\" icon and check that the variable becomes an editable text field, populated with the current value of the variable \n\t- check that, if you delete the content of the text field, the save button is disabled \n\t- enter a distro name containing spaces (for example, \"poky tiny\") - check that an error message is shown explaining that the value entered cannot contain spaces  \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "IMAGE_FSTYPES: \n\t- check that the \"change\" icon is present (represented by a pen icon) \n\t- click on the \"change\" icon and check that the variable becomes editable like so: the main input control is a set of checkboxes. There is a checkbox for each supported image type. The checkboxes are listed in ascending alphabetical order, broken down in 2 groups: \n\t\t",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "The selected types are checked and listed at the top \n\t\t",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "The other types are not checked and listed afterwards \n\t- check that all this is inside a scrollable div, and a text field is present above that filters out the content of the div as you type. \n\t- check that if there are no image types matching your typed string, a message is shown notifying you of this: \"No image types found\" \n\t- unselect all checkboxes and check that the save button is disabled and a message is shown: \"You must select at least one image type\" \n\t- select different checkboxes and hit save then make sure that the \tsaved value is consistent with the selected checkboxes  \n\n",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "IMAGE_INSTALL_append: \n\t- check that the \"change\" icon is present (represented by a pen icon) \n\t- click on the \"change\" icon and check that the variable becomes a text field, populated with the current value of the variable.  \n\n\t- check that the save button is disabled when the text field is empty \n\t- insert test in the text field (for example \"package1\") and hit save; be aware that there is no input validation for this variable \n\t- check that a new \"delete\" icon(a trashcan) has appeared next to the pen icon \n\t- check that clicking on the trashcan icon resets the value to \"Not set\" and makes the trashcan icon dissapear  \n\n",
+          "expected_results": ""
+        },
+        "8": {
+          "action": "PACKAGE_CLASSES: \n\t- check that the \"change\" icon is present (represented by a pen icon) \n\t- click on the \"change\" icon and check that the variable becomes editable with the following components: \n\t\t",
+          "expected_results": ""
+        },
+        "9": {
+          "action": "A dropdown menu with values 'package_dev', 'package_ipk' and 'package_rpm' in this order. The value selected when you enter the editable state matches the first value of the variable (e.g. if the value is set to 'package_dev package_ipk' the value selected is 'package_dev').  \n \n\t\t",
+          "expected_results": ""
+        },
+        "10": {
+          "action": "Two checkboxes, showing the 2 unselected values in the dropdown menu.  \n\n\t- verify that the checkboxes are checked or unchecked to reflect the variable value (e.g. if the value is set to 'package_dev package_ipk', the 'package_ipk' checkbox is checked, and the 'package_rpm' checkbox is unchecked).  \n\n\tBoth checkboxes can be unchecked.  The value of the checkboxes changes dynamically as I change the selected value in the dropdown menu. This means that any changes to the dropdown menu should uncheck the checkboxes.  \n\n\t- click on save and check that the  value selected in the dropdown menu is the first value in the variable, followed by any checked checkboxes.  \n\n\n",
+          "expected_results": ""
+        },
+        "11": {
+          "action": "Adding variables: \n\t- check that the \"add variable\" form has 2 text fields: one for the variable name and a second one for the variable value, plus an \"add\" button that is disabled until both text fields have some input in them.  \n \n\t- check variable name validation: variable names cannot have spaces, and can only include letters, numbers, underscores and dashes; variable names entered cannot match the name of a variable already on the list; variable names cannot match the blacklisted variables mentioned in the text on the right-hand side of the page  \n\n\t - check that an error message is shown indicating validation has failed and why once you try to put in the value or click on the \"Add variable\" button  ",
+          "expected_results": "All mentioned elements should be present and functional."
+        },
+        "12": {
+          "action": "insert a valid combination and click on \"Add variable\"; check that a new variable/value pair is added at the bottom of the variable list and that the text fields in the \"add variable\" form are cleared and the \"add\" button is disabled \n\t- check that the added variable has a \"change\" icon present next to the variable value, and also that a \"delete\" icon is present next to the variable name \n\t- check that clicking the \"change\" icon makes the variable editable in a text field containing the value of the variable \n\t- check that, if you delete the content of the text field, the save button is\tdisabled\n\t- check that clicking on the \"delete\" button causes both the variable name and the variable value to be removed from the variables list",
+          "expected_results": "All mentioned elements should be present and functional."
+        }
+      },
+      "summary": "Configuration_variables:_Test_UI_elements"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Project_builds:_Default_view",
+      "author": [
+        {
+          "email": "stanciux.mihail@intel.com",
+          "name": "stanciux.mihail@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": " Access a project page, either by creating a new project or accessing an existing project from the \"All builds\" table. \n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Click on the \"Builds\" , next to the \"Configuration\" Button. \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Check that the page heading includes a counter with the number of builds run for the project(eg. \"Project builds (4)\"). \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Check that the following table heads are visible by default: outcome, completed on, failed tasks, errors, warnings, image files. \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Check that by default the table is sorted by \"Completed on\" in descending order",
+          "expected_results": "All mentioned elements should be present."
+        }
+      },
+      "summary": "Project_builds:_Default_view"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Project_builds:_Sorting_the_project_builds_table",
+      "author": [
+        {
+          "email": "stanciux.mihail@intel.com",
+          "name": "stanciux.mihail@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": " Access a project page, either by creating a new project or accessing an existing project from the \"All builds\" table. \n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Click on the \"View all project builds\" link situated below the top-most \"Build\" button and text field, next to the \"View all targets\" link \n\n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Verify that, by default, the table is sorted by \"Completed on\" in descending order. \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Activate all columns from the \"Edit columns\" table. \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Check that the following columns are sortable, both in ascending and descending order: outcome, target, machine, started on, completed on, warning, project \n\n",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "Verify that hiding a column that is currently being used as the sorting criteria causes the sorting to reset to the default - i.e \"Completed on\" in descending order.",
+          "expected_results": "All mentioned elements should be present and functional."
+        }
+      },
+      "summary": "Project_builds:_Sorting_the_project_builds_table"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Project_builds:_customize_the_columns_of_the_table",
+      "author": [
+        {
+          "email": "stanciux.mihail@intel.com",
+          "name": "stanciux.mihail@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": " Access a project page, either by creating a new project or accessing an existing project from the \"All builds\" table. \n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Click on the \"View all project builds\" link situated below the top-most \"Build\" button and text field, next to the \"View all targets\" link \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Click on the \"Edit column\" menu and check that the selected columns match the columns currently being shown. \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Check that the following columns cannot be removed from the shown columns: completed on, outcome, recipe \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Check that unchecked items changed to checked immediately appear in the table and that checked items changed to unchecked immediately disappear from the table.",
+          "expected_results": "All mentioned elements should be present and functional."
+        }
+      },
+      "summary": "Project_builds:_customize_the_columns_of_the_table"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Project_builds:_filter_the_contents_of_the_table",
+      "author": [
+        {
+          "email": "stanciux.mihail@intel.com",
+          "name": "stanciux.mihail@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": " Access a project page, either by creating a new project or accessing an existing project from the \"All builds\" table. \n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Click on the \"View all project builds\" link situated below the top-most \"Build\" button and text field, next to the \"View all targets\" link. \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Make sure the following columns have filters: outcome, started on, completed on, failed tasks. \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Filters are mutually exclusive. Click a filter button of a one column and a filter dialogue occurs. Select a filter item. The filter result would be showed. Then select another filter item of another column and the previously applied filter is overridden by the newly selected filter when a filter from a different column is applied to the table. This filter will override the current filter.\" \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Filters are overridden by search. Run a search query and you can see previous filter results are overridden by the results of the search query.",
+          "expected_results": "All mentioned elements should be present and functional."
+        }
+      },
+      "summary": "Project_builds:_filter_the_contents_of_the_table"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Project_builds:_search_the_contents_of_the_table",
+      "author": [
+        {
+          "email": "stanciux.mihail@intel.com",
+          "name": "stanciux.mihail@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": " Access a project page, either by creating a new project or accessing an existing project from the \"All builds\" table. \n\n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Click on the \"View all project builds\" link situated below the top-most \"Build\" button and text field, next to the \"View all targets\" link. \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "When no search query has been entered, we have placeholder text saying: \"Search builds\". The placeholder text disappears when the first character is typed. \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "When a search query has been submitted and results returned: \n-  We keep the search string in the text input field. \n- We provide a \"Clear search\" icon (icon-remove-sign). Click it to clear the search and display all packages. \n- We change the page heading to indicate the number of results returned by the search query. \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "If your search query returns no results, the page heading changes to \"No packages found\", and we show you an alert with a search form and an option to show all packages. \n\n",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "Searching does not change the state of the table: the same columns remain hidden and the same sorting applied. ",
+          "expected_results": "All mentioned elements should be present and functional."
+        }
+      },
+      "summary": "Project_builds:_search_the_contents_of_the_table"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Layer_details_page:_Default_view",
+      "author": [
+        {
+          "email": "stanciux.mihail@intel.com",
+          "name": "stanciux.mihail@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": " Access a project page, either by creating a new project or accessing an existing project from the \"All builds\" table. \n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Click on the \"View compatible layers\" link situated in the \"Project configuration\" portion of the page, under \"Layers\" table. \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Click on a layer (for example \"meta-aarch64\"). Notice that the page is divided into 2 columns: the left one is broken down into tabs; the right one provides information about the layer. \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Check that breadcrumbs exist at the top of the page. Check that they work by clicking on them, then hitting back to return to the layer detail page. \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Check that the page heading includes the layer branch name - it should look something like meta-aarch64(dizzy) if the dizzy branch was selected. The branch name should also be present in the breadcrumbs. \n\n",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "The \"About\" information: \nit shows summary, description in this order, if not empty. If an information item is empty (like the Summary in the example shown in this page), it does not display. \n \n\n",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "The tabs: \nCheck that there are 3 tabs: \"layer details\", \"recipes\", \"machines\" showing up in this order. \n\n",
+          "expected_results": ""
+        },
+        "8": {
+          "action": "\"Layer details\" tab: \nCheck that the tab shows: \n- A button to add / remove the layer to / from the project. In this tab, the button labels are\"Add the $layer_name layer to your project\" \"Delete the $layer_name layer from your project\" \n- Some details about the layer: repository URL, repository subdirectory, revision (the branch) and the list of layer dependencies. If any of the above details is blank (most likely, the subdirectory) it does not display.The icons next to the repository and subdirectory information are links to their web instances. Those links should open in a new window. \n\n",
+          "expected_results": ""
+        },
+        "9": {
+          "action": "The \"Recipes\" tab: \nCheck that it shows: \n\t",
+          "expected_results": ""
+        },
+        "10": {
+          "action": "A counter in the tab label showing the total number of targets provided by the layer \n\t",
+          "expected_results": ""
+        },
+        "11": {
+          "action": "A button to add / remove the layer to / from the project. In this tab, the button labels are \"Add the $layer_name layer to your project to enable these targets\"/\"Delete the $layer_name layer from your project\" \n\t",
+          "expected_results": ""
+        },
+        "12": {
+          "action": "A recipes table with the following columns: \n \n- Recipe \n- Description: the value of the DESCRIPTION variable. If not set, then the value of the SUMMARY variable. \n- Build recipe, which shows a \"build recipe\" button. The \"build recipe\" button is disabled when the layer is not added to the project. \n\nThe recipes table is sorted by \"Recipe\" in ascending alphabetical order. \n\n1",
+          "expected_results": ""
+        },
+        "13": {
+          "action": "The \"Machines\" tab: \n\t",
+          "expected_results": ""
+        },
+        "14": {
+          "action": "A counter in the tab label showing the total number of machines provided by the layer \n\t",
+          "expected_results": ""
+        },
+        "15": {
+          "action": "A button to add/remove the layer to/from the project. In this tab, the button labels are \"Add the $layer_name layer to your project to enable these machines\"/\"Delete the $layer_name layer from your project\" \n\t",
+          "expected_results": ""
+        },
+        "16": {
+          "action": "A machines table with the following columns: \n \n- Machine. \n \n- Description: The value of the DESCRIPTION variable in the .conf file \n- Select machine, which shows a \"select\" button. The \"select\" button is disabled when the layer is not added to the project. \nThe machines table is sorted by \"Machine\" in ascending alphabetical order.  \n",
+          "expected_results": "All mentioned elements should be present and functional."
+        }
+      },
+      "summary": "Layer_details_page:_Default_view"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Layer_details_page:_UI_functionality",
+      "author": [
+        {
+          "email": "stanciux.mihail@intel.com",
+          "name": "stanciux.mihail@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": " Access a project page, either by creating a new project or accessing an existing project from the \"All builds\" table. \n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Click on the \"View compatible layers\" link situated in the \"Project configuration\" portion of the page, under \"Layers\" \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Click on a layer (for example \"meta-aarch64\").  \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Adding/removing a layer: \nClick on \"Add the $layer_name_here layer to your project\" and verify that the \"Add layer\" button turns into a red button with the label \"Delete the $layer_name_here layer from your project\" and that at the top of the page, below the header, you see a message \"You have added 1 layer to  $project_name_here: $layer_name_here\". This message can be dismissed by clicking on the \"X\" at the top right side of the message. ",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Click on the red \"Delete the $layer_name_here from your project\" button and verify that the \"Delete layer\" button turns back into a grey button with the label \"Add the $layer_name_here to your project\" and that at the top of the page, below the header, you see a message \"You have deleted 1 layer to $project_name_here: $layer_name_here\". This message can be dismissed by clicking on the \"X\" at the top right side of the message. \n\n",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "Dependencies window: \n For a layer that has dependencies( for example \"meta-ettus\"), once you click the \"Add layer\" button, verify that you get a message window that presents the dependencies for this layer with the message \"$layer_name_here depends on some layers that are not added to your project. Select the ones you want to add:\", a list with a checkbox for each one and 2 options: \"Add layers\" or \"Cancel\". \nClicking on \"Add layers\" adds all the dependencies and the current layer. Clicking on \"Cancel\" takes you back to the layer detail page without adding any of the layers. \n\n",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "\"Recipes\" table \nCheck that if the layer hasn't been added to the project, the \"Build recipe\" button(s) are disabled. After the project is added, check that the \"Build recipe\" button(s) become active and clicking on a button sends you to the main project page and starts a build. \n\n",
+          "expected_results": ""
+        },
+        "8": {
+          "action": "\"Machines table\" \nCheck that if the layer hasn't been added to the project, the \"Select machine\" button(s) are disabled.  After the project is added, check that the \"Build machine\" button(s) become active and clicking on a button sends you to the main project page and modifies the project machine to the one selected. ",
+          "expected_results": "All mentioned elements should be present and functional."
+        }
+      },
+      "summary": "Layer_details_page:_UI_functionality"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Importing_new_layers",
+      "author": [
+        {
+          "email": "stanciux.mihail@intel.com",
+          "name": "stanciux.mihail@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": " Access a project page, either by creating a new project or accessing an existing project from the \"All builds\" table.  \n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Click on the \"Import layer\" link situated in the \"Project configuration\" portion of the page, under \"Layers\" table.  \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Check that the import layer form is shown, with the following elements as text fields to be filled out: \nLayer name (example: meta-imported) \nGit repository URL (example: git://github.com/shr-distribution/meta-smartphone.git) \nRepository subdirectory (optional) (example: meta-acer) \nRevision (example: master) \n\nIn addition, a separate portion of the form will be the \"Layer dependencies\" portion, where you can add dependency layers for the layer you are importing. This portion will contain a list of dependencies already added, with a trashcan icon next to them that will delete them when pressed and a text field with a \"add layer\" button next to it for adding dependencies. (for example: meta-android, meta-oe) \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "At the bottom of the form, check that a button exists with the label \"Import and add to project\". Check that this button is inactive until the required fields are filled out. \nCheck that clicking on the \"Import button\" takes you back to the main project page and that the imported layer, along with any dependencies, were added in the project's layers. ",
+          "expected_results": "All mentioned elements should be present and functional."
+        }
+      },
+      "summary": "Importing_new_layers"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Layer_details_page:_UI_functionality_for_imported_layers",
+      "author": [
+        {
+          "email": "stanciux.mihail@intel.com",
+          "name": "stanciux.mihail@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": " Access a project page, either by creating a new project or accessing an existing project from the \"All builds\" table. \n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Click on the \"View compatible layers\" link situated in the \"Project configuration\" portion of the page, under \"Layers\" table. \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Select an imported layer (see in TC 1112 how to import a layer). \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Page heading \nCheck that the page heading includes the branch, tag or commit as entered when importing the layer.\nIf it's a commit, Check that only the first 10 characters are shown followed by an ellipsis character. The full commit shows on hover.The branch, tag or commit information also shows in the breadcrumb. \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "The \"About\" information \nIt shows: \n- Summary \n- Description \nin this order. Those two items always show, independently of them being blank or not, since they can be edited by users. \n\nWhen an information item is empty, it shows as \"not set\" with a \"change\" icon. Click on the icon to add a value. \n\nFor \"Summary\" and \"Description\" clicking the \"change\" icon shows the selected information item in its editable state. It consists of a text area, set to 2 rows for the \"Summary\" and to 6 rows for the \"Description\", plus 'save' and 'cancel' buttons.  \nThe 'save' buttons only activate when there is at least one character in the text area. \n\n",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "The tabs \nCheck that the tabs shown are: \n- \"Layer details\" \n- \"Recipes\" \n- \"Machines\" \nThe tabs should show in the order in which they are listed above. \n\n\"Layer details\" tab: \nIn not-editable pages, the tab shows: \n- A button to add / remove the layer to / from the project. In this tab, the button labels are: \n\t- \"Add the $layer_name layer to your project\" \n\t- \"Delete the $layer_name layer from your project\" \n\n- Some details about the layer: repository URL, repository subdirectory, revision (branch / tag / commit) and the list of layer dependencies. This is the information required from users when importing a layer.  The subdirectory and the layer dependencies can be blank.",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "If blank, they show as \"not set\". \n\nEditing the \"Repository URL\" \nThe \"Git repository URL\" cannot be blank. Therefore, we show only a \"change\" icon next to it. When you click the icon, the text input field is set to the current value. If you delete the value from the input field, we disable the \"save\" button. We enable it again when you type something in the field.  \n\nEditing the \"Repository subdirectory\" \nThe \"Repository subdirectory\" can be blank. Therefore, we show both \"change\" and \"delete\" icons. When you click the \"delete\" icon, we  \nshow the label \"Not set\".",
+          "expected_results": ""
+        },
+        "8": {
+          "action": "\nWhen you click the \"change\" icon, the text input field is set \nto the current value.  \nIf you delete the value from the input field, we disable the \"save\" button. We enable it again when you type something in the field. \n \n\nEditing the \"Revision\" \nThe \"Revision\" cannot be blank. Therefore, we show only a \"change\" icon next to it. When you click the icon, the text input field is set to the current value. If you delete the value from the input field, we disable the \"save\" button. We enable it again when you type something in the field. \n\nThe \"Recipes\" tab \nIt shows: \n1: A counter in the tab label showing the total number of targets provided by the layer \n2: A button to add/remove the layer to/from the project. ",
+          "expected_results": ""
+        },
+        "9": {
+          "action": "In this tab, the button labels are \n \n\"Add the $layer_name layer to your project to enable \nthese targets\" \n\"Delete the $layer_name layer from your project\" \n\n3: A \"Recipes\" table with the following columns: \n \n- Recipe \n- Description: the value of the DESCRIPTION variable. If not set, then the value of the SUMMARY variable. \n- Build recipe, which shows a \"build recipe\" button. The \"build recipe\" button is disabled when the layer is not added to the project. \nThe recipes table is sorted by \"Recipe\" in ascending alphabetical order. \n\nThe \"Machines\" tab: \nIt shows: \n1: A counter in the tab label showing the total number of machines provided by the layer \n2: A button to add/remove the layer to/from the project.",
+          "expected_results": ""
+        },
+        "10": {
+          "action": "In this tab, the button labels are \n \n\t- \"Add the $layer_name layer to your project to enable these machines\" \n\t- \"Delete the $layer_name layer from your project\" \n3: A \"machines\" table with the following columns:  \n- Machine. \n \n- Description: The value of the DESCRIPTION variable in the .conf file \n- Select machine, which shows a \"select\" button. The \"select\" button is disabled when the layer is not added to the project. \nThe machines table is sorted by \"Machine\" in ascending alphabetical order. ",
+          "expected_results": "All mentioned elements should be present and functional."
+        }
+      },
+      "summary": "Layer_details_page:_UI_functionality_for_imported_layers"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Multiple_build_directories",
+      "author": [
+        {
+          "email": "stanciux.mihail@intel.com",
+          "name": "stanciux.mihail@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "after starting Toaster for the first time, go to http://[localhost]:8000/admin/ and login with the admin user you created during setup. Click on the Build environments section, and on the BuildEnvironment object. \n\n\n\nNote: you can create a superuser to enter as admin with ... poky/bitbake/lib/toaster/manage.py createsuperuser \n\n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "make note of the \"sourcedir\" and \"builddir\" values. The build dir will be something like \"/home/user/path/build\" \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": " click \"back\", and click on the \"Add build environment\" button in the upper right corner. \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "enter Address \"2\", Betype: \"local\", \"sourcedir\" is to be set to whatever the original build env is set, and \"builddir\" is ANOTHER path at the same level as the original builddir - e.g. \"/home/user/path/build2\" \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Click save \n\n",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "Execute command : /poky$ source oe-init-build-env build2 \n\n",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "Create new project \n\n",
+          "expected_results": ""
+        },
+        "8": {
+          "action": "issue 2 build (e.g. core-image-minimal core-image-sato)\n\n\n\n\n\n",
+          "expected_results": "Both build commands should run simultaneously."
+        }
+      },
+      "summary": "Multiple_build_directories"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Run_again_button_from_all_builds_page_must_run_the_specified_task",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start Toaster.",
+          "expected_results": "Toaster starts. \n"
+        },
+        "2": {
+          "action": "Click on new project button.",
+          "expected_results": " Open create a new project page. \n"
+        },
+        "3": {
+          "action": "Enter a project name, select a release and click on create project or select an existing project.",
+          "expected_results": " Project Created. \n"
+        },
+        "4": {
+          "action": "Build a image task (ex: core-image-minimal:clean) and wait until build finish.\nfrom all build page.",
+          "expected_results": " Build task finishes successfully. \n"
+        },
+        "5": {
+          "action": "Click on rebuild button from all build page.",
+          "expected_results": "Specified task will run again. \n"
+        },
+        "6": {
+          "action": "Click on the build and verify if the number of tasks executed = 1.",
+          "expected_results": "Only the specified task is executed. \n"
+        },
+        "7": {
+          "action": "From project builds page click on run again button.",
+          "expected_results": "Specified task will run again.\n"
+        },
+        "8": {
+          "action": "Click on the build and verify if the number of tasks executed = 1.",
+          "expected_results": ""
+        }
+      },
+      "summary": "Run_again_button_from_all_builds_page_must_run_the_specified_task"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Intel_layers_builds",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start Toaster.",
+          "expected_results": "Toaster starts. \n"
+        },
+        "2": {
+          "action": "Click on new project button.",
+          "expected_results": "Open create a new project page. \n"
+        },
+        "3": {
+          "action": "Enter a project name, select a release and click on create project.",
+          "expected_results": "Project Created. \n"
+        },
+        "4": {
+          "action": "Click on layers tab.",
+          "expected_results": "Open compatible layers page. \n"
+        },
+        "5": {
+          "action": "Search for intel.",
+          "expected_results": "Return results \n"
+        },
+        "6": {
+          "action": "Add intel layers like: meta-intel, meta-intel-quark.",
+          "expected_results": "Layers added to project. \n"
+        },
+        "7": {
+          "action": "Click on the added layer.",
+          "expected_results": "Open layer page. \n"
+        },
+        "8": {
+          "action": "From machine tab, select a machine.",
+          "expected_results": "Machine has changed. \n"
+        },
+        "9": {
+          "action": "Build a recipe(core-image-minimal) or a recipe from recipe tab.",
+          "expected_results": "Build finishes successfully."
+        }
+      },
+      "summary": "Intel_layers_builds"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Download_other_artifacts",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Delete the build/tmp folder. (to make sure the rootfs task runs and other artifacts are generated for the build)",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Start Toaster.",
+          "expected_results": "Toaster starts. \n\t"
+        },
+        "3": {
+          "action": "Click on new project button.",
+          "expected_results": "Open create a new project page. \n\t"
+        },
+        "4": {
+          "action": "Enter a project name, select a release and click on create project.",
+          "expected_results": "Project Created. \n\t"
+        },
+        "5": {
+          "action": "Build an image recipe (ex: core-image-minimal) and wait until build finish.",
+          "expected_results": "Build finishes successfully. \n\t"
+        },
+        "6": {
+          "action": "Click on the built recipe.",
+          "expected_results": "Open build summary page. \n\t"
+        },
+        "7": {
+          "action": "From other artifacts tab click on a link.",
+          "expected_results": "You can download other artifacts."
+        }
+      },
+      "summary": "Download_other_artifacts"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Download_licence_manifest",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Delete the build/tmp folder. (to make sure license manifest is generated)",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Start Toaster \n\n",
+          "expected_results": "Toaster starts. \n"
+        },
+        "3": {
+          "action": "Click on new project button. \n\n",
+          "expected_results": "Open create a new project page. \n"
+        },
+        "4": {
+          "action": "Enter a project name, select a release and click on create project. \n\n",
+          "expected_results": "Project Created. \n"
+        },
+        "5": {
+          "action": "Build an image recipe (ex: core-image-minimal) and wait until build finish. \n\n",
+          "expected_results": "Build finishes successfully. \n"
+        },
+        "6": {
+          "action": "Click on the built recipe. \n\n",
+          "expected_results": "Open build summary page. \n"
+        },
+        "7": {
+          "action": "From Image tab click on \"Download\" button for License manifest.",
+          "expected_results": "You can download license manifest."
+        }
+      },
+      "summary": "Download_licence_manifest"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Test_dependencies_layers",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start Toaster.",
+          "expected_results": "Toaster starts. \n"
+        },
+        "2": {
+          "action": "Click on new project button.",
+          "expected_results": "Open create a new project page. \n"
+        },
+        "3": {
+          "action": "Enter a project name, select a release and click on create project.",
+          "expected_results": "Project Created. \n"
+        },
+        "4": {
+          "action": "Click on Layers.",
+          "expected_results": "Open compatible layers page. \n"
+        },
+        "5": {
+          "action": "Add a layer with multi-level dependencies. (ex: meta-acer) \nThis layer depends on meta-networking, which in turn depends on meta-android. \n \n",
+          "expected_results": "The selected layer and dependencies were added to project. \n"
+        },
+        "6": {
+          "action": "Check if meta-python appears in the dependencies list, and add the layers to project.",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "Delete a dependency layer.",
+          "expected_results": "Layer removed from project. \n \n"
+        },
+        "8": {
+          "action": "Build a recipe (ex: core-image-minimal) and wait until build finish.\n",
+          "expected_results": "Build will fail with an error.\n\n\t"
+        }
+      },
+      "summary": "Test_dependencies_layers"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Test_build_recipe_button_from_recipes_page",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start Toaster.",
+          "expected_results": "Toaster starts. \n"
+        },
+        "2": {
+          "action": "Click on new project button.",
+          "expected_results": "Open create a new project page. \n"
+        },
+        "3": {
+          "action": "Enter a project name, select a release and click on create project.",
+          "expected_results": "Project Created. \n"
+        },
+        "4": {
+          "action": "Click on software recipes / image recipes.",
+          "expected_results": "Open compatible software recipes page. \n"
+        },
+        "5": {
+          "action": "Select a recipe and click on 'add layer' button.",
+          "expected_results": "Layer added to project and the 'add layer' button becomes 'build recipe'. \n"
+        },
+        "6": {
+          "action": "Click on \"Build recipe\" button for one recipe (ex : core-image-minimal / busybox).",
+          "expected_results": "Build finishes successfully."
+        },
+        "7": {
+          "action": "Test this for software and image recipes tables.",
+          "expected_results": ""
+        }
+      },
+      "summary": "Test_build_recipe_button_from_recipes_page"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Test_compatible_machines",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start Toaster.",
+          "expected_results": "Toaster starts. \n"
+        },
+        "2": {
+          "action": "Click on new project button.",
+          "expected_results": "Open create a new project page. \n"
+        },
+        "3": {
+          "action": "Enter a project name, select a master release and click on create project.",
+          "expected_results": "Project Created. \n"
+        },
+        "4": {
+          "action": "Go to machines page.",
+          "expected_results": "Open compatible machines page. \n"
+        },
+        "5": {
+          "action": "Choose a machine and click on add layer for it. (intel-core2-32)",
+          "expected_results": "Layers added to project and add layer button becomes select machine. \n"
+        },
+        "6": {
+          "action": "Click on select machine.",
+          "expected_results": "Machine has changed. \n"
+        },
+        "7": {
+          "action": "Go to layer page that generate the machine. (meta-intel)",
+          "expected_results": "Open layer page \n"
+        },
+        "8": {
+          "action": "Build a recipe generated by that layer.",
+          "expected_results": "Build finishes successfully."
+        }
+      },
+      "summary": "Test_compatible_machines"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Builds_with_different_machines",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start Toaster.",
+          "expected_results": "Toaster starts. \n"
+        },
+        "2": {
+          "action": "Click on new project button.",
+          "expected_results": "Open create a new project page. \n"
+        },
+        "3": {
+          "action": "Enter a project name, select a master release and click on create project.",
+          "expected_results": "Project Created. \n"
+        },
+        "4": {
+          "action": "Select a machine (ex: qemux86-64)",
+          "expected_results": "The machine has changed. \n"
+        },
+        "5": {
+          "action": "Build a recipe (ex: core-image-minimal) and wait until buid finish.",
+          "expected_results": "Build finishes successfully. \n"
+        },
+        "6": {
+          "action": "Go to project page and change the machine (ex: qemumips)",
+          "expected_results": "The machine has changed. \n"
+        },
+        "7": {
+          "action": "Build a recipe (ex: core-image-sato) and wait until build finish.",
+          "expected_results": "Build finishes successfully. \n\nYou can build recipes with different machines."
+        },
+        "8": {
+          "action": "Check on build summary page that the machine match the machine selected.",
+          "expected_results": ""
+        }
+      },
+      "summary": "Builds_with_different_machines"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Test_bitbake_variables_-_IMAGE_FSTYPES",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start Toaster.",
+          "expected_results": "Toaster starts. \n"
+        },
+        "2": {
+          "action": "Click on new project button.",
+          "expected_results": "Open create a new project page. \n"
+        },
+        "3": {
+          "action": "Enter a project name, select release and click on create project.",
+          "expected_results": "Project Created. \n"
+        },
+        "4": {
+          "action": "Go to Configuration --> BitBake variables",
+          "expected_results": "Open Bitbake variables page. \n"
+        },
+        "5": {
+          "action": "Change IMAGE_FSTYPES variable, add some image types like: hddimg, ext4, etc.",
+          "expected_results": "Image types were added. \n"
+        },
+        "6": {
+          "action": "Build a recipe (ex: core-image-minimal) and wait until build finish.",
+          "expected_results": "Build finishes successfully. \n"
+        },
+        "7": {
+          "action": "Verify in the build summary page if the image types selected were built.",
+          "expected_results": "All the image types selected appears in the build summary page."
+        }
+      },
+      "summary": "Test_bitbake_variables_-_IMAGE_FSTYPES"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Software_recipes:_default_view",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": " Access a project page, either by creating a new project or accessing an existing project from the \"All builds\" table. \n\n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": " If no images exist in the project, build an image by inserting \"core-image-minimal\" in the \"Recipes\" field and press the \"Build\" button. Wait for the image to finish building. \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "On the project page click on the \"Software Recipes\" link situated in the left-handed side of the page, under the \"Project configuration\" menus, in the \"COMPATIBLE METADATA\" table. \n\n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Check that \"Compatible software recipes\" table is populated. \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Check that the following columns are shown by default: \n\n\t\tSoftware recipe \n\t\tDescription \n \n\t\tLayer \n\t\tBuild \n\t\t     Version ",
+          "expected_results": ""
+        }
+      },
+      "summary": "Software_recipes:_default_view"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Software_recipes:_sorting_the_content_of_the_software_recipes_table",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Access a project page, either by creating a new project or accessing an existing project from the \"All builds\" table. \n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Navigate to the \"Software Recipes\" page. \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Make sure the table is sorted on the \"Software Recipe\" column by default in ascending order. \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Activate all columns from the \"Edit column\" drop-down menu. Check that \"Build\" and \"Software Recipe\" columns cannot be unchecked. \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Check that \"Software Recipe\", \"Section\", \"License\", \"Layer\" are the only sortable table heads. \n\n",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "Sort the table by \"Layer\" and then navigate away by selecting a layer(such as meta-yocto). When you click \"back\" button in web-browser to go back to the \"Compatible image recipes\" table it should still be sorted by \"Layer\". \n\n",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "Sorting and \"Edit columns\" \nIf you use the \"Edit columns\" menu to hide the column with the applied sorting, we revert the sorting to the default sorting (i.e. \"Recipe\"). The default sorting always uses one of the core columns, which cannot be hidden using the \"Edit columns\" menu. \n\n",
+          "expected_results": ""
+        },
+        "8": {
+          "action": "Sorting and search \nSearching should have no impact on the applied sorting. Any results returned should be sorted by the sorting criteria selected when the search query was submitted. \nSort recipes by \"Layer\" column heading. Input a string (such as \"meta\") in search box and click search button. Make sure results returned are sorted by \"Layer\".",
+          "expected_results": ""
+        }
+      },
+      "summary": "Software_recipes:_sorting_the_content_of_the_software_recipes_table"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Software_recipes:_Searching_the_content_of_the_software_recipes_table",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Access a project page, either by creating a new project or accessing an existing project from the \"All builds\" table. \n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Navigate to the \"Software Recipes\" page. \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Check that the search is made of a text input field and a \"Search\" button in a toolbar above the table. \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "When no search query has been entered, we have placeholder text saying: \"Search compatible software recipes\". \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Input \"core\" in the text input field. The placeholder text disappears when the first character is typed. Click search button. \n\n",
+          "expected_results": ""
+        },
+        "6": {
+          "action": " \n(1) returned results \nThe search string is kept in the text input field. The results returned occur. Click  \"Clear search\" icon to clear the search and display the compatible recipes. \n(2) no results returned \nIf your search query returns no results, the page heading changes to \"No recipes found\", and we show you an alert with a search form and an option to show all targets. Check that \"show compatible recipes\" button is available. \n\n",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "When I run a search, the search happens against the following columns (independently of they being shown or hidden):\n- Software Recipe\n- Recipe version\n- Description\n- Recipe file\n- Section\n- License\n- Layer\n- Revision\nInput a string to search for the above column headings separately to make sure that the search happens against the columns. \n",
+          "expected_results": ""
+        },
+        "8": {
+          "action": "Search, sorting and \"Edit columns\" \nSearching does not change the state of the table: the same columns remain hidden and the same sorting applied when search results are displayed, but filters are cleared by the search results.\nSearch a string and make sure that the same columns remain hidden and the same sorting applied. \n\n",
+          "expected_results": ""
+        },
+        "9": {
+          "action": "Search and filters \nThe scope of the filters is the content currently on the table (this means all table pages, not only the one displayed). The scope of the search is always the content of the database. \n\nIf I run a search query, any filter applied afterwards will filter the content returned by the search query. \n\nIf I run a search query while a filter is applied, the filter is cleared by the results of the search query (i.e. we display the results of the search query and clear the filter applied beforehand). The same happens if I click the \"Clear search\" icon when a filter is applied to a set of search results (both search results and applied filter are cleared, and the table shows all the targets). ",
+          "expected_results": ""
+        }
+      },
+      "summary": "Software_recipes:_Searching_the_content_of_the_software_recipes_table"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Software_recipes:_Filter_the_contents_of_the_software_recipes_table",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Access a project page, either by creating a new project or accessing an existing project from the \"All builds\" table.",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Navigate to the \"Software Recipes\" page.",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Make sure the following table column has filters: \n- Build",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Filters are mutually exclusive. Click a filter button of a one column and a filter dialogue occurs. Select a filter item. The filter result would be showed. Then select another filter item of another column and the previously applied filter is overridden by the newly selected filter when a filter from a different column is applied to the table. In this state, we show some help text next to the \"Apply\" button, saying \"You can only apply one filter to the table. This filter will override the current filter.\"",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Filters are overridden by search. Run a search query and you can see previous filter results are overridden by the results of the search query.",
+          "expected_results": ""
+        }
+      },
+      "summary": "Software_recipes:_Filter_the_contents_of_the_software_recipes_table"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Test_the_packages_included_in_the_image",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start Toaster.",
+          "expected_results": "Toaster starts. \n"
+        },
+        "2": {
+          "action": " Click on new project button.",
+          "expected_results": " Open create a new project page. \n"
+        },
+        "3": {
+          "action": " Enter a project name, select a release and click on create project.",
+          "expected_results": " Project Created. \n"
+        },
+        "4": {
+          "action": " Build a recipe (ex: core-image-minimal) and wait until build finish.",
+          "expected_results": " Build finishes successfully. \n"
+        },
+        "5": {
+          "action": " Click on the built recipe.",
+          "expected_results": " Open build summary page. \n"
+        },
+        "6": {
+          "action": " Under IMAGES tab click on the recipe built.",
+          "expected_results": "Image page open. \n"
+        },
+        "7": {
+          "action": "Click on a package name.",
+          "expected_results": "Open the package page. \n"
+        },
+        "8": {
+          "action": "Under file title click on the link to file.",
+          "expected_results": "You are redirected to directory structure and you can see where the file is located."
+        }
+      },
+      "summary": "Test_the_packages_included_in_the_image"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Test_the_filters_from_a_image_page",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": " Start Toaster.",
+          "expected_results": "Toaster starts. \n"
+        },
+        "2": {
+          "action": " Click on new project button.",
+          "expected_results": " Open create a new project page. \n"
+        },
+        "3": {
+          "action": " Enter a project name, select a release and click on create project.",
+          "expected_results": " Project Created. \n"
+        },
+        "4": {
+          "action": " Build a recipe (ex: core-image-minimal) and wait until build finish.",
+          "expected_results": " Build finishes successfully. \n"
+        },
+        "5": {
+          "action": " Click on the built recipe.",
+          "expected_results": " Open build summary page. \n"
+        },
+        "6": {
+          "action": "Click on Configuration - Bitbake Variables.",
+          "expected_results": "Open bitbake variables page. \n"
+        },
+        "7": {
+          "action": "Test Description filter. ",
+          "expected_results": "Filter works ok. (filter returns only items that match the selected criteria) "
+        }
+      },
+      "summary": "Test_the_filters_from_a_image_page"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Test_dependencies_link",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": " Start Toaster.",
+          "expected_results": "Toaster starts. \n"
+        },
+        "2": {
+          "action": " Click on new project button.",
+          "expected_results": " Open create a new project page. \n"
+        },
+        "3": {
+          "action": " Enter a project name, select a release and click on create project.",
+          "expected_results": " Project Created. \n"
+        },
+        "4": {
+          "action": " Build a recipe (ex: core-image-minimal) and wait until build finish.",
+          "expected_results": " Build finishes successfully. \n"
+        },
+        "5": {
+          "action": " Click on the built recipe.",
+          "expected_results": " Open build summary page. \n"
+        },
+        "6": {
+          "action": "Click on recipes tab.",
+          "expected_results": "Open recipes page. \n"
+        },
+        "7": {
+          "action": "Click on edit columns and select Dependencies.",
+          "expected_results": "Dependencies column is shown in the table. \n"
+        },
+        "8": {
+          "action": "Click on a number of dependencies.",
+          "expected_results": "A pop up with dependencies will appear. \n"
+        },
+        "9": {
+          "action": "Click on a dependency. ",
+          "expected_results": "Open recipe dependency page. "
+        }
+      },
+      "summary": "Test_dependencies_link"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Test_recipe_file_link",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start Toaster. \n\n\t",
+          "expected_results": "Toaster starts. \n\n\t"
+        },
+        "2": {
+          "action": " Click on new project button. \n\n\t",
+          "expected_results": " Open create a new project page. \n\n\t"
+        },
+        "3": {
+          "action": " Enter a project name, select a release (ex: master) and click on create project. \n\n\t",
+          "expected_results": " Project Created. \n\n\t"
+        },
+        "4": {
+          "action": "Click on Image recipes tab. \n\n\t",
+          "expected_results": "Open Compatible image recipes table. \n\n\t"
+        },
+        "5": {
+          "action": "Click on edit columns and select recipe file. \n\n\t",
+          "expected_results": "Recipe file column appears in the table. \n\n\t"
+        },
+        "6": {
+          "action": "Click on the blue button near a recipe file. \n\n\t",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "Repet steps - 4 to 6 for software recipes.",
+          "expected_results": ""
+        }
+      },
+      "summary": "Test_recipe_file_link"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.See_packages_size",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start Toaster. \n\n\t",
+          "expected_results": " Toaster starts. \n\n\t"
+        },
+        "2": {
+          "action": " Click on new project button. \n\n\t",
+          "expected_results": " Open create a new project page. \n\n\t"
+        },
+        "3": {
+          "action": " Enter a project name, select a release and click on create project. \n\n\t",
+          "expected_results": " Project Created. \n\n\t"
+        },
+        "4": {
+          "action": " Build a recipe (ex: core-image-minimal) and wait until build finish. \n\n\t",
+          "expected_results": " Build finishes successfully. \n\n\t"
+        },
+        "5": {
+          "action": " Click on the built recipe. \n\n\t",
+          "expected_results": " Open build summary page. \n\n\t"
+        },
+        "6": {
+          "action": "Click on packages tab. \n\n\t",
+          "expected_results": "Open packages page. \n\n\t"
+        },
+        "7": {
+          "action": "Click on size to sort the table. ",
+          "expected_results": "You can check the size of each package. \n\nWhen you click on 'Size' the first time, the correct sorting is the inverse one (biggest package on top). Clicking a second time will invert the sorting (you'll see packages with 0 B size on top)."
+        }
+      },
+      "summary": "See_packages_size"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Build_multiple_recipes",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": " Start Toaster. \n\n\t",
+          "expected_results": " Toaster starts. \n\n\t"
+        },
+        "2": {
+          "action": " Click on new project button. \n\n\t",
+          "expected_results": " Open create a new project page. \n\n\t"
+        },
+        "3": {
+          "action": " Enter a project name, select a release and click on create project. \n\n\t",
+          "expected_results": " Project Created. \n\n\t"
+        },
+        "4": {
+          "action": " Build a multiple recipes (ex: \"core-image-minimal core-image-sato\") and wait until build finish. ",
+          "expected_results": "Builds finishes successfully. \n\nYou can build multiple recipes with toaster"
+        }
+      },
+      "summary": "Build_multiple_recipes"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Build_a_recipe_with_different_distro",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": " Start Toaster. \n\n\t",
+          "expected_results": " Toaster starts. \n\n\t"
+        },
+        "2": {
+          "action": " Click on new project button. \n\n\t",
+          "expected_results": " Open create a new project page. \n\n\t"
+        },
+        "3": {
+          "action": " Enter a project name, select a release and click on create project. \n\n\t",
+          "expected_results": " Project Created. \n\n\t"
+        },
+        "4": {
+          "action": "From project page click on Bitbake variables tab. \n\n\t",
+          "expected_results": "Open Bitbake variables page. \n\n\t"
+        },
+        "5": {
+          "action": "Click on change button for distro. \n\n\t",
+          "expected_results": "A type in form appears. \n\n\t"
+        },
+        "6": {
+          "action": "Change distro (ex: poky-lsb). \n\n\t",
+          "expected_results": "Distro has changed. \n\n\t"
+        },
+        "7": {
+          "action": "Add specific layers for distro (meta-qt3, meta-qt4) \n\t\n\t",
+          "expected_results": "Layers added to the project \n\n\t"
+        },
+        "8": {
+          "action": " Build a recipe (ex: core-image-minimal) and wait until build finish.",
+          "expected_results": "Build finishes successfully. \n\nThe 'success' criteria for this one should be that the build is reported as using the poky-lsb distro in the build summary page, and that the DISTRO variable value in the bitbake variables table is set to the value specified in toaster (poky-lsb again)."
+        }
+      },
+      "summary": "Build_a_recipe_with_different_distro"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Test_package_format_-_ipk_rpm_deb",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": " Start Toaster. \n\n\t",
+          "expected_results": " Toaster starts. \n\n\t"
+        },
+        "2": {
+          "action": " Click on new project button. \n\n\t",
+          "expected_results": " Open create a new project page. \n\n\t"
+        },
+        "3": {
+          "action": " Enter a project name, select a release and click on create project. \n\n\t",
+          "expected_results": " Project Created. \n\n\t"
+        },
+        "4": {
+          "action": "From the project page click on bitbake variables tab. \n\n\t",
+          "expected_results": "Open bitbake variables page. \n\n\t"
+        },
+        "5": {
+          "action": "Click on change button near PACKAGE_CLASSES and select all the package formats (rpm, deb, ipk). \n\n\t",
+          "expected_results": "Package classes selected. \n\n\t"
+        },
+        "6": {
+          "action": "Build a recipe (ex: core-image-minimal) and wait until build finish.",
+          "expected_results": "Build finishes successfully.\nYou can see the package classes in the build summary page."
+        }
+      },
+      "summary": "Test_package_format_-_ipk_rpm_deb"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Test_IMAGE_INSTALL_append_variable",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start Toaster. \n\n",
+          "expected_results": " Toaster starts. \n\n\t"
+        },
+        "2": {
+          "action": " Click on new project button. \n\n",
+          "expected_results": " Open create a new project page. \n\n\t"
+        },
+        "3": {
+          "action": " Enter a project name, select a release and click on create project. \n\n",
+          "expected_results": " Project Created. \n\n\t"
+        },
+        "4": {
+          "action": "From the project page click on bitbake variables tab. \n\n",
+          "expected_results": "Open bitbake variables page. \n\n\t"
+        },
+        "5": {
+          "action": "Click on change button for IMAGE_INSTALL_append and add a variable (ex: acpid). \n\n",
+          "expected_results": "Variable added. \n\n\t"
+        },
+        "6": {
+          "action": "Build a recipe (ex: core-image-minimal) and wait until build finish. \n\n",
+          "expected_results": "Build finishes successfully. \n\n\t"
+        },
+        "7": {
+          "action": "After build finishes go to build page. \n\n",
+          "expected_results": "Open build summary page. \n\n\t"
+        },
+        "8": {
+          "action": "Go to package tab and search for acpid.",
+          "expected_results": "You should get results for ssh packages."
+        }
+      },
+      "summary": "Test_IMAGE_INSTALL_append_variable"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.New_custom_image:_default_view",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Access a project page, either by creating a new project or accessing an existing project from the \"All projects\" table.  \n\n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "On the project page click on the \"New custom image\" link situated on the left-hand side, near Configuration, builds, import layer \n\n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Check that the table is populated with the list of image recipes (eg. core-image minimal, core-image-lsb) \n\n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": " Check that by default the following columns are shown: Image recipe, Version, Description, Layer, Customise  \n\n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "From the \"Edit columns\" menu, activate the: Recipe file, Section, License, Git revision \n\n\n",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "Check that the \"Git revision\" entries match the release entry from the main project page, in the project details section. \n\n\n",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "Check that the image recipes provided by layers added to the project show a 'customise' button, while image recipes provided by layers not added to the project show an 'add layer' button ",
+          "expected_results": ""
+        }
+      },
+      "summary": "New_custom_image:_default_view"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.New_custom_image:_sorting_the_content_of_new_custom_image_table",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Access a project page, either by creating a new project or accessing an existing project from the \"All projects\" table. \n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "On the project page click on the \"New custom image\" link situated on the left-hand side, near Configuration, builds, import layer  \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Make sure that the table is sorted on the ‘Image recipe’ column by default in ascending order.  \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Clicking on Image recipe should revert the sorting. (from 'a to z' changes to 'z to a')  \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "From the \"Edit columns\" menu activate all the columns. Check that ‘Image recipe’ and ‘Customise’ columns cannot be unchecked. \n\n",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "Check that Image recipe, Section, Layer and License are the only sortable table heads.  \n\n",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "Sort the table by \"Layer\" and then navigate away by selecting an image (such as core-image-lsb). When you click the \"back\" button in the web-browser to go back, the \"New custom image\" table should still be sorted by \"Layer\".  \nThis should apply also by navigating back to the page by any other means. \n\n",
+          "expected_results": ""
+        },
+        "8": {
+          "action": "Sorting and \"Edit columns\" menu: If you use the \"Edit columns\" menu to hide the column with the applied sorting, we revert the sorting to the default sorting (i.e. \"Image recipe\"). The default sorting always uses one of the core columns, which cannot be hidden using the \"Edit columns\" menu  \n\n",
+          "expected_results": ""
+        },
+        "9": {
+          "action": "Sorting and search: Searching should have no impact on the applied sorting. Any results returned should be sorted by the sorting criteria selected when the search query was submitted. Sort recipes by \"Layer\" column heading. Input a string (such as \"core-image\") in search box and click search button. Make sure results returned are sorted by \"Layer\".",
+          "expected_results": "N/A"
+        }
+      },
+      "summary": "New_custom_image:_sorting_the_content_of_new_custom_image_table"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.New_custom_image:_searching_the_content_of_new_custom_image_table",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Access a project page, either by creating a new project or accessing an existing project from the \"All projects\" table. \n \n\n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "On the project page click on the \"New custom image\" link situated on the left-hand side, near Configuration, builds, import layer  \n \n\n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Check that the search is made of a text input field and a \"Search\" button in a toolbar above the table. When no search query has been entered, the text input field should show the following placeholder text: \"Search select the image recipe you want to customise\" \n  \n\n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Input \"core\" in the text input field. The placeholder text disappears when the first character is typed. Click search button. \n \n\n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "The search string is kept in the text input field. The results returned occur. Click \"Clear search\" icon to clear the search and display the image recipes.  If your search query returns no results, we show you an alert with a search form and an option to show all image recipes. Check that \"show all\" link is available.  \n\n\n",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "Search, sorting and \"Edit columns\": Searching does not change the state of the table: the same columns remain hidden and the same sorting applied when search results are displayed, but filters are cleared by the search results. Search a string and make sure that the same columns remain hidden and the same sorting applied.  \n\n\n",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "Search and filters \n \n\t•\tThe scope of the filters is the content currently on the table (this means all table pages, not only the one displayed). The scope of the search is always the content of the database.  \n\n\n",
+          "expected_results": ""
+        },
+        "8": {
+          "action": "If I run a search query, any filter applied afterwards will filter the content returned by the search query. \tIf I run a search query while a filter is applied, the filter is cleared by the results of the search query (i.e. we display the results of the search query and clear the filter applied beforehand). The same happens if I click the \"Clear search\" icon when a filter is applied to a set of search results (both search results and applied filter are cleared, and the table shows all the targets). ",
+          "expected_results": "\n  \n"
+        }
+      },
+      "summary": "New_custom_image:_searching_the_content_of_new_custom_image_table"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.New_custom_image:_Filter_the_contents_of_the_new_custom_image_table",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Access a project page, either by creating a new project or accessing an existing project from the \"All projects\" table. \n\n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "On the project page click on the \"New custom image\" link situated on the left-hand side, near Configuration, builds, import layer  \n\n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Make sure the following table column has filters: Customise  \n\n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Click the filter button in the \"Customise\" column and a filter dialogue comes up. Select a filter option. The filter results should be showed. \n\n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Filters are overridden by search. Run a search query and you can see previous filter results are overridden by the results of the search query.",
+          "expected_results": "N/A"
+        }
+      },
+      "summary": "New_custom_image:_Filter_the_contents_of_the_new_custom_image_table"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Create_new_custom_image",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Access a project page, either by creating a new project or accessing an existing project from the \"All projects\" table. \n \n\n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "On the project page click on the \"New custom image\" link situated on the left-hand side, near Configuration, builds, import layer \n\n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Search for rpi-basic-image, click on 'add layer' button. Make sure a \"layer added\" notification shows and a \"customise\" button is displayed. Click the \"customise\" button, type a name for you new custom image and click on create custom image. \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Verify that image was created: when you create the custom image you will be redirected to the custom image details page, and a notification at the top of the page should tell you: ‘Your custom image X has been created. You can now add or remove packages as needed. \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "If you select an image that has not been built beforehand you should not see the 'add / remove' packages table until you build the image. \n\n",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "If you select an image that has been built beforehand you should see the 'add / remove' packages table when you create the custom image. ",
+          "expected_results": "N/A"
+        }
+      },
+      "summary": "Create_new_custom_image"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Custom_image_page_details",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "After you create a new custom image  go to the custom image page, by clicking on the custom image.   \n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Breadcrumbs  \n \n\t * Observe that the 3 breadcrumbs at the top left are:  \n \n\t\ta live link that will take you back to the project page \n\t\tCustom images: a live link that will take you back to the custom images table \n\t\timage name(toaster-custom-images): the name of the current custom image (not a link)  \n \n\n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Observe the 2 buttons build Custom image and Download recipe file  \n \n\ti.\tTest this 2 buttons \n\tii.\tYou should always be able to build the custom image, but you only should be able to download the recipe file when the package content of the custom image is known. When you cannot download the recipe file, the 'download' button at the top of the page is disabled, and the right hand column does not show information about the recipe file.  \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Observe that there is a right-hand box, with information about the images  \n \n\ti.\tThere is a number of packages included in the custom image \n\tii.\tApprox package size \n \n\tiii.\tLayer \n \n\tiv.\tImage based on \n \n\tv.\tRecipe file (only when you can download it_ \n\tvi.\tVersion \n \n\tvii.\tLicense  \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Observe that the page includes a table with packages and you can add or remove packages from the custom image. The packages table only appears when: \n\na) the image recipe you chose as your base image when creating the custom image has been built within the project \n\nb) the custom image itself has been built \n\nIf no packages table shows, you see a notification with a build button instead. ",
+          "expected_results": "N/A"
+        }
+      },
+      "summary": "Custom_image_page_details"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Custom_image_page_–_Add_|_Remove_packages_table",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "After you create a new custom image  go to the custom image page, by clicking on the custom image.  \n\n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Make sure that the table is sorted on the ‘Package’ column by default in ascending order.   \n\n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Check that by default the following columns are shown: Package, Package Version, Approx Size  \n\n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "From the \"Edit columns\" menu, activate the: License, Recipe, Recipe version and Reverse dependencies columns  \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Check that ‘Package’, Approx Size, License, Recipe are the only sortable table heads.   \n\n",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "Sorting and \"Edit columns\": If you use the \"Edit columns\" menu to hide the column with the applied sorting, we revert the sorting to the default sorting (i.e. \"Package\"). The default sorting always uses one of the core columns, which cannot be hidden using the \"Edit columns\" menu   \n\n",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "Sorting and search: Searching should have no impact on the applied sorting. Any results returned should be sorted by the sorting criteria selected when the search query was submitted. Sort recipes by \"Recipe\" column heading. Input a string (such as \"acl\") in search box and click search button. Make sure results returned are still sorted by \"Recipe\".   \n\n",
+          "expected_results": ""
+        },
+        "8": {
+          "action": "Click \"Clear search\" icon to clear the search and display the Packages.   \n\n",
+          "expected_results": ""
+        },
+        "9": {
+          "action": "Make sure the following table column has filters: Add | Remove (Click on 'Edit custom image' in the left pane of the custom image)  \n\n1",
+          "expected_results": ""
+        },
+        "10": {
+          "action": "Click the filter button: a filter dialogue displays. Select a filter option. The filter results should be showed.  \n\n1",
+          "expected_results": ""
+        },
+        "11": {
+          "action": "Filters are overridden by search. Run a search query and you can see previous filter results are overridden by the results of the search query.  \n\n1",
+          "expected_results": ""
+        },
+        "12": {
+          "action": "This page needs a special no results message for the search. You can see in the doc attached to\nhttps://bugzilla.yoctoproject.org/show_bug.cgi?id=9154   \n\nTo test it, enter a random string in the search input field (something like \"bbb\") and click the 'search' button. The special no results message includes the following:  \n\na) instructions about searching and building recipes in order to generate new packages  \n\nb) a search text input field with the search string you typed, a 'clear' icon and a search button. Click the 'clear' icon: the search field should be cleared and the full list of packages should be shown.  \n\nc) a 'show all packages' link. Click the link: the search field should be cleared and the full list of packages should be shown.  ",
+          "expected_results": "N/A"
+        }
+      },
+      "summary": "Custom_image_page_–_Add_|_Remove_packages_table"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Adding_packages_without_dependencies_from_custom_images",
+      "author": [
+        {
+          "email": "libertad.gonzalez.de.la.cruz@intel.com",
+          "name": "libertad.gonzalez.de.la.cruz@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Access a project page, either by creating a new project or accessing an existing project from the \"All projects\" table. \n\n    ",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "On the project page click on the \"New custom image\" link situated on the left-hand side, near Configuration, builds, import layer  \n\n\n    ",
+          "expected_results": " "
+        },
+        "3": {
+          "action": "Choose an image recipe example:(core-image-sato) and click on the customise button on the far right (note if that layer is not added the button will say +Add layer, add it and then customise) \n\n\n    ",
+          "expected_results": " A pop out should appear and you should get to give the new image a customized name. Then you will be redirected to a page of Add|Remove Packages. If this image has not been build it will not have packages.\n\n"
+        },
+        "4": {
+          "action": "Build the new image if it has not been build, else start adding packages without dependencies example: attr-doc \n\n    \n    ",
+          "expected_results": "You should get a message in blue that says \"You have added 1 package to $image-custom-name: $package-name\" "
+        },
+        "5": {
+          "action": "Build the image again.\n",
+          "expected_results": "Expected Result on step 5: the packages you have added should be installed in the image."
+        }
+      },
+      "summary": "Adding_packages_without_dependencies_from_custom_images"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Removing_packages_without_and_with_dependencies__from_custom_images",
+      "author": [
+        {
+          "email": "libertad.gonzalez.de.la.cruz@intel.com",
+          "name": "libertad.gonzalez.de.la.cruz@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Access a project page, either by creating a new project or accessing an existing project from the \"All projects\" table. \n\n    ",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "On the project page click on the \"New custom image\" link situated on the left-hand side, near Configuration, builds, import layer  \n\n\n\n    ",
+          "expected_results": " A pop out should appear and you should get to give the new image a customized name. Then you will be redirected to a page of Add|Remove Packages. If this image has not been build it will not have packages. \n\n"
+        },
+        "3": {
+          "action": "Choose an image recipe example:(core-image-sato) and click on the customise button on the far right (note if that layer is not added the button will say +Add layer, add it and then customise) \n\n\n\n    ",
+          "expected_results": "A pop out should appear and you should get to give the new image a customized name. Then you will be redirected to a page of Add|Remove Packages. If this image has not been build it will not have packages.\n\n"
+        },
+        "4": {
+          "action": "Build the new image if it has not been build else start removing a packages (click on 'Edit custom image' in the left pane of the custom image) that have dependencies and packages that have no dependencies that are already included by clicking on the red button \"Remove Package\" \n\n\n    \n    ",
+          "expected_results": "You should get a message in blue that says \"You have removed 1 package to $image-custom-name: $package-name\" "
+        },
+        "5": {
+          "action": "Build the image again.",
+          "expected_results": "the packages you have removed should not be installed in the image."
+        }
+      },
+      "summary": "Removing_packages_without_and_with_dependencies__from_custom_images"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Adding_packages_with_dependencies",
+      "author": [
+        {
+          "email": "libertad.gonzalez.de.la.cruz@intel.com",
+          "name": "libertad.gonzalez.de.la.cruz@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Access a project page, either by creating a new project or accessing an existing project from the \"All projects\" table. \n\n    ",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "On the project page click on the \"New custom image\" link situated on the left-hand side, near Configuration, builds, import layer  \n\n\n    ",
+          "expected_results": " "
+        },
+        "3": {
+          "action": "Choose an image recipe example:(core-image-sato) and click on the customise button on the far right (note if that layer is not added the button will say +Add layer, add it and then customise) \n\n\n    ",
+          "expected_results": "A pop out should appear and you should get to give the new image a customized name. Then you will be redirected to a page of Add|Remove Packages. If this image has not been build it will not have packages."
+        },
+        "4": {
+          "action": "Build the new image if it has not been build else start adding packages that have dependencies ( you will be able to see in the dependencies column a little square with a number, that tells you the dependencies it holds) example: libattr this holds 2 dependencies( bash and glibc) ",
+          "expected_results": " You should get a pop-out that that say \"$package_name dependencies\" then it should list the dependencies. Once clicked on the add packages button it should add the packages listed in the pop-out."
+        },
+        "5": {
+          "action": "Build the image again.",
+          "expected_results": ""
+        }
+      },
+      "summary": "Adding_packages_with_dependencies"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Create_Project",
+      "author": [
+        {
+          "email": "libertad.gonzalez.de.la.cruz@intel.com",
+          "name": "libertad.gonzalez.de.la.cruz@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start toaster",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Create a toaster project by issuing a name and selecting a release version.",
+          "expected_results": "Once project is created it should redirect you to a new project configuration page"
+        },
+        "3": {
+          "action": "Check that the h1 page title is set to the name the user typed in the new project form. ",
+          "expected_results": ""
+        }
+      },
+      "summary": "Create_Project"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Verify_project_detail_page_left_bar_menu",
+      "author": [
+        {
+          "email": "libertad.gonzalez.de.la.cruz@intel.com",
+          "name": "libertad.gonzalez.de.la.cruz@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start toaster",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Create a toaster project \n    \n",
+          "expected_results": "Once project is created it should redirect you to a new project configuration page. \n\n"
+        },
+        "3": {
+          "action": "Check the page contains the tabs \n    Configuration ---> selected by default \n    Compatible Metadata (separation label) \n    Custom images \n    Image recipes \n    Software recipes \n    Machines \n    Layers \n    Extra Configuration (separation label) \n    BitBake variables \n\n",
+          "expected_results": " All elements are present. \n\n"
+        },
+        "4": {
+          "action": "Click on each element to see if the h2 title is changing to the respective link clicked. Example if clicked on \"Custom Images\" then the h2 title should change to \"Custom images\"",
+          "expected_results": "All elements are clickable and h2 title changes to the corresponding title.."
+        }
+      },
+      "summary": "Verify_project_detail_page_left_bar_menu"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Configuration_information_of_Project_Detail_page",
+      "author": [
+        {
+          "email": "libertad.gonzalez.de.la.cruz@intel.com",
+          "name": "libertad.gonzalez.de.la.cruz@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Clone Poky and start toaster \n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Create a master toaster project \n    \n",
+          "expected_results": "Once project is created it should redirect you to a new project configuration page \n\n"
+        },
+        "3": {
+          "action": "Check that the configuration button on the left side bar is selected by default \n\n",
+          "expected_results": " Expected result step 3 & 4: The configuration link next to the build link should be selected see attachment.  \n\n\n\n"
+        },
+        "4": {
+          "action": "The configuration details should include canvas: \n    Machine \n    Most built recipes \n    Layers \n    Project Release ",
+          "expected_results": "Expected result step 4: A machine must always be set. \n\nThe default layers specified in the Toaster configuration must always be listed in the layer section (in our case, for the poky configuration we should have openembedded-core, meta-poky and meta-yocto-bsp)"
+        }
+      },
+      "summary": "Configuration_information_of_Project_Detail_page"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Verify_Machine_information_of_project_detail_page",
+      "author": [
+        {
+          "email": "libertad.gonzalez.de.la.cruz@intel.com",
+          "name": "libertad.gonzalez.de.la.cruz@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start toaster",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Create a toaster project \n    \n",
+          "expected_results": "Expected result step 2: Once project is created it should redirect you to a new project Configuration page \n\n"
+        },
+        "3": {
+          "action": "The configuration details should include a label in bold font that says: \n    Machine: this canvas should have the machine label type under it and an editing button on the side ",
+          "expected_results": "Expected result step 3: Compare to the attached snapshot. The machine must always be set."
+        }
+      },
+      "summary": "Verify_Machine_information_of_project_detail_page"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Verify_most_built_recipes_information_of_the_project_detail_page",
+      "author": [
+        {
+          "email": "libertad.gonzalez.de.la.cruz@intel.com",
+          "name": "libertad.gonzalez.de.la.cruz@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start toaster ",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Create a toaster project \n    \n",
+          "expected_results": "Expected result step 2: Once project is created it should redirect you to a new project configuration page "
+        },
+        "3": {
+          "action": "The configuration details should include a label in bold font that says: \n    Most built recipes: In this canvas one of the following information should show:  \n\n            a) If there has been no built recipes it should have a label that says: \n                             \"You haven't built any recipes yet, choose a recipe to build\"  \n\n            b) Else it should have a list of built recipes and a check box in front of it. So that it could be selected and built again ",
+          "expected_results": "Expected result step a: See ProjectDetailPage2.png attachment.\n\nExpected result step b: See ProjectDetailPage.png attachment."
+        }
+      },
+      "summary": "Verify_most_built_recipes_information_of_the_project_detail_page"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Verify_project_release_information_on_project_detail_page",
+      "author": [
+        {
+          "email": "libertad.gonzalez.de.la.cruz@intel.com",
+          "name": "libertad.gonzalez.de.la.cruz@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start toaster",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Create a toaster project \n    \n",
+          "expected_results": "Expected result step 2: Once project is created it should redirect you to a new project configuration page. "
+        },
+        "3": {
+          "action": "The configuration details should include a label in bold font that says: \n         Project release: this canvas should also have a label that show the release project you chose at the beginning.",
+          "expected_results": "Expected result step 3: See attachment ProjectDetailPage.jnp."
+        }
+      },
+      "summary": "Verify_project_release_information_on_project_detail_page"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Verify_layer_information_of_the_project_detail_page",
+      "author": [
+        {
+          "email": "libertad.gonzalez.de.la.cruz@intel.com",
+          "name": "libertad.gonzalez.de.la.cruz@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Clone the poky environment     git clone http://git.yoctoproject.org/git/poky",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Start toaster",
+          "expected_results": "Expected result step 2: Once project is created it should redirect you to a new project configuration page. \n\n"
+        },
+        "3": {
+          "action": "Create a toaster project \n    \n",
+          "expected_results": "Expected result step 3: See attachment of layerCanvas.png\n"
+        },
+        "4": {
+          "action": "The configuration details should include a label with bold font that says: \n       Layer:  this canvas should have 3 layers listed by default (openembedded-core, meta-poky, and meta-yocto-bsp).  \n       Each layer should have a trashcan icon at the side that can be used to erase the label from the project. \n        The layer canvas should have a text box with the text \"type a layer name\" a button \"Add layer\" next to it. \n        just underneath a \"view compatible layer | import layer\" link. ",
+          "expected_results": ""
+        }
+      },
+      "summary": "Verify_layer_information_of_the_project_detail_page"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Verify_project_detail_links",
+      "author": [
+        {
+          "email": "libertad.gonzalez.de.la.cruz@intel.com",
+          "name": "libertad.gonzalez.de.la.cruz@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start toaster ",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Create a toaster project \n\n",
+          "expected_results": "Expected result step 2: Once project is created it should redirect you to a new project configuration page.  \n\n"
+        },
+        "3": {
+          "action": "The configuration details should include \n    4 links, starting in the upper left side the Configuration link, Builds(#) link, Import layer link, and the New custom image link. \n\n    ",
+          "expected_results": "Expected result step 3: All links should be clickable and should have information or tables, or forms. see attachment projectDetailLinks.png"
+        }
+      },
+      "summary": "Verify_project_detail_links"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Verify_build_texbox_exists_and_works",
+      "author": [
+        {
+          "email": "libertad.gonzalez.de.la.cruz@intel.com",
+          "name": "libertad.gonzalez.de.la.cruz@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start toaster",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Create a toaster project \n    \n",
+          "expected_results": " Once project is created it should redirect you to a new project configuration page.  \n\n\n"
+        },
+        "3": {
+          "action": "The configuration details should include \n    After the 4 links (Configuration, Build(#), Import layer & New custom image)  at the far right there should be a textbox with the label that says....\"Type the recipe you want to build\"  and a button \"Build\" \n\n",
+          "expected_results": "See attachment buildTXT.png, The build button should be disabled whenever the text input field is empty, so that you cannot start a build with a blank target  \n\n"
+        },
+        "4": {
+          "action": "Type in the textbox an image you would like to build example (core-image-minimal) and click the build button.\n\n",
+          "expected_results": " Image starts building. Whenever there is information in the image recipes and software recipes tables, the text input field should present suggestions from the list of recipes provided by the layers in the \"layers\" list. The suggestions contain the string typed in the input field, and update as you type. They appear on typing the second character. A maximum of 8 suggestions can be shown. They are sorted as follows: first recipes starting with the string, in alphabetical order; then recipes containing the string, also in alphabetical order  \n\n\nWhen you click the build button you are brought to the \"Builds\" tab, and a new build in progress appears at the top of the \"Latest project builds\" section"
+        }
+      },
+      "summary": "Verify_build_texbox_exists_and_works."
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Veryfing_the_builds_link_show_proper_information",
+      "author": [
+        {
+          "email": "libertad.gonzalez.de.la.cruz@intel.com",
+          "name": "libertad.gonzalez.de.la.cruz@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start toaster",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Create a toaster project \n \n",
+          "expected_results": " Once project is created it should redirect you to a new project configuration page. \n\n\n"
+        },
+        "3": {
+          "action": "The configuration details should include \n    A builds tab that when clicking on, it should display one of the following: \n       \n\n        a) A label that says \"Latest project builds\"  then a label with \"All project builds\" \n                   If you have a finished build or there is an ongoing builds then: \n                           You should see a progress bar of the ongoing builds in the project. \n                            You should see a table with the already done builds in the project. \n\n\n        b) \"All project builds\" and a search textbox with a button nothing else only if there are no builds done in the project \n        ",
+          "expected_results": "Expected result for step a):  See ExistingBuilds.png attachment. \n\n\nExpected result for step b): See ZeroBuilds.png attachment. "
+        }
+      },
+      "summary": "Veryfing_the_builds_link_show_proper_information"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Verify_that_the_Import_layer_link_shows_the_form",
+      "author": [
+        {
+          "email": "libertad.gonzalez.de.la.cruz@intel.com",
+          "name": "libertad.gonzalez.de.la.cruz@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start toaster",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Create a toaster project \n\n",
+          "expected_results": "  Once project is created it should redirect you to a new project configuration page. \n\n\n"
+        },
+        "3": {
+          "action": "The configuration details should include \n    An Import layer link  that when clicking on, it should display: \n          A label that says \"Layer repository information\" \n          A label that says \"The layer you are importing must be compatible with Yocto Project master, which is the release you are using in this project.\" \n        Form composed of the following elements: \n            Layer name : textbox \n            Git repository URL : textbox \n            Repository subdirectory (optional) : textbox \n            Git revision : textbox \n            Layer dependencies (optional) : \"openembedded-core\" link and (trash icon), textbox and \"Add layer\" button \n            Import and add to project : button",
+          "expected_results": " See attachment ImportLayerForm.png"
+        }
+      },
+      "summary": "Verify_that_the_Import_layer_link_shows_the_form"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Verify_that_New_Custom_Image_link_works_and_shows_information",
+      "author": [
+        {
+          "email": "libertad.gonzalez.de.la.cruz@intel.com",
+          "name": "libertad.gonzalez.de.la.cruz@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start toaster",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Create a toaster project \n\n",
+          "expected_results": " Once project is created it should redirect you to a new project configuration page \n\n\n"
+        },
+        "3": {
+          "action": "The configuration details should include  \n    A \"New custom image\" tab that when clicking on, it should display: \n        a Title label that says: \"Select the image recipe you want to customise(#number_or_recipes_available)\" \n        A search textbox with the label of: \"Search and select the image recipe you want to customise\" \n        A \"Search button\" \n        A \"Edit columns\" button \n        A table that will display the customise images available ",
+          "expected_results": "See attachment CustomImage.png"
+        }
+      },
+      "summary": "Verify_that_New_Custom_Image_link_works_and_shows_information"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Verify_most_built_recipe_shows_a_maximum_of_5_recipes",
+      "author": [
+        {
+          "email": "libertad.gonzalez.de.la.cruz@intel.com",
+          "name": "libertad.gonzalez.de.la.cruz@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start toaster",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Create a toaster project",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Build 6 recipes example (core-image-sato, core-image-minimal, core-image-base, core-image-lsb, core-image-clutter) to name a few. ",
+          "expected_results": " All recipes are built correctly \n\n"
+        },
+        "4": {
+          "action": "Wait for the recipes to finish ",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Go to the configuration details.",
+          "expected_results": " You should see 5 of the 6 recipes that were build. If you order the recipes in alphabetical order you should see that the first 5 made the list. "
+        }
+      },
+      "summary": "Verify_most_built_recipe_shows_a_maximum_of_5_recipes"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Verify_order_sequence_of_listing_in_Most_build_recipes",
+      "author": [
+        {
+          "email": "libertad.gonzalez.de.la.cruz@intel.com",
+          "name": "libertad.gonzalez.de.la.cruz@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start toaster",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Create a toaster project",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Build 6 recipes example (core-image-sato, core-image-minimal, core-image-base, core-image-lsb, core-image-clutter) to name a few. \n\n",
+          "expected_results": "All recipes are built correctly \n\n"
+        },
+        "4": {
+          "action": "Wait for the recipes to finish \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Go to the configuration details. \n\n",
+          "expected_results": " If you order the recipes in alphabetical order you should see that the first 5 made the list. Only 5 out of the 6 should make the list. \n\n"
+        },
+        "6": {
+          "action": "Select the 6th recipe that did not make the list and build it again. ",
+          "expected_results": " Since the 6th recipe is now built twice it should make the list and the recipe in the 5th place should not appear."
+        }
+      },
+      "summary": "Verify_order_sequence_of_listing_in_Most_build_recipes"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Verify_Most_build_recipes_multiple_selection",
+      "author": [
+        {
+          "email": "libertad.gonzalez.de.la.cruz@intel.com",
+          "name": "libertad.gonzalez.de.la.cruz@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start toaster",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Create a toaster project",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Build 4 recipes example (core-image-sato, core-image-minimal, core-image-base, core-image-lsb, core-image-clutter) to name a few. \n\n",
+          "expected_results": " All recipes are built correctly \n\n"
+        },
+        "4": {
+          "action": "Wait for the recipes to finish. \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Go to the configuration details. \n\n",
+          "expected_results": " You should see the 4 recipes in alphabetical order. You should also note that the Build button on the upper right hand corner is disabled since no recipe has been selected. \n\n"
+        },
+        "6": {
+          "action": "Select 1 of the recipes in the most built recipes section. \n\n",
+          "expected_results": "The build button is automatically enabled. \n\n"
+        },
+        "7": {
+          "action": "Select multiple (example 2 or 3) recipes in the most built recipes section. \n\n",
+          "expected_results": " The build button is enabled. \n\n"
+        },
+        "8": {
+          "action": "Click on the build button to start building the recipes.",
+          "expected_results": "One recipe start to build and the others are on queue."
+        }
+      },
+      "summary": "Verify_Most_build_recipes_multiple_selection"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Verify_layer_addition_functionality",
+      "author": [
+        {
+          "email": "libertad.gonzalez.de.la.cruz@intel.com",
+          "name": "libertad.gonzalez.de.la.cruz@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Clone the poky environment     git clone http://git.yoctoproject.org/git/poky",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Start toaster",
+          "expected_results": " Once project is created it should redirect you to a new project configuration page. \n\n"
+        },
+        "3": {
+          "action": "Create a toaster project with master release \n    \n\n",
+          "expected_results": " See attachment of layerCanvas.png \n\n\n"
+        },
+        "4": {
+          "action": "Add  layers by typing the name in the \"Type a layer name\" input box and adding by clicking the button. \n\n",
+          "expected_results": " A list of layers with similar name to the one you are typing should appear, giving you the choice to add it.  The default text \"Type a layer name\" should disappear as soon as you start typing.  \n\n"
+        },
+        "5": {
+          "action": "Add layers by clicking on the View compatible layers link just bellow the input text box. \n\n",
+          "expected_results": "This should redirect you to the compatible layers page where a list of compatible layers should appear and allow you to Add layers to the project. \n\n"
+        },
+        "6": {
+          "action": "Add a layer by importing a layer clicking in the Import layer",
+          "expected_results": "This link should redirect you to the import layer form where you will be able to add layers from git repository or a local directory. \n\n\n"
+        }
+      },
+      "summary": "Verify_layer_addition_functionality"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Verify_delete_layer_functionality",
+      "author": [
+        {
+          "email": "libertad.gonzalez.de.la.cruz@intel.com",
+          "name": "libertad.gonzalez.de.la.cruz@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Clone the poky environment     git clone http://git.yoctoproject.org/git/poky\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Start toaster",
+          "expected_results": " Once project is created it should redirect you to a new project configuration page.\n\n"
+        },
+        "3": {
+          "action": "Create a toaster project master release  \n   \n",
+          "expected_results": "See attachment of layerCanvas.png  \n\n"
+        },
+        "4": {
+          "action": "Remove openembedded-core layer from the project by clicking the trash icon next to it.  \n\n",
+          "expected_results": "The layer should disappear from the list and a notification should appear at the top of the page saying: \"You have removed 1 layer from your project: \".  The layer_name should be a link to the corresponding layer detail page. The layer counter next to the \"layers\" heading should decrease by one. \n"
+        },
+        "5": {
+          "action": "Remove all the layers from the project",
+          "expected_results": " you should see a message that reads:  \n\nYou need to add some layers. For that you can:  \n\n-View all layers compatible with this project  \n\n-Import a layer  \n\n-Read about layers in the documentation  \n\nOr type a layer name below.  \n\n\n The \"Choose from the layers compatible with this project\" link should go to the compatible layers page The \"Import a layer\" link should go to the import layer page The \"Read about layers in the documentation\" link should open in a new window and bring you to http://www.yoctoproject.org/docs/current/dev-manual/dev-manual.html#understanding-and-creating-layers"
+        }
+      },
+      "summary": "Verify_delete_layer_functionality"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Download_task_log",
+      "author": [
+        {
+          "email": "alexandru.costinx.roman@intel.com",
+          "name": "alexandru.costinx.roman@intel.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start Toaster. ",
+          "expected_results": "Toaster starts."
+        },
+        "2": {
+          "action": "Click on new project button.\n\n",
+          "expected_results": "Open create a new project page."
+        },
+        "3": {
+          "action": " Enter a project name, select a release and click on create project or select an existing project. \n\n",
+          "expected_results": "Project Created."
+        },
+        "4": {
+          "action": "Build a recipe (ex: core-image-minimal). \n\n",
+          "expected_results": "Build finish."
+        },
+        "5": {
+          "action": "Click on the built recipe. \n\n",
+          "expected_results": "Open build summary page."
+        },
+        "6": {
+          "action": "Click on tasks tab. \n\n",
+          "expected_results": "Open tasks page."
+        },
+        "7": {
+          "action": "Click on a task executed successfully. \n\n",
+          "expected_results": "Open task page."
+        },
+        "8": {
+          "action": "Click on \"Download task log\" button. \n",
+          "expected_results": "You can download the task log. \n"
+        },
+        "9": {
+          "action": "Click on a failed task.  \n",
+          "expected_results": "Open task page, not appear download task \n"
+        }
+      },
+      "summary": "Download_task_log"
+    }
+  }
+]
\ No newline at end of file
diff --git a/meta/lib/oeqa/manual/toaster-unmanaged-mode.json b/meta/lib/oeqa/manual/toaster-unmanaged-mode.json
new file mode 100644
index 0000000..e614b14
--- /dev/null
+++ b/meta/lib/oeqa/manual/toaster-unmanaged-mode.json
@@ -0,0 +1,1170 @@
+[
+  {
+    "test": {
+      "@alias": "toaster.toaster.Create_a_Yocto_project_and_start_the_Toaster",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Set up yocto project and toaster test environment. \ncd ${installdir} \ngit clone git://git.yoctoproject.org/poky  \n\n",
+          "expected_results": "NA \n\n"
+        },
+        "2": {
+          "action": "Start up toaster. \ncd ${installdir} \nsource poky/oe-init-build-env \nsource toaster start  \n\n",
+          "expected_results": "  \nlog: \nThe system will start. \nSyncing... \nCreating tables ... \nCreating table south_migrationhistory \nInstalling custom SQL ... \nInstalling indexes ... \nInstalled 0 object(s) from 0 fixture(s) \n > south  \n\nNot synced (use migrations): \n - orm \n(use ./manage.py migrate to migrate these) \nRunning migrations for orm: \n - Migrating forwards to 0004_auto__add_field_package_installed_name. \n > orm:0001_initial \n > orm:0002_auto__add_field_build_timespent \n > orm:0003_timespent \n - Migration 'orm:0003_timespent' is marked for no-dry-run. \n > orm:0004_auto__add_field_package_installed_name \n - Loading initial data for orm. \nInstalled 0 object(s) from 0 fixture(s) \nserver address: 127.0.0.1, server port: 8200 \nSuccessful start."
+        },
+        "3": {
+          "action": "Build the yocto project. \nbitbake core-image-minimal  \n\n",
+          "expected_results": "Build successfully. \n"
+        },
+        "4": {
+          "action": "Use a default web brower to see project build process. \nxdg-open http://localhost:8000/ \nWait for build completion. \n",
+          "expected_results": "You can open http://localhost:8000/ in a default browser. The build process is showed. "
+        }
+      },
+      "summary": "Create_a_Yocto_project_and_start_the_Toaster."
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Sort_the_content_of_the_builds_table",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start up toaster.",
+          "expected_results": "Succeed to start up toaster. "
+        },
+        "2": {
+          "action": "Create 2 builds, such as \"bitbake core-image-minimal\" and \"bitbake core-image-sato\". Wait for successful builds and then run: http://localhost:8000/",
+          "expected_results": "Succeed to build the targets. "
+        },
+        "3": {
+          "action": "Enter \"All build\" table in web browser.",
+          "expected_results": "NA "
+        },
+        "4": {
+          "action": "Click \"Completed on\" component to sort.",
+          "expected_results": "Build targets are sorted out by the \"Completed on\". "
+        },
+        "5": {
+          "action": "Click \"Completed on\" component again to invert the sorting .",
+          "expected_results": "The sorting is inverted. "
+        },
+        "6": {
+          "action": "Have a sort try in other columns. outcome, machine, started on, completed on, errors, warnings, project.",
+          "expected_results": "See item 4 and 5."
+        }
+      },
+      "summary": "Sort_the_content_of_the_builds_table."
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Search_the_content_of_the_builds_table",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start up toaster.",
+          "expected_results": "NA "
+        },
+        "2": {
+          "action": "Create 2 builds, such as \"bitbake core-image-minimal\" and \"bitbake core-image-sato\". Wait for successful builds and then run: xdg-open http://localhost:8000/",
+          "expected_results": "NA "
+        },
+        "3": {
+          "action": "Enter \"All build\" table in web browser.",
+          "expected_results": "NA "
+        },
+        "4": {
+          "action": "Input a string in search component and click search.",
+          "expected_results": "Show returned search results. When no search query has been entered, we have placeholder text saying: \"Search builds\". The placeholder text disappears when the first character is typed. "
+        },
+        "5": {
+          "action": "See returned search results.",
+          "expected_results": "If your search query returns no results, the section heading changes to \"No builds found\", and we show you an alert with a search form and an option to show all builds. "
+        },
+        "6": {
+          "action": "Click \"Clear search\" icon (icon-remove-sign). Observe all builds are showed. ",
+          "expected_results": "Click it to clear the search and display all builds."
+        }
+      },
+      "summary": "Search_the_content_of_the_builds_table."
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Filter_the_content_of_the_builds_table",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start up toaster.",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Create 2 builds, such as \"bitbake core-image-minimal\" and \"bitbake core-image-sato\". Wait for successful builds and then run: xdg-open http://localhost:8000/.",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Enter \"All build\" table in web browser.",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Make sure the following table columns have filters. \n- Outcome \n-- Started on \n- Completed on \n- Failed tasks",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Filters are mutually exclusive. Click a filter button of a one column and a filter dialogue occurs. Select a filter item. The filter result would be showed. Then select another filter item of another column and the previously applied filter is overridden by the newly selected filter when a filter from a different column is applied to the table. In this state, we show some help text next to the \"Apply\" button, saying \"You can only apply one filter to the table. This filter will override the current filter.\"",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "Filters are overridden by search. Run a search query and you can see previous filter results are overridden by the results of the search query.",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "Have a try in filters of the following table columns. \n- Outcome \n- Started on \n- Completed on \n- Failed tasks \n",
+          "expected_results": "NA"
+        }
+      },
+      "summary": "Filter_the_content_of_the_builds_table."
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Tasks_in_toaster_UI",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": " === TOASTER: Test Instructions for \"Tasks\", \"Time\", \"CPU Usage\", and \"Disk I/O\" pages ===   \n \nNOTE TO TESTERS: The three pages \"Time\", \"CPU Usage\", and \"Disk I/O\" are simple variations on the \"Tasks\" page. Those test instructions will demonstrate the respective unique parts.   \n \n \n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Start with a default Yocto project (qemux86), start the Toaster, and build \"bitbake core-image-minimal\".   \n \n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "In Toaster, select the build, and select the \"Tasks\" link in the left sidebar   \n \n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Breadcrumbs   \n \n  * Observe that the 4 breadcrumbs at the top left are:   \n     \n                           : a live link that will take you back to the project page  \n                  \t: a live link that will take you back to the project Builds page \n                          : a live link that will take you back to the image dashboard page \n                          \"Tasks\"   \n \n  * Test the breadcrumb live links, return to this page   \n \n \n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "General Layout   \n \n  * Observe the left-hand box with links to the other pages of the build   \n   \n  * Observe the title of the table is \"Tasks\", in bold   \n   \n  * Observe the search/filter bar above the table   \n   \n  * Observe the number of table rows in each page matches the number selected in the \"Show rows\" dropdown menu   \n   \n  * Observe at the bottom of the page the \"Showing XX to XX out of xxx entries\", the page selection links, and the \"Show Rows\" selection.   \n \n \n",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "Columns   \n \nNote: to restore the default columns in your browser, for example in Firefox, select \"Tools > Privacy > remove individual cookies\", find the cookies for the IP address of the Toaster engine (for example \"localhost\"), and remove each sub-cookie with the prefix \"_displaycols_*\" (or the whole cookie if those are the only sub-cookies).   \n \n  * Observe that the default columns are:    \n   \n    \"Order, Recipe, Task, Executed, Outcome, Cache attempt\"   \n \n  * Click the \"Edit Columns\" button. ",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "Observe that the fields are sorted as follows (with the indicated items greyed)   \n \n    [ ] CPU usage  \n    [x] Cache attempt  \n    [ ] Disk I/O (ms)  \n    [x] Executed  \n    [x] Order            {greyed}  \n    [x] Outcome  \n    [x] Recipe           {greyed}  \n    [ ] Recipe version  \n    [x] Task             {greyed}  \n    [ ] Time (secs)    \n \n  * For each of the greyed items, attempt to click them. Observe that they do not change.   \n \n  * For each of the non-greyed items, attempt to click them. Observe that the respective column dynamically appears when checked and disappears when un-checked. ",
+          "expected_results": ""
+        },
+        "8": {
+          "action": "Search   \n \n  * Observe that the search text box background text is \"Search tasks\".   \n   \n  * Set the search text to \"busybox\" and click \"Search\". Observe that only the busybox tasks are listed (about 16).   \n   \n  * Click the \"X\" next to the search text box. Observe that all of the tasks re-appear.   \n \n \n",
+          "expected_results": ""
+        },
+        "9": {
+          "action": "Column sorts   \n \n  * Enable all of the columns.   \n   \n  * Observe that by default the \"Order\" column header is in bold, it has a down-arrow icon, and that the table is sorted by this column in ascending order.   \n   \n  * Observe that the columns are in this order, and are sortable only if indicated:   \n   \n    Order                    {sortable}  \n    Recipe                     {sortable}  \n    Recipe version  \n    Task                       {sortable}  \n    Executed                   {sortable}  \n    Outcome                    {sortable}  \n    Cache attempt              {sortable}  \n    Time (secs)                {sortable}  \n    CPU usage                  {sortable}  \n    Disk I/O (ms)              {sortable}  ",
+          "expected_results": ""
+        },
+        "10": {
+          "action": " Test that each of the sortable columns do sort, ascending and descending   \n \n  * Observe that each of the column headers have a question mark icon, and that hovering over it provides help text.",
+          "expected_results": ""
+        },
+        "11": {
+          "action": "\"Executed\" Filter    \n \n  * Observe that the \"Executed\" column has the filter icon. Click on it and observe these values, where \"All Tasks\" is the default   \n \n    (*) All Tasks   \n    ( ) Executed Tasks   \n    ( ) Not Executed Tasks    \n \n  * Click on \"Executed Tasks\" and observe that only rows with the value \"Executed\" are displayed.   \n \n  * Click on \"Not Executed Tasks\" and observe that only rows with the value \"Not Executed\" are displayed.   \n \n  * Click on \"All Tasks\" and observe that all rows are displayed.   \n \n \n",
+          "expected_results": ""
+        },
+        "12": {
+          "action": "\"Outcome\" Filter    \n \n  * Observe that the \"Outcome\" column has the filter icon. Click on it and observe these values, where \"All Tasks\" is the default   \n \n    (*) All Tasks   \n    ( ) Succeeded Tasks   \n    ( ) Failed Tasks   \n    ( ) Cached Tasks   \n    ( ) Prebuilt Tasks   \n    ( ) Covered Tasks   \n    ( ) Empty Tasks    \n \n  * Click on each of the filter selections, and observe that the resulting row \"Outcome\" values match the selection.    \n \n  * Click on \"All Tasks\" and observe that all rows are displayed.   \n \n \n1",
+          "expected_results": ""
+        },
+        "13": {
+          "action": "\"Cache attempt\" Filter    \n \n  * Observe that the \"Cache attempt\" column has the filter icon. Click on it and observe these values, where \"All Tasks\" is the default   \n \n    (*) All Tasks   \n    ( ) Tasks with cache attempts   \n    ( ) Tasks with 'File not in cache' attempts   \n    ( ) Tasks with 'Failed' cache attempts   \n    ( ) Tasks with 'Succeeded' cache attempts     \n \n  * Click on each of the filter selections, and observe that the resulting row \"Outcome\" values match the selection.   \n   \n    Note the with a clean build, only the \"All Tasks\" and \"Tasks with cache attempts\" will return rows.  \n \n  * Click on \"All Tasks\" and observe that all rows are displayed.   \n \n \n1",
+          "expected_results": ""
+        },
+        "14": {
+          "action": "Order, Task, Executed, Outcome, Cache attempt links   \n \n  * Observe that for a given row, the above values are live links that will both take you to the respective task detail page. Click the back button to return.  \n\n  * Observe that for a given row the values in \"Recipe\" and \"Recipe version\" are live links that will both take you to the respective recipe details page. Click the back button to return   \n \n \n1",
+          "expected_results": ""
+        },
+        "15": {
+          "action": "Time Page   \n \n  * \"In Toaster, select the build, and select the \"Time\" link in the left sidebar   \n \n  * Observe that the default columns are:    \n   \n    \"Recipe\", \"Task\", \"Executed\", \" Outcome\", \"Time (secs)\"   \n \n  * Observe that the default sort is \"Time (secs)\", in descending order.   \n   \n  * In the \"Edit Columns\" button, turn on all of the columns.   \n   \n  * Observe that the page now matches the \"Tasks\" page, and passes the same tests.   \n \n \n1",
+          "expected_results": ""
+        },
+        "16": {
+          "action": "CPU Usage Page   \n \n  * \"In Toaster, select the build, and select the \"CPU Usage\" link in the left sidebar   \n \n  * Observe that the default columns are:    \n   \n    \"Recipe\", \"Task\", \"Executed\", \"Outcome\", \"CPU Usage\"   \n \n  * Observe that the default sort is \"CPU Usage\", in descending order.   \n   \n  * In the \"Edit Columns\" button, turn on all of the columns.   \n   \n  * Observe that the page now matches the \"Tasks\" page, and passes the same tests.   \n \n \n1",
+          "expected_results": ""
+        },
+        "17": {
+          "action": "Disk I/O Page   \n  \n   * \"In Toaster, select the build, and select the \"Disk I/O\" link in the left sidebar   \n  \n   * Observe that the default columns are:    \n    \n     \"Recipe\", \"Task\", \"Executed\", \"Outcome\", \"Disk I/O (ms)\"   \n  \n   * Observe that the default sort is \"Disk I/O (ms)\", in descending order.   \n    \n   * In the \"Edit Columns\" button, turn on all of the columns.   \n    \n   * Observe that the page now matches the \"Tasks\" page, and passes the same tests. ",
+          "expected_results": "NA"
+        }
+      },
+      "summary": "Tasks_in_toaster_UI"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.package_detail_in_toaster_UI",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "TOASTER: Test Instructions for \"Package Detail\" page   \n \n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Start with a default Yocto project (qemux86), start the Toaster, and build \"bitbake core-image-minimal\". ",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "In Toaster, select the build, and select the \"Packages\" link in the left sidebar.",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Select a package from the \"Package\" column.",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Breadcrumbs  \n  * Observe that the 3 breadcrumbs at the top left are:   \n    : a live link that will take you back to the image dashboard page \n    \"Packages\": a live link that will take you back to the Packages page  \n    \"bash\": the name of the current package  (not a link)        \n  * Test the breadcrumb live links, return to this page ",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "General Layout \n  * Click on any package \n  * Observe that there is no the left-hand box   \n  * Observe that there is a right-hand box, with information about the package \n  * Observe the title is the package name and version, in bold  \n  * Observe that, if the package is installed in an image, there is a link to the image(s) the package appears in  \n  * Observe that, if the package is not installed in the image, there are two tab buttons below the title ",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "Observe that the tab buttons are:  \n    Generated files (2)        {highlighted}  \n    Runtime dependencies (4)  \n",
+          "expected_results": ""
+        },
+        "8": {
+          "action": "Generated files tab  \n  * Click the \"Generated files\" tab (which should be selected by default)  \n  * Observe that the number of files in the table matches the number in parenthesis after the \"Generated files\" tab title. \n  * Observe that the columns in the table are \"File\" and \"Size\"  \n  * Observe that the table is sorted by \"File\" in ascending alphabetical order (A to Z). ",
+          "expected_results": ""
+        },
+        "9": {
+          "action": "Runtime dependencies tab  \n  * Click the \"Runtime dependencies\" tab  \n  * Observe that the number of dependencies in the table matches the number in parenthesis after the \"Runtime dependencies\" tab title.  \n  * Observe that the columns in the table are:  \n    \"Package, Version, Size\"  \n  * Observe that the table is sorted by Package in ascending alphabetical order (A to Z)  \n  * Observe that the package name values are live links to the respective package details page. ",
+          "expected_results": "The information icon was eliminated on the columns that where self explanatory.  "
+        },
+        "10": {
+          "action": "Package information box  \n  * Observe that there is a right-hand box, with information about the package, including in this example the fields:  \n    \"Size, License, Recipe, Recipe version, Layer, Layer branch, Layer commit\"  \n  * Observe that each of the field has a question mark icon, and that hovering will provide help text.  \n  * Observe that none of the values in the right-hand box are blank  \n  * Observe that the \"Recipe\" value is a live link to the respective recipe detail page.  ",
+          "expected_results": ""
+        }
+      },
+      "summary": "package_detail_in_toaster_UI"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.recipes:_Sort_the_content_of_the_recipes_table",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start with a default Yocto project (qemux86), start the Toaster, and build \"bitbake core-image-minimal\".   \n \n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "In Toaster, select the build, and select the \"Recipes\" link in the left sidebar.  \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Make sure that by default the \"Recipes\" table is sorted by \"Recipe\" in ascending alphabetical order (A to Z).  \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Sort my \"Recipes\" table by \"Section\" and then navigate away by selecting a recipe(such as click busybox recipe). When you click \"back\" button in web-browser to go back to the \"Recipes\" table it should still be sorted by \"Section\".  \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Make sure all column headings are sortable, except \"Recipe version\", \"Dependencies\", \"Reverse dependencies\" and \"Layer commit\".  \n\n",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "Sorting and \"Edit columns\" \nIf you use the \"Edit columns\" menu to hide the column with the applied sorting, we revert the sorting to the default sorting (i.e. \"Recipe\"). The default sorting always uses one of the core columns, which cannot be hidden using the \"Edit columns\" menu. \nSort recipes by \"section\" column heading. Then hide \"Section\" column by \"Edit columns\". Make sure that the \"Recipes\" table is sorted by \"Recipe\" in ascending alphabetical order (A to Z). \nNOTE: Bug 5919 is filed against the issue.  \n\n",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "Sorting and search \nSearching should have no impact on the applied sorting. Any results returned should be sorted by the sorting criteria selected when the search query was submitted. \nSort recipes by \"section\" column heading. Input a string (such as \"lib\") in search box and click search button. Make sure results returned should be sorted by \"section\". \n",
+          "expected_results": "NA"
+        }
+      },
+      "summary": "recipes:_Sort_the_content_of_the_recipes_table."
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.recipes:_Search_the_content_of_the_recipes_table",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "recipes: Search the content of the recipes table  \n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Start with a default Yocto project (qemux86), start the Toaster, and build \"bitbake core-image-minimal\".   \n \n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "In Toaster, select the build, and select the \"Recipes\" link in the left sidebar.  \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Observe the search is made of a text input field and a \"Search\" button in a toolbar above the table.  \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "When no search query has been entered, we have placeholder text saying: \"Search recipes\".  \n\n",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "Input \"lib\" in the text input field. The placeholder text disappears when the first character is typed. Click search button.  \n\n",
+          "expected_results": ""
+        },
+        "7": {
+          "action": " \n(1) returned results \nThe search string is kept in the text input field. The results returned occur. Click  \"Clear search\" icon to clear the search and display all recipes. \n(2) no results returned \nIf your search query returns no results, the page heading changes to \"No recipes found\", and we show you an alert with a search form and an option to show all recipes. Observe \"show all recipes\" button is available.  \n\n",
+          "expected_results": ""
+        },
+        "8": {
+          "action": "When I run a search, the search happens against the following columns (independently of they being shown or hidden): \n- Recipe \n- Recipe version \n- Recipe file \n- Section \n- License \n- Layer \n- Layer branch \n- Layer commit  \n\nInput a string to search for the above 8 column headings separately to make sure that the search happens against the columns.  \n\n \n\n",
+          "expected_results": ""
+        },
+        "9": {
+          "action": "Search, sorting and \"Edit columns\"  \nSearching does not change the state of the table: the same columns remain hidden and the same sorting applied when search results are displayed, but filters are cleared by the search results.\nSearch a string and make sure that the same columns remain hidden and the same sorting applied. Since filter feature of recipes (4296) is obsolete, we don't have to test filter.  \n\n",
+          "expected_results": ""
+        },
+        "10": {
+          "action": "Search and filters \nThe scope of the filters is the content currently on the table (this means all table pages, not only the one displayed). The scope of the search is always the content of the database.\nSince filter feature of recipes (4296) is obsolete, we don't have to test filter.  \n\nIf I run a search query, any filter applied afterwards will filter the content returned by the search query.  \n\nIf I run a search query while a filter is applied, the filter is cleared by the results of the search query (i.e. we display the results of the search query and clear the filter applied beforehand).",
+          "expected_results": "NA"
+        },
+        "11": {
+          "action": " The same happens if I click the \"Clear search\" icon when a filter is applied to a set of search results (both search results and applied filter are cleared, and the table shows all the tasks). \nSince filter feature of recipes (4296) is obsolete, we don't have to test filter. \n\n",
+          "expected_results": "NA"
+        }
+      },
+      "summary": "recipes:_Search_the_content_of_the_recipes_table."
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.recipes:_Customise_the_columns_of_the_recipes_table",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start with a default Yocto project (qemux86), start the Toaster, and build \"bitbake core-image-minimal\".   \n \n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "In Toaster, select the build, and select the \"Recipes\" link in the left sidebar.  \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "* Observe that the default columns are:   \n    \"Recipe, Recipe version, Recipe file, Section , License, Layer\"   \n \n  * Click the \"Edit Columns\" button.  \n  * Observe that the fields are sorted as follows (with the indicated items greyed)  \n    [ ] Dependencies  \n    [x] Layer  \n    [ ] Layer branch  \n    [ ] Layer commit  \n    [x] License  \n    [x] Recipe                   {greyed}  \n    [x] Recipe file  \n    [x] Recipe version        {greyed}  \n    [ ] Reverse dependencies  \n    [x] Section    \n \n  * For each of the greyed items, attempt to click them. Observe that they do not change.  \n  * For each of the non-greyed items, attempt to click them. Observe that the respective column dynamically appears when checked and disappears when un-checked.\n",
+          "expected_results": "NA"
+        }
+      },
+      "summary": "recipes:_Customise_the_columns_of_the_recipes_table."
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.recipes:_View_a_table_with_all_the_recipes_included_in_an_image_recipe",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start with a default Yocto project (qemux86), start the Toaster, and build \"bitbake core-image-minimal\".   \n \n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "In Toaster, select the build, and select the \"Recipes\" link in the left sidebar.  \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "By default, the all recipes table displays the following columns in this order: \n(1) Recipe (2) Recipe version: the target version and revision (3) Dependencies (4)Reverse Dependencies  (5) License: the value of the target's LICENSE variable (6) Layer: the name of the layer providing the target  \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "In the \"Edit columns\" menu, table columns appear listed alphabetically. \nIn the table itself, the default order of columns is as follows: \n(1) Dependencies (2) Layer (3) Layer branch (4) Layer commit (5) License (6) Recipe (7) Recipe file  (8) Reverse dependencies (9) Section (10) Version  \n\nThe minimum table is made of the 2 columns that provide the information needed to identify a target: Recipe and Recipe version.",
+          "expected_results": "NA"
+        }
+      },
+      "summary": "recipes:_View_a_table_with_all_the_recipes_included_in_an_image_recipe"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.recipes:_View_detailed_information_about_a_recipe。",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Create a default Yocto project (qemux86), and start the Toaster.  \n \n  $ source poky/oe-init-build-env \n  $ source toaster start \n  $ bitbake core-image-minimal \n  $ http://localhost:8000/  \n \n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Select the \"core-image-minimal\" build link  \n \n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Select the \"Recipes\" link in the left sidebar  \n \nObserve that the recipes are listed in a table, and that each recipe name is a live URL link.  \n \n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Observe that \"Packages\" link. It should have an appended value like \"(4)\". Now click on this link.  \n \nObserve: \n  a) The number of packages matches the previous number in parenthesis.  \n \n  b) Each package has a version and a size. The size may be zero.  \n \n  c) Note that if you hover on a package name, it will reveal a URL of the following form. This link should take you to the corresponding package detail page.  \n \n        localhost:8000/gui/build//package/   \n \n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Observe that recipes of \"Build Dependencies\" link has an appended value like \"(0)\". Now click on this link.  \n \nObserve: \n  a) No dependencies appear, and you get a message of the form:  \n \n  \"$RECIPE_NAME_VERSION has no build dependencies.\"  \n \n",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "Observe that \"Reverse build dependencies\" link has an appended value like \"(1)\". Now click on this link.  \n \nObserve: \n  a) The number of packages matches the previous number in parenthesis.  \n \n  b) The recipe dependency should be \"packagegroup-core-boot\",  \n \n  c) There should be a respective version displayed, for example \"1.0-r11\"  \n \n  d) If you hover on the recipe name, it will reveal a URL of the following form. This link should take you to the corresponding recipe detail page.  \n \n        localhost:8000/gui/build//recipe/  \n \n",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "Click the breadcrumb \"Recipes\" at the top, locate the \"gdbm\" recipe, and select it.  \n \n",
+          "expected_results": ""
+        },
+        "8": {
+          "action": "Observe that \"Packages\" link. It should have an appended value like \"(0)\". Now click on this link.  \n \nObserve: \n  a) No packages appear, and you get a message of the form:  \n \n  \"$PACKAGE_NAME_VERSION does not build any packages.\"  \n \n",
+          "expected_results": ""
+        },
+        "9": {
+          "action": "Observe that \"Build dependencies\" link. It should have an appended value like \"(2)\". Now click on this link.  \n \nObserve: \n  a) The number of build dependencies matches the previous number in parenthesis.  \n \n  b) The recipe dependency should have values like \"gettext-native\" and \"libtool-cross\".  \n \n  c) There should be a respective versions displayed for each dependency.  \n \n  d) If you hover on a recipe name, it will reveal a URL of the following form. This link should take you to the corresponding recipe detail page.  \n \n        localhost:8000/gui/build//recipe/  \n \n1",
+          "expected_results": ""
+        },
+        "10": {
+          "action": "Observe that \"Reverse build dependencies\" link. It should have an appended value like \"(0)\". Now click on this link.  \n \nObserve: \n  a) No reverse dependencies appear, and you get a message of the form:  \n \n  \"$RECIPE_NAME_VERSION does not build any packages.",
+          "expected_results": "NA"
+        }
+      },
+      "summary": "recipes:_View_detailed_information_about_a_recipe。"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.variables:_Search_the_content_of_the_bitbake_variables_table",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start with a default Yocto project (qemux86), start the Toaster, and build \"bitbake core-image-minimal\".   \n \n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "In Toaster, select the build, and select the \"Configuration\" link in the left sidebar. Then click \"BitBake variables\" tab.  \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "When no search query has been entered, we have placeholder text saying: \"Search BitBake variables\".   \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Input \"lib\" in text input field. The placeholder text disappears when the first character is typed. Click search button.  \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Observe \"4 variables found\" is showed. (It may be other number.)  \n  If your search query returns no results, we display an alert with: \n    - A h3 heading saying: \"No variables found\" \n    - A search box \n    - The search query is showed in the text input shield. \n    - A link to show all variables. we show the variables table.  \n\n",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "We provide a \"Clear search\" icon (icon-remove-sign). Click it to clear the search and display all variables. Check that the \"Clear search\" icon cannot be accessed using the tab key.   \n\n",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "Verify search scope. \nWhen I run a search, the search happens against the following columns (independently of they being shown or hidden): \n- Variable \n- Value \n- Set in file \n- Description  \n\n",
+          "expected_results": ""
+        },
+        "8": {
+          "action": "Verify \"search, sorting and 'Edit columns'\" \nSearching does not change the state of the table: the same columns remain hidden and the same sorting applied \nwhen search results are displayed, but filters are cleared by the search results.  \n\n",
+          "expected_results": ""
+        },
+        "9": {
+          "action": "Search and filters \nIf I run a search query, any filter applied afterwards will filter the content returned by the search query. \nIf I run a search query while a filter is applied, the filter is cleared by the results of the search query. \n",
+          "expected_results": "NA"
+        }
+      },
+      "summary": "variables:_Search_the_content_of_the_bitbake_variables_table"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.variables:_Sort_the_content_of_the_bitbake_variables_table",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start with a default Yocto project (qemux86), start the Toaster, and build \"bitbake core-image-minimal\".  \n \n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "In Toaster, select the build, and select the \"Configuration\" link in the left sidebar. Then click \"BitBake variables\" tab. \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "By default, the \"variables\" table is sorted by \"Variable\" in ascending alphabetical order (A to Z). \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Make sure that \"Variable\" column is sortable (Developers have disabled sort function of all other columns to avoid bug 6004) \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Sorting and search \nSearching should have no impact on the applied sorting. Any results returned should be sorted by the sorting criteria selected when the search query was submitted.",
+          "expected_results": "NA"
+        }
+      },
+      "summary": "variables:_Sort_the_content_of_the_bitbake_variables_table."
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.builds:_View_a_table_of_all_the_builds_run_for_a_certain_build_directory",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start up toaster and open localhost:8000. ",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "You can see 'Latest builds' section lists. - Builds in progress, sorted by inverse start time (last one starting at the top). - 3 latest completed builds, as long as they are less than 24 hours old.  If there are no builds in progress or builds completed within the last 24 hours we don't display it: the page shows only the 'All builds' section. ",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "You can see the following column headings. You can see the their description in https://bugzilla.yoctoproject.org/attachment.cgi?id=1617. outcome, recipe, machine, started on, completed on, failed tasks, errors, warnings, time, image files, project",
+          "expected_results": "NA"
+        }
+      },
+      "summary": "builds:_View_a_table_of_all_the_builds_run_for_a_certain_build_directory"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.builds:_Customise_the_columns_of_the_builds_table",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start up toaster.",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Create 2 builds, such as \"bitbake core-image-minimal\" and \"bitbake core-image-sato\". Wait for successful builds and then run: xdg-open http://localhost:8000/",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Enter \"All build\" table in web browser.",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Select a few item in \"Edit columns\" to show or hide them in all builds.",
+          "expected_results": "Unchecked items changed to checked should immediately appear in the table.   Checked items changed to unchecked should immediately disappear from the table.   If you uncheck the column with the applied sorting, when you close the \"Edit columns\" menu the applied sorting should revert to the table default sorting. Bug 5919 is filed for the function."
+        }
+      },
+      "summary": "builds:_Customise_the_columns_of_the_builds_table"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.packages:_View_a_table_with_all_the_packages_built_for_an_image_recipe",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start with a default Yocto project (qemux86), start the Toaster, and build \"bitbake core-image-minimal\". ",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "In Toaster, select the build, and select the \"Packages\" link in the left sidebar. ",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "By default, the built packages table displays the following columns in this order:  Package, Package version, Size ",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Apart from the columns shown by default, the following additional columns are also available to users via the \"Edit columns\" menu:  Layer, Layer branch, Layer commit, License, Recipe version  ",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Enable these columns and observe that table columns appear listed alphabetically in the \"Edit columns\" menu (1)Package (2)Package version (3)Size (4)License (5)Recipe (6)Recipe version (7)Layer (8)Layer branch (9)Layer commit ",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "The minimum table is made of the 2 columns that provide the information needed to identify a package: Package and Package version. Their corresponding checkboxes in the \"Edit columns\" menu appear always selected and are in an inactive state.  ",
+          "expected_results": "NA"
+        }
+      },
+      "summary": "packages:_View_a_table_with_all_the_packages_built_for_an_image_recipe"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.packages:_Sort_the_content_of_the_packages_table",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start with a default Yocto project (qemux86), start the Toaster, and build \"bitbake core-image-minimal\". ",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "In Toaster, select the build, and select the \"Packages\" link in the left sidebar. ",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Observe that by default the \"built packages\" table is sorted by \"Package\" in ascending alphabetical order (A to Z). ",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Click \"Size\" column heading to sort my \"built packages\" table by \"Size\". Then navigate away by selecting a package and you can see the package page. After click \"go back\" button in browser to return to the \"built packages\" table it should still be sorted by \"Size\". ",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Observe that all except \"Package version\", \"Recipe version\", \"Layer commit\" are sortable. ",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "If you use the \"Edit columns\" menu to hide the column with the applied sorting, we revert the sorting to the default sorting (i.e. \"Package\"). The default sorting always uses one of the core columns, which cannot be hidden using the \"Edit columns\" menu.   Bug 5919 is filed for the issue. ",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "Searching should have no impact on the applied sorting. Any results returned should be sorted by the sorting criteria selected when the search query was submitted.  Sort packages by size and search a string. Observe that results returned should be sorted by size. ",
+          "expected_results": ""
+        },
+        "8": {
+          "action": "In Toaster, select the build, and select the \"core-image*\" link in the left sidebar. Observe that by default the \"built packages\" table is sorted by \"Package\" in ascending alphabetical order (A to Z).  ",
+          "expected_results": ""
+        },
+        "9": {
+          "action": "If choose to sort my \"included packages\" table by \"Size\" and then navigate away by selecting a package, when I go back to the \"included packages\" table it should still be sorted by \"Size\".  ",
+          "expected_results": ""
+        },
+        "10": {
+          "action": "Enable all columns by \"Edit columns\". All except \"Package version\", \"Recipe version\", \"Dependencies\", \"Reverse dependencies\", \"Layer commit\", should be sortable.  ",
+          "expected_results": ""
+        },
+        "11": {
+          "action": "If you use the \"Edit columns\" menu to hide the column with the applied sorting, we revert the sorting to the default sorting (i.e. \"Package\"). The default sorting always uses one of the core columns, which cannot be hidden using the \"Edit columns\" menu.  Bug 5919 is filed for the issue.  ",
+          "expected_results": ""
+        },
+        "12": {
+          "action": "Searching should have no impact on the applied sorting. Any results returned should be sorted by the sorting criteria selected when the search query was submitted. Sort packages by size and search a string. Observe that results returned should be sorted by size.",
+          "expected_results": "NA"
+        }
+      },
+      "summary": "packages:_Sort_the_content_of_the_packages_table"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.packages:_Customise_the_columns_of_the_packages_table",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start with a default Yocto project (qemux86), start the Toaster, and build \"bitbake core-image-minimal\". ",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "In Toaster, select the build, and select the \"Packages\" link in the left sidebar. ",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Observe that by default the \"built packages\" table is sorted by \"Package\" in ascending alphabetical order (A to Z). ",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Select 1 column in \"Edit column\" to show the column. ",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Deselect 1 column in \"Edit column\" to hide 1 column by \"Edit columns\".",
+          "expected_results": "NA"
+        }
+      },
+      "summary": "packages:_Customise_the_columns_of_the_packages_table"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.packages:_Search_the_content_of_the_packages_table",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start with a default Yocto project (qemux86), start the Toaster, and build \"bitbake core-image-minimal\". ",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "In Toaster, select the build, and select the \"Packages\" link in the left sidebar. ",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Observe that by default the \"built packages\" table is sorted by \"Package\" in ascending alphabetical order (A to Z). ",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "When no search query has been entered, we have placeholder text saying: \"Search packages built\". The placeholder text disappears when the first character is typed. ",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "When a search query has been submitted and results returned: ▪ We keep the search string in the text input field. ▪ We provide a \"Clear search\" icon (icon-remove-sign). Click it to clear the search and display all packages. ▪ We change the page heading to indicate the number of results returned by the search query. ",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "If your search query returns no results, the page heading changes to \"No packages found\", and we show you an alert with a search form and an option to show all packages. ",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "Searching does not change the state of the table: the same columns remain hidden and the same sorting applied. ",
+          "expected_results": ""
+        },
+        "8": {
+          "action": "When I run a search, the search happens against the following columns (independently of they being shown or hidden): - Package - Package version - License - Recipe - Recipe version - Layer - Layer branch - Layer commit ",
+          "expected_results": ""
+        },
+        "9": {
+          "action": "Hide all columns except \"Package\" and \"Package version\". Search a string which is included in other hidden columns, not the 2 columns. See if returned results occur. ",
+          "expected_results": ""
+        },
+        "10": {
+          "action": "In Toaster, select the build, and select the \"core-image*\" link in the left sidebar. Observe that by default the \"included packages\" table is sorted by \"Package\" in ascending alphabetical order (A to Z). Rerun tests according to step 4~9.",
+          "expected_results": "NA"
+        }
+      },
+      "summary": "packages:_Search_the_content_of_the_packages_table"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.View_detailed_information_about_a_layer",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start with a default Yocto project (qemux86), start the Toaster, and build \"bitbake core-image-minimal\". \n\n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Make sure that layer information is shown in: \n* recipes table \n    All builds-> core-image-minimal-> recipes \n    Select \"Layer\", \"Layer branch\", \"Layer commit\" in Edit columns and observe the 3 columns are showed. Note that the \"Layer branch\" column can be empty.   \n\n* recipe details  \n    All builds-> core-image-minimal-> recipes \n    Click a recipe and you can see \"Layer\", \"Layer branch\", \"Layer commit\", \"Recipe details\" information.  Note that \"Layer branch\" is not required. If there is no layer branch, you should not see the \"Layer branch\" item on the list.",
+          "expected_results": "NA"
+        },
+        "3": {
+          "action": "built packages table \n    All builds-> core-image-minimal-> packages \n    Select \"Layer\", \"Layer branch\", \"Layer commit\"  in Edit columns and observer the 3 columns is showed. Note that the \"Layer branch\" column can be empty.   \n\n* built package details \n    All builds-> core-image-minimal-> packages \n    Click a package and you can see \"Layer\", \"Layer branch\", \"Layer commit\" in package information. Note that \"Layer branch\" is not required. If there is no layer branch, you should not see the \"Layer branch\" item on the list.  \n\n* image information \n     All builds-> core-image-minimal-> core-image-minimal(images) \n    Select \"Layer\", \"Layer branch\", \"Layer commit\" in Edit columns and observer the 3 columns is showed.",
+          "expected_results": "NA"
+        },
+        "4": {
+          "action": "Note that the \"Layer branch\" column can be empty.   \n\n* installed package details \n    All builds-> core-image-minimal-> core-image-minimal(images) \n    Click a package and you can see layer information in package information. Note that \"Layer branch\" is not required. If there is no layer branch, you should not see the \"Layer branch\" item on the list.  \n\n* configuration \n    All builds-> core-image-minimal-> Configuration \n    You can see \"Layer\", \"Layer branch\", \"Layer commit\"  in configuration summary. Note that the \"Layer branch\" column can be empty.  \n\n* build dashboard \n    All builds-> core-image-minimal \n    You can see \"Layers\" in build summary. ",
+          "expected_results": "NA"
+        }
+      },
+      "summary": "View_detailed_information_about_a_layer"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Select_the_number_of_table_rows_displayed_per_page",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start with a default Yocto project (qemux86), start the Toaster, and build \"bitbake core-image-minimal\". ",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "In Toaster, select the build, and select the \"Packages\" link in the left sidebar. ",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Users can select the number of rows they want to see in a table using the \"Show rows\" dropdown menu, which displays above and below each table. The options of the \"Show rows\" dropdown are: 10, 25, 50, 100, 150. ",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "The last selected option from the \"Show rows\" menu should be remembered:  * Select one option, for example 10 * Click on a package name to navigate away from the built packages table * Click on the \"Packages\" link in the breadcrumb at the top of the page to go back to the packages table  Note that 25 is still selected in the \"Show rows\" menu.  ",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Observe that the pagination widget is made of: - A \"Previous\" button - A \"Next\" button - A maximum of 5 page buttons.  ",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "See the pagination function of \"Tasks\", \"Recipes\" links according to steps 3~4.",
+          "expected_results": "Expected result for step 4: This widget has no previous or next button if testing in toaster 2.2. see Bug 9831"
+        }
+      },
+      "summary": "Select_the_number_of_table_rows_displayed_per_page"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.View_detailed_configuration_information_for_a_build",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start with a default Yocto project (qemux86), start the Toaster, and build \"bitbake core-image-minimal\". ",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "In Toaster, select the build, and select the \"Configuration\" link in the left sidebar. ",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Observe that the configuration page has 2 tabs: - Summary - BitBake variables The Summary tab is the default tab. ",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "The following content is included in summary tab.  (1) Build configuration  (2) Layers (Layer, Layer branch - if any, Layer commit) ",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Observe that \"BitBake variables\" tab includes \"Variable\", \"Value\", \" Set in file\", \"Description\" columns. ",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "Click filter button of \"Set in file\" column. Select \"Local configuration variables\" and click \"Apply\" button to see if filter function works well. ",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "In the \"Edit columns\" menu, table columns appear listed alphabetically: Description, Set in file, Value, Variable ",
+          "expected_results": ""
+        },
+        "8": {
+          "action": "The minimum table is made of the \"Variable\" and \"Value\" columns. ",
+          "expected_results": ""
+        },
+        "9": {
+          "action": "Click a variable and a \"History of ${variable}\" dialog will occur. The modal dialog shows the variable value followed by the history table, which has the following columns: - Order: indicates the sequence in which the files set the variable - Configuration file: the location in disk of the file that set the variable - Operation: the value of the operation field as stored in the database. - Line number: the line number where the operation is performed in the configuration file.  For such variables, whose value is an empty string, the Value cell in the variables table isempty, which is probably the right thing. In the modal, instead of the variable value, we show an alert (with the class .alert-info) saying: \"The value of  is an empty string\"  ",
+          "expected_results": ""
+        },
+        "10": {
+          "action": "Click arrow links in description tab to see linking variables to the Yocto Project reference manual.",
+          "expected_results": "NA"
+        }
+      },
+      "summary": "View_detailed_configuration_information_for_a_build"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.variables:_Customise_the_columns_of_the_bitbake_variables_table",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start with a default Yocto project (qemux86), start the Toaster, and build \"bitbake core-image-minimal\". ",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "In Toaster, select the build, and select the \"Configuration\" link in the left sidebar. Then click \"BitBake variables\" tab. ",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Show or hide columns by select or deselect options of \"Edit columns\".",
+          "expected_results": "NA"
+        }
+      },
+      "summary": "variables:_Customise_the_columns_of_the_bitbake_variables_table"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.variables:_Filter_the_content_of_the_bitbake_variables_table",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start with a default Yocto project (qemux86), start the Toaster, and build \"bitbake core-image-minimal\". \n \n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "In Toaster, select the build, and select the \"Configuration\" link in the left sidebar. Then click \"BitBake variables\" tab. \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Observe \"Set in file\" and \"Description\" columns have filters. \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Filters are mutually exclusive. Only one column filter can be applied to a table at any given time.  \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Filters are overridden by search. \nThe scope of the filters is the content currently on the table. \nThe scope of the search is always the full content of the database. \nSo: \n- if I run a search query, any filter applied afterwards will filter the content returned by the search query. \nSearch a string and apply a filter. Observe it would filter the content returned by the search query.  \n\n- if I run a search query while a filter is applied, the filter is overridden by the results of the search query. \nApply a filter and search a string. Observe that the previous filtered result is overridden by the search. ",
+          "expected_results": "NA"
+        }
+      },
+      "summary": "variables:_Filter_the_content_of_the_bitbake_variables_table"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.View_and_navigate_the_full_directory_structure_of_built_images",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start with a default Yocto project (qemux86), start the Toaster, and build \"bitbake core-image-minimal\".  \n \n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "In Toaster, select the build, and select the \"core-image-minimal\" link in the left sidebar.  \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Observe image information page has 2 tabs: \n- Packages included: this tab shows a table with all the packages installed in the image. The tab label includes the total number of packages listed in the table and their size. \n- Directory structure: this tab shows all the files included in the image.  \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "By default, the included packages table displays the following columns in this order: \nPackage, Package version, Size, Dependencies  \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Apart from the columns shown by default, the following additional columns are also available to users via the \"Edit columns\" menu: \nLayer, Layer branch, Layer commit, License, Recipe, Recipe version.  \n\n",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "The minimum table is made of the 2 columns that provide the information needed to identify a package: Package and Package version.  \n\n",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "By default, the directory structure table shows the top level directories and files in the file system.\nThe table includes the following columns: \nDirectory/File, Symbolic link to, Source package, Size, Permissions, Owner, Group \nOpen some directories and see files. ",
+          "expected_results": "NA"
+        }
+      },
+      "summary": "View_and_navigate_the_full_directory_structure_of_built_images"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.View_a_summary_of_all_the_information_available_for_a_build",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start with a default Yocto project (qemux86), start the Toaster, and build \"bitbake core-image-minimal\".  \n \n",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "In Toaster, select the build.  \n\n",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "A 'Build dashboard' page is showed. \nThe 'Build dashboard' page has two main states: \n(1) Success state: when the build completes successfully. In the success state, if the build target(s) include an image recipe, the page displays an image content module, and the left navigation has an \"Images\" section at the top. \n(2) Fail state: when the build fails (shown in this page). In the fail state, the page always displays an errors content module, and the left navigation does not have an \"Images\" section at the top.  \n\n",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Observe that the page provides access to all information available for the selected build. \n(1) Images \n(2) Build: this group provides links to the following pages: \nConfiguration, Tasks, Recipes, Packages \n(3) Performance: this group provides links to the following pages: \nTime, CPU usage, Disk I/O  \n\n",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "The page heading is made of the build target(s) and the machine, such as \"core-image-minimal qemux86\". If the build has more than one target, they show in ascending alphabetical order (A to Z) both in the page heading and in the \"Images\" section of the left navigation. If the build was successful, there is an image content module for each target that is an image recipe. The modules also show in ascending alphabetical order by target name. \n\n",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "Packages included, total package size, license manifest, image files are included in the images section.  \n\n",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "The information of Machine, Distro, Layers is included in configuration content module of \"Build summary\" section. \nThe information of \"Total number of task\", \"Tasks executed\", \" Tasks not executed\", \"Reuse\" is included in the tasks content module. \nThe information of \"Recipes built\" and \"Packages built\" is included in the \"Recipes&Packages\" content module. ",
+          "expected_results": "NA"
+        }
+      },
+      "summary": "View_a_summary_of_all_the_information_available_for_a_build"
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Display_the_content_of_error_messages_and_warnings",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start with a default Yocto project (qemux86), start the Toaster, and create a successful build and a failed build. You can force a build to terminate by ctrl+c. ",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "Observe that the number of errors and warnings thrown by a build shows in both 'All builds' page and the 'Latest builds' section. ",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Observe that the number and content of errors and warnings thrown by a build shows in the 'Build dashboard' page. ",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Click warning or error links to see warning and error details.  ",
+          "expected_results": "NA"
+        }
+      },
+      "summary": "Display_the_content_of_error_messages_and_warnings."
+    }
+  },
+  {
+    "test": {
+      "@alias": "toaster.toaster.Build_summary_information_fully_implemented",
+      "author": [
+        {
+          "email": "Yuan.Sun2@windriver.com",
+          "name": "Yuan.Sun2@windriver.com"
+        }
+      ],
+      "execution": {
+        "1": {
+          "action": "Start with a default Yocto project (qemux86), start the Toaster, and create 4 builds. \na) a successful build with images (bitbake core-image-minimal) \nb) a successful build without images (bitbake mtools-native) \nc) a failed build with errors and warnings (run \"bitbake core-image-sato\", then press control+c to terminate the build)",
+          "expected_results": ""
+        },
+        "2": {
+          "action": "In Toaster, select a core-image-minimal build.",
+          "expected_results": ""
+        },
+        "3": {
+          "action": "Observe that there is a 'Build dashboard' page captured by Toaster. The page does not exist for builds in progress, only for finished builds. \nThe 'Build dashboard' page is made of: \na) Breadcrumb \nb) Navigation \n    IMAGES: core-image-minimal \n    BUILD: \n        Configuration \n        Tasks \n        Recipes \n        Packages \n    PERFORMANCE: \n        Time \n        CPU usage \n        Disk I/O \nc) Page heading (core-image-minimal qemux86) \nd) Section heading (Images, Build summary) \ne) Build status notification (Completed on xx/xx/xx... Build time:xx:xx:xx)",
+          "expected_results": ""
+        },
+        "4": {
+          "action": "Observe \"images\" section is made of the following \n.\na) Heading: core-image-minimal, which links to the \"Packages included\" tab of the image information page \nb) Number of packages installed: (packages included xx), which is a link to the \"Packages included\" tab of the image information page \nc) Total installed package size: xxMB \nd) License manifest (which is a link to the \"Packages included\" tab of the information page with the following columns showing: \"Package\", \"Package version\", \"License\" and \"Recipe\". We have bug 6079 open for this). Next to the license manifest is the path to the directory where you can find the license manifest file.  \n \ne) Image files (rootfs file names and rootfs file sizes)",
+          "expected_results": ""
+        },
+        "5": {
+          "action": "Observe \"Build summary\" section is made of the following. \na) Configuration (which is a link to the configuration page): \n    Machine \n    Distro \n    Layers (sorted in alphabetical order) \nb) Tasks (which is a link to the tasks page) \n    Total number of tasks (which is a link to the tasks page) \n    Tasks executed (which is a link to the tasks page with the tasks executed filter applied) \n    Tasks not executed (which is a link to the tasks pages with the tasks not executed filter applied)\n    Reuse \nc) Note that \"Total number of tasks\" should equal number of \"Tasks executed\" +  number of \"Tasks not executed\" \nd) Recipes (which is a link to the recipes page) & Packages (which is a link to the packages built page) ",
+          "expected_results": ""
+        },
+        "6": {
+          "action": "  Number of recipes built (which is a link to the recipes page)  \n \n    Number of packages built (which is a link to the packages built page)",
+          "expected_results": ""
+        },
+        "7": {
+          "action": "Return to localhost:8000 and select a successful build without images (mtools-native) \n.\nObserve the build dashboard for a successful build of a target that is not an image recipe. There is no image content module, and no \"Images\" section in the left navigation.",
+          "expected_results": ""
+        },
+        "8": {
+          "action": "Return to localhost:8000 and select the failed build (core-image-sato). Observe the build dashboard for the failed build.  \n \na) the errors content module: \nThis module exists for those builds that throw error(s). It appears immediately below the build status notification. \nThe module has 2 states: \n▪ Expanded (shows number of errors and error content) \n▪ Collapsed (shows only the number of errors) \nBy default, the errors module is in the expanded state. \nErrors content modules include the following information: \n(1.1) A heading, which indicates the number of errors thrown by the build, and toggles the module between its 2 states on click. ",
+          "expected_results": "NA"
+        },
+        "9": {
+          "action": "Transitions between states should use a slide up / slide down animation. \n(1.2) Error(s) content  \n\nb) the warning content module: \nThis module exists for those builds that throw warning(s). \nIt is the last content module shown on the build dashboard. \nThe module has 2 states: \n▪ Expanded (shows number of warnings and warning content) \n▪ Collapsed (shows only the number of warnings) \nBy default, the warning module is in the collapsed state. Warnings content modules include the following information: \n(2.1) A heading, which indicates the number of warnings thrown by the build, and toggles the module between its 2 \nstates on click. Transitions between states should use a slide up / slide down animation. \n(2.2) Warning(s) content ",
+          "expected_results": "NA"
+        }
+      },
+      "summary": "Build_summary_information_fully_implemented"
+    }
+  }
+]
\ No newline at end of file
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 12/33] oeqa/manual/toaster: updated test id naming
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (10 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 11/33] oeqa/manual/toaster: transfer manual toaster test cases to oeqa Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 13/33] resulttool: Enable report for single result file Armin Kuster
                   ` (20 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Yeoh Ee Peng <ee.peng.yeoh@intel.com>

All test id (eg. @alias) inside manual testcase file shall follow the same
test id naming convention from oeqa automated tests (eg. selftest,
runtime, sdk, etc), where the test id consists of
<test_module>.<test_suite>.<test_function>. Furthermore, there shall be
only 1 unique test_module per each manual testcases file, where
test_module match the file name itself.

This file was using test_module name that does not match the file name
itself. Fixed test_module name as well as the test_suite name.

Signed-off-by: Yeoh Ee Peng <ee.peng.yeoh@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 meta/lib/oeqa/manual/toaster-managed-mode.json   | 130 +++++++++++------------
 meta/lib/oeqa/manual/toaster-unmanaged-mode.json |  56 +++++-----
 2 files changed, 93 insertions(+), 93 deletions(-)

diff --git a/meta/lib/oeqa/manual/toaster-managed-mode.json b/meta/lib/oeqa/manual/toaster-managed-mode.json
index ba0658f..812f57d 100644
--- a/meta/lib/oeqa/manual/toaster-managed-mode.json
+++ b/meta/lib/oeqa/manual/toaster-managed-mode.json
@@ -1,7 +1,7 @@
 [
   {
     "test": {
-      "@alias": "toaster.toaster.All_layers:_default_view",
+      "@alias": "toaster-managed-mode.toaster-managed.All_layers:_default_view",
       "author": [
         {
           "email": "stanciux.mihail@intel.com",
@@ -47,7 +47,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.All_layers:_Add/delete_layers",
+      "@alias": "toaster-managed-mode.toaster-managed.All_layers:_Add/delete_layers",
       "author": [
         {
           "email": "stanciux.mihail@intel.com",
@@ -85,7 +85,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.All_targets:_Default_view",
+      "@alias": "toaster-managed-mode.toaster-managed.All_targets:_Default_view",
       "author": [
         {
           "email": "stanciux.mihail@intel.com",
@@ -119,7 +119,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Configuration_variables:_default_view",
+      "@alias": "toaster-managed-mode.toaster-managed.Configuration_variables:_default_view",
       "author": [
         {
           "email": "stanciux.mihail@intel.com",
@@ -153,7 +153,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Configuration_variables:_Test_UI_elements",
+      "@alias": "toaster-managed-mode.toaster-managed.Configuration_variables:_Test_UI_elements",
       "author": [
         {
           "email": "stanciux.mihail@intel.com",
@@ -215,7 +215,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Project_builds:_Default_view",
+      "@alias": "toaster-managed-mode.toaster-managed.Project_builds:_Default_view",
       "author": [
         {
           "email": "stanciux.mihail@intel.com",
@@ -249,7 +249,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Project_builds:_Sorting_the_project_builds_table",
+      "@alias": "toaster-managed-mode.toaster-managed.Project_builds:_Sorting_the_project_builds_table",
       "author": [
         {
           "email": "stanciux.mihail@intel.com",
@@ -287,7 +287,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Project_builds:_customize_the_columns_of_the_table",
+      "@alias": "toaster-managed-mode.toaster-managed.Project_builds:_customize_the_columns_of_the_table",
       "author": [
         {
           "email": "stanciux.mihail@intel.com",
@@ -321,7 +321,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Project_builds:_filter_the_contents_of_the_table",
+      "@alias": "toaster-managed-mode.toaster-managed.Project_builds:_filter_the_contents_of_the_table",
       "author": [
         {
           "email": "stanciux.mihail@intel.com",
@@ -355,7 +355,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Project_builds:_search_the_contents_of_the_table",
+      "@alias": "toaster-managed-mode.toaster-managed.Project_builds:_search_the_contents_of_the_table",
       "author": [
         {
           "email": "stanciux.mihail@intel.com",
@@ -393,7 +393,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Layer_details_page:_Default_view",
+      "@alias": "toaster-managed-mode.toaster-managed.Layer_details_page:_Default_view",
       "author": [
         {
           "email": "stanciux.mihail@intel.com",
@@ -471,7 +471,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Layer_details_page:_UI_functionality",
+      "@alias": "toaster-managed-mode.toaster-managed.Layer_details_page:_UI_functionality",
       "author": [
         {
           "email": "stanciux.mihail@intel.com",
@@ -517,7 +517,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Importing_new_layers",
+      "@alias": "toaster-managed-mode.toaster-managed.Importing_new_layers",
       "author": [
         {
           "email": "stanciux.mihail@intel.com",
@@ -547,7 +547,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Layer_details_page:_UI_functionality_for_imported_layers",
+      "@alias": "toaster-managed-mode.toaster-managed.Layer_details_page:_UI_functionality_for_imported_layers",
       "author": [
         {
           "email": "stanciux.mihail@intel.com",
@@ -601,7 +601,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Multiple_build_directories",
+      "@alias": "toaster-managed-mode.toaster-managed.Multiple_build_directories",
       "author": [
         {
           "email": "stanciux.mihail@intel.com",
@@ -647,7 +647,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Run_again_button_from_all_builds_page_must_run_the_specified_task",
+      "@alias": "toaster-managed-mode.toaster-managed.Run_again_button_from_all_builds_page_must_run_the_specified_task",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -693,7 +693,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Intel_layers_builds",
+      "@alias": "toaster-managed-mode.toaster-managed.Intel_layers_builds",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -743,7 +743,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Download_other_artifacts",
+      "@alias": "toaster-managed-mode.toaster-managed.Download_other_artifacts",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -785,7 +785,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Download_licence_manifest",
+      "@alias": "toaster-managed-mode.toaster-managed.Download_licence_manifest",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -827,7 +827,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Test_dependencies_layers",
+      "@alias": "toaster-managed-mode.toaster-managed.Test_dependencies_layers",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -873,7 +873,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Test_build_recipe_button_from_recipes_page",
+      "@alias": "toaster-managed-mode.toaster-managed.Test_build_recipe_button_from_recipes_page",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -915,7 +915,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Test_compatible_machines",
+      "@alias": "toaster-managed-mode.toaster-managed.Test_compatible_machines",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -961,7 +961,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Builds_with_different_machines",
+      "@alias": "toaster-managed-mode.toaster-managed.Builds_with_different_machines",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -1007,7 +1007,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Test_bitbake_variables_-_IMAGE_FSTYPES",
+      "@alias": "toaster-managed-mode.toaster-managed.Test_bitbake_variables_-_IMAGE_FSTYPES",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -1049,7 +1049,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Software_recipes:_default_view",
+      "@alias": "toaster-managed-mode.toaster-managed.Software_recipes:_default_view",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -1083,7 +1083,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Software_recipes:_sorting_the_content_of_the_software_recipes_table",
+      "@alias": "toaster-managed-mode.toaster-managed.Software_recipes:_sorting_the_content_of_the_software_recipes_table",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -1129,7 +1129,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Software_recipes:_Searching_the_content_of_the_software_recipes_table",
+      "@alias": "toaster-managed-mode.toaster-managed.Software_recipes:_Searching_the_content_of_the_software_recipes_table",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -1179,7 +1179,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Software_recipes:_Filter_the_contents_of_the_software_recipes_table",
+      "@alias": "toaster-managed-mode.toaster-managed.Software_recipes:_Filter_the_contents_of_the_software_recipes_table",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -1213,7 +1213,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Test_the_packages_included_in_the_image",
+      "@alias": "toaster-managed-mode.toaster-managed.Test_the_packages_included_in_the_image",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -1259,7 +1259,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Test_the_filters_from_a_image_page",
+      "@alias": "toaster-managed-mode.toaster-managed.Test_the_filters_from_a_image_page",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -1301,7 +1301,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Test_dependencies_link",
+      "@alias": "toaster-managed-mode.toaster-managed.Test_dependencies_link",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -1351,7 +1351,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Test_recipe_file_link",
+      "@alias": "toaster-managed-mode.toaster-managed.Test_recipe_file_link",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -1393,7 +1393,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.See_packages_size",
+      "@alias": "toaster-managed-mode.toaster-managed.See_packages_size",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -1435,7 +1435,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Build_multiple_recipes",
+      "@alias": "toaster-managed-mode.toaster-managed.Build_multiple_recipes",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -1465,7 +1465,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Build_a_recipe_with_different_distro",
+      "@alias": "toaster-managed-mode.toaster-managed.Build_a_recipe_with_different_distro",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -1511,7 +1511,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Test_package_format_-_ipk_rpm_deb",
+      "@alias": "toaster-managed-mode.toaster-managed.Test_package_format_-_ipk_rpm_deb",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -1549,7 +1549,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Test_IMAGE_INSTALL_append_variable",
+      "@alias": "toaster-managed-mode.toaster-managed.Test_IMAGE_INSTALL_append_variable",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -1595,7 +1595,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.New_custom_image:_default_view",
+      "@alias": "toaster-managed-mode.toaster-managed.New_custom_image:_default_view",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -1637,7 +1637,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.New_custom_image:_sorting_the_content_of_new_custom_image_table",
+      "@alias": "toaster-managed-mode.toaster-managed.New_custom_image:_sorting_the_content_of_new_custom_image_table",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -1687,7 +1687,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.New_custom_image:_searching_the_content_of_new_custom_image_table",
+      "@alias": "toaster-managed-mode.toaster-managed.New_custom_image:_searching_the_content_of_new_custom_image_table",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -1733,7 +1733,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.New_custom_image:_Filter_the_contents_of_the_new_custom_image_table",
+      "@alias": "toaster-managed-mode.toaster-managed.New_custom_image:_Filter_the_contents_of_the_new_custom_image_table",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -1767,7 +1767,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Create_new_custom_image",
+      "@alias": "toaster-managed-mode.toaster-managed.Create_new_custom_image",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -1805,7 +1805,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Custom_image_page_details",
+      "@alias": "toaster-managed-mode.toaster-managed.Custom_image_page_details",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -1839,7 +1839,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Custom_image_page_–_Add_|_Remove_packages_table",
+      "@alias": "toaster-managed-mode.toaster-managed.Custom_image_page_–_Add_|_Remove_packages_table",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
@@ -1901,7 +1901,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Adding_packages_without_dependencies_from_custom_images",
+      "@alias": "toaster-managed-mode.toaster-managed.Adding_packages_without_dependencies_from_custom_images",
       "author": [
         {
           "email": "libertad.gonzalez.de.la.cruz@intel.com",
@@ -1935,7 +1935,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Removing_packages_without_and_with_dependencies__from_custom_images",
+      "@alias": "toaster-managed-mode.toaster-managed.Removing_packages_without_and_with_dependencies__from_custom_images",
       "author": [
         {
           "email": "libertad.gonzalez.de.la.cruz@intel.com",
@@ -1969,7 +1969,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Adding_packages_with_dependencies",
+      "@alias": "toaster-managed-mode.toaster-managed.Adding_packages_with_dependencies",
       "author": [
         {
           "email": "libertad.gonzalez.de.la.cruz@intel.com",
@@ -2003,7 +2003,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Create_Project",
+      "@alias": "toaster-managed-mode.toaster-managed.Create_Project",
       "author": [
         {
           "email": "libertad.gonzalez.de.la.cruz@intel.com",
@@ -2029,7 +2029,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Verify_project_detail_page_left_bar_menu",
+      "@alias": "toaster-managed-mode.toaster-managed.Verify_project_detail_page_left_bar_menu",
       "author": [
         {
           "email": "libertad.gonzalez.de.la.cruz@intel.com",
@@ -2059,7 +2059,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Configuration_information_of_Project_Detail_page",
+      "@alias": "toaster-managed-mode.toaster-managed.Configuration_information_of_Project_Detail_page",
       "author": [
         {
           "email": "libertad.gonzalez.de.la.cruz@intel.com",
@@ -2089,7 +2089,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Verify_Machine_information_of_project_detail_page",
+      "@alias": "toaster-managed-mode.toaster-managed.Verify_Machine_information_of_project_detail_page",
       "author": [
         {
           "email": "libertad.gonzalez.de.la.cruz@intel.com",
@@ -2115,7 +2115,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Verify_most_built_recipes_information_of_the_project_detail_page",
+      "@alias": "toaster-managed-mode.toaster-managed.Verify_most_built_recipes_information_of_the_project_detail_page",
       "author": [
         {
           "email": "libertad.gonzalez.de.la.cruz@intel.com",
@@ -2141,7 +2141,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Verify_project_release_information_on_project_detail_page",
+      "@alias": "toaster-managed-mode.toaster-managed.Verify_project_release_information_on_project_detail_page",
       "author": [
         {
           "email": "libertad.gonzalez.de.la.cruz@intel.com",
@@ -2167,7 +2167,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Verify_layer_information_of_the_project_detail_page",
+      "@alias": "toaster-managed-mode.toaster-managed.Verify_layer_information_of_the_project_detail_page",
       "author": [
         {
           "email": "libertad.gonzalez.de.la.cruz@intel.com",
@@ -2197,7 +2197,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Verify_project_detail_links",
+      "@alias": "toaster-managed-mode.toaster-managed.Verify_project_detail_links",
       "author": [
         {
           "email": "libertad.gonzalez.de.la.cruz@intel.com",
@@ -2223,7 +2223,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Verify_build_texbox_exists_and_works",
+      "@alias": "toaster-managed-mode.toaster-managed.Verify_build_texbox_exists_and_works",
       "author": [
         {
           "email": "libertad.gonzalez.de.la.cruz@intel.com",
@@ -2253,7 +2253,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Veryfing_the_builds_link_show_proper_information",
+      "@alias": "toaster-managed-mode.toaster-managed.Veryfing_the_builds_link_show_proper_information",
       "author": [
         {
           "email": "libertad.gonzalez.de.la.cruz@intel.com",
@@ -2279,7 +2279,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Verify_that_the_Import_layer_link_shows_the_form",
+      "@alias": "toaster-managed-mode.toaster-managed.Verify_that_the_Import_layer_link_shows_the_form",
       "author": [
         {
           "email": "libertad.gonzalez.de.la.cruz@intel.com",
@@ -2305,7 +2305,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Verify_that_New_Custom_Image_link_works_and_shows_information",
+      "@alias": "toaster-managed-mode.toaster-managed.Verify_that_New_Custom_Image_link_works_and_shows_information",
       "author": [
         {
           "email": "libertad.gonzalez.de.la.cruz@intel.com",
@@ -2331,7 +2331,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Verify_most_built_recipe_shows_a_maximum_of_5_recipes",
+      "@alias": "toaster-managed-mode.toaster-managed.Verify_most_built_recipe_shows_a_maximum_of_5_recipes",
       "author": [
         {
           "email": "libertad.gonzalez.de.la.cruz@intel.com",
@@ -2365,7 +2365,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Verify_order_sequence_of_listing_in_Most_build_recipes",
+      "@alias": "toaster-managed-mode.toaster-managed.Verify_order_sequence_of_listing_in_Most_build_recipes",
       "author": [
         {
           "email": "libertad.gonzalez.de.la.cruz@intel.com",
@@ -2403,7 +2403,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Verify_Most_build_recipes_multiple_selection",
+      "@alias": "toaster-managed-mode.toaster-managed.Verify_Most_build_recipes_multiple_selection",
       "author": [
         {
           "email": "libertad.gonzalez.de.la.cruz@intel.com",
@@ -2449,7 +2449,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Verify_layer_addition_functionality",
+      "@alias": "toaster-managed-mode.toaster-managed.Verify_layer_addition_functionality",
       "author": [
         {
           "email": "libertad.gonzalez.de.la.cruz@intel.com",
@@ -2487,7 +2487,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Verify_delete_layer_functionality",
+      "@alias": "toaster-managed-mode.toaster-managed.Verify_delete_layer_functionality",
       "author": [
         {
           "email": "libertad.gonzalez.de.la.cruz@intel.com",
@@ -2521,7 +2521,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Download_task_log",
+      "@alias": "toaster-managed-mode.toaster-managed.Download_task_log",
       "author": [
         {
           "email": "alexandru.costinx.roman@intel.com",
diff --git a/meta/lib/oeqa/manual/toaster-unmanaged-mode.json b/meta/lib/oeqa/manual/toaster-unmanaged-mode.json
index e614b14..29d11a8 100644
--- a/meta/lib/oeqa/manual/toaster-unmanaged-mode.json
+++ b/meta/lib/oeqa/manual/toaster-unmanaged-mode.json
@@ -1,7 +1,7 @@
 [
   {
     "test": {
-      "@alias": "toaster.toaster.Create_a_Yocto_project_and_start_the_Toaster",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.Create_a_Yocto_project_and_start_the_Toaster",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -31,7 +31,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Sort_the_content_of_the_builds_table",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.Sort_the_content_of_the_builds_table",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -69,7 +69,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Search_the_content_of_the_builds_table",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.Search_the_content_of_the_builds_table",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -107,7 +107,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Filter_the_content_of_the_builds_table",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.Filter_the_content_of_the_builds_table",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -149,7 +149,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Tasks_in_toaster_UI",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.Tasks_in_toaster_UI",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -231,7 +231,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.package_detail_in_toaster_UI",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.package_detail_in_toaster_UI",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -285,7 +285,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.recipes:_Sort_the_content_of_the_recipes_table",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.recipes:_Sort_the_content_of_the_recipes_table",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -327,7 +327,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.recipes:_Search_the_content_of_the_recipes_table",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.recipes:_Search_the_content_of_the_recipes_table",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -385,7 +385,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.recipes:_Customise_the_columns_of_the_recipes_table",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.recipes:_Customise_the_columns_of_the_recipes_table",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -411,7 +411,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.recipes:_View_a_table_with_all_the_recipes_included_in_an_image_recipe",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.recipes:_View_a_table_with_all_the_recipes_included_in_an_image_recipe",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -441,7 +441,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.recipes:_View_detailed_information_about_a_recipe。",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.recipes:_View_detailed_information_about_a_recipe。",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -495,7 +495,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.variables:_Search_the_content_of_the_bitbake_variables_table",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.variables:_Search_the_content_of_the_bitbake_variables_table",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -545,7 +545,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.variables:_Sort_the_content_of_the_bitbake_variables_table",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.variables:_Sort_the_content_of_the_bitbake_variables_table",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -579,7 +579,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.builds:_View_a_table_of_all_the_builds_run_for_a_certain_build_directory",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.builds:_View_a_table_of_all_the_builds_run_for_a_certain_build_directory",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -605,7 +605,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.builds:_Customise_the_columns_of_the_builds_table",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.builds:_Customise_the_columns_of_the_builds_table",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -635,7 +635,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.packages:_View_a_table_with_all_the_packages_built_for_an_image_recipe",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.packages:_View_a_table_with_all_the_packages_built_for_an_image_recipe",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -673,7 +673,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.packages:_Sort_the_content_of_the_packages_table",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.packages:_Sort_the_content_of_the_packages_table",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -735,7 +735,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.packages:_Customise_the_columns_of_the_packages_table",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.packages:_Customise_the_columns_of_the_packages_table",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -769,7 +769,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.packages:_Search_the_content_of_the_packages_table",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.packages:_Search_the_content_of_the_packages_table",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -823,7 +823,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.View_detailed_information_about_a_layer",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.View_detailed_information_about_a_layer",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -853,7 +853,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Select_the_number_of_table_rows_displayed_per_page",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.Select_the_number_of_table_rows_displayed_per_page",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -891,7 +891,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.View_detailed_configuration_information_for_a_build",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.View_detailed_configuration_information_for_a_build",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -945,7 +945,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.variables:_Customise_the_columns_of_the_bitbake_variables_table",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.variables:_Customise_the_columns_of_the_bitbake_variables_table",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -971,7 +971,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.variables:_Filter_the_content_of_the_bitbake_variables_table",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.variables:_Filter_the_content_of_the_bitbake_variables_table",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -1005,7 +1005,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.View_and_navigate_the_full_directory_structure_of_built_images",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.View_and_navigate_the_full_directory_structure_of_built_images",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -1047,7 +1047,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.View_a_summary_of_all_the_information_available_for_a_build",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.View_a_summary_of_all_the_information_available_for_a_build",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -1089,7 +1089,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Display_the_content_of_error_messages_and_warnings",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.Display_the_content_of_error_messages_and_warnings",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
@@ -1119,7 +1119,7 @@
   },
   {
     "test": {
-      "@alias": "toaster.toaster.Build_summary_information_fully_implemented",
+      "@alias": "toaster-unmanaged-mode.toaster-unmanaged.Build_summary_information_fully_implemented",
       "author": [
         {
           "email": "Yuan.Sun2@windriver.com",
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 13/33] resulttool: Enable report for single result file
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (11 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 12/33] oeqa/manual/toaster: updated test id naming Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 14/33] resulttool: Allow store to work on single files Armin Kuster
                   ` (19 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Yeoh Ee Peng <ee.peng.yeoh@intel.com>

Current validation check function inside resulttool disallow the
report for single result file although the underlying library
was able to handle both directory and file as source input to report.
Removed the validation check as it was no longer needed and to
enable report for single result file.

Signed-off-by: Yeoh Ee Peng <ee.peng.yeoh@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 scripts/resulttool | 10 ----------
 1 file changed, 10 deletions(-)

diff --git a/scripts/resulttool b/scripts/resulttool
index 5a89e1c..18ac101 100755
--- a/scripts/resulttool
+++ b/scripts/resulttool
@@ -51,13 +51,6 @@ import resulttool.report
 import resulttool.manualexecution
 logger = scriptutils.logger_create('resulttool')
 
-def _validate_user_input_arguments(args):
-    if hasattr(args, "source_dir"):
-        if not os.path.isdir(args.source_dir):
-            logger.error('source_dir argument need to be a directory : %s' % args.source_dir)
-            return False
-    return True
-
 def main():
     parser = argparse_oe.ArgumentParser(description="OEQA test result manipulation tool.",
                                         epilog="Use %(prog)s <subcommand> --help to get help on a specific command")
@@ -80,9 +73,6 @@ def main():
     elif args.quiet:
         logger.setLevel(logging.ERROR)
 
-    if not _validate_user_input_arguments(args):
-        return -1
-
     try:
         ret = args.func(args, logger)
     except argparse_oe.ArgumentUsageError as ae:
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 14/33] resulttool: Allow store to work on single files
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (12 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 13/33] resulttool: Enable report for single result file Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 15/33] resulttool: Allow extraction of ptest data Armin Kuster
                   ` (18 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Richard Purdie <richard.purdie@linuxfoundation.org>

Store operations using a single file as a source weren't working as the os.walk
command didn't like being given a single file. Fix the store operation to
work for single files.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 scripts/lib/resulttool/store.py | 21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/scripts/lib/resulttool/store.py b/scripts/lib/resulttool/store.py
index 5e33716..3a81933 100644
--- a/scripts/lib/resulttool/store.py
+++ b/scripts/lib/resulttool/store.py
@@ -29,15 +29,18 @@ def store(args, logger):
     try:
         results = {}
         logger.info('Reading files from %s' % args.source)
-        for root, dirs,  files in os.walk(args.source):
-            for name in files:
-                f = os.path.join(root, name)
-                if name == "testresults.json":
-                    resultutils.append_resultsdata(results, f)
-                elif args.all:
-                    dst = f.replace(args.source, tempdir + "/")
-                    os.makedirs(os.path.dirname(dst), exist_ok=True)
-                    shutil.copyfile(f, dst)
+        if os.path.isfile(args.source):
+            resultutils.append_resultsdata(results, args.source)
+        else:
+            for root, dirs,  files in os.walk(args.source):
+                for name in files:
+                    f = os.path.join(root, name)
+                    if name == "testresults.json":
+                        resultutils.append_resultsdata(results, f)
+                    elif args.all:
+                        dst = f.replace(args.source, tempdir + "/")
+                        os.makedirs(os.path.dirname(dst), exist_ok=True)
+                        shutil.copyfile(f, dst)
 
         revisions = {}
 
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 15/33] resulttool: Allow extraction of ptest data
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (13 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 14/33] resulttool: Allow store to work on single files Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 16/33] resulttool/manualexecution: Standardize input check Armin Kuster
                   ` (17 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Richard Purdie <richard.purdie@linuxfoundation.org>

Rather than simply discarding the ptest data, change the code to discard
it when writing out the new testresult files, or optionally either preserve
it, or write it as seperate discrete logs.

This means the autobuilder should start writing out individual ptest log
files as well as allowing ueers to extract these manually.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 scripts/lib/resulttool/resultutils.py | 39 ++++++++++++++++++++++++++++-------
 scripts/lib/resulttool/store.py       |  2 +-
 2 files changed, 32 insertions(+), 9 deletions(-)

diff --git a/scripts/lib/resulttool/resultutils.py b/scripts/lib/resulttool/resultutils.py
index 153f2b8..ad40ac8 100644
--- a/scripts/lib/resulttool/resultutils.py
+++ b/scripts/lib/resulttool/resultutils.py
@@ -15,6 +15,7 @@
 import os
 import json
 import scriptpath
+import copy
 scriptpath.add_oe_lib_path()
 
 flatten_map = {
@@ -60,12 +61,6 @@ def append_resultsdata(results, f, configmap=store_map):
         testpath = "/".join(data[res]["configuration"].get(i) for i in configmap[testtype])
         if testpath not in results:
             results[testpath] = {}
-        if 'ptestresult.rawlogs' in data[res]['result']:
-            del data[res]['result']['ptestresult.rawlogs']
-        if 'ptestresult.sections' in data[res]['result']:
-            for i in data[res]['result']['ptestresult.sections']:
-                if 'log' in data[res]['result']['ptestresult.sections'][i]:
-                    del data[res]['result']['ptestresult.sections'][i]['log']
         results[testpath][res] = data[res]
 
 #
@@ -93,15 +88,43 @@ def filter_resultsdata(results, resultid):
                  newresults[r][i] = results[r][i]
     return newresults
 
-def save_resultsdata(results, destdir, fn="testresults.json"):
+def strip_ptestresults(results):
+    newresults = copy.deepcopy(results)
+    #for a in newresults2:
+    #  newresults = newresults2[a]
+    for res in newresults:
+        if 'result' not in newresults[res]:
+            continue
+        if 'ptestresult.rawlogs' in newresults[res]['result']:
+            del newresults[res]['result']['ptestresult.rawlogs']
+        if 'ptestresult.sections' in newresults[res]['result']:
+            for i in newresults[res]['result']['ptestresult.sections']:
+                if 'log' in newresults[res]['result']['ptestresult.sections'][i]:
+                    del newresults[res]['result']['ptestresult.sections'][i]['log']
+    return newresults
+
+def save_resultsdata(results, destdir, fn="testresults.json", ptestjson=False, ptestlogs=False):
     for res in results:
         if res:
             dst = destdir + "/" + res + "/" + fn
         else:
             dst = destdir + "/" + fn
         os.makedirs(os.path.dirname(dst), exist_ok=True)
+        resultsout = results[res]
+        if not ptestjson:
+            resultsout = strip_ptestresults(results[res])
         with open(dst, 'w') as f:
-            f.write(json.dumps(results[res], sort_keys=True, indent=4))
+            f.write(json.dumps(resultsout, sort_keys=True, indent=4))
+        for res2 in results[res]:
+            if ptestlogs and 'result' in results[res][res2]:
+                if 'ptestresult.rawlogs' in results[res][res2]['result']:
+                    with open(dst.replace(fn, "ptest-raw.log"), "w+") as f:
+                        f.write(results[res][res2]['result']['ptestresult.rawlogs']['log'])
+                if 'ptestresult.sections' in results[res][res2]['result']:
+                    for i in results[res][res2]['result']['ptestresult.sections']:
+                        if 'log' in results[res][res2]['result']['ptestresult.sections'][i]:
+                            with open(dst.replace(fn, "ptest-%s.log" % i), "w+") as f:
+                                f.write(results[res][res2]['result']['ptestresult.sections'][i]['log'])
 
 def git_get_result(repo, tags):
     git_objs = []
diff --git a/scripts/lib/resulttool/store.py b/scripts/lib/resulttool/store.py
index 3a81933..e4a0807 100644
--- a/scripts/lib/resulttool/store.py
+++ b/scripts/lib/resulttool/store.py
@@ -68,7 +68,7 @@ def store(args, logger):
             results = revisions[r]
             keywords = {'commit': r[0], 'branch': r[1], "commit_count": r[2]}
             subprocess.check_call(["find", tempdir, "!", "-path", "./.git/*", "-delete"])
-            resultutils.save_resultsdata(results, tempdir)
+            resultutils.save_resultsdata(results, tempdir, ptestlogs=True)
 
             logger.info('Storing test result into git repository %s' % args.git_dir)
 
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 16/33] resulttool/manualexecution: Standardize input check
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (14 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 15/33] resulttool: Allow extraction of ptest data Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 17/33] resulttool/manualexecution: Enable display full steps without press enter Armin Kuster
                   ` (16 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Yeoh Ee Peng <ee.peng.yeoh@intel.com>

Current input checking does not match the standard input practiced
by QA team. Change the input checking to match the standard
input practiced by the QA team.

Signed-off-by: Yeoh Ee Peng <ee.peng.yeoh@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 scripts/lib/resulttool/manualexecution.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/scripts/lib/resulttool/manualexecution.py b/scripts/lib/resulttool/manualexecution.py
index 6487cd9..8ce7903 100755
--- a/scripts/lib/resulttool/manualexecution.py
+++ b/scripts/lib/resulttool/manualexecution.py
@@ -45,9 +45,9 @@ class ManualTestRunner(object):
     def _get_input(self, config):
         while True:
             output = input('{} = '.format(config))
-            if re.match('^[a-zA-Z0-9_-]+$', output):
+            if re.match('^[a-z0-9-.]+$', output):
                 break
-            print('Only alphanumeric and underscore/hyphen are allowed. Please try again')
+            print('Only lowercase alphanumeric, hyphen and dot are allowed. Please try again')
         return output
 
     def _create_config(self):
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 17/33] resulttool/manualexecution: Enable display full steps without press enter
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (15 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 16/33] resulttool/manualexecution: Standardize input check Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 18/33] resulttool/manualexecution: Fixed step sorted by integer Armin Kuster
                   ` (15 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Yeoh Ee Peng <ee.peng.yeoh@intel.com>

Current manualexecution required pressing enter button to show each step
information, where this was wasting execution time. Enable display
full steps without needing to any press enter button.

Signed-off-by: Mazliana <mazliana.mohamad@intel.com>
Signed-off-by: Yeoh Ee Peng <ee.peng.yeoh@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 scripts/lib/resulttool/manualexecution.py | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/scripts/lib/resulttool/manualexecution.py b/scripts/lib/resulttool/manualexecution.py
index 8ce7903..0783540 100755
--- a/scripts/lib/resulttool/manualexecution.py
+++ b/scripts/lib/resulttool/manualexecution.py
@@ -87,8 +87,9 @@ class ManualTestRunner(object):
         print('------------------------------------------------------------------------\n')
         for step in sorted((self.jdata[test_id]['test']['execution']).keys()):
             print('Step %s: ' % step + self.jdata[test_id]['test']['execution']['%s' % step]['action'])
-            print('Expected output: ' + self.jdata[test_id]['test']['execution']['%s' % step]['expected_results'])
-            done = input('\nPlease press ENTER when you are done to proceed to next step.\n')
+            expected_output = self.jdata[test_id]['test']['execution']['%s' % step]['expected_results']
+            if expected_output:
+                print('Expected output: ' + expected_output)
         while True:
             done = input('\nPlease provide test results: (P)assed/(F)ailed/(B)locked/(S)kipped? \n')
             done = done.lower()
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 18/33] resulttool/manualexecution: Fixed step sorted by integer
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (16 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 17/33] resulttool/manualexecution: Enable display full steps without press enter Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 19/33] resulttool/manualexecution: Refactor and simplify codebase Armin Kuster
                   ` (14 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Yeoh Ee Peng <ee.peng.yeoh@intel.com>

Currently the manual execution display step by sorting
the step as string, where steps were not being sorted
correctly when there are more than 9 steps.

Fixed the step sorting by sorting step as integer.

Signed-off-by: Yeoh Ee Peng <ee.peng.yeoh@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 scripts/lib/resulttool/manualexecution.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scripts/lib/resulttool/manualexecution.py b/scripts/lib/resulttool/manualexecution.py
index 0783540..9a29b0b 100755
--- a/scripts/lib/resulttool/manualexecution.py
+++ b/scripts/lib/resulttool/manualexecution.py
@@ -85,7 +85,7 @@ class ManualTestRunner(object):
         print('------------------------------------------------------------------------')
         print('You have total ' + str(total_steps) + ' test steps to be executed.')
         print('------------------------------------------------------------------------\n')
-        for step in sorted((self.jdata[test_id]['test']['execution']).keys()):
+        for step, _ in sorted(self.jdata[test_id]['test']['execution'].items(), key=lambda x: int(x[0])):
             print('Step %s: ' % step + self.jdata[test_id]['test']['execution']['%s' % step]['action'])
             expected_output = self.jdata[test_id]['test']['execution']['%s' % step]['expected_results']
             if expected_output:
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 19/33] resulttool/manualexecution: Refactor and simplify codebase
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (17 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 18/33] resulttool/manualexecution: Fixed step sorted by integer Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 20/33] pkgdata.py: avoid target-sdk-dummy-provides to mess things up Armin Kuster
                   ` (13 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Yeoh Ee Peng <ee.peng.yeoh@intel.com>

Simplify and removed unnecessary codes.
Refactor to allow pythonic loop.

Signed-off-by: Yeoh Ee Peng <ee.peng.yeoh@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 scripts/lib/resulttool/manualexecution.py | 56 +++++++++++--------------------
 1 file changed, 20 insertions(+), 36 deletions(-)

diff --git a/scripts/lib/resulttool/manualexecution.py b/scripts/lib/resulttool/manualexecution.py
index 9a29b0b..c94f981 100755
--- a/scripts/lib/resulttool/manualexecution.py
+++ b/scripts/lib/resulttool/manualexecution.py
@@ -24,24 +24,12 @@ def load_json_file(file):
     with open(file, "r") as f:
         return json.load(f)
 
-
 class ManualTestRunner(object):
-    def __init__(self):
-        self.jdata = ''
-        self.test_module = ''
-        self.test_cases_id = ''
-        self.configuration = ''
-        self.starttime = ''
-        self.result_id = ''
-        self.write_dir = ''
 
     def _get_testcases(self, file):
         self.jdata = load_json_file(file)
-        self.test_cases_id = []
         self.test_module = self.jdata[0]['test']['@alias'].split('.', 2)[0]
-        for i in self.jdata:
-            self.test_cases_id.append(i['test']['@alias'])
-    
+
     def _get_input(self, config):
         while True:
             output = input('{} = '.format(config))
@@ -67,45 +55,42 @@ class ManualTestRunner(object):
         extra_config = set(store_map['manual']) - set(self.configuration)
         for config in sorted(extra_config):
             print('---------------------------------------------')
-            print('This is configuration #%s. Please provide configuration value(use "None" if not applicable).'
-                  % config)
+            print('This is configuration #%s. Please provide configuration value(use "None" if not applicable).' % config)
             print('---------------------------------------------')
             value_conf = self._get_input('Configuration Value')
             print('---------------------------------------------\n')
             self.configuration[config] = value_conf
 
     def _create_result_id(self):
-        self.result_id = 'manual_' + self.test_module + '_' + self.starttime
+        self.result_id = 'manual_%s_%s' % (self.test_module, self.starttime)
 
-    def _execute_test_steps(self, test_id):
+    def _execute_test_steps(self, test):
         test_result = {}
-        total_steps = len(self.jdata[test_id]['test']['execution'].keys())
         print('------------------------------------------------------------------------')
-        print('Executing test case:' + '' '' + self.test_cases_id[test_id])
+        print('Executing test case: %s' % test['test']['@alias'])
         print('------------------------------------------------------------------------')
-        print('You have total ' + str(total_steps) + ' test steps to be executed.')
+        print('You have total %s test steps to be executed.' % len(test['test']['execution']))
         print('------------------------------------------------------------------------\n')
-        for step, _ in sorted(self.jdata[test_id]['test']['execution'].items(), key=lambda x: int(x[0])):
-            print('Step %s: ' % step + self.jdata[test_id]['test']['execution']['%s' % step]['action'])
-            expected_output = self.jdata[test_id]['test']['execution']['%s' % step]['expected_results']
+        for step, _ in sorted(test['test']['execution'].items(), key=lambda x: int(x[0])):
+            print('Step %s: %s' % (step, test['test']['execution'][step]['action']))
+            expected_output = test['test']['execution'][step]['expected_results']
             if expected_output:
-                print('Expected output: ' + expected_output)
+                print('Expected output: %s' % expected_output)
         while True:
-            done = input('\nPlease provide test results: (P)assed/(F)ailed/(B)locked/(S)kipped? \n')
-            done = done.lower()
+            done = input('\nPlease provide test results: (P)assed/(F)ailed/(B)locked/(S)kipped? \n').lower()
             result_types = {'p':'PASSED',
-                                'f':'FAILED',
-                                'b':'BLOCKED',
-                                's':'SKIPPED'}
+                            'f':'FAILED',
+                            'b':'BLOCKED',
+                            's':'SKIPPED'}
             if done in result_types:
                 for r in result_types:
                     if done == r:
                         res = result_types[r]
                         if res == 'FAILED':
                             log_input = input('\nPlease enter the error and the description of the log: (Ex:log:211 Error Bitbake)\n')
-                            test_result.update({self.test_cases_id[test_id]: {'status': '%s' % res, 'log': '%s' % log_input}})
+                            test_result.update({test['test']['@alias']: {'status': '%s' % res, 'log': '%s' % log_input}})
                         else:
-                            test_result.update({self.test_cases_id[test_id]: {'status': '%s' % res}})
+                            test_result.update({test['test']['@alias']: {'status': '%s' % res}})
                 break
             print('Invalid input!')
         return test_result
@@ -120,9 +105,9 @@ class ManualTestRunner(object):
         self._create_result_id()
         self._create_write_dir()
         test_results = {}
-        print('\nTotal number of test cases in this test suite: ' + '%s\n' % len(self.jdata))
-        for i in range(0, len(self.jdata)):
-            test_result = self._execute_test_steps(i)
+        print('\nTotal number of test cases in this test suite: %s\n' % len(self.jdata))
+        for t in self.jdata:
+            test_result = self._execute_test_steps(t)
             test_results.update(test_result)
         return self.configuration, self.result_id, self.write_dir, test_results
 
@@ -130,8 +115,7 @@ def manualexecution(args, logger):
     testrunner = ManualTestRunner()
     get_configuration, get_result_id, get_write_dir, get_test_results = testrunner.run_test(args.file)
     resultjsonhelper = OETestResultJSONHelper()
-    resultjsonhelper.dump_testresult_file(get_write_dir, get_configuration, get_result_id,
-                                          get_test_results)
+    resultjsonhelper.dump_testresult_file(get_write_dir, get_configuration, get_result_id, get_test_results)
     return 0
 
 def register_commands(subparsers):
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 20/33] pkgdata.py: avoid target-sdk-dummy-provides to mess things up
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (18 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 19/33] resulttool/manualexecution: Refactor and simplify codebase Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 21/33] wic: Support for changing the imager Armin Kuster
                   ` (12 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Chen Qi <Qi.Chen@windriver.com>

Sometimes we meet the following failure for the test_lookup_recipe
test case.

  AssertionError: 'zlib\nbusybox is in the RPROVIDES of target-sdk-provid[32 chars]ummy' != 'zlib\nbusybox'
    zlib
  + busybox- busybox is in the RPROVIDES of target-sdk-provides-dummy:
  - target-sdk-provides-dummy

This is because target-sdk-provides-dummy rprovides busybox.

So clean things up to avoid failure.

Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 meta/lib/oeqa/selftest/cases/pkgdata.py | 1 +
 1 file changed, 1 insertion(+)

diff --git a/meta/lib/oeqa/selftest/cases/pkgdata.py b/meta/lib/oeqa/selftest/cases/pkgdata.py
index 0b4caf1..9911765 100644
--- a/meta/lib/oeqa/selftest/cases/pkgdata.py
+++ b/meta/lib/oeqa/selftest/cases/pkgdata.py
@@ -13,6 +13,7 @@ class OePkgdataUtilTests(OESelftestTestCase):
         super(OePkgdataUtilTests, cls).setUpClass()
         # Ensure we have the right data in pkgdata
         cls.logger.info('Running bitbake to generate pkgdata')
+        bitbake('target-sdk-provides-dummy -c clean')
         bitbake('busybox zlib m4')
 
     @OETestID(1203)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 21/33] wic: Support for changing the imager.
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (19 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 20/33] pkgdata.py: avoid target-sdk-dummy-provides to mess things up Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 22/33] scripts/wic: Be consistent about how we call bitbake Armin Kuster
                   ` (11 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: "Davis, Michael" <michael.davis@essvote.com>

Signed-off-by: Michael Davis <michael.davis@essvote.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 scripts/lib/wic/engine.py | 2 +-
 scripts/wic               | 2 ++
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/scripts/lib/wic/engine.py b/scripts/lib/wic/engine.py
index f0c5ff0..4996bff 100644
--- a/scripts/lib/wic/engine.py
+++ b/scripts/lib/wic/engine.py
@@ -191,7 +191,7 @@ def wic_create(wks_file, rootfs_dir, bootimg_dir, kernel_dir,
     if not os.path.exists(options.outdir):
         os.makedirs(options.outdir)
 
-    pname = 'direct'
+    pname = options.imager
     plugin_class = PluginMgr.get_plugins('imager').get(pname)
     if not plugin_class:
         raise WicError('Unknown plugin: %s' % pname)
diff --git a/scripts/wic b/scripts/wic
index 7392bc4..37dfe2d 100755
--- a/scripts/wic
+++ b/scripts/wic
@@ -362,6 +362,8 @@ def wic_init_parser_create(subparser):
                            "bitbake variables")
     subparser.add_argument("-D", "--debug", dest="debug", action="store_true",
                       default=False, help="output debug information")
+    subparser.add_argument("-i", "--imager", dest="imager",
+                      default="direct", help="the wic imager plugin")
     return
 
 
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 22/33] scripts/wic: Be consistent about how we call bitbake
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (20 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 21/33] wic: Support for changing the imager Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 23/33] wic: make engine.py:get_partitions() resilient to parted/dmidecode stderr output Armin Kuster
                   ` (10 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Richard Purdie <richard.purdie@linuxfoundation.org>

Whilst its tempting to call bitbake_main(), the script also directly executes
bitbake. By doing both this creates all kinds of races. Therefore
change to use subprocess execution in all cases.

(From OE-Core rev: 0507ec4c6069490c9a503e9e2b65f0e7b1962d34)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 scripts/wic | 16 +++++-----------
 1 file changed, 5 insertions(+), 11 deletions(-)

diff --git a/scripts/wic b/scripts/wic
index 37dfe2d..b4b7212 100755
--- a/scripts/wic
+++ b/scripts/wic
@@ -35,6 +35,7 @@ import os
 import sys
 import argparse
 import logging
+import subprocess
 
 from collections import namedtuple
 from distutils import spawn
@@ -63,10 +64,7 @@ if os.environ.get('SDKTARGETSYSROOT'):
 bitbake_exe = spawn.find_executable('bitbake')
 if bitbake_exe:
     bitbake_path = scriptpath.add_bitbake_lib_path()
-    from bb import cookerdata
-    from bb.main import bitbake_main, BitBakeConfigParameters
-else:
-    bitbake_main = None
+    import bb
 
 from wic import WicError
 from wic.misc import get_bitbake_var, BB_VARS
@@ -124,7 +122,7 @@ def wic_create_subcommand(options, usage_str):
     Command-line handling for image creation.  The real work is done
     by image.engine.wic_create()
     """
-    if options.build_rootfs and not bitbake_main:
+    if options.build_rootfs and not bitbake_exe:
         raise WicError("Can't build rootfs as bitbake is not in the $PATH")
 
     if not options.image_name:
@@ -160,9 +158,7 @@ def wic_create_subcommand(options, usage_str):
                 argv.append("--debug")
 
             logger.info("Building rootfs...\n")
-            if bitbake_main(BitBakeConfigParameters(argv),
-                            cookerdata.CookerConfiguration()):
-                raise WicError("bitbake exited with error")
+            subprocess.check_call(argv)
 
         rootfs_dir = get_bitbake_var("IMAGE_ROOTFS", options.image_name)
         kernel_dir = get_bitbake_var("DEPLOY_DIR_IMAGE", options.image_name)
@@ -179,9 +175,7 @@ def wic_create_subcommand(options, usage_str):
 
     if not options.vars_dir and (not native_sysroot or not os.path.isdir(native_sysroot)):
         logger.info("Building wic-tools...\n")
-        if bitbake_main(BitBakeConfigParameters("bitbake wic-tools".split()),
-                        cookerdata.CookerConfiguration()):
-            raise WicError("bitbake wic-tools failed")
+        subprocess.check_call(["bitbake", "wic-tools"])
         native_sysroot = get_bitbake_var("RECIPE_SYSROOT_NATIVE", "wic-tools")
 
     if not native_sysroot:
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 23/33] wic: make engine.py:get_partitions() resilient to parted/dmidecode stderr output
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (21 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 22/33] scripts/wic: Be consistent about how we call bitbake Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 24/33] wic: search nonarch STAGING_DATADIR for multilib Armin Kuster
                   ` (9 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Geoff Parker <geoffhp@gmail.com>

Running wic commands on Debian 10 systems fail in
scripts/lib/wic/engine.py:get_partitions() due to new stderr output captured
when trying to parse the output from /sbin/parted as a non-root user.

The parted command calls the dmidecode utility, which produces this error
as a non-root user:
    /sys/firmware/dmi/tables/smbios_entry_point: Permission denied
    /dev/mem: Permission denied

scripts/lib/wic/engine.py:get_partitions() calls misc.py:exec_cmd(),
a subprocess wrapper which returns a combined stderr and sdtdout.
These messages to stderr confuse the partition table parser in
get_partitions().

This patch has the partition table parser ignore lines before the expected
"BYT;" header string.

Running wic in Debian 9 does not have this issue.

Signed-off-by: Geoff Parker <geoffhp@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 scripts/lib/wic/engine.py | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/scripts/lib/wic/engine.py b/scripts/lib/wic/engine.py
index 4996bff..4eefc94 100644
--- a/scripts/lib/wic/engine.py
+++ b/scripts/lib/wic/engine.py
@@ -266,10 +266,15 @@ class Disk:
             out = exec_cmd("%s -sm %s unit B print" % (self.parted, self.imagepath))
             parttype = namedtuple("Part", "pnum start end size fstype")
             splitted = out.splitlines()
-            lsector_size, psector_size, self._ptable_format = splitted[1].split(":")[3:6]
+            # skip over possible errors in exec_cmd output
+            try:
+                idx =splitted.index("BYT;")
+            except ValueError:
+                raise WicError("Error getting partition information from %s" % (self.parted))
+            lsector_size, psector_size, self._ptable_format = splitted[idx + 1].split(":")[3:6]
             self._lsector_size = int(lsector_size)
             self._psector_size = int(psector_size)
-            for line in splitted[2:]:
+            for line in splitted[idx + 2:]:
                 pnum, start, end, size, fstype = line.split(':')[:5]
                 partition = parttype(int(pnum), int(start[:-1]), int(end[:-1]),
                                      int(size[:-1]), fstype)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 24/33] wic: search nonarch STAGING_DATADIR for multilib
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (22 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 23/33] wic: make engine.py:get_partitions() resilient to parted/dmidecode stderr output Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 25/33] scripts/lib/wic/engine: Fix cp's target path for ext* filesystems Armin Kuster
                   ` (8 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Kai Kang <kai.kang@windriver.com>

It fails to build multilib image such as lib32-core-image-minimal with
wic by set 'IMAGE_FSTYPES = "wic"':

| ERROR: Couldn't find correct bootimg_dir, exiting

When multilib is enabled, STAGING_DATADIR is expanded with MLPREFIX. But
dependencies of images such as syslinux is still populated to nonarch
STAGING_DATADIR.

Search nonarch STAGING_DATADIR to fix the error.

Signed-off-by: Kai Kang <kai.kang@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 scripts/lib/wic/plugins/source/bootimg-pcbios.py | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/scripts/lib/wic/plugins/source/bootimg-pcbios.py b/scripts/lib/wic/plugins/source/bootimg-pcbios.py
index d599112..9347aa7 100644
--- a/scripts/lib/wic/plugins/source/bootimg-pcbios.py
+++ b/scripts/lib/wic/plugins/source/bootimg-pcbios.py
@@ -26,6 +26,7 @@
 
 import logging
 import os
+import re
 
 from wic import WicError
 from wic.engine import get_custom_config
@@ -47,10 +48,17 @@ class BootimgPcbiosPlugin(SourcePlugin):
         """
         Check if dirname exists in default bootimg_dir or in STAGING_DIR.
         """
-        for result in (bootimg_dir, get_bitbake_var("STAGING_DATADIR")):
+        staging_datadir = get_bitbake_var("STAGING_DATADIR")
+        for result in (bootimg_dir, staging_datadir):
             if os.path.exists("%s/%s" % (result, dirname)):
                 return result
 
+        # STAGING_DATADIR is expanded with MLPREFIX if multilib is enabled
+        # but dependency syslinux is still populated to original STAGING_DATADIR
+        nonarch_datadir = re.sub('/[^/]*recipe-sysroot', '/recipe-sysroot', staging_datadir)
+        if os.path.exists(os.path.join(nonarch_datadir, dirname)):
+            return nonarch_datadir
+
         raise WicError("Couldn't find correct bootimg_dir, exiting")
 
     @classmethod
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 25/33] scripts/lib/wic/engine: Fix cp's target path for ext* filesystems
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (23 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 24/33] wic: search nonarch STAGING_DATADIR for multilib Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 26/33] wic/engine.py: Load paths from PATH environment variable Armin Kuster
                   ` (7 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Leonardo Augusto <leobsd@gmail.com>

Python subprocess' shell=True defaults to /bin/sh[1][2], which
often refers to a POSIX-compliant shell. As the -e flag is
not defined in the POSIX standard[3], some shells may
interpret "-e" as the first argument to the echo command,
causing the rest of the command line to fail.

In this particular case, "echo -e 'cd {}'" is interpreted
as "-e cd {}", which causes the first line of the command
to fail, and causing cp to always place the source file
in the filesystem's root.

Replacing "echo -e" for a printf command makes this
more portable.

This issue only affects "wic cp" for ext* filesystems.

[1] https://docs.python.org/2/library/subprocess.html
[2] https://docs.python.org/3/library/subprocess.html
[3] http://pubs.opengroup.org/onlinepubs/9699919799

(From OE-Core rev: 9a5b703d4e60c3ccdf80b5289b8e6fc91133fcde)

Signed-off-by: Leonardo Augusto <leobsd@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 scripts/lib/wic/engine.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scripts/lib/wic/engine.py b/scripts/lib/wic/engine.py
index 4eefc94..951bf30 100644
--- a/scripts/lib/wic/engine.py
+++ b/scripts/lib/wic/engine.py
@@ -331,7 +331,7 @@ class Disk:
     def copy(self, src, pnum, path):
         """Copy partition image into wic image."""
         if self.partitions[pnum].fstype.startswith('ext'):
-            cmd = "echo -e 'cd {}\nwrite {} {}' | {} -w {}".\
+            cmd = "printf 'cd {}\nwrite {} {}' | {} -w {}".\
                       format(path, src, os.path.basename(src),
                              self.debugfs, self._get_part_image(pnum))
         else: # fat
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 26/33] wic/engine.py: Load paths from PATH environment variable
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (24 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 25/33] scripts/lib/wic/engine: Fix cp's target path for ext* filesystems Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 27/33] wic/engine: Fix missing parted autobuilder failures Armin Kuster
                   ` (6 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: William Bourque <wbourque@gmail.com>

Load self.paths from environment variable and
if it fails, fall back to hardcoded list.
This is required for users that would need to load
different e2fsprogs binaries if their system's ones
are not recent enought

(From OE-Core rev: a88bcbae850a2e6d182291d3f8e167aabdbe4842)

Signed-off-by: William Bourque <wbourque@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 scripts/lib/wic/engine.py | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/scripts/lib/wic/engine.py b/scripts/lib/wic/engine.py
index 951bf30..c127045 100644
--- a/scripts/lib/wic/engine.py
+++ b/scripts/lib/wic/engine.py
@@ -244,8 +244,13 @@ class Disk:
         self._psector_size = None
         self._ptable_format = None
 
-        # find parted
-        self.paths = "/bin:/usr/bin:/usr/sbin:/sbin/"
+        # read paths from $PATH environment variable
+        # if it fails, use hardcoded paths
+        try:
+            self.paths = os.environ['PATH']
+        except KeyError:
+            self.paths = "/bin:/usr/bin:/usr/sbin:/sbin/"
+
         if native_sysroot:
             for path in self.paths.split(':'):
                 self.paths = "%s%s:%s" % (native_sysroot, path, self.paths)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 27/33] wic/engine: Fix missing parted autobuilder failures
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (25 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 26/33] wic/engine.py: Load paths from PATH environment variable Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 28/33] wic: use explicit errno import Armin Kuster
                   ` (5 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Richard Purdie <richard.purdie@linuxfoundation.org>

OE-Core rev: a88bcbae850a2e6d182291d3f8e167aabdbe4842 broke the ability
to find parted as it may be in sbin which is not in PATH for some users
on some distros.

Iterate on the original patch to fix this and also fix the original problem.

(From OE-Core rev: af3803e5189d7814f9dbd238fb6dab200f351e1a)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 scripts/lib/wic/engine.py | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/scripts/lib/wic/engine.py b/scripts/lib/wic/engine.py
index c127045..7e6519e 100644
--- a/scripts/lib/wic/engine.py
+++ b/scripts/lib/wic/engine.py
@@ -244,15 +244,17 @@ class Disk:
         self._psector_size = None
         self._ptable_format = None
 
+        # find parted
         # read paths from $PATH environment variable
         # if it fails, use hardcoded paths
+        pathlist = "/bin:/usr/bin:/usr/sbin:/sbin/"
         try:
-            self.paths = os.environ['PATH']
+            self.paths = os.environ['PATH'] + ":" + pathlist
         except KeyError:
-            self.paths = "/bin:/usr/bin:/usr/sbin:/sbin/"
+            self.paths = pathlist
 
         if native_sysroot:
-            for path in self.paths.split(':'):
+            for path in pathlist.split(':'):
                 self.paths = "%s%s:%s" % (native_sysroot, path, self.paths)
 
         self.parted = find_executable("parted", self.paths)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 28/33] wic: use explicit errno import
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (26 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 27/33] wic/engine: Fix missing parted autobuilder failures Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 29/33] lib/oe: Fix collections ABCs DeprecationWarning in Python 3.7+ Armin Kuster
                   ` (4 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Ross Burton <ross.burton@intel.com>

os.errno doesn't work in Python 3.7 and shouldn't have ever worked, so use
import errno explicitly.

Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster@mvista.com>
---
 scripts/lib/wic/filemap.py | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/scripts/lib/wic/filemap.py b/scripts/lib/wic/filemap.py
index a72fa09..abbf958 100644
--- a/scripts/lib/wic/filemap.py
+++ b/scripts/lib/wic/filemap.py
@@ -22,6 +22,7 @@ and returns an instance of the class.
 #   * Too many instance attributes (R0902)
 # pylint: disable=R0902
 
+import errno
 import os
 import struct
 import array
@@ -189,9 +190,9 @@ def _lseek(file_obj, offset, whence):
     except OSError as err:
         # The 'lseek' system call returns the ENXIO if there is no data or
         # hole starting from the specified offset.
-        if err.errno == os.errno.ENXIO:
+        if err.errno == errno.ENXIO:
             return -1
-        elif err.errno == os.errno.EINVAL:
+        elif err.errno == errno.EINVAL:
             raise ErrorNotSupp("the kernel or file-system does not support "
                                "\"SEEK_HOLE\" and \"SEEK_DATA\"")
         else:
@@ -394,12 +395,12 @@ class FilemapFiemap(_FilemapBase):
         except IOError as err:
             # Note, the FIEMAP ioctl is supported by the Linux kernel starting
             # from version 2.6.28 (year 2008).
-            if err.errno == os.errno.EOPNOTSUPP:
+            if err.errno == errno.EOPNOTSUPP:
                 errstr = "FilemapFiemap: the FIEMAP ioctl is not supported " \
                          "by the file-system"
                 self._log.debug(errstr)
                 raise ErrorNotSupp(errstr)
-            if err.errno == os.errno.ENOTTY:
+            if err.errno == errno.ENOTTY:
                 errstr = "FilemapFiemap: the FIEMAP ioctl is not supported " \
                          "by the kernel"
                 self._log.debug(errstr)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 29/33] lib/oe: Fix collections ABCs DeprecationWarning in Python 3.7+
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (27 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 28/33] wic: use explicit errno import Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 30/33] logging: use warning instead warn Armin Kuster
                   ` (3 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Khem Raj <raj.khem@gmail.com>

- Prefer collections.abc (new in Python 3.3) over collections for abstract base classes

- In Python 3.8, the abstract base classes in collections.abc will no longer be exposed in
  the regular collections module. This will help create a clearer distinction between
  the concrete classes and the abstract base classes."

- https://docs.python.org/3.7/whatsnew/3.7.html#deprecated

- see https://github.com/python/cpython/commit/c66f9f8d3909f588c251957d499599a1680e2320

Signed-off-by: Khem Raj <raj.khem@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 meta/lib/oe/maketype.py | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/meta/lib/oe/maketype.py b/meta/lib/oe/maketype.py
index f88981d..c36e7b5 100644
--- a/meta/lib/oe/maketype.py
+++ b/meta/lib/oe/maketype.py
@@ -7,7 +7,12 @@ the arguments of the type's factory for details.
 
 import inspect
 import oe.types as types
-import collections
+try:
+    # Python 3.7+
+    from collections.abc import Callable
+except ImportError:
+    # Python < 3.7
+    from collections import Callable
 
 available_types = {}
 
@@ -96,7 +101,7 @@ for name in dir(types):
         continue
 
     obj = getattr(types, name)
-    if not isinstance(obj, collections.Callable):
+    if not isinstance(obj, Callable):
         continue
 
     register(name, obj)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 30/33] logging: use warning instead warn
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (28 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 29/33] lib/oe: Fix collections ABCs DeprecationWarning in Python 3.7+ Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 31/33] oeqa/selftest/devtool: Ensure dbus is built befoe running test Armin Kuster
                   ` (2 subsequent siblings)
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Chen Qi <Qi.Chen@windriver.com>

The warn method is deprecated. We should use the documented warning instead.

Quoting from the python's official doc:
"""
Note: There is an obsolete method warn which is functionally identical to warning.
      As warn is deprecated, please do not use it - use warning instead.
"""

Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 meta/lib/oe/terminal.py               |  6 +++---
 meta/lib/oeqa/selftest/context.py     |  2 +-
 meta/lib/oeqa/utils/qemurunner.py     |  4 ++--
 scripts/combo-layer                   |  2 +-
 scripts/contrib/verify-homepage.py    |  2 +-
 scripts/lib/devtool/export.py         |  2 +-
 scripts/lib/devtool/import.py         |  8 ++++----
 scripts/lib/devtool/standard.py       | 16 ++++++++--------
 scripts/lib/devtool/upgrade.py        |  6 +++---
 scripts/lib/recipetool/append.py      | 14 +++++++-------
 scripts/lib/recipetool/create.py      |  4 ++--
 scripts/lib/recipetool/create_kmod.py |  2 +-
 scripts/lib/recipetool/create_npm.py  |  6 +++---
 scripts/lib/recipetool/newappend.py   |  4 ++--
 scripts/lib/wic/engine.py             |  2 +-
 scripts/runqemu                       | 16 ++++++++--------
 16 files changed, 48 insertions(+), 48 deletions(-)

diff --git a/meta/lib/oe/terminal.py b/meta/lib/oe/terminal.py
index 94afe39..caeb5e3 100644
--- a/meta/lib/oe/terminal.py
+++ b/meta/lib/oe/terminal.py
@@ -112,7 +112,7 @@ class Screen(Terminal):
             bb.event.fire(bb.event.LogExecTTY(msg, "screen -r %s" % s_id,
                                               0.5, 10), d)
         else:
-            logger.warn(msg)
+            logger.warning(msg)
 
 class TmuxRunning(Terminal):
     """Open a new pane in the current running tmux window"""
@@ -168,7 +168,7 @@ class Tmux(Terminal):
         if d:
             bb.event.fire(bb.event.LogExecTTY(msg, attach_cmd, 0.5, 10), d)
         else:
-            logger.warn(msg)
+            logger.warning(msg)
 
 class Custom(Terminal):
     command = 'false' # This is a placeholder
@@ -180,7 +180,7 @@ class Custom(Terminal):
             if not '{command}' in self.command:
                 self.command += ' {command}'
             Terminal.__init__(self, sh_cmd, title, env, d)
-            logger.warn('Custom terminal was started.')
+            logger.warning('Custom terminal was started.')
         else:
             logger.debug(1, 'No custom terminal (OE_TERMINAL_CUSTOMCMD) set')
             raise UnsupportedTerminal('OE_TERMINAL_CUSTOMCMD not set')
diff --git a/meta/lib/oeqa/selftest/context.py b/meta/lib/oeqa/selftest/context.py
index da7f26b..cac9869 100644
--- a/meta/lib/oeqa/selftest/context.py
+++ b/meta/lib/oeqa/selftest/context.py
@@ -159,7 +159,7 @@ class OESelftestTestContextExecutor(OETestContextExecutor):
                 os.chdir(builddir)
 
             if not "meta-selftest" in self.tc.td["BBLAYERS"]:
-                self.tc.logger.warn("meta-selftest layer not found in BBLAYERS, adding it")
+                self.tc.logger.warning("meta-selftest layer not found in BBLAYERS, adding it")
                 meta_selftestdir = os.path.join(
                     self.tc.td["BBLAYERS_FETCH_DIR"], 'meta-selftest')
                 if os.path.isdir(meta_selftestdir):
diff --git a/meta/lib/oeqa/utils/qemurunner.py b/meta/lib/oeqa/utils/qemurunner.py
index 27c4901..4864df8 100644
--- a/meta/lib/oeqa/utils/qemurunner.py
+++ b/meta/lib/oeqa/utils/qemurunner.py
@@ -393,7 +393,7 @@ class QemuRunner:
                 # qemu-system behaves well and a SIGTERM is enough
                 os.kill(self.qemupid, signal.SIGTERM)
             except ProcessLookupError as e:
-                self.logger.warn('qemu-system ended unexpectedly')
+                self.logger.warning('qemu-system ended unexpectedly')
 
     def stop_thread(self):
         if self.thread and self.thread.is_alive():
@@ -470,7 +470,7 @@ class QemuRunner:
 
     def _dump_host(self):
         self.host_dumper.create_dir("qemu")
-        self.logger.warn("Qemu ended unexpectedly, dump data from host"
+        self.logger.warning("Qemu ended unexpectedly, dump data from host"
                 " is in %s" % self.host_dumper.dump_dir)
         self.host_dumper.dump_host()
 
diff --git a/scripts/combo-layer b/scripts/combo-layer
index d04d88b..dc40e72 100755
--- a/scripts/combo-layer
+++ b/scripts/combo-layer
@@ -246,7 +246,7 @@ def action_init(conf, args):
                         # traditional behavior from "git archive" (preserved
                         # here) it to choose the first one. This might not be
                         # intended, so at least warn about it.
-                        logger.warn("%s: initial revision '%s' not unique, picking result of rev-parse = %s" %
+                        logger.warning("%s: initial revision '%s' not unique, picking result of rev-parse = %s" %
                                     (name, initialrev, refs[0]))
                         initialrev = rev
                 except:
diff --git a/scripts/contrib/verify-homepage.py b/scripts/contrib/verify-homepage.py
index 76f1749..cc6e797 100755
--- a/scripts/contrib/verify-homepage.py
+++ b/scripts/contrib/verify-homepage.py
@@ -27,7 +27,7 @@ logger = scriptutils.logger_create('verify_homepage')
 def wgetHomepage(pn, homepage):
     result = subprocess.call('wget ' + '-q -T 5 -t 1 --spider ' + homepage, shell = True)
     if result:
-        logger.warn("%s: failed to verify HOMEPAGE: %s " % (pn, homepage))
+        logger.warning("%s: failed to verify HOMEPAGE: %s " % (pn, homepage))
         return 1
     else:
         return 0
diff --git a/scripts/lib/devtool/export.py b/scripts/lib/devtool/export.py
index 13ee258..35349e2 100644
--- a/scripts/lib/devtool/export.py
+++ b/scripts/lib/devtool/export.py
@@ -84,7 +84,7 @@ def export(args, config, basepath, workspace):
 
     # if all workspace is excluded, quit
     if not len(set(workspace.keys()).difference(set(args.exclude))):
-        logger.warn('All recipes in workspace excluded, nothing to export')
+        logger.warning('All recipes in workspace excluded, nothing to export')
         return 0
 
     exported = []
diff --git a/scripts/lib/devtool/import.py b/scripts/lib/devtool/import.py
index c13a180..4264b7d 100644
--- a/scripts/lib/devtool/import.py
+++ b/scripts/lib/devtool/import.py
@@ -81,7 +81,7 @@ def devimport(args, config, basepath, workspace):
                     break
             else:
                 non_importables.append(fn)
-                logger.warn('No recipe to append %s.bbapppend, skipping' % fn)
+                logger.warning('No recipe to append %s.bbapppend, skipping' % fn)
 
         # Extract
         imported = []
@@ -104,9 +104,9 @@ def devimport(args, config, basepath, workspace):
                         try:
                             tar.extract(member, path=config.workspace_path)
                         except PermissionError as pe:
-                            logger.warn(pe)
+                            logger.warning(pe)
                     else:
-                        logger.warn('File already present. Use --overwrite/-o to overwrite it: %s' % member.name)
+                        logger.warning('File already present. Use --overwrite/-o to overwrite it: %s' % member.name)
                         continue
                 else:
                     tar.extract(member, path=config.workspace_path)
@@ -129,7 +129,7 @@ def devimport(args, config, basepath, workspace):
     if imported:
         logger.info('Imported recipes into workspace %s: %s' % (config.workspace_path, ', '.join(imported)))
     else:
-        logger.warn('No recipes imported into the workspace')
+        logger.warning('No recipes imported into the workspace')
 
     return 0
 
diff --git a/scripts/lib/devtool/standard.py b/scripts/lib/devtool/standard.py
index a1e8e1d..d14b7a6 100644
--- a/scripts/lib/devtool/standard.py
+++ b/scripts/lib/devtool/standard.py
@@ -66,7 +66,7 @@ def add(args, config, basepath, workspace):
             args.srctree = args.recipename
             args.recipename = None
         elif os.path.isdir(args.recipename):
-            logger.warn('Ambiguous argument "%s" - assuming you mean it to be the recipe name' % args.recipename)
+            logger.warning('Ambiguous argument "%s" - assuming you mean it to be the recipe name' % args.recipename)
 
     if not args.fetchuri:
         if args.srcrev:
@@ -82,7 +82,7 @@ def add(args, config, basepath, workspace):
         if args.fetchuri:
             raise DevtoolError('URI specified as positional argument as well as -f/--fetch')
         else:
-            logger.warn('-f/--fetch option is deprecated - you can now simply specify the URL to fetch as a positional argument instead')
+            logger.warning('-f/--fetch option is deprecated - you can now simply specify the URL to fetch as a positional argument instead')
             args.fetchuri = args.fetch
 
     if args.recipename:
@@ -217,7 +217,7 @@ def add(args, config, basepath, workspace):
             raise DevtoolError('Command \'%s\' did not create any recipe file:\n%s' % (e.command, e.stdout))
         attic_recipe = os.path.join(config.workspace_path, 'attic', recipename, os.path.basename(recipefile))
         if os.path.exists(attic_recipe):
-            logger.warn('A modified recipe from a previous invocation exists in %s - you may wish to move this over the top of the new recipe if you had changes in it that you want to continue with' % attic_recipe)
+            logger.warning('A modified recipe from a previous invocation exists in %s - you may wish to move this over the top of the new recipe if you had changes in it that you want to continue with' % attic_recipe)
     finally:
         if tmpsrcdir and os.path.exists(tmpsrcdir):
             shutil.rmtree(tmpsrcdir)
@@ -295,7 +295,7 @@ def add(args, config, basepath, workspace):
                     with open(layerconf_file, 'a') as f:
                         f.write('%s = "%s"\n' % (preferred_provider, recipe_name))
                 else:
-                    logger.warn('Set \'%s\' in order to use the recipe' % preferred_provider)
+                    logger.warning('Set \'%s\' in order to use the recipe' % preferred_provider)
                 break
 
         _add_md5(config, recipename, appendfile)
@@ -704,7 +704,7 @@ def _check_preserve(config, recipename):
                     if splitline[2] != md5:
                         bb.utils.mkdirhier(preservepath)
                         preservefile = os.path.basename(removefile)
-                        logger.warn('File %s modified since it was written, preserving in %s' % (preservefile, preservepath))
+                        logger.warning('File %s modified since it was written, preserving in %s' % (preservefile, preservepath))
                         shutil.move(removefile, os.path.join(preservepath, preservefile))
                     else:
                         os.remove(removefile)
@@ -795,7 +795,7 @@ def modify(args, config, basepath, workspace):
                 if branchname.startswith(override_branch_prefix):
                     branches.append(branchname)
             if branches:
-                logger.warn('SRC_URI is conditionally overridden in this recipe, thus several %s* branches have been created, one for each override that makes changes to SRC_URI. It is recommended that you make changes to the %s branch first, then checkout and rebase each %s* branch and update any unique patches there (duplicates on those branches will be ignored by devtool finish/update-recipe)' % (override_branch_prefix, args.branch, override_branch_prefix))
+                logger.warning('SRC_URI is conditionally overridden in this recipe, thus several %s* branches have been created, one for each override that makes changes to SRC_URI. It is recommended that you make changes to the %s branch first, then checkout and rebase each %s* branch and update any unique patches there (duplicates on those branches will be ignored by devtool finish/update-recipe)' % (override_branch_prefix, args.branch, override_branch_prefix))
             branches.insert(0, args.branch)
             seen_patches = []
             for branch in branches:
@@ -1720,7 +1720,7 @@ def update_recipe(args, config, basepath, workspace):
         if updated:
             rf = rd.getVar('FILE')
             if rf.startswith(config.workspace_path):
-                logger.warn('Recipe file %s has been updated but is inside the workspace - you will need to move it (and any associated files next to it) out to the desired layer before using "devtool reset" in order to keep any changes' % rf)
+                logger.warning('Recipe file %s has been updated but is inside the workspace - you will need to move it (and any associated files next to it) out to the desired layer before using "devtool reset" in order to keep any changes' % rf)
     finally:
         tinfoil.shutdown()
 
@@ -1803,7 +1803,7 @@ def _reset(recipes, no_clean, config, basepath, workspace):
             if os.path.exists(origdir):
                 for root, dirs, files in os.walk(origdir):
                     for fn in files:
-                        logger.warn('Preserving %s in %s' % (fn, preservepath))
+                        logger.warning('Preserving %s in %s' % (fn, preservepath))
                         _move_file(os.path.join(origdir, fn),
                                    os.path.join(preservepath, fn))
                     for dn in dirs:
diff --git a/scripts/lib/devtool/upgrade.py b/scripts/lib/devtool/upgrade.py
index c3fd866..d652f33 100644
--- a/scripts/lib/devtool/upgrade.py
+++ b/scripts/lib/devtool/upgrade.py
@@ -264,7 +264,7 @@ def _extract_new_source(newpv, srctree, no_patch, srcrev, srcbranch, branch, kee
     if no_patch:
         patches = oe.recipeutils.get_recipe_patches(crd)
         if patches:
-            logger.warn('By user choice, the following patches will NOT be applied to the new source tree:\n  %s' % '\n  '.join([os.path.basename(patch) for patch in patches]))
+            logger.warning('By user choice, the following patches will NOT be applied to the new source tree:\n  %s' % '\n  '.join([os.path.basename(patch) for patch in patches]))
     else:
         __run('git checkout devtool-patched -b %s' % branch)
         skiptag = False
@@ -273,9 +273,9 @@ def _extract_new_source(newpv, srctree, no_patch, srcrev, srcbranch, branch, kee
         except bb.process.ExecutionError as e:
             skiptag = True
             if 'conflict' in e.stdout:
-                logger.warn('Command \'%s\' failed:\n%s\n\nYou will need to resolve conflicts in order to complete the upgrade.' % (e.command, e.stdout.rstrip()))
+                logger.warning('Command \'%s\' failed:\n%s\n\nYou will need to resolve conflicts in order to complete the upgrade.' % (e.command, e.stdout.rstrip()))
             else:
-                logger.warn('Command \'%s\' failed:\n%s' % (e.command, e.stdout))
+                logger.warning('Command \'%s\' failed:\n%s' % (e.command, e.stdout))
         if not skiptag:
             if uri.startswith('git://'):
                 suffix = 'new'
diff --git a/scripts/lib/recipetool/append.py b/scripts/lib/recipetool/append.py
index 69c8bb7..3f2c134 100644
--- a/scripts/lib/recipetool/append.py
+++ b/scripts/lib/recipetool/append.py
@@ -238,7 +238,7 @@ def appendfile(args):
     if stdout:
         logger.debug('file command output: %s' % stdout.rstrip())
         if ('executable' in stdout and not 'shell script' in stdout) or 'shared object' in stdout:
-            logger.warn('This file looks like it is a binary or otherwise the output of compilation. If it is, you should consider building it properly instead of substituting a binary file directly.')
+            logger.warning('This file looks like it is a binary or otherwise the output of compilation. If it is, you should consider building it properly instead of substituting a binary file directly.')
 
     if args.recipe:
         recipes = {args.targetpath: [args.recipe],}
@@ -275,7 +275,7 @@ def appendfile(args):
     if selectpn:
         logger.debug('Selecting recipe %s for file %s' % (selectpn, args.targetpath))
         if postinst_pns:
-            logger.warn('%s be modified by postinstall scripts for the following recipes:\n  %s\nThis may or may not be an issue depending on what modifications these postinstall scripts make.' % (args.targetpath, '\n  '.join(postinst_pns)))
+            logger.warning('%s be modified by postinstall scripts for the following recipes:\n  %s\nThis may or may not be an issue depending on what modifications these postinstall scripts make.' % (args.targetpath, '\n  '.join(postinst_pns)))
         rd = _parse_recipe(selectpn, tinfoil)
         if not rd:
             # Error message already shown
@@ -286,12 +286,12 @@ def appendfile(args):
             sourcetype, sourcepath = sourcefile.split('://', 1)
             logger.debug('Original source file is %s (%s)' % (sourcepath, sourcetype))
             if sourcetype == 'patch':
-                logger.warn('File %s is added by the patch %s - you may need to remove or replace this patch in order to replace the file.' % (args.targetpath, sourcepath))
+                logger.warning('File %s is added by the patch %s - you may need to remove or replace this patch in order to replace the file.' % (args.targetpath, sourcepath))
                 sourcepath = None
         else:
             logger.debug('Unable to determine source file, proceeding anyway')
         if modpatches:
-            logger.warn('File %s is modified by the following patches:\n  %s' % (args.targetpath, '\n  '.join(modpatches)))
+            logger.warning('File %s is modified by the following patches:\n  %s' % (args.targetpath, '\n  '.join(modpatches)))
 
         if instelements and sourcepath:
             install = None
@@ -343,7 +343,7 @@ def appendsrc(args, files, rd, extralines=None):
             if rd.getVar('S') == rd.getVar('STAGING_KERNEL_DIR'):
                 srcdir = os.path.join(workdir, 'git')
                 if not bb.data.inherits_class('kernel-yocto', rd):
-                    logger.warn('S == STAGING_KERNEL_DIR and non-kernel-yocto, unable to determine path to srcdir, defaulting to ${WORKDIR}/git')
+                    logger.warning('S == STAGING_KERNEL_DIR and non-kernel-yocto, unable to determine path to srcdir, defaulting to ${WORKDIR}/git')
             src_destdir = os.path.join(os.path.relpath(srcdir, workdir), src_destdir)
         src_destdir = os.path.normpath(src_destdir)
 
@@ -357,9 +357,9 @@ def appendsrc(args, files, rd, extralines=None):
         if simple_str in simplified:
             existing = simplified[simple_str]
             if source_uri != existing:
-                logger.warn('{0!r} is already in SRC_URI, with different parameters: {1!r}, not adding'.format(source_uri, existing))
+                logger.warning('{0!r} is already in SRC_URI, with different parameters: {1!r}, not adding'.format(source_uri, existing))
             else:
-                logger.warn('{0!r} is already in SRC_URI, not adding'.format(source_uri))
+                logger.warning('{0!r} is already in SRC_URI, not adding'.format(source_uri))
         else:
             extralines.append('SRC_URI += {0}'.format(source_uri))
         copyfiles[newfile] = srcfile
diff --git a/scripts/lib/recipetool/create.py b/scripts/lib/recipetool/create.py
index a371028..1810c70 100644
--- a/scripts/lib/recipetool/create.py
+++ b/scripts/lib/recipetool/create.py
@@ -98,7 +98,7 @@ class RecipeHandler(object):
                             break
             except IOError as ioe:
                 if ioe.errno == 2:
-                    logger.warn('unable to find a pkgdata file for package %s' % pkg)
+                    logger.warning('unable to find a pkgdata file for package %s' % pkg)
                 else:
                     raise
 
@@ -437,7 +437,7 @@ def create_recipe(args):
     if scriptutils.is_src_url(source):
         # Warn about github archive URLs
         if re.match('https?://github.com/[^/]+/[^/]+/archive/.+(\.tar\..*|\.zip)$', source):
-            logger.warn('github archive files are not guaranteed to be stable and may be re-generated over time. If the latter occurs, the checksums will likely change and the recipe will fail at do_fetch. It is recommended that you point to an actual commit or tag in the repository instead (using the repository URL in conjunction with the -S/--srcrev option).')
+            logger.warning('github archive files are not guaranteed to be stable and may be re-generated over time. If the latter occurs, the checksums will likely change and the recipe will fail at do_fetch. It is recommended that you point to an actual commit or tag in the repository instead (using the repository URL in conjunction with the -S/--srcrev option).')
         # Fetch a URL
         fetchuri = reformat_git_uri(urldefrag(source)[0])
         if args.binary:
diff --git a/scripts/lib/recipetool/create_kmod.py b/scripts/lib/recipetool/create_kmod.py
index 4569b53..3982537 100644
--- a/scripts/lib/recipetool/create_kmod.py
+++ b/scripts/lib/recipetool/create_kmod.py
@@ -141,7 +141,7 @@ class KernelModuleRecipeHandler(RecipeHandler):
                 warnmsg = 'Unable to find means of passing kernel path into install makefile - if kernel path is hardcoded you will need to patch the makefile'
             if warnmsg:
                 warnmsg += '. Note that the variable KERNEL_SRC will be passed in as the kernel source path.'
-                logger.warn(warnmsg)
+                logger.warning(warnmsg)
                 lines_after.append('# %s' % warnmsg)
 
             return True
diff --git a/scripts/lib/recipetool/create_npm.py b/scripts/lib/recipetool/create_npm.py
index bb42a5c..0366788 100644
--- a/scripts/lib/recipetool/create_npm.py
+++ b/scripts/lib/recipetool/create_npm.py
@@ -90,7 +90,7 @@ class NpmRecipeHandler(RecipeHandler):
             runenv = dict(os.environ, PATH=d.getVar('PATH'))
             bb.process.run('npm shrinkwrap', cwd=srctree, stderr=subprocess.STDOUT, env=runenv, shell=True)
         except bb.process.ExecutionError as e:
-            logger.warn('npm shrinkwrap failed:\n%s' % e.stdout)
+            logger.warning('npm shrinkwrap failed:\n%s' % e.stdout)
             return
 
         tmpfile = os.path.join(localfilesdir, 'npm-shrinkwrap.json')
@@ -107,12 +107,12 @@ class NpmRecipeHandler(RecipeHandler):
                            cwd=srctree, stderr=subprocess.STDOUT, env=runenv, shell=True)
         relockbin = os.path.join(NpmRecipeHandler.lockdownpath, 'node_modules', 'lockdown', 'relock.js')
         if not os.path.exists(relockbin):
-            logger.warn('Could not find relock.js within lockdown directory; skipping lockdown')
+            logger.warning('Could not find relock.js within lockdown directory; skipping lockdown')
             return
         try:
             bb.process.run('node %s' % relockbin, cwd=srctree, stderr=subprocess.STDOUT, env=runenv, shell=True)
         except bb.process.ExecutionError as e:
-            logger.warn('lockdown-relock failed:\n%s' % e.stdout)
+            logger.warning('lockdown-relock failed:\n%s' % e.stdout)
             return
 
         tmpfile = os.path.join(localfilesdir, 'lockdown.json')
diff --git a/scripts/lib/recipetool/newappend.py b/scripts/lib/recipetool/newappend.py
index decce83..76707b4 100644
--- a/scripts/lib/recipetool/newappend.py
+++ b/scripts/lib/recipetool/newappend.py
@@ -58,11 +58,11 @@ def newappend(args):
         return 1
 
     if not path_ok:
-        logger.warn('Unable to determine correct subdirectory path for bbappend file - check that what %s adds to BBFILES also matches .bbappend files. Using %s for now, but until you fix this the bbappend will not be applied.', os.path.join(args.destlayer, 'conf', 'layer.conf'), os.path.dirname(append_path))
+        logger.warning('Unable to determine correct subdirectory path for bbappend file - check that what %s adds to BBFILES also matches .bbappend files. Using %s for now, but until you fix this the bbappend will not be applied.', os.path.join(args.destlayer, 'conf', 'layer.conf'), os.path.dirname(append_path))
 
     layerdirs = [os.path.abspath(layerdir) for layerdir in rd.getVar('BBLAYERS').split()]
     if not os.path.abspath(args.destlayer) in layerdirs:
-        logger.warn('Specified layer is not currently enabled in bblayers.conf, you will need to add it before this bbappend will be active')
+        logger.warning('Specified layer is not currently enabled in bblayers.conf, you will need to add it before this bbappend will be active')
 
     if not os.path.exists(append_path):
         bb.utils.mkdirhier(os.path.dirname(append_path))
diff --git a/scripts/lib/wic/engine.py b/scripts/lib/wic/engine.py
index 7e6519e..acaf958 100644
--- a/scripts/lib/wic/engine.py
+++ b/scripts/lib/wic/engine.py
@@ -506,7 +506,7 @@ class Disk:
                     sparse_copy(partfname, target, seek=part['start'] * self._lsector_size)
                     os.unlink(partfname)
                 elif part['type'] != 'f':
-                    logger.warn("skipping partition {}: unsupported fstype {}".format(pnum, fstype))
+                    logger.warning("skipping partition {}: unsupported fstype {}".format(pnum, fstype))
 
 def wic_ls(args, native_sysroot):
     """List contents of partitioned image or vfat partition."""
diff --git a/scripts/runqemu b/scripts/runqemu
index 1316aa4..b231ae6 100755
--- a/scripts/runqemu
+++ b/scripts/runqemu
@@ -290,7 +290,7 @@ class BaseConfig(object):
     def check_arg_fstype(self, fst):
         """Check and set FSTYPE"""
         if fst not in self.fstypes + self.vmtypes:
-            logger.warn("Maybe unsupported FSTYPE: %s" % fst)
+            logger.warning("Maybe unsupported FSTYPE: %s" % fst)
         if not self.fstype or self.fstype == fst:
             if fst == 'ramfs':
                 fst = 'cpio.gz'
@@ -352,7 +352,7 @@ class BaseConfig(object):
                     self.qemuboot = qb
                     self.qbconfload = True
                 else:
-                    logger.warn("%s doesn't exist" % qb)
+                    logger.warning("%s doesn't exist" % qb)
             else:
                 raise RunQemuError("Can't find FSTYPE from: %s" % p)
 
@@ -692,7 +692,7 @@ class BaseConfig(object):
             if not self.get('QB_AUDIO_DRV'):
                 raise RunQemuError("QB_AUDIO_DRV is NULL, this board doesn't support audio")
             if not self.get('QB_AUDIO_OPT'):
-                logger.warn('QB_AUDIO_OPT is NULL, you may need define it to make audio work')
+                logger.warning('QB_AUDIO_OPT is NULL, you may need define it to make audio work')
             else:
                 self.qemu_opt_script += ' %s' % self.get('QB_AUDIO_OPT')
             os.putenv('QEMU_AUDIO_DRV', self.get('QB_AUDIO_DRV'))
@@ -714,7 +714,7 @@ class BaseConfig(object):
             if self.get('DEPLOY_DIR_IMAGE'):
                 deploy_dir_image = self.get('DEPLOY_DIR_IMAGE')
             else:
-                logger.warn("Can't find qemuboot conf file, DEPLOY_DIR_IMAGE is NULL!")
+                logger.warning("Can't find qemuboot conf file, DEPLOY_DIR_IMAGE is NULL!")
                 return
 
             if self.rootfs and not os.path.exists(self.rootfs):
@@ -1058,9 +1058,9 @@ class BaseConfig(object):
                         # virtio might have been selected explicitly (just use it), or
                         # is used as fallback (then warn about that).
                         if not drive_type.startswith("/dev/vd"):
-                            logger.warn("Unknown QB_DRIVE_TYPE: %s" % drive_type)
-                            logger.warn("Failed to figure out drive type, consider define or fix QB_DRIVE_TYPE")
-                            logger.warn('Trying to use virtio block drive')
+                            logger.warning("Unknown QB_DRIVE_TYPE: %s" % drive_type)
+                            logger.warning("Failed to figure out drive type, consider define or fix QB_DRIVE_TYPE")
+                            logger.warning('Trying to use virtio block drive')
                         vm_drive = '-drive if=virtio,file=%s,format=%s' % (self.rootfs, rootfs_format)
 
                 # All branches above set vm_drive.
@@ -1275,7 +1275,7 @@ class BaseConfig(object):
             self.bitbake_e = subprocess.check_output(cmd, shell=True).decode('utf-8')
         except subprocess.CalledProcessError as err:
             self.bitbake_e = ''
-            logger.warn("Couldn't run 'bitbake -e' to gather environment information:\n%s" % err.output.decode('utf-8'))
+            logger.warning("Couldn't run 'bitbake -e' to gather environment information:\n%s" % err.output.decode('utf-8'))
 
     def validate_combos(self):
         if (self.fstype in self.vmtypes) and self.kernel:
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 31/33] oeqa/selftest/devtool: Ensure dbus is built befoe running test
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (29 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 30/33] logging: use warning instead warn Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 32/33] oeqa: Default to buffer mode for tests Armin Kuster
  2019-04-10 13:11 ` [PATCH 33/33] devtool: Split tests into multiple classes Armin Kuster
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Richard Purdie <richard.purdie@linuxfoundation.org>

If dbus isn't build first the dbus dependency of dbus-wait can't be detected
through pkgconfig and the test fails:

AssertionError: {'DEPENDS': {'dbus'}} != {}
- {'DEPENDS': {'dbus'}}
+ {} : Some expected variables not found in recipe: {'DEPENDS': {'dbus'}}

Ensure dbus is built and present in the sysroot.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 meta/lib/oeqa/selftest/cases/devtool.py | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/meta/lib/oeqa/selftest/cases/devtool.py b/meta/lib/oeqa/selftest/cases/devtool.py
index 0ce90a4..627bc65 100644
--- a/meta/lib/oeqa/selftest/cases/devtool.py
+++ b/meta/lib/oeqa/selftest/cases/devtool.py
@@ -300,6 +300,8 @@ class DevtoolTests(DevtoolBase):
 
     @OETestID(1423)
     def test_devtool_add_git_local(self):
+        # We need dbus built so that DEPENDS recognition works
+        bitbake('dbus')
         # Fetch source from a remote URL, but do it outside of devtool
         tempdir = tempfile.mkdtemp(prefix='devtoolqa')
         self.track_for_cleanup(tempdir)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 32/33] oeqa: Default to buffer mode for tests
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (30 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 31/33] oeqa/selftest/devtool: Ensure dbus is built befoe running test Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  2019-04-10 13:11 ` [PATCH 33/33] devtool: Split tests into multiple classes Armin Kuster
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Richard Purdie <richard.purdie@linuxfoundation.org>

Currently some tests run in buffer mode and some don't. Those that don't can
corrupt stdout/stderr. Switch to using buffer mode everywhere so we're consistent.

If there is useful output on stdout/stderr, it will be displayed if the test
fails.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 meta/lib/oeqa/core/context.py                    | 2 +-
 meta/lib/oeqa/core/runner.py                     | 5 -----
 meta/lib/oeqa/selftest/cases/devtool.py          | 2 --
 meta/lib/oeqa/selftest/cases/efibootpartition.py | 1 -
 meta/lib/oeqa/selftest/cases/imagefeatures.py    | 2 --
 meta/lib/oeqa/selftest/cases/runqemu.py          | 2 --
 6 files changed, 1 insertion(+), 13 deletions(-)

diff --git a/meta/lib/oeqa/core/context.py b/meta/lib/oeqa/core/context.py
index ef00845..cd6db23 100644
--- a/meta/lib/oeqa/core/context.py
+++ b/meta/lib/oeqa/core/context.py
@@ -58,7 +58,7 @@ class OETestContext(object):
         self.suites = self.loader.discover()
 
     def runTests(self, skips=[]):
-        self.runner = self.runnerClass(self, descriptions=False, verbosity=2)
+        self.runner = self.runnerClass(self, descriptions=False, verbosity=2, buffer=True)
 
         # Dinamically skip those tests specified though arguments
         self.skipTests(skips)
diff --git a/meta/lib/oeqa/core/runner.py b/meta/lib/oeqa/core/runner.py
index f8bb23f..0e6d215 100644
--- a/meta/lib/oeqa/core/runner.py
+++ b/meta/lib/oeqa/core/runner.py
@@ -43,11 +43,6 @@ class OETestResult(_TestResult):
         self.tc = tc
 
     def startTest(self, test):
-        # Allow us to trigger the testcase buffer mode on a per test basis
-        # so stdout/stderr are only printed upon failure. Enables debugging
-        # but clean output
-        if hasattr(test, "buffer"):
-            self.buffer = test.buffer
         super(OETestResult, self).startTest(test)
 
     def logSummary(self, component, context_msg=''):
diff --git a/meta/lib/oeqa/selftest/cases/devtool.py b/meta/lib/oeqa/selftest/cases/devtool.py
index 627bc65..99bfcd3 100644
--- a/meta/lib/oeqa/selftest/cases/devtool.py
+++ b/meta/lib/oeqa/selftest/cases/devtool.py
@@ -78,8 +78,6 @@ def tearDownModule():
 
 class DevtoolBase(OESelftestTestCase):
 
-    buffer = True
-
     def _test_recipe_contents(self, recipefile, checkvars, checkinherits):
         with open(recipefile, 'r') as f:
             invar = None
diff --git a/meta/lib/oeqa/selftest/cases/efibootpartition.py b/meta/lib/oeqa/selftest/cases/efibootpartition.py
index 0c83256..c6f39d5 100644
--- a/meta/lib/oeqa/selftest/cases/efibootpartition.py
+++ b/meta/lib/oeqa/selftest/cases/efibootpartition.py
@@ -11,7 +11,6 @@ from oeqa.utils.commands import bitbake, runqemu, get_bb_var
 class GenericEFITest(OESelftestTestCase):
     """EFI booting test class"""
 
-    buffer = True
     cmd_common = "runqemu nographic serial wic ovmf"
     efi_provider = "systemd-boot"
     image = "core-image-minimal"
diff --git a/meta/lib/oeqa/selftest/cases/imagefeatures.py b/meta/lib/oeqa/selftest/cases/imagefeatures.py
index 09e0b20..cdfd74b 100644
--- a/meta/lib/oeqa/selftest/cases/imagefeatures.py
+++ b/meta/lib/oeqa/selftest/cases/imagefeatures.py
@@ -10,8 +10,6 @@ class ImageFeatures(OESelftestTestCase):
     test_user = 'tester'
     root_user = 'root'
 
-    buffer = True
-
     @OETestID(1107)
     def test_non_root_user_can_connect_via_ssh_without_password(self):
         """
diff --git a/meta/lib/oeqa/selftest/cases/runqemu.py b/meta/lib/oeqa/selftest/cases/runqemu.py
index 8f4084d..a23a1d8 100644
--- a/meta/lib/oeqa/selftest/cases/runqemu.py
+++ b/meta/lib/oeqa/selftest/cases/runqemu.py
@@ -15,8 +15,6 @@ class RunqemuTests(OESelftestTestCase):
 
     image_is_ready = False
     deploy_dir_image = ''
-    # We only want to print runqemu stdout/stderr if there is a test case failure
-    buffer = True
 
     def setUpLocal(self):
         super(RunqemuTests, self).setUpLocal()
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 33/33] devtool: Split tests into multiple classes
  2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
                   ` (31 preceding siblings ...)
  2019-04-10 13:11 ` [PATCH 32/33] oeqa: Default to buffer mode for tests Armin Kuster
@ 2019-04-10 13:11 ` Armin Kuster
  32 siblings, 0 replies; 34+ messages in thread
From: Armin Kuster @ 2019-04-10 13:11 UTC (permalink / raw)
  To: openembedded-core

From: Richard Purdie <richard.purdie@linuxfoundation.org>

This allows better parallelism between the different tests as currently
this block takes the longest time to execute. devtool tests are still
all grouped into the "devtool" module for ease of exection.

This also makes it easier to execute some subset of devtool tests for
testing devtool changes.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
---
 meta/lib/oeqa/selftest/cases/devtool.py | 113 +++++++++++++++++---------------
 1 file changed, 61 insertions(+), 52 deletions(-)

diff --git a/meta/lib/oeqa/selftest/cases/devtool.py b/meta/lib/oeqa/selftest/cases/devtool.py
index 99bfcd3..9eb9bad 100644
--- a/meta/lib/oeqa/selftest/cases/devtool.py
+++ b/meta/lib/oeqa/selftest/cases/devtool.py
@@ -78,6 +78,58 @@ def tearDownModule():
 
 class DevtoolBase(OESelftestTestCase):
 
+    @classmethod
+    def setUpClass(cls):
+        super(DevtoolBase, cls).setUpClass()
+        bb_vars = get_bb_vars(['TOPDIR', 'SSTATE_DIR'])
+        cls.original_sstate = bb_vars['SSTATE_DIR']
+        cls.devtool_sstate = os.path.join(bb_vars['TOPDIR'], 'sstate_devtool')
+        cls.sstate_conf  = 'SSTATE_DIR = "%s"\n' % cls.devtool_sstate
+        cls.sstate_conf += ('SSTATE_MIRRORS += "file://.* file:///%s/PATH"\n'
+                            % cls.original_sstate)
+
+    @classmethod
+    def tearDownClass(cls):
+        cls.logger.debug('Deleting devtool sstate cache on %s' % cls.devtool_sstate)
+        runCmd('rm -rf %s' % cls.devtool_sstate)
+        super(DevtoolBase, cls).tearDownClass()
+
+    def setUp(self):
+        """Test case setup function"""
+        super(DevtoolBase, self).setUp()
+        self.workspacedir = os.path.join(self.builddir, 'workspace')
+        self.assertTrue(not os.path.exists(self.workspacedir),
+                        'This test cannot be run with a workspace directory '
+                        'under the build directory')
+        self.append_config(self.sstate_conf)
+
+    def _check_src_repo(self, repo_dir):
+        """Check srctree git repository"""
+        self.assertTrue(os.path.isdir(os.path.join(repo_dir, '.git')),
+                        'git repository for external source tree not found')
+        result = runCmd('git status --porcelain', cwd=repo_dir)
+        self.assertEqual(result.output.strip(), "",
+                         'Created git repo is not clean')
+        result = runCmd('git symbolic-ref HEAD', cwd=repo_dir)
+        self.assertEqual(result.output.strip(), "refs/heads/devtool",
+                         'Wrong branch in git repo')
+
+    def _check_repo_status(self, repo_dir, expected_status):
+        """Check the worktree status of a repository"""
+        result = runCmd('git status . --porcelain',
+                        cwd=repo_dir)
+        for line in result.output.splitlines():
+            for ind, (f_status, fn_re) in enumerate(expected_status):
+                if re.match(fn_re, line[3:]):
+                    if f_status != line[:2]:
+                        self.fail('Unexpected status in line: %s' % line)
+                    expected_status.pop(ind)
+                    break
+            else:
+                self.fail('Unexpected modified file in line: %s' % line)
+        if expected_status:
+            self.fail('Missing file changes: %s' % expected_status)
+
     def _test_recipe_contents(self, recipefile, checkvars, checkinherits):
         with open(recipefile, 'r') as f:
             invar = None
@@ -181,58 +233,6 @@ class DevtoolBase(OESelftestTestCase):
 
 class DevtoolTests(DevtoolBase):
 
-    @classmethod
-    def setUpClass(cls):
-        super(DevtoolTests, cls).setUpClass()
-        bb_vars = get_bb_vars(['TOPDIR', 'SSTATE_DIR'])
-        cls.original_sstate = bb_vars['SSTATE_DIR']
-        cls.devtool_sstate = os.path.join(bb_vars['TOPDIR'], 'sstate_devtool')
-        cls.sstate_conf  = 'SSTATE_DIR = "%s"\n' % cls.devtool_sstate
-        cls.sstate_conf += ('SSTATE_MIRRORS += "file://.* file:///%s/PATH"\n'
-                            % cls.original_sstate)
-
-    @classmethod
-    def tearDownClass(cls):
-        cls.logger.debug('Deleting devtool sstate cache on %s' % cls.devtool_sstate)
-        runCmd('rm -rf %s' % cls.devtool_sstate)
-        super(DevtoolTests, cls).tearDownClass()
-
-    def setUp(self):
-        """Test case setup function"""
-        super(DevtoolTests, self).setUp()
-        self.workspacedir = os.path.join(self.builddir, 'workspace')
-        self.assertTrue(not os.path.exists(self.workspacedir),
-                        'This test cannot be run with a workspace directory '
-                        'under the build directory')
-        self.append_config(self.sstate_conf)
-
-    def _check_src_repo(self, repo_dir):
-        """Check srctree git repository"""
-        self.assertTrue(os.path.isdir(os.path.join(repo_dir, '.git')),
-                        'git repository for external source tree not found')
-        result = runCmd('git status --porcelain', cwd=repo_dir)
-        self.assertEqual(result.output.strip(), "",
-                         'Created git repo is not clean')
-        result = runCmd('git symbolic-ref HEAD', cwd=repo_dir)
-        self.assertEqual(result.output.strip(), "refs/heads/devtool",
-                         'Wrong branch in git repo')
-
-    def _check_repo_status(self, repo_dir, expected_status):
-        """Check the worktree status of a repository"""
-        result = runCmd('git status . --porcelain',
-                        cwd=repo_dir)
-        for line in result.output.splitlines():
-            for ind, (f_status, fn_re) in enumerate(expected_status):
-                if re.match(fn_re, line[3:]):
-                    if f_status != line[:2]:
-                        self.fail('Unexpected status in line: %s' % line)
-                    expected_status.pop(ind)
-                    break
-            else:
-                self.fail('Unexpected modified file in line: %s' % line)
-        if expected_status:
-            self.fail('Missing file changes: %s' % expected_status)
-
     @OETestID(1158)
     def test_create_workspace(self):
         # Check preconditions
@@ -254,6 +254,8 @@ class DevtoolTests(DevtoolBase):
         self.assertNotIn(tempdir, result.output)
         self.assertIn(self.workspacedir, result.output)
 
+class DevtoolAddTests(DevtoolBase):
+
     @OETestID(1159)
     def test_devtool_add(self):
         # Fetch source
@@ -509,6 +511,8 @@ class DevtoolTests(DevtoolBase):
         checkvars['SRC_URI'] = url.replace(testver, '${PV}')
         self._test_recipe_contents(recipefile, checkvars, [])
 
+class DevtoolModifyTests(DevtoolBase):
+
     @OETestID(1164)
     def test_devtool_modify(self):
         import oe.path
@@ -754,6 +758,7 @@ class DevtoolTests(DevtoolBase):
         self._check_src_repo(tempdir)
         # This is probably sufficient
 
+class DevtoolUpdateTests(DevtoolBase):
 
     @OETestID(1169)
     def test_devtool_update_recipe(self):
@@ -1170,6 +1175,8 @@ class DevtoolTests(DevtoolBase):
         expected_status = []
         self._check_repo_status(os.path.dirname(recipefile), expected_status)
 
+class DevtoolExtractTests(DevtoolBase):
+
     @OETestID(1163)
     def test_devtool_extract(self):
         tempdir = tempfile.mkdtemp(prefix='devtoolqa')
@@ -1339,6 +1346,8 @@ class DevtoolTests(DevtoolBase):
         if reqpkgs:
             self.fail('The following packages were not present in the image as expected: %s' % ', '.join(reqpkgs))
 
+class DevtoolUpgradeTests(DevtoolBase):
+
     @OETestID(1367)
     def test_devtool_upgrade(self):
         # Check preconditions
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 34+ messages in thread

end of thread, other threads:[~2019-04-10 13:12 UTC | newest]

Thread overview: 34+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-04-10 13:11 [PATCH 00/33] Sumo next patch review Armin Kuster
2019-04-10 13:11 ` [PATCH 01/33] oeqa/manual: transfer manual test cases from testopia to oeqa Armin Kuster
2019-04-10 13:11 ` [PATCH 02/33] oeqa/manual: Remove bitbake-selftest execution Armin Kuster
2019-04-10 13:11 ` [PATCH 03/33] oeqa/manual/build-appliance: Drop test which is already automated Armin Kuster
2019-04-10 13:11 ` [PATCH 04/33] oeqa/manual/bsp-qemu.json: Update for QEMU_USE_KVM Armin Kuster
2019-04-10 13:11 ` [PATCH 05/33] oeqa/manual: Add manual runtime 'compliance' testcases to json Armin Kuster
2019-04-10 13:11 ` [PATCH 06/33] oeqa/manual/sdk.json: Updated toolchain tarball to core-image-sato Armin Kuster
2019-04-10 13:11 ` [PATCH 07/33] oeqa/manual/bsp-hw.json: add non-IA tests Armin Kuster
2019-04-10 13:11 ` [PATCH 08/33] oeqa/manual/bsp-hw.json: test id updated and obsolete test cases removed Armin Kuster
2019-04-10 13:11 ` [PATCH 09/33] oeqa/manual/compliance-test.json: test id updated and missing test cases added Armin Kuster
2019-04-10 13:11 ` [PATCH 10/33] oeqa/manual/kernel-dev.json: test id updated Armin Kuster
2019-04-10 13:11 ` [PATCH 11/33] oeqa/manual/toaster: transfer manual toaster test cases to oeqa Armin Kuster
2019-04-10 13:11 ` [PATCH 12/33] oeqa/manual/toaster: updated test id naming Armin Kuster
2019-04-10 13:11 ` [PATCH 13/33] resulttool: Enable report for single result file Armin Kuster
2019-04-10 13:11 ` [PATCH 14/33] resulttool: Allow store to work on single files Armin Kuster
2019-04-10 13:11 ` [PATCH 15/33] resulttool: Allow extraction of ptest data Armin Kuster
2019-04-10 13:11 ` [PATCH 16/33] resulttool/manualexecution: Standardize input check Armin Kuster
2019-04-10 13:11 ` [PATCH 17/33] resulttool/manualexecution: Enable display full steps without press enter Armin Kuster
2019-04-10 13:11 ` [PATCH 18/33] resulttool/manualexecution: Fixed step sorted by integer Armin Kuster
2019-04-10 13:11 ` [PATCH 19/33] resulttool/manualexecution: Refactor and simplify codebase Armin Kuster
2019-04-10 13:11 ` [PATCH 20/33] pkgdata.py: avoid target-sdk-dummy-provides to mess things up Armin Kuster
2019-04-10 13:11 ` [PATCH 21/33] wic: Support for changing the imager Armin Kuster
2019-04-10 13:11 ` [PATCH 22/33] scripts/wic: Be consistent about how we call bitbake Armin Kuster
2019-04-10 13:11 ` [PATCH 23/33] wic: make engine.py:get_partitions() resilient to parted/dmidecode stderr output Armin Kuster
2019-04-10 13:11 ` [PATCH 24/33] wic: search nonarch STAGING_DATADIR for multilib Armin Kuster
2019-04-10 13:11 ` [PATCH 25/33] scripts/lib/wic/engine: Fix cp's target path for ext* filesystems Armin Kuster
2019-04-10 13:11 ` [PATCH 26/33] wic/engine.py: Load paths from PATH environment variable Armin Kuster
2019-04-10 13:11 ` [PATCH 27/33] wic/engine: Fix missing parted autobuilder failures Armin Kuster
2019-04-10 13:11 ` [PATCH 28/33] wic: use explicit errno import Armin Kuster
2019-04-10 13:11 ` [PATCH 29/33] lib/oe: Fix collections ABCs DeprecationWarning in Python 3.7+ Armin Kuster
2019-04-10 13:11 ` [PATCH 30/33] logging: use warning instead warn Armin Kuster
2019-04-10 13:11 ` [PATCH 31/33] oeqa/selftest/devtool: Ensure dbus is built befoe running test Armin Kuster
2019-04-10 13:11 ` [PATCH 32/33] oeqa: Default to buffer mode for tests Armin Kuster
2019-04-10 13:11 ` [PATCH 33/33] devtool: Split tests into multiple classes Armin Kuster

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.