blob: 7b3c5e6a774110a353d00fe54082aae2e39e2def [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
Pavel Maltsev169b7a62016-01-26 15:56:07 -0800339 public void testGetPropertyFailsForCustom() {
340 try {
341 mVehicleNetwork.getProperty(CUSTOM_PROPERTY_INT32);
342 fail();
343 } catch (IllegalArgumentException expected) {
344 // Expected.
345 }
346 }
347
Pavel Maltseve8f75372016-01-26 10:26:04 -0800348 private void assertArrayEquals(int[] expected, int[] actual) {
349 assertEquals(Arrays.toString(expected), Arrays.toString(actual));
350 }
351
352 private void assertArrayEquals(float[] expected, float[] actual) {
353 assertEquals(Arrays.toString(expected), Arrays.toString(actual));
354 }
355
Keun-young Park28dd4702015-11-19 18:06:04 -0800356 private class EventListener implements VehicleNetworkListener {
357 boolean mInMocking;
Keun-young Park28dd4702015-11-19 18:06:04 -0800358 int mErrorCode;
359 int mErrorProperty;
360 int mErrorOperation;
Pavel Maltseve8f75372016-01-26 10:26:04 -0800361 VehiclePropValues mValuesReceived;
362
363 private final Semaphore mRestartWait = new Semaphore(0);
Keun-young Park28dd4702015-11-19 18:06:04 -0800364 private final Semaphore mErrorWait = new Semaphore(0);
Pavel Maltseve8f75372016-01-26 10:26:04 -0800365 private final Semaphore mEventWait = new Semaphore(0);
Keun-young Park28dd4702015-11-19 18:06:04 -0800366
367 @Override
368 public void onVehicleNetworkEvents(VehiclePropValues values) {
Pavel Maltseve8f75372016-01-26 10:26:04 -0800369 mValuesReceived = values;
370 mEventWait.release();
Keun-young Park28dd4702015-11-19 18:06:04 -0800371 }
372
373 @Override
374 public void onHalError(int errorCode, int property, int operation) {
375 mErrorCode = errorCode;
376 mErrorProperty = property;
377 mErrorOperation = operation;
378 mErrorWait.release();
379 }
380
381 public boolean waitForHalErrorAndAssert(long timeoutMs, int expectedErrorCode,
382 int expectedErrorProperty, int expectedErrorOperation) throws Exception {
383 if (!mErrorWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
384 return false;
385 }
386 assertEquals(expectedErrorCode, mErrorCode);
387 assertEquals(expectedErrorProperty, mErrorProperty);
388 assertEquals(expectedErrorOperation, mErrorOperation);
389 return true;
390 }
391
392 @Override
393 public void onHalRestart(boolean inMocking) {
394 mInMocking = inMocking;
395 mRestartWait.release();
396 }
397
398 public boolean waitForHalRestartAndAssert(long timeoutMs, boolean expectedInMocking)
399 throws Exception {
400 if (!mRestartWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
401 return false;
402 }
403 assertEquals(expectedInMocking, mInMocking);
404 return true;
405 }
Pavel Maltseve8f75372016-01-26 10:26:04 -0800406
407 public boolean waitForEvent(long timeoutMs, VehiclePropValue expected)
408 throws InterruptedException {
409 if (!mEventWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
410 Log.w(TAG, "Timed out waiting for event.");
411 return false;
412 }
413 assertEquals(1, mValuesReceived.getValuesCount());
414 assertEquals(VehiclePropValueUtil.toString(expected),
415 VehiclePropValueUtil.toString(mValuesReceived.getValues(0)));
416 return true;
417 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800418 }
419
420 private interface VehiclePropertyHandler {
421 void onPropertySet(VehiclePropValue value);
422 VehiclePropValue onPropertyGet(VehiclePropValue property);
Keun-young Park0727f952015-12-21 14:30:07 -0800423 void onPropertySubscribe(int property, float sampleRate, int zones);
Keun-young Park28dd4702015-11-19 18:06:04 -0800424 void onPropertyUnsubscribe(int property);
425 }
426
427 private class VehicleHalMock implements VehicleNetworkHalMock {
428 private LinkedList<VehiclePropConfig> mConfigs = new LinkedList<>();
429 private HashMap<Integer, VehiclePropertyHandler> mHandlers = new HashMap<>();
430
431 public synchronized void registerProperty(VehiclePropConfig config,
432 VehiclePropertyHandler handler) {
433 int property = config.getProp();
434 mConfigs.add(config);
435 mHandlers.put(property, handler);
436 }
437
438 @Override
439 public synchronized VehiclePropConfigs onListProperties() {
440 Log.i(TAG, "onListProperties, num properties:" + mConfigs.size());
441 VehiclePropConfigs configs =
442 VehiclePropConfigs.newBuilder().addAllConfigs(mConfigs).build();
443 return configs;
444 }
445
446 @Override
447 public void onPropertySet(VehiclePropValue value) {
448 int property = value.getProp();
449 VehiclePropertyHandler handler = getPropertyHandler(property);
450 if (handler == null) {
451 fail("onPropertySet for unknown property " + Integer.toHexString(property));
452 }
453 handler.onPropertySet(value);
454 }
455
456 @Override
457 public VehiclePropValue onPropertyGet(VehiclePropValue value) {
458 int property = value.getProp();
459 VehiclePropertyHandler handler = getPropertyHandler(property);
460 if (handler == null) {
461 fail("onPropertyGet for unknown property " + Integer.toHexString(property));
462 }
Pavel Maltseve8f75372016-01-26 10:26:04 -0800463 VehiclePropValue propValue = handler.onPropertyGet(value);
464 return propValue;
Keun-young Park28dd4702015-11-19 18:06:04 -0800465 }
466
467 @Override
Keun-young Park0727f952015-12-21 14:30:07 -0800468 public void onPropertySubscribe(int property, float sampleRate, int zones) {
Keun-young Park28dd4702015-11-19 18:06:04 -0800469 VehiclePropertyHandler handler = getPropertyHandler(property);
470 if (handler == null) {
471 fail("onPropertySubscribe for unknown property " + Integer.toHexString(property));
472 }
Keun-young Park0727f952015-12-21 14:30:07 -0800473 handler.onPropertySubscribe(property, sampleRate, zones);
Keun-young Park28dd4702015-11-19 18:06:04 -0800474 }
475
476 @Override
477 public void onPropertyUnsubscribe(int property) {
478 VehiclePropertyHandler handler = getPropertyHandler(property);
479 if (handler == null) {
480 fail("onPropertyUnsubscribe for unknown property " + Integer.toHexString(property));
481 }
482 handler.onPropertyUnsubscribe(property);
483 }
484
485 public synchronized VehiclePropertyHandler getPropertyHandler(int property) {
486 return mHandlers.get(property);
487 }
488 }
489
490 private class DefaultVehiclePropertyHandler implements VehiclePropertyHandler {
Pavel Maltseve8f75372016-01-26 10:26:04 -0800491 private Map<Integer, VehiclePropValue> mZoneValueMap = new HashMap<>();
Keun-young Park28dd4702015-11-19 18:06:04 -0800492
493 DefaultVehiclePropertyHandler(VehiclePropValue initialValue) {
Pavel Maltseve8f75372016-01-26 10:26:04 -0800494 setValue(initialValue);
Keun-young Park28dd4702015-11-19 18:06:04 -0800495 }
496
497 @Override
498 public void onPropertySet(VehiclePropValue value) {
Pavel Maltseve8f75372016-01-26 10:26:04 -0800499 setValue(value);
Keun-young Park28dd4702015-11-19 18:06:04 -0800500 }
501
502 @Override
503 public synchronized VehiclePropValue onPropertyGet(VehiclePropValue property) {
Pavel Maltseve8f75372016-01-26 10:26:04 -0800504 int zone = getZoneOrDefault(property.getZonedValue());
505 VehiclePropValue value = mZoneValueMap.get(zone);
506 if (value == null) {
507 Log.w(TAG, "Property not found: " + property.getProp() + ", zone: " + zone);
508 }
509 return value;
Keun-young Park28dd4702015-11-19 18:06:04 -0800510 }
511
512 @Override
Keun-young Park0727f952015-12-21 14:30:07 -0800513 public void onPropertySubscribe(int property, float sampleRate, int zones) {
Keun-young Park28dd4702015-11-19 18:06:04 -0800514 // TODO Auto-generated method stub
515 }
516
517 @Override
518 public void onPropertyUnsubscribe(int property) {
519 // TODO Auto-generated method stub
520 }
Pavel Maltseve8f75372016-01-26 10:26:04 -0800521
522 private void setValue(VehiclePropValue value) {
523 mZoneValueMap.put(getZoneOrDefault(value.getZonedValue()), VehiclePropValue.newBuilder(value).build());
524 }
525
526 private int getZoneOrDefault(ZonedValue value) {
527 return value != null ? value.getZoneOrWindow() : 0;
528
529 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800530 }
531}