| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.chrome.browser.customtabs; | 5 package org.chromium.chrome.browser.customtabs; |
| 6 | 6 |
| 7 import static org.chromium.base.test.util.Restriction.RESTRICTION_TYPE_NON_LOW_E
ND_DEVICE; | 7 import static org.chromium.base.test.util.Restriction.RESTRICTION_TYPE_NON_LOW_E
ND_DEVICE; |
| 8 | 8 |
| 9 import android.app.Application; | 9 import android.app.Application; |
| 10 import android.content.Context; | 10 import android.content.Context; |
| 11 import android.content.Intent; | 11 import android.content.Intent; |
| 12 import android.net.Uri; | 12 import android.net.Uri; |
| 13 import android.os.Build; | 13 import android.os.Build; |
| 14 import android.os.Bundle; | 14 import android.os.Bundle; |
| 15 import android.os.Process; | 15 import android.os.Process; |
| 16 import android.support.customtabs.CustomTabsService; | 16 import android.support.customtabs.CustomTabsService; |
| 17 import android.support.customtabs.CustomTabsSessionToken; | 17 import android.support.customtabs.CustomTabsSessionToken; |
| 18 import android.support.test.InstrumentationRegistry; |
| 18 import android.support.test.filters.SmallTest; | 19 import android.support.test.filters.SmallTest; |
| 19 import android.test.InstrumentationTestCase; | 20 |
| 21 import org.junit.After; |
| 22 import org.junit.Assert; |
| 23 import org.junit.Before; |
| 24 import org.junit.Test; |
| 25 import org.junit.runner.RunWith; |
| 20 | 26 |
| 21 import org.chromium.base.PathUtils; | 27 import org.chromium.base.PathUtils; |
| 22 import org.chromium.base.ThreadUtils; | 28 import org.chromium.base.ThreadUtils; |
| 23 import org.chromium.base.library_loader.LibraryLoader; | 29 import org.chromium.base.library_loader.LibraryLoader; |
| 24 import org.chromium.base.library_loader.LibraryProcessType; | 30 import org.chromium.base.library_loader.LibraryProcessType; |
| 25 import org.chromium.base.test.util.Restriction; | 31 import org.chromium.base.test.util.Restriction; |
| 26 import org.chromium.base.test.util.RetryOnFailure; | 32 import org.chromium.base.test.util.RetryOnFailure; |
| 27 import org.chromium.chrome.browser.WarmupManager; | 33 import org.chromium.chrome.browser.WarmupManager; |
| 28 import org.chromium.chrome.browser.preferences.PrefServiceBridge; | 34 import org.chromium.chrome.browser.preferences.PrefServiceBridge; |
| 35 import org.chromium.chrome.test.ChromeJUnit4ClassRunner; |
| 29 import org.chromium.content_public.browser.WebContents; | 36 import org.chromium.content_public.browser.WebContents; |
| 30 | 37 |
| 31 import java.util.ArrayList; | 38 import java.util.ArrayList; |
| 32 import java.util.List; | 39 import java.util.List; |
| 33 import java.util.concurrent.Callable; | 40 import java.util.concurrent.Callable; |
| 34 import java.util.concurrent.FutureTask; | 41 import java.util.concurrent.FutureTask; |
| 35 | 42 |
| 36 /** Tests for CustomTabsConnection. */ | 43 /** Tests for CustomTabsConnection. */ |
| 37 public class CustomTabsConnectionTest extends InstrumentationTestCase { | 44 @RunWith(ChromeJUnit4ClassRunner.class) |
| 45 public class CustomTabsConnectionTest { |
| 38 private CustomTabsConnection mCustomTabsConnection; | 46 private CustomTabsConnection mCustomTabsConnection; |
| 39 private static final String URL = "http://www.google.com"; | 47 private static final String URL = "http://www.google.com"; |
| 40 private static final String URL2 = "https://www.android.com"; | 48 private static final String URL2 = "https://www.android.com"; |
| 41 private static final String INVALID_SCHEME_URL = "intent://www.google.com"; | 49 private static final String INVALID_SCHEME_URL = "intent://www.google.com"; |
| 42 private static final String PRIVATE_DATA_DIRECTORY_SUFFIX = "chrome"; | 50 private static final String PRIVATE_DATA_DIRECTORY_SUFFIX = "chrome"; |
| 43 | 51 |
| 44 private Context mAppContext; | 52 private Context mAppContext; |
| 45 | 53 |
| 46 @Override | 54 @Before |
| 47 protected void setUp() throws Exception { | 55 public void setUp() throws Exception { |
| 48 super.setUp(); | 56 mAppContext = InstrumentationRegistry.getInstrumentation() |
| 49 mAppContext = getInstrumentation().getTargetContext().getApplicationCont
ext(); | 57 .getTargetContext() |
| 58 .getApplicationContext(); |
| 50 PathUtils.setPrivateDataDirectorySuffix(PRIVATE_DATA_DIRECTORY_SUFFIX); | 59 PathUtils.setPrivateDataDirectorySuffix(PRIVATE_DATA_DIRECTORY_SUFFIX); |
| 51 LibraryLoader.get(LibraryProcessType.PROCESS_BROWSER).ensureInitialized(
); | 60 LibraryLoader.get(LibraryProcessType.PROCESS_BROWSER).ensureInitialized(
); |
| 52 mCustomTabsConnection = CustomTabsTestUtils.setUpConnection((Application
) mAppContext); | 61 mCustomTabsConnection = CustomTabsTestUtils.setUpConnection((Application
) mAppContext); |
| 53 mCustomTabsConnection.resetThrottling(mAppContext, Process.myUid()); | 62 mCustomTabsConnection.resetThrottling(mAppContext, Process.myUid()); |
| 54 } | 63 } |
| 55 | 64 |
| 56 @Override | 65 @After |
| 57 protected void tearDown() throws Exception { | 66 public void tearDown() throws Exception { |
| 58 super.tearDown(); | |
| 59 CustomTabsTestUtils.cleanupSessions(mCustomTabsConnection); | 67 CustomTabsTestUtils.cleanupSessions(mCustomTabsConnection); |
| 60 ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 68 ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| 61 @Override | 69 @Override |
| 62 public void run() { | 70 public void run() { |
| 63 WarmupManager.getInstance().destroySpareWebContents(); | 71 WarmupManager.getInstance().destroySpareWebContents(); |
| 64 } | 72 } |
| 65 }); | 73 }); |
| 66 } | 74 } |
| 67 | 75 |
| 68 /** | 76 /** |
| 69 * Tests that we can create a new session. Registering with a null callback | 77 * Tests that we can create a new session. Registering with a null callback |
| 70 * fails, as well as multiple sessions with the same callback. | 78 * fails, as well as multiple sessions with the same callback. |
| 71 */ | 79 */ |
| 80 @Test |
| 72 @SmallTest | 81 @SmallTest |
| 73 public void testNewSession() { | 82 public void testNewSession() { |
| 74 assertEquals(false, mCustomTabsConnection.newSession(null)); | 83 Assert.assertEquals(false, mCustomTabsConnection.newSession(null)); |
| 75 CustomTabsSessionToken token = CustomTabsSessionToken.createDummySession
TokenForTesting(); | 84 CustomTabsSessionToken token = CustomTabsSessionToken.createDummySession
TokenForTesting(); |
| 76 assertEquals(true, mCustomTabsConnection.newSession(token)); | 85 Assert.assertEquals(true, mCustomTabsConnection.newSession(token)); |
| 77 assertEquals(false, mCustomTabsConnection.newSession(token)); | 86 Assert.assertEquals(false, mCustomTabsConnection.newSession(token)); |
| 78 } | 87 } |
| 79 | 88 |
| 80 /** | 89 /** |
| 81 * Tests that we can create several sessions. | 90 * Tests that we can create several sessions. |
| 82 */ | 91 */ |
| 92 @Test |
| 83 @SmallTest | 93 @SmallTest |
| 84 public void testSeveralSessions() { | 94 public void testSeveralSessions() { |
| 85 CustomTabsSessionToken token = CustomTabsSessionToken.createDummySession
TokenForTesting(); | 95 CustomTabsSessionToken token = CustomTabsSessionToken.createDummySession
TokenForTesting(); |
| 86 assertEquals(true, mCustomTabsConnection.newSession(token)); | 96 Assert.assertEquals(true, mCustomTabsConnection.newSession(token)); |
| 87 CustomTabsSessionToken token2 = CustomTabsSessionToken.createDummySessio
nTokenForTesting(); | 97 CustomTabsSessionToken token2 = CustomTabsSessionToken.createDummySessio
nTokenForTesting(); |
| 88 assertEquals(true, mCustomTabsConnection.newSession(token2)); | 98 Assert.assertEquals(true, mCustomTabsConnection.newSession(token2)); |
| 89 } | 99 } |
| 90 | 100 |
| 91 /** | 101 /** |
| 92 * Tests that {@link CustomTabsConnection#warmup(long)} succeeds and can | 102 * Tests that {@link CustomTabsConnection#warmup(long)} succeeds and can |
| 93 * be issued multiple times. | 103 * be issued multiple times. |
| 94 */ | 104 */ |
| 105 @Test |
| 95 @SmallTest | 106 @SmallTest |
| 96 public void testCanWarmup() { | 107 public void testCanWarmup() { |
| 97 assertEquals(true, mCustomTabsConnection.warmup(0)); | 108 Assert.assertEquals(true, mCustomTabsConnection.warmup(0)); |
| 98 assertEquals(true, mCustomTabsConnection.warmup(0)); | 109 Assert.assertEquals(true, mCustomTabsConnection.warmup(0)); |
| 99 } | 110 } |
| 100 | 111 |
| 112 @Test |
| 101 @SmallTest | 113 @SmallTest |
| 102 @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) | 114 @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) |
| 103 public void testCreateSpareRenderer() { | 115 public void testCreateSpareRenderer() { |
| 104 assertTrue(mCustomTabsConnection.warmup(0)); | 116 Assert.assertTrue(mCustomTabsConnection.warmup(0)); |
| 105 // On UI thread because: | 117 // On UI thread because: |
| 106 // 1. takeSpareWebContents needs to be called from the UI thread. | 118 // 1. takeSpareWebContents needs to be called from the UI thread. |
| 107 // 2. warmup() is non-blocking and posts tasks to the UI thread, it ensu
res proper ordering. | 119 // 2. warmup() is non-blocking and posts tasks to the UI thread, it ensu
res proper ordering. |
| 108 ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 120 ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| 109 @Override | 121 @Override |
| 110 public void run() { | 122 public void run() { |
| 111 WarmupManager warmupManager = WarmupManager.getInstance(); | 123 WarmupManager warmupManager = WarmupManager.getInstance(); |
| 112 assertTrue(warmupManager.hasSpareWebContents()); | 124 Assert.assertTrue(warmupManager.hasSpareWebContents()); |
| 113 WebContents webContents = warmupManager.takeSpareWebContents(fal
se, false); | 125 WebContents webContents = warmupManager.takeSpareWebContents(fal
se, false); |
| 114 assertNotNull(webContents); | 126 Assert.assertNotNull(webContents); |
| 115 assertFalse(warmupManager.hasSpareWebContents()); | 127 Assert.assertFalse(warmupManager.hasSpareWebContents()); |
| 116 webContents.destroy(); | 128 webContents.destroy(); |
| 117 } | 129 } |
| 118 }); | 130 }); |
| 119 } | 131 } |
| 120 | 132 |
| 133 @Test |
| 121 @SmallTest | 134 @SmallTest |
| 122 @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) | 135 @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) |
| 123 public void testCreateSpareRendererCanBeRecreated() { | 136 public void testCreateSpareRendererCanBeRecreated() { |
| 124 assertTrue(mCustomTabsConnection.warmup(0)); | 137 Assert.assertTrue(mCustomTabsConnection.warmup(0)); |
| 125 ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 138 ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| 126 @Override | 139 @Override |
| 127 public void run() { | 140 public void run() { |
| 128 assertSpareWebContentsNotNullAndDestroy(); | 141 assertSpareWebContentsNotNullAndDestroy(); |
| 129 assertFalse(WarmupManager.getInstance().hasSpareWebContents()); | 142 Assert.assertFalse(WarmupManager.getInstance().hasSpareWebConten
ts()); |
| 130 } | 143 } |
| 131 }); | 144 }); |
| 132 assertTrue(mCustomTabsConnection.warmup(0)); | 145 Assert.assertTrue(mCustomTabsConnection.warmup(0)); |
| 133 ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 146 ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| 134 @Override | 147 @Override |
| 135 public void run() { | 148 public void run() { |
| 136 assertSpareWebContentsNotNullAndDestroy(); | 149 assertSpareWebContentsNotNullAndDestroy(); |
| 137 } | 150 } |
| 138 }); | 151 }); |
| 139 } | 152 } |
| 140 | 153 |
| 154 @Test |
| 141 @SmallTest | 155 @SmallTest |
| 142 @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) | 156 @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) |
| 143 public void testPrerenderDestroysSpareRenderer() { | 157 public void testPrerenderDestroysSpareRenderer() { |
| 144 final CustomTabsSessionToken token = assertWarmupAndMayLaunchUrl(null, U
RL, true); | 158 final CustomTabsSessionToken token = assertWarmupAndMayLaunchUrl(null, U
RL, true); |
| 145 ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 159 ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| 146 @Override | 160 @Override |
| 147 public void run() { | 161 public void run() { |
| 148 assertFalse(WarmupManager.getInstance().hasSpareWebContents()); | 162 Assert.assertFalse(WarmupManager.getInstance().hasSpareWebConten
ts()); |
| 149 String referrer = | 163 String referrer = |
| 150 mCustomTabsConnection.getReferrerForSession(token).getUr
l(); | 164 mCustomTabsConnection.getReferrerForSession(token).getUr
l(); |
| 151 WebContents webContents = | 165 WebContents webContents = |
| 152 mCustomTabsConnection.takePrerenderedUrl(token, URL, ref
errer); | 166 mCustomTabsConnection.takePrerenderedUrl(token, URL, ref
errer); |
| 153 assertNotNull(webContents); | 167 Assert.assertNotNull(webContents); |
| 154 webContents.destroy(); | 168 webContents.destroy(); |
| 155 } | 169 } |
| 156 }); | 170 }); |
| 157 } | 171 } |
| 158 | 172 |
| 159 /* | 173 /* |
| 160 * Tests that when the disconnection notification comes from a non-UI thread
, Chrome doesn't | 174 * Tests that when the disconnection notification comes from a non-UI thread
, Chrome doesn't |
| 161 * crash. Non-regression test for crbug.com/623128. | 175 * crash. Non-regression test for crbug.com/623128. |
| 162 */ | 176 */ |
| 177 @Test |
| 163 @SmallTest | 178 @SmallTest |
| 164 @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) | 179 @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) |
| 165 public void testPrerenderAndDisconnectOnOtherThread() { | 180 public void testPrerenderAndDisconnectOnOtherThread() { |
| 166 final CustomTabsSessionToken token = assertWarmupAndMayLaunchUrl(null, U
RL, true); | 181 final CustomTabsSessionToken token = assertWarmupAndMayLaunchUrl(null, U
RL, true); |
| 167 final Thread otherThread = new Thread(new Runnable() { | 182 final Thread otherThread = new Thread(new Runnable() { |
| 168 @Override | 183 @Override |
| 169 public void run() { | 184 public void run() { |
| 170 mCustomTabsConnection.cleanUpSession(token); | 185 mCustomTabsConnection.cleanUpSession(token); |
| 171 } | 186 } |
| 172 }); | 187 }); |
| 173 | 188 |
| 174 ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 189 ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| 175 @Override | 190 @Override |
| 176 public void run() { | 191 public void run() { |
| 177 otherThread.start(); | 192 otherThread.start(); |
| 178 } | 193 } |
| 179 }); | 194 }); |
| 180 // Should not crash, hence no assertions below. | 195 // Should not crash, hence no assertions below. |
| 181 } | 196 } |
| 182 | 197 |
| 198 @Test |
| 183 @SmallTest | 199 @SmallTest |
| 184 @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) | 200 @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) |
| 185 public void testMayLaunchUrlKeepsSpareRendererWithoutPrerendering() { | 201 public void testMayLaunchUrlKeepsSpareRendererWithoutPrerendering() { |
| 186 assertTrue(mCustomTabsConnection.warmup(0)); | 202 Assert.assertTrue(mCustomTabsConnection.warmup(0)); |
| 187 final CustomTabsSessionToken token = | 203 final CustomTabsSessionToken token = |
| 188 CustomTabsSessionToken.createDummySessionTokenForTesting(); | 204 CustomTabsSessionToken.createDummySessionTokenForTesting(); |
| 189 assertTrue(mCustomTabsConnection.newSession(token)); | 205 Assert.assertTrue(mCustomTabsConnection.newSession(token)); |
| 190 | 206 |
| 191 Bundle extras = new Bundle(); | 207 Bundle extras = new Bundle(); |
| 192 extras.putInt( | 208 extras.putInt( |
| 193 CustomTabsConnection.DEBUG_OVERRIDE_KEY, CustomTabsConnection.NO
_PRERENDERING); | 209 CustomTabsConnection.DEBUG_OVERRIDE_KEY, CustomTabsConnection.NO
_PRERENDERING); |
| 194 assertTrue(mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL), ext
ras, null)); | 210 Assert.assertTrue(mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(UR
L), extras, null)); |
| 195 | 211 |
| 196 ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 212 ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| 197 @Override | 213 @Override |
| 198 public void run() { | 214 public void run() { |
| 199 assertSpareWebContentsNotNullAndDestroy(); | 215 assertSpareWebContentsNotNullAndDestroy(); |
| 200 } | 216 } |
| 201 }); | 217 }); |
| 202 } | 218 } |
| 203 | 219 |
| 220 @Test |
| 204 @SmallTest | 221 @SmallTest |
| 205 public void testMayLaunchUrlNullOrEmptyUrl() { | 222 public void testMayLaunchUrlNullOrEmptyUrl() { |
| 206 assertWarmupAndMayLaunchUrl(null, null, true); | 223 assertWarmupAndMayLaunchUrl(null, null, true); |
| 207 CustomTabsTestUtils.cleanupSessions(mCustomTabsConnection); // Resets th
rottling. | 224 CustomTabsTestUtils.cleanupSessions(mCustomTabsConnection); // Resets th
rottling. |
| 208 assertWarmupAndMayLaunchUrl(null, "", true); | 225 assertWarmupAndMayLaunchUrl(null, "", true); |
| 209 } | 226 } |
| 210 | 227 |
| 228 @Test |
| 211 @SmallTest | 229 @SmallTest |
| 212 @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) | 230 @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) |
| 213 public void testUnderstandsLowConfidenceMayLaunchUrl() { | 231 public void testUnderstandsLowConfidenceMayLaunchUrl() { |
| 214 final CustomTabsSessionToken token = | 232 final CustomTabsSessionToken token = |
| 215 CustomTabsSessionToken.createDummySessionTokenForTesting(); | 233 CustomTabsSessionToken.createDummySessionTokenForTesting(); |
| 216 assertTrue(mCustomTabsConnection.newSession(token)); | 234 Assert.assertTrue(mCustomTabsConnection.newSession(token)); |
| 217 List<Bundle> urls = new ArrayList<>(); | 235 List<Bundle> urls = new ArrayList<>(); |
| 218 Bundle urlBundle = new Bundle(); | 236 Bundle urlBundle = new Bundle(); |
| 219 urlBundle.putParcelable(CustomTabsService.KEY_URL, Uri.parse(URL)); | 237 urlBundle.putParcelable(CustomTabsService.KEY_URL, Uri.parse(URL)); |
| 220 urls.add(urlBundle); | 238 urls.add(urlBundle); |
| 221 mCustomTabsConnection.mayLaunchUrl(token, null, null, urls); | 239 mCustomTabsConnection.mayLaunchUrl(token, null, null, urls); |
| 222 | 240 |
| 223 ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 241 ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| 224 @Override | 242 @Override |
| 225 public void run() { | 243 public void run() { |
| 226 assertSpareWebContentsNotNullAndDestroy(); | 244 assertSpareWebContentsNotNullAndDestroy(); |
| 227 String referrer = mCustomTabsConnection.getReferrerForSession(to
ken).getUrl(); | 245 String referrer = mCustomTabsConnection.getReferrerForSession(to
ken).getUrl(); |
| 228 assertNull(mCustomTabsConnection.takePrerenderedUrl(token, URL,
referrer)); | 246 Assert.assertNull(mCustomTabsConnection.takePrerenderedUrl(token
, URL, referrer)); |
| 229 } | 247 } |
| 230 }); | 248 }); |
| 231 } | 249 } |
| 232 | 250 |
| 251 @Test |
| 233 @SmallTest | 252 @SmallTest |
| 234 public void testLowConfidenceMayLaunchUrlOnlyAcceptUris() { | 253 public void testLowConfidenceMayLaunchUrlOnlyAcceptUris() { |
| 235 final CustomTabsSessionToken token = | 254 final CustomTabsSessionToken token = |
| 236 CustomTabsSessionToken.createDummySessionTokenForTesting(); | 255 CustomTabsSessionToken.createDummySessionTokenForTesting(); |
| 237 assertTrue(mCustomTabsConnection.newSession(token)); | 256 Assert.assertTrue(mCustomTabsConnection.newSession(token)); |
| 238 assertTrue(mCustomTabsConnection.warmup(0)); | 257 Assert.assertTrue(mCustomTabsConnection.warmup(0)); |
| 239 | 258 |
| 240 final List<Bundle> urlsAsString = new ArrayList<>(); | 259 final List<Bundle> urlsAsString = new ArrayList<>(); |
| 241 Bundle urlStringBundle = new Bundle(); | 260 Bundle urlStringBundle = new Bundle(); |
| 242 urlStringBundle.putString(CustomTabsService.KEY_URL, URL); | 261 urlStringBundle.putString(CustomTabsService.KEY_URL, URL); |
| 243 urlsAsString.add(urlStringBundle); | 262 urlsAsString.add(urlStringBundle); |
| 244 | 263 |
| 245 final List<Bundle> urlsAsUri = new ArrayList<>(); | 264 final List<Bundle> urlsAsUri = new ArrayList<>(); |
| 246 Bundle urlUriBundle = new Bundle(); | 265 Bundle urlUriBundle = new Bundle(); |
| 247 urlUriBundle.putParcelable(CustomTabsService.KEY_URL, Uri.parse(URL)); | 266 urlUriBundle.putParcelable(CustomTabsService.KEY_URL, Uri.parse(URL)); |
| 248 urlsAsUri.add(urlUriBundle); | 267 urlsAsUri.add(urlUriBundle); |
| 249 | 268 |
| 250 ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 269 ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| 251 @Override | 270 @Override |
| 252 public void run() { | 271 public void run() { |
| 253 assertFalse(mCustomTabsConnection.lowConfidenceMayLaunchUrl(urls
AsString)); | 272 Assert.assertFalse(mCustomTabsConnection.lowConfidenceMayLaunchU
rl(urlsAsString)); |
| 254 assertTrue(mCustomTabsConnection.lowConfidenceMayLaunchUrl(urlsA
sUri)); | 273 Assert.assertTrue(mCustomTabsConnection.lowConfidenceMayLaunchUr
l(urlsAsUri)); |
| 255 } | 274 } |
| 256 }); | 275 }); |
| 257 } | 276 } |
| 258 | 277 |
| 278 @Test |
| 259 @SmallTest | 279 @SmallTest |
| 260 public void testLowConfidenceMayLaunchUrlDoesntCrash() { | 280 public void testLowConfidenceMayLaunchUrlDoesntCrash() { |
| 261 final CustomTabsSessionToken token = | 281 final CustomTabsSessionToken token = |
| 262 CustomTabsSessionToken.createDummySessionTokenForTesting(); | 282 CustomTabsSessionToken.createDummySessionTokenForTesting(); |
| 263 assertTrue(mCustomTabsConnection.newSession(token)); | 283 Assert.assertTrue(mCustomTabsConnection.newSession(token)); |
| 264 assertTrue(mCustomTabsConnection.warmup(0)); | 284 Assert.assertTrue(mCustomTabsConnection.warmup(0)); |
| 265 | 285 |
| 266 final List<Bundle> invalidBundles = new ArrayList<>(); | 286 final List<Bundle> invalidBundles = new ArrayList<>(); |
| 267 Bundle invalidBundle = new Bundle(); | 287 Bundle invalidBundle = new Bundle(); |
| 268 invalidBundle.putParcelable(CustomTabsService.KEY_URL, new Intent()); | 288 invalidBundle.putParcelable(CustomTabsService.KEY_URL, new Intent()); |
| 269 invalidBundles.add(invalidBundle); | 289 invalidBundles.add(invalidBundle); |
| 270 | 290 |
| 271 ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 291 ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| 272 @Override | 292 @Override |
| 273 public void run() { | 293 public void run() { |
| 274 try { | 294 try { |
| 275 mCustomTabsConnection.lowConfidenceMayLaunchUrl(invalidBundl
es); | 295 mCustomTabsConnection.lowConfidenceMayLaunchUrl(invalidBundl
es); |
| 276 } catch (ClassCastException e) { | 296 } catch (ClassCastException e) { |
| 277 fail(); | 297 Assert.fail(); |
| 278 } | 298 } |
| 279 } | 299 } |
| 280 }); | 300 }); |
| 281 } | 301 } |
| 282 | 302 |
| 303 @Test |
| 283 @SmallTest | 304 @SmallTest |
| 284 @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) | 305 @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) |
| 285 public void testStillHighConfidenceMayLaunchUrlWithSeveralUrls() { | 306 public void testStillHighConfidenceMayLaunchUrlWithSeveralUrls() { |
| 286 final CustomTabsSessionToken token = | 307 final CustomTabsSessionToken token = |
| 287 CustomTabsSessionToken.createDummySessionTokenForTesting(); | 308 CustomTabsSessionToken.createDummySessionTokenForTesting(); |
| 288 assertTrue(mCustomTabsConnection.newSession(token)); | 309 Assert.assertTrue(mCustomTabsConnection.newSession(token)); |
| 289 List<Bundle> urls = new ArrayList<>(); | 310 List<Bundle> urls = new ArrayList<>(); |
| 290 Bundle urlBundle = new Bundle(); | 311 Bundle urlBundle = new Bundle(); |
| 291 urlBundle.putParcelable(CustomTabsService.KEY_URL, Uri.parse(URL)); | 312 urlBundle.putParcelable(CustomTabsService.KEY_URL, Uri.parse(URL)); |
| 292 urls.add(urlBundle); | 313 urls.add(urlBundle); |
| 293 | 314 |
| 294 mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL), null, urls); | 315 mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL), null, urls); |
| 295 ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 316 ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| 296 @Override | 317 @Override |
| 297 public void run() { | 318 public void run() { |
| 298 assertNull(WarmupManager.getInstance().takeSpareWebContents(fals
e, false)); | 319 Assert.assertNull(WarmupManager.getInstance().takeSpareWebConten
ts(false, false)); |
| 299 String referrer = mCustomTabsConnection.getReferrerForSession(to
ken).getUrl(); | 320 String referrer = mCustomTabsConnection.getReferrerForSession(to
ken).getUrl(); |
| 300 assertNotNull(mCustomTabsConnection.takePrerenderedUrl(token, UR
L, referrer)); | 321 Assert.assertNotNull( |
| 322 mCustomTabsConnection.takePrerenderedUrl(token, URL, ref
errer)); |
| 301 } | 323 } |
| 302 }); | 324 }); |
| 303 } | 325 } |
| 304 | 326 |
| 327 @Test |
| 305 @SmallTest | 328 @SmallTest |
| 306 @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) | 329 @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) |
| 307 public void testPrefetchOnlyNoPrerenderHasSpareWebContents() { | 330 public void testPrefetchOnlyNoPrerenderHasSpareWebContents() { |
| 308 assertTrue(mCustomTabsConnection.warmup(0)); | 331 Assert.assertTrue(mCustomTabsConnection.warmup(0)); |
| 309 final CustomTabsSessionToken token = | 332 final CustomTabsSessionToken token = |
| 310 CustomTabsSessionToken.createDummySessionTokenForTesting(); | 333 CustomTabsSessionToken.createDummySessionTokenForTesting(); |
| 311 assertTrue(mCustomTabsConnection.newSession(token)); | 334 Assert.assertTrue(mCustomTabsConnection.newSession(token)); |
| 312 | 335 |
| 313 Bundle extras = new Bundle(); | 336 Bundle extras = new Bundle(); |
| 314 extras.putInt(CustomTabsConnection.DEBUG_OVERRIDE_KEY, CustomTabsConnect
ion.PREFETCH_ONLY); | 337 extras.putInt(CustomTabsConnection.DEBUG_OVERRIDE_KEY, CustomTabsConnect
ion.PREFETCH_ONLY); |
| 315 assertTrue(mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL), ext
ras, null)); | 338 Assert.assertTrue(mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(UR
L), extras, null)); |
| 316 | 339 |
| 317 ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 340 ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| 318 @Override | 341 @Override |
| 319 public void run() { | 342 public void run() { |
| 320 assertSpareWebContentsNotNullAndDestroy(); | 343 assertSpareWebContentsNotNullAndDestroy(); |
| 321 } | 344 } |
| 322 }); | 345 }); |
| 323 } | 346 } |
| 324 | 347 |
| 348 @Test |
| 325 @SmallTest | 349 @SmallTest |
| 326 @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) | 350 @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) |
| 327 @RetryOnFailure | 351 @RetryOnFailure |
| 328 public void testCanCancelPrerender() { | 352 public void testCanCancelPrerender() { |
| 329 final CustomTabsSessionToken token = assertWarmupAndMayLaunchUrl(null, U
RL, true); | 353 final CustomTabsSessionToken token = assertWarmupAndMayLaunchUrl(null, U
RL, true); |
| 330 ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 354 ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| 331 @Override | 355 @Override |
| 332 public void run() { | 356 public void run() { |
| 333 assertNull(WarmupManager.getInstance().takeSpareWebContents(fals
e, false)); | 357 Assert.assertNull(WarmupManager.getInstance().takeSpareWebConten
ts(false, false)); |
| 334 } | 358 } |
| 335 }); | 359 }); |
| 336 assertTrue(mCustomTabsConnection.mayLaunchUrl(token, null, null, null)); | 360 Assert.assertTrue(mCustomTabsConnection.mayLaunchUrl(token, null, null,
null)); |
| 337 // mayLaunchUrl() posts a task, the following has to run after it. | 361 // mayLaunchUrl() posts a task, the following has to run after it. |
| 338 ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 362 ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| 339 @Override | 363 @Override |
| 340 public void run() { | 364 public void run() { |
| 341 String referrer = mCustomTabsConnection.getReferrerForSession(to
ken).getUrl(); | 365 String referrer = mCustomTabsConnection.getReferrerForSession(to
ken).getUrl(); |
| 342 assertNull(mCustomTabsConnection.takePrerenderedUrl(token, URL,
referrer)); | 366 Assert.assertNull(mCustomTabsConnection.takePrerenderedUrl(token
, URL, referrer)); |
| 343 } | 367 } |
| 344 }); | 368 }); |
| 345 } | 369 } |
| 346 | 370 |
| 347 private void assertSpareWebContentsNotNullAndDestroy() { | 371 private void assertSpareWebContentsNotNullAndDestroy() { |
| 348 WebContents webContents = WarmupManager.getInstance().takeSpareWebConten
ts(false, false); | 372 WebContents webContents = WarmupManager.getInstance().takeSpareWebConten
ts(false, false); |
| 349 assertNotNull(webContents); | 373 Assert.assertNotNull(webContents); |
| 350 webContents.destroy(); | 374 webContents.destroy(); |
| 351 } | 375 } |
| 352 | 376 |
| 353 /** | 377 /** |
| 354 * Calls warmup() and mayLaunchUrl(), checks for the expected result | 378 * Calls warmup() and mayLaunchUrl(), checks for the expected result |
| 355 * (success or failure) and returns the result code. | 379 * (success or failure) and returns the result code. |
| 356 */ | 380 */ |
| 357 private CustomTabsSessionToken assertWarmupAndMayLaunchUrl( | 381 private CustomTabsSessionToken assertWarmupAndMayLaunchUrl( |
| 358 CustomTabsSessionToken token, String url, boolean shouldSucceed) { | 382 CustomTabsSessionToken token, String url, boolean shouldSucceed) { |
| 359 mCustomTabsConnection.warmup(0); | 383 mCustomTabsConnection.warmup(0); |
| 360 if (token == null) { | 384 if (token == null) { |
| 361 token = CustomTabsSessionToken.createDummySessionTokenForTesting(); | 385 token = CustomTabsSessionToken.createDummySessionTokenForTesting(); |
| 362 mCustomTabsConnection.newSession(token); | 386 mCustomTabsConnection.newSession(token); |
| 363 } | 387 } |
| 364 Uri uri = url == null ? null : Uri.parse(url); | 388 Uri uri = url == null ? null : Uri.parse(url); |
| 365 boolean succeeded = mCustomTabsConnection.mayLaunchUrl(token, uri, null,
null); | 389 boolean succeeded = mCustomTabsConnection.mayLaunchUrl(token, uri, null,
null); |
| 366 assertEquals(shouldSucceed, succeeded); | 390 Assert.assertEquals(shouldSucceed, succeeded); |
| 367 return shouldSucceed ? token : null; | 391 return shouldSucceed ? token : null; |
| 368 } | 392 } |
| 369 | 393 |
| 370 /** | 394 /** |
| 371 * Tests that | 395 * Tests that |
| 372 * {@link CustomTabsConnection#mayLaunchUrl( | 396 * {@link CustomTabsConnection#mayLaunchUrl( |
| 373 * CustomTabsSessionToken, Uri, android.os.Bundle, java.util.List)} | 397 * CustomTabsSessionToken, Uri, android.os.Bundle, java.util.List)} |
| 374 * returns an error when called with an invalid session ID. | 398 * returns an error when called with an invalid session ID. |
| 375 */ | 399 */ |
| 400 @Test |
| 376 @SmallTest | 401 @SmallTest |
| 377 public void testNoMayLaunchUrlWithInvalidSessionId() { | 402 public void testNoMayLaunchUrlWithInvalidSessionId() { |
| 378 assertWarmupAndMayLaunchUrl( | 403 assertWarmupAndMayLaunchUrl( |
| 379 CustomTabsSessionToken.createDummySessionTokenForTesting(), URL,
false); | 404 CustomTabsSessionToken.createDummySessionTokenForTesting(), URL,
false); |
| 380 } | 405 } |
| 381 | 406 |
| 382 /** | 407 /** |
| 383 * Tests that | 408 * Tests that |
| 384 * {@link CustomTabsConnection#mayLaunchUrl(CustomTabsSessionToken, Uri, Bun
dle, List)} | 409 * {@link CustomTabsConnection#mayLaunchUrl(CustomTabsSessionToken, Uri, Bun
dle, List)} |
| 385 * rejects invalid URL schemes. | 410 * rejects invalid URL schemes. |
| 386 */ | 411 */ |
| 412 @Test |
| 387 @SmallTest | 413 @SmallTest |
| 388 public void testNoMayLaunchUrlWithInvalidScheme() { | 414 public void testNoMayLaunchUrlWithInvalidScheme() { |
| 389 assertWarmupAndMayLaunchUrl(null, INVALID_SCHEME_URL, false); | 415 assertWarmupAndMayLaunchUrl(null, INVALID_SCHEME_URL, false); |
| 390 } | 416 } |
| 391 | 417 |
| 392 /** | 418 /** |
| 393 * Tests that | 419 * Tests that |
| 394 * {@link CustomTabsConnection#mayLaunchUrl(CustomTabsSessionToken, Uri, Bun
dle, List)} | 420 * {@link CustomTabsConnection#mayLaunchUrl(CustomTabsSessionToken, Uri, Bun
dle, List)} |
| 395 * succeeds. | 421 * succeeds. |
| 396 */ | 422 */ |
| 423 @Test |
| 397 @SmallTest | 424 @SmallTest |
| 398 public void testMayLaunchUrl() { | 425 public void testMayLaunchUrl() { |
| 399 assertWarmupAndMayLaunchUrl(null, URL, true); | 426 assertWarmupAndMayLaunchUrl(null, URL, true); |
| 400 } | 427 } |
| 401 | 428 |
| 402 /** | 429 /** |
| 403 * Tests that | 430 * Tests that |
| 404 * {@link CustomTabsConnection#mayLaunchUrl(CustomTabsSessionToken, Uri, Bun
dle, List)} | 431 * {@link CustomTabsConnection#mayLaunchUrl(CustomTabsSessionToken, Uri, Bun
dle, List)} |
| 405 * can be called several times with the same, and different URLs. | 432 * can be called several times with the same, and different URLs. |
| 406 */ | 433 */ |
| 434 @Test |
| 407 @SmallTest | 435 @SmallTest |
| 408 public void testMultipleMayLaunchUrl() { | 436 public void testMultipleMayLaunchUrl() { |
| 409 CustomTabsSessionToken token = assertWarmupAndMayLaunchUrl(null, URL, tr
ue); | 437 CustomTabsSessionToken token = assertWarmupAndMayLaunchUrl(null, URL, tr
ue); |
| 410 mCustomTabsConnection.resetThrottling(mAppContext, Process.myUid()); | 438 mCustomTabsConnection.resetThrottling(mAppContext, Process.myUid()); |
| 411 assertWarmupAndMayLaunchUrl(token, URL, true); | 439 assertWarmupAndMayLaunchUrl(token, URL, true); |
| 412 mCustomTabsConnection.resetThrottling(mAppContext, Process.myUid()); | 440 mCustomTabsConnection.resetThrottling(mAppContext, Process.myUid()); |
| 413 assertWarmupAndMayLaunchUrl(token, URL2, true); | 441 assertWarmupAndMayLaunchUrl(token, URL2, true); |
| 414 } | 442 } |
| 415 | 443 |
| 416 /** | 444 /** |
| 417 * Tests that sessions are forgotten properly. | 445 * Tests that sessions are forgotten properly. |
| 418 */ | 446 */ |
| 447 @Test |
| 419 @SmallTest | 448 @SmallTest |
| 420 public void testForgetsSession() { | 449 public void testForgetsSession() { |
| 421 CustomTabsSessionToken token = assertWarmupAndMayLaunchUrl(null, URL, tr
ue); | 450 CustomTabsSessionToken token = assertWarmupAndMayLaunchUrl(null, URL, tr
ue); |
| 422 CustomTabsTestUtils.cleanupSessions(mCustomTabsConnection); | 451 CustomTabsTestUtils.cleanupSessions(mCustomTabsConnection); |
| 423 assertWarmupAndMayLaunchUrl(token, URL, false); | 452 assertWarmupAndMayLaunchUrl(token, URL, false); |
| 424 } | 453 } |
| 425 | 454 |
| 426 /** | 455 /** |
| 427 * Tests that CPU cgroups exist and have the expected values for background
and foreground. | 456 * Tests that CPU cgroups exist and have the expected values for background
and foreground. |
| 428 * | 457 * |
| 429 * To make testing easier the test assumes that the Android Framework uses | 458 * To make testing easier the test assumes that the Android Framework uses |
| 430 * the same cgroup for background processes and background _threads_, which | 459 * the same cgroup for background processes and background _threads_, which |
| 431 * has been the case through LOLLIPOP_MR1. | 460 * has been the case through LOLLIPOP_MR1. |
| 432 */ | 461 */ |
| 462 @Test |
| 433 @SmallTest | 463 @SmallTest |
| 434 public void testGetSchedulerGroup() { | 464 public void testGetSchedulerGroup() { |
| 435 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return; | 465 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return; |
| 436 assertNotNull(CustomTabsConnection.getSchedulerGroup(Process.myPid())); | 466 Assert.assertNotNull(CustomTabsConnection.getSchedulerGroup(Process.myPi
d())); |
| 437 String cgroup = CustomTabsConnection.getSchedulerGroup(Process.myPid()); | 467 String cgroup = CustomTabsConnection.getSchedulerGroup(Process.myPid()); |
| 438 // Tests run in the foreground. | 468 // Tests run in the foreground. |
| 439 assertTrue(cgroup.equals("/") || cgroup.equals("/apps")); | 469 Assert.assertTrue(cgroup.equals("/") || cgroup.equals("/apps")); |
| 440 | 470 |
| 441 final String[] backgroundThreadCgroup = {null}; | 471 final String[] backgroundThreadCgroup = {null}; |
| 442 Thread backgroundThread = new Thread(new Runnable() { | 472 Thread backgroundThread = new Thread(new Runnable() { |
| 443 @Override | 473 @Override |
| 444 public void run() { | 474 public void run() { |
| 445 int tid = Process.myTid(); | 475 int tid = Process.myTid(); |
| 446 Process.setThreadPriority(tid, Process.THREAD_PRIORITY_BACKGROUN
D); | 476 Process.setThreadPriority(tid, Process.THREAD_PRIORITY_BACKGROUN
D); |
| 447 backgroundThreadCgroup[0] = CustomTabsConnection.getSchedulerGro
up(tid); | 477 backgroundThreadCgroup[0] = CustomTabsConnection.getSchedulerGro
up(tid); |
| 448 } | 478 } |
| 449 }); | 479 }); |
| 450 backgroundThread.start(); | 480 backgroundThread.start(); |
| 451 try { | 481 try { |
| 452 backgroundThread.join(); | 482 backgroundThread.join(); |
| 453 } catch (InterruptedException e) { | 483 } catch (InterruptedException e) { |
| 454 fail(); | 484 Assert.fail(); |
| 455 return; | 485 return; |
| 456 } | 486 } |
| 457 String threadCgroup = backgroundThreadCgroup[0]; | 487 String threadCgroup = backgroundThreadCgroup[0]; |
| 458 assertNotNull(threadCgroup); | 488 Assert.assertNotNull(threadCgroup); |
| 459 assertTrue(threadCgroup.equals("/bg_non_interactive") | 489 Assert.assertTrue(threadCgroup.equals("/bg_non_interactive") |
| 460 || threadCgroup.equals("/apps/bg_non_interactive")); | 490 || threadCgroup.equals("/apps/bg_non_interactive")); |
| 461 } | 491 } |
| 462 | 492 |
| 463 /** | 493 /** |
| 464 * Tests that predictions are throttled. | 494 * Tests that predictions are throttled. |
| 465 */ | 495 */ |
| 496 @Test |
| 466 @SmallTest | 497 @SmallTest |
| 467 public void testThrottleMayLaunchUrl() { | 498 public void testThrottleMayLaunchUrl() { |
| 468 CustomTabsSessionToken token = assertWarmupAndMayLaunchUrl(null, URL, tr
ue); | 499 CustomTabsSessionToken token = assertWarmupAndMayLaunchUrl(null, URL, tr
ue); |
| 469 int successfulRequests = 0; | 500 int successfulRequests = 0; |
| 470 // Send a burst of requests instead of checking for precise delays to av
oid flakiness. | 501 // Send a burst of requests instead of checking for precise delays to av
oid flakiness. |
| 471 while (successfulRequests < 10) { | 502 while (successfulRequests < 10) { |
| 472 if (!mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL), null,
null)) break; | 503 if (!mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL), null,
null)) break; |
| 473 successfulRequests++; | 504 successfulRequests++; |
| 474 } | 505 } |
| 475 assertTrue("10 requests in a row should not all succeed.", successfulReq
uests < 10); | 506 Assert.assertTrue("10 requests in a row should not all succeed.", succes
sfulRequests < 10); |
| 476 } | 507 } |
| 477 | 508 |
| 478 /** | 509 /** |
| 479 * Tests that the mayLaunchUrl() throttling is reset after a long enough wai
t. | 510 * Tests that the mayLaunchUrl() throttling is reset after a long enough wai
t. |
| 480 */ | 511 */ |
| 512 @Test |
| 481 @SmallTest | 513 @SmallTest |
| 482 public void testThrottlingIsReset() { | 514 public void testThrottlingIsReset() { |
| 483 CustomTabsSessionToken token = assertWarmupAndMayLaunchUrl(null, URL, tr
ue); | 515 CustomTabsSessionToken token = assertWarmupAndMayLaunchUrl(null, URL, tr
ue); |
| 484 mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL), null, null); | 516 mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL), null, null); |
| 485 // Depending on the timing, the delay should be 100 or 200ms here. | 517 // Depending on the timing, the delay should be 100 or 200ms here. |
| 486 assertWarmupAndMayLaunchUrl(token, URL, false); | 518 assertWarmupAndMayLaunchUrl(token, URL, false); |
| 487 // Wait for more than 2 * MAX_POSSIBLE_DELAY to clear the delay | 519 // Wait for more than 2 * MAX_POSSIBLE_DELAY to clear the delay |
| 488 try { | 520 try { |
| 489 Thread.sleep(450); // 2 * MAX_POSSIBLE_DELAY + 50ms | 521 Thread.sleep(450); // 2 * MAX_POSSIBLE_DELAY + 50ms |
| 490 } catch (InterruptedException e) { | 522 } catch (InterruptedException e) { |
| 491 fail(); | 523 Assert.fail(); |
| 492 return; | 524 return; |
| 493 } | 525 } |
| 494 assertWarmupAndMayLaunchUrl(token, URL, true); | 526 assertWarmupAndMayLaunchUrl(token, URL, true); |
| 495 // Check that the delay has been reset, by waiting for 100ms. | 527 // Check that the delay has been reset, by waiting for 100ms. |
| 496 try { | 528 try { |
| 497 Thread.sleep(150); // MIN_DELAY + 50ms margin | 529 Thread.sleep(150); // MIN_DELAY + 50ms margin |
| 498 } catch (InterruptedException e) { | 530 } catch (InterruptedException e) { |
| 499 fail(); | 531 Assert.fail(); |
| 500 return; | 532 return; |
| 501 } | 533 } |
| 502 assertWarmupAndMayLaunchUrl(token, URL, true); | 534 assertWarmupAndMayLaunchUrl(token, URL, true); |
| 503 } | 535 } |
| 504 | 536 |
| 505 /** | 537 /** |
| 506 * Tests that throttling applies across sessions. | 538 * Tests that throttling applies across sessions. |
| 507 */ | 539 */ |
| 540 @Test |
| 508 @SmallTest | 541 @SmallTest |
| 509 public void testThrottlingAcrossSessions() { | 542 public void testThrottlingAcrossSessions() { |
| 510 CustomTabsSessionToken token = assertWarmupAndMayLaunchUrl(null, URL, tr
ue); | 543 CustomTabsSessionToken token = assertWarmupAndMayLaunchUrl(null, URL, tr
ue); |
| 511 mCustomTabsConnection.resetThrottling(mAppContext, Process.myUid()); | 544 mCustomTabsConnection.resetThrottling(mAppContext, Process.myUid()); |
| 512 CustomTabsSessionToken token2 = assertWarmupAndMayLaunchUrl(null, URL, t
rue); | 545 CustomTabsSessionToken token2 = assertWarmupAndMayLaunchUrl(null, URL, t
rue); |
| 513 mCustomTabsConnection.resetThrottling(mAppContext, Process.myUid()); | 546 mCustomTabsConnection.resetThrottling(mAppContext, Process.myUid()); |
| 514 for (int i = 0; i < 10; i++) { | 547 for (int i = 0; i < 10; i++) { |
| 515 mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL), null, null
); | 548 mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL), null, null
); |
| 516 } | 549 } |
| 517 assertWarmupAndMayLaunchUrl(token2, URL, false); | 550 assertWarmupAndMayLaunchUrl(token2, URL, false); |
| 518 } | 551 } |
| 519 | 552 |
| 553 @Test |
| 520 @SmallTest | 554 @SmallTest |
| 521 @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) | 555 @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) |
| 522 public void testBanningWorks() { | 556 public void testBanningWorks() { |
| 523 mCustomTabsConnection.ban(mAppContext, Process.myUid()); | 557 mCustomTabsConnection.ban(mAppContext, Process.myUid()); |
| 524 final CustomTabsSessionToken token = | 558 final CustomTabsSessionToken token = |
| 525 CustomTabsSessionToken.createDummySessionTokenForTesting(); | 559 CustomTabsSessionToken.createDummySessionTokenForTesting(); |
| 526 assertTrue(mCustomTabsConnection.newSession(token)); | 560 Assert.assertTrue(mCustomTabsConnection.newSession(token)); |
| 527 | 561 |
| 528 assertTrue(mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL), nul
l, null)); | 562 Assert.assertTrue(mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(UR
L), null, null)); |
| 529 ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 563 ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| 530 @Override | 564 @Override |
| 531 public void run() { | 565 public void run() { |
| 532 assertSpareWebContentsNotNullAndDestroy(); | 566 assertSpareWebContentsNotNullAndDestroy(); |
| 533 String referrer = mCustomTabsConnection.getReferrerForSession(to
ken).getUrl(); | 567 String referrer = mCustomTabsConnection.getReferrerForSession(to
ken).getUrl(); |
| 534 assertNull(mCustomTabsConnection.takePrerenderedUrl(token, URL,
referrer)); | 568 Assert.assertNull(mCustomTabsConnection.takePrerenderedUrl(token
, URL, referrer)); |
| 535 } | 569 } |
| 536 }); | 570 }); |
| 537 } | 571 } |
| 538 | 572 |
| 573 @Test |
| 539 @SmallTest | 574 @SmallTest |
| 540 @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) | 575 @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) |
| 541 public void testBanningDisabledForCellular() { | 576 public void testBanningDisabledForCellular() { |
| 542 mCustomTabsConnection.ban(mAppContext, Process.myUid()); | 577 mCustomTabsConnection.ban(mAppContext, Process.myUid()); |
| 543 final CustomTabsSessionToken token = | 578 final CustomTabsSessionToken token = |
| 544 CustomTabsSessionToken.createDummySessionTokenForTesting(); | 579 CustomTabsSessionToken.createDummySessionTokenForTesting(); |
| 545 assertTrue(mCustomTabsConnection.newSession(token)); | 580 Assert.assertTrue(mCustomTabsConnection.newSession(token)); |
| 546 mCustomTabsConnection.setShouldPrerenderOnCellularForSession(token, true
); | 581 mCustomTabsConnection.setShouldPrerenderOnCellularForSession(token, true
); |
| 547 | 582 |
| 548 assertTrue(mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL), nul
l, null)); | 583 Assert.assertTrue(mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(UR
L), null, null)); |
| 549 ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 584 ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| 550 @Override | 585 @Override |
| 551 public void run() { | 586 public void run() { |
| 552 assertNull(WarmupManager.getInstance().takeSpareWebContents(fals
e, false)); | 587 Assert.assertNull(WarmupManager.getInstance().takeSpareWebConten
ts(false, false)); |
| 553 String referrer = mCustomTabsConnection.getReferrerForSession(to
ken).getUrl(); | 588 String referrer = mCustomTabsConnection.getReferrerForSession(to
ken).getUrl(); |
| 554 WebContents prerender = mCustomTabsConnection.takePrerenderedUrl
( | 589 WebContents prerender = mCustomTabsConnection.takePrerenderedUrl
( |
| 555 token, URL, referrer); | 590 token, URL, referrer); |
| 556 assertNotNull(prerender); | 591 Assert.assertNotNull(prerender); |
| 557 prerender.destroy(); | 592 prerender.destroy(); |
| 558 } | 593 } |
| 559 }); | 594 }); |
| 560 } | 595 } |
| 561 | 596 |
| 597 @Test |
| 562 @SmallTest | 598 @SmallTest |
| 563 @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) | 599 @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) |
| 564 public void testCellularPrerenderingDoesntOverrideSettings() throws Exceptio
n { | 600 public void testCellularPrerenderingDoesntOverrideSettings() throws Exceptio
n { |
| 565 CustomTabsSessionToken token = CustomTabsSessionToken.createDummySession
TokenForTesting(); | 601 CustomTabsSessionToken token = CustomTabsSessionToken.createDummySession
TokenForTesting(); |
| 566 assertTrue(mCustomTabsConnection.newSession(token)); | 602 Assert.assertTrue(mCustomTabsConnection.newSession(token)); |
| 567 mCustomTabsConnection.setShouldPrerenderOnCellularForSession(token, true
); | 603 mCustomTabsConnection.setShouldPrerenderOnCellularForSession(token, true
); |
| 568 mCustomTabsConnection.warmup(0); | 604 mCustomTabsConnection.warmup(0); |
| 569 | 605 |
| 570 // Needs the browser process to be initialized. | 606 // Needs the browser process to be initialized. |
| 571 FutureTask<Boolean> result = ThreadUtils.runOnUiThread(new Callable<Bool
ean>() { | 607 FutureTask<Boolean> result = ThreadUtils.runOnUiThread(new Callable<Bool
ean>() { |
| 572 @Override | 608 @Override |
| 573 public Boolean call() { | 609 public Boolean call() { |
| 574 PrefServiceBridge prefs = PrefServiceBridge.getInstance(); | 610 PrefServiceBridge prefs = PrefServiceBridge.getInstance(); |
| 575 boolean result = prefs.getNetworkPredictionEnabled(); | 611 boolean result = prefs.getNetworkPredictionEnabled(); |
| 576 prefs.setNetworkPredictionEnabled(false); | 612 prefs.setNetworkPredictionEnabled(false); |
| 577 return result; | 613 return result; |
| 578 }}); | 614 }}); |
| 579 final boolean enabled = result.get(); | 615 final boolean enabled = result.get(); |
| 580 | 616 |
| 581 try { | 617 try { |
| 582 assertTrue(mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL),
null, null)); | 618 Assert.assertTrue( |
| 619 mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL), nu
ll, null)); |
| 583 ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 620 ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| 584 @Override | 621 @Override |
| 585 public void run() { | 622 public void run() { |
| 586 assertSpareWebContentsNotNullAndDestroy(); | 623 assertSpareWebContentsNotNullAndDestroy(); |
| 587 } | 624 } |
| 588 }); | 625 }); |
| 589 } finally { | 626 } finally { |
| 590 ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 627 ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| 591 @Override | 628 @Override |
| 592 public void run() { | 629 public void run() { |
| 593 PrefServiceBridge.getInstance().setNetworkPredictionEnabled(
enabled); | 630 PrefServiceBridge.getInstance().setNetworkPredictionEnabled(
enabled); |
| 594 } | 631 } |
| 595 }); | 632 }); |
| 596 } | 633 } |
| 597 } | 634 } |
| 598 } | 635 } |
| OLD | NEW |