blob: 7059f7db1611c0d57c88c41d8fc191c45a61f8b8 [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;
24import com.android.car.vehiclenetwork.VehicleNetwork.VehicleNetworkHalMock;
25import com.android.car.vehiclenetwork.VehicleNetwork.VehicleNetworkListener;
26import com.android.car.vehiclenetwork.VehicleNetworkConsts;
27import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropAccess;
28import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropChangeMode;
29import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
Pavel Maltseve8f75372016-01-26 10:26:04 -080030import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleZone;
Keun-young Park28dd4702015-11-19 18:06:04 -080031import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
32import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfigs;
33import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
34import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValues;
35import 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
Pavel Maltsev2906c442016-03-23 16:32:17 -070045@MediumTest
Keun-young Park28dd4702015-11-19 18:06:04 -080046public class VehicleNetworkMockedTest extends AndroidTestCase {
47 private static final String TAG = VehicleNetworkMockedTest.class.getSimpleName();
48
49 private static final long TIMEOUT_MS = 1000;
50
51 private static final int CUSTOM_PROPERTY_INT32 =
52 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START;
Pavel Maltseve8f75372016-01-26 10:26:04 -080053 private static final int CUSTOM_PROPERTY_ZONED_INT32 =
54 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 1;
55 private static final int CUSTOM_PROPERTY_ZONED_INT32_VEC2 =
56 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 2;
57 private static final int CUSTOM_PROPERTY_ZONED_INT32_VEC3 =
58 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 3;
59 private static final int CUSTOM_PROPERTY_ZONED_FLOAT_VEC2 =
60 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 4;
61 private static final int CUSTOM_PROPERTY_ZONED_FLOAT_VEC3 =
62 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 5;
63 private static final int CUSTOM_PROPERTY_FLOAT_VEC2 =
64 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 6;
65 private static final int CUSTOM_PROPERTY_INT32_VEC2 =
66 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 7;
Keun-young Park28dd4702015-11-19 18:06:04 -080067
68 private final HandlerThread mHandlerThread = new HandlerThread(
69 VehicleNetworkTest.class.getSimpleName());
70 private VehicleNetwork mVehicleNetwork;
71 private EventListener mListener = new EventListener();
72 private final VehicleHalMock mVehicleHalMock = new VehicleHalMock();
73
74 @Override
75 protected void setUp() throws Exception {
76 super.setUp();
77 mHandlerThread.start();
78 mVehicleNetwork = VehicleNetwork.createVehicleNetwork(mListener,
79 mHandlerThread.getLooper());
80 mVehicleHalMock.registerProperty(
81 VehiclePropConfigUtil.createProperty(
82 CUSTOM_PROPERTY_INT32,
83 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
84 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
85 VehicleValueType.VEHICLE_VALUE_TYPE_INT32, 0x0),
86 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createIntValue(
87 CUSTOM_PROPERTY_INT32, 0, 0)));
Pavel Maltseve8f75372016-01-26 10:26:04 -080088 mVehicleHalMock.registerProperty(
89 VehiclePropConfigUtil.createProperty(
90 CUSTOM_PROPERTY_ZONED_INT32,
91 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
92 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
93 VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32, 0x0),
94 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedIntValue(
95 CUSTOM_PROPERTY_ZONED_INT32, VehicleZone.VEHICLE_ZONE_ROW_2_LEFT, 0, 0)));
96 mVehicleHalMock.registerProperty(
97 VehiclePropConfigUtil.createProperty(
98 CUSTOM_PROPERTY_ZONED_INT32_VEC2,
99 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
100 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
101 VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2, 0x0),
102 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedIntVectorValue(
103 CUSTOM_PROPERTY_ZONED_INT32_VEC2,
104 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
105 new int[2], 0)));
106 mVehicleHalMock.registerProperty(
107 VehiclePropConfigUtil.createProperty(
108 CUSTOM_PROPERTY_INT32_VEC2,
109 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
110 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
111 VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2, 0x0),
112 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createIntVectorValue(
113 CUSTOM_PROPERTY_INT32_VEC2, new int[2], 0)));
114 mVehicleHalMock.registerProperty(
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800115 VehiclePropConfigUtil.createZonedProperty(
Pavel Maltseve8f75372016-01-26 10:26:04 -0800116 CUSTOM_PROPERTY_ZONED_INT32_VEC3,
117 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
118 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800119 VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3,
120 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
121 0x0),
Pavel Maltseve8f75372016-01-26 10:26:04 -0800122 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedIntVectorValue(
123 CUSTOM_PROPERTY_ZONED_INT32_VEC3,
124 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
125 new int[3], 0)));
126 mVehicleHalMock.registerProperty(
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800127 VehiclePropConfigUtil.createZonedProperty(
Pavel Maltseve8f75372016-01-26 10:26:04 -0800128 CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
129 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
130 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800131 VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2,
132 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
133 0x0),
Pavel Maltseve8f75372016-01-26 10:26:04 -0800134 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedFloatVectorValue(
135 CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
136 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
137 new float[2], 0)));
138 mVehicleHalMock.registerProperty(
139 VehiclePropConfigUtil.createProperty(
140 CUSTOM_PROPERTY_FLOAT_VEC2,
141 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
142 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
143 VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC2, 0x0),
144 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createFloatVectorValue(
145 CUSTOM_PROPERTY_FLOAT_VEC2, new float[2], 0)));
146 mVehicleHalMock.registerProperty(
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800147 VehiclePropConfigUtil.createZonedProperty(
Pavel Maltseve8f75372016-01-26 10:26:04 -0800148 CUSTOM_PROPERTY_ZONED_FLOAT_VEC3,
149 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
150 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800151 VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3,
152 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
153 0x0),
Pavel Maltseve8f75372016-01-26 10:26:04 -0800154 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedFloatVectorValue(
155 CUSTOM_PROPERTY_ZONED_FLOAT_VEC3,
156 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
157 new float[3], 0)));
Keun-young Park28dd4702015-11-19 18:06:04 -0800158 }
159
160 @Override
161 protected void tearDown() throws Exception {
162 super.tearDown();
163 mHandlerThread.quit();
164 mVehicleNetwork.stopMocking();
165 }
166
167 public void testHalRestartListening() throws Exception {
168 mVehicleNetwork.startHalRestartMonitoring();
169 mVehicleNetwork.startMocking(mVehicleHalMock);
170 assertTrue(mListener.waitForHalRestartAndAssert(TIMEOUT_MS, true /*expectedInMocking*/));
171 mVehicleNetwork.stopMocking();
172 assertTrue(mListener.waitForHalRestartAndAssert(TIMEOUT_MS, false /*expectedInMocking*/));
173 mVehicleNetwork.stopHalRestartMonitoring();
174 }
175
Pavel Maltseve8f75372016-01-26 10:26:04 -0800176 public void testCustomZonedIntProperties() {
177 final int INT_VALUE = 10;
178 final int INT_VALUE2 = 20;
179
180 mVehicleNetwork.startMocking(mVehicleHalMock);
181
182 mVehicleNetwork.setIntProperty(CUSTOM_PROPERTY_INT32, INT_VALUE);
183 assertEquals(INT_VALUE, mVehicleNetwork.getIntProperty(CUSTOM_PROPERTY_INT32));
184
185 mVehicleNetwork.setZonedIntProperty(CUSTOM_PROPERTY_ZONED_INT32,
186 VehicleZone.VEHICLE_ZONE_ROW_2_LEFT, INT_VALUE);
187 mVehicleNetwork.setZonedIntProperty(CUSTOM_PROPERTY_ZONED_INT32,
188 VehicleZone.VEHICLE_ZONE_ROW_2_RIGHT, INT_VALUE2);
189
190 assertEquals(INT_VALUE,
191 mVehicleNetwork.getZonedIntProperty(CUSTOM_PROPERTY_ZONED_INT32,
192 VehicleZone.VEHICLE_ZONE_ROW_2_LEFT));
193 assertEquals(INT_VALUE2,
194 mVehicleNetwork.getZonedIntProperty(CUSTOM_PROPERTY_ZONED_INT32,
195 VehicleZone.VEHICLE_ZONE_ROW_2_RIGHT));
196 assertEquals(INT_VALUE,
197 mVehicleNetwork.getZonedIntProperty(CUSTOM_PROPERTY_ZONED_INT32,
198 VehicleZone.VEHICLE_ZONE_ROW_2_LEFT));
199 }
200
201 public void testCustomZonedIntVecProperties() {
202 final int[] ZONED_INT_VALUE_LEFT = new int[] {30, 40};
203 final int[] ZONED_INT_VALUE_RIGHT = new int[] {50, 60};
204 final int[] ZONED_INT_VALUE_VEC3 = new int[] {30, 40, 50};
205
206 mVehicleNetwork.startMocking(mVehicleHalMock);
207
208 int[] actualValue = mVehicleNetwork.getZonedIntVectorProperty(
209 CUSTOM_PROPERTY_ZONED_INT32_VEC2,
210 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
211 // Verify the default values before calling setProperty.
212 assertArrayEquals(new int[2], actualValue);
213 mVehicleNetwork.setZonedIntVectorProperty(CUSTOM_PROPERTY_ZONED_INT32_VEC2,
214 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
215 ZONED_INT_VALUE_LEFT);
216 actualValue = mVehicleNetwork.getZonedIntVectorProperty(
217 CUSTOM_PROPERTY_ZONED_INT32_VEC2,
218 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
219 assertArrayEquals(ZONED_INT_VALUE_LEFT, actualValue);
220
221 // Verify different zone for the same property
222 mVehicleNetwork.setZonedIntVectorProperty(CUSTOM_PROPERTY_ZONED_INT32_VEC2,
223 VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT,
224 ZONED_INT_VALUE_RIGHT);
225 actualValue = mVehicleNetwork.getZonedIntVectorProperty(
226 CUSTOM_PROPERTY_ZONED_INT32_VEC2,
227 VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT);
228 assertArrayEquals(ZONED_INT_VALUE_RIGHT, actualValue);
229
230 mVehicleNetwork.setZonedIntVectorProperty(CUSTOM_PROPERTY_ZONED_INT32_VEC3,
231 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
232 ZONED_INT_VALUE_VEC3);
233 actualValue = mVehicleNetwork.getZonedIntVectorProperty(
234 CUSTOM_PROPERTY_ZONED_INT32_VEC3,
235 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
236 assertArrayEquals(ZONED_INT_VALUE_VEC3, actualValue);
237 }
238
239 public void testCustomZonedFloatVecProperties() {
240 final float[] ZONED_FLOAT_VALUE_LEFT = new float[] {30.1f, 40.3f};
241 final float[] ZONED_FLOAT_VALUE_RIGHT = new float[] {50.5f, 60};
242 final float[] ZONED_FLOAT_VALUE_VEC3 = new float[] {30, 40.3f, 50};
243
244 mVehicleNetwork.startMocking(mVehicleHalMock);
245
246 float[] actualValue = mVehicleNetwork.getZonedFloatVectorProperty(
247 CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
248 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
249 // Verify the default values before calling setProperty.
250 assertArrayEquals(new float[2], actualValue);
251 mVehicleNetwork.setZonedFloatVectorProperty(CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
252 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
253 ZONED_FLOAT_VALUE_LEFT);
254 actualValue = mVehicleNetwork.getZonedFloatVectorProperty(
255 CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
256 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
257 assertArrayEquals(ZONED_FLOAT_VALUE_LEFT, actualValue);
258
259 // Verify different zone for the same property
260 mVehicleNetwork.setZonedFloatVectorProperty(CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
261 VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT,
262 ZONED_FLOAT_VALUE_RIGHT);
263 actualValue = mVehicleNetwork.getZonedFloatVectorProperty(
264 CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
265 VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT);
266 assertArrayEquals(ZONED_FLOAT_VALUE_RIGHT, actualValue);
267
268 mVehicleNetwork.setZonedFloatVectorProperty(CUSTOM_PROPERTY_ZONED_FLOAT_VEC3,
269 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
270 ZONED_FLOAT_VALUE_VEC3);
271 actualValue = mVehicleNetwork.getZonedFloatVectorProperty(
272 CUSTOM_PROPERTY_ZONED_FLOAT_VEC3,
273 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
274 assertArrayEquals(ZONED_FLOAT_VALUE_VEC3, actualValue);
275 }
276
277 public void testCustomFloatVecProperties() {
278 final float[] FLOAT_VALUE = new float[] {30.1f, 40.3f};
279
280 mVehicleNetwork.startMocking(mVehicleHalMock);
281
282 float[] actualValue = mVehicleNetwork.getFloatVectorProperty(
283 CUSTOM_PROPERTY_FLOAT_VEC2);
284 // Verify the default values before calling setProperty.
285 assertArrayEquals(new float[2], actualValue);
286 mVehicleNetwork.setFloatVectorProperty(CUSTOM_PROPERTY_FLOAT_VEC2, FLOAT_VALUE);
287 actualValue = mVehicleNetwork.getFloatVectorProperty(
288 CUSTOM_PROPERTY_FLOAT_VEC2);
289 assertArrayEquals(FLOAT_VALUE, actualValue);
290 }
291
292 public void testCustomIntVecProperties() {
293 final int[] INT32_VALUE = new int[] {30, 40};
294
295 mVehicleNetwork.startMocking(mVehicleHalMock);
296
297 int[] actualValue = mVehicleNetwork.getIntVectorProperty(
298 CUSTOM_PROPERTY_INT32_VEC2);
299 // Verify the default values before calling setProperty.
300 assertArrayEquals(new int[2], actualValue);
301 mVehicleNetwork.setIntVectorProperty(CUSTOM_PROPERTY_INT32_VEC2, INT32_VALUE);
302 actualValue = mVehicleNetwork.getIntVectorProperty(
303 CUSTOM_PROPERTY_INT32_VEC2);
304 assertArrayEquals(INT32_VALUE, actualValue);
305 }
306
Keun-young Park28dd4702015-11-19 18:06:04 -0800307 public void testGlobalErrorListening() throws Exception {
308 mVehicleNetwork.startErrorListening();
309 mVehicleNetwork.startMocking(mVehicleHalMock);
310 final int ERROR_CODE = 0x1;
311 final int ERROR_OPERATION = 0x10;
312 mVehicleNetwork.injectHalError(ERROR_CODE, 0, ERROR_OPERATION);
313 assertTrue(mListener.waitForHalErrorAndAssert(TIMEOUT_MS, ERROR_CODE, 0, ERROR_OPERATION));
314 mVehicleNetwork.injectHalError(ERROR_CODE, CUSTOM_PROPERTY_INT32, ERROR_OPERATION);
315 assertTrue(mListener.waitForHalErrorAndAssert(TIMEOUT_MS,
316 ERROR_CODE, CUSTOM_PROPERTY_INT32, ERROR_OPERATION));
317 mVehicleNetwork.stopMocking();
318 mVehicleNetwork.stopErrorListening();
319 }
320
321 public void testPropertyErrorListening() throws Exception {
322 mVehicleNetwork.startMocking(mVehicleHalMock);
323 mVehicleNetwork.subscribe(CUSTOM_PROPERTY_INT32, 0);
324 final int ERROR_CODE = 0x1;
325 final int ERROR_OPERATION = 0x10;
326 mVehicleNetwork.injectHalError(ERROR_CODE, CUSTOM_PROPERTY_INT32, ERROR_OPERATION);
327 assertTrue(mListener.waitForHalErrorAndAssert(TIMEOUT_MS,
328 ERROR_CODE, CUSTOM_PROPERTY_INT32, ERROR_OPERATION));
329 mVehicleNetwork.unsubscribe(CUSTOM_PROPERTY_INT32);
330 mVehicleNetwork.stopMocking();
331 }
332
Pavel Maltseve8f75372016-01-26 10:26:04 -0800333 public void testSubscribe() throws Exception {
334 final int PROPERTY = CUSTOM_PROPERTY_ZONED_INT32_VEC3;
335 final int ZONE = VehicleZone.VEHICLE_ZONE_ROW_1_LEFT;
336 final int[] VALUES = new int[] {10, 20, 30};
337 mVehicleNetwork.startMocking(mVehicleHalMock);
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800338 mVehicleNetwork.subscribe(PROPERTY, 0, ZONE);
Pavel Maltseve8f75372016-01-26 10:26:04 -0800339 VehiclePropValue value = VehiclePropValueUtil.createZonedIntVectorValue(
340 PROPERTY, ZONE, VALUES, 0);
341 mVehicleNetwork.injectEvent(value);
342 assertTrue(mListener.waitForEvent(TIMEOUT_MS, value));
343 mVehicleNetwork.unsubscribe(PROPERTY);
344 }
345
Pavel Maltsev169b7a62016-01-26 15:56:07 -0800346 public void testGetPropertyFailsForCustom() {
347 try {
348 mVehicleNetwork.getProperty(CUSTOM_PROPERTY_INT32);
349 fail();
350 } catch (IllegalArgumentException expected) {
351 // Expected.
352 }
353 }
354
Pavel Maltseve8f75372016-01-26 10:26:04 -0800355 private void assertArrayEquals(int[] expected, int[] actual) {
356 assertEquals(Arrays.toString(expected), Arrays.toString(actual));
357 }
358
359 private void assertArrayEquals(float[] expected, float[] actual) {
360 assertEquals(Arrays.toString(expected), Arrays.toString(actual));
361 }
362
Keun-young Park28dd4702015-11-19 18:06:04 -0800363 private class EventListener implements VehicleNetworkListener {
364 boolean mInMocking;
Keun-young Park28dd4702015-11-19 18:06:04 -0800365 int mErrorCode;
366 int mErrorProperty;
367 int mErrorOperation;
Pavel Maltseve8f75372016-01-26 10:26:04 -0800368 VehiclePropValues mValuesReceived;
369
370 private final Semaphore mRestartWait = new Semaphore(0);
Keun-young Park28dd4702015-11-19 18:06:04 -0800371 private final Semaphore mErrorWait = new Semaphore(0);
Pavel Maltseve8f75372016-01-26 10:26:04 -0800372 private final Semaphore mEventWait = new Semaphore(0);
Keun-young Park28dd4702015-11-19 18:06:04 -0800373
374 @Override
375 public void onVehicleNetworkEvents(VehiclePropValues values) {
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800376 Log.i(TAG, "onVehicleNetworkEvents");
Pavel Maltseve8f75372016-01-26 10:26:04 -0800377 mValuesReceived = values;
378 mEventWait.release();
Keun-young Park28dd4702015-11-19 18:06:04 -0800379 }
380
381 @Override
382 public void onHalError(int errorCode, int property, int operation) {
383 mErrorCode = errorCode;
384 mErrorProperty = property;
385 mErrorOperation = operation;
386 mErrorWait.release();
387 }
388
389 public boolean waitForHalErrorAndAssert(long timeoutMs, int expectedErrorCode,
390 int expectedErrorProperty, int expectedErrorOperation) throws Exception {
391 if (!mErrorWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
392 return false;
393 }
394 assertEquals(expectedErrorCode, mErrorCode);
395 assertEquals(expectedErrorProperty, mErrorProperty);
396 assertEquals(expectedErrorOperation, mErrorOperation);
397 return true;
398 }
399
400 @Override
401 public void onHalRestart(boolean inMocking) {
402 mInMocking = inMocking;
403 mRestartWait.release();
404 }
405
406 public boolean waitForHalRestartAndAssert(long timeoutMs, boolean expectedInMocking)
407 throws Exception {
408 if (!mRestartWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
409 return false;
410 }
411 assertEquals(expectedInMocking, mInMocking);
412 return true;
413 }
Pavel Maltseve8f75372016-01-26 10:26:04 -0800414
415 public boolean waitForEvent(long timeoutMs, VehiclePropValue expected)
416 throws InterruptedException {
417 if (!mEventWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
418 Log.w(TAG, "Timed out waiting for event.");
419 return false;
420 }
421 assertEquals(1, mValuesReceived.getValuesCount());
422 assertEquals(VehiclePropValueUtil.toString(expected),
423 VehiclePropValueUtil.toString(mValuesReceived.getValues(0)));
424 return true;
425 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800426 }
427
428 private interface VehiclePropertyHandler {
429 void onPropertySet(VehiclePropValue value);
430 VehiclePropValue onPropertyGet(VehiclePropValue property);
Keun-young Park0727f952015-12-21 14:30:07 -0800431 void onPropertySubscribe(int property, float sampleRate, int zones);
Keun-young Park28dd4702015-11-19 18:06:04 -0800432 void onPropertyUnsubscribe(int property);
433 }
434
435 private class VehicleHalMock implements VehicleNetworkHalMock {
436 private LinkedList<VehiclePropConfig> mConfigs = new LinkedList<>();
437 private HashMap<Integer, VehiclePropertyHandler> mHandlers = new HashMap<>();
438
439 public synchronized void registerProperty(VehiclePropConfig config,
440 VehiclePropertyHandler handler) {
441 int property = config.getProp();
442 mConfigs.add(config);
443 mHandlers.put(property, handler);
444 }
445
446 @Override
447 public synchronized VehiclePropConfigs onListProperties() {
448 Log.i(TAG, "onListProperties, num properties:" + mConfigs.size());
449 VehiclePropConfigs configs =
450 VehiclePropConfigs.newBuilder().addAllConfigs(mConfigs).build();
451 return configs;
452 }
453
454 @Override
455 public void onPropertySet(VehiclePropValue value) {
456 int property = value.getProp();
457 VehiclePropertyHandler handler = getPropertyHandler(property);
458 if (handler == null) {
459 fail("onPropertySet for unknown property " + Integer.toHexString(property));
460 }
461 handler.onPropertySet(value);
462 }
463
464 @Override
465 public VehiclePropValue onPropertyGet(VehiclePropValue value) {
466 int property = value.getProp();
467 VehiclePropertyHandler handler = getPropertyHandler(property);
468 if (handler == null) {
469 fail("onPropertyGet for unknown property " + Integer.toHexString(property));
470 }
Pavel Maltseve8f75372016-01-26 10:26:04 -0800471 VehiclePropValue propValue = handler.onPropertyGet(value);
472 return propValue;
Keun-young Park28dd4702015-11-19 18:06:04 -0800473 }
474
475 @Override
Keun-young Park0727f952015-12-21 14:30:07 -0800476 public void onPropertySubscribe(int property, float sampleRate, int zones) {
Keun-young Park28dd4702015-11-19 18:06:04 -0800477 VehiclePropertyHandler handler = getPropertyHandler(property);
478 if (handler == null) {
479 fail("onPropertySubscribe for unknown property " + Integer.toHexString(property));
480 }
Keun-young Park0727f952015-12-21 14:30:07 -0800481 handler.onPropertySubscribe(property, sampleRate, zones);
Keun-young Park28dd4702015-11-19 18:06:04 -0800482 }
483
484 @Override
485 public void onPropertyUnsubscribe(int property) {
486 VehiclePropertyHandler handler = getPropertyHandler(property);
487 if (handler == null) {
488 fail("onPropertyUnsubscribe for unknown property " + Integer.toHexString(property));
489 }
490 handler.onPropertyUnsubscribe(property);
491 }
492
493 public synchronized VehiclePropertyHandler getPropertyHandler(int property) {
494 return mHandlers.get(property);
495 }
496 }
497
498 private class DefaultVehiclePropertyHandler implements VehiclePropertyHandler {
Pavel Maltseve8f75372016-01-26 10:26:04 -0800499 private Map<Integer, VehiclePropValue> mZoneValueMap = new HashMap<>();
Keun-young Park28dd4702015-11-19 18:06:04 -0800500
501 DefaultVehiclePropertyHandler(VehiclePropValue initialValue) {
Pavel Maltseve8f75372016-01-26 10:26:04 -0800502 setValue(initialValue);
Keun-young Park28dd4702015-11-19 18:06:04 -0800503 }
504
505 @Override
506 public void onPropertySet(VehiclePropValue value) {
Pavel Maltseve8f75372016-01-26 10:26:04 -0800507 setValue(value);
Keun-young Park28dd4702015-11-19 18:06:04 -0800508 }
509
510 @Override
511 public synchronized VehiclePropValue onPropertyGet(VehiclePropValue property) {
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800512 int zone = property.getZone();
Pavel Maltseve8f75372016-01-26 10:26:04 -0800513 VehiclePropValue value = mZoneValueMap.get(zone);
514 if (value == null) {
515 Log.w(TAG, "Property not found: " + property.getProp() + ", zone: " + zone);
516 }
517 return value;
Keun-young Park28dd4702015-11-19 18:06:04 -0800518 }
519
520 @Override
Keun-young Park0727f952015-12-21 14:30:07 -0800521 public void onPropertySubscribe(int property, float sampleRate, int zones) {
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800522 Log.i(TAG, "Property subscribed:0x" + Integer.toHexString(property) +
523 " zones:0x" + Integer.toHexString(zones));
Keun-young Park28dd4702015-11-19 18:06:04 -0800524 }
525
526 @Override
527 public void onPropertyUnsubscribe(int property) {
528 // TODO Auto-generated method stub
529 }
Pavel Maltseve8f75372016-01-26 10:26:04 -0800530
531 private void setValue(VehiclePropValue value) {
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800532 mZoneValueMap.put(value.getZone(), VehiclePropValue.newBuilder(value).build());
Pavel Maltseve8f75372016-01-26 10:26:04 -0800533 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800534 }
535}