14d7d71641acfefe50facc0295faceb79ca723375Allen Hair/* 24d7d71641acfefe50facc0295faceb79ca723375Allen Hair * Copyright (C) 2014 The Android Open Source Project 34d7d71641acfefe50facc0295faceb79ca723375Allen Hair * 44d7d71641acfefe50facc0295faceb79ca723375Allen Hair * Licensed under the Apache License, Version 2.0 (the "License"); 54d7d71641acfefe50facc0295faceb79ca723375Allen Hair * you may not use this file except in compliance with the License. 64d7d71641acfefe50facc0295faceb79ca723375Allen Hair * You may obtain a copy of the License at 74d7d71641acfefe50facc0295faceb79ca723375Allen Hair * 84d7d71641acfefe50facc0295faceb79ca723375Allen Hair * http://www.apache.org/licenses/LICENSE-2.0 94d7d71641acfefe50facc0295faceb79ca723375Allen Hair * 104d7d71641acfefe50facc0295faceb79ca723375Allen Hair * Unless required by applicable law or agreed to in writing, software 114d7d71641acfefe50facc0295faceb79ca723375Allen Hair * distributed under the License is distributed on an "AS IS" BASIS, 124d7d71641acfefe50facc0295faceb79ca723375Allen Hair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134d7d71641acfefe50facc0295faceb79ca723375Allen Hair * See the License for the specific language governing permissions and 144d7d71641acfefe50facc0295faceb79ca723375Allen Hair * limitations under the License. 154d7d71641acfefe50facc0295faceb79ca723375Allen Hair */ 164d7d71641acfefe50facc0295faceb79ca723375Allen Hair 174d7d71641acfefe50facc0295faceb79ca723375Allen Hairpackage com.android.webview.chromium.tests.jank; 184d7d71641acfefe50facc0295faceb79ca723375Allen Hair 194d7d71641acfefe50facc0295faceb79ca723375Allen Hairimport android.content.Intent; 204d7d71641acfefe50facc0295faceb79ca723375Allen Hairimport android.net.Uri; 214d7d71641acfefe50facc0295faceb79ca723375Allen Hairimport android.os.SystemClock; 224d7d71641acfefe50facc0295faceb79ca723375Allen Hairimport android.support.test.jank.JankTest; 234d7d71641acfefe50facc0295faceb79ca723375Allen Hairimport android.support.test.jank.JankTestBase; 244d7d71641acfefe50facc0295faceb79ca723375Allen Hairimport android.support.test.jank.JankType; 254d7d71641acfefe50facc0295faceb79ca723375Allen Hairimport android.support.test.uiautomator.UiDevice; 264d7d71641acfefe50facc0295faceb79ca723375Allen Hairimport android.support.test.uiautomator.UiObjectNotFoundException; 274d7d71641acfefe50facc0295faceb79ca723375Allen Hairimport android.support.test.uiautomator.UiScrollable; 284d7d71641acfefe50facc0295faceb79ca723375Allen Hairimport android.support.test.uiautomator.UiSelector; 294d7d71641acfefe50facc0295faceb79ca723375Allen Hair 304d7d71641acfefe50facc0295faceb79ca723375Allen Hairimport java.io.File; 314d7d71641acfefe50facc0295faceb79ca723375Allen Hairimport java.io.IOException; 324d7d71641acfefe50facc0295faceb79ca723375Allen Hair 334d7d71641acfefe50facc0295faceb79ca723375Allen Hair/** 344d7d71641acfefe50facc0295faceb79ca723375Allen Hair * Jank test for Android Webview. 354d7d71641acfefe50facc0295faceb79ca723375Allen Hair * 364d7d71641acfefe50facc0295faceb79ca723375Allen Hair * To run 374d7d71641acfefe50facc0295faceb79ca723375Allen Hair * 1) Install the test application (com.android.webview.chromium.shell) 384d7d71641acfefe50facc0295faceb79ca723375Allen Hair * 2) Place a directories containing the test pages on the test device in 394d7d71641acfefe50facc0295faceb79ca723375Allen Hair * $EXTERNAL_STORAGE/AwJankPages. Each directory should contain an index.html 404d7d71641acfefe50facc0295faceb79ca723375Allen Hair * file as the main file of the test page. 414d7d71641acfefe50facc0295faceb79ca723375Allen Hair * 3) Build this test and install the resulting apk file 424d7d71641acfefe50facc0295faceb79ca723375Allen Hair * 4) Run the test using the command: 434d7d71641acfefe50facc0295faceb79ca723375Allen Hair * adb shell am instrument -e Url URL -w \ 444d7d71641acfefe50facc0295faceb79ca723375Allen Hair * com.android.webview.chromium.tests.jank/android.test.InstrumentationTestRunner 454d7d71641acfefe50facc0295faceb79ca723375Allen Hair * 464d7d71641acfefe50facc0295faceb79ca723375Allen Hair */ 474d7d71641acfefe50facc0295faceb79ca723375Allen Hairpublic class WebViewFlingTest extends JankTestBase { 484d7d71641acfefe50facc0295faceb79ca723375Allen Hair 494d7d71641acfefe50facc0295faceb79ca723375Allen Hair private static final long TEST_DELAY_TIME_MS = 2 * 1000; // 2 seconds 504d7d71641acfefe50facc0295faceb79ca723375Allen Hair private static final long PAGE_LOAD_DELAY_TIMEOUT_MS = 10 * 1000; // 10 seconds 514d7d71641acfefe50facc0295faceb79ca723375Allen Hair private static final long PAGE_LOAD_DELAY_TIME_MS = 20 * 1000; // 20 seconds 524d7d71641acfefe50facc0295faceb79ca723375Allen Hair private static final int MIN_DATA_SIZE = 50; 534d7d71641acfefe50facc0295faceb79ca723375Allen Hair private static final long DEFAULT_ANIMATION_TIME = 2 * 1000; 544d7d71641acfefe50facc0295faceb79ca723375Allen Hair private static final String CHROMIUM_SHELL_APP = "com.android.webview.chromium.shell"; 554d7d71641acfefe50facc0295faceb79ca723375Allen Hair private static final String CHROMIUM_SHELL_ACTIVITY = CHROMIUM_SHELL_APP + ".JankActivity"; 564d7d71641acfefe50facc0295faceb79ca723375Allen Hair private static final String AW_CONTAINER = "com.android.webview.chromium.shell:id/container"; 574d7d71641acfefe50facc0295faceb79ca723375Allen Hair 584d7d71641acfefe50facc0295faceb79ca723375Allen Hair private UiDevice mDevice; 594d7d71641acfefe50facc0295faceb79ca723375Allen Hair private UiScrollable mWebPageDisplay = null; 604d7d71641acfefe50facc0295faceb79ca723375Allen Hair 614d7d71641acfefe50facc0295faceb79ca723375Allen Hair 624d7d71641acfefe50facc0295faceb79ca723375Allen Hair /** 634d7d71641acfefe50facc0295faceb79ca723375Allen Hair * {@inheritDoc} 644d7d71641acfefe50facc0295faceb79ca723375Allen Hair */ 654d7d71641acfefe50facc0295faceb79ca723375Allen Hair @Override 664d7d71641acfefe50facc0295faceb79ca723375Allen Hair protected void setUp() throws Exception { 674d7d71641acfefe50facc0295faceb79ca723375Allen Hair super.setUp(); 684d7d71641acfefe50facc0295faceb79ca723375Allen Hair 694d7d71641acfefe50facc0295faceb79ca723375Allen Hair mDevice = UiDevice.getInstance(getInstrumentation()); 704d7d71641acfefe50facc0295faceb79ca723375Allen Hair mDevice.setOrientationNatural(); 714d7d71641acfefe50facc0295faceb79ca723375Allen Hair 724d7d71641acfefe50facc0295faceb79ca723375Allen Hair // Get the URL argument 734d7d71641acfefe50facc0295faceb79ca723375Allen Hair String url = getArguments().getString("Url"); 744d7d71641acfefe50facc0295faceb79ca723375Allen Hair File webpage = new File(url); 754d7d71641acfefe50facc0295faceb79ca723375Allen Hair assertNotNull("No test pages", webpage); 764d7d71641acfefe50facc0295faceb79ca723375Allen Hair 774d7d71641acfefe50facc0295faceb79ca723375Allen Hair // Launch the chromium shell 784d7d71641acfefe50facc0295faceb79ca723375Allen Hair Intent intent = new Intent(Intent.ACTION_DEFAULT, 794d7d71641acfefe50facc0295faceb79ca723375Allen Hair Uri.parse("file://" + webpage.getAbsolutePath())); 804d7d71641acfefe50facc0295faceb79ca723375Allen Hair intent.setClassName(CHROMIUM_SHELL_APP, CHROMIUM_SHELL_ACTIVITY); 814d7d71641acfefe50facc0295faceb79ca723375Allen Hair intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 824d7d71641acfefe50facc0295faceb79ca723375Allen Hair getInstrumentation().getContext().startActivity(intent); 834d7d71641acfefe50facc0295faceb79ca723375Allen Hair SystemClock.sleep(PAGE_LOAD_DELAY_TIME_MS); 844d7d71641acfefe50facc0295faceb79ca723375Allen Hair } 854d7d71641acfefe50facc0295faceb79ca723375Allen Hair 864d7d71641acfefe50facc0295faceb79ca723375Allen Hair @Override 874d7d71641acfefe50facc0295faceb79ca723375Allen Hair public void beforeLoop() throws UiObjectNotFoundException { 884d7d71641acfefe50facc0295faceb79ca723375Allen Hair getContainer().flingToBeginning(20); 894d7d71641acfefe50facc0295faceb79ca723375Allen Hair SystemClock.sleep(TEST_DELAY_TIME_MS); 904d7d71641acfefe50facc0295faceb79ca723375Allen Hair } 914d7d71641acfefe50facc0295faceb79ca723375Allen Hair 924d7d71641acfefe50facc0295faceb79ca723375Allen Hair @JankTest(type=JankType.CONTENT_FRAMES, expectedFrames=MIN_DATA_SIZE) 934d7d71641acfefe50facc0295faceb79ca723375Allen Hair public void testBrowserPageFling() throws UiObjectNotFoundException, IOException { 944d7d71641acfefe50facc0295faceb79ca723375Allen Hair getContainer().flingForward(); 954d7d71641acfefe50facc0295faceb79ca723375Allen Hair SystemClock.sleep(DEFAULT_ANIMATION_TIME); 964d7d71641acfefe50facc0295faceb79ca723375Allen Hair } 974d7d71641acfefe50facc0295faceb79ca723375Allen Hair 984d7d71641acfefe50facc0295faceb79ca723375Allen Hair /** 994d7d71641acfefe50facc0295faceb79ca723375Allen Hair * {@inheritDoc} 1004d7d71641acfefe50facc0295faceb79ca723375Allen Hair */ 1014d7d71641acfefe50facc0295faceb79ca723375Allen Hair @Override 1024d7d71641acfefe50facc0295faceb79ca723375Allen Hair protected void tearDown() throws Exception { 1034d7d71641acfefe50facc0295faceb79ca723375Allen Hair mDevice.unfreezeRotation(); 1044d7d71641acfefe50facc0295faceb79ca723375Allen Hair super.tearDown(); 1054d7d71641acfefe50facc0295faceb79ca723375Allen Hair } 1064d7d71641acfefe50facc0295faceb79ca723375Allen Hair 1074d7d71641acfefe50facc0295faceb79ca723375Allen Hair private UiScrollable getContainer() { 1084d7d71641acfefe50facc0295faceb79ca723375Allen Hair if (mWebPageDisplay == null) { 1094d7d71641acfefe50facc0295faceb79ca723375Allen Hair mWebPageDisplay = 1104d7d71641acfefe50facc0295faceb79ca723375Allen Hair new UiScrollable(new UiSelector().resourceId(AW_CONTAINER).instance(0)); 1114d7d71641acfefe50facc0295faceb79ca723375Allen Hair assertTrue("Failed to get web container", 1124d7d71641acfefe50facc0295faceb79ca723375Allen Hair mWebPageDisplay.waitForExists(PAGE_LOAD_DELAY_TIMEOUT_MS)); 1134d7d71641acfefe50facc0295faceb79ca723375Allen Hair } 1144d7d71641acfefe50facc0295faceb79ca723375Allen Hair return mWebPageDisplay; 1154d7d71641acfefe50facc0295faceb79ca723375Allen Hair } 1164d7d71641acfefe50facc0295faceb79ca723375Allen Hair} 117