1 package com.android.server.location; 2 3 import static com.google.common.truth.Truth.assertThat; 4 5 import static org.mockito.Matchers.any; 6 import static org.mockito.Mockito.never; 7 import static org.mockito.Mockito.verify; 8 9 import android.content.ContentResolver; 10 import android.content.Context; 11 import android.database.ContentObserver; 12 import android.os.Looper; 13 import android.platform.test.annotations.Presubmit; 14 import android.provider.Settings; 15 16 import com.android.server.testing.FrameworkRobolectricTestRunner; 17 import com.android.server.testing.SystemLoaderPackages; 18 19 import org.junit.Before; 20 import org.junit.Test; 21 import org.junit.runner.RunWith; 22 import org.mockito.ArgumentCaptor; 23 import org.mockito.Mock; 24 import org.mockito.MockitoAnnotations; 25 import org.robolectric.RuntimeEnvironment; 26 import org.robolectric.Shadows; 27 import org.robolectric.annotation.Config; 28 29 import java.util.Collection; 30 import java.util.List; 31 32 /** 33 * Unit tests for {@link GnssSatelliteBlacklistHelper}. 34 */ 35 @RunWith(FrameworkRobolectricTestRunner.class) 36 @Config( 37 manifest = Config.NONE, 38 shadows = { 39 }, 40 sdk = 27 41 ) 42 @SystemLoaderPackages({"com.android.server.location"}) 43 @Presubmit 44 public class GnssSatelliteBlacklistHelperTest { 45 46 private Context mContext; 47 private ContentResolver mContentResolver; 48 @Mock 49 private GnssSatelliteBlacklistHelper.GnssSatelliteBlacklistCallback mCallback; 50 51 @Before 52 public void setUp() { 53 MockitoAnnotations.initMocks(this); 54 mContext = RuntimeEnvironment.application; 55 mContentResolver = mContext.getContentResolver(); 56 new GnssSatelliteBlacklistHelper(mContext, Looper.myLooper(), mCallback); 57 } 58 59 @Test 60 public void blacklistOf2Satellites_callbackIsCalled() { 61 String blacklist = "3,0,5,24"; 62 updateBlacklistAndVerifyCallbackIsCalled(blacklist); 63 } 64 65 @Test 66 public void blacklistWithSpaces_callbackIsCalled() { 67 String blacklist = "3, 11"; 68 updateBlacklistAndVerifyCallbackIsCalled(blacklist); 69 } 70 71 @Test 72 public void emptyBlacklist_callbackIsCalled() { 73 String blacklist = ""; 74 updateBlacklistAndVerifyCallbackIsCalled(blacklist); 75 } 76 77 @Test 78 public void blacklistWithOddNumberOfValues_callbackIsNotCalled() { 79 String blacklist = "3,0,5"; 80 updateBlacklistAndNotifyContentObserver(blacklist); 81 verify(mCallback, never()).onUpdateSatelliteBlacklist(any(int[].class), any(int[].class)); 82 } 83 84 @Test 85 public void blacklistWithNegativeValue_callbackIsNotCalled() { 86 String blacklist = "3,-11"; 87 updateBlacklistAndNotifyContentObserver(blacklist); 88 verify(mCallback, never()).onUpdateSatelliteBlacklist(any(int[].class), any(int[].class)); 89 } 90 91 @Test 92 public void blacklistWithNonDigitCharacter_callbackIsNotCalled() { 93 String blacklist = "3,1a,5,11"; 94 updateBlacklistAndNotifyContentObserver(blacklist); 95 verify(mCallback, never()).onUpdateSatelliteBlacklist(any(int[].class), any(int[].class)); 96 } 97 98 private void updateBlacklistAndNotifyContentObserver(String blacklist) { 99 Settings.Global.putString(mContentResolver, 100 Settings.Global.GNSS_SATELLITE_BLACKLIST, blacklist); 101 notifyContentObserverFor(Settings.Global.GNSS_SATELLITE_BLACKLIST); 102 } 103 104 private void updateBlacklistAndVerifyCallbackIsCalled(String blacklist) { 105 updateBlacklistAndNotifyContentObserver(blacklist); 106 107 ArgumentCaptor<int[]> constellationsCaptor = ArgumentCaptor.forClass(int[].class); 108 ArgumentCaptor<int[]> svIdsCaptor = ArgumentCaptor.forClass(int[].class); 109 verify(mCallback).onUpdateSatelliteBlacklist(constellationsCaptor.capture(), 110 svIdsCaptor.capture()); 111 112 int[] constellations = constellationsCaptor.getValue(); 113 int[] svIds = svIdsCaptor.getValue(); 114 List<Integer> values = GnssSatelliteBlacklistHelper.parseSatelliteBlacklist(blacklist); 115 assertThat(values.size()).isEqualTo(constellations.length * 2); 116 assertThat(svIds.length).isEqualTo(constellations.length); 117 for (int i = 0; i < constellations.length; i++) { 118 assertThat(constellations[i]).isEqualTo(values.get(i * 2)); 119 assertThat(svIds[i]).isEqualTo(values.get(i * 2 + 1)); 120 } 121 } 122 123 private static void notifyContentObserverFor(String globalSetting) { 124 Collection<ContentObserver> contentObservers = 125 Shadows.shadowOf(RuntimeEnvironment.application.getContentResolver()) 126 .getContentObservers(Settings.Global.getUriFor(globalSetting)); 127 assertThat(contentObservers).isNotEmpty(); 128 contentObservers.iterator().next().onChange(false /* selfChange */); 129 } 130 } 131