Index: chrome/android/javatests/src/org/chromium/chrome/browser/webapps/ActivityAssignerTest.java |
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/ActivityAssignerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/ActivityAssignerTest.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..277f386e09fc63885bdcf0df0cf5cc9863ec90cd |
--- /dev/null |
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/ActivityAssignerTest.java |
@@ -0,0 +1,162 @@ |
+// Copyright 2015 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.webapps; |
+ |
+import android.test.InstrumentationTestCase; |
+import android.test.UiThreadTest; |
+import android.test.suitebuilder.annotation.SmallTest; |
+ |
+import org.chromium.base.test.util.AdvancedMockContext; |
+import org.chromium.base.test.util.Feature; |
+ |
+import java.util.HashMap; |
+import java.util.HashSet; |
+import java.util.List; |
+import java.util.Map; |
+ |
+/** |
+ * Tests for the ActivityAssigner class. |
+ */ |
+public class ActivityAssignerTest extends InstrumentationTestCase { |
+ private static final String BASE_WEBAPP_ID = "BASE_WEBAPP_ID_"; |
+ |
+ private AdvancedMockContext mContext; |
+ private HashMap<String, Object> mPreferences; |
+ |
+ @Override |
+ protected void setUp() throws Exception { |
+ super.setUp(); |
+ mContext = new AdvancedMockContext(); |
+ mPreferences = new HashMap<String, Object>(); |
+ mContext.addSharedPreferences(ActivityAssigner.PREF_PACKAGE, mPreferences); |
+ } |
+ |
+ @UiThreadTest |
+ @SmallTest |
+ @Feature({"Webapps"}) |
+ public void testEntriesCreated() { |
+ ActivityAssigner assigner = ActivityAssigner.instance(mContext); |
+ |
+ // Make sure that no webapps have been assigned to any Activities for a fresh install. |
+ checkState(assigner); |
+ List<ActivityAssigner.ActivityEntry> entries = assigner.getEntries(); |
+ assertEquals(ActivityAssigner.NUM_WEBAPP_ACTIVITIES, entries.size()); |
+ for (ActivityAssigner.ActivityEntry entry : entries) { |
+ assertEquals(null, entry.mWebappId); |
+ } |
+ } |
+ |
+ /** |
+ * Make sure invalid entries get culled & that we still have the correct number of unique |
+ * Activity indices available. |
+ */ |
+ @UiThreadTest |
+ @SmallTest |
+ @Feature({"Webapps"}) |
+ public void testEntriesDownsized() { |
+ // Store preferences indicating that more Activities existed previously than there are now. |
+ int numSavedEntries = ActivityAssigner.NUM_WEBAPP_ACTIVITIES + 1; |
+ createPreferences(numSavedEntries); |
+ |
+ ActivityAssigner assigner = ActivityAssigner.instance(mContext); |
+ checkState(assigner); |
+ } |
+ |
+ /** |
+ * Make sure we recover from corrupted stored preferences. |
+ */ |
+ @UiThreadTest |
+ @SmallTest |
+ @Feature({"Webapps"}) |
+ public void testCorruptedPreferences() { |
+ String wrongVariableType = "omgwtfbbq"; |
+ mPreferences.clear(); |
+ mPreferences.put(ActivityAssigner.PREF_NUM_SAVED_ENTRIES, wrongVariableType); |
+ |
+ ActivityAssigner assigner = ActivityAssigner.instance(mContext); |
+ checkState(assigner); |
+ } |
+ |
+ @UiThreadTest |
+ @SmallTest |
+ @Feature({"Webapps"}) |
+ public void testAssignment() { |
+ ActivityAssigner assigner = ActivityAssigner.instance(mContext); |
+ checkState(assigner); |
+ |
+ // Assign all of the Activities to webapps. |
+ // Go backwards to make sure ordering doesn't matter. |
+ Map<String, Integer> testMap = new HashMap<String, Integer>(); |
+ for (int i = ActivityAssigner.NUM_WEBAPP_ACTIVITIES - 1; i >= 0; --i) { |
+ String currentWebappId = BASE_WEBAPP_ID + i; |
+ int activityIndex = assigner.assign(currentWebappId); |
+ testMap.put(currentWebappId, activityIndex); |
+ } |
+ assertEquals(ActivityAssigner.NUM_WEBAPP_ACTIVITIES, testMap.size()); |
+ |
+ // Make sure that passing in the same webapp ID gives back the same Activity. |
+ for (int i = 0; i < ActivityAssigner.NUM_WEBAPP_ACTIVITIES; ++i) { |
+ String currentWebappId = BASE_WEBAPP_ID + i; |
+ int actualIndex = assigner.assign(currentWebappId); |
+ int expectedIndex = testMap.get(currentWebappId); |
+ assertEquals(expectedIndex, actualIndex); |
+ } |
+ |
+ // Access all but the last one to ensure that the last Activity is recycled. |
+ for (int i = 0; i < ActivityAssigner.NUM_WEBAPP_ACTIVITIES - 1; ++i) { |
+ String currentWebappId = BASE_WEBAPP_ID + i; |
+ int activityIndex = testMap.get(currentWebappId); |
+ assigner.markActivityUsed(activityIndex, currentWebappId); |
+ } |
+ |
+ // Make sure that the least recently used Activity is repurposed when we run out. |
+ String overflowWebappId = "OVERFLOW_ID"; |
+ int overflowActivityIndex = assigner.assign(overflowWebappId); |
+ |
+ String lastAssignedWebappId = BASE_WEBAPP_ID + (ActivityAssigner.NUM_WEBAPP_ACTIVITIES - 1); |
+ int lastAssignedCurrentActivityIndex = assigner.assign(lastAssignedWebappId); |
+ int lastAssignedPreviousActivityIndex = testMap.get(lastAssignedWebappId); |
+ |
+ assertEquals("Overflow webapp did not steal the Activity from the other webapp", |
+ lastAssignedPreviousActivityIndex, overflowActivityIndex); |
+ assertNotSame("Webapp did not get reassigned to a new Activity.", |
+ lastAssignedPreviousActivityIndex, lastAssignedCurrentActivityIndex); |
+ |
+ checkState(assigner); |
+ } |
+ |
+ /** Saves state indicating that a number of WebappActivities have already been saved out. */ |
+ private void createPreferences(int numSavedEntries) { |
+ mPreferences.clear(); |
+ mPreferences.put(ActivityAssigner.PREF_NUM_SAVED_ENTRIES, numSavedEntries); |
+ for (int i = 0; i < numSavedEntries; ++i) { |
+ String activityIndexKey = ActivityAssigner.PREF_ACTIVITY_INDEX + i; |
+ mPreferences.put(activityIndexKey, i); |
+ |
+ String webappIdKey = ActivityAssigner.PREF_WEBAPP_ID + i; |
+ String webappIdValue = BASE_WEBAPP_ID + i; |
+ mPreferences.put(webappIdKey, webappIdValue); |
+ } |
+ } |
+ |
+ /** Checks the saved state to make sure it makes sense. */ |
+ private void checkState(ActivityAssigner assigner) { |
+ List<ActivityAssigner.ActivityEntry> entries = assigner.getEntries(); |
+ |
+ // Confirm that the right number of entries in memory and in the preferences. |
+ assertEquals(ActivityAssigner.NUM_WEBAPP_ACTIVITIES, entries.size()); |
+ assertEquals(ActivityAssigner.NUM_WEBAPP_ACTIVITIES, |
+ (int) (Integer) mPreferences.get(ActivityAssigner.PREF_NUM_SAVED_ENTRIES)); |
+ |
+ // Confirm that the Activity indices go from 0 to NUM_WEBAPP_ACTIVITIES - 1. |
+ HashSet<Integer> assignedActivities = new HashSet<Integer>(); |
+ for (ActivityAssigner.ActivityEntry entry : entries) { |
+ assignedActivities.add(entry.mActivityIndex); |
+ } |
+ for (int i = 0; i < ActivityAssigner.NUM_WEBAPP_ACTIVITIES; ++i) { |
+ assertTrue(assignedActivities.contains(i)); |
+ } |
+ } |
+} |