blob: 78b0ece3c4c91646b156c529704fe4270bba582b [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;
34import com.android.car.vehiclenetwork.VehiclePropConfigUtil;
35import com.android.car.vehiclenetwork.VehiclePropValueUtil;
36
Pavel Maltseve8f75372016-01-26 10:26:04 -080037import java.util.Arrays;
Keun-young Park28dd4702015-11-19 18:06:04 -080038import java.util.HashMap;
39import java.util.LinkedList;
Pavel Maltseve8f75372016-01-26 10:26:04 -080040import java.util.Map;
Keun-young Park28dd4702015-11-19 18:06:04 -080041import java.util.concurrent.Semaphore;
42import java.util.concurrent.TimeUnit;
43
44public class VehicleNetworkMockedTest extends AndroidTestCase {
45 private static final String TAG = VehicleNetworkMockedTest.class.getSimpleName();
46
47 private static final long TIMEOUT_MS = 1000;
48
49 private static final int CUSTOM_PROPERTY_INT32 =
50 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START;
Pavel Maltseve8f75372016-01-26 10:26:04 -080051 private static final int CUSTOM_PROPERTY_ZONED_INT32 =
52 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 1;
53 private static final int CUSTOM_PROPERTY_ZONED_INT32_VEC2 =
54 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 2;
55 private static final int CUSTOM_PROPERTY_ZONED_INT32_VEC3 =
56 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 3;
57 private static final int CUSTOM_PROPERTY_ZONED_FLOAT_VEC2 =
58 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 4;
59 private static final int CUSTOM_PROPERTY_ZONED_FLOAT_VEC3 =
60 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 5;
61 private static final int CUSTOM_PROPERTY_FLOAT_VEC2 =
62 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 6;
63 private static final int CUSTOM_PROPERTY_INT32_VEC2 =
64 VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 7;
Keun-young Park28dd4702015-11-19 18:06:04 -080065
66 private final HandlerThread mHandlerThread = new HandlerThread(
67 VehicleNetworkTest.class.getSimpleName());
68 private VehicleNetwork mVehicleNetwork;
69 private EventListener mListener = new EventListener();
70 private final VehicleHalMock mVehicleHalMock = new VehicleHalMock();
71
72 @Override
73 protected void setUp() throws Exception {
74 super.setUp();
75 mHandlerThread.start();
76 mVehicleNetwork = VehicleNetwork.createVehicleNetwork(mListener,
77 mHandlerThread.getLooper());
78 mVehicleHalMock.registerProperty(
79 VehiclePropConfigUtil.createProperty(
80 CUSTOM_PROPERTY_INT32,
81 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
82 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
83 VehicleValueType.VEHICLE_VALUE_TYPE_INT32, 0x0),
84 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createIntValue(
85 CUSTOM_PROPERTY_INT32, 0, 0)));
Pavel Maltseve8f75372016-01-26 10:26:04 -080086 mVehicleHalMock.registerProperty(
87 VehiclePropConfigUtil.createProperty(
88 CUSTOM_PROPERTY_ZONED_INT32,
89 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
90 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
91 VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32, 0x0),
92 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedIntValue(
93 CUSTOM_PROPERTY_ZONED_INT32, VehicleZone.VEHICLE_ZONE_ROW_2_LEFT, 0, 0)));
94 mVehicleHalMock.registerProperty(
95 VehiclePropConfigUtil.createProperty(
96 CUSTOM_PROPERTY_ZONED_INT32_VEC2,
97 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
98 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
99 VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2, 0x0),
100 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedIntVectorValue(
101 CUSTOM_PROPERTY_ZONED_INT32_VEC2,
102 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
103 new int[2], 0)));
104 mVehicleHalMock.registerProperty(
105 VehiclePropConfigUtil.createProperty(
106 CUSTOM_PROPERTY_INT32_VEC2,
107 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
108 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
109 VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2, 0x0),
110 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createIntVectorValue(
111 CUSTOM_PROPERTY_INT32_VEC2, new int[2], 0)));
112 mVehicleHalMock.registerProperty(
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800113 VehiclePropConfigUtil.createZonedProperty(
Pavel Maltseve8f75372016-01-26 10:26:04 -0800114 CUSTOM_PROPERTY_ZONED_INT32_VEC3,
115 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
116 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800117 VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3,
118 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
119 0x0),
Pavel Maltseve8f75372016-01-26 10:26:04 -0800120 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedIntVectorValue(
121 CUSTOM_PROPERTY_ZONED_INT32_VEC3,
122 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
123 new int[3], 0)));
124 mVehicleHalMock.registerProperty(
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800125 VehiclePropConfigUtil.createZonedProperty(
Pavel Maltseve8f75372016-01-26 10:26:04 -0800126 CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
127 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
128 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800129 VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2,
130 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
131 0x0),
Pavel Maltseve8f75372016-01-26 10:26:04 -0800132 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedFloatVectorValue(
133 CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
134 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
135 new float[2], 0)));
136 mVehicleHalMock.registerProperty(
137 VehiclePropConfigUtil.createProperty(
138 CUSTOM_PROPERTY_FLOAT_VEC2,
139 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
140 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
141 VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC2, 0x0),
142 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createFloatVectorValue(
143 CUSTOM_PROPERTY_FLOAT_VEC2, new float[2], 0)));
144 mVehicleHalMock.registerProperty(
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800145 VehiclePropConfigUtil.createZonedProperty(
Pavel Maltseve8f75372016-01-26 10:26:04 -0800146 CUSTOM_PROPERTY_ZONED_FLOAT_VEC3,
147 VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
148 VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800149 VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3,
150 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
151 0x0),
Pavel Maltseve8f75372016-01-26 10:26:04 -0800152 new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedFloatVectorValue(
153 CUSTOM_PROPERTY_ZONED_FLOAT_VEC3,
154 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
155 new float[3], 0)));
Keun-young Park28dd4702015-11-19 18:06:04 -0800156 }
157
158 @Override
159 protected void tearDown() throws Exception {
160 super.tearDown();
161 mHandlerThread.quit();
162 mVehicleNetwork.stopMocking();
163 }
164
165 public void testHalRestartListening() throws Exception {
166 mVehicleNetwork.startHalRestartMonitoring();
167 mVehicleNetwork.startMocking(mVehicleHalMock);
168 assertTrue(mListener.waitForHalRestartAndAssert(TIMEOUT_MS, true /*expectedInMocking*/));
169 mVehicleNetwork.stopMocking();
170 assertTrue(mListener.waitForHalRestartAndAssert(TIMEOUT_MS, false /*expectedInMocking*/));
171 mVehicleNetwork.stopHalRestartMonitoring();
172 }
173
Pavel Maltseve8f75372016-01-26 10:26:04 -0800174 public void testCustomZonedIntProperties() {
175 final int INT_VALUE = 10;
176 final int INT_VALUE2 = 20;
177
178 mVehicleNetwork.startMocking(mVehicleHalMock);
179
180 mVehicleNetwork.setIntProperty(CUSTOM_PROPERTY_INT32, INT_VALUE);
181 assertEquals(INT_VALUE, mVehicleNetwork.getIntProperty(CUSTOM_PROPERTY_INT32));
182
183 mVehicleNetwork.setZonedIntProperty(CUSTOM_PROPERTY_ZONED_INT32,
184 VehicleZone.VEHICLE_ZONE_ROW_2_LEFT, INT_VALUE);
185 mVehicleNetwork.setZonedIntProperty(CUSTOM_PROPERTY_ZONED_INT32,
186 VehicleZone.VEHICLE_ZONE_ROW_2_RIGHT, INT_VALUE2);
187
188 assertEquals(INT_VALUE,
189 mVehicleNetwork.getZonedIntProperty(CUSTOM_PROPERTY_ZONED_INT32,
190 VehicleZone.VEHICLE_ZONE_ROW_2_LEFT));
191 assertEquals(INT_VALUE2,
192 mVehicleNetwork.getZonedIntProperty(CUSTOM_PROPERTY_ZONED_INT32,
193 VehicleZone.VEHICLE_ZONE_ROW_2_RIGHT));
194 assertEquals(INT_VALUE,
195 mVehicleNetwork.getZonedIntProperty(CUSTOM_PROPERTY_ZONED_INT32,
196 VehicleZone.VEHICLE_ZONE_ROW_2_LEFT));
197 }
198
199 public void testCustomZonedIntVecProperties() {
200 final int[] ZONED_INT_VALUE_LEFT = new int[] {30, 40};
201 final int[] ZONED_INT_VALUE_RIGHT = new int[] {50, 60};
202 final int[] ZONED_INT_VALUE_VEC3 = new int[] {30, 40, 50};
203
204 mVehicleNetwork.startMocking(mVehicleHalMock);
205
206 int[] actualValue = mVehicleNetwork.getZonedIntVectorProperty(
207 CUSTOM_PROPERTY_ZONED_INT32_VEC2,
208 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
209 // Verify the default values before calling setProperty.
210 assertArrayEquals(new int[2], actualValue);
211 mVehicleNetwork.setZonedIntVectorProperty(CUSTOM_PROPERTY_ZONED_INT32_VEC2,
212 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
213 ZONED_INT_VALUE_LEFT);
214 actualValue = mVehicleNetwork.getZonedIntVectorProperty(
215 CUSTOM_PROPERTY_ZONED_INT32_VEC2,
216 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
217 assertArrayEquals(ZONED_INT_VALUE_LEFT, actualValue);
218
219 // Verify different zone for the same property
220 mVehicleNetwork.setZonedIntVectorProperty(CUSTOM_PROPERTY_ZONED_INT32_VEC2,
221 VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT,
222 ZONED_INT_VALUE_RIGHT);
223 actualValue = mVehicleNetwork.getZonedIntVectorProperty(
224 CUSTOM_PROPERTY_ZONED_INT32_VEC2,
225 VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT);
226 assertArrayEquals(ZONED_INT_VALUE_RIGHT, actualValue);
227
228 mVehicleNetwork.setZonedIntVectorProperty(CUSTOM_PROPERTY_ZONED_INT32_VEC3,
229 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
230 ZONED_INT_VALUE_VEC3);
231 actualValue = mVehicleNetwork.getZonedIntVectorProperty(
232 CUSTOM_PROPERTY_ZONED_INT32_VEC3,
233 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
234 assertArrayEquals(ZONED_INT_VALUE_VEC3, actualValue);
235 }
236
237 public void testCustomZonedFloatVecProperties() {
238 final float[] ZONED_FLOAT_VALUE_LEFT = new float[] {30.1f, 40.3f};
239 final float[] ZONED_FLOAT_VALUE_RIGHT = new float[] {50.5f, 60};
240 final float[] ZONED_FLOAT_VALUE_VEC3 = new float[] {30, 40.3f, 50};
241
242 mVehicleNetwork.startMocking(mVehicleHalMock);
243
244 float[] actualValue = mVehicleNetwork.getZonedFloatVectorProperty(
245 CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
246 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
247 // Verify the default values before calling setProperty.
248 assertArrayEquals(new float[2], actualValue);
249 mVehicleNetwork.setZonedFloatVectorProperty(CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
250 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
251 ZONED_FLOAT_VALUE_LEFT);
252 actualValue = mVehicleNetwork.getZonedFloatVectorProperty(
253 CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
254 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
255 assertArrayEquals(ZONED_FLOAT_VALUE_LEFT, actualValue);
256
257 // Verify different zone for the same property
258 mVehicleNetwork.setZonedFloatVectorProperty(CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
259 VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT,
260 ZONED_FLOAT_VALUE_RIGHT);
261 actualValue = mVehicleNetwork.getZonedFloatVectorProperty(
262 CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
263 VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT);
264 assertArrayEquals(ZONED_FLOAT_VALUE_RIGHT, actualValue);
265
266 mVehicleNetwork.setZonedFloatVectorProperty(CUSTOM_PROPERTY_ZONED_FLOAT_VEC3,
267 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
268 ZONED_FLOAT_VALUE_VEC3);
269 actualValue = mVehicleNetwork.getZonedFloatVectorProperty(
270 CUSTOM_PROPERTY_ZONED_FLOAT_VEC3,
271 VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
272 assertArrayEquals(ZONED_FLOAT_VALUE_VEC3, actualValue);
273 }
274
275 public void testCustomFloatVecProperties() {
276 final float[] FLOAT_VALUE = new float[] {30.1f, 40.3f};
277
278 mVehicleNetwork.startMocking(mVehicleHalMock);
279
280 float[] actualValue = mVehicleNetwork.getFloatVectorProperty(
281 CUSTOM_PROPERTY_FLOAT_VEC2);
282 // Verify the default values before calling setProperty.
283 assertArrayEquals(new float[2], actualValue);
284 mVehicleNetwork.setFloatVectorProperty(CUSTOM_PROPERTY_FLOAT_VEC2, FLOAT_VALUE);
285 actualValue = mVehicleNetwork.getFloatVectorProperty(
286 CUSTOM_PROPERTY_FLOAT_VEC2);
287 assertArrayEquals(FLOAT_VALUE, actualValue);
288 }
289
290 public void testCustomIntVecProperties() {
291 final int[] INT32_VALUE = new int[] {30, 40};
292
293 mVehicleNetwork.startMocking(mVehicleHalMock);
294
295 int[] actualValue = mVehicleNetwork.getIntVectorProperty(
296 CUSTOM_PROPERTY_INT32_VEC2);
297 // Verify the default values before calling setProperty.
298 assertArrayEquals(new int[2], actualValue);
299 mVehicleNetwork.setIntVectorProperty(CUSTOM_PROPERTY_INT32_VEC2, INT32_VALUE);
300 actualValue = mVehicleNetwork.getIntVectorProperty(
301 CUSTOM_PROPERTY_INT32_VEC2);
302 assertArrayEquals(INT32_VALUE, actualValue);
303 }
304
Keun-young Park28dd4702015-11-19 18:06:04 -0800305 public void testGlobalErrorListening() throws Exception {
306 mVehicleNetwork.startErrorListening();
307 mVehicleNetwork.startMocking(mVehicleHalMock);
308 final int ERROR_CODE = 0x1;
309 final int ERROR_OPERATION = 0x10;
310 mVehicleNetwork.injectHalError(ERROR_CODE, 0, ERROR_OPERATION);
311 assertTrue(mListener.waitForHalErrorAndAssert(TIMEOUT_MS, ERROR_CODE, 0, ERROR_OPERATION));
312 mVehicleNetwork.injectHalError(ERROR_CODE, CUSTOM_PROPERTY_INT32, ERROR_OPERATION);
313 assertTrue(mListener.waitForHalErrorAndAssert(TIMEOUT_MS,
314 ERROR_CODE, CUSTOM_PROPERTY_INT32, ERROR_OPERATION));
315 mVehicleNetwork.stopMocking();
316 mVehicleNetwork.stopErrorListening();
317 }
318
319 public void testPropertyErrorListening() throws Exception {
320 mVehicleNetwork.startMocking(mVehicleHalMock);
321 mVehicleNetwork.subscribe(CUSTOM_PROPERTY_INT32, 0);
322 final int ERROR_CODE = 0x1;
323 final int ERROR_OPERATION = 0x10;
324 mVehicleNetwork.injectHalError(ERROR_CODE, CUSTOM_PROPERTY_INT32, ERROR_OPERATION);
325 assertTrue(mListener.waitForHalErrorAndAssert(TIMEOUT_MS,
326 ERROR_CODE, CUSTOM_PROPERTY_INT32, ERROR_OPERATION));
327 mVehicleNetwork.unsubscribe(CUSTOM_PROPERTY_INT32);
328 mVehicleNetwork.stopMocking();
329 }
330
Pavel Maltseve8f75372016-01-26 10:26:04 -0800331 public void testSubscribe() throws Exception {
332 final int PROPERTY = CUSTOM_PROPERTY_ZONED_INT32_VEC3;
333 final int ZONE = VehicleZone.VEHICLE_ZONE_ROW_1_LEFT;
334 final int[] VALUES = new int[] {10, 20, 30};
335 mVehicleNetwork.startMocking(mVehicleHalMock);
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800336 mVehicleNetwork.subscribe(PROPERTY, 0, ZONE);
Pavel Maltseve8f75372016-01-26 10:26:04 -0800337 VehiclePropValue value = VehiclePropValueUtil.createZonedIntVectorValue(
338 PROPERTY, ZONE, VALUES, 0);
339 mVehicleNetwork.injectEvent(value);
340 assertTrue(mListener.waitForEvent(TIMEOUT_MS, value));
341 mVehicleNetwork.unsubscribe(PROPERTY);
342 }
343
Pavel Maltsev169b7a62016-01-26 15:56:07 -0800344 public void testGetPropertyFailsForCustom() {
345 try {
346 mVehicleNetwork.getProperty(CUSTOM_PROPERTY_INT32);
347 fail();
348 } catch (IllegalArgumentException expected) {
349 // Expected.
350 }
351 }
352
Pavel Maltseve8f75372016-01-26 10:26:04 -0800353 private void assertArrayEquals(int[] expected, int[] actual) {
354 assertEquals(Arrays.toString(expected), Arrays.toString(actual));
355 }
356
357 private void assertArrayEquals(float[] expected, float[] actual) {
358 assertEquals(Arrays.toString(expected), Arrays.toString(actual));
359 }
360
Keun-young Park28dd4702015-11-19 18:06:04 -0800361 private class EventListener implements VehicleNetworkListener {
362 boolean mInMocking;
Keun-young Park28dd4702015-11-19 18:06:04 -0800363 int mErrorCode;
364 int mErrorProperty;
365 int mErrorOperation;
Pavel Maltseve8f75372016-01-26 10:26:04 -0800366 VehiclePropValues mValuesReceived;
367
368 private final Semaphore mRestartWait = new Semaphore(0);
Keun-young Park28dd4702015-11-19 18:06:04 -0800369 private final Semaphore mErrorWait = new Semaphore(0);
Pavel Maltseve8f75372016-01-26 10:26:04 -0800370 private final Semaphore mEventWait = new Semaphore(0);
Keun-young Park28dd4702015-11-19 18:06:04 -0800371
372 @Override
373 public void onVehicleNetworkEvents(VehiclePropValues values) {
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800374 Log.i(TAG, "onVehicleNetworkEvents");
Pavel Maltseve8f75372016-01-26 10:26:04 -0800375 mValuesReceived = values;
376 mEventWait.release();
Keun-young Park28dd4702015-11-19 18:06:04 -0800377 }
378
379 @Override
380 public void onHalError(int errorCode, int property, int operation) {
381 mErrorCode = errorCode;
382 mErrorProperty = property;
383 mErrorOperation = operation;
384 mErrorWait.release();
385 }
386
387 public boolean waitForHalErrorAndAssert(long timeoutMs, int expectedErrorCode,
388 int expectedErrorProperty, int expectedErrorOperation) throws Exception {
389 if (!mErrorWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
390 return false;
391 }
392 assertEquals(expectedErrorCode, mErrorCode);
393 assertEquals(expectedErrorProperty, mErrorProperty);
394 assertEquals(expectedErrorOperation, mErrorOperation);
395 return true;
396 }
397
398 @Override
399 public void onHalRestart(boolean inMocking) {
400 mInMocking = inMocking;
401 mRestartWait.release();
402 }
403
404 public boolean waitForHalRestartAndAssert(long timeoutMs, boolean expectedInMocking)
405 throws Exception {
406 if (!mRestartWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
407 return false;
408 }
409 assertEquals(expectedInMocking, mInMocking);
410 return true;
411 }
Pavel Maltseve8f75372016-01-26 10:26:04 -0800412
413 public boolean waitForEvent(long timeoutMs, VehiclePropValue expected)
414 throws InterruptedException {
415 if (!mEventWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
416 Log.w(TAG, "Timed out waiting for event.");
417 return false;
418 }
419 assertEquals(1, mValuesReceived.getValuesCount());
420 assertEquals(VehiclePropValueUtil.toString(expected),
421 VehiclePropValueUtil.toString(mValuesReceived.getValues(0)));
422 return true;
423 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800424 }
425
426 private interface VehiclePropertyHandler {
427 void onPropertySet(VehiclePropValue value);
428 VehiclePropValue onPropertyGet(VehiclePropValue property);
Keun-young Park0727f952015-12-21 14:30:07 -0800429 void onPropertySubscribe(int property, float sampleRate, int zones);
Keun-young Park28dd4702015-11-19 18:06:04 -0800430 void onPropertyUnsubscribe(int property);
431 }
432
433 private class VehicleHalMock implements VehicleNetworkHalMock {
434 private LinkedList<VehiclePropConfig> mConfigs = new LinkedList<>();
435 private HashMap<Integer, VehiclePropertyHandler> mHandlers = new HashMap<>();
436
437 public synchronized void registerProperty(VehiclePropConfig config,
438 VehiclePropertyHandler handler) {
439 int property = config.getProp();
440 mConfigs.add(config);
441 mHandlers.put(property, handler);
442 }
443
444 @Override
445 public synchronized VehiclePropConfigs onListProperties() {
446 Log.i(TAG, "onListProperties, num properties:" + mConfigs.size());
447 VehiclePropConfigs configs =
448 VehiclePropConfigs.newBuilder().addAllConfigs(mConfigs).build();
449 return configs;
450 }
451
452 @Override
453 public void onPropertySet(VehiclePropValue value) {
454 int property = value.getProp();
455 VehiclePropertyHandler handler = getPropertyHandler(property);
456 if (handler == null) {
457 fail("onPropertySet for unknown property " + Integer.toHexString(property));
458 }
459 handler.onPropertySet(value);
460 }
461
462 @Override
463 public VehiclePropValue onPropertyGet(VehiclePropValue value) {
464 int property = value.getProp();
465 VehiclePropertyHandler handler = getPropertyHandler(property);
466 if (handler == null) {
467 fail("onPropertyGet for unknown property " + Integer.toHexString(property));
468 }
Pavel Maltseve8f75372016-01-26 10:26:04 -0800469 VehiclePropValue propValue = handler.onPropertyGet(value);
470 return propValue;
Keun-young Park28dd4702015-11-19 18:06:04 -0800471 }
472
473 @Override
Keun-young Park0727f952015-12-21 14:30:07 -0800474 public void onPropertySubscribe(int property, float sampleRate, int zones) {
Keun-young Park28dd4702015-11-19 18:06:04 -0800475 VehiclePropertyHandler handler = getPropertyHandler(property);
476 if (handler == null) {
477 fail("onPropertySubscribe for unknown property " + Integer.toHexString(property));
478 }
Keun-young Park0727f952015-12-21 14:30:07 -0800479 handler.onPropertySubscribe(property, sampleRate, zones);
Keun-young Park28dd4702015-11-19 18:06:04 -0800480 }
481
482 @Override
483 public void onPropertyUnsubscribe(int property) {
484 VehiclePropertyHandler handler = getPropertyHandler(property);
485 if (handler == null) {
486 fail("onPropertyUnsubscribe for unknown property " + Integer.toHexString(property));
487 }
488 handler.onPropertyUnsubscribe(property);
489 }
490
491 public synchronized VehiclePropertyHandler getPropertyHandler(int property) {
492 return mHandlers.get(property);
493 }
494 }
495
496 private class DefaultVehiclePropertyHandler implements VehiclePropertyHandler {
Pavel Maltseve8f75372016-01-26 10:26:04 -0800497 private Map<Integer, VehiclePropValue> mZoneValueMap = new HashMap<>();
Keun-young Park28dd4702015-11-19 18:06:04 -0800498
499 DefaultVehiclePropertyHandler(VehiclePropValue initialValue) {
Pavel Maltseve8f75372016-01-26 10:26:04 -0800500 setValue(initialValue);
Keun-young Park28dd4702015-11-19 18:06:04 -0800501 }
502
503 @Override
504 public void onPropertySet(VehiclePropValue value) {
Pavel Maltseve8f75372016-01-26 10:26:04 -0800505 setValue(value);
Keun-young Park28dd4702015-11-19 18:06:04 -0800506 }
507
508 @Override
509 public synchronized VehiclePropValue onPropertyGet(VehiclePropValue property) {
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800510 int zone = property.getZone();
Pavel Maltseve8f75372016-01-26 10:26:04 -0800511 VehiclePropValue value = mZoneValueMap.get(zone);
512 if (value == null) {
513 Log.w(TAG, "Property not found: " + property.getProp() + ", zone: " + zone);
514 }
515 return value;
Keun-young Park28dd4702015-11-19 18:06:04 -0800516 }
517
518 @Override
Keun-young Park0727f952015-12-21 14:30:07 -0800519 public void onPropertySubscribe(int property, float sampleRate, int zones) {
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800520 Log.i(TAG, "Property subscribed:0x" + Integer.toHexString(property) +
521 " zones:0x" + Integer.toHexString(zones));
Keun-young Park28dd4702015-11-19 18:06:04 -0800522 }
523
524 @Override
525 public void onPropertyUnsubscribe(int property) {
526 // TODO Auto-generated method stub
527 }
Pavel Maltseve8f75372016-01-26 10:26:04 -0800528
529 private void setValue(VehiclePropValue value) {
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800530 mZoneValueMap.put(value.getZone(), VehiclePropValue.newBuilder(value).build());
Pavel Maltseve8f75372016-01-26 10:26:04 -0800531 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800532 }
533}