blob: 956bc65575c3343db405c8bea75353e284866b14 [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;
20import android.util.Log;
21
22import com.android.car.vehiclenetwork.VehicleNetwork;
23import com.android.car.vehiclenetwork.VehicleNetwork.VehicleNetworkHalMock;
24import com.android.car.vehiclenetwork.VehicleNetwork.VehicleNetworkListener;
25import com.android.car.vehiclenetwork.VehicleNetworkConsts;
26import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropAccess;
27import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropChangeMode;
28import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
Pavel Maltseve8f75372016-01-26 10:26:04 -080029import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleZone;
Keun-young Park28dd4702015-11-19 18:06:04 -080030import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
31import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfigs;
32import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
33import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValues;
Pavel Maltseve8f75372016-01-26 10:26:04 -080034import com.android.car.vehiclenetwork.VehicleNetworkProto.ZonedValue;
Keun-young Park28dd4702015-11-19 18:06:04 -080035import com.android.car.vehiclenetwork.VehiclePropConfigUtil;
36import com.android.car.vehiclenetwork.VehiclePropValueUtil;
37
Pavel Maltseve8f75372016-01-26 10:26:04 -080038import java.util.Arrays;
Keun-young Park28dd4702015-11-19 18:06:04 -080039import java.util.HashMap;
40import java.util.LinkedList;
Pavel Maltseve8f75372016-01-26 10:26:04 -080041import java.util.Map;
Keun-young Park28dd4702015-11-19 18:06:04 -080042import java.util.concurrent.Semaphore;
43import java.util.concurrent.TimeUnit;
44
45public class VehicleNetworkMockedTest extends AndroidTestCase {
46 private static final String TAG = VehicleNetworkMockedTest.class.getSimpleName();
47
48 private static final long TIMEOUT_MS = 1000;
49
50 private static final int CUSTOM_PROPERTY_INT32 =
51 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START;
Pavel Maltseve8f75372016-01-26 10:26:04 -080052 private static final int CUSTOM_PROPERTY_ZONED_INT32 =
53 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 1;
54 private static final int CUSTOM_PROPERTY_ZONED_INT32_VEC2 =
55 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 2;
56 private static final int CUSTOM_PROPERTY_ZONED_INT32_VEC3 =
57 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 3;
58 private static final int CUSTOM_PROPERTY_ZONED_FLOAT_VEC2 =
59 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 4;
60 private static final int CUSTOM_PROPERTY_ZONED_FLOAT_VEC3 =
61 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 5;
62 private static final int CUSTOM_PROPERTY_FLOAT_VEC2 =
63 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 6;
64 private static final int CUSTOM_PROPERTY_INT32_VEC2 =
65 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 7;
Keun-young Park28dd4702015-11-19 18:06:04 -080066
67 private final HandlerThread mHandlerThread = new HandlerThread(
68 VehicleNetworkTest.class.getSimpleName());
69 private VehicleNetwork mVehicleNetwork;
70 private EventListener mListener = new EventListener();
71 private final VehicleHalMock mVehicleHalMock = new VehicleHalMock();
72
73 @Override
74 protected void setUp() throws Exception {
75 super.setUp();
76 mHandlerThread.start();
77 mVehicleNetwork = VehicleNetwork.createVehicleNetwork(mListener,
78 mHandlerThread.getLooper());
79 mVehicleHalMock.registerProperty(
80 VehiclePropConfigUtil.createProperty(
81 CUSTOM_PROPERTY_INT32,
82 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
83 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
84 VehicleValueType.VEHICLE_VALUE_TYPE_INT32, 0x0),
85 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createIntValue(
86 CUSTOM_PROPERTY_INT32, 0, 0)));
Pavel Maltseve8f75372016-01-26 10:26:04 -080087 mVehicleHalMock.registerProperty(
88 VehiclePropConfigUtil.createProperty(
89 CUSTOM_PROPERTY_ZONED_INT32,
90 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
91 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
92 VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32, 0x0),
93 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedIntValue(
94 CUSTOM_PROPERTY_ZONED_INT32, VehicleZone.VEHICLE_ZONE_ROW_2_LEFT, 0, 0)));
95 mVehicleHalMock.registerProperty(
96 VehiclePropConfigUtil.createProperty(
97 CUSTOM_PROPERTY_ZONED_INT32_VEC2,
98 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
99 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
100 VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2, 0x0),
101 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedIntVectorValue(
102 CUSTOM_PROPERTY_ZONED_INT32_VEC2,
103 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
104 new int[2], 0)));
105 mVehicleHalMock.registerProperty(
106 VehiclePropConfigUtil.createProperty(
107 CUSTOM_PROPERTY_INT32_VEC2,
108 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
109 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
110 VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2, 0x0),
111 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createIntVectorValue(
112 CUSTOM_PROPERTY_INT32_VEC2, new int[2], 0)));
113 mVehicleHalMock.registerProperty(
114 VehiclePropConfigUtil.createProperty(
115 CUSTOM_PROPERTY_ZONED_INT32_VEC3,
116 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
117 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
118 VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3, 0x0),
119 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedIntVectorValue(
120 CUSTOM_PROPERTY_ZONED_INT32_VEC3,
121 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
122 new int[3], 0)));
123 mVehicleHalMock.registerProperty(
124 VehiclePropConfigUtil.createProperty(
125 CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
126 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
127 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
128 VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2, 0x0),
129 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedFloatVectorValue(
130 CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
131 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
132 new float[2], 0)));
133 mVehicleHalMock.registerProperty(
134 VehiclePropConfigUtil.createProperty(
135 CUSTOM_PROPERTY_FLOAT_VEC2,
136 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
137 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
138 VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC2, 0x0),
139 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createFloatVectorValue(
140 CUSTOM_PROPERTY_FLOAT_VEC2, new float[2], 0)));
141 mVehicleHalMock.registerProperty(
142 VehiclePropConfigUtil.createProperty(
143 CUSTOM_PROPERTY_ZONED_FLOAT_VEC3,
144 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
145 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
146 VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3, 0x0),
147 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedFloatVectorValue(
148 CUSTOM_PROPERTY_ZONED_FLOAT_VEC3,
149 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
150 new float[3], 0)));
Keun-young Park28dd4702015-11-19 18:06:04 -0800151 }
152
153 @Override
154 protected void tearDown() throws Exception {
155 super.tearDown();
156 mHandlerThread.quit();
157 mVehicleNetwork.stopMocking();
158 }
159
160 public void testHalRestartListening() throws Exception {
161 mVehicleNetwork.startHalRestartMonitoring();
162 mVehicleNetwork.startMocking(mVehicleHalMock);
163 assertTrue(mListener.waitForHalRestartAndAssert(TIMEOUT_MS, true /*expectedInMocking*/));
164 mVehicleNetwork.stopMocking();
165 assertTrue(mListener.waitForHalRestartAndAssert(TIMEOUT_MS, false /*expectedInMocking*/));
166 mVehicleNetwork.stopHalRestartMonitoring();
167 }
168
Pavel Maltseve8f75372016-01-26 10:26:04 -0800169 public void testCustomZonedIntProperties() {
170 final int INT_VALUE = 10;
171 final int INT_VALUE2 = 20;
172
173 mVehicleNetwork.startMocking(mVehicleHalMock);
174
175 mVehicleNetwork.setIntProperty(CUSTOM_PROPERTY_INT32, INT_VALUE);
176 assertEquals(INT_VALUE, mVehicleNetwork.getIntProperty(CUSTOM_PROPERTY_INT32));
177
178 mVehicleNetwork.setZonedIntProperty(CUSTOM_PROPERTY_ZONED_INT32,
179 VehicleZone.VEHICLE_ZONE_ROW_2_LEFT, INT_VALUE);
180 mVehicleNetwork.setZonedIntProperty(CUSTOM_PROPERTY_ZONED_INT32,
181 VehicleZone.VEHICLE_ZONE_ROW_2_RIGHT, INT_VALUE2);
182
183 assertEquals(INT_VALUE,
184 mVehicleNetwork.getZonedIntProperty(CUSTOM_PROPERTY_ZONED_INT32,
185 VehicleZone.VEHICLE_ZONE_ROW_2_LEFT));
186 assertEquals(INT_VALUE2,
187 mVehicleNetwork.getZonedIntProperty(CUSTOM_PROPERTY_ZONED_INT32,
188 VehicleZone.VEHICLE_ZONE_ROW_2_RIGHT));
189 assertEquals(INT_VALUE,
190 mVehicleNetwork.getZonedIntProperty(CUSTOM_PROPERTY_ZONED_INT32,
191 VehicleZone.VEHICLE_ZONE_ROW_2_LEFT));
192 }
193
194 public void testCustomZonedIntVecProperties() {
195 final int[] ZONED_INT_VALUE_LEFT = new int[] {30, 40};
196 final int[] ZONED_INT_VALUE_RIGHT = new int[] {50, 60};
197 final int[] ZONED_INT_VALUE_VEC3 = new int[] {30, 40, 50};
198
199 mVehicleNetwork.startMocking(mVehicleHalMock);
200
201 int[] actualValue = mVehicleNetwork.getZonedIntVectorProperty(
202 CUSTOM_PROPERTY_ZONED_INT32_VEC2,
203 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
204 // Verify the default values before calling setProperty.
205 assertArrayEquals(new int[2], actualValue);
206 mVehicleNetwork.setZonedIntVectorProperty(CUSTOM_PROPERTY_ZONED_INT32_VEC2,
207 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
208 ZONED_INT_VALUE_LEFT);
209 actualValue = mVehicleNetwork.getZonedIntVectorProperty(
210 CUSTOM_PROPERTY_ZONED_INT32_VEC2,
211 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
212 assertArrayEquals(ZONED_INT_VALUE_LEFT, actualValue);
213
214 // Verify different zone for the same property
215 mVehicleNetwork.setZonedIntVectorProperty(CUSTOM_PROPERTY_ZONED_INT32_VEC2,
216 VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT,
217 ZONED_INT_VALUE_RIGHT);
218 actualValue = mVehicleNetwork.getZonedIntVectorProperty(
219 CUSTOM_PROPERTY_ZONED_INT32_VEC2,
220 VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT);
221 assertArrayEquals(ZONED_INT_VALUE_RIGHT, actualValue);
222
223 mVehicleNetwork.setZonedIntVectorProperty(CUSTOM_PROPERTY_ZONED_INT32_VEC3,
224 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
225 ZONED_INT_VALUE_VEC3);
226 actualValue = mVehicleNetwork.getZonedIntVectorProperty(
227 CUSTOM_PROPERTY_ZONED_INT32_VEC3,
228 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
229 assertArrayEquals(ZONED_INT_VALUE_VEC3, actualValue);
230 }
231
232 public void testCustomZonedFloatVecProperties() {
233 final float[] ZONED_FLOAT_VALUE_LEFT = new float[] {30.1f, 40.3f};
234 final float[] ZONED_FLOAT_VALUE_RIGHT = new float[] {50.5f, 60};
235 final float[] ZONED_FLOAT_VALUE_VEC3 = new float[] {30, 40.3f, 50};
236
237 mVehicleNetwork.startMocking(mVehicleHalMock);
238
239 float[] actualValue = mVehicleNetwork.getZonedFloatVectorProperty(
240 CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
241 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
242 // Verify the default values before calling setProperty.
243 assertArrayEquals(new float[2], actualValue);
244 mVehicleNetwork.setZonedFloatVectorProperty(CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
245 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
246 ZONED_FLOAT_VALUE_LEFT);
247 actualValue = mVehicleNetwork.getZonedFloatVectorProperty(
248 CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
249 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
250 assertArrayEquals(ZONED_FLOAT_VALUE_LEFT, actualValue);
251
252 // Verify different zone for the same property
253 mVehicleNetwork.setZonedFloatVectorProperty(CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
254 VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT,
255 ZONED_FLOAT_VALUE_RIGHT);
256 actualValue = mVehicleNetwork.getZonedFloatVectorProperty(
257 CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
258 VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT);
259 assertArrayEquals(ZONED_FLOAT_VALUE_RIGHT, actualValue);
260
261 mVehicleNetwork.setZonedFloatVectorProperty(CUSTOM_PROPERTY_ZONED_FLOAT_VEC3,
262 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
263 ZONED_FLOAT_VALUE_VEC3);
264 actualValue = mVehicleNetwork.getZonedFloatVectorProperty(
265 CUSTOM_PROPERTY_ZONED_FLOAT_VEC3,
266 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
267 assertArrayEquals(ZONED_FLOAT_VALUE_VEC3, actualValue);
268 }
269
270 public void testCustomFloatVecProperties() {
271 final float[] FLOAT_VALUE = new float[] {30.1f, 40.3f};
272
273 mVehicleNetwork.startMocking(mVehicleHalMock);
274
275 float[] actualValue = mVehicleNetwork.getFloatVectorProperty(
276 CUSTOM_PROPERTY_FLOAT_VEC2);
277 // Verify the default values before calling setProperty.
278 assertArrayEquals(new float[2], actualValue);
279 mVehicleNetwork.setFloatVectorProperty(CUSTOM_PROPERTY_FLOAT_VEC2, FLOAT_VALUE);
280 actualValue = mVehicleNetwork.getFloatVectorProperty(
281 CUSTOM_PROPERTY_FLOAT_VEC2);
282 assertArrayEquals(FLOAT_VALUE, actualValue);
283 }
284
285 public void testCustomIntVecProperties() {
286 final int[] INT32_VALUE = new int[] {30, 40};
287
288 mVehicleNetwork.startMocking(mVehicleHalMock);
289
290 int[] actualValue = mVehicleNetwork.getIntVectorProperty(
291 CUSTOM_PROPERTY_INT32_VEC2);
292 // Verify the default values before calling setProperty.
293 assertArrayEquals(new int[2], actualValue);
294 mVehicleNetwork.setIntVectorProperty(CUSTOM_PROPERTY_INT32_VEC2, INT32_VALUE);
295 actualValue = mVehicleNetwork.getIntVectorProperty(
296 CUSTOM_PROPERTY_INT32_VEC2);
297 assertArrayEquals(INT32_VALUE, actualValue);
298 }
299
Keun-young Park28dd4702015-11-19 18:06:04 -0800300 public void testGlobalErrorListening() throws Exception {
301 mVehicleNetwork.startErrorListening();
302 mVehicleNetwork.startMocking(mVehicleHalMock);
303 final int ERROR_CODE = 0x1;
304 final int ERROR_OPERATION = 0x10;
305 mVehicleNetwork.injectHalError(ERROR_CODE, 0, ERROR_OPERATION);
306 assertTrue(mListener.waitForHalErrorAndAssert(TIMEOUT_MS, ERROR_CODE, 0, ERROR_OPERATION));
307 mVehicleNetwork.injectHalError(ERROR_CODE, CUSTOM_PROPERTY_INT32, ERROR_OPERATION);
308 assertTrue(mListener.waitForHalErrorAndAssert(TIMEOUT_MS,
309 ERROR_CODE, CUSTOM_PROPERTY_INT32, ERROR_OPERATION));
310 mVehicleNetwork.stopMocking();
311 mVehicleNetwork.stopErrorListening();
312 }
313
314 public void testPropertyErrorListening() throws Exception {
315 mVehicleNetwork.startMocking(mVehicleHalMock);
316 mVehicleNetwork.subscribe(CUSTOM_PROPERTY_INT32, 0);
317 final int ERROR_CODE = 0x1;
318 final int ERROR_OPERATION = 0x10;
319 mVehicleNetwork.injectHalError(ERROR_CODE, CUSTOM_PROPERTY_INT32, ERROR_OPERATION);
320 assertTrue(mListener.waitForHalErrorAndAssert(TIMEOUT_MS,
321 ERROR_CODE, CUSTOM_PROPERTY_INT32, ERROR_OPERATION));
322 mVehicleNetwork.unsubscribe(CUSTOM_PROPERTY_INT32);
323 mVehicleNetwork.stopMocking();
324 }
325
Pavel Maltseve8f75372016-01-26 10:26:04 -0800326 public void testSubscribe() throws Exception {
327 final int PROPERTY = CUSTOM_PROPERTY_ZONED_INT32_VEC3;
328 final int ZONE = VehicleZone.VEHICLE_ZONE_ROW_1_LEFT;
329 final int[] VALUES = new int[] {10, 20, 30};
330 mVehicleNetwork.startMocking(mVehicleHalMock);
331 mVehicleNetwork.subscribe(PROPERTY, ZONE);
332 VehiclePropValue value = VehiclePropValueUtil.createZonedIntVectorValue(
333 PROPERTY, ZONE, VALUES, 0);
334 mVehicleNetwork.injectEvent(value);
335 assertTrue(mListener.waitForEvent(TIMEOUT_MS, value));
336 mVehicleNetwork.unsubscribe(PROPERTY);
337 }
338
339 private void assertArrayEquals(int[] expected, int[] actual) {
340 assertEquals(Arrays.toString(expected), Arrays.toString(actual));
341 }
342
343 private void assertArrayEquals(float[] expected, float[] actual) {
344 assertEquals(Arrays.toString(expected), Arrays.toString(actual));
345 }
346
Keun-young Park28dd4702015-11-19 18:06:04 -0800347 private class EventListener implements VehicleNetworkListener {
348 boolean mInMocking;
Keun-young Park28dd4702015-11-19 18:06:04 -0800349 int mErrorCode;
350 int mErrorProperty;
351 int mErrorOperation;
Pavel Maltseve8f75372016-01-26 10:26:04 -0800352 VehiclePropValues mValuesReceived;
353
354 private final Semaphore mRestartWait = new Semaphore(0);
Keun-young Park28dd4702015-11-19 18:06:04 -0800355 private final Semaphore mErrorWait = new Semaphore(0);
Pavel Maltseve8f75372016-01-26 10:26:04 -0800356 private final Semaphore mEventWait = new Semaphore(0);
Keun-young Park28dd4702015-11-19 18:06:04 -0800357
358 @Override
359 public void onVehicleNetworkEvents(VehiclePropValues values) {
Pavel Maltseve8f75372016-01-26 10:26:04 -0800360 mValuesReceived = values;
361 mEventWait.release();
Keun-young Park28dd4702015-11-19 18:06:04 -0800362 }
363
364 @Override
365 public void onHalError(int errorCode, int property, int operation) {
366 mErrorCode = errorCode;
367 mErrorProperty = property;
368 mErrorOperation = operation;
369 mErrorWait.release();
370 }
371
372 public boolean waitForHalErrorAndAssert(long timeoutMs, int expectedErrorCode,
373 int expectedErrorProperty, int expectedErrorOperation) throws Exception {
374 if (!mErrorWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
375 return false;
376 }
377 assertEquals(expectedErrorCode, mErrorCode);
378 assertEquals(expectedErrorProperty, mErrorProperty);
379 assertEquals(expectedErrorOperation, mErrorOperation);
380 return true;
381 }
382
383 @Override
384 public void onHalRestart(boolean inMocking) {
385 mInMocking = inMocking;
386 mRestartWait.release();
387 }
388
389 public boolean waitForHalRestartAndAssert(long timeoutMs, boolean expectedInMocking)
390 throws Exception {
391 if (!mRestartWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
392 return false;
393 }
394 assertEquals(expectedInMocking, mInMocking);
395 return true;
396 }
Pavel Maltseve8f75372016-01-26 10:26:04 -0800397
398 public boolean waitForEvent(long timeoutMs, VehiclePropValue expected)
399 throws InterruptedException {
400 if (!mEventWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
401 Log.w(TAG, "Timed out waiting for event.");
402 return false;
403 }
404 assertEquals(1, mValuesReceived.getValuesCount());
405 assertEquals(VehiclePropValueUtil.toString(expected),
406 VehiclePropValueUtil.toString(mValuesReceived.getValues(0)));
407 return true;
408 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800409 }
410
411 private interface VehiclePropertyHandler {
412 void onPropertySet(VehiclePropValue value);
413 VehiclePropValue onPropertyGet(VehiclePropValue property);
Keun-young Park0727f952015-12-21 14:30:07 -0800414 void onPropertySubscribe(int property, float sampleRate, int zones);
Keun-young Park28dd4702015-11-19 18:06:04 -0800415 void onPropertyUnsubscribe(int property);
416 }
417
418 private class VehicleHalMock implements VehicleNetworkHalMock {
419 private LinkedList<VehiclePropConfig> mConfigs = new LinkedList<>();
420 private HashMap<Integer, VehiclePropertyHandler> mHandlers = new HashMap<>();
421
422 public synchronized void registerProperty(VehiclePropConfig config,
423 VehiclePropertyHandler handler) {
424 int property = config.getProp();
425 mConfigs.add(config);
426 mHandlers.put(property, handler);
427 }
428
429 @Override
430 public synchronized VehiclePropConfigs onListProperties() {
431 Log.i(TAG, "onListProperties, num properties:" + mConfigs.size());
432 VehiclePropConfigs configs =
433 VehiclePropConfigs.newBuilder().addAllConfigs(mConfigs).build();
434 return configs;
435 }
436
437 @Override
438 public void onPropertySet(VehiclePropValue value) {
439 int property = value.getProp();
440 VehiclePropertyHandler handler = getPropertyHandler(property);
441 if (handler == null) {
442 fail("onPropertySet for unknown property " + Integer.toHexString(property));
443 }
444 handler.onPropertySet(value);
445 }
446
447 @Override
448 public VehiclePropValue onPropertyGet(VehiclePropValue value) {
449 int property = value.getProp();
450 VehiclePropertyHandler handler = getPropertyHandler(property);
451 if (handler == null) {
452 fail("onPropertyGet for unknown property " + Integer.toHexString(property));
453 }
Pavel Maltseve8f75372016-01-26 10:26:04 -0800454 VehiclePropValue propValue = handler.onPropertyGet(value);
455 return propValue;
Keun-young Park28dd4702015-11-19 18:06:04 -0800456 }
457
458 @Override
Keun-young Park0727f952015-12-21 14:30:07 -0800459 public void onPropertySubscribe(int property, float sampleRate, int zones) {
Keun-young Park28dd4702015-11-19 18:06:04 -0800460 VehiclePropertyHandler handler = getPropertyHandler(property);
461 if (handler == null) {
462 fail("onPropertySubscribe for unknown property " + Integer.toHexString(property));
463 }
Keun-young Park0727f952015-12-21 14:30:07 -0800464 handler.onPropertySubscribe(property, sampleRate, zones);
Keun-young Park28dd4702015-11-19 18:06:04 -0800465 }
466
467 @Override
468 public void onPropertyUnsubscribe(int property) {
469 VehiclePropertyHandler handler = getPropertyHandler(property);
470 if (handler == null) {
471 fail("onPropertyUnsubscribe for unknown property " + Integer.toHexString(property));
472 }
473 handler.onPropertyUnsubscribe(property);
474 }
475
476 public synchronized VehiclePropertyHandler getPropertyHandler(int property) {
477 return mHandlers.get(property);
478 }
479 }
480
481 private class DefaultVehiclePropertyHandler implements VehiclePropertyHandler {
Pavel Maltseve8f75372016-01-26 10:26:04 -0800482 private Map<Integer, VehiclePropValue> mZoneValueMap = new HashMap<>();
Keun-young Park28dd4702015-11-19 18:06:04 -0800483
484 DefaultVehiclePropertyHandler(VehiclePropValue initialValue) {
Pavel Maltseve8f75372016-01-26 10:26:04 -0800485 setValue(initialValue);
Keun-young Park28dd4702015-11-19 18:06:04 -0800486 }
487
488 @Override
489 public void onPropertySet(VehiclePropValue value) {
Pavel Maltseve8f75372016-01-26 10:26:04 -0800490 setValue(value);
Keun-young Park28dd4702015-11-19 18:06:04 -0800491 }
492
493 @Override
494 public synchronized VehiclePropValue onPropertyGet(VehiclePropValue property) {
Pavel Maltseve8f75372016-01-26 10:26:04 -0800495 int zone = getZoneOrDefault(property.getZonedValue());
496 VehiclePropValue value = mZoneValueMap.get(zone);
497 if (value == null) {
498 Log.w(TAG, "Property not found: " + property.getProp() + ", zone: " + zone);
499 }
500 return value;
Keun-young Park28dd4702015-11-19 18:06:04 -0800501 }
502
503 @Override
Keun-young Park0727f952015-12-21 14:30:07 -0800504 public void onPropertySubscribe(int property, float sampleRate, int zones) {
Keun-young Park28dd4702015-11-19 18:06:04 -0800505 // TODO Auto-generated method stub
506 }
507
508 @Override
509 public void onPropertyUnsubscribe(int property) {
510 // TODO Auto-generated method stub
511 }
Pavel Maltseve8f75372016-01-26 10:26:04 -0800512
513 private void setValue(VehiclePropValue value) {
514 mZoneValueMap.put(getZoneOrDefault(value.getZonedValue()), VehiclePropValue.newBuilder(value).build());
515 }
516
517 private int getZoneOrDefault(ZonedValue value) {
518 return value != null ? value.getZoneOrWindow() : 0;
519
520 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800521 }
522}