| // 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(); |
| } |
| } |
| } |