Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 94935f7e authored by Automerger Merge Worker's avatar Automerger Merge Worker
Browse files

Merge changes from topic "libbinder_ndk_unit_test" am: a17d0e1f am: 76743263 am: 34cec6b2

Change-Id: Ie6f6c0c4f302d43937d0d2a242a08921e3443105
parents 57c509e7 34cec6b2
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -18,6 +18,9 @@
    {
      "name": "binderStabilityTest"
    },
    {
      "name": "libbinder_ndk_unit_test"
    },
    {
      "name": "CtsNdkBinderTestCases"
    }

libs/binder/ndk/runtests.sh

deleted100755 → 0
+0 −45
Original line number Diff line number Diff line
#!/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
+3 −9
Original line number Diff line number Diff line
@@ -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 {
+40 −2
Original line number Diff line number Diff line
@@ -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();

+0 −57
Original line number Diff line number Diff line
/*
 * 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);
}