• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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