# # Copyright (C) 2023 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ################################################################################ # # Run host tests # # Tests are being run with errors ignored, so that they don't break the build. # Gtest reports should be parsed as a separate step (b/34749275). # If test crashes before writing into xml, failure is not detected. # Thus, we create malformed xml result before launching the test. # ################################################################################ .PHONY: berberis_host_tests_result .PHONY: berberis_run_host_tests # Test binaries are build as native bridge targets. So we only enable test runs when native bridge # is configured for riscv64. ifeq ($(TARGET_NATIVE_BRIDGE_ABI),riscv64) berberis_all: berberis_host_tests_result endif test_dir := $(call intermediates-dir-for,PACKAGING,berberis_tests) gen_failure_template := $(BERBERIS_DIR)/tests/gen_gtest_failure_template.py runner_riscv64 := $(HOST_OUT)/bin/berberis_program_runner_riscv64 # Android's make environment only exposes this path as part of CLANG_HOST_GLOBAL_CFLAGS. It is # difficult to extract it from there. On the other hand it hasn't changed between R and U. # So we simply hardcode it as it's low maintenance. host_libc_root := prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8 test_guard := $(test_dir)/remove_me_to_trigger_tests_run test_trigger := $(test_dir)/test_run_trigger $(test_guard): echo dummy > $@ $(test_trigger): $(test_guard) -rm $< echo dummy > $@ # Run gtest # $(1): test name # $(2): result path # $(3): binary path # $(4): env define run_test $(2): $(3) $(gen_failure_template) $(test_trigger) $(gen_failure_template) berberis_host_tests $(1) >$(2) -$(4) $(3) --gtest_output=xml:$(2) endef # Run x86_64_riscv64 gtest # $(1): test name # $(2): result path # $(3): binary path # $(4): env define run_test_x86_64_riscv64 $(2): $(3) $(runner_riscv64) $(gen_failure_template) $(test_trigger) $(gen_failure_template) berberis_host_tests_riscv64 $(1) >$(2) # Force running with the prebuilt host libc due to b/254755879. -$(4) LD_LIBRARY_PATH=$(host_libc_root)/x86_64-linux/lib64:$(host_libc_root)/sysroot/usr/lib \ $(host_libc_root)/sysroot/usr/lib/ld-linux-x86-64.so.2 \ $(runner_riscv64) $(3) --gtest_output=xml:$(2) endef # Add gtest to run # $(1): test name # $(2): run rule # $(3): binary path # $(4): env define add_test # Rule to create result file. $(call $(2),$(1),$(test_dir)/$(1)_result.xml,$(3),$(4)) berberis_host_tests_result: $(test_dir)/$(1)_result.xml $$(call dist-for-goals,berberis_host_tests_result, $(test_dir)/$(1)_result.xml:gtest/$(1)_result.xml) # Rule to check result file for errors. .PHONY: $(1)_check_errors $(1)_check_errors: $(test_dir)/$(1)_result.xml grep "testsuites.*failures=\"0\"" $(test_dir)/$(1)_result.xml berberis_run_host_tests: $(1)_check_errors endef # ATTENTION: no spaces or line continuations around test name! ifeq ($(BUILD_BERBERIS_RISCV64_TO_X86_64),true) # berberis_ndk_program_tests $(eval $(call add_test,berberis_ndk_program_tests_interpret_only,\ run_test_x86_64_riscv64,\ $(TARGET_OUT_TESTCASES)/berberis_ndk_program_tests_static.native_bridge/x86_64/berberis_ndk_program_tests_static,\ BERBERIS_MODE=interpret-only)) $(eval $(call add_test,berberis_ndk_program_tests_lite_translate_or_interpret,\ run_test_x86_64_riscv64,\ $(TARGET_OUT_TESTCASES)/berberis_ndk_program_tests_static.native_bridge/x86_64/berberis_ndk_program_tests_static,\ BERBERIS_MODE=lite-translate-or-interpret)) $(eval $(call add_test,berberis_ndk_program_tests_heavy_optimize_or_interpret,\ run_test_x86_64_riscv64,\ $(TARGET_OUT_TESTCASES)/berberis_ndk_program_tests_static.native_bridge/x86_64/berberis_ndk_program_tests_static,\ BERBERIS_MODE=heavy-optimize-or-interpret)) $(eval $(call add_test,berberis_ndk_program_tests_two_gear,\ run_test_x86_64_riscv64,\ $(TARGET_OUT_TESTCASES)/berberis_ndk_program_tests_static.native_bridge/x86_64/berberis_ndk_program_tests_static,\ BERBERIS_MODE=two-gear)) # inline_asm_tests_riscv64 $(eval $(call add_test,inline_asm_tests_riscv64_interpret_only,\ run_test_x86_64_riscv64,\ $(TARGET_OUT_TESTCASES)/inline_asm_tests_riscv64.native_bridge/x86_64/inline_asm_tests_riscv64,\ BERBERIS_MODE=interpret-only)) $(eval $(call add_test,inline_asm_tests_riscv64_lite_translate_or_interpret,\ run_test_x86_64_riscv64,\ $(TARGET_OUT_TESTCASES)/inline_asm_tests_riscv64.native_bridge/x86_64/inline_asm_tests_riscv64,\ BERBERIS_MODE=lite-translate-or-interpret)) $(eval $(call add_test,inline_asm_tests_riscv64_heavy_optimize_or_interpret,\ run_test_x86_64_riscv64,\ $(TARGET_OUT_TESTCASES)/inline_asm_tests_riscv64.native_bridge/x86_64/inline_asm_tests_riscv64,\ BERBERIS_MODE=heavy-optimize-or-interpret)) $(eval $(call add_test,inline_asm_tests_riscv64_two_gear,\ run_test_x86_64_riscv64,\ $(TARGET_OUT_TESTCASES)/inline_asm_tests_riscv64.native_bridge/x86_64/inline_asm_tests_riscv64,\ BERBERIS_MODE=two-gear)) # berberis_host_tests $(eval $(call add_test,berberis_host_tests,\ run_test,\ $(HOST_OUT)/nativetest64/berberis_host_tests/berberis_host_tests)) endif # BUILD_BERBERIS_RISCV64_TO_X86_64 test_dir := gen_failure_template := runner_riscv64 := host_libc_root := test_guard := test_trigger := run_test := run_test_x86_64_riscv64 := add_test :=