diff options
author | Martin Stjernholm <mast@google.com> | 2021-05-27 20:54:22 +0100 |
---|---|---|
committer | Martin Stjernholm <mast@google.com> | 2021-06-09 17:02:34 +0100 |
commit | 07f5e96d63121165b82635b6b7fa187ec3920612 (patch) | |
tree | 90ccf13b6bda6eb2e5d80c9a7db79d4e8116ff7e | |
parent | 55309dbfe91c3bf3e9b8da24c002ad52deb3c5e5 (diff) | |
download | art-07f5e96d63121165b82635b6b7fa187ec3920612.tar.gz |
Fix bitrot in the libnativebridge tests.
- Bitrot 1: NativeBridge2Signal_test stopped working when version 3 was
added in https://r.android.com/234059.
- Bitrot 2: The code path that PreInitializeNativeBridgeFail1_test
tested was removed completely when missing app data directory was
allowed in https://r.android.com/1208629, so delete the test.
- Use cc_test_library for the dynamic test libs so they are installed in
the test directory rather than in system/lib(64).
- Use test_per_src since native_bridge.cc doesn't support reloading the
native bridge implementation lib after unloading.
- Add a custom script to run the tests and a preupload check that the
script is run. (Configuring atest for these tests still TBD in
b/189484095 - test_per_src is a complication.)
Cherry-picked from https://r.android.com/1721410.
Test: art/libnativebridge/tests/runtests.sh
Bug: 122710865
Bug: 189484095
Change-Id: Ib2b387e1d858127ca4bb44c548a5105ea8b838d8
Merged-In: Ib2b387e1d858127ca4bb44c548a5105ea8b838d8
-rw-r--r-- | PREUPLOAD.cfg | 4 | ||||
-rw-r--r-- | libnativebridge/tests/Android.bp | 20 | ||||
-rw-r--r-- | libnativebridge/tests/CodeCacheCreate_test.cpp | 5 | ||||
-rw-r--r-- | libnativebridge/tests/NativeBridge2Signal_test.cpp | 2 | ||||
-rw-r--r-- | libnativebridge/tests/NativeBridge3CreateNamespace_test.cpp | 2 | ||||
-rw-r--r-- | libnativebridge/tests/NativeBridge3GetError_test.cpp | 2 | ||||
-rw-r--r-- | libnativebridge/tests/NativeBridge3InitAnonymousNamespace_test.cpp | 2 | ||||
-rw-r--r-- | libnativebridge/tests/NativeBridge3IsPathSupported_test.cpp | 2 | ||||
-rw-r--r-- | libnativebridge/tests/NativeBridge3LoadLibraryExt_test.cpp | 2 | ||||
-rw-r--r-- | libnativebridge/tests/NativeBridge3UnloadLibrary_test.cpp | 2 | ||||
-rw-r--r-- | libnativebridge/tests/NativeBridge6PreZygoteFork_test.cpp | 2 | ||||
-rw-r--r-- | libnativebridge/tests/NativeBridgeTest.h | 2 | ||||
-rw-r--r-- | libnativebridge/tests/NativeBridgeTestCase2.cpp | 5 | ||||
-rw-r--r-- | libnativebridge/tests/PreInitializeNativeBridgeFail1_test.cpp | 40 | ||||
-rwxr-xr-x | libnativebridge/tests/preupload_check_test_tag.sh | 21 | ||||
-rwxr-xr-x | libnativebridge/tests/runtests.sh | 75 |
16 files changed, 119 insertions, 69 deletions
diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg index 1dc96414d3..b8ee3c525c 100644 --- a/PREUPLOAD.cfg +++ b/PREUPLOAD.cfg @@ -3,6 +3,10 @@ check_generated_tests_up_to_date = tools/test_presubmit.py hidden_api_txt_checksorted_hook = ${REPO_ROOT}/tools/platform-compat/hiddenapi/checksorted_sha.sh ${PREUPLOAD_COMMIT} ${REPO_ROOT} +# TODO(b/189484095): Port libnativebridge tests to atest and enable in presubmit +# so we don't need the custom runtests script and this check. +check_libnativebridge_test_field = libnativebridge/tests/preupload_check_test_tag.sh ${PREUPLOAD_COMMIT_MESSAGE} ${PREUPLOAD_FILES} + [Builtin Hooks] cpplint = true bpfmt = true diff --git a/libnativebridge/tests/Android.bp b/libnativebridge/tests/Android.bp index 9a81a0dc77..785ccd9b3e 100644 --- a/libnativebridge/tests/Android.bp +++ b/libnativebridge/tests/Android.bp @@ -48,25 +48,25 @@ cc_defaults { cppflags: ["-fvisibility=protected"], } -cc_library_shared { +cc_test_library { name: "libnativebridge-test-case", srcs: ["NativeBridgeTestCase.cpp"], defaults: ["libnativebridge-test-case-defaults"], } -cc_library_shared { +cc_test_library { name: "libnativebridge2-test-case", srcs: ["NativeBridgeTestCase2.cpp"], defaults: ["libnativebridge-test-case-defaults"], } -cc_library_shared { +cc_test_library { name: "libnativebridge3-test-case", srcs: ["NativeBridgeTestCase3.cpp"], defaults: ["libnativebridge-test-case-defaults"], } -cc_library_shared { +cc_test_library { name: "libnativebridge6-test-case", srcs: ["NativeBridgeTestCase6.cpp"], defaults: ["libnativebridge-test-case-defaults"], @@ -76,7 +76,7 @@ cc_library_shared { } // A helper library to produce test-case side effect of PreZygoteForkNativeBridge. -cc_library_shared { +cc_test_library { name: "libnativebridge6prezygotefork", srcs: ["NativeBridge6PreZygoteFork_lib.cpp"], defaults: ["libnativebridge-test-case-defaults"], @@ -102,6 +102,10 @@ cc_defaults { }, }, + // native_bridge.cc doesn't support reloading the native bridge after + // unloading, so each test needs to be its own process. + test_per_src: true, + srcs: [ "CodeCacheCreate_test.cpp", "CodeCacheExists_test.cpp", @@ -112,7 +116,6 @@ cc_defaults { "NativeBridgeVersion_test.cpp", "NeedsNativeBridge_test.cpp", "PreInitializeNativeBridge_test.cpp", - "PreInitializeNativeBridgeFail1_test.cpp", "PreInitializeNativeBridgeFail2_test.cpp", "ReSetupNativeBridge_test.cpp", "UnavailableNativeBridge_test.cpp", @@ -129,6 +132,9 @@ cc_defaults { shared_libs: [ "liblog", "libnativebridge-test-case", + "libnativebridge2-test-case", + "libnativebridge3-test-case", + "libnativebridge6-test-case", "libnativebridge6prezygotefork", ], header_libs: ["libbase_headers"], @@ -173,5 +179,5 @@ cc_test { "jni_headers", "libnativebridge-headers", ], - gtest:false, + gtest: false, } diff --git a/libnativebridge/tests/CodeCacheCreate_test.cpp b/libnativebridge/tests/CodeCacheCreate_test.cpp index 58270c43dd..1bd309c5c8 100644 --- a/libnativebridge/tests/CodeCacheCreate_test.cpp +++ b/libnativebridge/tests/CodeCacheCreate_test.cpp @@ -23,9 +23,10 @@ namespace android { // Tests that the bridge initialization creates the code_cache if it doesn't -// exists. +// exist. TEST_F(NativeBridgeTest, CodeCacheCreate) { - // Make sure that code_cache does not exists + // Make sure that code_cache does not exist + rmdir(kCodeCache); struct stat st; ASSERT_EQ(-1, stat(kCodeCache, &st)); ASSERT_EQ(ENOENT, errno); diff --git a/libnativebridge/tests/NativeBridge2Signal_test.cpp b/libnativebridge/tests/NativeBridge2Signal_test.cpp index 59baca4a78..0573a5a680 100644 --- a/libnativebridge/tests/NativeBridge2Signal_test.cpp +++ b/libnativebridge/tests/NativeBridge2Signal_test.cpp @@ -21,8 +21,6 @@ namespace android { -constexpr const char* kNativeBridgeLibrary2 = "libnativebridge2-test-case.so"; - TEST_F(NativeBridgeTest, V2_Signal) { // Init ASSERT_TRUE(LoadNativeBridge(kNativeBridgeLibrary2, nullptr)); diff --git a/libnativebridge/tests/NativeBridge3CreateNamespace_test.cpp b/libnativebridge/tests/NativeBridge3CreateNamespace_test.cpp index 3bcc917779..db7dd31cfb 100644 --- a/libnativebridge/tests/NativeBridge3CreateNamespace_test.cpp +++ b/libnativebridge/tests/NativeBridge3CreateNamespace_test.cpp @@ -18,8 +18,6 @@ namespace android { -constexpr const char* kNativeBridgeLibrary3 = "libnativebridge3-test-case.so"; - TEST_F(NativeBridgeTest, V3_CreateNamespace) { // Init ASSERT_TRUE(LoadNativeBridge(kNativeBridgeLibrary3, nullptr)); diff --git a/libnativebridge/tests/NativeBridge3GetError_test.cpp b/libnativebridge/tests/NativeBridge3GetError_test.cpp index b6b315db06..afd0a7d511 100644 --- a/libnativebridge/tests/NativeBridge3GetError_test.cpp +++ b/libnativebridge/tests/NativeBridge3GetError_test.cpp @@ -18,8 +18,6 @@ namespace android { -constexpr const char* kNativeBridgeLibrary3 = "libnativebridge3-test-case.so"; - TEST_F(NativeBridgeTest, V3_GetError) { // Init ASSERT_TRUE(LoadNativeBridge(kNativeBridgeLibrary3, nullptr)); diff --git a/libnativebridge/tests/NativeBridge3InitAnonymousNamespace_test.cpp b/libnativebridge/tests/NativeBridge3InitAnonymousNamespace_test.cpp index b1855b4087..f82c9e9e4c 100644 --- a/libnativebridge/tests/NativeBridge3InitAnonymousNamespace_test.cpp +++ b/libnativebridge/tests/NativeBridge3InitAnonymousNamespace_test.cpp @@ -18,8 +18,6 @@ namespace android { -constexpr const char* kNativeBridgeLibrary3 = "libnativebridge3-test-case.so"; - TEST_F(NativeBridgeTest, V3_InitAnonymousNamespace) { // Init ASSERT_TRUE(LoadNativeBridge(kNativeBridgeLibrary3, nullptr)); diff --git a/libnativebridge/tests/NativeBridge3IsPathSupported_test.cpp b/libnativebridge/tests/NativeBridge3IsPathSupported_test.cpp index da9cf1cda0..4cbc0e8758 100644 --- a/libnativebridge/tests/NativeBridge3IsPathSupported_test.cpp +++ b/libnativebridge/tests/NativeBridge3IsPathSupported_test.cpp @@ -18,8 +18,6 @@ namespace android { -constexpr const char* kNativeBridgeLibrary3 = "libnativebridge3-test-case.so"; - TEST_F(NativeBridgeTest, V3_IsPathSupported) { // Init ASSERT_TRUE(LoadNativeBridge(kNativeBridgeLibrary3, nullptr)); diff --git a/libnativebridge/tests/NativeBridge3LoadLibraryExt_test.cpp b/libnativebridge/tests/NativeBridge3LoadLibraryExt_test.cpp index 9d037b5ca4..3d6676811a 100644 --- a/libnativebridge/tests/NativeBridge3LoadLibraryExt_test.cpp +++ b/libnativebridge/tests/NativeBridge3LoadLibraryExt_test.cpp @@ -18,8 +18,6 @@ namespace android { -constexpr const char* kNativeBridgeLibrary3 = "libnativebridge3-test-case.so"; - TEST_F(NativeBridgeTest, V3_LoadLibraryExt) { // Init ASSERT_TRUE(LoadNativeBridge(kNativeBridgeLibrary3, nullptr)); diff --git a/libnativebridge/tests/NativeBridge3UnloadLibrary_test.cpp b/libnativebridge/tests/NativeBridge3UnloadLibrary_test.cpp index 041fc62964..a366edcdce 100644 --- a/libnativebridge/tests/NativeBridge3UnloadLibrary_test.cpp +++ b/libnativebridge/tests/NativeBridge3UnloadLibrary_test.cpp @@ -18,8 +18,6 @@ namespace android { -constexpr const char* kNativeBridgeLibrary3 = "libnativebridge3-test-case.so"; - TEST_F(NativeBridgeTest, V3_UnloadLibrary) { // Init ASSERT_TRUE(LoadNativeBridge(kNativeBridgeLibrary3, nullptr)); diff --git a/libnativebridge/tests/NativeBridge6PreZygoteFork_test.cpp b/libnativebridge/tests/NativeBridge6PreZygoteFork_test.cpp index 652248354b..ba6a007a93 100644 --- a/libnativebridge/tests/NativeBridge6PreZygoteFork_test.cpp +++ b/libnativebridge/tests/NativeBridge6PreZygoteFork_test.cpp @@ -19,8 +19,6 @@ namespace android { -constexpr const char* kNativeBridgeLibrary6 = "libnativebridge6-test-case.so"; - TEST_F(NativeBridgeTest, V6_PreZygoteFork) { // Init ASSERT_TRUE(LoadNativeBridge(kNativeBridgeLibrary6, nullptr)); diff --git a/libnativebridge/tests/NativeBridgeTest.h b/libnativebridge/tests/NativeBridgeTest.h index cd0fd015af..62509b8917 100644 --- a/libnativebridge/tests/NativeBridgeTest.h +++ b/libnativebridge/tests/NativeBridgeTest.h @@ -27,6 +27,7 @@ constexpr const char* kCodeCache = "./code_cache"; constexpr const char* kCodeCacheStatFail = "./code_cache/temp"; constexpr const char* kNativeBridgeLibrary2 = "libnativebridge2-test-case.so"; constexpr const char* kNativeBridgeLibrary3 = "libnativebridge3-test-case.so"; +constexpr const char* kNativeBridgeLibrary6 = "libnativebridge6-test-case.so"; namespace android { @@ -36,4 +37,3 @@ class NativeBridgeTest : public testing::Test { }; // namespace android #endif // ART_LIBNATIVEBRIDGE_TESTS_NATIVEBRIDGETEST_H_ - diff --git a/libnativebridge/tests/NativeBridgeTestCase2.cpp b/libnativebridge/tests/NativeBridgeTestCase2.cpp index 3c75ebfb51..5164dec7be 100644 --- a/libnativebridge/tests/NativeBridgeTestCase2.cpp +++ b/libnativebridge/tests/NativeBridgeTestCase2.cpp @@ -46,8 +46,8 @@ extern "C" const struct android::NativeBridgeRuntimeValues* native_bridge2_getAp } extern "C" bool native_bridge2_is_compatible_compatible_with(uint32_t version) { - // For testing, allow 1 and 2, but disallow 3+. - return version <= 2; + // For testing, allow 1-3, but disallow later. + return version <= 3; } static bool native_bridge2_test_case_signal_handler(int, siginfo_t*, void*) { @@ -73,4 +73,3 @@ android::NativeBridgeCallbacks NativeBridgeItf { .isCompatibleWith = &native_bridge2_is_compatible_compatible_with, .getSignalHandler = &native_bridge2_get_signal_handler }; - diff --git a/libnativebridge/tests/PreInitializeNativeBridgeFail1_test.cpp b/libnativebridge/tests/PreInitializeNativeBridgeFail1_test.cpp deleted file mode 100644 index 5a2b0a150f..0000000000 --- a/libnativebridge/tests/PreInitializeNativeBridgeFail1_test.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2014 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. - */ - -#include "NativeBridgeTest.h" - -#include <dlfcn.h> -#include <errno.h> -#include <fcntl.h> -#include <stdio.h> -#include <sys/mount.h> -#include <sys/stat.h> - -#include <cstdio> -#include <cstring> - -#include <android/log.h> - -namespace android { - -TEST_F(NativeBridgeTest, PreInitializeNativeBridgeFail1) { - // Needs a valid application directory. - ASSERT_TRUE(LoadNativeBridge(kNativeBridgeLibrary, nullptr)); - ASSERT_FALSE(PreInitializeNativeBridge(nullptr, "isa")); - ASSERT_TRUE(NativeBridgeError()); -} - -} // namespace android diff --git a/libnativebridge/tests/preupload_check_test_tag.sh b/libnativebridge/tests/preupload_check_test_tag.sh new file mode 100755 index 0000000000..1c8cd4b62c --- /dev/null +++ b/libnativebridge/tests/preupload_check_test_tag.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# A simple preupload check that the runtests.sh script has been run for the +# libnativebridge tests if that library has been changed. +# TODO(b/189484095): Port these tests to atest and enable in presubmit so we +# don't need the custom script to run them. + +commit_message="$1" +shift + +nativebridge_change=false +for file; do + [[ $file = libnativebridge/* ]] && nativebridge_change=true +done + +if $nativebridge_change; then + if grep '^Test: art/libnativebridge/tests/runtests.sh' <<< $commit_message ; then :; else + echo "Please run art/libnativebridge/tests/runtests.sh and add the tag:" 1>&2 + echo "Test: art/libnativebridge/tests/runtests.sh [--skip-host|--skip-target]" 1>&2 + exit 1 + fi +fi diff --git a/libnativebridge/tests/runtests.sh b/libnativebridge/tests/runtests.sh new file mode 100755 index 0000000000..1eb232d2dd --- /dev/null +++ b/libnativebridge/tests/runtests.sh @@ -0,0 +1,75 @@ +#!/bin/bash + +set -e + +skip_build= +skip_host= +skip_target= +skip_cleanup= +for arg; do + case "$arg" in + --skip-build) skip_build=true ;; + --skip-host) skip_host=true ;; + --skip-target) skip_target=true ;; + --skip-cleanup) skip_cleanup=true ;; + *) break ;; + esac + shift +done + +echo_and_run() { + echo "$@" + eval "$@" +} + +device_test_root=/data/local/tmp/libnativebridge-test + +vars="$(build/soong/soong_ui.bash --dumpvars-mode --vars='HOST_OUT PRODUCT_OUT TARGET_ARCH')" +# Assign to a variable and eval that, since bash ignores any error status +# from the command substitution if it's directly on the eval line. +eval $vars + +if [ -z "$skip_build" ]; then + rm -rf $HOST_OUT/nativetest{,64} $PRODUCT_OUT/data/nativetest{,64}/art/$TARGET_ARCH + echo_and_run build/soong/soong_ui.bash --make-mode MODULES-IN-art-libnativebridge-tests +fi + +if [ -z "$skip_host" ]; then + for build_dir in $HOST_OUT/nativetest{,64}/ ; do + if [ ! -d $build_dir ]; then + echo "Skipping missing $build_dir" + else + for test_path in $build_dir/*/* ; do + test_rel_path=${test_path#${build_dir}/} + echo_and_run \( cd $build_dir \; $test_rel_path $* \) + done + fi + done +fi + +if [ -z "$skip_target" ]; then + adb root + adb wait-for-device + + for build_dir in $PRODUCT_OUT/data/nativetest{,64}/art/$TARGET_ARCH ; do + if [ ! -d $build_dir ]; then + echo "Skipping missing $build_dir" + else + test_dir=$device_test_root/$TARGET_ARCH + + echo_and_run adb shell rm -rf $test_dir + echo_and_run adb push $build_dir $test_dir + + for test_path in $build_dir/*/* ; do + test_rel_path=${test_path#${build_dir}/} + echo_and_run adb shell cd $test_dir '\;' LD_LIBRARY_PATH=. $test_rel_path $* + done + fi + done + + if [ -z "$skip_cleanup" ]; then + echo_and_run adb shell rm -rf $device_test_root + fi +fi + +echo "No errors" |