Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • tests/apertis-test-cases
  • fdanis/apertis-test-cases
  • alee/apertis-test-cases
  • Tarun.Baghmar/apertis-test-cases
  • HattihalBasavanaGowda.Chethan/apertis-test-cases
  • wlozano/apertis-test-cases
  • external.SamirKumar/apertis-test-cases
  • em/apertis-test-cases
  • Muthukumaran.Monisha/apertis-test-cases
  • M.Akshay/apertis-test-cases
  • jmassot/apertis-test-cases
  • sivakrishnaprasad-ext/apertis-test-cases
  • vignesh/apertis-test-cases
  • rafaelgarrui/apertis-test-cases
  • malikmlitat/apertis-test-cases
  • andrewsh/apertis-test-cases
16 results
Show changes
Commits on Source (389)
Showing
with 365 additions and 128 deletions
image: registry.gitlab.apertis.org/infrastructure/apertis-docker-images/v2021dev3-testcases-builder
stages:
- test
- generate
variables:
osname: apertis
release: v2026dev2
image: $CI_REGISTRY/infrastructure/${osname}-docker-images/${release}-testcases-builder
include:
- /.gitlab-ci/templates-submit-tests.yml
- /.gitlab-ci/templates-generate-tests.yml
test-renderer:
stage: test
tags:
- lightweight
script:
- python3 -m unittest discover -v
test:
render-pages:
stage: test
tags:
- lightweight
script:
- ./atc test-cases/ -d test/ --index-page
artifacts:
paths:
- test
except:
- apertis/v2019pre
- apertis/v2019dev0
- apertis/v2020dev0
- apertis/v2020pre
- apertis/v2020
- apertis/v2021dev0
- apertis/v2021dev1
pages:
stage: deploy
script:
- ./atc test-cases/ -d public/ --index-page
- ./atc -d ${release}/ --index-page test-cases/
artifacts:
paths:
- public
only:
- apertis/v2021dev3
- ${release}
.minimal:
.fixedfunction:
variables:
type: minimal
type: fixedfunction
.target:
.hmi:
variables:
type: target
type: hmi
.basesdk:
variables:
......@@ -70,92 +64,135 @@ pages:
architecture: arm64
board: uboot
.submit-tests-apt:
extends: .submit-tests
stage: deploy
.arm64-rpi64:
variables:
profile_name: ${osname}-${type}-${architecture}-${board}
image_prefix: ${osname}_${release}-${type}-${architecture}-${board}
architecture: arm64
board: rpi64
.generate-tests-apt:
extends: .generate-tests
tags:
- lightweight
stage: generate
variables:
deployment: apt
image_name: ${osname}_${release}-${type}-${architecture}-${board}
osname: apertis
release: v2021dev3
release: v2026dev2
base_url: https://images.apertis.org
image_path: weekly/v2021dev3
image_buildid: "20200506.0117" # run tests against a known weekly build
.submit-tests-ostree:
extends: .submit-tests
stage: deploy
image_path: weekly/v2026dev2
image_buildid: "fakebuildid"
.generate-tests-ostree:
extends: .generate-tests
tags:
- lightweight
stage: generate
variables:
profile_name: ${osname}_ostree-${type}-${architecture}-${board}
image_prefix: ${osname}_ostree_${release}-${type}-${architecture}-${board}
deployment: ostree
image_name: ${osname}_ostree_${release}-${type}-${architecture}-${board}
image_bundle: ${osname}_ostree_${release}-${type}-${architecture}-${board}
osname: apertis
release: v2021dev3
release: v2026dev2
base_url: https://images.apertis.org
image_path: weekly/v2021dev3
image_buildid: "20200506.0117" # run tests against a known weekly build
image_path: weekly/v2026dev2
image_buildid: "fakebuildid"
# !!!
# All generate-tests-* jobs defined below are not really used,
# they are intended to test that the jobs can be generated.
# !!!
submit-tests-apt-amd64-minimal-uefi:
generate-tests-apt-amd64-fixedfunction-uefi:
extends:
- .submit-tests-apt
- .generate-tests-apt
- .amd64-uefi
- .minimal
- .fixedfunction
submit-tests-apt-armhf-minimal-uboot:
generate-tests-apt-armhf-fixedfunction-uboot:
extends:
- .submit-tests-apt
- .generate-tests-apt
- .armhf-uboot
- .minimal
- .fixedfunction
submit-tests-apt-arm64-minimal-uboot:
generate-tests-apt-arm64-fixedfunction-uboot:
extends:
- .submit-tests-apt
- .generate-tests-apt
- .arm64-uboot
- .minimal
- .fixedfunction
submit-tests-apt-amd64-target-uefi:
generate-tests-apt-arm64-fixedfunction-rpi64-rpi4:
extends:
- .submit-tests-apt
- .generate-tests-apt
- .arm64-rpi64
- .fixedfunction
generate-tests-apt-amd64-hmi-uefi:
extends:
- .generate-tests-apt
- .amd64-uefi
- .target
- .hmi
submit-tests-apt-armhf-target-uboot:
generate-tests-apt-armhf-hmi-uboot:
extends:
- .submit-tests-apt
- .generate-tests-apt
- .armhf-uboot
- .target
- .hmi
submit-tests-apt-amd64-basesdk-sdk:
generate-tests-apt-arm64-hmi-rpi64-rpi4:
extends:
- .submit-tests-apt
- .generate-tests-apt
- .arm64-rpi64
- .hmi
generate-tests-apt-amd64-basesdk-sdk:
extends:
- .generate-tests-apt
- .amd64-sdk
- .basesdk
submit-tests-apt-amd64-sdk-sdk:
generate-tests-apt-amd64-sdk-sdk:
extends:
- .submit-tests-apt
- .generate-tests-apt
- .amd64-sdk
- .sdk
submit-tests-ostree-amd64-minimal-uefi:
generate-tests-ostree-amd64-fixedfunction-uefi:
extends:
- .submit-tests-ostree
- .generate-tests-ostree
- .amd64-uefi
- .minimal
- .fixedfunction
submit-tests-ostree-armhf-minimal-uboot:
generate-tests-ostree-armhf-fixedfunction-uboot:
extends:
- .submit-tests-ostree
- .generate-tests-ostree
- .armhf-uboot
- .minimal
- .fixedfunction
submit-tests-ostree-arm64-minimal-uboot:
generate-tests-ostree-arm64-fixedfunction-uboot:
extends:
- .submit-tests-ostree
- .generate-tests-ostree
- .arm64-uboot
- .minimal
- .fixedfunction
generate-tests-ostree-arm64-fixedfunction-rpi64-rpi4:
extends:
- .generate-tests-ostree
- .arm64-rpi64
- .fixedfunction
variables:
image_bundle: ${osname}_ostree_${release}-${type}-${architecture}-uboot
submit-tests-ostree-amd64-target-uefi:
generate-tests-ostree-amd64-hmi-uefi:
extends:
- .submit-tests-ostree
- .generate-tests-ostree
- .amd64-uefi
- .target
- .hmi
generate-tests-ostree-arm64-hmi-rpi64-rpi4:
extends:
- .generate-tests-ostree
- .arm64-rpi64
- .hmi
variables:
image_bundle: ${osname}_ostree_${release}-${type}-${architecture}-uboot
.common-image-job-base:
image: $CI_REGISTRY/infrastructure/${OSNAME}-docker-images/${APERTIS_RELEASE}-image-builder
variables:
TEST_PATH: /tmp/tests
TEST_REPO_URL: https://gitlab-ci-token:${CI_JOB_TOKEN}@${CI_SERVER_HOST}/tests/${OSNAME}-test-cases.git
RECIPES_PATH: /tmp/recipes
RECIPES_REPO_URL: https://gitlab-ci-token:${CI_JOB_TOKEN}@${CI_SERVER_HOST}/infrastructure/${OSNAME}-image-recipes.git
stage: build
timeout: 2h
rules:
- when: on_success
before_script:
- JOB_GENERATOR_BRANCH=${JOB_GENERATOR_BRANCH:-${OSNAME}/${APERTIS_RELEASE}}
- git clone --depth "${GIT_DEPTH:-1}" -b "$JOB_GENERATOR_BRANCH" "${TEST_REPO_URL}" "$TEST_PATH"
- git clone --depth "${GIT_DEPTH:-1}" -b "${OSNAME}/${APERTIS_RELEASE}" "${RECIPES_REPO_URL}" "$RECIPES_PATH"
- >
"$TEST_PATH/extract-variables.py" < "$RECIPES_PATH/.gitlab-ci.yml" > image.env
- . image.env
- >
"$TEST_PATH/extract-variables.py" ".$TYPE" < "$RECIPES_PATH/.gitlab-ci.yml" > pipeline.env
- . pipeline.env
- |
if [[ ${debosarguments} =~ "-t devrootpack:" ]]
then
DEVROOT_ARCH=armhf
devroot_ospack_name="ospack_${RELEASE}-${DEVROOT_ARCH}-devroot_${BUILDID}"
wget --progress=dot:mega ${image_url_prefix_main}/daily/${RELEASE}/${BUILDID}/${DEVROOT_ARCH}/devroot/${devroot_ospack_name}.tar.gz
debosarguments="$debosarguments -t devrootpack:${devroot_ospack_name}.tar.gz"
fi
- ospack_name="ospack_${RELEASE}-${ARCH}-${TYPE}_${BUILDID}"
- wget --progress=dot:mega ${image_url_prefix_main}/daily/${RELEASE}/${BUILDID}/${ARCH}/${TYPE}/${ospack_name}.tar.gz
- local_repo_path=$PWD/package-repo/$ARCH
.image-job-base:
extends: .common-image-job-base
script:
- echo ${debosarguments}
- debos ${debosarguments}
--show-boot
-t architecture:${ARCH}
-t osname:${OSNAME}
-t mirror:${mirror}
-t type:${TYPE}
-t sbc:${SBC}
-t ospack:${ospack_name}
-t suite:$RELEASE
-t timestamp:${PIPELINE_VERSION}
-t image:${IMAGE_NAME}
-t local_repo_path:${local_repo_path}
-t extra_packages:"${BIN_PKG_LIST}"
"$RECIPES_PATH/image-${BOARD}.yaml"
- echo "BUILT_IMAGE_URL=${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/jobs/${CI_JOB_ID}/artifacts/${IMAGE_NAME}.img" | tee -a build.env
artifacts:
reports:
dotenv: build.env
paths:
- '*.img.*'
expire_in: 1 day
.ostree-image-job-base:
extends: .common-image-job-base
variables:
branch: ${OSNAME}/${RELEASE}/${ARCH}-${BOARD}/${TYPE}
repo: repo-${ARCH}-${BOARD}-${TYPE}/
IMAGE_NAME: ${OSNAME}_ostree_${RELEASE}-${TYPE}-${ARCH}-${BOARD}_${BUILDID}
script:
- ostree_pull_url=${IMAGE_URL_PREFIX}/${ostree_path}
- ostree init --repo=${repo} --mode archive-z2
- echo ${debosarguments}
- debos ${debosarguments}
--show-boot
-t architecture:${ARCH}
-t osname:${OSNAME}
-t mirror:${mirror}
-t type:${TYPE}
-t sbc:${SBC}
-t board:${BOARD}
-t suite:$RELEASE
-t ospack:${ospack_name}
-t image:${IMAGE_NAME}
-t message:${RELEASE}-${TYPE}-${ARCH}-${BOARD}_${BUILDID}
-t ostree:${repo}
-t branch:${branch}
-t collection_id:${collection_id}
-t local_repo_path:${local_repo_path}
-t extra_packages:"${BIN_PKG_LIST}"
"$RECIPES_PATH/ostree-commit.yaml"
- debos ${debosarguments}
--show-boot
-t architecture:${ARCH}
-t osname:${OSNAME}
-t mirror:${mirror}
-t type:${TYPE}
-t sbc:${SBC}
-t board:$BOARD
-t ospack:${ospack_name}
-t suite:$RELEASE
-t timestamp:${PIPELINE_VERSION}
-t image:${IMAGE_NAME}
-t ostree:${repo}
-t branch:${branch}
-t local_repo_path:${local_repo_path}
-t collection_id:${collection_id}
"$RECIPES_PATH/ostree-image-${BOARD}.yaml"
- echo "BUILT_IMAGE_URL=${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/jobs/${CI_JOB_ID}/artifacts/${IMAGE_NAME}.img" | tee -a build.env
artifacts:
reports:
dotenv: build.env
paths:
- '*.img.*'
- '*.commit.*'
expire_in: 1 day
######
# stage: submit tests
# stage: generate tests
.submit-tests:
image: registry.gitlab.apertis.org/infrastructure/apertis-docker-images/v2021dev2-image-builder
.generate-tests:
image: $CI_REGISTRY/infrastructure/${osname}-docker-images/${release}-image-builder
variables:
release: v2021dev2
release: v2021
# images are fetched from
# {{baseurl}}/{{image_path}}/{{image_buildid}}/{{arch}}/{{type}}/{{image_name}}.img.gz
# where `arch` and `type` are derived from `profile_name`
baseurl: https://images.apertis.org
image_buildid: "20200506.0117"
image_name: apertis_v2021dev2-minimal-amd64-uefi_20200506.0117
image_path: weekly/v2021dev2
profile_name: apertis-minimal-amd64-uefi
image_name: apertis_v2023dev1-minimal-amd64-uefi_v2023dev1.1
image_buildid: "v2023dev1.1"
image_path: release/v2023dev1
source_commit: $CI_COMMIT_SHA
source_job: $CI_JOB_URL
source_pipeline: $CI_PIPELINE_URL
......@@ -22,17 +21,22 @@
# failures, and that in general the results should not impact the overall
# health of the project
source_wip: "true"
visibility: public
script:
- env --null | sort -z | tr '\0' '\n'
- lava-submit
-c ${LQA_CONFIG}
-g lava/profiles.yaml
--profile "${profile_name}"
-t "release:${release}"
-t "release_version:${release}"
- ./generate-jobs.py
-d lava/devices.yaml
--config lava/config.yaml
--release ${release}
--arch ${architecture}
--board ${board}
--osname ${osname}
--type ${type}
--date ${image_buildid}
--deployment ${deployment}
--name ${image_name}
-t "baseurl:${baseurl}"
-t "image_date:${image_buildid}"
-t "image_name:${image_name}"
-t "image_bundle:${image_bundle}"
-t "imgpath:${image_path}"
-t "source_commit:${source_commit}"
-t "source_job:${source_job}"
......@@ -40,12 +44,24 @@
-t "source_project:${source_project}"
-t "source_ref:${source_ref}"
-t "source_wip:${source_wip}"
--callback-secret "${QA_REPORT_TOKEN}"
--callback-url https://lavaphabbridge.apertis.org/
-t "visibility:${visibility}"
--verbose
--metadata-file metadata.json
- ./generate-test-pipeline.py
--include .gitlab-ci/test-pipeline-base.yml
--output child-pipeline.yaml
--parent-pipeline $CI_PIPELINE_ID
--current-job-name $CI_JOB_NAME
--test-job-base '.test-job-base'
job-${image_name}-*.yaml
artifacts:
paths:
- ./job-${osname}*.yaml
- ./metadata.json
- ./child-pipeline.yaml
expire_in: 1 day
rules:
- if: '$CI_MERGE_REQUEST_ID'
when: never
- if: '$LQA_CONFIG == null'
when: never
- when: on_success
.test-job-base:
stage: deploy
tags:
- lava-runner
artifacts:
when: always
paths:
- log.yaml
reports:
junit: "*.xml"
......@@ -22,7 +22,18 @@
###################################################################################
from atc_renderer import main
from argparse import ArgumentParser
if '__main__' == __name__:
main()
cli_parser = ArgumentParser(description="atc (Test Cases Renderer)")
cli_parser.add_argument('-i', '--index-page', action='store_true',
help="Create index page")
cli_parser.add_argument('-d', '--test-case-dir',
help="Directory path for generated test cases")
cli_parser.add_argument('yaml_files',
help="YAML file or files directory")
args = cli_parser.parse_args()
main(args.yaml_files, args.test_case_dir, args.index_page)
exit(0)
......@@ -23,7 +23,6 @@
import os
import shutil
import pkg_resources
from argparse import ArgumentParser
from atc_renderer.renderer import generate_test_case_page, \
generate_index_page, \
......@@ -44,20 +43,11 @@ def copy_files(directory, dirname, dirpath, msg):
shutil.copy2(os.path.join(dirpath, f), dst_dir)
def main():
cli_parser = ArgumentParser(description="atc (Test Cases Renderer)")
cli_parser.add_argument('-i', '--index-page', action='store_true',
help="Create index page")
cli_parser.add_argument('-d', '--test-case-dir',
help="Directory path for generated test cases")
cli_parser.add_argument('yaml_files',
help="YAML file or files directory")
args = cli_parser.parse_args()
def main(tc_files, tc_dir = None, index_page = False):
index_files = []
directory = os.getcwd()
if args.test_case_dir:
directory = args.test_case_dir
if tc_dir:
directory = tc_dir
try:
os.mkdir(directory)
except FileExistsError:
......@@ -66,18 +56,18 @@ def main():
print("Error:", e)
exit(1)
if os.path.isfile(args.yaml_files):
generate_test_case_page(args.yaml_files, directory)
if args.index_page:
index_files.append(args.yaml_files)
if os.path.isfile(tc_files):
generate_test_case_page(tc_files, directory)
if index_page:
index_files.append(tc_files)
else:
c = 0
for root, _, files in os.walk(args.yaml_files):
for root, _, files in os.walk(tc_files):
for f in files:
tc_file = os.path.join(root, f)
if os.path.isfile(tc_file):
generate_test_case_page(tc_file, directory)
if args.index_page:
if index_page:
index_files.append(tc_file)
c += 1
print("Total of test cases processed:", c)
......
File added
File added
File added
atc_renderer/images/agl-compositor-launcher1-screenshot.png

6.45 KiB

atc_renderer/images/agl-compositor-launcher2-screenshot.png

15.6 KiB

atc_renderer/images/agl-compositor-pavucontrol-screenshot.png

26.9 KiB

atc_renderer/images/agl-compositor-popup-screenshot.png

21.5 KiB

atc_renderer/images/agl-compositor-screenshot.png

5.99 KiB

atc_renderer/images/flatpak-demo-hmi-icon-screenshot.png

26.6 KiB

atc_renderer/images/flatpak-demo-hmi-screenshot.png

93.9 KiB

atc_renderer/images/video-animation-on-boot-logo.gif

4.64 MiB

......@@ -26,8 +26,8 @@ import yaml
from atc_renderer.exceptions import ParserTypeError, ParserMissingFieldError
image_variants = [ 'any', 'minimal', 'target', 'basesdk', 'sdk', 'tiny-lxc' ]
image_archs = ['any', 'armhf', 'armhf-internal', 'arm64', 'amd64']
image_variants = [ 'any', 'fixedfunction', 'hmi', 'basesdk', 'sdk', 'tiny-lxc' ]
image_archs = ['any', 'armhf', 'arm64', 'amd64']
tests_types = ['compatibility', 'functional', 'performance', 'sanity', 'system']
priorities = ['critical', 'high', 'low', 'medium']
execution_type = ['all', 'automated', 'manual']
......
{% macro git_repo(url, dir, branch) %}
<li class="mb-sm-2">Clone the tests repository from another computer <i>(Note that the branch being tested may change depending on the release, please make sure to clone the correct branch for the release in question)</i>:</li>
<p><kbd>$ git clone --branch {{ branch }} {{ url }}</kbd></p>
<pre><code>$ git clone --branch {{ branch }} {{ url }}</code></pre>
<li class="mb-sm-2">Copy the test directory {{ dir }} to the target device:</li>
<p><kbd>$ DUT_IP=&ltdevice-ip&gt</kbd></p>
<p><kbd>$ scp -r {{ dir }} user@$DUT_IP:</kbd></p>
<pre><code>$ DUT_IP=&ltdevice-ip&gt</code></pre>
<pre><code>$ scp -r {{ dir }} user@$DUT_IP:</code></pre>
<li class="mb-sm-2">Log into the target device:</li>
<p><kbd>$ ssh user@$DUT_IP</kbd></p>
<pre><code>$ ssh user@$DUT_IP</code></pre>
{% endmacro %}
{% macro ostree_preconditions(preconditions) %}
<li class="mb-sm-2">Clone the tests repository from another computer <i>(Note that the branch being tested may change depending on the release, please make sure to clone the correct branch for the release in question)</i>:</li>
{% for precondition in preconditions %}
<li class="mb-sm-2">From a PC, download and unpack the test data tarball from the gitlab test repository:</li>
<p><kbd>$ wget https://gitlab.apertis.org/tests/{{ precondition.reponame }}/-/archive/{{ precondition.branch }}/{{ precondition.reponame }}.tar.gz</kbd></p>
<p><kbd>$ tar -xvf {{ precondition.reponame }}.tar.gz</kbd></p>
<li class="mb-sm-2">Copy the {{ precondition.reponame }}-* folder to the target device:</li>
<p><kbd>$ DUT_IP=&ltdevice-ip&gt</kbd></p>
<p><kbd>$ scp -r {{ precondition.reponame }}-* user@$DUT_IP:</kbd></p>
<li class="mb-sm-2">Log into the target device:</li>
<p><kbd>$ ssh user@$DUT_IP</kbd></p>
<li class="mb-sm-2">After log into the DUT, enter the test directory</li>
<p><kbd>$ cd {{ precondition.reponame }}-*</kbd></p>
<li class="mb-sm-2">Note that the tarball may change depending on the release/branch being tested, please make sure to download the correct tarball for the release in question.</li>
<pre><code>$ git clone --depth 1 --branch {{ precondition.branch }} https://gitlab.apertis.org/tests/{{ precondition.reponame }}</code></pre>
{% endfor %}
<li class="mb-sm-2">Copy the test directory to the target device:</li>
<pre><code>$ DUT_IP=&ltdevice-ip&gt</code></pre>
<pre><code>$ scp -r{% for precondition in preconditions %} {{ precondition.reponame }} {% endfor %}user@$DUT_IP:</code></pre>
<li class="mb-sm-2">Log into the target device:</li>
<pre><code>$ ssh user@$DUT_IP</code></pre>
<li class="mb-sm-2">After log into the DUT, enter the test directory, and run respective commands mentioned in the execution steps</li>
{% if preconditions|length == 1 %}
<pre><code>$ cd {{ preconditions[0].reponame }}</code></pre>
{% endif %}
{% endmacro %}
{% macro install_packages(packages_list) %}
<li class="mb-sm-2">Ensure Rootfs is remounted as read/write.</li>
<p><kbd>$ sudo mount -o remount,rw /</kbd></p>
<pre><code>$ sudo mount -o remount,rw /</code></pre>
<li class="mb-sm-2">Install dependencies</li>
<p><kbd>$ sudo apt install {{ packages_list }}</kbd></p>
<pre><code>$ sudo apt install {{ packages_list }}</code></pre>
<li class="mb-sm-2">Restart the system to restore the filesystem state to read-only before running the test.</li>
<p><kbd>$ sudo reboot</kbd></p>
<pre><code>$ sudo reboot</code></pre>
{% endmacro %}
{% macro modules_preconditions(libname) %}
<li class="mb-sm-2">Download the ribchester binary inside the /tmp directory.</li>
<p><kbd>$ cd /tmp/</kbd></p>
<p><kbd>$ apt source {{ libname }}</kbd></p>
<p><kbd>$ chown user:user -R /tmp/{{ libname }}-*</kbd></p>
<pre><code>$ cd /tmp/</code></pre>
<pre><code>$ apt source {{ libname }}</code></pre>
<pre><code>$ chown user:user -R /tmp/{{ libname }}-*</code></pre>
{% endmacro %}
......@@ -5,6 +5,15 @@
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link href="css/bootstrap.min.css" rel="stylesheet">
<title>{{ name }}</title>
<style>
pre code {
background: black;
color: white;
display: inline-block;
padding: .2rem;
border-radius: .2rem;
}
</style>
</head>
<body>
{% import 'macros.html' as macros %}
......@@ -46,9 +55,9 @@
{% if git_repo_url and not ostree_preconditions %}{{ macros.git_repo(git_repo_url, git_repo_dir, git_repo_branch) }}{% endif %}
{% for comment, command, output, _, link in pre_conditions %}
{% if comment %}<li class="mb-sm-2">{{ comment|e }}</li>{% endif %}
{% if command %}<p><kbd>{{ command|e }}</kbd></p>{% endif %}
{% if command %}<pre><code>{{ command|e }}</code></pre>{% endif %}
{% if link %}<p><a href="{{ link }}">{{ link }}</a></p>{% endif %}
{% if output %}{% for l in output %}<p class="mb-sm-0 pl-sm-3"><samp>{{ l|e }}</samp></p>{% endfor %}{% endif %}
{% if output %}{% for l in output %}<p class="mb-sm-0 pl-sm-3"><pre><samp>{{ l|e }}</samp></pre></p>{% endfor %}{% endif %}
{% endfor %}
</ol>
{% endif %}
......@@ -58,8 +67,8 @@
<ol>
{% for comment, command, output, _, link in run_steps %}
{% if comment %}<li class="mb-sm-2">{{ comment|e }}</li>{% endif %}
{% if command %}<p><kbd>{{ command|e }}</kbd></p>{% endif %}
{% if output %}{% for l in output %}<p class="mb-sm-0 pl-sm-3"><samp>{{ l|e }}</samp></p>{% endfor %}{% endif %}
{% if command %}<pre><code>{{ command|e }}</code></pre>{% endif %}
{% if output %}{% for l in output %}<p class="mb-sm-0 pl-sm-3"><pre><samp>{{ l|e }}</samp></pre></p>{% endfor %}{% endif %}
{% if image %}<img src="images/{{ image }}" class="img-fluid">{% endif %}
{% if link %}<p><a href="{{ link }}">{{ link }}</a></p>{% endif %}
{% endfor %}
......@@ -69,8 +78,8 @@
<h4>Expected</h4>
{% for comment, command, output, image, link in expected %}
{% if comment %}<p class="mt-sm-3">{{ comment|e }}</p>{% endif %}
{% if command %}<p><kbd>{{ command|e }}</kbd></p>{% endif %}
{% if output %}{% for l in output %}<p class="mb-sm-0 pl-sm-3"><samp>{{ l|e }}</samp></p>{% endfor %}{% endif %}
{% if command %}<pre><code>{{ command|e }}</code></pre>{% endif %}
{% if output %}{% for l in output %}<p class="mb-sm-0 pl-sm-3"><pre><samp>{{ l|e }}</samp></pre></p>{% endfor %}{% endif %}
{% if image %}<img src="images/{{ image }}" class="img-fluid">{% endif %}
{% if link %}<p><a href="{{ link }}">{{ link }}</a></p>{% endif %}
{% endfor %}
......@@ -81,8 +90,8 @@
<ol>
{% for comment, command, output, _, link in post_conditions %}
{% if comment %}<li class="mb-sm-2">{{ comment|e }}</li>{% endif %}
{% if command %}<p><kbd>{{ command|e }}</kbd></p>{% endif %}
{% if output %}{% for l in output %}<p class="mb-sm-0 pl-sm-3"><samp>{{ l|e }}</samp></p>{% endfor %}{% endif %}
{% if command %}<pre><code>{{ command|e }}</code></pre>{% endif %}
{% if output %}{% for l in output %}<p class="mb-sm-0 pl-sm-3"><pre><samp>{{ l|e }}</samp></pre></p>{% endfor %}{% endif %}
{% endfor %}
</ol>
{% endif %}
......@@ -97,8 +106,8 @@
<ul>
{% for comment, command, output, _, link in notes %}
{% if comment %}<li class="mb-sm-2">{{ comment|e }}</li>{% endif %}
{% if command %}<p><kbd>{{ command|e }}</kbd></p>{% endif %}
{% if output %}{% for l in output %}<p class="mb-sm-0 pl-sm-3"><samp>{{ l|e }}</samp></p>{% endfor %}{% endif %}
{% if command %}<pre><code>{{ command|e }}</code></pre>{% endif %}
{% if output %}{% for l in output %}<p class="mb-sm-0 pl-sm-3"><pre><samp>{{ l|e }}</samp></pre></p>{% endfor %}{% endif %}
{% if link %}<p><a href="{{ link }}">{{ link }}</a></p>{% endif %}
{% endfor %}
</ul>
......