blob: a425dbf69b9e331fd698080efa4d6639ea5c3da9 [file] [log] [blame]
/*
* 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 <android-base/logging.h>
#include <binder/IBinder.h>
#include <binder/IPCThreadState.h>
#include <binder/IServiceManager.h>
#include <binder/LazyServiceRegistrar.h>
#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<LazyTestService> service1 = sp<LazyTestService>::make();
sp<LazyTestService> service2 = sp<LazyTestService>::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<LazyTestService> service = sp<LazyTestService>::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;
}