diff mbox series

[5/6] testexport.bbclass oe-test: capture tests and data from all layers

Message ID 20250627063004.781560-5-mikko.rapeli@linaro.org
State New
Headers show
Series [1/6] oeqa runtime ping.py: make run_network_serialdebug() specific to qemu | expand

Commit Message

Mikko Rapeli June 27, 2025, 6:30 a.m. UTC
testexport.bbclass only copied files from core layer to
the testexport.tar.gz to run tests. Then it removed
all tests and files which were not specified in
TEST_SUITES variable.

Stop removing files to include for example parselogs.py
test data files which are machine and/or layer specific.
TEST_SUITES variable is now read from build time exported
data store when running tests.

Then copy oeqa runtime files from all layers so that tests and
test data like parselogs ignore files will be provided
to testexport.tar.gz.

Adapt oe-test script to find "lib" directories from
the new structure with layer specific paths.

Signed-off-by: Mikko Rapeli <mikko.rapeli@linaro.org>
---
 meta/classes-recipe/testexport.bbclass | 43 +++++++++++++-------------
 scripts/oe-test                        | 12 ++++---
 2 files changed, 30 insertions(+), 25 deletions(-)

Comments

Richard Purdie June 29, 2025, 7:05 a.m. UTC | #1
On Fri, 2025-06-27 at 09:30 +0300, Mikko Rapeli via lists.openembedded.org wrote:
> testexport.bbclass only copied files from core layer to
> the testexport.tar.gz to run tests. Then it removed
> all tests and files which were not specified in
> TEST_SUITES variable.
> 
> Stop removing files to include for example parselogs.py
> test data files which are machine and/or layer specific.
> TEST_SUITES variable is now read from build time exported
> data store when running tests.
> 
> Then copy oeqa runtime files from all layers so that tests and
> test data like parselogs ignore files will be provided
> to testexport.tar.gz.
> 
> Adapt oe-test script to find "lib" directories from
> the new structure with layer specific paths.
> 
> Signed-off-by: Mikko Rapeli <mikko.rapeli@linaro.org>
> ---
>  meta/classes-recipe/testexport.bbclass | 43 +++++++++++++-------------
>  scripts/oe-test                        | 12 ++++---
>  2 files changed, 30 insertions(+), 25 deletions(-)

The patch does things which aren't really spelt out in the commit
message. This change removes the target specific filtering, putting all
tests into the output and not just the ones applicable to the target in
question.

Once you do that, "testexport" may as well be a script rather than a
task as it is no longer target specific.

As I've said elsewhere, I'm not against doing it but the commit message
should be clear, and it does raise the question of whether we just jump
to that external script and remove this class?

Cheers,

Richard
Mikko Rapeli June 30, 2025, 8:10 a.m. UTC | #2
Hi,

On Sun, Jun 29, 2025 at 08:05:35AM +0100, Richard Purdie wrote:
> On Fri, 2025-06-27 at 09:30 +0300, Mikko Rapeli via lists.openembedded.org wrote:
> > testexport.bbclass only copied files from core layer to
> > the testexport.tar.gz to run tests. Then it removed
> > all tests and files which were not specified in
> > TEST_SUITES variable.
> > 
> > Stop removing files to include for example parselogs.py
> > test data files which are machine and/or layer specific.
> > TEST_SUITES variable is now read from build time exported
> > data store when running tests.
> > 
> > Then copy oeqa runtime files from all layers so that tests and
> > test data like parselogs ignore files will be provided
> > to testexport.tar.gz.
> > 
> > Adapt oe-test script to find "lib" directories from
> > the new structure with layer specific paths.
> > 
> > Signed-off-by: Mikko Rapeli <mikko.rapeli@linaro.org>
> > ---
> > �meta/classes-recipe/testexport.bbclass | 43 +++++++++++++-------------
> > �scripts/oe-test����������������������� | 12 ++++---
> > �2 files changed, 30 insertions(+), 25 deletions(-)
> 
> The patch does things which aren't really spelt out in the commit
> message. This change removes the target specific filtering, putting all
> tests into the output and not just the ones applicable to the target in
> question.

Sorry, tried to describe this but failed. Yes, all tests are now exported,
also the ones not needed by the current image target because the TEST_SUITES
variable is read from exported data at test run time.
 
> Once you do that, "testexport" may as well be a script rather than a
> task as it is no longer target specific.

For the test python files and data, yes, but not for the data file
which actually describes what tests to run.

> As I've said elsewhere, I'm not against doing it but the commit message
> should be clear, and it does raise the question of whether we just jump
> to that external script and remove this class?

We still need to export the per-image manifest and testdata. If those
are exported elsewhere, then these all could be an external script to
create a tar ball to run the configured tests.

Cheers,

-Mikko
diff mbox series

Patch

diff --git a/meta/classes-recipe/testexport.bbclass b/meta/classes-recipe/testexport.bbclass
index cc4088c71a13..843d777e3bb9 100644
--- a/meta/classes-recipe/testexport.bbclass
+++ b/meta/classes-recipe/testexport.bbclass
@@ -85,6 +85,7 @@  def copy_needed_files(d, tc):
 
     export_path = d.getVar('TEST_EXPORT_DIR')
     corebase_path = d.getVar('COREBASE')
+    bblayers = d.getVar('BBLAYERS').split()
 
     # Clean everything before starting
     oe.path.remove(export_path)
@@ -92,17 +93,11 @@  def copy_needed_files(d, tc):
 
     # The source of files to copy are relative to 'COREBASE' directory
     # The destination is relative to 'TEST_EXPORT_DIR'
-    # Because we are squashing the libraries, we need to remove
-    # the layer/script directory
-    files_to_copy = [ os.path.join('meta', 'lib', 'oeqa', 'core'),
-                      os.path.join('meta', 'lib', 'oeqa', 'runtime'),
-                      os.path.join('meta', 'lib', 'oeqa', 'files'),
-                      os.path.join('meta', 'lib', 'oeqa', 'utils'),
-                      os.path.join('scripts', 'oe-test'),
+    # core files/dirs first
+    core_files_to_copy = [ os.path.join('scripts', 'oe-test'),
                       os.path.join('scripts', 'lib', 'argparse_oe.py'),
                       os.path.join('scripts', 'lib', 'scriptutils.py'), ]
-
-    for f in files_to_copy:
+    for f in core_files_to_copy:
         src = os.path.join(corebase_path, f)
         dst = os.path.join(export_path, f.split('/', 1)[-1])
         if os.path.isdir(src):
@@ -110,18 +105,21 @@  def copy_needed_files(d, tc):
         else:
             shutil.copy2(src, dst)
 
-    # Remove cases and just copy the ones specified
-    cases_path = os.path.join(export_path, 'lib', 'oeqa', 'runtime', 'cases')
-    oe.path.remove(cases_path)
-    bb.utils.mkdirhier(cases_path)
-    test_paths = get_runtime_paths(d)
-    test_modules = d.getVar('TEST_SUITES').split()
-    tc.loadTests(test_paths, modules=test_modules)
-    for f in getSuiteCasesFiles(tc.suites):
-        shutil.copy2(f, cases_path)
-        json_file = _get_json_file(f)
-        if json_file:
-            shutil.copy2(json_file, cases_path)
+    # layer specific files/dirs
+    layer_files_to_copy = [ os.path.join('lib', 'oeqa', 'core'),
+                      os.path.join('lib', 'oeqa', 'runtime'),
+                      os.path.join('lib', 'oeqa', 'files'),
+                      os.path.join('lib', 'oeqa', 'utils'),]
+    for layer in bblayers:
+        meta = os.path.basename(layer)
+        for f in layer_files_to_copy:
+            src = os.path.join(layer, f)
+            dst = os.path.join(export_path, meta, f)
+            if os.path.exists(src):
+                if os.path.isdir(src):
+                    oe.path.copytree(src, dst)
+                else:
+                    shutil.copy2(src, dst)
 
     # Copy test data
     image_name = ("%s/%s" % (d.getVar('DEPLOY_DIR_IMAGE'),
@@ -142,6 +140,9 @@  def copy_needed_files(d, tc):
     testexport_create_tarball(d, "testexport.tar.gz", d.getVar("TEST_EXPORT_DIR"))
 
     # Copy packages needed for runtime testing
+    test_paths = get_runtime_paths(d)
+    test_modules = d.getVar('TEST_SUITES').split()
+    tc.loadTests(test_paths, modules=test_modules)
     package_extraction(d, tc.suites)
     test_pkg_dir = d.getVar("TEST_NEEDED_PACKAGES_DIR")
     if os.path.isdir(test_pkg_dir) and os.listdir(test_pkg_dir):
diff --git a/scripts/oe-test b/scripts/oe-test
index 55985b0b2453..efb83c3e7809 100755
--- a/scripts/oe-test
+++ b/scripts/oe-test
@@ -7,14 +7,18 @@ 
 # SPDX-License-Identifier: MIT
 #
 
-import os
-import sys
 import argparse
+import glob
 import logging
+import os
+import sys
 
 scripts_path = os.path.dirname(os.path.realpath(__file__))
-lib_path = scripts_path + '/lib'
-sys.path = sys.path + [lib_path]
+lib_path = os.path.join(scripts_path, 'lib')
+sys.path.append(lib_path)
+meta_lib_paths = glob.glob(scripts_path + '/*/lib', root_dir=scripts_path, recursive=True)
+for p in meta_lib_paths:
+    sys.path.append(p)
 import argparse_oe
 import scriptutils