blob: 63996f0e021c97aaf6d124728840ec16d9c54a3c [file] [log] [blame]
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.server.location.provider;
import static com.android.server.location.LocationUtils.createLocation;
import static com.android.server.location.LocationUtils.createLocationResult;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.after;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.MockitoAnnotations.initMocks;
import android.content.Context;
import android.location.Location;
import android.location.LocationResult;
import android.location.provider.ProviderRequest;
import android.platform.test.annotations.Presubmit;
import android.util.Log;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
import com.android.server.location.injector.TestInjector;
import com.android.server.location.test.FakeProvider;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import java.util.Random;
@Presubmit
@SmallTest
@RunWith(AndroidJUnit4.class)
public class StationaryThrottlingLocationProviderTest {
private static final String TAG = "StationaryThrottlingLocationProviderTest";
private Random mRandom;
private TestInjector mInjector;
private FakeProvider mDelegateProvider;
private @Mock Context mContext;
private @Mock AbstractLocationProvider.Listener mListener;
private @Mock FakeProvider.FakeProviderInterface mDelegate;
private StationaryThrottlingLocationProvider mProvider;
@Before
public void setUp() {
initMocks(this);
long seed = System.currentTimeMillis();
Log.i(TAG, "location random seed: " + seed);
mRandom = new Random(seed);
mInjector = new TestInjector(mContext);
mDelegateProvider = new FakeProvider(mDelegate);
mProvider = new StationaryThrottlingLocationProvider("test_provider", mInjector,
mDelegateProvider);
mProvider.getController().setListener(mListener);
mProvider.getController().start();
}
@After
public void tearDown() {
mProvider.getController().setRequest(ProviderRequest.EMPTY_REQUEST);
mProvider.getController().stop();
}
@Test
public void testThrottle() {
ProviderRequest request = new ProviderRequest.Builder().setIntervalMillis(50).build();
mProvider.getController().setRequest(request);
verify(mDelegate).onSetRequest(request);
mDelegateProvider.reportLocation(createLocationResult("test_provider", mRandom));
verify(mListener, times(1)).onReportLocation(any(LocationResult.class));
mInjector.getDeviceStationaryHelper().setStationary(true);
verify(mDelegate, never()).onSetRequest(ProviderRequest.EMPTY_REQUEST);
mInjector.getDeviceIdleHelper().setIdle(true);
verify(mDelegate).onSetRequest(ProviderRequest.EMPTY_REQUEST);
verify(mListener, timeout(75).times(2)).onReportLocation(any(LocationResult.class));
verify(mListener, timeout(75).times(3)).onReportLocation(any(LocationResult.class));
mInjector.getDeviceStationaryHelper().setStationary(false);
verify(mDelegate, times(2)).onSetRequest(request);
verify(mListener, after(75).times(3)).onReportLocation(any(LocationResult.class));
}
@Test
public void testThrottle_NoInitialLocation() {
ProviderRequest request = new ProviderRequest.Builder().setIntervalMillis(50).build();
mProvider.getController().setRequest(request);
verify(mDelegate).onSetRequest(request);
mInjector.getDeviceStationaryHelper().setStationary(true);
mInjector.getDeviceIdleHelper().setIdle(true);
verify(mDelegate, never()).onSetRequest(ProviderRequest.EMPTY_REQUEST);
mDelegateProvider.reportLocation(createLocationResult("test_provider", mRandom));
verify(mListener, times(1)).onReportLocation(any(LocationResult.class));
verify(mDelegate, times(1)).onSetRequest(ProviderRequest.EMPTY_REQUEST);
verify(mListener, timeout(75).times(2)).onReportLocation(any(LocationResult.class));
mInjector.getDeviceStationaryHelper().setStationary(false);
verify(mDelegate, times(2)).onSetRequest(request);
verify(mListener, after(75).times(2)).onReportLocation(any(LocationResult.class));
}
@Test
public void testNoThrottle_noLocation() {
ProviderRequest request = new ProviderRequest.Builder().setIntervalMillis(50).build();
mProvider.getController().setRequest(request);
verify(mDelegate).onSetRequest(request);
verify(mListener, never()).onReportLocation(any(LocationResult.class));
mInjector.getDeviceStationaryHelper().setStationary(true);
mInjector.getDeviceIdleHelper().setIdle(true);
verify(mDelegate, never()).onSetRequest(ProviderRequest.EMPTY_REQUEST);
verify(mListener, after(75).times(0)).onReportLocation(any(LocationResult.class));
}
@Test
public void testNoThrottle_oldLocation() {
ProviderRequest request = new ProviderRequest.Builder().setIntervalMillis(50).build();
mProvider.getController().setRequest(request);
verify(mDelegate).onSetRequest(request);
Location l = createLocation("test_provider", mRandom);
l.setElapsedRealtimeNanos(0);
LocationResult loc = LocationResult.wrap(l);
mDelegateProvider.reportLocation(loc);
verify(mListener, times(1)).onReportLocation(loc);
mInjector.getDeviceStationaryHelper().setStationary(true);
mInjector.getDeviceIdleHelper().setIdle(true);
verify(mDelegate, never()).onSetRequest(ProviderRequest.EMPTY_REQUEST);
verify(mListener, after(75).times(1)).onReportLocation(any(LocationResult.class));
}
@Test
public void testNoThrottle_locationSettingsIgnored() {
ProviderRequest request = new ProviderRequest.Builder().setIntervalMillis(
50).setLocationSettingsIgnored(true).build();
mProvider.getController().setRequest(request);
verify(mDelegate).onSetRequest(request);
LocationResult loc = createLocationResult("test_provider", mRandom);
mDelegateProvider.reportLocation(loc);
verify(mListener, times(1)).onReportLocation(loc);
mInjector.getDeviceStationaryHelper().setStationary(true);
mInjector.getDeviceIdleHelper().setIdle(true);
verify(mDelegate, never()).onSetRequest(ProviderRequest.EMPTY_REQUEST);
verify(mListener, after(75).times(1)).onReportLocation(any(LocationResult.class));
}
}