Home | History | Annotate | Download | only in location
      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