Merge "Make remoteaccess HAL pass VTS." into main

This commit is contained in:
Treehugger Robot
2024-01-11 02:22:28 +00:00
committed by Android (Google) Code Review
4 changed files with 81 additions and 16 deletions

View File

@@ -53,7 +53,9 @@ cc_binary {
vintf_fragments: ["remoteaccess-default-service.xml"],
init_rc: ["remoteaccess-default-service.rc"],
cflags: [
"-DGRPC_SERVICE_ADDRESS=\"10.0.2.2:50051\"",
// Uncomment this if running on emulator and connecting to a local grpc server
// running on host 127.0.0.1:50051 (TestWakeupClientServerHost)
// "-DGRPC_SERVICE_ADDRESS=\"10.0.2.2:50051\"",
],
}

View File

@@ -111,6 +111,8 @@ class RemoteAccessService
WakeupClient::StubInterface* mGrpcStub;
std::thread mThread;
// Whether the GRPC server exists. Only checked and set during init.
bool mGrpcServerExist = false;
std::mutex mLock;
std::condition_variable mCv;
std::shared_ptr<aidl::android::hardware::automotive::remoteaccess::IRemoteTaskCallback>
@@ -121,7 +123,7 @@ class RemoteAccessService
// A mutex to make sure startTaskLoop does not overlap with stopTaskLoop.
std::mutex mStartStopTaskLoopLock;
bool mTaskLoopRunning GUARDED_BY(mStartStopTaskLoopLock) = false;
bool mGrpcConnected GUARDED_BY(mLock) = false;
bool mGrpcReadChannelOpen GUARDED_BY(mLock) = false;
std::unordered_map<std::string, size_t> mClientIdToTaskCount GUARDED_BY(mLock);
// Default wait time before retry connecting to remote access client is 10s.
@@ -143,9 +145,10 @@ class RemoteAccessService
void debugInjectTask(int fd, std::string_view clientId, std::string_view taskData);
void debugInjectTaskNextReboot(int fd, std::string_view clientId, std::string_view taskData,
const char* latencyInSecStr);
void updateGrpcConnected(bool connected);
void updateGrpcReadChannelOpen(bool grpcReadChannelOpen);
android::base::Result<void> deliverRemoteTaskThroughCallback(const std::string& clientId,
std::string_view taskData);
bool isTaskScheduleSupported();
};
} // namespace remoteaccess

View File

@@ -30,10 +30,9 @@
constexpr char SERVICE_NAME[] = "android.hardware.automotive.remoteaccess.IRemoteAccess/default";
int main(int /* argc */, char* /* argv */[]) {
#ifndef GRPC_SERVICE_ADDRESS
LOG(ERROR) << "GRPC_SERVICE_ADDRESS is not defined, exiting";
exit(1);
#endif
android::hardware::automotive::remoteaccess::WakeupClient::StubInterface* grpcStub = nullptr;
#ifdef GRPC_SERVICE_ADDRESS
LOG(INFO) << "Registering RemoteAccessService as service, server: " << GRPC_SERVICE_ADDRESS
<< "...";
grpc::ChannelArguments grpcargs = {};
@@ -47,11 +46,18 @@ int main(int /* argc */, char* /* argv */[]) {
android::netdevice::waitFor({GRPC_SERVICE_IFNAME},
android::netdevice::WaitCondition::PRESENT_AND_UP);
LOG(INFO) << "Waiting for interface: " << GRPC_SERVICE_IFNAME << " done";
#endif
#endif // #ifdef GRPC_SERVICE_IFNAME
auto channel = grpc::CreateChannel(GRPC_SERVICE_ADDRESS, grpc::InsecureChannelCredentials());
auto clientStub = android::hardware::automotive::remoteaccess::WakeupClient::NewStub(channel);
grpcStub = clientStub.get();
#else
LOG(INFO) << "GRPC_SERVICE_ADDRESS is not defined, work in fake mode";
#endif // #ifdef GRPC_SERVICE_ADDRESS
auto service = ndk::SharedRefBase::make<
android::hardware::automotive::remoteaccess::RemoteAccessService>(clientStub.get());
android::hardware::automotive::remoteaccess::RemoteAccessService>(grpcStub);
binder_exception_t err = AServiceManager_addService(service->asBinder().get(), SERVICE_NAME);
if (err != EX_NONE) {

View File

@@ -103,6 +103,10 @@ std::string boolToString(bool x) {
RemoteAccessService::RemoteAccessService(WakeupClient::StubInterface* grpcStub)
: mGrpcStub(grpcStub) {
if (mGrpcStub != nullptr) {
mGrpcServerExist = true;
}
std::ifstream debugTaskFile;
debugTaskFile.open(DEBUG_TASK_FILE, std::ios::in);
if (!debugTaskFile.is_open()) {
@@ -177,9 +181,9 @@ void RemoteAccessService::maybeStopTaskLoop() {
mTaskLoopRunning = false;
}
void RemoteAccessService::updateGrpcConnected(bool connected) {
void RemoteAccessService::updateGrpcReadChannelOpen(bool grpcReadChannelOpen) {
std::lock_guard<std::mutex> lockGuard(mLock);
mGrpcConnected = connected;
mGrpcReadChannelOpen = grpcReadChannelOpen;
}
Result<void> RemoteAccessService::deliverRemoteTaskThroughCallback(const std::string& clientId,
@@ -213,7 +217,7 @@ void RemoteAccessService::runTaskLoop() {
mGetRemoteTasksContext.reset(new ClientContext());
reader = mGrpcStub->GetRemoteTasks(mGetRemoteTasksContext.get(), request);
}
updateGrpcConnected(true);
updateGrpcReadChannelOpen(true);
GetRemoteTasksResponse response;
while (reader->Read(&response)) {
ALOGI("Receiving one task from remote task client");
@@ -225,7 +229,7 @@ void RemoteAccessService::runTaskLoop() {
continue;
}
}
updateGrpcConnected(false);
updateGrpcReadChannelOpen(false);
Status status = reader->Finish();
mGetRemoteTasksContext.reset();
@@ -298,6 +302,11 @@ ScopedAStatus RemoteAccessService::clearRemoteTaskCallback() {
}
ScopedAStatus RemoteAccessService::notifyApStateChange(const ApState& newState) {
if (!mGrpcServerExist) {
ALOGW("GRPC server does not exist, do nothing");
return ScopedAStatus::ok();
}
ClientContext context;
NotifyWakeupRequiredRequest request = {};
request.set_iswakeuprequired(newState.isWakeupRequired);
@@ -315,19 +324,40 @@ ScopedAStatus RemoteAccessService::notifyApStateChange(const ApState& newState)
return ScopedAStatus::ok();
}
bool RemoteAccessService::isTaskScheduleSupported() {
if (!mGrpcServerExist) {
ALOGW("GRPC server does not exist, task scheduling not supported");
return false;
}
return true;
}
ScopedAStatus RemoteAccessService::isTaskScheduleSupported(bool* out) {
*out = true;
*out = isTaskScheduleSupported();
return ScopedAStatus::ok();
}
ndk::ScopedAStatus RemoteAccessService::getSupportedTaskTypesForScheduling(
std::vector<TaskType>* out) {
out->clear();
if (!isTaskScheduleSupported()) {
ALOGW("Task scheduleing is not supported, return empty task types");
return ScopedAStatus::ok();
}
// TODO(b/316233421): support ENTER_GARAGE_MODE type.
out->push_back(TaskType::CUSTOM);
return ScopedAStatus::ok();
}
ScopedAStatus RemoteAccessService::scheduleTask(const ScheduleInfo& scheduleInfo) {
if (!isTaskScheduleSupported()) {
ALOGW("Task scheduleing is not supported, return exception");
return ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
"task scheduling is not supported");
}
ClientContext context;
ScheduleTaskRequest request = {};
ScheduleTaskResponse response = {};
@@ -379,6 +409,11 @@ ScopedAStatus RemoteAccessService::scheduleTask(const ScheduleInfo& scheduleInfo
ScopedAStatus RemoteAccessService::unscheduleTask(const std::string& clientId,
const std::string& scheduleId) {
if (!isTaskScheduleSupported()) {
ALOGW("Task scheduleing is not supported, do nothing");
return ScopedAStatus::ok();
}
ClientContext context;
UnscheduleTaskRequest request = {};
UnscheduleTaskResponse response = {};
@@ -392,6 +427,11 @@ ScopedAStatus RemoteAccessService::unscheduleTask(const std::string& clientId,
}
ScopedAStatus RemoteAccessService::unscheduleAllTasks(const std::string& clientId) {
if (!isTaskScheduleSupported()) {
ALOGW("Task scheduleing is not supported, do nothing");
return ScopedAStatus::ok();
}
ClientContext context;
UnscheduleAllTasksRequest request = {};
UnscheduleAllTasksResponse response = {};
@@ -405,6 +445,12 @@ ScopedAStatus RemoteAccessService::unscheduleAllTasks(const std::string& clientI
ScopedAStatus RemoteAccessService::isTaskScheduled(const std::string& clientId,
const std::string& scheduleId, bool* out) {
if (!isTaskScheduleSupported()) {
ALOGW("Task scheduleing is not supported, return false");
*out = false;
return ScopedAStatus::ok();
}
ClientContext context;
IsTaskScheduledRequest request = {};
IsTaskScheduledResponse response = {};
@@ -420,6 +466,12 @@ ScopedAStatus RemoteAccessService::isTaskScheduled(const std::string& clientId,
ScopedAStatus RemoteAccessService::getAllPendingScheduledTasks(const std::string& clientId,
std::vector<ScheduleInfo>* out) {
if (!isTaskScheduleSupported()) {
ALOGW("Task scheduleing is not supported, return empty array");
out->clear();
return ScopedAStatus::ok();
}
ClientContext context;
GetAllPendingScheduledTasksRequest request = {};
GetAllPendingScheduledTasksResponse response = {};
@@ -560,9 +612,11 @@ void RemoteAccessService::printCurrentStatus(int fd) {
dprintf(fd,
"\nRemoteAccess HAL status \n"
"Remote task callback registered: %s\n"
"Task receiving GRPC connection established: %s\n"
"GRPC server exist: %s\n"
"GRPC read channel for receiving tasks open: %s\n"
"Received task count by clientId: \n%s\n",
boolToString(mRemoteTaskCallback.get()).c_str(), boolToString(mGrpcConnected).c_str(),
boolToString(mRemoteTaskCallback.get()).c_str(), boolToString(mGrpcServerExist).c_str(),
boolToString(mGrpcReadChannelOpen).c_str(),
clientIdToTaskCountToStringLocked().c_str());
}