blob: 2d7cf1ef7916e14ede652dd8404640dbc4218a9b [file] [log] [blame]
Keun-young Park28dd4702015-11-19 18:06:04 -08001/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.car.vehiclenetwork.libtest;
17
18import android.os.HandlerThread;
19import android.test.AndroidTestCase;
Pavel Maltsev2906c442016-03-23 16:32:17 -070020import android.test.suitebuilder.annotation.MediumTest;
Keun-young Park28dd4702015-11-19 18:06:04 -080021import android.util.Log;
22
23import com.android.car.vehiclenetwork.VehicleNetwork;
Pavel Maltsevb0324b42016-09-27 21:00:41 -070024import com.android.car.vehiclenetwork.VehicleNetwork.SubscribeFlags;
Keun-young Park28dd4702015-11-19 18:06:04 -080025import com.android.car.vehiclenetwork.VehicleNetwork.VehicleNetworkHalMock;
26import com.android.car.vehiclenetwork.VehicleNetwork.VehicleNetworkListener;
27import com.android.car.vehiclenetwork.VehicleNetworkConsts;
28import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropAccess;
29import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropChangeMode;
30import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
Pavel Maltseve8f75372016-01-26 10:26:04 -080031import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleZone;
Keun-young Park28dd4702015-11-19 18:06:04 -080032import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
33import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfigs;
34import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
35import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValues;
36import com.android.car.vehiclenetwork.VehiclePropConfigUtil;
37import com.android.car.vehiclenetwork.VehiclePropValueUtil;
38
Pavel Maltseve8f75372016-01-26 10:26:04 -080039import java.util.Arrays;
Keun-young Park28dd4702015-11-19 18:06:04 -080040import java.util.HashMap;
41import java.util.LinkedList;
Pavel Maltseve8f75372016-01-26 10:26:04 -080042import java.util.Map;
Keun-young Park28dd4702015-11-19 18:06:04 -080043import java.util.concurrent.Semaphore;
44import java.util.concurrent.TimeUnit;
45
Pavel Maltsev2906c442016-03-23 16:32:17 -070046@MediumTest
Keun-young Park28dd4702015-11-19 18:06:04 -080047public class VehicleNetworkMockedTest extends AndroidTestCase {
48 private static final String TAG = VehicleNetworkMockedTest.class.getSimpleName();
49
50 private static final long TIMEOUT_MS = 1000;
51
52 private static final int CUSTOM_PROPERTY_INT32 =
53 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START;
Pavel Maltseve8f75372016-01-26 10:26:04 -080054 private static final int CUSTOM_PROPERTY_ZONED_INT32 =
55 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 1;
56 private static final int CUSTOM_PROPERTY_ZONED_INT32_VEC2 =
57 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 2;
58 private static final int CUSTOM_PROPERTY_ZONED_INT32_VEC3 =
59 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 3;
60 private static final int CUSTOM_PROPERTY_ZONED_FLOAT_VEC2 =
61 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 4;
62 private static final int CUSTOM_PROPERTY_ZONED_FLOAT_VEC3 =
63 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 5;
64 private static final int CUSTOM_PROPERTY_FLOAT_VEC2 =
65 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 6;
66 private static final int CUSTOM_PROPERTY_INT32_VEC2 =
67 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 7;
Keun-young Park28dd4702015-11-19 18:06:04 -080068
69 private final HandlerThread mHandlerThread = new HandlerThread(
70 VehicleNetworkTest.class.getSimpleName());
71 private VehicleNetwork mVehicleNetwork;
72 private EventListener mListener = new EventListener();
73 private final VehicleHalMock mVehicleHalMock = new VehicleHalMock();
74
75 @Override
76 protected void setUp() throws Exception {
77 super.setUp();
78 mHandlerThread.start();
79 mVehicleNetwork = VehicleNetwork.createVehicleNetwork(mListener,
80 mHandlerThread.getLooper());
81 mVehicleHalMock.registerProperty(
82 VehiclePropConfigUtil.createProperty(
83 CUSTOM_PROPERTY_INT32,
84 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
85 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
86 VehicleValueType.VEHICLE_VALUE_TYPE_INT32, 0x0),
87 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createIntValue(
88 CUSTOM_PROPERTY_INT32, 0, 0)));
Pavel Maltseve8f75372016-01-26 10:26:04 -080089 mVehicleHalMock.registerProperty(
90 VehiclePropConfigUtil.createProperty(
91 CUSTOM_PROPERTY_ZONED_INT32,
92 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
93 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
94 VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32, 0x0),
95 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedIntValue(
96 CUSTOM_PROPERTY_ZONED_INT32, VehicleZone.VEHICLE_ZONE_ROW_2_LEFT, 0, 0)));
97 mVehicleHalMock.registerProperty(
98 VehiclePropConfigUtil.createProperty(
99 CUSTOM_PROPERTY_ZONED_INT32_VEC2,
100 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
101 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
102 VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2, 0x0),
103 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedIntVectorValue(
104 CUSTOM_PROPERTY_ZONED_INT32_VEC2,
105 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
106 new int[2], 0)));
107 mVehicleHalMock.registerProperty(
108 VehiclePropConfigUtil.createProperty(
109 CUSTOM_PROPERTY_INT32_VEC2,
110 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
111 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
112 VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2, 0x0),
113 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createIntVectorValue(
114 CUSTOM_PROPERTY_INT32_VEC2, new int[2], 0)));
115 mVehicleHalMock.registerProperty(
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800116 VehiclePropConfigUtil.createZonedProperty(
Pavel Maltseve8f75372016-01-26 10:26:04 -0800117 CUSTOM_PROPERTY_ZONED_INT32_VEC3,
118 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
119 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800120 VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3,
121 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
122 0x0),
Pavel Maltseve8f75372016-01-26 10:26:04 -0800123 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedIntVectorValue(
124 CUSTOM_PROPERTY_ZONED_INT32_VEC3,
125 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
126 new int[3], 0)));
127 mVehicleHalMock.registerProperty(
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800128 VehiclePropConfigUtil.createZonedProperty(
Pavel Maltseve8f75372016-01-26 10:26:04 -0800129 CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
130 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
131 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800132 VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2,
133 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
134 0x0),
Pavel Maltseve8f75372016-01-26 10:26:04 -0800135 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedFloatVectorValue(
136 CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
137 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
138 new float[2], 0)));
139 mVehicleHalMock.registerProperty(
140 VehiclePropConfigUtil.createProperty(
141 CUSTOM_PROPERTY_FLOAT_VEC2,
142 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
143 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
144 VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC2, 0x0),
145 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createFloatVectorValue(
146 CUSTOM_PROPERTY_FLOAT_VEC2, new float[2], 0)));
147 mVehicleHalMock.registerProperty(
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800148 VehiclePropConfigUtil.createZonedProperty(
Pavel Maltseve8f75372016-01-26 10:26:04 -0800149 CUSTOM_PROPERTY_ZONED_FLOAT_VEC3,
150 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
151 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800152 VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3,
153 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
154 0x0),
Pavel Maltseve8f75372016-01-26 10:26:04 -0800155 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedFloatVectorValue(
156 CUSTOM_PROPERTY_ZONED_FLOAT_VEC3,
157 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
158 new float[3], 0)));
Keun-young Park28dd4702015-11-19 18:06:04 -0800159 }
160
161 @Override
162 protected void tearDown() throws Exception {
163 super.tearDown();
164 mHandlerThread.quit();
165 mVehicleNetwork.stopMocking();
166 }
167
168 public void testHalRestartListening() throws Exception {
169 mVehicleNetwork.startHalRestartMonitoring();
170 mVehicleNetwork.startMocking(mVehicleHalMock);
171 assertTrue(mListener.waitForHalRestartAndAssert(TIMEOUT_MS, true /*expectedInMocking*/));
172 mVehicleNetwork.stopMocking();
173 assertTrue(mListener.waitForHalRestartAndAssert(TIMEOUT_MS, false /*expectedInMocking*/));
174 mVehicleNetwork.stopHalRestartMonitoring();
175 }
176
Pavel Maltseve8f75372016-01-26 10:26:04 -0800177 public void testCustomZonedIntProperties() {
178 final int INT_VALUE = 10;
179 final int INT_VALUE2 = 20;
180
181 mVehicleNetwork.startMocking(mVehicleHalMock);
182
183 mVehicleNetwork.setIntProperty(CUSTOM_PROPERTY_INT32, INT_VALUE);
184 assertEquals(INT_VALUE, mVehicleNetwork.getIntProperty(CUSTOM_PROPERTY_INT32));
185
186 mVehicleNetwork.setZonedIntProperty(CUSTOM_PROPERTY_ZONED_INT32,
187 VehicleZone.VEHICLE_ZONE_ROW_2_LEFT, INT_VALUE);
188 mVehicleNetwork.setZonedIntProperty(CUSTOM_PROPERTY_ZONED_INT32,
189 VehicleZone.VEHICLE_ZONE_ROW_2_RIGHT, INT_VALUE2);
190
191 assertEquals(INT_VALUE,
192 mVehicleNetwork.getZonedIntProperty(CUSTOM_PROPERTY_ZONED_INT32,
193 VehicleZone.VEHICLE_ZONE_ROW_2_LEFT));
194 assertEquals(INT_VALUE2,
195 mVehicleNetwork.getZonedIntProperty(CUSTOM_PROPERTY_ZONED_INT32,
196 VehicleZone.VEHICLE_ZONE_ROW_2_RIGHT));
197 assertEquals(INT_VALUE,
198 mVehicleNetwork.getZonedIntProperty(CUSTOM_PROPERTY_ZONED_INT32,
199 VehicleZone.VEHICLE_ZONE_ROW_2_LEFT));
200 }
201
202 public void testCustomZonedIntVecProperties() {
203 final int[] ZONED_INT_VALUE_LEFT = new int[] {30, 40};
204 final int[] ZONED_INT_VALUE_RIGHT = new int[] {50, 60};
205 final int[] ZONED_INT_VALUE_VEC3 = new int[] {30, 40, 50};
206
207 mVehicleNetwork.startMocking(mVehicleHalMock);
208
209 int[] actualValue = mVehicleNetwork.getZonedIntVectorProperty(
210 CUSTOM_PROPERTY_ZONED_INT32_VEC2,
211 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
212 // Verify the default values before calling setProperty.
213 assertArrayEquals(new int[2], actualValue);
214 mVehicleNetwork.setZonedIntVectorProperty(CUSTOM_PROPERTY_ZONED_INT32_VEC2,
215 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
216 ZONED_INT_VALUE_LEFT);
217 actualValue = mVehicleNetwork.getZonedIntVectorProperty(
218 CUSTOM_PROPERTY_ZONED_INT32_VEC2,
219 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
220 assertArrayEquals(ZONED_INT_VALUE_LEFT, actualValue);
221
222 // Verify different zone for the same property
223 mVehicleNetwork.setZonedIntVectorProperty(CUSTOM_PROPERTY_ZONED_INT32_VEC2,
224 VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT,
225 ZONED_INT_VALUE_RIGHT);
226 actualValue = mVehicleNetwork.getZonedIntVectorProperty(
227 CUSTOM_PROPERTY_ZONED_INT32_VEC2,
228 VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT);
229 assertArrayEquals(ZONED_INT_VALUE_RIGHT, actualValue);
230
231 mVehicleNetwork.setZonedIntVectorProperty(CUSTOM_PROPERTY_ZONED_INT32_VEC3,
232 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
233 ZONED_INT_VALUE_VEC3);
234 actualValue = mVehicleNetwork.getZonedIntVectorProperty(
235 CUSTOM_PROPERTY_ZONED_INT32_VEC3,
236 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
237 assertArrayEquals(ZONED_INT_VALUE_VEC3, actualValue);
238 }
239
240 public void testCustomZonedFloatVecProperties() {
241 final float[] ZONED_FLOAT_VALUE_LEFT = new float[] {30.1f, 40.3f};
242 final float[] ZONED_FLOAT_VALUE_RIGHT = new float[] {50.5f, 60};
243 final float[] ZONED_FLOAT_VALUE_VEC3 = new float[] {30, 40.3f, 50};
244
245 mVehicleNetwork.startMocking(mVehicleHalMock);
246
247 float[] actualValue = mVehicleNetwork.getZonedFloatVectorProperty(
248 CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
249 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
250 // Verify the default values before calling setProperty.
251 assertArrayEquals(new float[2], actualValue);
252 mVehicleNetwork.setZonedFloatVectorProperty(CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
253 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
254 ZONED_FLOAT_VALUE_LEFT);
255 actualValue = mVehicleNetwork.getZonedFloatVectorProperty(
256 CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
257 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
258 assertArrayEquals(ZONED_FLOAT_VALUE_LEFT, actualValue);
259
260 // Verify different zone for the same property
261 mVehicleNetwork.setZonedFloatVectorProperty(CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
262 VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT,
263 ZONED_FLOAT_VALUE_RIGHT);
264 actualValue = mVehicleNetwork.getZonedFloatVectorProperty(
265 CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
266 VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT);
267 assertArrayEquals(ZONED_FLOAT_VALUE_RIGHT, actualValue);
268
269 mVehicleNetwork.setZonedFloatVectorProperty(CUSTOM_PROPERTY_ZONED_FLOAT_VEC3,
270 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
271 ZONED_FLOAT_VALUE_VEC3);
272 actualValue = mVehicleNetwork.getZonedFloatVectorProperty(
273 CUSTOM_PROPERTY_ZONED_FLOAT_VEC3,
274 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
275 assertArrayEquals(ZONED_FLOAT_VALUE_VEC3, actualValue);
276 }
277
278 public void testCustomFloatVecProperties() {
279 final float[] FLOAT_VALUE = new float[] {30.1f, 40.3f};
280
281 mVehicleNetwork.startMocking(mVehicleHalMock);
282
283 float[] actualValue = mVehicleNetwork.getFloatVectorProperty(
284 CUSTOM_PROPERTY_FLOAT_VEC2);
285 // Verify the default values before calling setProperty.
286 assertArrayEquals(new float[2], actualValue);
287 mVehicleNetwork.setFloatVectorProperty(CUSTOM_PROPERTY_FLOAT_VEC2, FLOAT_VALUE);
288 actualValue = mVehicleNetwork.getFloatVectorProperty(
289 CUSTOM_PROPERTY_FLOAT_VEC2);
290 assertArrayEquals(FLOAT_VALUE, actualValue);
291 }
292
293 public void testCustomIntVecProperties() {
294 final int[] INT32_VALUE = new int[] {30, 40};
295
296 mVehicleNetwork.startMocking(mVehicleHalMock);
297
298 int[] actualValue = mVehicleNetwork.getIntVectorProperty(
299 CUSTOM_PROPERTY_INT32_VEC2);
300 // Verify the default values before calling setProperty.
301 assertArrayEquals(new int[2], actualValue);
302 mVehicleNetwork.setIntVectorProperty(CUSTOM_PROPERTY_INT32_VEC2, INT32_VALUE);
303 actualValue = mVehicleNetwork.getIntVectorProperty(
304 CUSTOM_PROPERTY_INT32_VEC2);
305 assertArrayEquals(INT32_VALUE, actualValue);
306 }
307
Keun-young Park28dd4702015-11-19 18:06:04 -0800308 public void testGlobalErrorListening() throws Exception {
309 mVehicleNetwork.startErrorListening();
310 mVehicleNetwork.startMocking(mVehicleHalMock);
311 final int ERROR_CODE = 0x1;
312 final int ERROR_OPERATION = 0x10;
313 mVehicleNetwork.injectHalError(ERROR_CODE, 0, ERROR_OPERATION);
314 assertTrue(mListener.waitForHalErrorAndAssert(TIMEOUT_MS, ERROR_CODE, 0, ERROR_OPERATION));
315 mVehicleNetwork.injectHalError(ERROR_CODE, CUSTOM_PROPERTY_INT32, ERROR_OPERATION);
316 assertTrue(mListener.waitForHalErrorAndAssert(TIMEOUT_MS,
317 ERROR_CODE, CUSTOM_PROPERTY_INT32, ERROR_OPERATION));
318 mVehicleNetwork.stopMocking();
319 mVehicleNetwork.stopErrorListening();
320 }
321
322 public void testPropertyErrorListening() throws Exception {
323 mVehicleNetwork.startMocking(mVehicleHalMock);
324 mVehicleNetwork.subscribe(CUSTOM_PROPERTY_INT32, 0);
325 final int ERROR_CODE = 0x1;
326 final int ERROR_OPERATION = 0x10;
327 mVehicleNetwork.injectHalError(ERROR_CODE, CUSTOM_PROPERTY_INT32, ERROR_OPERATION);
328 assertTrue(mListener.waitForHalErrorAndAssert(TIMEOUT_MS,
329 ERROR_CODE, CUSTOM_PROPERTY_INT32, ERROR_OPERATION));
330 mVehicleNetwork.unsubscribe(CUSTOM_PROPERTY_INT32);
331 mVehicleNetwork.stopMocking();
332 }
333
Pavel Maltseve8f75372016-01-26 10:26:04 -0800334 public void testSubscribe() throws Exception {
335 final int PROPERTY = CUSTOM_PROPERTY_ZONED_INT32_VEC3;
336 final int ZONE = VehicleZone.VEHICLE_ZONE_ROW_1_LEFT;
337 final int[] VALUES = new int[] {10, 20, 30};
338 mVehicleNetwork.startMocking(mVehicleHalMock);
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800339 mVehicleNetwork.subscribe(PROPERTY, 0, ZONE);
Pavel Maltseve8f75372016-01-26 10:26:04 -0800340 VehiclePropValue value = VehiclePropValueUtil.createZonedIntVectorValue(
341 PROPERTY, ZONE, VALUES, 0);
342 mVehicleNetwork.injectEvent(value);
343 assertTrue(mListener.waitForEvent(TIMEOUT_MS, value));
344 mVehicleNetwork.unsubscribe(PROPERTY);
345 }
346
Pavel Maltsevb0324b42016-09-27 21:00:41 -0700347 public void testSubscribe_OnPropertySet() throws Exception {
348 final int PROPERTY = CUSTOM_PROPERTY_ZONED_INT32_VEC3;
349 final int ZONE = VehicleZone.VEHICLE_ZONE_ROW_1_LEFT;
350 final int[] VALUES = new int[] {10, 20, 30};
351 mVehicleNetwork.startMocking(mVehicleHalMock);
352 mVehicleNetwork.subscribe(PROPERTY, 0, ZONE, SubscribeFlags.SET_CALL);
353
354 mVehicleNetwork.setZonedIntVectorProperty(PROPERTY, ZONE, VALUES);
355
356 VehiclePropValue expectedValue = VehiclePropValueUtil.createZonedIntVectorValue(
357 PROPERTY, ZONE, VALUES, 0);
358
359 assertTrue(mListener.waitForOnPropertySet(TIMEOUT_MS, expectedValue));
360
361 mVehicleNetwork.injectEvent(expectedValue);
362 // Not subscribed to HAL events. No notifications expected here.
363 assertFalse(mListener.waitForEvent(TIMEOUT_MS, expectedValue));
364
365 mVehicleNetwork.unsubscribe(PROPERTY);
366 }
367
368 public void testSubscribe_HalEventAndOnPropertySet() throws Exception {
369 final int PROPERTY = CUSTOM_PROPERTY_ZONED_INT32_VEC3;
370 final int ZONE = VehicleZone.VEHICLE_ZONE_ROW_1_LEFT;
371 final int[] VALUES = new int[] {10, 20, 30};
372 mVehicleNetwork.startMocking(mVehicleHalMock);
373 mVehicleNetwork.subscribe(PROPERTY, 0, ZONE,
374 SubscribeFlags.SET_CALL | SubscribeFlags.HAL_EVENT);
375
376 mVehicleNetwork.setZonedIntVectorProperty(PROPERTY, ZONE, VALUES);
377
378 VehiclePropValue expectedValue = VehiclePropValueUtil.createZonedIntVectorValue(
379 PROPERTY, ZONE, VALUES, 0);
380
381 assertTrue(mListener.waitForOnPropertySet(TIMEOUT_MS, expectedValue));
382
383 mVehicleNetwork.injectEvent(expectedValue);
384 assertTrue(mListener.waitForEvent(TIMEOUT_MS, expectedValue));
385
386 mVehicleNetwork.unsubscribe(PROPERTY);
387 }
388
Pavel Maltsev169b7a62016-01-26 15:56:07 -0800389 public void testGetPropertyFailsForCustom() {
390 try {
391 mVehicleNetwork.getProperty(CUSTOM_PROPERTY_INT32);
392 fail();
393 } catch (IllegalArgumentException expected) {
394 // Expected.
395 }
396 }
397
Pavel Maltseve8f75372016-01-26 10:26:04 -0800398 private void assertArrayEquals(int[] expected, int[] actual) {
399 assertEquals(Arrays.toString(expected), Arrays.toString(actual));
400 }
401
402 private void assertArrayEquals(float[] expected, float[] actual) {
403 assertEquals(Arrays.toString(expected), Arrays.toString(actual));
404 }
405
Keun-young Park28dd4702015-11-19 18:06:04 -0800406 private class EventListener implements VehicleNetworkListener {
407 boolean mInMocking;
Keun-young Park28dd4702015-11-19 18:06:04 -0800408 int mErrorCode;
409 int mErrorProperty;
410 int mErrorOperation;
Pavel Maltseve8f75372016-01-26 10:26:04 -0800411 VehiclePropValues mValuesReceived;
Pavel Maltsevb0324b42016-09-27 21:00:41 -0700412 VehiclePropValue mPropertySetValue;
Pavel Maltseve8f75372016-01-26 10:26:04 -0800413
414 private final Semaphore mRestartWait = new Semaphore(0);
Keun-young Park28dd4702015-11-19 18:06:04 -0800415 private final Semaphore mErrorWait = new Semaphore(0);
Pavel Maltseve8f75372016-01-26 10:26:04 -0800416 private final Semaphore mEventWait = new Semaphore(0);
Pavel Maltsevb0324b42016-09-27 21:00:41 -0700417 private final Semaphore mOnPropertySetWait = new Semaphore(0);
Keun-young Park28dd4702015-11-19 18:06:04 -0800418
419 @Override
420 public void onVehicleNetworkEvents(VehiclePropValues values) {
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800421 Log.i(TAG, "onVehicleNetworkEvents");
Pavel Maltseve8f75372016-01-26 10:26:04 -0800422 mValuesReceived = values;
423 mEventWait.release();
Keun-young Park28dd4702015-11-19 18:06:04 -0800424 }
425
426 @Override
427 public void onHalError(int errorCode, int property, int operation) {
428 mErrorCode = errorCode;
429 mErrorProperty = property;
430 mErrorOperation = operation;
431 mErrorWait.release();
432 }
433
434 public boolean waitForHalErrorAndAssert(long timeoutMs, int expectedErrorCode,
435 int expectedErrorProperty, int expectedErrorOperation) throws Exception {
436 if (!mErrorWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
437 return false;
438 }
439 assertEquals(expectedErrorCode, mErrorCode);
440 assertEquals(expectedErrorProperty, mErrorProperty);
441 assertEquals(expectedErrorOperation, mErrorOperation);
442 return true;
443 }
444
445 @Override
446 public void onHalRestart(boolean inMocking) {
447 mInMocking = inMocking;
448 mRestartWait.release();
449 }
450
Pavel Maltsevb0324b42016-09-27 21:00:41 -0700451 @Override
452 public void onPropertySet(VehiclePropValue value) {
453 mPropertySetValue = value;
454 mOnPropertySetWait.release();
455 }
456
Keun-young Park28dd4702015-11-19 18:06:04 -0800457 public boolean waitForHalRestartAndAssert(long timeoutMs, boolean expectedInMocking)
458 throws Exception {
459 if (!mRestartWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
460 return false;
461 }
462 assertEquals(expectedInMocking, mInMocking);
463 return true;
464 }
Pavel Maltseve8f75372016-01-26 10:26:04 -0800465
466 public boolean waitForEvent(long timeoutMs, VehiclePropValue expected)
467 throws InterruptedException {
468 if (!mEventWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
469 Log.w(TAG, "Timed out waiting for event.");
470 return false;
471 }
472 assertEquals(1, mValuesReceived.getValuesCount());
473 assertEquals(VehiclePropValueUtil.toString(expected),
474 VehiclePropValueUtil.toString(mValuesReceived.getValues(0)));
475 return true;
476 }
Pavel Maltsevb0324b42016-09-27 21:00:41 -0700477
478 public boolean waitForOnPropertySet(long timeoutMs, VehiclePropValue expected)
479 throws InterruptedException {
480 if (!mOnPropertySetWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
481 Log.w(TAG, "Timed out waiting for onPropertySet.");
482 return false;
483 }
484 assertEquals(VehiclePropValueUtil.toString(expected),
485 VehiclePropValueUtil.toString(mPropertySetValue));
486 return true;
487 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800488 }
489
490 private interface VehiclePropertyHandler {
491 void onPropertySet(VehiclePropValue value);
492 VehiclePropValue onPropertyGet(VehiclePropValue property);
Keun-young Park0727f952015-12-21 14:30:07 -0800493 void onPropertySubscribe(int property, float sampleRate, int zones);
Keun-young Park28dd4702015-11-19 18:06:04 -0800494 void onPropertyUnsubscribe(int property);
495 }
496
497 private class VehicleHalMock implements VehicleNetworkHalMock {
498 private LinkedList<VehiclePropConfig> mConfigs = new LinkedList<>();
499 private HashMap<Integer, VehiclePropertyHandler> mHandlers = new HashMap<>();
500
501 public synchronized void registerProperty(VehiclePropConfig config,
502 VehiclePropertyHandler handler) {
503 int property = config.getProp();
504 mConfigs.add(config);
505 mHandlers.put(property, handler);
506 }
507
508 @Override
509 public synchronized VehiclePropConfigs onListProperties() {
510 Log.i(TAG, "onListProperties, num properties:" + mConfigs.size());
511 VehiclePropConfigs configs =
512 VehiclePropConfigs.newBuilder().addAllConfigs(mConfigs).build();
513 return configs;
514 }
515
516 @Override
517 public void onPropertySet(VehiclePropValue value) {
518 int property = value.getProp();
519 VehiclePropertyHandler handler = getPropertyHandler(property);
520 if (handler == null) {
521 fail("onPropertySet for unknown property " + Integer.toHexString(property));
522 }
523 handler.onPropertySet(value);
524 }
525
526 @Override
527 public VehiclePropValue onPropertyGet(VehiclePropValue value) {
528 int property = value.getProp();
529 VehiclePropertyHandler handler = getPropertyHandler(property);
530 if (handler == null) {
531 fail("onPropertyGet for unknown property " + Integer.toHexString(property));
532 }
Pavel Maltseve8f75372016-01-26 10:26:04 -0800533 VehiclePropValue propValue = handler.onPropertyGet(value);
534 return propValue;
Keun-young Park28dd4702015-11-19 18:06:04 -0800535 }
536
537 @Override
Keun-young Park0727f952015-12-21 14:30:07 -0800538 public void onPropertySubscribe(int property, float sampleRate, int zones) {
Keun-young Park28dd4702015-11-19 18:06:04 -0800539 VehiclePropertyHandler handler = getPropertyHandler(property);
540 if (handler == null) {
541 fail("onPropertySubscribe for unknown property " + Integer.toHexString(property));
542 }
Keun-young Park0727f952015-12-21 14:30:07 -0800543 handler.onPropertySubscribe(property, sampleRate, zones);
Keun-young Park28dd4702015-11-19 18:06:04 -0800544 }
545
546 @Override
547 public void onPropertyUnsubscribe(int property) {
548 VehiclePropertyHandler handler = getPropertyHandler(property);
549 if (handler == null) {
550 fail("onPropertyUnsubscribe for unknown property " + Integer.toHexString(property));
551 }
552 handler.onPropertyUnsubscribe(property);
553 }
554
555 public synchronized VehiclePropertyHandler getPropertyHandler(int property) {
556 return mHandlers.get(property);
557 }
558 }
559
560 private class DefaultVehiclePropertyHandler implements VehiclePropertyHandler {
Pavel Maltseve8f75372016-01-26 10:26:04 -0800561 private Map<Integer, VehiclePropValue> mZoneValueMap = new HashMap<>();
Keun-young Park28dd4702015-11-19 18:06:04 -0800562
563 DefaultVehiclePropertyHandler(VehiclePropValue initialValue) {
Pavel Maltseve8f75372016-01-26 10:26:04 -0800564 setValue(initialValue);
Keun-young Park28dd4702015-11-19 18:06:04 -0800565 }
566
567 @Override
568 public void onPropertySet(VehiclePropValue value) {
Pavel Maltseve8f75372016-01-26 10:26:04 -0800569 setValue(value);
Keun-young Park28dd4702015-11-19 18:06:04 -0800570 }
571
572 @Override
573 public synchronized VehiclePropValue onPropertyGet(VehiclePropValue property) {
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800574 int zone = property.getZone();
Pavel Maltseve8f75372016-01-26 10:26:04 -0800575 VehiclePropValue value = mZoneValueMap.get(zone);
576 if (value == null) {
577 Log.w(TAG, "Property not found: " + property.getProp() + ", zone: " + zone);
578 }
579 return value;
Keun-young Park28dd4702015-11-19 18:06:04 -0800580 }
581
582 @Override
Keun-young Park0727f952015-12-21 14:30:07 -0800583 public void onPropertySubscribe(int property, float sampleRate, int zones) {
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800584 Log.i(TAG, "Property subscribed:0x" + Integer.toHexString(property) +
585 " zones:0x" + Integer.toHexString(zones));
Keun-young Park28dd4702015-11-19 18:06:04 -0800586 }
587
588 @Override
589 public void onPropertyUnsubscribe(int property) {
Keun-young Park28dd4702015-11-19 18:06:04 -0800590 }
Pavel Maltseve8f75372016-01-26 10:26:04 -0800591
592 private void setValue(VehiclePropValue value) {
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800593 mZoneValueMap.put(value.getZone(), VehiclePropValue.newBuilder(value).build());
Pavel Maltseve8f75372016-01-26 10:26:04 -0800594 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800595 }
596}