From cdfa5ae1e91830d945794b899a2e15f150fa828c Mon Sep 17 00:00:00 2001
From: Chase Qi <chase.qi@linaro.org>
Date: Tue, 31 May 2022 12:12:45 +0800
Subject: [PATCH] ci: add oe-selftest gcc test jobs

gcc test suite has been integrated in oe-selftest framework. It allows
to run gcc test against qemu vm and within the build env using qemu
linux-user mode.

These tests can be run in gitlab CI with qemu friendly runners. This
commit add three oe-selftest jobs to run the tests using qemu
linux-user, qemu x86-64 vm and qemu arm64 vm.

Test log and sum files are collected as job artifacts.

When all test jobs finish, report job will be triggered to parse the
sum files to generate results in the format that supported by squad. The
report job will upload results to squad for reporting.

Signed-off-by: Chase Qi <chase.qi@linaro.org>
---
 .gitlab-ci.yml                      | 87 +++++++++++++++++++++++++++++
 .oniro-ci/build-generic.yaml        | 34 +++++++++++
 docs/ci/hidden-jobs/index.rst       |  1 +
 docs/ci/hidden-jobs/oe-selftest.rst | 30 ++++++++++
 4 files changed, 152 insertions(+)
 create mode 100644 docs/ci/hidden-jobs/oe-selftest.rst

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 10d41ac7..2907e6af 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -550,3 +550,90 @@ build-npm-cspell:
   extends: .build-with-kaniko
   variables:
     CONTAINER_PATH: npm-cspell
+
+.oe-selftest-rules:
+  rules:
+    - if: '$CI_PIPELINE_SOURCE == "schedule" && $OE_SELFTEST == gcc'
+
+oe-selftest-gcc-qemu-linux-user:
+  extends: [.oe-selftest, .oe-selftest-rules]
+  variables:
+    CI_ONIRO_OE_SEFLTESTS:
+      gcc.GccCrossSelfTest
+      gcc.GccLibAtomicSelfTest
+      gcc.GccLibGompSelfTest
+      gcc.GccLibItmSelfTest
+      gcc.GccLibSspSelfTest
+      gcc.GccLibStdCxxSelfTest
+      gcc.GxxCrossSelfTest
+
+.oe-selftest-gcc-system-emulated:
+  timeout: 8h
+  extends: [.oe-selftest, .oe-selftest-rules]
+  variables:
+    MACHINE: qemux86-64
+    CI_ONIRO_OE_SEFLTESTS:
+      gcc.GccCrossSelfTestSystemEmulated
+      gcc.GccLibAtomicSelfTestSystemEmulated
+      gcc.GccLibGompSelfTestSystemEmulated
+      gcc.GccLibItmSelfTestSystemEmulated
+      gcc.GccLibStdCxxSelfTestSystemEmulated
+      gcc.GccLibSspSelfTestSystemEmulated
+      gcc.GxxCrossSelfTestSystemEmulated
+
+oe-selftest-gcc-system-emulated-qemux86-64:
+  extends: .oe-selftest-gcc-system-emulated
+  variables:
+    MACHINE: qemux86-64
+
+oe-selftest-gcc-system-emulated-qemuarm64:
+  extends: .oe-selftest-gcc-system-emulated
+  variables:
+    MACHINE: qemuarm64
+
+oe-selftest-report:
+  timeout: 6h
+  extends: .oe-selftest-rules
+  image:
+    name: chaseqi/bitbake-builder:v1.3
+  stage: report
+  dependencies:
+    - oe-selftest-gcc-qemu-linux-user
+    - oe-selftest-gcc-system-emulated-qemux86-64
+    - oe-selftest-gcc-system-emulated-qemuarm64
+  needs:
+    - oe-selftest-gcc-qemu-linux-user
+    - oe-selftest-gcc-system-emulated-qemux86-64
+    - oe-selftest-gcc-system-emulated-qemuarm64
+  script:
+    - |
+      set -x
+      curl https://git.ostc-eu.org/OSTC/infrastructure/lava/lava-test-definitions/-/raw/gcc-test/automated/utils/gcc-result-parser.py \
+        > gcc-result-parser.py
+      for job_path in $(find artifacts/ -type d -name oe-selftest-gcc*); do
+        (
+          job=$(basename $job_path)
+          test_env="$(echo $job | cut -d'-' -f4-)"
+          cd $job_path
+          xz -d *.xz
+          # Parse sum file.
+          for sum_file in $(ls *.sum); do
+            python3 $CI_PROJECT_DIR/gcc-result-parser.py $sum_file
+          done
+          # Upload result to squad.
+          for result_file in $(ls result_*.json); do
+            component="$(basename $result_file .json | cut -d'_' -f2-)"
+            job_id="$job-$component"
+            time curl \
+              --header "Auth-Token: $CI_SQUAD_TOKEN" \
+              https://squadp.svc.ostc-eu.dev/api/submit/oniro-core/gcc-test/$CI_PIPELINE_ID/$test_env \
+              --form tests=@$result_file \
+              --form metadata='{"job_id": "'$job_id'"}'
+          done
+        )
+      done
+      set +x
+  artifacts:
+    paths:
+      - artifacts/oe-selftest-gcc*/*.json
+      - artifacts/oe-selftest-gcc*/*.txt
diff --git a/.oniro-ci/build-generic.yaml b/.oniro-ci/build-generic.yaml
index 67abc4ad..d972b1e9 100644
--- a/.oniro-ci/build-generic.yaml
+++ b/.oniro-ci/build-generic.yaml
@@ -451,3 +451,37 @@
         # Run this job in case the pipeline changes.
         - .oniro-ci/*.yml
         - .gitlab-ci.yml
+
+# This job is documented in docs/ci/hidden-jobs/oe-selftest.rst
+.oe-selftest:
+  image:
+    name: chaseqi/bitbake-builder:v1.3
+  tags: [qemu-friendly, large-disk, $CI_ONIRO_RUNNER_TAG, $CI_ONIRO_INSTANCE_SIZE]
+  stage: test
+  dependencies: []
+  extends: .bitbake-workspace
+  variables:
+    MACHINE: qemux86-64
+    CI_ONIRO_BUILD_FLAVOUR: linux
+    CI_ONIRO_BB_LOCAL_CONF_SANITY_TESTED_DISTROS: ""
+    CI_ONIRO_OE_SEFLTESTS: ""
+    CI_ONIRO_OE_SEFLTEST_SKIPS: ""
+  script:
+    - test -n "$CI_ONIRO_OE_SEFLTESTS" || (
+        echo "nothing to test - CI_ONIRO_OE_SEFLTESTS is empty"
+        && exit 1 )
+    - !reference [.bitbake-workspace, script]
+    # The USER variable is required by oe-selftest but missing in env.
+    - export USER=builder
+    - echo "MACHINE = \"$MACHINE\"" >> conf/local.conf
+    - echo "Running specific tests $CI_ONIRO_OE_SEFLTESTS ..."
+    - time oe-selftest -vvv -r $CI_ONIRO_OE_SEFLTESTS -K
+    - artifacts_dir="$CI_PROJECT_DIR/artifacts/$CI_JOB_NAME"
+    - rm -rf "$artifacts_dir" & mkdir -p "$artifacts_dir"
+    - find ../build-st \( -name "*.sum" -o -name "*.log" \) \( -path "*/gcc-runtime/*testsuite*" \)
+        -exec cp --verbose {} "$artifacts_dir" \;
+    - for file in $(find "$artifacts_dir" -type f); do xz $file; done
+    - rm -rf ../build-st
+  artifacts:
+    paths:
+      - artifacts/$CI_JOB_NAME
diff --git a/docs/ci/hidden-jobs/index.rst b/docs/ci/hidden-jobs/index.rst
index 9248b2d5..e8098138 100644
--- a/docs/ci/hidden-jobs/index.rst
+++ b/docs/ci/hidden-jobs/index.rst
@@ -30,3 +30,4 @@ implementation details.
    lava-report
    aggregate-docs
    publish-rauc-bundle-to-hawkbit
+   oe-selftest
diff --git a/docs/ci/hidden-jobs/oe-selftest.rst b/docs/ci/hidden-jobs/oe-selftest.rst
new file mode 100644
index 00000000..d457335c
--- /dev/null
+++ b/docs/ci/hidden-jobs/oe-selftest.rst
@@ -0,0 +1,30 @@
+.. SPDX-FileCopyrightText: Huawei Inc.
+..
+.. SPDX-License-Identifier: CC-BY-4.0
+
+============
+.oe-selftest
+============
+
+The ``.oe-selftest`` job extends the :doc:`bitbake-workspace` job to configure
+OpenEmbedded Self test environment. The job does not run any tests by itself,
+actual tests should be run in the downstream test jobs.
+
+Job Variables
+=============
+
+Oe-selftest is based on Python unitest. Tests are orgnazied by module, class
+and method. The ``.oe-selftest`` job defines two variables as a way to
+customize what tests to run.
+
+CI_ONIRO_OE_SEFLTESTS
+---------------------
+
+The specific tests to run. The default value is empty. The order the tests are
+running is alphabetical.
+
+
+CI_ONIRO_OE_SEFLTEST_SKIPS
+--------------------------
+
+The specific tests to skip. The default value is empty.
-- 
GitLab