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