package com.android.server.location; import com.android.server.location.LocationRequestStatistics.PackageProviderKey; import com.android.server.location.LocationRequestStatistics.PackageStatistics; import android.os.SystemClock; import android.test.AndroidTestCase; /** * Unit tests for {@link LocationRequestStatistics}. */ public class LocationRequestStatisticsTest extends AndroidTestCase { private static final String PACKAGE1 = "package1"; private static final String PACKAGE2 = "package2"; private static final String PROVIDER1 = "provider1"; private static final String PROVIDER2 = "provider2"; private static final long INTERVAL1 = 5000; private static final long INTERVAL2 = 100000; private LocationRequestStatistics mStatistics; private long mStartElapsedRealtimeMs; @Override public void setUp() { mStatistics = new LocationRequestStatistics(); mStartElapsedRealtimeMs = SystemClock.elapsedRealtime(); } /** * Tests that adding a single package works correctly. */ public void testSinglePackage() { mStatistics.startRequesting(PACKAGE1, PROVIDER1, INTERVAL1); assertEquals(1, mStatistics.statistics.size()); PackageProviderKey key = mStatistics.statistics.keySet().iterator().next(); assertEquals(PACKAGE1, key.packageName); assertEquals(PROVIDER1, key.providerName); PackageStatistics stats = mStatistics.statistics.values().iterator().next(); verifyStatisticsTimes(stats); assertEquals(INTERVAL1, stats.getFastestIntervalMs()); assertEquals(INTERVAL1, stats.getSlowestIntervalMs()); assertTrue(stats.isActive()); } /** * Tests that adding a single package works correctly when it is stopped and restarted. */ public void testSinglePackage_stopAndRestart() { mStatistics.startRequesting(PACKAGE1, PROVIDER1, INTERVAL1); mStatistics.stopRequesting(PACKAGE1, PROVIDER1); mStatistics.startRequesting(PACKAGE1, PROVIDER1, INTERVAL1); assertEquals(1, mStatistics.statistics.size()); PackageProviderKey key = mStatistics.statistics.keySet().iterator().next(); assertEquals(PACKAGE1, key.packageName); assertEquals(PROVIDER1, key.providerName); PackageStatistics stats = mStatistics.statistics.values().iterator().next(); verifyStatisticsTimes(stats); assertEquals(INTERVAL1, stats.getFastestIntervalMs()); assertEquals(INTERVAL1, stats.getSlowestIntervalMs()); assertTrue(stats.isActive()); mStatistics.stopRequesting(PACKAGE1, PROVIDER1); assertFalse(stats.isActive()); } /** * Tests that adding a single package works correctly when multiple intervals are used. */ public void testSinglePackage_multipleIntervals() { mStatistics.startRequesting(PACKAGE1, PROVIDER1, INTERVAL1); mStatistics.startRequesting(PACKAGE1, PROVIDER1, INTERVAL2); assertEquals(1, mStatistics.statistics.size()); PackageProviderKey key = mStatistics.statistics.keySet().iterator().next(); assertEquals(PACKAGE1, key.packageName); assertEquals(PROVIDER1, key.providerName); PackageStatistics stats = mStatistics.statistics.values().iterator().next(); verifyStatisticsTimes(stats); assertEquals(INTERVAL1, stats.getFastestIntervalMs()); assertTrue(stats.isActive()); mStatistics.stopRequesting(PACKAGE1, PROVIDER1); assertTrue(stats.isActive()); mStatistics.stopRequesting(PACKAGE1, PROVIDER1); assertFalse(stats.isActive()); } /** * Tests that adding a single package works correctly when multiple providers are used. */ public void testSinglePackage_multipleProviders() { mStatistics.startRequesting(PACKAGE1, PROVIDER1, INTERVAL1); mStatistics.startRequesting(PACKAGE1, PROVIDER2, INTERVAL2); assertEquals(2, mStatistics.statistics.size()); PackageProviderKey key1 = new PackageProviderKey(PACKAGE1, PROVIDER1); PackageStatistics stats1 = mStatistics.statistics.get(key1); verifyStatisticsTimes(stats1); assertEquals(INTERVAL1, stats1.getSlowestIntervalMs()); assertEquals(INTERVAL1, stats1.getFastestIntervalMs()); assertTrue(stats1.isActive()); PackageProviderKey key2 = new PackageProviderKey(PACKAGE1, PROVIDER2); PackageStatistics stats2 = mStatistics.statistics.get(key2); verifyStatisticsTimes(stats2); assertEquals(INTERVAL2, stats2.getSlowestIntervalMs()); assertEquals(INTERVAL2, stats2.getFastestIntervalMs()); assertTrue(stats2.isActive()); mStatistics.stopRequesting(PACKAGE1, PROVIDER1); assertFalse(stats1.isActive()); assertTrue(stats2.isActive()); mStatistics.stopRequesting(PACKAGE1, PROVIDER2); assertFalse(stats1.isActive()); assertFalse(stats2.isActive()); } /** * Tests that adding multiple packages works correctly. */ public void testMultiplePackages() { mStatistics.startRequesting(PACKAGE1, PROVIDER1, INTERVAL1); mStatistics.startRequesting(PACKAGE1, PROVIDER2, INTERVAL1); mStatistics.startRequesting(PACKAGE1, PROVIDER2, INTERVAL2); mStatistics.startRequesting(PACKAGE2, PROVIDER1, INTERVAL1); assertEquals(3, mStatistics.statistics.size()); PackageProviderKey key1 = new PackageProviderKey(PACKAGE1, PROVIDER1); PackageStatistics stats1 = mStatistics.statistics.get(key1); verifyStatisticsTimes(stats1); assertEquals(INTERVAL1, stats1.getSlowestIntervalMs()); assertEquals(INTERVAL1, stats1.getFastestIntervalMs()); assertTrue(stats1.isActive()); PackageProviderKey key2 = new PackageProviderKey(PACKAGE1, PROVIDER2); PackageStatistics stats2 = mStatistics.statistics.get(key2); verifyStatisticsTimes(stats2); assertEquals(INTERVAL2, stats2.getSlowestIntervalMs()); assertEquals(INTERVAL1, stats2.getFastestIntervalMs()); assertTrue(stats2.isActive()); PackageProviderKey key3 = new PackageProviderKey(PACKAGE2, PROVIDER1); PackageStatistics stats3 = mStatistics.statistics.get(key3); verifyStatisticsTimes(stats3); assertEquals(INTERVAL1, stats3.getSlowestIntervalMs()); assertEquals(INTERVAL1, stats3.getFastestIntervalMs()); assertTrue(stats3.isActive()); mStatistics.stopRequesting(PACKAGE1, PROVIDER1); assertFalse(stats1.isActive()); assertTrue(stats2.isActive()); assertTrue(stats3.isActive()); mStatistics.stopRequesting(PACKAGE1, PROVIDER2); assertFalse(stats1.isActive()); assertTrue(stats2.isActive()); assertTrue(stats3.isActive()); mStatistics.stopRequesting(PACKAGE1, PROVIDER2); assertFalse(stats2.isActive()); mStatistics.stopRequesting(PACKAGE2, PROVIDER1); assertFalse(stats1.isActive()); assertFalse(stats2.isActive()); assertFalse(stats3.isActive()); } private void verifyStatisticsTimes(PackageStatistics stats) { long durationMs = stats.getDurationMs(); long timeSinceFirstRequestMs = stats.getTimeSinceFirstRequestMs(); long maxDeltaMs = SystemClock.elapsedRealtime() - mStartElapsedRealtimeMs; assertTrue("Duration is too large", durationMs <= maxDeltaMs); assertTrue("Time since first request is too large", timeSinceFirstRequestMs <= maxDeltaMs); } }