// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package org.chromium.webview_shell; import android.os.Environment; import android.test.ActivityInstrumentationTestCase2; import android.util.Log; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; /** * Tests running end-to-end layout tests. */ public class WebViewLayoutTest extends ActivityInstrumentationTestCase2<WebViewLayoutTestActivity> { private static final String TAG = "WebViewLayoutTest"; private static final String EXTERNAL_PREFIX = Environment.getExternalStorageDirectory().getAbsolutePath() + "/"; private static final String BASE_WEBVIEW_TEST_PATH = "android_webview/tools/WebViewShell/test/"; private static final String BASE_BLINK_TEST_PATH = "third_party/WebKit/LayoutTests/"; private static final String PATH_WEBVIEW_PREFIX = EXTERNAL_PREFIX + BASE_WEBVIEW_TEST_PATH; private static final String PATH_BLINK_PREFIX = EXTERNAL_PREFIX + BASE_BLINK_TEST_PATH; private static final long TIMEOUT_SECONDS = 20; private WebViewLayoutTestActivity mTestActivity; public WebViewLayoutTest() { super(WebViewLayoutTestActivity.class); } @Override protected void setUp() throws Exception { super.setUp(); mTestActivity = (WebViewLayoutTestActivity) getActivity(); } @Override protected void tearDown() throws Exception { mTestActivity.finish(); super.tearDown(); } @Override public WebViewLayoutTestRunner getInstrumentation() { return (WebViewLayoutTestRunner) super.getInstrumentation(); } public void testSimple() throws Exception { runWebViewLayoutTest("experimental/basic-logging.html", "experimental/basic-logging-expected.txt"); } public void testGlobalInterface() throws Exception { runBlinkLayoutTest("webexposed/global-interface-listing.html", "webexposed/global-interface-listing-expected.txt"); } // test helper methods private void runWebViewLayoutTest(final String fileName, final String fileNameExpected) throws Exception { runTest(PATH_WEBVIEW_PREFIX + fileName, PATH_WEBVIEW_PREFIX + fileNameExpected); } private void runBlinkLayoutTest(final String fileName, final String fileNameExpected) throws Exception { ensureJsTestCopied(); runTest(PATH_BLINK_PREFIX + fileName, PATH_WEBVIEW_PREFIX + fileNameExpected); } private void runTest(final String fileName, final String fileNameExpected) throws FileNotFoundException, IOException, InterruptedException, TimeoutException { loadUrlWebViewAsync("file://" + fileName, mTestActivity); if (getInstrumentation().isRebaseline()) { // this is the rebaseline process mTestActivity.waitForFinish(TIMEOUT_SECONDS, TimeUnit.SECONDS); String result = mTestActivity.getTestResult(); writeFile(fileNameExpected, result, true); Log.i(TAG, "file: " + fileNameExpected + " --> rebaselined, length=" + result.length()); } else { String expected = readFile(fileNameExpected); mTestActivity.waitForFinish(TIMEOUT_SECONDS, TimeUnit.SECONDS); String result = mTestActivity.getTestResult(); assertEquals(expected, result); } } private void loadUrlWebViewAsync(final String fileUrl, final WebViewLayoutTestActivity activity) { getInstrumentation().runOnMainSync(new Runnable() { @Override public void run() { activity.loadUrl(fileUrl); } }); } private static void ensureJsTestCopied() throws IOException { File jsTestFile = new File(PATH_BLINK_PREFIX + "resources/js-test.js"); if (jsTestFile.exists()) return; String original = readFile(PATH_WEBVIEW_PREFIX + "resources/js-test.js"); writeFile(PATH_BLINK_PREFIX + "resources/js-test.js", original, false); } /** * Reads a file and returns it's contents as string. */ private static String readFile(String fileName) throws IOException { FileInputStream inputStream = new FileInputStream(new File(fileName)); try { BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); try { StringBuilder contents = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { contents.append(line); contents.append("\n"); } return contents.toString(); } finally { reader.close(); } } finally { inputStream.close(); } } /** * Writes a file with the given fileName and contents. If overwrite is true overwrites any * exisiting file with the same file name. If the file does not exist any intermediate * required directories are created. */ private static void writeFile(final String fileName, final String contents, boolean overwrite) throws FileNotFoundException, IOException { File fileOut = new File(fileName); if (fileOut.exists() && !overwrite) { return; } String absolutePath = fileOut.getAbsolutePath(); File filePath = new File(absolutePath.substring(0, absolutePath.lastIndexOf("/"))); if (!filePath.exists()) { if (!filePath.mkdirs()) throw new IOException("failed to create directories: " + filePath); } FileOutputStream outputStream = new FileOutputStream(fileOut); try { outputStream.write(contents.getBytes()); } finally { outputStream.close(); } } }