diff --git a/PR_test/README.md b/PR_test/README.md new file mode 100644 index 0000000..8a8e660 --- /dev/null +++ b/PR_test/README.md @@ -0,0 +1,160 @@ +# Test on exp/bao-tests (@ Bao Hypervisor repo) + +Define the current directory as the root directory of the PR test: +```sh +export ROOT_DIR=$(realpath .) +``` +Clone the `exp/bao-tests` branch of the Bao hypervisor repo: +```sh +export BAO_EXP_TESTS=$ROOT_DIR/exp-bao-tests +git clone -b exp/bao-tests https://github.com/bao-project/bao-hypervisor.git\ + $BAO_EXP_TESTS +``` +Init bao-nix git submodule: +```sh +cd $BAO_EXP_TESTS/tests +git submodule update --init +``` + +Checkout the submodule to the branch `update/guests-recipes` +```sh +git -C $BAO_EXP_TESTS/tests/bao-nix checkout update/guests-recipes +``` + +Build the test setup for `qemu-aarch64-virt` (tests compiled +[here](./exp-bao-tests/tests/src/HELLO.c)): +```sh +cd $ROOT_DIR +nix-build exp-bao-tests.nix --argstr platform qemu-aarch64-virt\ + --argstr list_suites HELLO +``` + +Finally, run qemu to see the tests logging: +```sh +sh run_qemu.sh +``` + +To test the other guest recipes, change the [build recipe](exp-bao-tests.nix) as follows: + +1. **baremetal-local.nix** - allows to test a baremetal build with local srcs: + +Make the following changes in the build recipe: +```diff +- baremetal = callPackage ./exp-bao-tests/tests/bao-nix/pkgs/guest/baremetal.nix + { + toolchain = aarch64-none-elf; + guest_name = "baremetal"; + platform_cfg = plat_cfg; + }; ++ baremetal = callPackage ./exp-bao-tests/tests/bao-nix/pkgs/guest/baremetal_local.nix + { + toolchain = aarch64-none-elf; + guest_name = "baremetal"; + platform_cfg = plat_cfg; ++ baremetal_srcs_path = ./bao-baremetal-guest; + }; +``` + +Clone and patch the baremetal srcs from `bao-baremetal-guest` repo, clone the `bao-test` repo, +and copy the PR test files: +```sh +cd $ROOT_DIR +git clone -b demo https://github.com/bao-project/bao-baremetal-guest.git +``` + +Build the test setup: +```sh +nix-build exp-bao-tests.nix --argstr platform qemu-aarch64-virt\ + --argstr list_suites HELLO +``` + +Finally, run qemu to see the tests logging: +```sh +sh run_qemu.sh +``` + +2. **baremetal-local-tf.nix** - allows to test a baremetal build with local srcs to run tests: + +Make the following changes in the build recipe: +```diff +- baremetal = callPackage ./exp-bao-tests/tests/bao-nix/pkgs/guest/baremetal.nix + { + toolchain = aarch64-none-elf; + guest_name = "baremetal"; + platform_cfg = plat_cfg; + }; ++ baremetal = callPackage ./exp-bao-tests/tests/bao-nix/pkgs/guest/baremetal_local.nix + { + toolchain = aarch64-none-elf; + guest_name = "baremetal"; + platform_cfg = plat_cfg; ++ inherit list_tests; ++ inherit list_suites; + baremetal_srcs_path = ./bao-baremetal-guest; + }; +``` + +Clone and patch the baremetal srcs from `bao-baremetal-guest` repo, clone the `bao-test` repo, +and copy the PR test files: +```sh +cd $ROOT_DIR +git -C ./bao-baremetal-guest apply $ROOT_DIR/baremetal.patch + +cd $ROOT_DIR/bao-baremetal-guest +mkdir tests +cp -r $ROOT_DIR/tests/* ./tests +cd ./tests +git clone https://github.com/bao-project/bao-tests.git +``` + +Then, copy the `testf_entry.c` file to the `bao-test` directory: +```sh +cp $ROOT_DIR/tests/testf_entry.c $ROOT_DIR/bao-baremetal-guest/tests/bao-tests/src +``` + +Build the test setup: +```sh +cd $ROOT_DIR +nix-build exp-bao-tests.nix --argstr platform qemu-aarch64-virt\ + --argstr list_suites HELLO +``` + +Finally, run qemu to see the tests logging: +```sh +sh run_qemu.sh +``` + +3. **baremetal-remote-tf.nix** - allows to test a baremetal build with remote srcs to run tests: + +Make the following changes in the build recipe: +```diff +- baremetal = callPackage ./exp-bao-tests/tests/bao-nix/pkgs/guest/baremetal.nix + { + toolchain = aarch64-none-elf; + guest_name = "baremetal"; + platform_cfg = plat_cfg; + }; ++ baremetal = callPackage ./exp-bao-tests/tests/bao-nix/pkgs/guest/baremetal_local.nix + { + toolchain = aarch64-none-elf; + guest_name = "baremetal"; + platform_cfg = plat_cfg; + inherit list_tests; + inherit list_suites; ++ inherit bao-tests; ++ testf_patch = ./baremetal.patch; +- baremetal_srcs_path = ./bao-baremetal-guest; + }; +``` + +Build the test setup: +```sh +cd $ROOT_DIR +nix-build exp-bao-tests.nix --argstr platform qemu-aarch64-virt\ + --argstr list_suites HELLO +``` + +Finally, run qemu to see the tests logging: +```sh +sh run_qemu.sh +``` \ No newline at end of file diff --git a/PR_test/baremetal.patch b/PR_test/baremetal.patch new file mode 100644 index 0000000..779e7af --- /dev/null +++ b/PR_test/baremetal.patch @@ -0,0 +1,32 @@ +diff --git a/setup.mk b/setup.mk +index 3a230aa..2edf9ee 100644 +--- a/setup.mk ++++ b/setup.mk +@@ -29,6 +29,14 @@ src_dirs+=$(src_dir) $(core_dir) $(platform_dir) + SRC_DIRS+=$(src_dirs) + INC_DIRS+=$(addsuffix /inc, $(src_dirs)) + ++# Test framework setup ++include $(TESTF_REPO_DIR)/src/bao-test.mk ++SRC_DIRS+=$(TESTF_SRC_DIR) $(TESTF_TESTS_DIR) ++C_SRC+=$(TESTF_SRCS) ++INC_DIRS+=$(TESTF_INC_DIR) ++CFLAGS+=$(TESTF_FLAGS) ++# End of test framework setup ++ + ifeq ($(wildcard $(platform_dir)),) + $(error unsupported platform $(PLATFORM)) + endif +diff --git a/src/main.c b/src/main.c +index 9a9e972..69cfa6f 100644 +--- a/src/main.c ++++ b/src/main.c +@@ -54,6 +54,8 @@ void main(void){ + printf("Bao bare-metal test guest\n"); + spin_unlock(&print_lock); + ++ testf_entry(); ++ + irq_set_handler(UART_IRQ_ID, uart_rx_handler); + irq_set_handler(TIMER_IRQ_ID, timer_handler); + irq_set_handler(IPI_IRQ_ID, ipi_handler); diff --git a/PR_test/exp-bao-tests.nix b/PR_test/exp-bao-tests.nix new file mode 100644 index 0000000..96711a7 --- /dev/null +++ b/PR_test/exp-bao-tests.nix @@ -0,0 +1,91 @@ +{ + pkgs ? import (fetchTarball { + url = "https://github.com/NixOS/nixpkgs/archive/refs/tags/22.11.tar.gz"; + sha256 = "sha256:11w3wn2yjhaa5pv20gbfbirvjq6i3m7pqrq2msf0g7cv44vijwgw"; + }) {}, + platform ? " ", + list_tests ? " ", + list_suites ? " " +}: + +with pkgs; + +let + packages = rec { + + plat_cfg = callPackage ./exp-bao-tests/tests/bao-nix/pkgs/platforms/platforms.nix { + inherit platform; + }; + + aarch64-none-elf = callPackage ./exp-bao-tests/tests/bao-nix/pkgs/toolchains/aarch64-none-elf-11-3.nix{}; + demos = callPackage ./exp-bao-tests/tests/bao-nix/pkgs/demos/demos.nix {}; + bao-tests = callPackage ./exp-bao-tests/tests/bao-nix/pkgs/bao-tests/bao-tests.nix {}; + tests = callPackage ./exp-bao-tests/tests/bao-nix/pkgs/tests/tests.nix {}; + +# Baremetal Remote + # baremetal = callPackage ./exp-bao-tests/tests/bao-nix/pkgs/guest/baremetal-remote.nix + # { + # toolchain = aarch64-none-elf; + # guest_name = "baremetal"; + # platform_cfg = plat_cfg; + # }; + +# Baremetal Local + # baremetal = callPackage ./exp-bao-tests/tests/bao-nix/pkgs/guest/baremetal-local.nix + # { + # toolchain = aarch64-none-elf; + # guest_name = "baremetal"; + # platform_cfg = plat_cfg; + # baremetal_srcs_path = ./bao-baremetal-guest; # /home/diogo/Desktop/bao-git/tests-workspace/bao-nix/PR_test/bao-baremetal-guest; + # }; + +# Baremetal Local TF + # baremetal = callPackage ./exp-bao-tests/tests/bao-nix/pkgs/guest/baremetal-local-tf.nix + # { + # toolchain = aarch64-none-elf; + # guest_name = "baremetal"; + # platform_cfg = plat_cfg; + # inherit list_tests; + # inherit list_suites; + # baremetal_srcs_path = ./bao-baremetal-guest; + # }; + +# Baremetal Remote TF + baremetal = callPackage ./exp-bao-tests/tests/bao-nix/pkgs/guest/baremetal-remote-tf.nix + { + toolchain = aarch64-none-elf; + guest_name = "baremetal"; + platform_cfg = plat_cfg; + inherit list_tests; + inherit list_suites; + inherit bao-tests; + tests_srcs = /home/diogo/Desktop/bao-git/tests-workspace/bao-nix/PR_test/tests; + testf_patch = ./baremetal.patch; + }; + + bao = callPackage ./exp-bao-tests/tests/bao-nix/pkgs/bao/bao_tf.nix + { + toolchain = aarch64-none-elf; + guest = baremetal; + inherit demos; + platform_cfg = plat_cfg; + }; + + u-boot = callPackage ./exp-bao-tests/tests/bao-nix/pkgs/u-boot/u-boot.nix + { + toolchain = aarch64-none-elf; + }; + + atf = callPackage ./exp-bao-tests/tests/bao-nix/pkgs/atf/atf.nix + { + toolchain = aarch64-none-elf; + inherit u-boot; + inherit platform; + }; + + inherit pkgs; + }; +in + packages + + diff --git a/PR_test/run_qemu.sh b/PR_test/run_qemu.sh new file mode 100755 index 0000000..7420d27 --- /dev/null +++ b/PR_test/run_qemu.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env nix-shell +#!nix-shell --pure -p qemu -i bash + +qemu-system-aarch64 -nographic\ + -M virt,secure=on,virtualization=on,gic-version=3 \ + -cpu cortex-a53 -smp 4 -m 4G\ + -bios ./result-2/bin/qemu-aarch64-virt/flash.bin \ + -device loader,file="./result-3/bin/bao.bin",addr=0x50000000,force-raw=on\ + -device virtio-net-device,netdev=net0 -netdev user,id=net0,hostfwd=tcp:127.0.0.1:5555-:22\ + -device virtio-serial-device -chardev pty,id=serial3 -device virtconsole,chardev=serial3 \ No newline at end of file diff --git a/PR_test/tests/configs/config.dts b/PR_test/tests/configs/config.dts new file mode 100755 index 0000000..abb38af --- /dev/null +++ b/PR_test/tests/configs/config.dts @@ -0,0 +1,14 @@ +/dts-v1/; +/ { + platform = "qemu-aarch64-virt"; + log_echo = <1>; + + test_config { + recipe_test { + nix_file = "default.nix"; + suites = "HELLO"; + tests = ""; + log_level = "0"; + }; + }; +}; \ No newline at end of file diff --git a/PR_test/tests/src/HELLO.c b/PR_test/tests/src/HELLO.c new file mode 100644 index 0000000..77cc580 --- /dev/null +++ b/PR_test/tests/src/HELLO.c @@ -0,0 +1,12 @@ +#include "testf.h" + +BAO_TEST(HELLO, TEST_A) +{ + printf("Test Framework, Hello World!!!\n"); +} + +BAO_TEST(HELLO, TEST_B) +{ + printf(" Hello World 2!!!\n"); +} + diff --git a/PR_test/tests/src/testf_entry.c b/PR_test/tests/src/testf_entry.c new file mode 100644 index 0000000..0760d8f --- /dev/null +++ b/PR_test/tests/src/testf_entry.c @@ -0,0 +1,32 @@ +/* + * Copyright (c) Bao Project and Contributors. All rights reserved + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "testf.h" +#include +#include + +unsigned int testframework_tests; +unsigned int testframework_fails; + +void testf_entry(void) +{ + // codegen.py section begin + #if defined TEST_A || HELLO + entry_test_HELLO_TEST_A(); + #endif + + #if defined TEST_B || HELLO + entry_test_HELLO_TEST_B(); + #endif // codegen.py section end + + if (testframework_tests > 0) { + LOG_TESTS(); + } else { + INFO_TAG(); + printf("No tests were executed!\n"); + } + return; +} diff --git a/PR_test/tests/testf_entry.c b/PR_test/tests/testf_entry.c new file mode 100644 index 0000000..0760d8f --- /dev/null +++ b/PR_test/tests/testf_entry.c @@ -0,0 +1,32 @@ +/* + * Copyright (c) Bao Project and Contributors. All rights reserved + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "testf.h" +#include +#include + +unsigned int testframework_tests; +unsigned int testframework_fails; + +void testf_entry(void) +{ + // codegen.py section begin + #if defined TEST_A || HELLO + entry_test_HELLO_TEST_A(); + #endif + + #if defined TEST_B || HELLO + entry_test_HELLO_TEST_B(); + #endif // codegen.py section end + + if (testframework_tests > 0) { + LOG_TESTS(); + } else { + INFO_TAG(); + printf("No tests were executed!\n"); + } + return; +}