Home | History | Annotate | Download | only in car
      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