1 /* 2 * Copyright (C) 2017 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 */ 16 17 package com.android.car; 18 19 import static org.junit.Assert.assertEquals; 20 import static org.junit.Assert.assertFalse; 21 import static org.junit.Assert.assertTrue; 22 23 import android.car.Car; 24 import android.car.VehicleAreaType; 25 import android.car.vms.VmsAssociatedLayer; 26 import android.car.vms.VmsAvailableLayers; 27 import android.car.vms.VmsLayer; 28 import android.car.vms.VmsSubscriberManager; 29 import android.car.vms.VmsSubscriberManager.VmsSubscriberClientCallback; 30 import android.hardware.automotive.vehicle.V2_0.VehiclePropValue; 31 import android.hardware.automotive.vehicle.V2_0.VehicleProperty; 32 import android.hardware.automotive.vehicle.V2_0.VehiclePropertyAccess; 33 import android.hardware.automotive.vehicle.V2_0.VehiclePropertyChangeMode; 34 import android.hardware.automotive.vehicle.V2_0.VmsAvailabilityStateIntegerValuesIndex; 35 import android.hardware.automotive.vehicle.V2_0.VmsMessageType; 36 import android.os.SystemClock; 37 import android.support.test.filters.MediumTest; 38 import android.support.test.runner.AndroidJUnit4; 39 import android.util.Log; 40 41 import com.android.car.vehiclehal.VehiclePropValueBuilder; 42 import com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler; 43 44 import org.junit.Test; 45 import org.junit.runner.RunWith; 46 47 import java.util.ArrayList; 48 import java.util.Arrays; 49 import java.util.HashSet; 50 import java.util.Set; 51 import java.util.concurrent.Executor; 52 import java.util.concurrent.Semaphore; 53 import java.util.concurrent.TimeUnit; 54 55 @RunWith(AndroidJUnit4.class) 56 @MediumTest 57 public class VmsSubscriberManagerTest extends MockedCarTestBase { 58 private static final String TAG = "VmsSubscriberManagerTest"; 59 private static final int PUBLISHER_ID = 17; 60 private static final int WRONG_PUBLISHER_ID = 26; 61 private static final Set<Integer> PUBLISHERS_LIST = new HashSet<Integer>(Arrays.asList(PUBLISHER_ID)); 62 63 private static final int SUBSCRIPTION_LAYER_ID = 2; 64 private static final int SUBSCRIPTION_LAYER_VERSION = 3; 65 private static final int MOCK_PUBLISHER_LAYER_SUBTYPE = 444; 66 private static final VmsLayer SUBSCRIPTION_LAYER = new VmsLayer(SUBSCRIPTION_LAYER_ID, 67 MOCK_PUBLISHER_LAYER_SUBTYPE, 68 SUBSCRIPTION_LAYER_VERSION); 69 private static final VmsAssociatedLayer SUBSCRIPTION_ASSOCIATED_LAYER = 70 new VmsAssociatedLayer(SUBSCRIPTION_LAYER, PUBLISHERS_LIST); 71 72 private static final int SUBSCRIPTION_DEPENDANT_LAYER_ID_1 = 4; 73 private static final int SUBSCRIPTION_DEPENDANT_LAYER_VERSION_1 = 5; 74 private static final VmsLayer SUBSCRIPTION_DEPENDANT_LAYER_1 = 75 new VmsLayer(SUBSCRIPTION_DEPENDANT_LAYER_ID_1, 76 MOCK_PUBLISHER_LAYER_SUBTYPE, 77 SUBSCRIPTION_DEPENDANT_LAYER_VERSION_1); 78 79 private static final VmsAssociatedLayer SUBSCRIPTION_DEPENDANT_ASSOCIATED_LAYER_1 = 80 new VmsAssociatedLayer(SUBSCRIPTION_DEPENDANT_LAYER_1, PUBLISHERS_LIST); 81 82 private static final int SUBSCRIPTION_DEPENDANT_LAYER_ID_2 = 6; 83 private static final int SUBSCRIPTION_DEPENDANT_LAYER_VERSION_2 = 7; 84 private static final VmsLayer SUBSCRIPTION_DEPENDANT_LAYER_2 = 85 new VmsLayer(SUBSCRIPTION_DEPENDANT_LAYER_ID_2, 86 MOCK_PUBLISHER_LAYER_SUBTYPE, 87 SUBSCRIPTION_DEPENDANT_LAYER_VERSION_2); 88 89 private static final VmsAssociatedLayer SUBSCRIPTION_DEPENDANT_ASSOCIATED_LAYER_2 = 90 new VmsAssociatedLayer(SUBSCRIPTION_DEPENDANT_LAYER_2, PUBLISHERS_LIST); 91 92 private static final int SUBSCRIPTION_UNSUPPORTED_LAYER_ID = 100; 93 private static final int SUBSCRIPTION_UNSUPPORTED_LAYER_VERSION = 200; 94 95 96 private HalHandler mHalHandler; 97 // Used to block until the HAL property is updated in HalHandler.onPropertySet. 98 private Semaphore mHalHandlerSemaphore; 99 // Used to block until a value is propagated to the TestClientCallback.onVmsMessageReceived. 100 private Semaphore mSubscriberSemaphore; 101 private Executor mExecutor; 102 103 private class ThreadPerTaskExecutor implements Executor { 104 public void execute(Runnable r) { 105 new Thread(r).start(); 106 } 107 } 108 109 110 @Override 111 protected synchronized void configureMockedHal() { 112 mHalHandler = new HalHandler(); 113 addProperty(VehicleProperty.VEHICLE_MAP_SERVICE, mHalHandler) 114 .setChangeMode(VehiclePropertyChangeMode.ON_CHANGE) 115 .setAccess(VehiclePropertyAccess.READ_WRITE) 116 .addAreaConfig(VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL, 0, 0); 117 } 118 119 @Override 120 public void setUp() throws Exception { 121 mExecutor = new ThreadPerTaskExecutor(); 122 super.setUp(); 123 mSubscriberSemaphore = new Semaphore(0); 124 mHalHandlerSemaphore = new Semaphore(0); 125 } 126 127 // Test injecting a value in the HAL and verifying it propagates to a subscriber. 128 @Test 129 public void testSubscribe() throws Exception { 130 VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager( 131 Car.VMS_SUBSCRIBER_SERVICE); 132 TestClientCallback clientCallback = new TestClientCallback(); 133 vmsSubscriberManager.setVmsSubscriberClientCallback(mExecutor, clientCallback); 134 vmsSubscriberManager.subscribe(SUBSCRIPTION_LAYER); 135 136 // Inject a value and wait for its callback in TestClientCallback.onVmsMessageReceived. 137 VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE) 138 .setAreaId(VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL) 139 .setTimestamp(SystemClock.elapsedRealtimeNanos()) 140 .build(); 141 v.value.int32Values.add(VmsMessageType.DATA); // MessageType 142 v.value.int32Values.add(SUBSCRIPTION_LAYER_ID); 143 v.value.int32Values.add(MOCK_PUBLISHER_LAYER_SUBTYPE); 144 v.value.int32Values.add(SUBSCRIPTION_LAYER_VERSION); 145 v.value.int32Values.add(PUBLISHER_ID); 146 v.value.bytes.add((byte) 0xa); 147 v.value.bytes.add((byte) 0xb); 148 assertEquals(0, mSubscriberSemaphore.availablePermits()); 149 150 getMockedVehicleHal().injectEvent(v); 151 assertTrue(mSubscriberSemaphore.tryAcquire(2L, TimeUnit.SECONDS)); 152 assertEquals(SUBSCRIPTION_LAYER, clientCallback.getLayer()); 153 byte[] expectedPayload = {(byte) 0xa, (byte) 0xb}; 154 assertTrue(Arrays.equals(expectedPayload, clientCallback.getPayload())); 155 } 156 157 // Test injecting a value in the HAL and verifying it propagates to a subscriber. 158 @Test 159 public void testSubscribeToPublisher() throws Exception { 160 VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager( 161 Car.VMS_SUBSCRIBER_SERVICE); 162 TestClientCallback clientCallback = new TestClientCallback(); 163 vmsSubscriberManager.setVmsSubscriberClientCallback(mExecutor, clientCallback); 164 vmsSubscriberManager.subscribe(SUBSCRIPTION_LAYER, PUBLISHER_ID); 165 166 // Inject a value and wait for its callback in TestClientCallback.onVmsMessageReceived. 167 VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE) 168 .setAreaId(VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL) 169 .setTimestamp(SystemClock.elapsedRealtimeNanos()) 170 .build(); 171 v.value.int32Values.add(VmsMessageType.DATA); // MessageType 172 v.value.int32Values.add(SUBSCRIPTION_LAYER_ID); 173 v.value.int32Values.add(MOCK_PUBLISHER_LAYER_SUBTYPE); 174 v.value.int32Values.add(SUBSCRIPTION_LAYER_VERSION); 175 v.value.int32Values.add(WRONG_PUBLISHER_ID); 176 v.value.bytes.add((byte) 0xa); 177 v.value.bytes.add((byte) 0xb); 178 assertEquals(0, mSubscriberSemaphore.availablePermits()); 179 180 getMockedVehicleHal().injectEvent(v); 181 182 assertFalse(mSubscriberSemaphore.tryAcquire(2L, TimeUnit.SECONDS)); 183 } 184 185 // Test injecting a value in the HAL and verifying it propagates to a subscriber. 186 @Test 187 public void testSubscribeFromPublisher() throws Exception { 188 VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager( 189 Car.VMS_SUBSCRIBER_SERVICE); 190 TestClientCallback clientCallback = new TestClientCallback(); 191 vmsSubscriberManager.setVmsSubscriberClientCallback(mExecutor, clientCallback); 192 vmsSubscriberManager.subscribe(SUBSCRIPTION_LAYER, PUBLISHER_ID); 193 194 // Inject a value and wait for its callback in TestClientCallback.onVmsMessageReceived. 195 VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE) 196 .setAreaId(VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL) 197 .setTimestamp(SystemClock.elapsedRealtimeNanos()) 198 .build(); 199 v.value.int32Values.add(VmsMessageType.DATA); // MessageType 200 v.value.int32Values.add(SUBSCRIPTION_LAYER_ID); 201 v.value.int32Values.add(MOCK_PUBLISHER_LAYER_SUBTYPE); //<- 202 v.value.int32Values.add(SUBSCRIPTION_LAYER_VERSION); 203 v.value.int32Values.add(PUBLISHER_ID); 204 v.value.bytes.add((byte) 0xa); 205 v.value.bytes.add((byte) 0xb); 206 assertEquals(0, mSubscriberSemaphore.availablePermits()); 207 208 getMockedVehicleHal().injectEvent(v); 209 assertTrue(mSubscriberSemaphore.tryAcquire(2L, TimeUnit.SECONDS)); 210 assertEquals(SUBSCRIPTION_LAYER, clientCallback.getLayer()); 211 byte[] expectedPayload = {(byte) 0xa, (byte) 0xb}; 212 assertTrue(Arrays.equals(expectedPayload, clientCallback.getPayload())); 213 } 214 215 // Test injecting a value in the HAL and verifying it does not propagate to a subscriber. 216 @Test 217 public void testUnsubscribe() throws Exception { 218 VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager( 219 Car.VMS_SUBSCRIBER_SERVICE); 220 TestClientCallback clientCallback = new TestClientCallback(); 221 vmsSubscriberManager.setVmsSubscriberClientCallback(mExecutor, clientCallback); 222 vmsSubscriberManager.subscribe(SUBSCRIPTION_LAYER); 223 vmsSubscriberManager.unsubscribe(SUBSCRIPTION_LAYER); 224 225 // Inject a value and wait for its callback in TestClientCallback.onVmsMessageReceived. 226 VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE) 227 .setAreaId(VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL) 228 .setTimestamp(SystemClock.elapsedRealtimeNanos()) 229 .build(); 230 v.value.int32Values.add(VmsMessageType.DATA); // MessageType 231 v.value.int32Values.add(SUBSCRIPTION_LAYER_ID); 232 v.value.int32Values.add(MOCK_PUBLISHER_LAYER_SUBTYPE); 233 v.value.int32Values.add(SUBSCRIPTION_LAYER_VERSION); 234 v.value.int32Values.add(PUBLISHER_ID); 235 v.value.bytes.add((byte) 0xa); 236 v.value.bytes.add((byte) 0xb); 237 assertEquals(0, mSubscriberSemaphore.availablePermits()); 238 239 getMockedVehicleHal().injectEvent(v); 240 assertFalse(mSubscriberSemaphore.tryAcquire(2L, TimeUnit.SECONDS)); 241 } 242 243 // Test injecting a value in the HAL and verifying it does not propagate to a subscriber. 244 @Test 245 public void testSubscribeFromWrongPublisher() throws Exception { 246 VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager( 247 Car.VMS_SUBSCRIBER_SERVICE); 248 TestClientCallback clientCallback = new TestClientCallback(); 249 vmsSubscriberManager.setVmsSubscriberClientCallback(mExecutor, clientCallback); 250 vmsSubscriberManager.subscribe(SUBSCRIPTION_LAYER, PUBLISHER_ID); 251 252 // Inject a value and wait for its callback in TestClientCallback.onVmsMessageReceived. 253 VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE) 254 .setAreaId(VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL) 255 .setTimestamp(SystemClock.elapsedRealtimeNanos()) 256 .build(); 257 v.value.int32Values.add(VmsMessageType.DATA); // MessageType 258 v.value.int32Values.add(SUBSCRIPTION_LAYER_ID); 259 v.value.int32Values.add(MOCK_PUBLISHER_LAYER_SUBTYPE); 260 v.value.int32Values.add(SUBSCRIPTION_LAYER_VERSION); 261 v.value.int32Values.add(WRONG_PUBLISHER_ID); 262 v.value.bytes.add((byte) 0xa); 263 v.value.bytes.add((byte) 0xb); 264 assertEquals(0, mSubscriberSemaphore.availablePermits()); 265 266 getMockedVehicleHal().injectEvent(v); 267 assertFalse(mSubscriberSemaphore.tryAcquire(2L, TimeUnit.SECONDS)); 268 } 269 270 // Test injecting a value in the HAL and verifying it does not propagate to a subscriber. 271 @Test 272 public void testUnsubscribeFromPublisher() throws Exception { 273 VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager( 274 Car.VMS_SUBSCRIBER_SERVICE); 275 TestClientCallback clientCallback = new TestClientCallback(); 276 vmsSubscriberManager.setVmsSubscriberClientCallback(mExecutor, clientCallback); 277 vmsSubscriberManager.subscribe(SUBSCRIPTION_LAYER, PUBLISHER_ID); 278 vmsSubscriberManager.unsubscribe(SUBSCRIPTION_LAYER, PUBLISHER_ID); 279 280 // Inject a value and wait for its callback in TestClientCallback.onVmsMessageReceived. 281 VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE) 282 .setAreaId(VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL) 283 .setTimestamp(SystemClock.elapsedRealtimeNanos()) 284 .build(); 285 v.value.int32Values.add(VmsMessageType.DATA); // MessageType 286 v.value.int32Values.add(SUBSCRIPTION_LAYER_ID); 287 v.value.int32Values.add(MOCK_PUBLISHER_LAYER_SUBTYPE); 288 v.value.int32Values.add(SUBSCRIPTION_LAYER_VERSION); 289 v.value.int32Values.add(PUBLISHER_ID); 290 v.value.bytes.add((byte) 0xa); 291 v.value.bytes.add((byte) 0xb); 292 assertEquals(0, mSubscriberSemaphore.availablePermits()); 293 294 getMockedVehicleHal().injectEvent(v); 295 assertFalse(mSubscriberSemaphore.tryAcquire(2L, TimeUnit.SECONDS)); 296 } 297 298 // Test injecting a value in the HAL and verifying it propagates to a subscriber. 299 @Test 300 public void testSubscribeAll() throws Exception { 301 VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager( 302 Car.VMS_SUBSCRIBER_SERVICE); 303 TestClientCallback clientCallback = new TestClientCallback(); 304 vmsSubscriberManager.setVmsSubscriberClientCallback(mExecutor, clientCallback); 305 vmsSubscriberManager.startMonitoring(); 306 307 // Inject a value and wait for its callback in TestClientCallback.onVmsMessageReceived. 308 VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE) 309 .setAreaId(VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL) 310 .setTimestamp(SystemClock.elapsedRealtimeNanos()) 311 .build(); 312 v.value.int32Values.add(VmsMessageType.DATA); // MessageType 313 v.value.int32Values.add(SUBSCRIPTION_LAYER_ID); 314 v.value.int32Values.add(MOCK_PUBLISHER_LAYER_SUBTYPE); 315 v.value.int32Values.add(SUBSCRIPTION_LAYER_VERSION); 316 v.value.int32Values.add(PUBLISHER_ID); 317 v.value.bytes.add((byte) 0xa); 318 v.value.bytes.add((byte) 0xb); 319 assertEquals(0, mSubscriberSemaphore.availablePermits()); 320 321 getMockedVehicleHal().injectEvent(v); 322 assertTrue(mSubscriberSemaphore.tryAcquire(2L, TimeUnit.SECONDS)); 323 assertEquals(SUBSCRIPTION_LAYER, clientCallback.getLayer()); 324 byte[] expectedPayload = {(byte) 0xa, (byte) 0xb}; 325 assertTrue(Arrays.equals(expectedPayload, clientCallback.getPayload())); 326 } 327 328 // Test injecting a value in the HAL and verifying it propagates to a subscriber. 329 @Test 330 public void testSimpleAvailableLayers() throws Exception { 331 VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager( 332 Car.VMS_SUBSCRIBER_SERVICE); 333 TestClientCallback clientCallback = new TestClientCallback(); 334 vmsSubscriberManager.setVmsSubscriberClientCallback(mExecutor, clientCallback); 335 336 // Inject a value and wait for its callback in TestClientCallback.onLayersAvailabilityChanged. 337 VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE) 338 .setAreaId(VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL) 339 .setTimestamp(SystemClock.elapsedRealtimeNanos()) 340 .build(); 341 // 342 // Offering: 343 // Layer | Dependency 344 // =============================== 345 // (2, 3, 444), [17] | {} 346 347 // Expected availability: 348 // {(2, 3, 444 [17])} 349 // 350 v.value.int32Values.addAll( 351 Arrays.asList( 352 VmsMessageType.OFFERING, // MessageType 353 PUBLISHER_ID, 354 1, // Number of offered layers 355 356 SUBSCRIPTION_LAYER_ID, 357 MOCK_PUBLISHER_LAYER_SUBTYPE, 358 SUBSCRIPTION_LAYER_VERSION, 359 0 // number of dependencies for layer 360 ) 361 ); 362 363 assertEquals(0, mSubscriberSemaphore.availablePermits()); 364 365 getMockedVehicleHal().injectEvent(v); 366 assertTrue(mSubscriberSemaphore.tryAcquire(2L, TimeUnit.SECONDS)); 367 Set<VmsAssociatedLayer> associatedLayers = 368 new HashSet<>(Arrays.asList(SUBSCRIPTION_ASSOCIATED_LAYER)); 369 assertEquals(associatedLayers, clientCallback.getAvailableLayers().getAssociatedLayers()); 370 } 371 372 // Test injecting a value in the HAL and verifying it propagates to a subscriber after it has 373 // subscribed to a layer. 374 @Test 375 public void testSimpleAvailableLayersAfterSubscription() throws Exception { 376 VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager( 377 Car.VMS_SUBSCRIBER_SERVICE); 378 TestClientCallback clientCallback = new TestClientCallback(); 379 vmsSubscriberManager.setVmsSubscriberClientCallback(mExecutor, clientCallback); 380 vmsSubscriberManager.subscribe(SUBSCRIPTION_LAYER); 381 382 // Inject a value and wait for its callback in TestClientCallback.onLayersAvailabilityChanged. 383 VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE) 384 .setAreaId(VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL) 385 .setTimestamp(SystemClock.elapsedRealtimeNanos()) 386 .build(); 387 // 388 // Offering: 389 // Layer | Dependency 390 // =============================== 391 // (2, 3, 444), [17] | {} 392 393 // Expected availability: 394 // {(2, 3, 444 [17])} 395 // 396 v.value.int32Values.addAll( 397 Arrays.asList( 398 VmsMessageType.OFFERING, // MessageType 399 PUBLISHER_ID, 400 1, // Number of offered layers 401 402 SUBSCRIPTION_LAYER_ID, 403 MOCK_PUBLISHER_LAYER_SUBTYPE, 404 SUBSCRIPTION_LAYER_VERSION, 405 0 // number of dependencies for layer 406 ) 407 ); 408 409 assertEquals(0, mSubscriberSemaphore.availablePermits()); 410 411 getMockedVehicleHal().injectEvent(v); 412 assertTrue(mSubscriberSemaphore.tryAcquire(2L, TimeUnit.SECONDS)); 413 Set<VmsAssociatedLayer> associatedLayers = 414 new HashSet<>(Arrays.asList(SUBSCRIPTION_ASSOCIATED_LAYER)); 415 assertEquals(associatedLayers, clientCallback.getAvailableLayers().getAssociatedLayers()); 416 } 417 418 // Test injecting a value in the HAL and verifying it does not propagates to a subscriber after 419 // it has cleared its callback. 420 @Test 421 public void testSimpleAvailableLayersAfterClear() throws Exception { 422 VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager( 423 Car.VMS_SUBSCRIBER_SERVICE); 424 TestClientCallback clientCallback = new TestClientCallback(); 425 vmsSubscriberManager.setVmsSubscriberClientCallback(mExecutor, clientCallback); 426 vmsSubscriberManager.clearVmsSubscriberClientCallback(); 427 428 429 // Inject a value and wait for its callback in TestClientCallback.onLayersAvailabilityChanged. 430 VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE) 431 .setAreaId(VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL) 432 .setTimestamp(SystemClock.elapsedRealtimeNanos()) 433 .build(); 434 // 435 // Offering: 436 // Layer | Dependency 437 // =============================== 438 // (2, 3, 444), [17] | {} 439 440 // Expected availability: 441 // {(2, 3, 444 [17])} 442 // 443 v.value.int32Values.addAll( 444 Arrays.asList( 445 VmsMessageType.OFFERING, // MessageType 446 PUBLISHER_ID, 447 1, // Number of offered layers 448 449 SUBSCRIPTION_LAYER_ID, 450 SUBSCRIPTION_LAYER_VERSION, 451 MOCK_PUBLISHER_LAYER_SUBTYPE, 452 0 // number of dependencies for layer 453 ) 454 ); 455 456 assertEquals(0, mSubscriberSemaphore.availablePermits()); 457 getMockedVehicleHal().injectEvent(v); 458 assertFalse(mSubscriberSemaphore.tryAcquire(2L, TimeUnit.SECONDS)); 459 } 460 461 // Test injecting a value in the HAL and verifying it propagates to a subscriber. 462 @Test 463 public void testComplexAvailableLayers() throws Exception { 464 VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager( 465 Car.VMS_SUBSCRIBER_SERVICE); 466 TestClientCallback clientCallback = new TestClientCallback(); 467 vmsSubscriberManager.setVmsSubscriberClientCallback(mExecutor, clientCallback); 468 469 // Inject a value and wait for its callback in TestClientCallback.onLayersAvailabilityChanged. 470 VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE) 471 .setAreaId(VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL) 472 .setTimestamp(SystemClock.elapsedRealtimeNanos()) 473 .build(); 474 // 475 // Offering: 476 // Layer | Dependency 477 // ===================================== 478 // (2, 3, 444), [17] | {} 479 // (4, 5, 444), [17] | {(2, 3)} 480 // (6, 7, 444), [17] | {(2, 3), (4, 5)} 481 // (6, 7, 444), [17] | {(100, 200)} 482 483 // Expected availability: 484 // {(2, 3, 444 [17]), (4, 5, 444 [17]), (6, 7, 444 [17])} 485 // 486 487 v.value.int32Values.addAll( 488 Arrays.asList( 489 VmsMessageType.OFFERING, // MessageType 490 PUBLISHER_ID, 491 4, // Number of offered layers 492 493 SUBSCRIPTION_LAYER_ID, 494 MOCK_PUBLISHER_LAYER_SUBTYPE, 495 SUBSCRIPTION_LAYER_VERSION, 496 0, // number of dependencies for layer 497 498 SUBSCRIPTION_DEPENDANT_LAYER_ID_1, 499 MOCK_PUBLISHER_LAYER_SUBTYPE, 500 SUBSCRIPTION_DEPENDANT_LAYER_VERSION_1, 501 1, // number of dependencies for layer 502 SUBSCRIPTION_LAYER_ID, 503 MOCK_PUBLISHER_LAYER_SUBTYPE, 504 SUBSCRIPTION_LAYER_VERSION, 505 506 SUBSCRIPTION_DEPENDANT_LAYER_ID_2, 507 MOCK_PUBLISHER_LAYER_SUBTYPE, 508 SUBSCRIPTION_DEPENDANT_LAYER_VERSION_2, 509 2, // number of dependencies for layer 510 SUBSCRIPTION_LAYER_ID, 511 MOCK_PUBLISHER_LAYER_SUBTYPE, 512 SUBSCRIPTION_LAYER_VERSION, 513 SUBSCRIPTION_DEPENDANT_LAYER_ID_1, 514 MOCK_PUBLISHER_LAYER_SUBTYPE, 515 SUBSCRIPTION_DEPENDANT_LAYER_VERSION_1, 516 517 SUBSCRIPTION_DEPENDANT_LAYER_ID_2, 518 MOCK_PUBLISHER_LAYER_SUBTYPE, 519 SUBSCRIPTION_DEPENDANT_LAYER_VERSION_2, 520 1, // number of dependencies for layer 521 SUBSCRIPTION_UNSUPPORTED_LAYER_ID, 522 MOCK_PUBLISHER_LAYER_SUBTYPE, 523 SUBSCRIPTION_UNSUPPORTED_LAYER_VERSION 524 ) 525 ); 526 527 assertEquals(0, mSubscriberSemaphore.availablePermits()); 528 529 Set<VmsAssociatedLayer> associatedLayers = 530 new HashSet<>(Arrays.asList( 531 SUBSCRIPTION_ASSOCIATED_LAYER, 532 SUBSCRIPTION_DEPENDANT_ASSOCIATED_LAYER_1, 533 SUBSCRIPTION_DEPENDANT_ASSOCIATED_LAYER_2 534 )); 535 536 getMockedVehicleHal().injectEvent(v); 537 assertTrue(mSubscriberSemaphore.tryAcquire(2L, TimeUnit.SECONDS)); 538 539 // Verify applications API. 540 assertEquals(associatedLayers, clientCallback.getAvailableLayers().getAssociatedLayers()); 541 assertEquals(1, clientCallback.getAvailableLayers().getSequence()); 542 543 // Verify HAL API. 544 ArrayList<Integer> values = mHalHandler.getValue().value.int32Values; 545 int messageType = values.get(VmsAvailabilityStateIntegerValuesIndex.MESSAGE_TYPE); 546 int sequenceNumber = values.get(VmsAvailabilityStateIntegerValuesIndex.SEQUENCE_NUMBER); 547 int numberLayers = 548 values.get(VmsAvailabilityStateIntegerValuesIndex.NUMBER_OF_ASSOCIATED_LAYERS); 549 550 assertEquals(messageType, VmsMessageType.AVAILABILITY_CHANGE); 551 assertEquals(1, sequenceNumber); 552 assertEquals(3, numberLayers); 553 } 554 555 // Test injecting a value in the HAL twice the sequence for availability is incremented. 556 @Test 557 public void testDoubleOfferingAvailableLayers() throws Exception { 558 VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager( 559 Car.VMS_SUBSCRIBER_SERVICE); 560 TestClientCallback clientCallback = new TestClientCallback(); 561 vmsSubscriberManager.setVmsSubscriberClientCallback(mExecutor, clientCallback); 562 563 // Inject a value and wait for its callback in TestClientCallback.onLayersAvailabilityChanged. 564 VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE) 565 .setAreaId(VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL) 566 .setTimestamp(SystemClock.elapsedRealtimeNanos()) 567 .build(); 568 // 569 // Offering: 570 // Layer | Dependency 571 // =============================== 572 // (2, 3, 444), [17] | {} 573 574 // Expected availability: 575 // {(2, 3, 444 [17])} 576 // 577 v.value.int32Values.addAll( 578 Arrays.asList( 579 VmsMessageType.OFFERING, // MessageType 580 PUBLISHER_ID, 581 1, // Number of offered layers 582 583 SUBSCRIPTION_LAYER_ID, 584 MOCK_PUBLISHER_LAYER_SUBTYPE, 585 SUBSCRIPTION_LAYER_VERSION, 586 0 // number of dependencies for layer 587 ) 588 ); 589 590 assertEquals(0, mSubscriberSemaphore.availablePermits()); 591 592 // Inject first offer. 593 getMockedVehicleHal().injectEvent(v); 594 assertTrue(mSubscriberSemaphore.tryAcquire(2L, TimeUnit.SECONDS)); 595 596 // Verify applications API. 597 Set<VmsAssociatedLayer> associatedLayers = 598 new HashSet<>(Arrays.asList(SUBSCRIPTION_ASSOCIATED_LAYER)); 599 assertEquals(associatedLayers, clientCallback.getAvailableLayers().getAssociatedLayers()); 600 assertEquals(1, clientCallback.getAvailableLayers().getSequence()); 601 602 // Verify HAL API. 603 ArrayList<Integer> values = mHalHandler.getValue().value.int32Values; 604 int messageType = values.get(VmsAvailabilityStateIntegerValuesIndex.MESSAGE_TYPE); 605 int sequenceNumber = values.get(VmsAvailabilityStateIntegerValuesIndex.SEQUENCE_NUMBER); 606 int numberLayers = 607 values.get(VmsAvailabilityStateIntegerValuesIndex.NUMBER_OF_ASSOCIATED_LAYERS); 608 609 assertEquals(messageType, VmsMessageType.AVAILABILITY_CHANGE); 610 assertEquals(1, sequenceNumber); 611 assertEquals(1, numberLayers); 612 613 // Inject second offer. 614 getMockedVehicleHal().injectEvent(v); 615 assertTrue(mSubscriberSemaphore.tryAcquire(2L, TimeUnit.SECONDS)); 616 617 // Verify applications API. 618 assertEquals(2, clientCallback.getAvailableLayers().getSequence()); 619 620 // Verify HAL API. 621 values = mHalHandler.getValue().value.int32Values; 622 messageType = values.get(VmsAvailabilityStateIntegerValuesIndex.MESSAGE_TYPE); 623 sequenceNumber = values.get(VmsAvailabilityStateIntegerValuesIndex.SEQUENCE_NUMBER); 624 numberLayers = 625 values.get(VmsAvailabilityStateIntegerValuesIndex.NUMBER_OF_ASSOCIATED_LAYERS); 626 627 assertEquals(messageType, VmsMessageType.AVAILABILITY_CHANGE); 628 assertEquals(2, sequenceNumber); 629 assertEquals(1, numberLayers); 630 631 } 632 633 // Test GetAvailableLayers(). 634 @Test 635 public void testGetAvailableLayers() throws Exception { 636 VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager( 637 Car.VMS_SUBSCRIBER_SERVICE); 638 TestClientCallback clientCallback = new TestClientCallback(); 639 vmsSubscriberManager.setVmsSubscriberClientCallback(mExecutor, clientCallback); 640 641 // Inject a value and wait for its callback in TestClientCallback.onLayersAvailabilityChanged. 642 VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE) 643 .setAreaId(VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL) 644 .setTimestamp(SystemClock.elapsedRealtimeNanos()) 645 .build(); 646 // 647 // Offering: 648 // Layer | Dependency 649 // =============================== 650 // (2, 3, 444), [17] | {} 651 652 // Expected availability: 653 // {(2, 3, 444 [17])} 654 // 655 v.value.int32Values.addAll( 656 Arrays.asList( 657 VmsMessageType.OFFERING, // MessageType 658 PUBLISHER_ID, 659 1, // Number of offered layers 660 661 SUBSCRIPTION_LAYER_ID, 662 MOCK_PUBLISHER_LAYER_SUBTYPE, 663 SUBSCRIPTION_LAYER_VERSION, 664 0 // number of dependencies for layer 665 ) 666 ); 667 668 assertEquals(0, mSubscriberSemaphore.availablePermits()); 669 670 getMockedVehicleHal().injectEvent(v); 671 assertTrue(mSubscriberSemaphore.tryAcquire(2L, TimeUnit.SECONDS)); 672 Set<VmsAssociatedLayer> associatedLayers = 673 new HashSet<>(Arrays.asList(SUBSCRIPTION_ASSOCIATED_LAYER)); 674 assertEquals(associatedLayers, clientCallback.getAvailableLayers().getAssociatedLayers()); 675 assertEquals(1, clientCallback.getAvailableLayers().getSequence()); 676 677 assertEquals(associatedLayers, vmsSubscriberManager.getAvailableLayers().getAssociatedLayers()); 678 assertEquals(1, vmsSubscriberManager.getAvailableLayers().getSequence()); 679 } 680 681 private class HalHandler implements VehicleHalPropertyHandler { 682 private VehiclePropValue mValue; 683 684 @Override 685 public synchronized void onPropertySet(VehiclePropValue value) { 686 mValue = value; 687 mHalHandlerSemaphore.release(); 688 } 689 690 @Override 691 public synchronized VehiclePropValue onPropertyGet(VehiclePropValue value) { 692 return mValue != null ? mValue : value; 693 } 694 695 @Override 696 public synchronized void onPropertySubscribe(int property, float sampleRate) { 697 Log.d(TAG, "onPropertySubscribe property " + property + " sampleRate " + sampleRate); 698 } 699 700 @Override 701 public synchronized void onPropertyUnsubscribe(int property) { 702 Log.d(TAG, "onPropertyUnSubscribe property " + property); 703 } 704 705 public VehiclePropValue getValue() { 706 return mValue; 707 } 708 } 709 710 private class TestClientCallback implements VmsSubscriberClientCallback { 711 private VmsLayer mLayer; 712 private byte[] mPayload; 713 private VmsAvailableLayers mAvailableLayers; 714 715 @Override 716 public void onVmsMessageReceived(VmsLayer layer, byte[] payload) { 717 Log.d(TAG, "onVmsMessageReceived: layer: " + layer + " Payload: " + payload); 718 mLayer = layer; 719 mPayload = payload; 720 mSubscriberSemaphore.release(); 721 } 722 723 @Override 724 public void onLayersAvailabilityChanged(VmsAvailableLayers availableLayers) { 725 Log.d(TAG, "onLayersAvailabilityChanged: Layers: " + availableLayers); 726 mAvailableLayers = availableLayers; 727 mSubscriberSemaphore.release(); 728 } 729 730 public VmsLayer getLayer() { 731 return mLayer; 732 } 733 734 public byte[] getPayload() { 735 return mPayload; 736 } 737 738 public VmsAvailableLayers getAvailableLayers() { 739 return mAvailableLayers; 740 } 741 } 742 } 743