• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2020 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 android.car.vms;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 
21 import static org.junit.Assert.assertThrows;
22 
23 import static java.util.Collections.emptySet;
24 
25 import androidx.test.ext.junit.runners.AndroidJUnit4;
26 import androidx.test.filters.SmallTest;
27 
28 import org.junit.Test;
29 import org.junit.runner.RunWith;
30 
31 import java.util.Arrays;
32 import java.util.HashSet;
33 import java.util.Set;
34 
35 @RunWith(AndroidJUnit4.class)
36 @SmallTest
37 public class VmsSubscriptionHelperTest {
38     private static final VmsLayer LAYER1 = new VmsLayer(1, 1, 1);
39     private static final VmsLayer LAYER2 = new VmsLayer(2, 1, 1);
40     private static final VmsLayer LAYER3 = new VmsLayer(3, 1, 1);
41 
42     private static final int PROVIDER_ID1 = 12345;
43     private static final int PROVIDER_ID2 = 54321;
44     private static final int PROVIDER_ID3 = 99999;
45 
46     private final VmsSubscriptionHelper mSubscriptionHelper =
47             new VmsSubscriptionHelper(this::handleUpdate);
48 
49     private Set<VmsAssociatedLayer> mSubscriptionUpdate;
50     private int mSubscriptionUpdateCount;
51     private boolean mUpdateThrowsException;
52 
53     @Test
testSubscribe_SingleLayer()54     public void testSubscribe_SingleLayer() {
55         mSubscriptionHelper.subscribe(LAYER1);
56 
57         assertThat(mSubscriptionUpdateCount).isEqualTo(1);
58         assertSubscriptions(new VmsAssociatedLayer(LAYER1, emptySet()));
59     }
60 
61     @Test
testSubscribe_SingleLayer_IgnoreDuplicates()62     public void testSubscribe_SingleLayer_IgnoreDuplicates() {
63         mSubscriptionHelper.subscribe(LAYER1);
64         mSubscriptionHelper.subscribe(LAYER1);
65 
66         assertThat(mSubscriptionUpdateCount).isEqualTo(1);
67         assertSubscriptions(new VmsAssociatedLayer(LAYER1, emptySet()));
68     }
69 
70     @Test
testSubscribe_SingleLayer_RetryAfterException()71     public void testSubscribe_SingleLayer_RetryAfterException() {
72         mUpdateThrowsException = true;
73         assertThrows(
74                 UpdateHandlerException.class,
75                 () -> mSubscriptionHelper.subscribe(LAYER1));
76 
77         mUpdateThrowsException = false;
78         mSubscriptionHelper.subscribe(LAYER1);
79 
80         assertThat(mSubscriptionUpdateCount).isEqualTo(2);
81         assertSubscriptions(new VmsAssociatedLayer(LAYER1, emptySet()));
82     }
83 
84     @Test
testUnsubscribe_SingleLayer()85     public void testUnsubscribe_SingleLayer() {
86         mSubscriptionHelper.subscribe(LAYER1);
87         mSubscriptionHelper.unsubscribe(LAYER1);
88 
89         assertThat(mSubscriptionUpdateCount).isEqualTo(2);
90         assertEmptySubscriptions();
91     }
92 
93     @Test
testUnsubscribe_SingleLayer_IgnoreUnknown()94     public void testUnsubscribe_SingleLayer_IgnoreUnknown() {
95         mSubscriptionHelper.subscribe(LAYER1);
96         mSubscriptionHelper.unsubscribe(LAYER2);
97 
98         assertThat(mSubscriptionUpdateCount).isEqualTo(1);
99         assertSubscriptions(new VmsAssociatedLayer(LAYER1, emptySet()));
100     }
101 
102     @Test
testUnsubscribe_SingleLayer_RetryAfterException()103     public void testUnsubscribe_SingleLayer_RetryAfterException() {
104         mSubscriptionHelper.subscribe(LAYER1);
105         mUpdateThrowsException = true;
106         assertThrows(
107                 UpdateHandlerException.class,
108                 () -> mSubscriptionHelper.unsubscribe(LAYER1));
109 
110         mUpdateThrowsException = false;
111         mSubscriptionHelper.unsubscribe(LAYER1);
112 
113         assertThat(mSubscriptionUpdateCount).isEqualTo(3);
114         assertEmptySubscriptions();
115     }
116 
117     @Test
testSubscribe_MultipleLayers()118     public void testSubscribe_MultipleLayers() {
119         mSubscriptionHelper.subscribe(LAYER1);
120         mSubscriptionHelper.subscribe(LAYER2);
121         mSubscriptionHelper.subscribe(LAYER3);
122 
123         assertThat(mSubscriptionUpdateCount).isEqualTo(3);
124         assertSubscriptions(
125                 new VmsAssociatedLayer(LAYER1, emptySet()),
126                 new VmsAssociatedLayer(LAYER2, emptySet()),
127                 new VmsAssociatedLayer(LAYER3, emptySet()));
128     }
129 
130     @Test
testUnsubscribe_MultipleLayers()131     public void testUnsubscribe_MultipleLayers() {
132         mSubscriptionHelper.subscribe(LAYER1);
133         mSubscriptionHelper.subscribe(LAYER2);
134         mSubscriptionHelper.subscribe(LAYER3);
135         mSubscriptionHelper.unsubscribe(LAYER2);
136 
137         assertThat(mSubscriptionUpdateCount).isEqualTo(4);
138         assertSubscriptions(
139                 new VmsAssociatedLayer(LAYER1, emptySet()),
140                 new VmsAssociatedLayer(LAYER3, emptySet()));
141     }
142 
143     @Test
testSubscribe_SingleLayerAndProvider()144     public void testSubscribe_SingleLayerAndProvider() {
145         mSubscriptionHelper.subscribe(LAYER1, PROVIDER_ID1);
146 
147         assertThat(mSubscriptionUpdateCount).isEqualTo(1);
148         assertSubscriptions(new VmsAssociatedLayer(LAYER1, asSet(PROVIDER_ID1)));
149     }
150 
151     @Test
testSubscribe_SingleLayerAndProvider_IgnoreDuplicates()152     public void testSubscribe_SingleLayerAndProvider_IgnoreDuplicates() {
153         mSubscriptionHelper.subscribe(LAYER1, PROVIDER_ID1);
154         mSubscriptionHelper.subscribe(LAYER1, PROVIDER_ID1);
155 
156         assertThat(mSubscriptionUpdateCount).isEqualTo(1);
157         assertSubscriptions(new VmsAssociatedLayer(LAYER1, asSet(PROVIDER_ID1)));
158     }
159 
160     @Test
testSubscribe_SingleLayerAndProvider_RetryAfterException()161     public void testSubscribe_SingleLayerAndProvider_RetryAfterException() {
162         mUpdateThrowsException = true;
163         assertThrows(
164                 UpdateHandlerException.class,
165                 () -> mSubscriptionHelper.subscribe(LAYER1, PROVIDER_ID1));
166 
167         mUpdateThrowsException = false;
168         mSubscriptionHelper.subscribe(LAYER1, PROVIDER_ID1);
169 
170         assertThat(mSubscriptionUpdateCount).isEqualTo(2);
171         assertSubscriptions(new VmsAssociatedLayer(LAYER1, asSet(PROVIDER_ID1)));
172     }
173 
174     @Test
testUnsubscribe_SingleLayerAndProvider()175     public void testUnsubscribe_SingleLayerAndProvider() {
176         mSubscriptionHelper.subscribe(LAYER1, PROVIDER_ID1);
177         mSubscriptionHelper.unsubscribe(LAYER1, PROVIDER_ID1);
178 
179         assertThat(mSubscriptionUpdateCount).isEqualTo(2);
180         assertEmptySubscriptions();
181     }
182 
183     @Test
testUnsubscribe_SingleLayerAndProvider_IgnoreUnknown()184     public void testUnsubscribe_SingleLayerAndProvider_IgnoreUnknown() {
185         mSubscriptionHelper.subscribe(LAYER1, PROVIDER_ID1);
186         mSubscriptionHelper.unsubscribe(LAYER1, PROVIDER_ID2);
187 
188         assertThat(mSubscriptionUpdateCount).isEqualTo(1);
189         assertSubscriptions(new VmsAssociatedLayer(LAYER1, asSet(PROVIDER_ID1)));
190     }
191 
192     @Test
testUnubscribe_SingleLayerAndProvider_RetryAfterException()193     public void testUnubscribe_SingleLayerAndProvider_RetryAfterException() {
194         mSubscriptionHelper.subscribe(LAYER1, PROVIDER_ID1);
195         mUpdateThrowsException = true;
196         assertThrows(
197                 UpdateHandlerException.class,
198                 () -> mSubscriptionHelper.unsubscribe(LAYER1, PROVIDER_ID1));
199 
200         mUpdateThrowsException = false;
201         mSubscriptionHelper.unsubscribe(LAYER1, PROVIDER_ID1);
202 
203         assertThat(mSubscriptionUpdateCount).isEqualTo(3);
204         assertEmptySubscriptions();
205     }
206 
207     @Test
testSubscribe_SingleLayerAndMultipleProviders()208     public void testSubscribe_SingleLayerAndMultipleProviders() {
209         mSubscriptionHelper.subscribe(LAYER1, PROVIDER_ID1);
210         mSubscriptionHelper.subscribe(LAYER1, PROVIDER_ID2);
211         mSubscriptionHelper.subscribe(LAYER1, PROVIDER_ID3);
212 
213         assertThat(mSubscriptionUpdateCount).isEqualTo(3);
214         assertSubscriptions(
215                 new VmsAssociatedLayer(LAYER1, asSet(PROVIDER_ID1, PROVIDER_ID2, PROVIDER_ID3)));
216     }
217 
218     @Test
testUnsubscribe_SingleLayerAndMultipleProviders()219     public void testUnsubscribe_SingleLayerAndMultipleProviders() {
220         mSubscriptionHelper.subscribe(LAYER1, PROVIDER_ID1);
221         mSubscriptionHelper.subscribe(LAYER1, PROVIDER_ID2);
222         mSubscriptionHelper.subscribe(LAYER1, PROVIDER_ID3);
223         mSubscriptionHelper.unsubscribe(LAYER1, PROVIDER_ID2);
224 
225         assertThat(mSubscriptionUpdateCount).isEqualTo(4);
226         assertSubscriptions(new VmsAssociatedLayer(LAYER1, asSet(PROVIDER_ID1, PROVIDER_ID3)));
227     }
228 
229     @Test
testSubscribe_MultipleLayersAndProvider()230     public void testSubscribe_MultipleLayersAndProvider() {
231         mSubscriptionHelper.subscribe(LAYER1, PROVIDER_ID1);
232         mSubscriptionHelper.subscribe(LAYER2, PROVIDER_ID1);
233         mSubscriptionHelper.subscribe(LAYER3, PROVIDER_ID1);
234 
235         assertThat(mSubscriptionUpdateCount).isEqualTo(3);
236         assertSubscriptions(
237                 new VmsAssociatedLayer(LAYER1, asSet(PROVIDER_ID1)),
238                 new VmsAssociatedLayer(LAYER2, asSet(PROVIDER_ID1)),
239                 new VmsAssociatedLayer(LAYER3, asSet(PROVIDER_ID1)));
240     }
241 
242     @Test
testUnsubscribe_MultipleLayersAndProvider()243     public void testUnsubscribe_MultipleLayersAndProvider() {
244         mSubscriptionHelper.subscribe(LAYER1, PROVIDER_ID1);
245         mSubscriptionHelper.subscribe(LAYER2, PROVIDER_ID1);
246         mSubscriptionHelper.subscribe(LAYER3, PROVIDER_ID1);
247         mSubscriptionHelper.unsubscribe(LAYER2, PROVIDER_ID1);
248 
249         assertThat(mSubscriptionUpdateCount).isEqualTo(4);
250         assertSubscriptions(
251                 new VmsAssociatedLayer(LAYER1, asSet(PROVIDER_ID1)),
252                 new VmsAssociatedLayer(LAYER3, asSet(PROVIDER_ID1)));
253     }
254 
255     @Test
testSubscribe_MultipleLayersAndMultipleProviders()256     public void testSubscribe_MultipleLayersAndMultipleProviders() {
257         mSubscriptionHelper.subscribe(LAYER1, PROVIDER_ID1);
258         mSubscriptionHelper.subscribe(LAYER1, PROVIDER_ID2);
259         mSubscriptionHelper.subscribe(LAYER1, PROVIDER_ID3);
260         mSubscriptionHelper.subscribe(LAYER2, PROVIDER_ID2);
261         mSubscriptionHelper.subscribe(LAYER3, PROVIDER_ID3);
262 
263         assertThat(mSubscriptionUpdateCount).isEqualTo(5);
264         assertSubscriptions(
265                 new VmsAssociatedLayer(LAYER1, asSet(PROVIDER_ID1, PROVIDER_ID2, PROVIDER_ID3)),
266                 new VmsAssociatedLayer(LAYER2, asSet(PROVIDER_ID2)),
267                 new VmsAssociatedLayer(LAYER3, asSet(PROVIDER_ID3))
268         );
269     }
270 
271     @Test
testUnsubscribe_MultipleLayersAndMultipleProviders()272     public void testUnsubscribe_MultipleLayersAndMultipleProviders() {
273         mSubscriptionHelper.subscribe(LAYER1, PROVIDER_ID1);
274         mSubscriptionHelper.subscribe(LAYER1, PROVIDER_ID2);
275         mSubscriptionHelper.subscribe(LAYER1, PROVIDER_ID3);
276         mSubscriptionHelper.subscribe(LAYER2, PROVIDER_ID2);
277         mSubscriptionHelper.subscribe(LAYER3, PROVIDER_ID3);
278         mSubscriptionHelper.unsubscribe(LAYER1, PROVIDER_ID2);
279         mSubscriptionHelper.unsubscribe(LAYER3, PROVIDER_ID3);
280 
281         assertThat(mSubscriptionUpdateCount).isEqualTo(7);
282         assertSubscriptions(
283                 new VmsAssociatedLayer(LAYER1, asSet(PROVIDER_ID1, PROVIDER_ID3)),
284                 new VmsAssociatedLayer(LAYER2, asSet(PROVIDER_ID2)));
285     }
286 
handleUpdate(Set<VmsAssociatedLayer> subscriptionUpdate)287     private void handleUpdate(Set<VmsAssociatedLayer> subscriptionUpdate) {
288         mSubscriptionUpdate = subscriptionUpdate;
289         mSubscriptionUpdateCount++;
290         if (mUpdateThrowsException) {
291             throw new UpdateHandlerException();
292         }
293     }
294 
assertEmptySubscriptions()295     private void assertEmptySubscriptions() {
296         assertSubscriptions();
297     }
298 
assertSubscriptions(VmsAssociatedLayer... associatedLayers)299     private void assertSubscriptions(VmsAssociatedLayer... associatedLayers) {
300         Set<VmsAssociatedLayer> subscriptions = asSet(associatedLayers);
301         assertThat(mSubscriptionUpdate).isEqualTo(subscriptions);
302         assertThat(mSubscriptionHelper.getSubscriptions()).isEqualTo(subscriptions);
303     }
304 
305     @SafeVarargs
asSet(T... values)306     private static <T> Set<T> asSet(T... values) {
307         return new HashSet<>(Arrays.asList(values));
308     }
309 
310     private static class UpdateHandlerException extends RuntimeException {}
311 }
312