/* * Copyright (C) 2020 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 #include #include #include #include #include "LazyTestService.h" using android::BBinder; using android::IBinder; using android::IPCThreadState; using android::OK; using android::sp; using android::binder::LazyServiceRegistrar; using android::binder::LazyTestService; void setupDoubleLazyServer() { sp service1 = sp::make(); sp service2 = sp::make(); // Simulate another callback here, to test to make sure the actual instance // we are relying on doesn't have its state messed up when multiple client // callbacks are registered. // DO NOT COPY - INTENTIONALLY TESTING BAD BEHAVIOR auto extra = LazyServiceRegistrar::createExtraTestInstance(); extra.forcePersist(true); // don't allow this instance to handle process lifetime CHECK_EQ(OK, extra.registerService(service1, "aidl_lazy_test_1")); // DO NOT COPY - INTENTIONALLY TESTING BAD BEHAVIOR auto lazyRegistrar = LazyServiceRegistrar::getInstance(); CHECK_EQ(OK, lazyRegistrar.registerService(service1, "aidl_lazy_test_1")); CHECK_EQ(OK, lazyRegistrar.registerService(service2, "aidl_lazy_test_2")); } void setupQuitterServer() { auto lazyRegistrar = LazyServiceRegistrar::getInstance(); lazyRegistrar.setActiveServicesCallback([](bool hasClients) mutable -> bool { // intentional bad behavior, for instance, simulating a system // shutdown at this time if (hasClients) exit(EXIT_SUCCESS); return false; }); sp service = sp::make(); CHECK_EQ(OK, lazyRegistrar.registerService(service, "aidl_lazy_test_quit")); } int main(int argc, char** argv) { if (argc == 1) { setupDoubleLazyServer(); } else if (argc == 2 && argv[1] == std::string("quit")) { setupQuitterServer(); } else { LOG_ALWAYS_FATAL("usage: %s [quit]", argv[0]); } IPCThreadState::self()->joinThreadPool(); return 1; }