1 /* 2 * Copyright (C) 2021 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 com.android.server.timedetector; 18 19 import static org.mockito.ArgumentMatchers.eq; 20 import static org.mockito.Mockito.any; 21 import static org.mockito.Mockito.anyLong; 22 import static org.mockito.Mockito.anyString; 23 import static org.mockito.Mockito.doReturn; 24 import static org.mockito.Mockito.never; 25 import static org.mockito.Mockito.verify; 26 import static org.mockito.Mockito.when; 27 28 import android.app.AlarmManager; 29 import android.app.timedetector.GnssTimeSuggestion; 30 import android.app.timedetector.TimeDetector; 31 import android.content.Context; 32 import android.location.Location; 33 import android.location.LocationListener; 34 import android.location.LocationManager; 35 import android.location.LocationManagerInternal; 36 import android.location.LocationRequest; 37 import android.location.LocationTime; 38 import android.os.TimestampedValue; 39 40 import androidx.test.runner.AndroidJUnit4; 41 42 import com.android.server.LocalServices; 43 44 import org.junit.After; 45 import org.junit.Before; 46 import org.junit.Test; 47 import org.junit.runner.RunWith; 48 import org.mockito.ArgumentCaptor; 49 import org.mockito.Mock; 50 import org.mockito.MockitoAnnotations; 51 52 @RunWith(AndroidJUnit4.class) 53 public final class GnssTimeUpdateServiceTest { 54 private static final long GNSS_TIME = 999_999_999L; 55 private static final long ELAPSED_REALTIME_NS = 123_000_000L; 56 private static final long ELAPSED_REALTIME_MS = ELAPSED_REALTIME_NS / 1_000_000L; 57 58 @Mock private Context mMockContext; 59 @Mock private TimeDetector mMockTimeDetector; 60 @Mock private AlarmManager mMockAlarmManager; 61 @Mock private LocationManager mMockLocationManager; 62 @Mock private LocationManagerInternal mLocationManagerInternal; 63 64 private GnssTimeUpdateService mGnssTimeUpdateService; 65 66 @Before setUp()67 public void setUp() { 68 MockitoAnnotations.initMocks(this); 69 70 when(mMockContext.createAttributionContext(anyString())) 71 .thenReturn(mMockContext); 72 73 when(mMockContext.getSystemServiceName(TimeDetector.class)) 74 .thenReturn((TimeDetector.class).getSimpleName()); 75 when(mMockContext.getSystemService(TimeDetector.class)) 76 .thenReturn(mMockTimeDetector); 77 78 when(mMockContext.getSystemServiceName(LocationManager.class)) 79 .thenReturn((LocationManager.class).getSimpleName()); 80 when(mMockContext.getSystemService(LocationManager.class)) 81 .thenReturn(mMockLocationManager); 82 83 when(mMockContext.getSystemServiceName(AlarmManager.class)) 84 .thenReturn((AlarmManager.class).getSimpleName()); 85 when(mMockContext.getSystemService(AlarmManager.class)) 86 .thenReturn(mMockAlarmManager); 87 88 LocalServices.addService(LocationManagerInternal.class, mLocationManagerInternal); 89 90 mGnssTimeUpdateService = 91 new GnssTimeUpdateService(mMockContext); 92 } 93 94 @After tearDown()95 public void tearDown() { 96 LocalServices.removeServiceForTest(LocationManagerInternal.class); 97 } 98 99 @Test testLocationListenerOnLocationChanged_validLocationTime_suggestsGnssTime()100 public void testLocationListenerOnLocationChanged_validLocationTime_suggestsGnssTime() { 101 TimestampedValue<Long> timeSignal = new TimestampedValue<>( 102 ELAPSED_REALTIME_MS, GNSS_TIME); 103 GnssTimeSuggestion timeSuggestion = new GnssTimeSuggestion(timeSignal); 104 LocationTime locationTime = new LocationTime(GNSS_TIME, ELAPSED_REALTIME_NS); 105 doReturn(locationTime).when(mLocationManagerInternal).getGnssTimeMillis(); 106 107 mGnssTimeUpdateService.requestGnssTimeUpdates(); 108 109 ArgumentCaptor<LocationListener> argumentCaptor = 110 ArgumentCaptor.forClass(LocationListener.class); 111 verify(mMockLocationManager).requestLocationUpdates( 112 eq(LocationManager.GPS_PROVIDER), 113 eq(new LocationRequest.Builder(LocationRequest.PASSIVE_INTERVAL) 114 .setMinUpdateIntervalMillis(0) 115 .build()), 116 any(), 117 argumentCaptor.capture()); 118 LocationListener locationListener = argumentCaptor.getValue(); 119 Location location = new Location(LocationManager.GPS_PROVIDER); 120 121 locationListener.onLocationChanged(location); 122 123 verify(mMockLocationManager).removeUpdates(locationListener); 124 verify(mMockTimeDetector).suggestGnssTime(timeSuggestion); 125 verify(mMockAlarmManager).set( 126 eq(AlarmManager.ELAPSED_REALTIME_WAKEUP), 127 anyLong(), 128 any(), 129 any(), 130 any()); 131 } 132 133 @Test testLocationListenerOnLocationChanged_nullLocationTime_doesNotSuggestGnssTime()134 public void testLocationListenerOnLocationChanged_nullLocationTime_doesNotSuggestGnssTime() { 135 doReturn(null).when(mLocationManagerInternal).getGnssTimeMillis(); 136 137 mGnssTimeUpdateService.requestGnssTimeUpdates(); 138 139 ArgumentCaptor<LocationListener> argumentCaptor = 140 ArgumentCaptor.forClass(LocationListener.class); 141 verify(mMockLocationManager).requestLocationUpdates( 142 eq(LocationManager.GPS_PROVIDER), 143 eq(new LocationRequest.Builder(LocationRequest.PASSIVE_INTERVAL) 144 .setMinUpdateIntervalMillis(0) 145 .build()), 146 any(), 147 argumentCaptor.capture()); 148 LocationListener locationListener = argumentCaptor.getValue(); 149 Location location = new Location(LocationManager.GPS_PROVIDER); 150 151 locationListener.onLocationChanged(location); 152 153 verify(mMockLocationManager).removeUpdates(locationListener); 154 verify(mMockTimeDetector, never()).suggestGnssTime(any()); 155 verify(mMockAlarmManager).set( 156 eq(AlarmManager.ELAPSED_REALTIME_WAKEUP), 157 anyLong(), 158 any(), 159 any(), 160 any()); 161 } 162 } 163