| OLD | NEW |
| (Empty) |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 package org.chromium.chrome.browser.physicalweb; | |
| 6 | |
| 7 import android.content.SharedPreferences; | |
| 8 import android.support.test.filters.SmallTest; | |
| 9 import android.test.InstrumentationTestCase; | |
| 10 | |
| 11 import org.chromium.base.ContextUtils; | |
| 12 import org.chromium.base.test.util.DisabledTest; | |
| 13 import org.chromium.base.test.util.FlakyTest; | |
| 14 import org.chromium.base.test.util.RetryOnFailure; | |
| 15 import org.chromium.content.browser.test.util.Criteria; | |
| 16 import org.chromium.content.browser.test.util.CriteriaHelper; | |
| 17 | |
| 18 import java.util.ArrayList; | |
| 19 import java.util.HashSet; | |
| 20 import java.util.List; | |
| 21 import java.util.Set; | |
| 22 | |
| 23 /** | |
| 24 * Tests for {@link UrlManager}. | |
| 25 */ | |
| 26 public class UrlManagerTest extends InstrumentationTestCase { | |
| 27 private static final String URL1 = "https://example.com/"; | |
| 28 private static final String TITLE1 = "Example"; | |
| 29 private static final String DESC1 = "Example Website"; | |
| 30 private static final String URL2 = "https://google.com/"; | |
| 31 private static final String TITLE2 = "Google"; | |
| 32 private static final String DESC2 = "Search the Web"; | |
| 33 private static final String URL3 = "https://html5zombo.com/"; | |
| 34 private static final String URL4 = "https://hooli.xyz/"; | |
| 35 private static final String URL5 = "https://www.gmail.com/mail/help/paper/"; | |
| 36 private static final String GROUP1 = "group1"; | |
| 37 private static final String GROUP2 = "group2"; | |
| 38 private static final String GROUP3 = "group3"; | |
| 39 private static final String PREF_PHYSICAL_WEB = "physical_web"; | |
| 40 private static final int PHYSICAL_WEB_OFF = 0; | |
| 41 private static final int PHYSICAL_WEB_ON = 1; | |
| 42 private static final int PHYSICAL_WEB_ONBOARDING = 2; | |
| 43 private UrlManager mUrlManager = null; | |
| 44 private MockPwsClient mMockPwsClient = null; | |
| 45 | |
| 46 @Override | |
| 47 protected void setUp() throws Exception { | |
| 48 super.setUp(); | |
| 49 ContextUtils.getAppSharedPreferences().edit() | |
| 50 .putInt(PREF_PHYSICAL_WEB, PHYSICAL_WEB_ON) | |
| 51 .apply(); | |
| 52 UrlManager.clearPrefsForTesting(); | |
| 53 mUrlManager = new UrlManager(); | |
| 54 mMockPwsClient = new MockPwsClient(); | |
| 55 mUrlManager.overridePwsClientForTesting(mMockPwsClient); | |
| 56 } | |
| 57 | |
| 58 private void addPwsResult1() { | |
| 59 ArrayList<PwsResult> results = new ArrayList<>(); | |
| 60 results.add(new PwsResult(URL1, URL1, null, TITLE1, DESC1, GROUP1)); | |
| 61 mMockPwsClient.addPwsResults(results); | |
| 62 } | |
| 63 | |
| 64 private void addPwsResult2() { | |
| 65 ArrayList<PwsResult> results = new ArrayList<>(); | |
| 66 results.add(new PwsResult(URL2, URL2, null, TITLE2, DESC2, GROUP2)); | |
| 67 mMockPwsClient.addPwsResults(results); | |
| 68 } | |
| 69 | |
| 70 private void addUrlInfo1() { | |
| 71 mUrlManager.addUrl(new UrlInfo(URL1)); | |
| 72 } | |
| 73 | |
| 74 private void addUrlInfo2() { | |
| 75 mUrlManager.addUrl(new UrlInfo(URL2)); | |
| 76 } | |
| 77 | |
| 78 private void removeUrlInfo1() { | |
| 79 mUrlManager.removeUrl(new UrlInfo(URL1)); | |
| 80 } | |
| 81 | |
| 82 private void removeUrlInfo2() { | |
| 83 mUrlManager.removeUrl(new UrlInfo(URL2)); | |
| 84 } | |
| 85 | |
| 86 private void addEmptyPwsResult() { | |
| 87 mMockPwsClient.addPwsResults(new ArrayList<PwsResult>()); | |
| 88 } | |
| 89 | |
| 90 private void setOnboarding() { | |
| 91 ContextUtils.getAppSharedPreferences().edit() | |
| 92 .putInt(PREF_PHYSICAL_WEB, PHYSICAL_WEB_ONBOARDING) | |
| 93 .apply(); | |
| 94 } | |
| 95 | |
| 96 @SmallTest | |
| 97 @RetryOnFailure | |
| 98 public void testAddUrlAfterClearAllUrlsWorks() { | |
| 99 addPwsResult1(); | |
| 100 addPwsResult2(); | |
| 101 addPwsResult1(); | |
| 102 addPwsResult2(); | |
| 103 addUrlInfo1(); | |
| 104 addUrlInfo2(); | |
| 105 getInstrumentation().waitForIdleSync(); | |
| 106 mUrlManager.clearAllUrls(); | |
| 107 | |
| 108 // Add some more URLs...this should not crash if we cleared correctly. | |
| 109 addUrlInfo1(); | |
| 110 addUrlInfo2(); | |
| 111 getInstrumentation().waitForIdleSync(); | |
| 112 List<UrlInfo> urlInfos = mUrlManager.getUrls(); | |
| 113 assertEquals(2, urlInfos.size()); | |
| 114 } | |
| 115 | |
| 116 @SmallTest | |
| 117 @RetryOnFailure | |
| 118 public void testClearNearbyUrlsWorks() { | |
| 119 addPwsResult1(); | |
| 120 addPwsResult2(); | |
| 121 addUrlInfo1(); | |
| 122 addUrlInfo2(); | |
| 123 getInstrumentation().waitForIdleSync(); | |
| 124 | |
| 125 mUrlManager.clearNearbyUrls(); | |
| 126 | |
| 127 // Test that the URLs are not nearby, but do exist in the cache. | |
| 128 List<UrlInfo> urlInfos = mUrlManager.getUrls(true); | |
| 129 assertEquals(0, urlInfos.size()); | |
| 130 assertTrue(mUrlManager.containsInAnyCache(URL1)); | |
| 131 assertTrue(mUrlManager.containsInAnyCache(URL2)); | |
| 132 | |
| 133 mUrlManager.clearAllUrls(); | |
| 134 | |
| 135 // Test that cache is empty. | |
| 136 assertFalse(mUrlManager.containsInAnyCache(URL1)); | |
| 137 assertFalse(mUrlManager.containsInAnyCache(URL2)); | |
| 138 } | |
| 139 | |
| 140 @SmallTest | |
| 141 @RetryOnFailure | |
| 142 public void testAddUrlGarbageCollectsForSize() throws Exception { | |
| 143 // Add and remove 101 URLs, making sure one is clearly slightly older th
an the others. | |
| 144 addEmptyPwsResult(); | |
| 145 UrlInfo urlInfo = new UrlInfo(URL1, -1.0, System.currentTimeMillis() - 1
); | |
| 146 mUrlManager.addUrl(urlInfo); | |
| 147 mUrlManager.removeUrl(urlInfo); | |
| 148 for (int i = 1; i <= mUrlManager.getMaxCacheSize(); i++) { | |
| 149 mMockPwsClient.addPwsResults(new ArrayList<PwsResult>()); | |
| 150 urlInfo = new UrlInfo(URL1 + i, -1.0, System.currentTimeMillis()); | |
| 151 mUrlManager.addUrl(urlInfo); | |
| 152 mUrlManager.removeUrl(urlInfo); | |
| 153 } | |
| 154 | |
| 155 // Make our cache is missing the first URL and contains the others. | |
| 156 assertFalse(mUrlManager.containsInAnyCache(URL1)); | |
| 157 assertTrue(mUrlManager.containsInAnyCache(URL1 + 1)); | |
| 158 assertTrue(mUrlManager.containsInAnyCache(URL1 + mUrlManager.getMaxCache
Size())); | |
| 159 } | |
| 160 | |
| 161 @SmallTest | |
| 162 public void testAddUrlGarbageCollectsForAge() throws Exception { | |
| 163 // Add a URL with a phony timestamp. | |
| 164 addEmptyPwsResult(); | |
| 165 addEmptyPwsResult(); | |
| 166 UrlInfo urlInfo1 = new UrlInfo(URL1, -1.0, 0); | |
| 167 UrlInfo urlInfo2 = new UrlInfo(URL2, -1.0, System.currentTimeMillis()); | |
| 168 mUrlManager.addUrl(urlInfo1); | |
| 169 mUrlManager.removeUrl(urlInfo1); | |
| 170 mUrlManager.addUrl(urlInfo2); | |
| 171 mUrlManager.removeUrl(urlInfo2); | |
| 172 | |
| 173 // Make sure only URL2 is still in the cache. | |
| 174 assertFalse(mUrlManager.containsInAnyCache(URL1)); | |
| 175 assertTrue(mUrlManager.containsInAnyCache(URL2)); | |
| 176 } | |
| 177 | |
| 178 @SmallTest | |
| 179 public void testAddUrlUpdatesCache() throws Exception { | |
| 180 addEmptyPwsResult(); | |
| 181 addEmptyPwsResult(); | |
| 182 | |
| 183 UrlInfo urlInfo = new UrlInfo(URL1); | |
| 184 mUrlManager.addUrl(urlInfo); | |
| 185 List<UrlInfo> urls = mUrlManager.getUrls(true); | |
| 186 assertEquals(1, urls.size()); | |
| 187 assertEquals(urlInfo.getDistance(), urls.get(0).getDistance()); | |
| 188 assertEquals(urlInfo.getDeviceAddress(), urls.get(0).getDeviceAddress())
; | |
| 189 assertEquals(urlInfo.getFirstSeenTimestamp(), urls.get(0).getFirstSeenTi
mestamp()); | |
| 190 | |
| 191 urlInfo = new UrlInfo(URL1) | |
| 192 .setDistance(100.0) | |
| 193 .setDeviceAddress("00:11:22:33:AA:BB"); | |
| 194 mUrlManager.addUrl(urlInfo); | |
| 195 urls = mUrlManager.getUrls(true); | |
| 196 assertEquals(1, urls.size()); | |
| 197 assertEquals(urlInfo.getDistance(), urls.get(0).getDistance()); | |
| 198 assertEquals(urlInfo.getDeviceAddress(), urls.get(0).getDeviceAddress())
; | |
| 199 } | |
| 200 | |
| 201 @SmallTest | |
| 202 @RetryOnFailure | |
| 203 public void testAddUrlTwiceWorks() throws Exception { | |
| 204 // Add and remove an old URL twice and add new URL twice before removing
. | |
| 205 // This should cover several issues involved with updating the cache que
ue. | |
| 206 addEmptyPwsResult(); | |
| 207 addEmptyPwsResult(); | |
| 208 addEmptyPwsResult(); | |
| 209 addEmptyPwsResult(); | |
| 210 UrlInfo urlInfo1 = new UrlInfo(URL1, -1.0, 0); | |
| 211 UrlInfo urlInfo2 = new UrlInfo(URL2, -1.0, System.currentTimeMillis()); | |
| 212 mUrlManager.addUrl(urlInfo1); | |
| 213 mUrlManager.removeUrl(urlInfo1); | |
| 214 mUrlManager.addUrl(urlInfo1); | |
| 215 mUrlManager.removeUrl(urlInfo1); | |
| 216 mUrlManager.addUrl(urlInfo2); | |
| 217 mUrlManager.addUrl(urlInfo2); | |
| 218 mUrlManager.removeUrl(urlInfo2); | |
| 219 | |
| 220 // Make sure only URL2 is still in the cache. | |
| 221 assertFalse(mUrlManager.containsInAnyCache(URL1)); | |
| 222 assertTrue(mUrlManager.containsInAnyCache(URL2)); | |
| 223 } | |
| 224 | |
| 225 @SmallTest | |
| 226 public void testGetUrlsSortsAndDedups() throws Exception { | |
| 227 // Construct results with matching group IDs and check that getUrls retu
rns only the closest | |
| 228 // URL in each group. The list should be sorted by distance, closest fir
st. | |
| 229 addPwsResult1(); // GROUP1 | |
| 230 addPwsResult2(); // GROUP2 | |
| 231 mMockPwsClient.addPwsResult(new PwsResult(URL3, URL2 + "#a", null, TITLE
2, DESC2, GROUP2)); | |
| 232 mMockPwsClient.addPwsResult(new PwsResult(URL4, URL1, null, TITLE1, DESC
1, GROUP1)); | |
| 233 mMockPwsClient.addPwsResult(new PwsResult(URL5, URL5, null, TITLE1, DESC
1, GROUP3)); | |
| 234 mUrlManager.addUrl(new UrlInfo(URL1, 30.0, System.currentTimeMillis())); | |
| 235 mUrlManager.addUrl(new UrlInfo(URL2, 20.0, System.currentTimeMillis())); | |
| 236 mUrlManager.addUrl(new UrlInfo(URL3, 10.0, System.currentTimeMillis())); | |
| 237 mUrlManager.addUrl(new UrlInfo(URL4, 40.0, System.currentTimeMillis())); | |
| 238 mUrlManager.addUrl(new UrlInfo(URL5, 50.0, System.currentTimeMillis())); | |
| 239 getInstrumentation().waitForIdleSync(); | |
| 240 | |
| 241 // Make sure URLs are in order and duplicates are omitted. | |
| 242 List<UrlInfo> urlInfos = mUrlManager.getUrls(); | |
| 243 assertEquals(3, urlInfos.size()); | |
| 244 assertEquals(10.0, urlInfos.get(0).getDistance()); | |
| 245 assertEquals(URL3, urlInfos.get(0).getUrl()); | |
| 246 assertEquals(30.0, urlInfos.get(1).getDistance()); | |
| 247 assertEquals(URL1, urlInfos.get(1).getUrl()); | |
| 248 assertEquals(50.0, urlInfos.get(2).getDistance()); | |
| 249 assertEquals(URL5, urlInfos.get(2).getUrl()); | |
| 250 } | |
| 251 | |
| 252 /* | |
| 253 * @SmallTest | |
| 254 * Bug=crbug.com/684148 | |
| 255 */ | |
| 256 @DisabledTest | |
| 257 public void testSerializationWorksWithPoorlySerializedResult() throws Except
ion { | |
| 258 addPwsResult1(); | |
| 259 addPwsResult2(); | |
| 260 long curTime = System.currentTimeMillis(); | |
| 261 mUrlManager.addUrl(new UrlInfo(URL1, 99.5, curTime + 42)); | |
| 262 mUrlManager.addUrl(new UrlInfo(URL2, 100.5, curTime + 43)); | |
| 263 getInstrumentation().waitForIdleSync(); | |
| 264 | |
| 265 // Create an invalid serialization. | |
| 266 Set<String> serializedUrls = new HashSet<>(); | |
| 267 serializedUrls.add(new UrlInfo(URL1, 99.5, curTime + 42).jsonSerialize()
.toString()); | |
| 268 serializedUrls.add("{\"not_a_value\": \"This is totally not a serialized
UrlInfo.\"}"); | |
| 269 ContextUtils.getAppSharedPreferences().edit() | |
| 270 .putStringSet("physicalweb_all_urls", serializedUrls) | |
| 271 .apply(); | |
| 272 | |
| 273 // Make sure only the properly serialized URL is restored. | |
| 274 UrlManager urlManager = new UrlManager(); | |
| 275 List<UrlInfo> urlInfos = urlManager.getUrls(); | |
| 276 assertEquals(0, urlInfos.size()); | |
| 277 assertTrue(urlManager.containsInAnyCache(URL1)); | |
| 278 assertTrue(urlManager.containsInAnyCache(URL2)); | |
| 279 } | |
| 280 | |
| 281 @FlakyTest(message = "https://crbug.com/685471") | |
| 282 @SmallTest | |
| 283 @RetryOnFailure | |
| 284 public void testSerializationWorksWithoutGarbageCollection() throws Exceptio
n { | |
| 285 addPwsResult1(); | |
| 286 addPwsResult2(); | |
| 287 long curTime = System.currentTimeMillis(); | |
| 288 mUrlManager.addUrl(new UrlInfo(URL1, 99.5, curTime + 42)); | |
| 289 mUrlManager.addUrl(new UrlInfo(URL2, 100.5, curTime + 43)); | |
| 290 getInstrumentation().waitForIdleSync(); | |
| 291 | |
| 292 // Make sure all URLs are restored. | |
| 293 UrlManager urlManager = new UrlManager(); | |
| 294 List<UrlInfo> urlInfos = urlManager.getUrls(); | |
| 295 assertEquals(0, urlInfos.size()); | |
| 296 assertTrue(urlManager.containsInAnyCache(URL1)); | |
| 297 assertTrue(urlManager.containsInAnyCache(URL2)); | |
| 298 Set<String> resolvedUrls = urlManager.getResolvedUrls(); | |
| 299 assertEquals(2, resolvedUrls.size()); | |
| 300 } | |
| 301 | |
| 302 @SmallTest | |
| 303 @RetryOnFailure | |
| 304 public void testSerializationWorksWithGarbageCollection() throws Exception { | |
| 305 addPwsResult1(); | |
| 306 addPwsResult2(); | |
| 307 mUrlManager.addUrl(new UrlInfo(URL1, 99.5, 42)); | |
| 308 mUrlManager.addUrl(new UrlInfo(URL2, 100.5, 43)); | |
| 309 getInstrumentation().waitForIdleSync(); | |
| 310 | |
| 311 // Make sure all URLs are restored. | |
| 312 UrlManager urlManager = new UrlManager(); | |
| 313 List<UrlInfo> urlInfos = urlManager.getUrls(); | |
| 314 assertEquals(0, urlInfos.size()); | |
| 315 Set<String> resolvedUrls = urlManager.getResolvedUrls(); | |
| 316 assertEquals(0, resolvedUrls.size()); | |
| 317 } | |
| 318 | |
| 319 @SmallTest | |
| 320 public void testUpgradeFromNone() throws Exception { | |
| 321 Set<String> oldResolvedUrls = new HashSet<String>(); | |
| 322 oldResolvedUrls.add("old"); | |
| 323 ContextUtils.getAppSharedPreferences().edit() | |
| 324 .remove(UrlManager.getVersionKey()) | |
| 325 .putStringSet("physicalweb_nearby_urls", oldResolvedUrls) | |
| 326 .putInt("org.chromium.chrome.browser.physicalweb.VERSION", 1) | |
| 327 .putInt("org.chromium.chrome.browser.physicalweb.BOTTOM_BAR_DISP
LAY_COUNT", 1) | |
| 328 .apply(); | |
| 329 new UrlManager(); | |
| 330 | |
| 331 // Make sure the new prefs are populated and old prefs are gone. | |
| 332 final SharedPreferences sharedPreferences = ContextUtils.getAppSharedPre
ferences(); | |
| 333 CriteriaHelper.pollInstrumentationThread(new Criteria() { | |
| 334 @Override | |
| 335 public boolean isSatisfied() { | |
| 336 SharedPreferences sharedPreferences = ContextUtils.getAppSharedP
references(); | |
| 337 return sharedPreferences.contains(UrlManager.getVersionKey()) | |
| 338 && !sharedPreferences.contains("physicalweb_nearby_urls"
) | |
| 339 && !sharedPreferences.contains( | |
| 340 "org.chromium.chrome.browser.physicalweb.VERSION
") | |
| 341 && !sharedPreferences.contains("org.chromium.chrome.brow
ser.physicalweb" | |
| 342 + ".BOTTOM_BAR_DISPLAY_COUNT"); | |
| 343 } | |
| 344 }, 5000, CriteriaHelper.DEFAULT_POLLING_INTERVAL); | |
| 345 | |
| 346 assertEquals(UrlManager.getVersion(), | |
| 347 sharedPreferences.getInt(UrlManager.getVersionKey(), 0)); | |
| 348 } | |
| 349 } | |
| OLD | NEW |