diff options
author | 2020-01-28 16:57:37 +0000 | |
---|---|---|
committer | 2020-01-28 16:57:37 +0000 | |
commit | a17d0e1fe6b3f6d940e5e90e8f6d75fcd8c6970a (patch) | |
tree | e134f477a9f22eb1541d49f5e3f2689ab6ffb57b | |
parent | 3ed7588987db4b08c791207c09b67335de7b60be (diff) | |
parent | f92c1fa0443edfc8a9a206b2c212317c8df999ad (diff) |
Merge changes from topic "libbinder_ndk_unit_test"
* changes:
libbinder_ndk: make test work w/ TEST_MAPPING
libbinder_ndk unit tests: hold onto linked binder
-rw-r--r-- | libs/binder/TEST_MAPPING | 3 | ||||
-rwxr-xr-x | libs/binder/ndk/runtests.sh | 45 | ||||
-rw-r--r-- | libs/binder/ndk/test/Android.bp | 12 | ||||
-rw-r--r-- | libs/binder/ndk/test/libbinder_ndk_unit_test.cpp (renamed from libs/binder/ndk/test/main_client.cpp) | 42 | ||||
-rw-r--r-- | libs/binder/ndk/test/main_server.cpp | 57 |
5 files changed, 46 insertions, 113 deletions
diff --git a/libs/binder/TEST_MAPPING b/libs/binder/TEST_MAPPING index b3afd817c1..55419eb609 100644 --- a/libs/binder/TEST_MAPPING +++ b/libs/binder/TEST_MAPPING @@ -19,6 +19,9 @@ "name": "binderStabilityTest" }, { + "name": "libbinder_ndk_unit_test" + }, + { "name": "CtsNdkBinderTestCases" } ] diff --git a/libs/binder/ndk/runtests.sh b/libs/binder/ndk/runtests.sh deleted file mode 100755 index a0c49fb167..0000000000 --- a/libs/binder/ndk/runtests.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (C) 2018 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. - -if [ -z $ANDROID_BUILD_TOP ]; then - echo "You need to source and lunch before you can use this script" - exit 1 -fi - -set -ex - -function run_libbinder_ndk_test() { - adb shell /data/nativetest64/libbinder_ndk_test_server/libbinder_ndk_test_server & - - # avoid getService 1s delay for most runs, non-critical - sleep 0.1 - - adb shell /data/nativetest64/libbinder_ndk_test_client/libbinder_ndk_test_client; \ - adb shell killall libbinder_ndk_test_server -} - -[ "$1" != "--skip-build" ] && $ANDROID_BUILD_TOP/build/soong/soong_ui.bash --make-mode \ - MODULES-IN-frameworks-native-libs-binder-ndk - -adb root -adb wait-for-device -adb sync data - -# very simple unit tests, tests things outside of the NDK as well -run_libbinder_ndk_test - -# CTS tests (much more comprehensive, new tests should ideally go here) -atest android.binder.cts diff --git a/libs/binder/ndk/test/Android.bp b/libs/binder/ndk/test/Android.bp index daaaa5aa7e..062cdb6d39 100644 --- a/libs/binder/ndk/test/Android.bp +++ b/libs/binder/ndk/test/Android.bp @@ -56,16 +56,10 @@ cc_defaults { // specifically the parts which are outside of the NDK. Actual users should // also instead use AIDL to generate these stubs. See android.binder.cts. cc_test { - name: "libbinder_ndk_test_client", + name: "libbinder_ndk_unit_test", defaults: ["test_libbinder_ndk_test_defaults"], - srcs: ["main_client.cpp"], -} - -cc_test { - name: "libbinder_ndk_test_server", - defaults: ["test_libbinder_ndk_test_defaults"], - srcs: ["main_server.cpp"], - gtest: false, + srcs: ["libbinder_ndk_unit_test.cpp"], + test_suites: ["general-tests"], } cc_test { diff --git a/libs/binder/ndk/test/main_client.cpp b/libs/binder/ndk/test/libbinder_ndk_unit_test.cpp index 8467734c75..8aba411101 100644 --- a/libs/binder/ndk/test/main_client.cpp +++ b/libs/binder/ndk/test/libbinder_ndk_unit_test.cpp @@ -21,6 +21,7 @@ #include <gtest/gtest.h> #include <iface/iface.h> +#include <sys/prctl.h> #include <chrono> #include <condition_variable> #include <mutex> @@ -29,6 +30,34 @@ using ::android::sp; constexpr char kExistingNonNdkService[] = "SurfaceFlinger"; +class MyFoo : public IFoo { + binder_status_t doubleNumber(int32_t in, int32_t* out) override { + *out = 2 * in; + LOG(INFO) << "doubleNumber (" << in << ") => " << *out; + return STATUS_OK; + } + + binder_status_t die() override { + LOG(FATAL) << "IFoo::die called!"; + return STATUS_UNKNOWN_ERROR; + } +}; + +int service(const char* instance) { + ABinderProcess_setThreadPoolMaxThreadCount(0); + + // Strong reference to MyFoo kept by service manager. + binder_status_t status = (new MyFoo)->addService(instance); + + if (status != STATUS_OK) { + LOG(FATAL) << "Could not register: " << status << " " << instance; + } + + ABinderProcess_joinThreadPool(); + + return 1; // should not return +} + // This is too slow // TEST(NdkBinder, GetServiceThatDoesntExist) { // sp<IFoo> foo = IFoo::getService("asdfghkl;"); @@ -87,14 +116,14 @@ TEST(NdkBinder, DeathRecipient) { EXPECT_EQ(STATUS_DEAD_OBJECT, foo->die()); foo = nullptr; - AIBinder_decStrong(binder); - binder = nullptr; std::unique_lock<std::mutex> lock(deathMutex); EXPECT_TRUE(deathCv.wait_for(lock, 1s, [&] { return deathRecieved; })); EXPECT_TRUE(deathRecieved); AIBinder_DeathRecipient_delete(recipient); + AIBinder_decStrong(binder); + binder = nullptr; } TEST(NdkBinder, RetrieveNonNdkService) { @@ -199,6 +228,15 @@ TEST(NdkBinder, AddServiceMultipleTimes) { int main(int argc, char* argv[]) { ::testing::InitGoogleTest(&argc, argv); + if (fork() == 0) { + prctl(PR_SET_PDEATHSIG, SIGHUP); + return service(IFoo::kInstanceNameToDieFor); + } + if (fork() == 0) { + prctl(PR_SET_PDEATHSIG, SIGHUP); + return service(IFoo::kSomeInstanceName); + } + ABinderProcess_setThreadPoolMaxThreadCount(1); // to recieve death notifications/callbacks ABinderProcess_startThreadPool(); diff --git a/libs/binder/ndk/test/main_server.cpp b/libs/binder/ndk/test/main_server.cpp deleted file mode 100644 index a6e17e8d98..0000000000 --- a/libs/binder/ndk/test/main_server.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2018 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 <android-base/logging.h> -#include <android/binder_process.h> -#include <iface/iface.h> - -using ::android::sp; - -class MyFoo : public IFoo { - binder_status_t doubleNumber(int32_t in, int32_t* out) override { - *out = 2 * in; - LOG(INFO) << "doubleNumber (" << in << ") => " << *out; - return STATUS_OK; - } - - binder_status_t die() override { - LOG(FATAL) << "IFoo::die called!"; - return STATUS_UNKNOWN_ERROR; - } -}; - -int service(const char* instance) { - ABinderProcess_setThreadPoolMaxThreadCount(0); - - // Strong reference to MyFoo kept by service manager. - binder_status_t status = (new MyFoo)->addService(instance); - - if (status != STATUS_OK) { - LOG(FATAL) << "Could not register: " << status << " " << instance; - } - - ABinderProcess_joinThreadPool(); - - return 1; // should not return -} - -int main() { - if (fork() == 0) { - return service(IFoo::kInstanceNameToDieFor); - } - - return service(IFoo::kSomeInstanceName); -} |