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