blob: 423718cf7caf786edca9cad11019d2a9bec4fd13 [file] [log] [blame]
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.car;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import android.car.vms.VmsAssociatedLayer;
import android.car.vms.VmsAvailableLayers;
import android.car.vms.VmsLayer;
import android.hardware.automotive.vehicle.V2_0.VmsAvailabilityStateIntegerValuesIndex;
import android.hardware.automotive.vehicle.V2_0.VmsMessageType;
import android.util.Pair;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.MediumTest;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
@RunWith(AndroidJUnit4.class)
@MediumTest
public class VmsSubscriberManagerTest extends MockedVmsTestBase {
private static final int PUBLISHER_ID = 17;
private static final int WRONG_PUBLISHER_ID = 26;
private static final Set<Integer> PUBLISHERS_LIST = Collections.singleton(PUBLISHER_ID);
private static final int SUBSCRIPTION_LAYER_ID = 2;
private static final int SUBSCRIPTION_LAYER_VERSION = 3;
private static final int MOCK_PUBLISHER_LAYER_SUBTYPE = 444;
private static final VmsLayer SUBSCRIPTION_LAYER = new VmsLayer(SUBSCRIPTION_LAYER_ID,
MOCK_PUBLISHER_LAYER_SUBTYPE,
SUBSCRIPTION_LAYER_VERSION);
private static final VmsAssociatedLayer SUBSCRIPTION_ASSOCIATED_LAYER =
new VmsAssociatedLayer(SUBSCRIPTION_LAYER, PUBLISHERS_LIST);
private static final int SUBSCRIPTION_DEPENDANT_LAYER_ID_1 = 4;
private static final int SUBSCRIPTION_DEPENDANT_LAYER_VERSION_1 = 5;
private static final VmsLayer SUBSCRIPTION_DEPENDANT_LAYER_1 =
new VmsLayer(SUBSCRIPTION_DEPENDANT_LAYER_ID_1,
MOCK_PUBLISHER_LAYER_SUBTYPE,
SUBSCRIPTION_DEPENDANT_LAYER_VERSION_1);
private static final VmsAssociatedLayer SUBSCRIPTION_DEPENDANT_ASSOCIATED_LAYER_1 =
new VmsAssociatedLayer(SUBSCRIPTION_DEPENDANT_LAYER_1, PUBLISHERS_LIST);
private static final int SUBSCRIPTION_DEPENDANT_LAYER_ID_2 = 6;
private static final int SUBSCRIPTION_DEPENDANT_LAYER_VERSION_2 = 7;
private static final VmsLayer SUBSCRIPTION_DEPENDANT_LAYER_2 =
new VmsLayer(SUBSCRIPTION_DEPENDANT_LAYER_ID_2,
MOCK_PUBLISHER_LAYER_SUBTYPE,
SUBSCRIPTION_DEPENDANT_LAYER_VERSION_2);
private static final VmsAssociatedLayer SUBSCRIPTION_DEPENDANT_ASSOCIATED_LAYER_2 =
new VmsAssociatedLayer(SUBSCRIPTION_DEPENDANT_LAYER_2, PUBLISHERS_LIST);
private static final int SUBSCRIPTION_UNSUPPORTED_LAYER_ID = 100;
private static final int SUBSCRIPTION_UNSUPPORTED_LAYER_VERSION = 200;
private static final byte[] PAYLOAD = {0xa, 0xb};
// Test injecting a value in the HAL and verifying it propagates to a subscriber.
@Test
public void testSubscribe() throws Exception {
getSubscriberManager().subscribe(SUBSCRIPTION_LAYER);
getMockHalClient().sendMessage(
new int[]{
VmsMessageType.DATA,
SUBSCRIPTION_LAYER_ID,
MOCK_PUBLISHER_LAYER_SUBTYPE,
SUBSCRIPTION_LAYER_VERSION,
PUBLISHER_ID
},
PAYLOAD);
Pair<VmsLayer, byte[]> message = getMockSubscriberClient().receiveMessage();
assertEquals(SUBSCRIPTION_LAYER, message.first);
assertArrayEquals(PAYLOAD, message.second);
}
// Test injecting a value in the HAL and verifying it propagates to a subscriber.
@Test
public void testSubscribeToPublisher() throws Exception {
getSubscriberManager().subscribe(SUBSCRIPTION_LAYER, PUBLISHER_ID);
getMockHalClient().sendMessage(
new int[]{
VmsMessageType.DATA,
SUBSCRIPTION_LAYER_ID,
MOCK_PUBLISHER_LAYER_SUBTYPE,
SUBSCRIPTION_LAYER_VERSION,
WRONG_PUBLISHER_ID
},
PAYLOAD);
assertNull(getMockSubscriberClient().receiveMessage());
}
// Test injecting a value in the HAL and verifying it propagates to a subscriber.
@Test
public void testSubscribeFromPublisher() throws Exception {
getSubscriberManager().subscribe(SUBSCRIPTION_LAYER, PUBLISHER_ID);
getMockHalClient().sendMessage(
new int[]{
VmsMessageType.DATA,
SUBSCRIPTION_LAYER_ID,
MOCK_PUBLISHER_LAYER_SUBTYPE,
SUBSCRIPTION_LAYER_VERSION,
PUBLISHER_ID
},
PAYLOAD);
Pair<VmsLayer, byte[]> message = getMockSubscriberClient().receiveMessage();
assertEquals(SUBSCRIPTION_LAYER, message.first);
assertArrayEquals(PAYLOAD, message.second);
}
// Test injecting a value in the HAL and verifying it does not propagate to a subscriber.
@Test
public void testUnsubscribe() throws Exception {
getSubscriberManager().subscribe(SUBSCRIPTION_LAYER);
getSubscriberManager().unsubscribe(SUBSCRIPTION_LAYER);
getMockHalClient().sendMessage(
new int[]{
VmsMessageType.DATA,
SUBSCRIPTION_LAYER_ID,
MOCK_PUBLISHER_LAYER_SUBTYPE,
SUBSCRIPTION_LAYER_VERSION,
PUBLISHER_ID
},
PAYLOAD);
assertNull(getMockSubscriberClient().receiveMessage());
}
// Test injecting a value in the HAL and verifying it does not propagate to a subscriber.
@Test
public void testSubscribeFromWrongPublisher() throws Exception {
getSubscriberManager().subscribe(SUBSCRIPTION_LAYER, PUBLISHER_ID);
getMockHalClient().sendMessage(
new int[]{
VmsMessageType.DATA,
SUBSCRIPTION_LAYER_ID,
MOCK_PUBLISHER_LAYER_SUBTYPE,
SUBSCRIPTION_LAYER_VERSION,
WRONG_PUBLISHER_ID
},
PAYLOAD);
assertNull(getMockSubscriberClient().receiveMessage());
}
// Test injecting a value in the HAL and verifying it does not propagate to a subscriber.
@Test
public void testUnsubscribeFromPublisher() throws Exception {
getSubscriberManager().subscribe(SUBSCRIPTION_LAYER, PUBLISHER_ID);
getSubscriberManager().unsubscribe(SUBSCRIPTION_LAYER, PUBLISHER_ID);
getMockHalClient().sendMessage(
new int[]{
VmsMessageType.DATA,
SUBSCRIPTION_LAYER_ID,
MOCK_PUBLISHER_LAYER_SUBTYPE,
SUBSCRIPTION_LAYER_VERSION,
PUBLISHER_ID
},
PAYLOAD);
assertNull(getMockSubscriberClient().receiveMessage());
}
// Test injecting a value in the HAL and verifying it propagates to a subscriber.
@Test
public void testSubscribeAll() throws Exception {
getSubscriberManager().startMonitoring();
getMockHalClient().sendMessage(
new int[]{
VmsMessageType.DATA,
SUBSCRIPTION_LAYER_ID,
MOCK_PUBLISHER_LAYER_SUBTYPE,
SUBSCRIPTION_LAYER_VERSION,
PUBLISHER_ID
},
PAYLOAD);
Pair<VmsLayer, byte[]> message = getMockSubscriberClient().receiveMessage();
assertEquals(SUBSCRIPTION_LAYER, message.first);
assertArrayEquals(PAYLOAD, message.second);
}
// Test injecting a value in the HAL and verifying it propagates to a subscriber.
@Test
public void testSimpleAvailableLayers() throws Exception {
//
// Offering:
// Layer | Dependency
// ===============================
// (2, 3, 444), [17] | {}
// Expected availability:
// {(2, 3, 444 [17])}
//
getMockHalClient().sendMessage(
VmsMessageType.OFFERING,
PUBLISHER_ID,
1, // Number of offered layers
SUBSCRIPTION_LAYER_ID,
MOCK_PUBLISHER_LAYER_SUBTYPE,
SUBSCRIPTION_LAYER_VERSION,
0 // number of dependencies for layer
);
assertEquals(
Collections.singleton(SUBSCRIPTION_ASSOCIATED_LAYER),
getMockSubscriberClient().receiveLayerAvailability().getAssociatedLayers());
}
// Test injecting a value in the HAL and verifying it propagates to a subscriber after it has
// subscribed to a layer.
@Test
public void testSimpleAvailableLayersAfterSubscription() throws Exception {
getSubscriberManager().subscribe(SUBSCRIPTION_LAYER);
//
// Offering:
// Layer | Dependency
// ===============================
// (2, 3, 444), [17] | {}
// Expected availability:
// {(2, 3, 444 [17])}
//
getMockHalClient().sendMessage(
VmsMessageType.OFFERING, // MessageType
PUBLISHER_ID,
1, // Number of offered layers
SUBSCRIPTION_LAYER_ID,
MOCK_PUBLISHER_LAYER_SUBTYPE,
SUBSCRIPTION_LAYER_VERSION,
0 // number of dependencies for layer
);
assertEquals(
Collections.singleton(SUBSCRIPTION_ASSOCIATED_LAYER),
getMockSubscriberClient().receiveLayerAvailability().getAssociatedLayers());
}
// Test injecting a value in the HAL and verifying it does not propagates to a subscriber after
// it has cleared its callback.
@Test
public void testSimpleAvailableLayersAfterClear() throws Exception {
getSubscriberManager().clearVmsSubscriberClientCallback();
//
// Offering:
// Layer | Dependency
// ===============================
// (2, 3, 444), [17] | {}
// Expected availability:
// {(2, 3, 444 [17])}
//
getMockHalClient().sendMessage(
VmsMessageType.OFFERING, // MessageType
PUBLISHER_ID,
1, // Number of offered layers
SUBSCRIPTION_LAYER_ID,
SUBSCRIPTION_LAYER_VERSION,
MOCK_PUBLISHER_LAYER_SUBTYPE,
0 // number of dependencies for layer
);
assertNull(getMockSubscriberClient().receiveLayerAvailability());
}
// Test injecting a value in the HAL and verifying it propagates to a subscriber.
@Test
public void testComplexAvailableLayers() throws Exception {
//
// Offering:
// Layer | Dependency
// =====================================
// (2, 3, 444), [17] | {}
// (4, 5, 444), [17] | {(2, 3)}
// (6, 7, 444), [17] | {(2, 3), (4, 5)}
// (6, 7, 444), [17] | {(100, 200)}
// Expected availability:
// {(2, 3, 444 [17]), (4, 5, 444 [17]), (6, 7, 444 [17])}
//
getMockHalClient().sendMessage(
VmsMessageType.OFFERING, // MessageType
PUBLISHER_ID,
4, // Number of offered layers
SUBSCRIPTION_LAYER_ID,
MOCK_PUBLISHER_LAYER_SUBTYPE,
SUBSCRIPTION_LAYER_VERSION,
0, // number of dependencies for layer
SUBSCRIPTION_DEPENDANT_LAYER_ID_1,
MOCK_PUBLISHER_LAYER_SUBTYPE,
SUBSCRIPTION_DEPENDANT_LAYER_VERSION_1,
1, // number of dependencies for layer
SUBSCRIPTION_LAYER_ID,
MOCK_PUBLISHER_LAYER_SUBTYPE,
SUBSCRIPTION_LAYER_VERSION,
SUBSCRIPTION_DEPENDANT_LAYER_ID_2,
MOCK_PUBLISHER_LAYER_SUBTYPE,
SUBSCRIPTION_DEPENDANT_LAYER_VERSION_2,
2, // number of dependencies for layer
SUBSCRIPTION_LAYER_ID,
MOCK_PUBLISHER_LAYER_SUBTYPE,
SUBSCRIPTION_LAYER_VERSION,
SUBSCRIPTION_DEPENDANT_LAYER_ID_1,
MOCK_PUBLISHER_LAYER_SUBTYPE,
SUBSCRIPTION_DEPENDANT_LAYER_VERSION_1,
SUBSCRIPTION_DEPENDANT_LAYER_ID_2,
MOCK_PUBLISHER_LAYER_SUBTYPE,
SUBSCRIPTION_DEPENDANT_LAYER_VERSION_2,
1, // number of dependencies for layer
SUBSCRIPTION_UNSUPPORTED_LAYER_ID,
MOCK_PUBLISHER_LAYER_SUBTYPE,
SUBSCRIPTION_UNSUPPORTED_LAYER_VERSION
);
Set<VmsAssociatedLayer> associatedLayers =
new HashSet<>(Arrays.asList(
SUBSCRIPTION_ASSOCIATED_LAYER,
SUBSCRIPTION_DEPENDANT_ASSOCIATED_LAYER_1,
SUBSCRIPTION_DEPENDANT_ASSOCIATED_LAYER_2
));
// Verify applications API.
VmsAvailableLayers availableLayers = getMockSubscriberClient().receiveLayerAvailability();
assertEquals(associatedLayers, availableLayers.getAssociatedLayers());
assertEquals(1, availableLayers.getSequence());
// Verify HAL API.
ArrayList<Integer> values = getMockHalClient().receiveMessage().value.int32Values;
int messageType = values.get(VmsAvailabilityStateIntegerValuesIndex.MESSAGE_TYPE);
int sequenceNumber = values.get(VmsAvailabilityStateIntegerValuesIndex.SEQUENCE_NUMBER);
int numberLayers =
values.get(VmsAvailabilityStateIntegerValuesIndex.NUMBER_OF_ASSOCIATED_LAYERS);
assertEquals(messageType, VmsMessageType.AVAILABILITY_CHANGE);
assertEquals(1, sequenceNumber);
assertEquals(3, numberLayers);
}
// Test injecting a value in the HAL twice the sequence for availability is incremented.
@Test
public void testDoubleOfferingAvailableLayers() throws Exception {
//
// Offering:
// Layer | Dependency
// ===============================
// (2, 3, 444), [17] | {}
// Expected availability:
// {(2, 3, 444 [17])}
//
int[] offeringMessage = {
VmsMessageType.OFFERING, // MessageType
PUBLISHER_ID,
1, // Number of offered layers
SUBSCRIPTION_LAYER_ID,
MOCK_PUBLISHER_LAYER_SUBTYPE,
SUBSCRIPTION_LAYER_VERSION,
0 // number of dependencies for layer
};
// Inject first offer.
getMockHalClient().sendMessage(offeringMessage);
// Verify applications API.
VmsAvailableLayers availableLayers = getMockSubscriberClient().receiveLayerAvailability();
assertEquals(
Collections.singleton(SUBSCRIPTION_ASSOCIATED_LAYER),
availableLayers.getAssociatedLayers());
assertEquals(1, availableLayers.getSequence());
// Verify HAL API.
ArrayList<Integer> values = getMockHalClient().receiveMessage().value.int32Values;
int messageType = values.get(VmsAvailabilityStateIntegerValuesIndex.MESSAGE_TYPE);
int sequenceNumber = values.get(VmsAvailabilityStateIntegerValuesIndex.SEQUENCE_NUMBER);
int numberLayers =
values.get(VmsAvailabilityStateIntegerValuesIndex.NUMBER_OF_ASSOCIATED_LAYERS);
assertEquals(messageType, VmsMessageType.AVAILABILITY_CHANGE);
assertEquals(1, sequenceNumber);
assertEquals(1, numberLayers);
int[] offeringMessage2 = {
VmsMessageType.OFFERING, // MessageType
PUBLISHER_ID,
2, // Number of offered layers
SUBSCRIPTION_LAYER_ID,
MOCK_PUBLISHER_LAYER_SUBTYPE,
SUBSCRIPTION_LAYER_VERSION,
0, // number of dependencies for layer
SUBSCRIPTION_DEPENDANT_LAYER_ID_1,
MOCK_PUBLISHER_LAYER_SUBTYPE,
SUBSCRIPTION_DEPENDANT_LAYER_VERSION_1,
1, // number of dependencies for layer
SUBSCRIPTION_LAYER_ID,
MOCK_PUBLISHER_LAYER_SUBTYPE,
SUBSCRIPTION_LAYER_VERSION,
};
// Inject second offer.
getMockHalClient().sendMessage(offeringMessage2);
// Verify applications API.
availableLayers = getMockSubscriberClient().receiveLayerAvailability();
assertEquals(
new HashSet<>(Arrays.asList(
SUBSCRIPTION_ASSOCIATED_LAYER,
SUBSCRIPTION_DEPENDANT_ASSOCIATED_LAYER_1
)),
availableLayers.getAssociatedLayers());
assertEquals(2, availableLayers.getSequence());
// Verify HAL API.
values = getMockHalClient().receiveMessage().value.int32Values;
messageType = values.get(VmsAvailabilityStateIntegerValuesIndex.MESSAGE_TYPE);
sequenceNumber = values.get(VmsAvailabilityStateIntegerValuesIndex.SEQUENCE_NUMBER);
numberLayers =
values.get(VmsAvailabilityStateIntegerValuesIndex.NUMBER_OF_ASSOCIATED_LAYERS);
assertEquals(messageType, VmsMessageType.AVAILABILITY_CHANGE);
assertEquals(2, sequenceNumber);
assertEquals(2, numberLayers);
}
// Test GetAvailableLayers().
@Test
public void testGetAvailableLayers() throws Exception {
//
// Offering:
// Layer | Dependency
// ===============================
// (2, 3, 444), [17] | {}
// Expected availability:
// {(2, 3, 444 [17])}
//
getMockHalClient().sendMessage(
VmsMessageType.OFFERING, // MessageType
PUBLISHER_ID,
1, // Number of offered layers
SUBSCRIPTION_LAYER_ID,
MOCK_PUBLISHER_LAYER_SUBTYPE,
SUBSCRIPTION_LAYER_VERSION,
0 // number of dependencies for layer
);
// Wait for an availability update to the subscriber to guarantee the state is settled.
getMockSubscriberClient().receiveLayerAvailability();
VmsAvailableLayers availableLayers = getSubscriberManager().getAvailableLayers();
assertEquals(
Collections.singleton(SUBSCRIPTION_ASSOCIATED_LAYER),
availableLayers.getAssociatedLayers());
assertEquals(1, availableLayers.getSequence());
}
}