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

Commit 2c82ddf6 authored by Charles Chen's avatar Charles Chen
Browse files

Test added for AServiceManager_addServiceWithFlags

This test verifies if the service added with addServiceWithFlags can be
accessible. Verifying the individual behaviors of each flag is not the
focus of this change.

Bug: 272102518
Test: atest libbinder_ndk_unit_test
Change-Id: Ief35de94d1d45f668721960772381704826fb5f8
parent 548fd9af
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ constexpr char kBinderNdkUnitTestService[] = "BinderNdkUnitTest";
constexpr char kLazyBinderNdkUnitTestService[] = "LazyBinderNdkUnitTest";
constexpr char kForcePersistNdkUnitTestService[] = "ForcePersistNdkUnitTestService";
constexpr char kActiveServicesNdkUnitTestService[] = "ActiveServicesNdkUnitTestService";
constexpr char kBinderNdkUnitTestServiceFlagged[] = "BinderNdkUnitTestFlagged";

constexpr unsigned int kShutdownWaitTime = 11;
constexpr uint64_t kContextTestValue = 0xb4e42fb4d9a1d715;
@@ -158,6 +159,24 @@ int generatedService() {
    return 1;  // should not return
}

int generatedFlaggedService(const AServiceManager_AddServiceFlag flags, const char* instance) {
    ABinderProcess_setThreadPoolMaxThreadCount(0);

    auto service = ndk::SharedRefBase::make<MyBinderNdkUnitTest>();
    auto binder = service->asBinder();

    binder_exception_t exception =
            AServiceManager_addServiceWithFlags(binder.get(), instance, flags);

    if (exception != EX_NONE) {
        LOG(FATAL) << "Could not register: " << exception << " " << instance;
    }

    ABinderProcess_joinThreadPool();

    return 1;  // should not return
}

// manually-written parceling class considered bad practice
class MyFoo : public IFoo {
    binder_status_t doubleNumber(int32_t in, int32_t* out) override {
@@ -847,6 +866,12 @@ TEST(NdkBinder, UseHandleShellCommand) {
    EXPECT_EQ("CMD", shellCmdToString(testService, {"C", "M", "D"}));
}

TEST(NdkBinder, FlaggedServiceAccessible) {
    static const sp<android::IServiceManager> sm(android::defaultServiceManager());
    sp<IBinder> testService = sm->getService(String16(kBinderNdkUnitTestServiceFlagged));
    ASSERT_NE(nullptr, testService);
}

TEST(NdkBinder, GetClassInterfaceDescriptor) {
    ASSERT_STREQ(IFoo::kIFooDescriptor, AIBinder_Class_getDescriptor(IFoo::kClass));
}
@@ -901,6 +926,13 @@ int main(int argc, char* argv[]) {
        prctl(PR_SET_PDEATHSIG, SIGHUP);
        return generatedService();
    }
    if (fork() == 0) {
        prctl(PR_SET_PDEATHSIG, SIGHUP);
        // We may want to change this flag to be more generic ones for the future
        AServiceManager_AddServiceFlag test_flags =
                AServiceManager_AddServiceFlag::ADD_SERVICE_ALLOW_ISOLATED;
        return generatedFlaggedService(test_flags, kBinderNdkUnitTestServiceFlagged);
    }

    ABinderProcess_setThreadPoolMaxThreadCount(1);  // to receive death notifications/callbacks
    ABinderProcess_startThreadPool();