summaryrefslogtreecommitdiff
path: root/meta-arm/meta-arm-systemready/classes/arm-systemready-acs.bbclass
blob: e988802368aa436f1d0027d9d2a7e372ec736a45 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# This class contains the common logic to deploy the SystemReady ACS pre-built
# image and set up the testimage environment. It is to be inherited by recipes
# which contains the URI to download the SystemReady ACS image.
# This class also contains a testimage "postfunc" called acs_logs_handle which
# performs the following functions after the tests have completed:
#   * Extract the acs_results directory from the Wic image to
#     ${WORKDIR}/testimage
#   * Create a symlink to the acs_results in ${TMPDIR}/log/oeqa for ease of
#     access
#   * Run the test parser, format results, and check results routines

INHIBIT_DEFAULT_DEPS = "1"
COMPATIBLE_HOST = "aarch64-*"
PACKAGE_ARCH = "${MACHINE_ARCH}"
inherit nopackages deploy rootfs-postcommands ${IMAGE_CLASSES} python3native

do_configure[noexec] = "1"
do_compile[noexec] = "1"
do_install[noexec] = "1"
do_testimage[depends] += "mtools-native:do_populate_sysroot"

# Deploy with this suffix so it is picked up in the machine configuration
IMAGE_DEPLOY_SUFFIX ?= ".wic"

# Post-process commands may write to IMGDEPLOYDIR
IMGDEPLOYDIR = "${DEPLOYDIR}"
# Write the test data in IMAGE_POSTPROCESS_COMMAND
IMAGE_POSTPROCESS_COMMAND += "write_image_test_data; "

python do_deploy() {
    deploydir = d.getVar('DEPLOYDIR')
    suffix = d.getVar('IMAGE_DEPLOY_SUFFIX')
    imgfile = os.path.join(d.getVar('WORKDIR'), d.getVar('IMAGE_FILENAME'))
    deployfile = os.path.join(deploydir, d.getVar('IMAGE_NAME') + suffix)
    linkfile = os.path.join(deploydir, d.getVar('IMAGE_LINK_NAME') + suffix)

    # Install the image file in the deploy directory
    import shutil
    shutil.copyfile(imgfile, deployfile)
    if os.path.lexists(linkfile):
        os.remove(manifest_link)
    os.symlink(os.path.basename(deployfile), linkfile)

    # Run the image post-process commands
    from oe.utils import execute_pre_post_process
    post_process_cmds = d.getVar("IMAGE_POSTPROCESS_COMMAND")
    execute_pre_post_process(d, post_process_cmds)

    # Copy the report.txt to DEPLOYDIR
    # The machine-specific implementation can optionally put the report file in
    # ${WORKDIR}/report.txt. If there is no such file present, use the template.
    workdir = d.getVar('WORKDIR')
    report_file = os.path.join(workdir, "report.txt")
    report_file_dest = os.path.join(deploydir, "report.txt")
    if os.path.exists(report_file):
        report_file_to_copy = report_file
    else:
        report_file_to_copy = os.path.join(workdir, "systemready-ir-template",
                                            "report.txt")
    shutil.copyfile(report_file_to_copy, report_file_dest)

    # Ensure an empty rootfs manifest exists (required by testimage)
    fname = os.path.join(deploydir, d.getVar('IMAGE_LINK_NAME') + ".manifest")
    open(fname, 'w').close()
}
addtask deploy after do_install before do_image_complete

do_image_complete() {
    true
}
addtask image_complete after do_deploy before do_build
do_image_complete[depends] += "arm-systemready-firmware:do_image_complete"

ACS_LOG_NAME = "acs_results_${DATETIME}"
ACS_LOG_NAME[vardepsexclude] += "DATETIME"
ACS_LOG_DIR = "${TEST_LOG_DIR}/${ACS_LOG_NAME}"
ACS_LOG_LINK = "${TEST_LOG_DIR}/acs_results"
TEST_LOG_DIR = "${WORKDIR}/testimage"
RM_WORK_EXCLUDE_ITEMS += "${@ os.path.basename(d.getVar('TEST_LOG_DIR')) }"

do_testimage[postfuncs] += "acs_logs_handle"
do_testimage[depends] += "edk2-test-parser-native:do_populate_sysroot \
                          arm-systemready-scripts-native:do_populate_sysroot"

# Process the logs
python acs_logs_handle() {
    import logging
    from oeqa.utils import make_logger_bitbake_compatible
    import shutil

    deploy_dir_image = d.getVar('DEPLOY_DIR_IMAGE')
    systemready_scripts_dir = os.path.join(d.getVar('STAGING_LIBDIR_NATIVE'),
                                           "systemready_scripts")
    edk2_test_parser_dir = os.path.join(d.getVar('STAGING_LIBDIR_NATIVE'),
                                        "edk2_test_parser")
    deployfile = os.path.join(deploy_dir_image, d.getVar('IMAGE_LINK_NAME')
                              + d.getVar('IMAGE_DEPLOY_SUFFIX'))

    testimage_dir = d.getVar('TEST_LOG_DIR')
    logdir = d.getVar('ACS_LOG_DIR')
    loglink = d.getVar('ACS_LOG_LINK')

    # Copy the report.txt file from DEPLOY_DIR_IMAGE
    report_file = os.path.join(deploy_dir_image, "report.txt")
    report_file_dest = os.path.join(testimage_dir, "report.txt")
    shutil.copyfile(report_file, report_file_dest)

    # Extract the log files from the Wic image to the testimage logs directory
    resultspath = deployfile + ':3/acs_results'
    import subprocess
    subprocess.run(['wic', 'cp', resultspath, logdir], check=True)

    # Create a symlink to the acs_results directory
    if os.path.lexists(loglink):
        os.remove(loglink)
    os.symlink(os.path.basename(logdir), loglink)

    # Create a top-level symlink to the acs_results directory
    top_logdir = os.path.join(get_testimage_json_result_dir(d), d.getVar("PN"))
    log_name = d.getVar('ACS_LOG_NAME')
    top_link = os.path.join(top_logdir, log_name)
    log_target = os.path.relpath(logdir, top_logdir)
    os.symlink(log_target, top_link)

    # Parse the logs and generate results file
    logger = make_logger_bitbake_compatible(logging.getLogger("BitBake"))

    sct_log = os.path.join(logdir, 'sct_results', 'Overall', 'Summary.ekl')
    sct_seq = os.path.join(logdir, 'sct_results', 'Sequence', 'EBBR.seq')

    parser_path = os.path.join(edk2_test_parser_dir, "parser.py")
    # format-sr-results.py needs the output file to be called "result.md"
    subprocess.run([parser_path, sct_log, sct_seq, "--md",
                   os.path.join(logdir, "result.md")], check=True)

    scripts_path = os.path.join(systemready_scripts_dir,
                                "format-sr-results.py")
    summary_path = os.path.join(testimage_dir, "summary.md")
    subprocess.run([scripts_path, "--dir", testimage_dir, "--md", summary_path],
                   check=True)

    # Symlink acs-console.log to default_log
    subprocess.run(["ln", "-sf", os.path.join(testimage_dir, "default_log"),
                    os.path.join(testimage_dir, "acs-console.log")], check=True)

    # Run the check-sr-results.py systemready script to check the results
    check_sr_results_log_path = os.path.join(testimage_dir,
                                             "check_sr_results.log")
    with open(check_sr_results_log_path, "w") as f:
        check_sr_results_path = os.path.join(systemready_scripts_dir,
                                            "check-sr-results.py")
        try:
            subprocess.run([check_sr_results_path, "--dir", testimage_dir,
                            "--print-meta", "--debug"],
                           stdout=f, stderr=f, text=True, check=True)
        except subprocess.CalledProcessError:
            logger.error(f"ACS run failed the check SystemReady results. See "
                         f"{summary_path} and {check_sr_results_log_path} for "
                         f"details of the error.")
            raise bb.BBHandledException()
}