| Index: chrome/android/junit/src/org/chromium/chrome/browser/omnibox/geo/VisibleNetworksTrackerTest.java
|
| diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/geo/VisibleNetworksTrackerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/geo/VisibleNetworksTrackerTest.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..9b6b4fbf1271f01a9b9856690b52858a509a1ae7
|
| --- /dev/null
|
| +++ b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/geo/VisibleNetworksTrackerTest.java
|
| @@ -0,0 +1,217 @@
|
| +// Copyright 2017 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +package org.chromium.chrome.browser.omnibox.geo;
|
| +
|
| +import static org.junit.Assert.assertEquals;
|
| +
|
| +import android.content.Context;
|
| +
|
| +import org.junit.Before;
|
| +import org.junit.Test;
|
| +import org.junit.runner.RunWith;
|
| +import org.mockito.Mock;
|
| +import org.mockito.MockitoAnnotations;
|
| +import org.robolectric.annotation.Config;
|
| +import org.robolectric.annotation.Implementation;
|
| +import org.robolectric.annotation.Implements;
|
| +import org.robolectric.shadows.ShadowLooper;
|
| +import org.robolectric.shadows.ShadowSystemClock;
|
| +
|
| +import org.chromium.base.ThreadUtils;
|
| +import org.chromium.chrome.browser.omnibox.geo.VisibleNetworks.VisibleCell;
|
| +import org.chromium.chrome.browser.omnibox.geo.VisibleNetworks.VisibleWifi;
|
| +import org.chromium.chrome.browser.omnibox.geo.VisibleNetworksTrackerTest.ShadowPlatformNetworksManager;
|
| +import org.chromium.testing.local.CustomShadowAsyncTask;
|
| +import org.chromium.testing.local.LocalRobolectricTestRunner;
|
| +
|
| +import java.util.Arrays;
|
| +import java.util.HashSet;
|
| +import java.util.LinkedList;
|
| +import java.util.List;
|
| +
|
| +/**
|
| + * Robolectric tests for {@link VisibleNetworksTracker}.
|
| + */
|
| +@RunWith(LocalRobolectricTestRunner.class)
|
| +@Config(manifest = Config.NONE,
|
| + shadows = {ShadowPlatformNetworksManager.class, CustomShadowAsyncTask.class,
|
| + ShadowSystemClock.class})
|
| +public class VisibleNetworksTrackerTest {
|
| + private static final VisibleWifi VISIBLE_WIFI_1 =
|
| + VisibleWifi.create("ssid1", "11:11:11:11:11:11", 1, 10L);
|
| + private static final VisibleWifi VISIBLE_WIFI_2 =
|
| + VisibleWifi.create("ssid2", "11:11:11:11:11:12", 2, 20L);
|
| + private static final VisibleCell VISIBLE_CELL_1 =
|
| + VisibleCell.builder(VisibleCell.GSM_RADIO_TYPE)
|
| + .setCellId(30)
|
| + .setLocationAreaCode(31)
|
| + .setMobileCountryCode(32)
|
| + .setMobileNetworkCode(33)
|
| + .setTimestamp(30L)
|
| + .build();
|
| + private static final VisibleCell VISIBLE_CELL_2 =
|
| + VisibleCell.builder(VisibleCell.CDMA_RADIO_TYPE)
|
| + .setCellId(40)
|
| + .setLocationAreaCode(41)
|
| + .setMobileCountryCode(42)
|
| + .setMobileNetworkCode(43)
|
| + .setTimestamp(40L)
|
| + .build();
|
| +
|
| + private static final VisibleNetworks FIRST_ALL_VISIBLE_NETWORKS =
|
| + VisibleNetworks.create(VISIBLE_WIFI_1, VISIBLE_CELL_1,
|
| + new HashSet<VisibleWifi>(Arrays.asList(VISIBLE_WIFI_1, VISIBLE_WIFI_2)),
|
| + new HashSet<VisibleCell>(Arrays.asList(VISIBLE_CELL_1, VISIBLE_CELL_2)));
|
| + private static final VisibleNetworks SECOND_ALL_VISIBLE_NETWORKS = VisibleNetworks.create(
|
| + VISIBLE_WIFI_2, VISIBLE_CELL_2, new HashSet<VisibleWifi>(Arrays.asList(VISIBLE_WIFI_1)),
|
| + new HashSet<VisibleCell>(Arrays.asList(VISIBLE_CELL_1)));
|
| + private static final VisibleNetworks FIRST_ONLY_CONNECTED_NETWORKS =
|
| + VisibleNetworks.create(VISIBLE_WIFI_1, VISIBLE_CELL_1, null, null);
|
| + private static final VisibleNetworks SECOND_ONLY_CONNECTED_NETWORKS =
|
| + VisibleNetworks.create(VISIBLE_WIFI_2, VISIBLE_CELL_2, null, null);
|
| +
|
| + private static final long CURRENT_TIME_MS = 90000000L;
|
| + private static final long ELAPSED_UNDER_THRESHOLD_TIME_MS =
|
| + VisibleNetworksTracker.AGE_THRESHOLD - 1000L;
|
| + private static final long ELAPSED_OVER_THRESHOLD_TIME_MS =
|
| + VisibleNetworksTracker.AGE_THRESHOLD + 1000L;
|
| +
|
| + @Mock
|
| + private static Context sContext;
|
| +
|
| + @Before
|
| + public void setUp() {
|
| + MockitoAnnotations.initMocks(this);
|
| + ShadowSystemClock.setCurrentTimeMillis(CURRENT_TIME_MS);
|
| + ShadowPlatformNetworksManager.sAllVisibleNetworks = new LinkedList<>(
|
| + Arrays.asList(FIRST_ALL_VISIBLE_NETWORKS, SECOND_ALL_VISIBLE_NETWORKS));
|
| + ShadowPlatformNetworksManager.sOnlyConnectedNetworks = new LinkedList<>(
|
| + Arrays.asList(FIRST_ONLY_CONNECTED_NETWORKS, SECOND_ONLY_CONNECTED_NETWORKS));
|
| +
|
| + // Make sure that the cache is empty before every test.
|
| + ThreadUtils.runOnUiThreadBlocking(new Runnable(){
|
| + @Override
|
| + public void run() {
|
| + VisibleNetworksTracker.clearCache();
|
| + }
|
| + });
|
| + }
|
| +
|
| + @Test
|
| + public void testGetLastKnownVisibleNetworks_emptyCache() {
|
| + // Cache is empty before the getLastKnownVisibleNetworks call. The visibleNetworks
|
| + // are computed only for the connected wifi and cell and then cached.
|
| + VisibleNetworks visibleNetworks =
|
| + VisibleNetworksTracker.getLastKnownVisibleNetworks(sContext);
|
| + assertEquals(FIRST_ONLY_CONNECTED_NETWORKS, visibleNetworks);
|
| +
|
| + // A background refresh should be triggered as a result, and compute all to cache them.
|
| + ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
|
| + assertEquals(FIRST_ALL_VISIBLE_NETWORKS, VisibleNetworksTracker.getCachedVisibleNetworks());
|
| + assertEquals(CURRENT_TIME_MS, VisibleNetworksTracker.getCachedVisibleNetworksTime());
|
| + }
|
| +
|
| + @Test
|
| + public void testGetLastKnownVisibleNetworks_withValidCache() {
|
| + VisibleNetworks visibleNetworks =
|
| + VisibleNetworksTracker.getLastKnownVisibleNetworks(sContext);
|
| + assertEquals(FIRST_ONLY_CONNECTED_NETWORKS, visibleNetworks);
|
| +
|
| + // Wait until cache is populated
|
| + ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
|
| +
|
| + // Time to consider the first cached networks still as valid.
|
| + ShadowSystemClock.setCurrentTimeMillis(CURRENT_TIME_MS + ELAPSED_UNDER_THRESHOLD_TIME_MS);
|
| + visibleNetworks = VisibleNetworksTracker.getLastKnownVisibleNetworks(sContext);
|
| +
|
| + assertEquals(FIRST_ALL_VISIBLE_NETWORKS, visibleNetworks);
|
| + assertEquals(FIRST_ALL_VISIBLE_NETWORKS, VisibleNetworksTracker.getCachedVisibleNetworks());
|
| + assertEquals(CURRENT_TIME_MS, VisibleNetworksTracker.getCachedVisibleNetworksTime());
|
| + }
|
| +
|
| + @Test
|
| + public void testGetLastKnownVisibleNetworks_withOldCache() {
|
| + VisibleNetworks visibleNetworks =
|
| + VisibleNetworksTracker.getLastKnownVisibleNetworks(sContext);
|
| + assertEquals(FIRST_ONLY_CONNECTED_NETWORKS, visibleNetworks);
|
| +
|
| + // Wait until cache is populated
|
| + ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
|
| +
|
| + // Time to consider the first cached networks as invalid. Should fetch the second ones.
|
| + ShadowSystemClock.setCurrentTimeMillis(CURRENT_TIME_MS + ELAPSED_OVER_THRESHOLD_TIME_MS);
|
| + visibleNetworks = VisibleNetworksTracker.getLastKnownVisibleNetworks(sContext);
|
| +
|
| + assertEquals(SECOND_ONLY_CONNECTED_NETWORKS, visibleNetworks);
|
| +
|
| + // A background refresh should be triggered as a result, and compute all to cache them.
|
| + ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
|
| + assertEquals(
|
| + SECOND_ALL_VISIBLE_NETWORKS, VisibleNetworksTracker.getCachedVisibleNetworks());
|
| + assertEquals(CURRENT_TIME_MS + ELAPSED_OVER_THRESHOLD_TIME_MS,
|
| + VisibleNetworksTracker.getCachedVisibleNetworksTime());
|
| + }
|
| +
|
| + @Test
|
| + public void testRefreshVisibleNetworks_emptyCache() {
|
| + // Cache is empty before the refreshVisibleNetworks call. The visibleNetworks are
|
| + // computed including all the visible cells and wifis then cached.
|
| + VisibleNetworksTracker.refreshVisibleNetworks(sContext);
|
| + ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
|
| +
|
| + assertEquals(FIRST_ALL_VISIBLE_NETWORKS, VisibleNetworksTracker.getCachedVisibleNetworks());
|
| + assertEquals(CURRENT_TIME_MS, VisibleNetworksTracker.getCachedVisibleNetworksTime());
|
| + }
|
| +
|
| + @Test
|
| + public void testRefreshVisibleNetworks_validCache() {
|
| + VisibleNetworksTracker.refreshVisibleNetworks(sContext);
|
| + ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
|
| + assertEquals(FIRST_ALL_VISIBLE_NETWORKS, VisibleNetworksTracker.getCachedVisibleNetworks());
|
| + assertEquals(CURRENT_TIME_MS, VisibleNetworksTracker.getCachedVisibleNetworksTime());
|
| +
|
| + // Time to consider the first cached networks still as valid, refresh should be a noop.
|
| + ShadowSystemClock.setCurrentTimeMillis(CURRENT_TIME_MS + ELAPSED_UNDER_THRESHOLD_TIME_MS);
|
| + VisibleNetworksTracker.refreshVisibleNetworks(sContext);
|
| + ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
|
| +
|
| + assertEquals(FIRST_ALL_VISIBLE_NETWORKS, VisibleNetworksTracker.getCachedVisibleNetworks());
|
| + assertEquals(CURRENT_TIME_MS, VisibleNetworksTracker.getCachedVisibleNetworksTime());
|
| + }
|
| +
|
| + @Test
|
| + public void testRefreshVisibleNetworks_oldCache() {
|
| + VisibleNetworksTracker.refreshVisibleNetworks(sContext);
|
| + ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
|
| + assertEquals(FIRST_ALL_VISIBLE_NETWORKS, VisibleNetworksTracker.getCachedVisibleNetworks());
|
| + assertEquals(CURRENT_TIME_MS, VisibleNetworksTracker.getCachedVisibleNetworksTime());
|
| +
|
| + // Time to consider the first cached networks as invalid. Should fetch the second ones.
|
| + ShadowSystemClock.setCurrentTimeMillis(CURRENT_TIME_MS + ELAPSED_OVER_THRESHOLD_TIME_MS);
|
| + VisibleNetworksTracker.refreshVisibleNetworks(sContext);
|
| + ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
|
| +
|
| + assertEquals(
|
| + SECOND_ALL_VISIBLE_NETWORKS, VisibleNetworksTracker.getCachedVisibleNetworks());
|
| + assertEquals(CURRENT_TIME_MS + ELAPSED_OVER_THRESHOLD_TIME_MS,
|
| + VisibleNetworksTracker.getCachedVisibleNetworksTime());
|
| + }
|
| +
|
| + /**
|
| + * Shadow PlatformNetworksManager for robolectric tests.
|
| + */
|
| + @Implements(PlatformNetworksManager.class)
|
| + public static class ShadowPlatformNetworksManager {
|
| + private static List<VisibleNetworks> sAllVisibleNetworks;
|
| + private static List<VisibleNetworks> sOnlyConnectedNetworks;
|
| +
|
| + @Implementation
|
| + public static VisibleNetworks computeVisibleNetworks(
|
| + Context context, boolean includeAllVisibleNotConnectedNetworks) {
|
| + return includeAllVisibleNotConnectedNetworks ? sAllVisibleNetworks.remove(0)
|
| + : sOnlyConnectedNetworks.remove(0);
|
| + }
|
| + }
|
| +}
|
|
|