platform_bionic/tests/Android.bp

796 lines
22 KiB
Text
Raw Normal View History

//
// Copyright (C) 2012 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.
//
cc_defaults {
name: "bionic_tests_defaults",
host_supported: true,
cpp_std: "experimental",
target: {
darwin: {
enabled: false,
},
},
cflags: [
"-fstack-protector-all",
"-g",
"-Wall",
"-Wextra",
"-Wunused",
"-Werror",
"-fno-builtin",
// We want to test deprecated API too.
"-Wno-deprecated-declarations",
// For glibc.
"-D__STDC_LIMIT_MACROS",
],
stl: "libc++",
sanitize: {
address: false,
},
bootstrap: true,
}
// -----------------------------------------------------------------------------
// All standard tests.
// -----------------------------------------------------------------------------
// Test diagnostics emitted by clang. The library that results is useless; we
// just want to run '-Xclang -verify', which will fail if the diagnostics don't
// match up with what the source file says they should be.
cc_test_library {
name: "clang_diagnostic_tests",
cflags: [
"-Xclang",
"-verify",
],
srcs: ["sys_ioctl_diag_test.cpp"],
}
cc_test_library {
name: "libBionicStandardTests",
defaults: ["bionic_tests_defaults"],
srcs: [
"__aeabi_read_tp_test.cpp",
"alloca_test.cpp",
"android_get_device_api_level.cpp",
"arpa_inet_test.cpp",
"async_safe_test.cpp",
"assert_test.cpp",
"buffer_tests.cpp",
"bug_26110743_test.cpp",
"byteswap_test.cpp",
"complex_test.cpp",
"complex_force_long_double_test.cpp",
"ctype_test.cpp",
"dirent_test.cpp",
"elf_test.cpp",
"endian_test.cpp",
"errno_test.cpp",
"error_test.cpp",
"eventfd_test.cpp",
"fcntl_test.cpp",
"fdsan_test.cpp",
"fenv_test.cpp",
"float_test.cpp",
"ftw_test.cpp",
"getauxval_test.cpp",
"getcwd_test.cpp",
"glob_test.cpp",
"grp_pwd_test.cpp",
"grp_pwd_file_test.cpp",
"iconv_test.cpp",
"ifaddrs_test.cpp",
"ifunc_test.cpp",
"inttypes_test.cpp",
"iso646_test.c",
"langinfo_test.cpp",
"leak_test.cpp",
"libgen_basename_test.cpp",
"libgen_test.cpp",
"limits_test.cpp",
"linux_swab_test.cpp",
"locale_test.cpp",
"malloc_iterate_test.cpp",
"malloc_test.cpp",
"math_test.cpp",
"math_force_long_double_test.cpp",
"membarrier_test.cpp",
"mntent_test.cpp",
"netdb_test.cpp",
"net_if_test.cpp",
"netinet_ether_test.cpp",
"netinet_in_test.cpp",
"netinet_ip_icmp_test.cpp",
"netinet_udp_test.cpp",
"nl_types_test.cpp",
"poll_test.cpp",
"pthread_test.cpp",
"pty_test.cpp",
"regex_test.cpp",
"resolv_test.cpp",
"sched_test.cpp",
"scs_test.cpp",
"scsi_sg_test.cpp",
"search_test.cpp",
"semaphore_test.cpp",
"setjmp_test.cpp",
"signal_test.cpp",
"spawn_test.cpp",
"stack_protector_test.cpp",
"stack_protector_test_helper.cpp",
"stack_unwinding_test.cpp",
"stdalign_test.cpp",
"stdarg_test.cpp",
"stdatomic_test.cpp",
"stdbool_test.c",
"stdint_test.cpp",
"stdio_nofortify_test.cpp",
"stdio_test.cpp",
"stdio_ext_test.cpp",
"stdlib_test.cpp",
"stdnoreturn_test.cpp",
"string_nofortify_test.cpp",
"string_test.cpp",
"string_posix_strerror_r_test.cpp",
"strings_nofortify_test.cpp",
"strings_test.cpp",
"sstream_test.cpp",
"sys_epoll_test.cpp",
"sys_mman_test.cpp",
"sys_msg_test.cpp",
"sys_param_test.cpp",
"sys_personality_test.cpp",
"sys_prctl_test.cpp",
"sys_procfs_test.cpp",
"sys_ptrace_test.cpp",
"sys_quota_test.cpp",
"sys_random_test.cpp",
"sys_resource_test.cpp",
"sys_select_test.cpp",
"sys_sem_test.cpp",
"sys_sendfile_test.cpp",
"sys_shm_test.cpp",
"sys_signalfd_test.cpp",
"sys_socket_test.cpp",
"sys_stat_test.cpp",
"sys_statvfs_test.cpp",
"sys_syscall_test.cpp",
"sys_sysinfo_test.cpp",
"sys_sysmacros_test.cpp",
"sys_time_test.cpp",
"sys_timex_test.cpp",
"sys_ttydefaults_test.cpp",
"sys_types_test.cpp",
"sys_uio_test.cpp",
"sys_un_test.cpp",
"sys_vfs_test.cpp",
"sys_xattr_test.cpp",
"system_properties_test.cpp",
"system_properties_test2.cpp",
"termios_test.cpp",
"tgmath_test.c",
"threads_test.cpp",
"time_test.cpp",
"uchar_test.cpp",
"unistd_nofortify_test.cpp",
"unistd_test.cpp",
"utmp_test.cpp",
"wchar_test.cpp",
"wctype_test.cpp",
],
include_dirs: [
"bionic/libc",
],
target: {
bionic: {
whole_static_libs: [
"libasync_safe",
"libprocinfo",
"libsystemproperties",
],
},
},
static_libs: [
"libtinyxml2",
"liblog",
"libbase",
],
shared: {
enabled: false,
},
generated_headers: ["generated_android_ids"],
}
cc_test_library {
name: "libBionicElfTlsTests",
defaults: ["bionic_tests_defaults"],
srcs: [
"elftls_test.cpp",
],
include_dirs: [
"bionic/libc",
],
shared: {
enabled: false,
},
cflags: [
"-fno-emulated-tls",
],
// With fuzzer builds, compiler instrumentation generates a reference to the
// __sancov_lowest_stack variable, which (for now) is defined by the fuzzer
// library as an emutls symbol. The -fno-emulated-tls flag above configures
// the compiler to reference an ordinary ELF TLS __sancov_lowest_stack
// symbol instead, which isn't defined. Disable the fuzzer for this test
// until the platform is switched to ELF TLS.
sanitize: {
fuzzer: false,
},
}
cc_test_library {
name: "libBionicElfTlsLoaderTests",
defaults: ["bionic_tests_defaults"],
srcs: [
"elftls_dl_test.cpp",
],
include_dirs: [
"bionic/libc",
],
static_libs: [
"liblog",
"libbase",
],
shared: {
enabled: false,
},
cflags: [
"-fno-emulated-tls",
],
// With fuzzer builds, compiler instrumentation generates a reference to the
// __sancov_lowest_stack variable, which (for now) is defined by the fuzzer
// library as an emutls symbol. The -fno-emulated-tls flag above configures
// the compiler to reference an ordinary ELF TLS __sancov_lowest_stack
// symbol instead, which isn't defined. Disable the fuzzer for this test
// until the platform is switched to ELF TLS.
sanitize: {
fuzzer: false,
},
}
// -----------------------------------------------------------------------------
// Fortify tests.
// -----------------------------------------------------------------------------
cc_defaults {
name: "bionic_fortify_tests_defaults",
cflags: [
"-U_FORTIFY_SOURCE",
],
srcs: ["fortify_test_main.cpp"],
target: {
host: {
clang_cflags: ["-D__clang__"],
},
},
}
// If building this fails, then we have both FORTIFY and ASAN enabled, which
// isn't desirable. (Ideally, we'd emit FORTIFY diagnostics even with ASAN
// enabled, but that's not a reality today.) This is meant to be otherwise
// unused.
cc_test_library {
name: "fortify_disabled_for_asan",
cflags: [
"-Werror",
"-D_FORTIFY_SOURCE=2",
// "sanitize: address" doesn't work on platforms where libasan isn't
// enabled. Since the intent is just to build this, we can get away with
// passing this flag on its own.
"-fsanitize=address",
"-Wno-memset-transposed-args",
],
// Ignore that we don't have ASAN symbols linked in.
allow_undefined_symbols: true,
srcs: ["fortify_filecheck_diagnostics_test.cpp"],
}
// Ensure we don't use FORTIFY'ed functions with the static analyzer/clang-tidy:
// it can confuse these tools pretty easily. If this builds successfully, then
// __clang_analyzer__ overrode FORTIFY. Otherwise, FORTIFY was incorrectly
// enabled. The library that results from building this is meant to be unused.
cc_test_library {
name: "fortify_disabled_for_tidy",
cflags: [
"-Werror",
"-D_FORTIFY_SOURCE=2",
"-D__clang_analyzer__",
"-Wno-memset-transposed-args",
],
srcs: ["fortify_filecheck_diagnostics_test.cpp"],
}
cc_test_library {
name: "libfortify1-tests-clang",
defaults: [
"bionic_fortify_tests_defaults",
"bionic_tests_defaults",
],
cflags: [
"-D_FORTIFY_SOURCE=1",
"-DTEST_NAME=Fortify1_clang",
],
shared: {
enabled: false,
},
}
cc_test_library {
name: "libfortify2-tests-clang",
defaults: [
"bionic_fortify_tests_defaults",
"bionic_tests_defaults",
],
cflags: [
"-D_FORTIFY_SOURCE=2",
"-DTEST_NAME=Fortify2_clang",
],
shared: {
enabled: false,
},
}
// -----------------------------------------------------------------------------
// Library of all tests (excluding the dynamic linker tests).
// -----------------------------------------------------------------------------
cc_test_library {
name: "libBionicTests",
defaults: ["bionic_tests_defaults"],
whole_static_libs: [
"libBionicStandardTests",
"libBionicElfTlsTests",
"libfortify1-tests-clang",
"libfortify2-tests-clang",
],
shared: {
enabled: false,
},
}
cc_test_library {
name: "libBionicLoaderTests",
defaults: [
"bionic_tests_defaults",
"llvm-defaults",
],
srcs: [
"atexit_test.cpp",
"dl_test.cpp",
"dlfcn_symlink_support.cpp",
"dlfcn_test.cpp",
"link_test.cpp",
"pthread_dlfcn_test.cpp",
],
static_libs: [
"libbase",
],
include_dirs: [
"bionic/libc",
],
shared: {
enabled: false,
},
target: {
android: {
srcs: [
"cfi_test.cpp",
"dlext_test.cpp",
"libdl_test.cpp",
],
static_libs: [
"libmeminfo",
"libprocinfo",
"libziparchive",
"libLLVMObject",
"libLLVMBitReader",
"libLLVMMC",
"libLLVMMCParser",
"libLLVMCore",
"libLLVMSupport",
],
},
},
}
// -----------------------------------------------------------------------------
// Library of bionic customized gtest main function, with normal gtest output format,
// which is needed by bionic cts test.
// -----------------------------------------------------------------------------
cc_test_library {
name: "libBionicCtsGtestMain",
defaults: ["bionic_tests_defaults"],
srcs: [
"gtest_globals_cts.cpp",
"gtest_main.cpp",
],
shared: {
enabled: false,
},
whole_static_libs: [
"libgtest_isolated",
],
}
// -----------------------------------------------------------------------------
// Tests for the device using bionic's .so. Run with:
// adb shell /data/nativetest/bionic-unit-tests/bionic-unit-tests
// adb shell /data/nativetest64/bionic-unit-tests/bionic-unit-tests
// -----------------------------------------------------------------------------
cc_defaults {
name: "bionic_unit_tests_defaults",
host_supported: false,
gtest: false,
defaults: [
"bionic_tests_defaults",
],
whole_static_libs: [
"libBionicTests",
"libBionicLoaderTests",
"libBionicElfTlsLoaderTests",
],
static_libs: [
"libtinyxml2",
"liblog",
"libbase",
"libgtest_isolated",
],
srcs: [
// TODO: Include __cxa_thread_atexit_test.cpp to glibc tests once it is upgraded (glibc 2.18+)
"__cxa_thread_atexit_test.cpp",
"gtest_globals.cpp",
"gtest_main.cpp",
"thread_local_test.cpp",
],
conlyflags: [
"-fexceptions",
"-fnon-call-exceptions",
],
ldflags: ["-Wl,--export-dynamic"],
include_dirs: ["bionic/libc"],
stl: "libc++_static",
target: {
android: {
shared_libs: [
"ld-android",
"libandroidicu",
"libdl",
"libdl_android",
"libdl_preempt_test_1",
"libdl_preempt_test_2",
"libdl_test_df_1_global",
"libtest_elftls_shared_var",
"libtest_elftls_tprel",
],
static_libs: [
// The order of these libraries matters, do not shuffle them.
"libbase",
"libmeminfo",
"libziparchive",
"libz",
"libutils",
"libLLVMObject",
"libLLVMBitReader",
"libLLVMMC",
"libLLVMMCParser",
"libLLVMCore",
"libLLVMSupport",
],
ldflags: [
"-Wl,--rpath,${ORIGIN}/../bionic-loader-test-libs",
"-Wl,--enable-new-dtags",
],
},
},
required: [
"cfi_test_helper",
"cfi_test_helper2",
"elftls_dlopen_ie_error_helper",
"exec_linker_helper",
"exec_linker_helper_lib",
"libtest_dt_runpath_a",
"libtest_dt_runpath_b",
"libtest_dt_runpath_c",
"libtest_dt_runpath_x",
"libtest_dt_runpath_y",
"libatest_simple_zip",
"libcfi-test",
"libcfi-test-bad",
"libdlext_test_different_soname",
"libdlext_test_fd",
"libdlext_test_norelro",
"libdlext_test_recursive",
"libdlext_test_runpath_zip_zipaligned",
"libdlext_test",
"libdlext_test_zip",
"libdlext_test_zip_zipaligned",
"libdl_preempt_test_1",
"libdl_preempt_test_2",
"libdl_test_df_1_global",
"libgnu-hash-table-library",
"libsysv-hash-table-library",
"libtestshared",
"libtest_atexit",
"libtest_check_order_dlsym_1_left",
"libtest_check_order_dlsym_2_right",
"libtest_check_order_dlsym_3_c",
"libtest_check_order_dlsym_a",
"libtest_check_order_dlsym_b",
"libtest_check_order_dlsym_d",
"libtest_check_order_dlsym",
"libtest_check_order_reloc_root_1",
"libtest_check_order_reloc_root_2",
"libtest_check_order_reloc_root",
"libtest_check_order_reloc_siblings_1",
"libtest_check_order_reloc_siblings_2",
"libtest_check_order_reloc_siblings_3",
"libtest_check_order_reloc_siblings_a",
"libtest_check_order_reloc_siblings_b",
"libtest_check_order_reloc_siblings_c_1",
"libtest_check_order_reloc_siblings_c_2",
"libtest_check_order_reloc_siblings_c",
"libtest_check_order_reloc_siblings_d",
"libtest_check_order_reloc_siblings_e",
"libtest_check_order_reloc_siblings_f",
"libtest_check_order_reloc_siblings",
"libtest_check_rtld_next_from_library",
"libtest_dlopen_df_1_global",
"libtest_dlopen_from_ctor_main",
"libtest_dlopen_from_ctor",
"libtest_dlopen_weak_undefined_func",
"libtest_dlsym_df_1_global",
"libtest_dlsym_from_this_child",
"libtest_dlsym_from_this_grandchild",
"libtest_dlsym_from_this",
"libtest_dlsym_weak_func",
"libtest_dt_runpath_d",
"libtest_elftls_dynamic",
"libtest_elftls_dynamic_filler_1",
"libtest_elftls_dynamic_filler_2",
"libtest_elftls_dynamic_filler_3",
"libtest_elftls_shared_var",
"libtest_elftls_shared_var_ie",
"libtest_elftls_tprel",
"libtest_empty",
"libtest_ifunc_variable_impl",
"libtest_ifunc_variable",
"libtest_ifunc",
"libtest_init_fini_order_child",
"libtest_init_fini_order_grand_child",
"libtest_init_fini_order_root2",
"libtest_init_fini_order_root",
"libtest_missing_symbol_child_public",
"libtest_missing_symbol_child_private",
"libtest_missing_symbol_root",
"libtest_missing_symbol",
"libtest_nodelete_1",
"libtest_nodelete_2",
"libtest_nodelete_dt_flags_1",
"libtest_pthread_atfork",
"libtest_relo_check_dt_needed_order_1",
"libtest_relo_check_dt_needed_order_2",
"libtest_relo_check_dt_needed_order",
"libtest_simple",
"libtest_two_parents_child",
"libtest_two_parents_parent1",
"libtest_two_parents_parent2",
"libtest_versioned_lib",
"libtest_versioned_libv1",
"libtest_versioned_libv2",
"libtest_versioned_otherlib_empty",
"libtest_versioned_otherlib",
"libtest_versioned_uselibv1",
"libtest_versioned_uselibv2_other",
"libtest_versioned_uselibv2",
"libtest_versioned_uselibv3_other",
"libtest_with_dependency_loop_a",
"libtest_with_dependency_loop_b",
"libtest_with_dependency_loop_c",
"libtest_with_dependency_loop",
"libtest_with_dependency",
"libtest_indirect_thread_local_dtor",
"libtest_invalid-empty_shdr_table.so",
"libtest_invalid-rw_load_segment.so",
"libtest_invalid-unaligned_shdr_offset.so",
"libtest_invalid-zero_shdr_table_content.so",
"libtest_invalid-zero_shdr_table_offset.so",
"libtest_invalid-zero_shentsize.so",
"libtest_invalid-zero_shstrndx.so",
"libtest_invalid-textrels.so",
"libtest_invalid-textrels2.so",
"libtest_thread_local_dtor",
"libtest_thread_local_dtor2",
"preinit_getauxval_test_helper",
"preinit_syscall_test_helper",
"libnstest_private_external",
"libnstest_dlopened",
"libnstest_private",
"libnstest_root_not_isolated",
"libnstest_root",
"libnstest_public",
"libnstest_public_internal",
"libnstest_ns_a_public1",
"libnstest_ns_a_public1_internal",
"libnstest_ns_b_public2",
"libnstest_ns_b_public3",
linker: Handle libraries with disjoint mappings correctly. It's possible and sometimes beneficial for a library to have disjoint mappings and for other libraries to be mapped into the gap between the mappings using ANDROID_DLEXT_RESERVED_ADDRESS. See for example the proposal for partitioning in lld [1]. Because the find_containing_library and do_dl_unwind_find_exidx functions use a simple bounds check to figure out whether a pointer belongs to a library they will, given a pointer into a library mapped into the gap of a library with disjoint mappings, return a pointer to the soinfo for the outer library instead of the inner one, because the outer library will appear before the inner one in the solist. From a user perspective this means that we won't be able to unwind the inner library's frames on 32-bit ARM with libgcc, dladdr() will return information for the outer library given a pointer to the inner one and dlopen() et al will use the linker namespace of the outer library when called from the inner one (although they will usually be the same). To make this work correctly, make it so that once find_containing_library sees a match for the bounds check, it examines the library's PT_LOADs to make sure that there is a mapping for the given address. This is similar to how libgcc and libunwind_llvm already handle finding the PT_GNU_EH_FRAME on non-ARM32 platforms [2,3]. do_dl_unwind_find_exidx is reimplemented in terms of find_containing_library. [1] http://lists.llvm.org/pipermail/llvm-dev/2019-February/130583.html [2] https://github.com/llvm/llvm-project/blob/e739ac0e255597d818c907223034ddf3bc18a593/libunwind/src/AddressSpace.hpp#L523 [3] https://android.googlesource.com/toolchain/gcc/+/master/gcc-4.9/libgcc/unwind-dw2-fde-dip.c#294 Test: /data/nativetest{,64}/bionic-unit-tests/bionic-unit-tests on walleye-userdebug Change-Id: I368fe6ad3c470b3dff80f7d9b04253566d63a7d2
2019-03-01 22:12:49 +01:00
"libsegment_gap_inner",
"libsegment_gap_outer",
"ld_preload_test_helper",
"ld_preload_test_helper_lib1",
"ld_preload_test_helper_lib2",
"ld_config_test_helper",
"ld_config_test_helper_lib1",
"ld_config_test_helper_lib2",
"ld_config_test_helper_lib3",
],
}
cc_test {
name: "bionic-unit-tests",
defaults: [
"bionic_unit_tests_defaults",
],
}
cc_test {
name: "bionic-unit-tests-scudo",
defaults: [
"bionic_unit_tests_defaults",
],
shared_libs: [
"libc_scudo",
],
}
// -----------------------------------------------------------------------------
// Tests for the device linked against bionic's static library. Run with:
// adb shell /data/nativetest/bionic-unit-tests-static/bionic-unit-tests-static
// adb shell /data/nativetest64/bionic-unit-tests-static/bionic-unit-tests-static
// -----------------------------------------------------------------------------
cc_test {
name: "bionic-unit-tests-static",
gtest: false,
defaults: ["bionic_tests_defaults"],
host_supported: false,
srcs: [
"gtest_preinit_debuggerd.cpp",
"gtest_globals.cpp",
"gtest_main.cpp",
// The Bionic allocator has its own C++ API. It isn't packaged into its
// own library, so it can only be tested when it's part of libc.a.
"bionic_allocator_test.cpp",
],
include_dirs: [
"bionic/libc",
],
whole_static_libs: [
"libBionicTests",
],
static_libs: [
"libm",
"libc",
"libdl",
"libtinyxml2",
"liblog",
"libbase",
"libdebuggerd_handler",
"libgtest_isolated",
"libtest_elftls_shared_var",
"libtest_elftls_tprel",
],
static_executable: true,
stl: "libc++_static",
}
// -----------------------------------------------------------------------------
// Tests to run on the host and linked against glibc. Run with:
// cd bionic/tests; mm bionic-unit-tests-glibc-run
// -----------------------------------------------------------------------------
cc_test_host {
name: "bionic-unit-tests-glibc",
gtest: false,
defaults: ["bionic_tests_defaults"],
srcs: [
"atexit_test.cpp",
"dlfcn_symlink_support.cpp",
"dlfcn_test.cpp",
"dl_test.cpp",
"gtest_globals.cpp",
"gtest_main.cpp",
"pthread_dlfcn_test.cpp",
],
shared_libs: [
"libdl_preempt_test_1",
"libdl_preempt_test_2",
"libdl_test_df_1_global",
"libtest_elftls_shared_var",
"libtest_elftls_tprel",
],
whole_static_libs: [
"libBionicStandardTests",
"libBionicElfTlsTests",
"libBionicElfTlsLoaderTests",
"libfortify1-tests-clang",
"libfortify2-tests-clang",
],
static_libs: [
"libbase",
"liblog",
"libcutils",
"libgtest_isolated",
],
host_ldlibs: [
"-lresolv",
"-lutil",
],
include_dirs: [
"bionic/libc",
],
ldflags: [
"-Wl,--rpath,${ORIGIN}/../bionic-loader-test-libs",
"-Wl,--export-dynamic",
],
sanitize: {
never: false,
},
target: {
linux_bionic: {
enabled: false,
},
},
}
subdirs = ["*"]