blob: a95a45a280e3fe229bf8ff6ac130d45719f60791 [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.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import android.car.vms.VmsAssociatedLayer;
import android.car.vms.VmsAvailableLayers;
import android.car.vms.VmsLayer;
import android.car.vms.VmsLayerDependency;
import android.car.vms.VmsLayersOffering;
import android.car.vms.VmsSubscriberManager;
import android.car.vms.VmsSubscriptionState;
import android.util.Pair;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.FlakyTest;
import androidx.test.filters.MediumTest;
import androidx.test.filters.RequiresDevice;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.function.Supplier;
import java.util.function.ToIntFunction;
@RunWith(AndroidJUnit4.class)
@MediumTest
public class VmsPublisherSubscriberTest extends MockedVmsTestBase {
private static final VmsLayer SUBSCRIPTION_LAYER = new VmsLayer(1, 1, 1);
private static final VmsLayer SUBSCRIPTION_LAYER_OTHER = new VmsLayer(2, 1, 1);
private static final byte[] PAYLOAD = {0xa, 0xb};
private static final byte[] PAYLOAD_OTHER = {0xb, 0xc};
private static final byte[] PUBLISHER_INFO = {0x0};
private static final byte[] PUBLISHER_INFO_OTHER = {0x1};
private static final int UNKNOWN_PUBLISHER = 99999;
private MockPublisherClient mPublisher;
private VmsSubscriberManager mSubscriber;
private MockSubscriberClient mSubscriberClient;
@Before
public void setUpClients() {
mPublisher = getMockPublisherClient();
mSubscriber = getSubscriberManager();
mSubscriberClient = getMockSubscriberClient();
}
@Test
public void testPublisherInfo_Unregistered() {
assertEquals(0, mSubscriber.getPublisherInfo(UNKNOWN_PUBLISHER).length);
}
@Test
public void testPublisherInfo_Registered() {
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
assertArrayEquals(PUBLISHER_INFO, mSubscriber.getPublisherInfo(publisherId));
}
@Test
public void testPublisherId_AlreadyRegistered() {
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO);
assertEquals(publisherId, publisherId2);
}
@Test
public void testPublisherId_MultiplePublishers() {
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
assertNotEquals(publisherId, publisherId2);
assertArrayEquals(PUBLISHER_INFO, mSubscriber.getPublisherInfo(publisherId));
assertArrayEquals(PUBLISHER_INFO_OTHER, mSubscriber.getPublisherInfo(publisherId2));
}
@Test
public void testLayerAvailability_Default() {
VmsAvailableLayers availableLayers = mSubscriber.getAvailableLayers();
assertEquals(Collections.emptySet(), availableLayers.getAssociatedLayers());
assertEquals(0, availableLayers.getSequence());
}
@Test
public void testLayerAvailability() {
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId));
assertLayerAvailability(1,
new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)));
}
@Test
public void testLayerAvailability_Overwrite() {
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId));
mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
new VmsLayerDependency(SUBSCRIPTION_LAYER_OTHER, Collections.emptySet())),
publisherId));
assertLayerAvailability(2,
new VmsAssociatedLayer(SUBSCRIPTION_LAYER_OTHER,
Collections.singleton(publisherId)));
}
@Test
public void testLayerAvailability_MultiplePublishers_SameLayer() {
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId));
mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId2));
assertLayerAvailability(2,
new VmsAssociatedLayer(SUBSCRIPTION_LAYER,
new HashSet<>(Arrays.asList(publisherId, publisherId2))));
}
@Test
public void testLayerAvailability_MultiplePublishers_MultipleLayers() {
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId));
mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
new VmsLayerDependency(SUBSCRIPTION_LAYER_OTHER, Collections.emptySet())),
publisherId2));
assertLayerAvailability(2,
new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)),
new VmsAssociatedLayer(SUBSCRIPTION_LAYER_OTHER,
Collections.singleton(publisherId2)));
}
@Test
public void testLayerAvailability_MultiplePublishers_Remove() {
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId));
mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId2));
mPublisher.setLayersOffering(new VmsLayersOffering(Collections.emptySet(), publisherId2));
assertLayerAvailability(3,
new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)));
}
@Test
public void testLayerAvailability_MultiplePublishers_Overwrite() {
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId));
mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
new VmsLayerDependency(SUBSCRIPTION_LAYER, Collections.emptySet())), publisherId2));
mPublisher.setLayersOffering(new VmsLayersOffering(Collections.singleton(
new VmsLayerDependency(SUBSCRIPTION_LAYER_OTHER, Collections.emptySet())),
publisherId2));
assertLayerAvailability(3,
new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)),
new VmsAssociatedLayer(SUBSCRIPTION_LAYER_OTHER,
Collections.singleton(publisherId2)));
}
@Test
public void testStartMonitoring() {
mSubscriber.startMonitoring();
assertNull(mPublisher.receiveSubscriptionState());
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
}
@Test
public void testStartMonitoring_AfterPublish() {
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
mSubscriber.startMonitoring();
assertNull(mSubscriberClient.receiveMessage());
}
@Test
public void testStartMonitoring_MultipleLayers() {
mSubscriber.startMonitoring();
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
mPublisher.publish(SUBSCRIPTION_LAYER_OTHER, publisherId, PAYLOAD_OTHER);
assertDataMessage(SUBSCRIPTION_LAYER_OTHER, PAYLOAD_OTHER);
}
@Test
public void testStartMonitoring_MultiplePublishers() {
mSubscriber.startMonitoring();
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId2, PAYLOAD_OTHER);
assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD_OTHER);
}
@Test
public void testStopMonitoring() {
mSubscriber.startMonitoring();
mSubscriber.stopMonitoring();
assertNull(mPublisher.receiveSubscriptionState());
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
assertNull(mSubscriberClient.receiveMessage());
}
@Test
@RequiresDevice
public void testSubscribe() {
mSubscriber.subscribe(SUBSCRIPTION_LAYER);
assertSubscriptionState(1, SUBSCRIPTION_LAYER);
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
}
@Test
public void testSubscribe_AfterPublish() {
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
mSubscriber.subscribe(SUBSCRIPTION_LAYER);
assertSubscriptionState(1, SUBSCRIPTION_LAYER);
assertNull(mSubscriberClient.receiveMessage());
}
@Test
public void testSubscribe_MultipleLayers() {
mSubscriber.subscribe(SUBSCRIPTION_LAYER);
mSubscriber.subscribe(SUBSCRIPTION_LAYER_OTHER);
assertSubscriptionState(2, SUBSCRIPTION_LAYER, SUBSCRIPTION_LAYER_OTHER);
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
mPublisher.publish(SUBSCRIPTION_LAYER_OTHER, publisherId, PAYLOAD_OTHER);
assertDataMessage(SUBSCRIPTION_LAYER_OTHER, PAYLOAD_OTHER);
}
@Test
public void testSubscribe_MultiplePublishers() {
mSubscriber.subscribe(SUBSCRIPTION_LAYER);
assertSubscriptionState(1, SUBSCRIPTION_LAYER);
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId2, PAYLOAD_OTHER);
assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD_OTHER);
}
@Test
public void testSubscribe_MultipleLayers_MultiplePublishers() {
mSubscriber.subscribe(SUBSCRIPTION_LAYER);
mSubscriber.subscribe(SUBSCRIPTION_LAYER_OTHER);
assertSubscriptionState(2, SUBSCRIPTION_LAYER, SUBSCRIPTION_LAYER_OTHER);
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
mPublisher.publish(SUBSCRIPTION_LAYER_OTHER, publisherId2, PAYLOAD_OTHER);
assertDataMessage(SUBSCRIPTION_LAYER_OTHER, PAYLOAD_OTHER);
}
@Test
public void testSubscribe_ClearCallback() {
mSubscriber.subscribe(SUBSCRIPTION_LAYER);
mSubscriber.clearVmsSubscriberClientCallback();
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
assertNull(mSubscriberClient.receiveMessage());
}
@Test(expected = IllegalStateException.class)
public void testSubscribe_NoCallback() {
mSubscriber.clearVmsSubscriberClientCallback();
mSubscriber.subscribe(SUBSCRIPTION_LAYER);
}
@Test
public void testUnsubscribe() {
mSubscriber.subscribe(SUBSCRIPTION_LAYER);
mSubscriber.unsubscribe(SUBSCRIPTION_LAYER);
assertSubscriptionState(2, Collections.emptySet(), Collections.emptySet());
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
assertNull(mSubscriberClient.receiveMessage());
}
@Test
public void testUnsubscribe_MultipleLayers() {
mSubscriber.subscribe(SUBSCRIPTION_LAYER);
mSubscriber.subscribe(SUBSCRIPTION_LAYER_OTHER);
mSubscriber.unsubscribe(SUBSCRIPTION_LAYER);
assertSubscriptionState(3, SUBSCRIPTION_LAYER_OTHER);
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
assertNull(mSubscriberClient.receiveMessage());
mPublisher.publish(SUBSCRIPTION_LAYER_OTHER, publisherId, PAYLOAD_OTHER);
assertDataMessage(SUBSCRIPTION_LAYER_OTHER, PAYLOAD_OTHER);
}
@Test
public void testUnsubscribe_MultiplePublishers() {
mSubscriber.subscribe(SUBSCRIPTION_LAYER);
mSubscriber.subscribe(SUBSCRIPTION_LAYER_OTHER);
mSubscriber.unsubscribe(SUBSCRIPTION_LAYER);
assertSubscriptionState(3, SUBSCRIPTION_LAYER_OTHER);
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
assertNull(mSubscriberClient.receiveMessage());
int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId2, PAYLOAD_OTHER);
assertNull(mSubscriberClient.receiveMessage());
}
@Test
public void testUnsubscribe_NotSubscribed() {
mSubscriber.unsubscribe(SUBSCRIPTION_LAYER);
assertNull(mPublisher.receiveSubscriptionState());
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
assertNull(mSubscriberClient.receiveMessage());
}
@Test
public void testSubscribeToPublisher() {
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
assertSubscriptionState(1,
new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)));
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
}
@Test
public void testSubscribeToPublisher_AfterPublish() {
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
assertSubscriptionState(1,
new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)));
assertNull(mSubscriberClient.receiveMessage());
}
@Test
public void testSubscribeToPublisher_MultipleLayers() {
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
mSubscriber.subscribe(SUBSCRIPTION_LAYER_OTHER, publisherId);
assertSubscriptionState(2,
new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)),
new VmsAssociatedLayer(SUBSCRIPTION_LAYER_OTHER,
Collections.singleton(publisherId)));
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
mPublisher.publish(SUBSCRIPTION_LAYER_OTHER, publisherId, PAYLOAD_OTHER);
assertDataMessage(SUBSCRIPTION_LAYER_OTHER, PAYLOAD_OTHER);
}
@Test
public void testSubscribeToPublisher_MultiplePublishers() {
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
assertSubscriptionState(1,
new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)));
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId2, PAYLOAD_OTHER);
assertNull(mSubscriberClient.receiveMessage());
}
@Test
public void testSubscribeToPublisher_MultipleLayers_MultiplePublishers() {
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
mSubscriber.subscribe(SUBSCRIPTION_LAYER_OTHER, publisherId2);
assertSubscriptionState(2,
new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId)),
new VmsAssociatedLayer(SUBSCRIPTION_LAYER_OTHER,
Collections.singleton(publisherId2)));
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD);
mPublisher.publish(SUBSCRIPTION_LAYER_OTHER, publisherId2, PAYLOAD_OTHER);
assertDataMessage(SUBSCRIPTION_LAYER_OTHER, PAYLOAD_OTHER);
}
@Test
public void testSubscribeToPublisher_UnknownPublisher() {
mSubscriber.subscribe(SUBSCRIPTION_LAYER, UNKNOWN_PUBLISHER);
assertSubscriptionState(1,
new VmsAssociatedLayer(SUBSCRIPTION_LAYER,
Collections.singleton(UNKNOWN_PUBLISHER)));
}
@Test
public void testSubscribeToPublisher_ClearCallback() {
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
mSubscriber.clearVmsSubscriberClientCallback();
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
assertNull(mSubscriberClient.receiveMessage());
}
@Test(expected = IllegalStateException.class)
public void testSubscribeToPublisher_NoCallback() {
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
mSubscriber.clearVmsSubscriberClientCallback();
mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
}
@Test
public void testUnsubscribeToPublisher() {
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
mSubscriber.unsubscribe(SUBSCRIPTION_LAYER, publisherId);
assertSubscriptionState(2, Collections.emptySet(), Collections.emptySet());
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
assertNull(mSubscriberClient.receiveMessage());
}
@Test
public void testUnsubscribeToPublisher_MultipleLayers() {
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
mSubscriber.subscribe(SUBSCRIPTION_LAYER_OTHER, publisherId);
mSubscriber.unsubscribe(SUBSCRIPTION_LAYER, publisherId);
assertSubscriptionState(3,
new VmsAssociatedLayer(SUBSCRIPTION_LAYER_OTHER,
Collections.singleton(publisherId)));
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
assertNull(mSubscriberClient.receiveMessage());
mPublisher.publish(SUBSCRIPTION_LAYER_OTHER, publisherId, PAYLOAD_OTHER);
assertDataMessage(SUBSCRIPTION_LAYER_OTHER, PAYLOAD_OTHER);
}
@Test
@FlakyTest
public void testUnsubscribeToPublisher_MultiplePublishers() {
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
int publisherId2 = mPublisher.getPublisherId(PUBLISHER_INFO_OTHER);
mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId);
mSubscriber.subscribe(SUBSCRIPTION_LAYER, publisherId2);
mSubscriber.unsubscribe(SUBSCRIPTION_LAYER, publisherId);
assertSubscriptionState(3,
new VmsAssociatedLayer(SUBSCRIPTION_LAYER, Collections.singleton(publisherId2)));
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
assertNull(mSubscriberClient.receiveMessage());
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId2, PAYLOAD_OTHER);
assertDataMessage(SUBSCRIPTION_LAYER, PAYLOAD_OTHER);
}
@Test
public void testUnsubscribeToPublisher_NotSubscribed() {
int publisherId = mPublisher.getPublisherId(PUBLISHER_INFO);
mSubscriber.unsubscribe(SUBSCRIPTION_LAYER, publisherId);
assertNull(mPublisher.receiveSubscriptionState());
mPublisher.publish(SUBSCRIPTION_LAYER, publisherId, PAYLOAD);
assertNull(mSubscriberClient.receiveMessage());
}
@Test
public void testUnsubscribeToPublisher_UnknownPublisher() {
mSubscriber.unsubscribe(SUBSCRIPTION_LAYER, UNKNOWN_PUBLISHER);
assertNull(mPublisher.receiveSubscriptionState());
}
private void assertLayerAvailability(int sequenceNumber,
VmsAssociatedLayer... associatedLayers) {
VmsAvailableLayers availableLayers = receiveWithSequence(
getMockSubscriberClient()::receiveLayerAvailability,
VmsAvailableLayers::getSequence,
sequenceNumber);
assertEquals(availableLayers, mSubscriber.getAvailableLayers());
assertEquals(new HashSet<>(Arrays.asList(associatedLayers)),
availableLayers.getAssociatedLayers());
}
private void assertSubscriptionState(int sequenceNumber, VmsLayer... layers) {
assertSubscriptionState(sequenceNumber, new HashSet<>(Arrays.asList(layers)),
Collections.emptySet());
}
private void assertSubscriptionState(int sequenceNumber,
VmsAssociatedLayer... associatedLayers) {
assertSubscriptionState(sequenceNumber, Collections.emptySet(),
new HashSet<>(Arrays.asList(associatedLayers)));
}
private void assertSubscriptionState(int sequenceNumber, Set<VmsLayer> layers,
Set<VmsAssociatedLayer> associatedLayers) {
VmsSubscriptionState subscriptionState = receiveWithSequence(
mPublisher::receiveSubscriptionState,
VmsSubscriptionState::getSequenceNumber,
sequenceNumber);
assertEquals(layers, subscriptionState.getLayers());
assertEquals(associatedLayers, subscriptionState.getAssociatedLayers());
}
private static <T> T receiveWithSequence(Supplier<T> supplierFunction,
ToIntFunction<T> sequenceNumberFn, int sequenceNumber) {
T obj = null;
for (int seq = 1; seq <= sequenceNumber; seq++) {
obj = supplierFunction.get();
assertNotNull(obj);
assertEquals(seq, sequenceNumberFn.applyAsInt(obj));
}
return obj;
}
private void assertDataMessage(VmsLayer layer, byte[] payload) {
Pair<VmsLayer, byte[]> message = mSubscriberClient.receiveMessage();
assertEquals(layer, message.first);
assertArrayEquals(payload, message.second);
}
}