add error and hal restart monitoring with other cleanup
- add separate thread dispatch in native VehicleNetwork api.
- fix deadlock in binderDied: do not access HAL with lock held.
- fix missing sp in HandlerThread usage.
- add error listening and hal restart monitoring to binder callback.
- clarified mocking behavior:
clients listening for global error or HAL restart is not cleared by
mocking but client subscribing properties are all cleared and should
subscribe again.
- added native tests and Java tests to test mocking
bug: 24095928
(cherry picked from commit a116a2009ac8966b16cba1ab98d37ad8c537ab02)
Change-Id: I247c64dcb8722a678ed1c2e950a215a193a5e991
diff --git a/libvehiclenetwork/native/IVehicleNetwork.cpp b/libvehiclenetwork/native/IVehicleNetwork.cpp
index 61fa208..0ceb1a0 100644
--- a/libvehiclenetwork/native/IVehicleNetwork.cpp
+++ b/libvehiclenetwork/native/IVehicleNetwork.cpp
@@ -40,6 +40,11 @@
INJECT_EVENT,
START_MOCKING,
STOP_MOCKING,
+ INJECT_HAL_ERROR,
+ START_ERROR_LISTENING,
+ STOP_ERROR_LISTENING,
+ START_HAL_RESTART_MONITORING,
+ STOP_HAL_RESTART_MONITORING
};
// ----------------------------------------------------------------------------
@@ -184,6 +189,52 @@
ALOGI("stop mocking failed %d", status);
}
}
+
+ status_t injectHalError(int32_t errorCode, int32_t property, int32_t operation) {
+ Parcel data, reply;
+ data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
+ data.writeInt32(errorCode);
+ data.writeInt32(property);
+ data.writeInt32(operation);
+ status_t status = remote()->transact(INJECT_HAL_ERROR, data, &reply);
+ return status;
+ }
+
+ virtual status_t startErrorListening(const sp<IVehicleNetworkListener> &listener) {
+ Parcel data, reply;
+ data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
+ data.writeStrongBinder(IInterface::asBinder(listener));
+ status_t status = remote()->transact(START_ERROR_LISTENING, data, &reply);
+ return status;
+ }
+
+ virtual void stopErrorListening(const sp<IVehicleNetworkListener> &listener) {
+ Parcel data, reply;
+ data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
+ data.writeStrongBinder(IInterface::asBinder(listener));
+ status_t status = remote()->transact(STOP_ERROR_LISTENING, data, &reply);
+ if (status != NO_ERROR) {
+ ALOGI("stopErrorListening %d", status);
+ }
+ }
+
+ virtual status_t startHalRestartMonitoring(const sp<IVehicleNetworkListener> &listener) {
+ Parcel data, reply;
+ data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
+ data.writeStrongBinder(IInterface::asBinder(listener));
+ status_t status = remote()->transact(START_HAL_RESTART_MONITORING, data, &reply);
+ return status;
+ }
+
+ virtual void stopHalRestartMonitoring(const sp<IVehicleNetworkListener> &listener) {
+ Parcel data, reply;
+ data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
+ data.writeStrongBinder(IInterface::asBinder(listener));
+ status_t status = remote()->transact(STOP_HAL_RESTART_MONITORING, data, &reply);
+ if (status != NO_ERROR) {
+ ALOGI("stopHalRestartMonitoring %d", status);
+ }
+ }
};
IMPLEMENT_META_INTERFACE(VehicleNetwork, IVehicleNetwork::SERVICE_NAME);
@@ -326,6 +377,47 @@
BinderUtil::fillNoResultReply(reply);
return NO_ERROR;
} break;
+ case INJECT_HAL_ERROR: {
+ CHECK_INTERFACE(IVehicleNetwork, data, reply);
+ int32_t errorCode = data.readInt32();
+ int32_t property = data.readInt32();
+ int32_t operation = data.readInt32();
+ r = injectHalError(errorCode, property, operation);
+ BinderUtil::fillNoResultReply(reply);
+ return r;
+ } break;
+ case START_ERROR_LISTENING: {
+ CHECK_INTERFACE(IVehicleNetwork, data, reply);
+ sp<IVehicleNetworkListener> listener =
+ interface_cast<IVehicleNetworkListener>(data.readStrongBinder());
+ r = startErrorListening(listener);
+ BinderUtil::fillNoResultReply(reply);
+ return r;
+ } break;
+ case STOP_ERROR_LISTENING: {
+ CHECK_INTERFACE(IVehicleNetwork, data, reply);
+ sp<IVehicleNetworkListener> listener =
+ interface_cast<IVehicleNetworkListener>(data.readStrongBinder());
+ stopErrorListening(listener);
+ BinderUtil::fillNoResultReply(reply);
+ return NO_ERROR;
+ } break;
+ case START_HAL_RESTART_MONITORING: {
+ CHECK_INTERFACE(IVehicleNetwork, data, reply);
+ sp<IVehicleNetworkListener> listener =
+ interface_cast<IVehicleNetworkListener>(data.readStrongBinder());
+ r = startHalRestartMonitoring(listener);
+ BinderUtil::fillNoResultReply(reply);
+ return r;
+ } break;
+ case STOP_HAL_RESTART_MONITORING: {
+ CHECK_INTERFACE(IVehicleNetwork, data, reply);
+ sp<IVehicleNetworkListener> listener =
+ interface_cast<IVehicleNetworkListener>(data.readStrongBinder());
+ stopHalRestartMonitoring(listener);
+ BinderUtil::fillNoResultReply(reply);
+ return NO_ERROR;
+ } break;
default:
return BBinder::onTransact(code, data, reply, flags);
}