Add vehicle HAL mocking with carsystem and carsystemtest API
- System API and system test API for testing only added. Client
should link only one of them.
- vehicle HAL mocking allows mocking vehicle HAL completely.
- Once mocking is started, for now, all previous states are forgotton,
so stopping mocking does not return to original state. It is
better to simply restart framework after test.
- Added skeleton code for audio focus handling. Detailed implementaiton
will be added later.
bug: 24874617
Change-Id: I6e60daab3dc96769a94acc09a695f8f49dbb8536
(cherry picked from commit a32e24f50d5895a94d3a13d6ec2233af6e43dac5)
diff --git a/libvehiclenetwork/native/IVehicleNetwork.cpp b/libvehiclenetwork/native/IVehicleNetwork.cpp
index a3b17a5..388715d 100644
--- a/libvehiclenetwork/native/IVehicleNetwork.cpp
+++ b/libvehiclenetwork/native/IVehicleNetwork.cpp
@@ -37,6 +37,9 @@
GET_PROPERTY,
SUBSCRIBE,
UNSUBSCRIBE,
+ INJECT_EVENT,
+ START_MOCKING,
+ STOP_MOCKING,
};
// ----------------------------------------------------------------------------
@@ -163,6 +166,41 @@
ALOGI("unsubscribing property %d failed %d", property, status);
}
}
+
+ virtual status_t injectEvent(const vehicle_prop_value_t& value) {
+ Parcel data, reply;
+ data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
+ data.writeInt32(1); // 0 means no value. For compatibility with aidl based code.
+ std::unique_ptr<VehiclePropValue> v(new VehiclePropValue());
+ ASSERT_OR_HANDLE_NO_MEMORY(v.get(), return NO_MEMORY);
+ VehicleNetworkProtoUtil::toVehiclePropValue(value, *v.get());
+ int size = v->ByteSize();
+ WritableBlobHolder blob(new Parcel::WritableBlob());
+ ASSERT_OR_HANDLE_NO_MEMORY(blob.blob, return NO_MEMORY);
+ data.writeInt32(size);
+ data.writeBlob(size, false, blob.blob);
+ v->SerializeToArray(blob.blob->data(), size);
+ status_t status = remote()->transact(INJECT_EVENT, data, &reply);
+ return status;
+ }
+
+ virtual status_t startMocking(const sp<IVehicleNetworkHalMock>& mock) {
+ Parcel data, reply;
+ data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
+ data.writeStrongBinder(IInterface::asBinder(mock));
+ status_t status = remote()->transact(START_MOCKING, data, &reply);
+ return status;
+ }
+
+ virtual void stopMocking(const sp<IVehicleNetworkHalMock>& mock) {
+ Parcel data, reply;
+ data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
+ data.writeStrongBinder(IInterface::asBinder(mock));
+ status_t status = remote()->transact(STOP_MOCKING, data, &reply);
+ if (status != NO_ERROR) {
+ ALOGI("stop mocking failed %d", status);
+ }
+ }
};
IMPLEMENT_META_INTERFACE(VehicleNetwork, IVehicleNetwork::SERVICE_NAME);
@@ -280,6 +318,51 @@
BinderUtil::fillNoResultReply(reply);
return NO_ERROR;
} break;
+ case INJECT_EVENT: {
+ CHECK_INTERFACE(IVehicleNetwork, data, reply);
+ if (data.readInt32() == 0) { // java side allows passing null with this.
+ return BAD_VALUE;
+ }
+ ScopedVehiclePropValue value;
+ ReadableBlobHolder blob(new Parcel::ReadableBlob());
+ ASSERT_OR_HANDLE_NO_MEMORY(blob.blob, return NO_MEMORY);
+ int32_t size = data.readInt32();
+ r = data.readBlob(size, blob.blob);
+ if (r != NO_ERROR) {
+ ALOGE("injectEvent:service, cannot read blob");
+ return r;
+ }
+ std::unique_ptr<VehiclePropValue> v(new VehiclePropValue());
+ ASSERT_OR_HANDLE_NO_MEMORY(v.get(), return NO_MEMORY);
+ if (!v->ParseFromArray(blob.blob->data(), size)) {
+ ALOGE("injectEvent:service, cannot parse data");
+ return BAD_VALUE;
+ }
+ r = VehicleNetworkProtoUtil::fromVehiclePropValue(*v.get(), value.value);
+ if (r != NO_ERROR) {
+ ALOGE("injectEvent:service, cannot convert data");
+ return BAD_VALUE;
+ }
+ r = injectEvent(value.value);
+ BinderUtil::fillNoResultReply(reply);
+ return r;
+ } break;
+ case START_MOCKING: {
+ CHECK_INTERFACE(IVehicleNetwork, data, reply);
+ sp<IVehicleNetworkHalMock> mock =
+ interface_cast<IVehicleNetworkHalMock>(data.readStrongBinder());
+ r = startMocking(mock);
+ BinderUtil::fillNoResultReply(reply);
+ return r;
+ } break;
+ case STOP_MOCKING: {
+ CHECK_INTERFACE(IVehicleNetwork, data, reply);
+ sp<IVehicleNetworkHalMock> mock =
+ interface_cast<IVehicleNetworkHalMock>(data.readStrongBinder());
+ stopMocking(mock);
+ BinderUtil::fillNoResultReply(reply);
+ return NO_ERROR;
+ } break;
default:
return BBinder::onTransact(code, data, reply, flags);
}