1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)package org.chromium.cronet_sample_apk; 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import android.content.ComponentName; 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import android.content.Intent; 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import android.net.Uri; 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import android.test.ActivityInstrumentationTestCase2; 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport android.test.suitebuilder.annotation.SmallTest; 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import android.text.TextUtils; 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout; 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport org.chromium.base.test.util.Feature; 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import java.util.concurrent.atomic.AtomicBoolean; 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/** 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * Base test class for all CronetSample based tests. 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) */ 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccipublic class CronetSampleTest extends 2423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ActivityInstrumentationTestCase2<CronetSampleActivity> { 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) /** 2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * The maximum time the waitForActiveShellToBeDoneLoading method will wait. 2823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) */ 2923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) private static final long 3023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) WAIT_FOR_ACTIVE_SHELL_LOADING_TIMEOUT = scaleTimeout(10000); 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) protected static final long 3323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) WAIT_PAGE_LOADING_TIMEOUT_SECONDS = scaleTimeout(15); 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // URL used for base tests. 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private static final String URL = "http://127.0.0.1:8000"; 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public CronetSampleTest() { 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) super(CronetSampleActivity.class); 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @SmallTest 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @Feature({"Cronet"}) 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public void testLoadUrl() throws Exception { 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CronetSampleActivity activity = launchCronetSampleWithUrl(URL); 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Make sure the activity was created as expected. 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertNotNull(activity); 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Make sure that the URL is set as expected. 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertEquals(URL, activity.getUrl()); 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertEquals(200, activity.getHttpStatusCode()); 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) /** 5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * Starts the CronetSample activity and loads the given URL. The URL can be 5623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * null, in which case will default to 5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * CronetSampleActivity.DEFAULT_SHELL_URL. 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) */ 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected CronetSampleActivity launchCronetSampleWithUrl(String url) { 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return launchCronetSampleWithUrlAndCommandLineArgs(url, null); 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) /** 6423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * Starts the CronetSample activity appending the provided command line 6523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * arguments and loads the given URL. The URL can be null, in which case 6623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * will default to CronetSampleActivity.DEFAULT_SHELL_URL. 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) */ 6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) protected CronetSampleActivity launchCronetSampleWithUrlAndCommandLineArgs( 6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) String url, String[] commandLineArgs) { 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Intent intent = new Intent(Intent.ACTION_MAIN); 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) intent.addCategory(Intent.CATEGORY_LAUNCHER); 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 7323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (url != null) 7423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) intent.setData(Uri.parse(url)); 7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) intent.setComponent(new ComponentName( 7623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) getInstrumentation().getTargetContext(), 7723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) CronetSampleActivity.class)); 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (commandLineArgs != null) { 7923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) intent.putExtra(CronetSampleActivity.COMMAND_LINE_ARGS_KEY, 8023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) commandLineArgs); 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) setActivityIntent(intent); 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return getActivity(); 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) /** 8723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * Waits for the Active shell to finish loading. This times out after 8823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * WAIT_FOR_ACTIVE_SHELL_LOADING_TIMEOUT milliseconds and it shouldn't be 8923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * used for long loading pages. Instead it should be used more for test 9023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * initialization. The proper way to wait is to use a 9123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * TestCallbackHelperContainer after the initial load is completed. 9223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * @return Whether or not the Shell was actually finished loading. 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * @throws InterruptedException 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) */ 9623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) protected boolean waitForActiveShellToBeDoneLoading() 9723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) throws InterruptedException { 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) final CronetSampleActivity activity = getActivity(); 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Wait for the Content Shell to be initialized. 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return CriteriaHelper.pollForCriteria(new Criteria() { 10223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) @Override 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public boolean isSatisfied() { 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) try { 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) final AtomicBoolean isLoaded = new AtomicBoolean(false); 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) runTestOnUiThread(new Runnable() { 10723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) @Override 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public void run() { 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (activity != null) { 11023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // There are two cases here that need to be 11123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // accounted for. 11223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // The first is that we've just created a Shell 11323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // and it isn't 11423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // loading because it has no URL set yet. The 11523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // second is that 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // we've set a URL and it actually is loading. 11723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) isLoaded.set(!activity.isLoading() && !TextUtils 11823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) .isEmpty(activity.getUrl())); 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) isLoaded.set(false); 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) }); 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return isLoaded.get(); 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } catch (Throwable e) { 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 13023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) }, WAIT_FOR_ACTIVE_SHELL_LOADING_TIMEOUT, 13123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) CriteriaHelper.DEFAULT_POLLING_INTERVAL); 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 134