Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3ae8c421 authored by Guang Zhu's avatar Guang Zhu
Browse files

Update to DumpRenderTree test harness

* removed some unused parameters
* removed obsolete live website test harness
* updated test class so that mean suite time for page cycler
  is emmitted via instrumentation status

Change-Id: Iccb40f70a62a4ac9b8d5bceab9a6a715c611c573
parent d55191d0
Loading
Loading
Loading
Loading
+1 −23
Original line number Diff line number Diff line
@@ -58,27 +58,9 @@ public class LayoutTestsAutoRunner extends InstrumentationTestRunner {
            }
        }

        String delay_str = (String) icicle.get("delay");
        if(delay_str != null) {
            try {
                this.mDelay = Integer.parseInt(delay_str);
            } catch (Exception e) {
            }
        }

        String r = icicle.getString("rebaseline");
        this.mRebaseline = (r != null && r.toLowerCase().equals("true"));

        String logtime = icicle.getString("logtime");
        this.mLogtime = (logtime != null
                && logtime.toLowerCase().equals("true"));

        String drawTime = icicle.getString("drawtime");
        this.mGetDrawTime = (drawTime != null
                && drawTime.toLowerCase().equals("true"));

        mSaveImagePath = icicle.getString("saveimage");

        mJsEngine = icicle.getString("jsengine");

        mPageCyclerSuite = icicle.getString("suite");
@@ -92,11 +74,7 @@ public class LayoutTestsAutoRunner extends InstrumentationTestRunner {
    String mPageCyclerForwardHost;
    String mPageCyclerIteration;
    String mTestPath;
    String mSaveImagePath;
    int mTimeoutInMillis;
    int mDelay;
    int mTimeoutInMillis = 0;
    boolean mRebaseline;
    boolean mLogtime;
    boolean mGetDrawTime;
    String mJsEngine;
}
+4 −0
Original line number Diff line number Diff line
@@ -314,6 +314,10 @@ public class LayoutTestsAutoTest extends ActivityInstrumentationTestCase2<TestSh
            public void timedOut(String url) {
                Log.v(LOGTAG, "layout timeout: " + url);
            }

            @Override
            public void dumpResult(String webViewDump) {
            }
        });

        String resultFile = getResultFile(test);
+25 −7
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.dumprendertree;
import com.android.dumprendertree.forwarder.AdbUtils;
import com.android.dumprendertree.forwarder.ForwardServer;

import android.app.Activity;
import android.app.Instrumentation;
import android.content.Context;
import android.content.Intent;
@@ -106,8 +107,7 @@ public class LoadTestsAutoTest extends ActivityInstrumentationTestCase2<TestShel
        freeMem();

        // Run tests
        runTestAndWaitUntilDone(activity, runner.mTestPath, runner.mTimeoutInMillis,
                runner.mGetDrawTime, runner.mSaveImagePath);
        runTestAndWaitUntilDone(activity, runner.mTestPath, runner.mTimeoutInMillis);

        getInstrumentation().runOnMainSync(new Runnable() {

@@ -215,9 +215,9 @@ public class LoadTestsAutoTest extends ActivityInstrumentationTestCase2<TestShel
    }

    // A convenient method to be called by another activity.
    private void runTestAndWaitUntilDone(TestShellActivity activity, String url, int timeout,
            boolean getDrawTime, String saveImagePath) {
    private void runTestAndWaitUntilDone(TestShellActivity activity, String url, int timeout) {
        activity.setCallback(new TestShellCallback() {
            @Override
            public void finished() {
                synchronized (LoadTestsAutoTest.this) {
                    mFinished = true;
@@ -225,8 +225,29 @@ public class LoadTestsAutoTest extends ActivityInstrumentationTestCase2<TestShel
                }
            }

            @Override
            public void timedOut(String url) {
            }

            @Override
            public void dumpResult(String webViewDump) {
                String lines[] = webViewDump.split("\\r?\\n");
                for (String line : lines) {
                    line = line.trim();
                    // parse for a line like this:
                    // totals:   9620.00 11947.00    10099.75    380.38
                    // and return the 3rd number, which is mean
                    if (line.startsWith("totals:")) {
                        line = line.substring(7).trim(); // strip "totals:"
                        String[] numbers = line.split("\\s+");
                        if (numbers.length == 4) {
                            Bundle b = new Bundle();
                            b.putString("mean", numbers[2]);
                            getInstrumentation().sendStatus(Activity.RESULT_FIRST_USER, b);
                        }
                    }
                }
            }
        });

        mFinished = false;
@@ -236,9 +257,6 @@ public class LoadTestsAutoTest extends ActivityInstrumentationTestCase2<TestShel
        intent.putExtra(TestShellActivity.TEST_URL, url);
        intent.putExtra(TestShellActivity.TIMEOUT_IN_MILLIS, timeout);
        intent.putExtra(TestShellActivity.RESULT_FILE, LOAD_TEST_RESULT);
        intent.putExtra(TestShellActivity.GET_DRAW_TIME, getDrawTime);
        if (saveImagePath != null)
            intent.putExtra(TestShellActivity.SAVE_IMAGE, saveImagePath);
        activity.startActivity(intent);

        // Wait until done.
+0 −196
Original line number Diff line number Diff line
/*
 * Copyright (C) 2009 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.dumprendertree;

import android.app.Activity;
import android.content.Intent;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.test.ActivityInstrumentationTestCase2;
import android.util.Log;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class ReliabilityTest extends ActivityInstrumentationTestCase2<ReliabilityTestActivity> {

    private static final String LOGTAG = "ReliabilityTest";
    private static final String PKG_NAME = "com.android.dumprendertree";
    private static final String EXTERNAL_DIR =
        Environment.getExternalStorageDirectory().toString();
    private static final String TEST_LIST_FILE = EXTERNAL_DIR +
        "/android/reliability_tests_list.txt";
    private static final String TEST_STATUS_FILE = EXTERNAL_DIR +
        "/android/reliability_running_test.txt";
    private static final String TEST_TIMEOUT_FILE = EXTERNAL_DIR +
        "/android/reliability_timeout_test.txt";
    private static final String TEST_LOAD_TIME_FILE = EXTERNAL_DIR +
        "/android/reliability_load_time.txt";
    private static final String TEST_DONE = "#DONE";
    static final String RELIABILITY_TEST_RUNNER_FILES[] = {
        "run_reliability_tests.py"
    };

    public ReliabilityTest() {
        super(PKG_NAME, ReliabilityTestActivity.class);
    }

    public void runReliabilityTest() throws Throwable {
//        ReliabilityTestActivity activity = getActivity();
        LayoutTestsAutoRunner runner = (LayoutTestsAutoRunner)getInstrumentation();

        File testListFile = new File(TEST_LIST_FILE);
        if(!testListFile.exists())
            throw new FileNotFoundException("test list file not found.");

        BufferedReader listReader = new BufferedReader(
                new FileReader(testListFile));

        //always try to resume first, hence cleaning up status will be the
        //responsibility of driver scripts
        String lastUrl = FsUtils.readTestStatus(TEST_STATUS_FILE);
        if(lastUrl != null && !TEST_DONE.equals(lastUrl))
            fastForward(listReader, lastUrl);

        String url = null;
        Handler handler = null;
        boolean timeoutFlag = false;
        long start, elapsed;

        Intent intent = new Intent(runner.getContext(), ReliabilityTestActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        ReliabilityTestActivity activity = (ReliabilityTestActivity)runner.startActivitySync(
            intent);
        //read from BufferedReader instead of populating a list in advance,
        //this will avoid excessive memory usage in case of a large list
        while((url = listReader.readLine()) != null) {
            url = url.trim();
            if(url.length() == 0)
                continue;
            start = System.currentTimeMillis();
            Log.v(LOGTAG, "Testing URL: " + url);
            FsUtils.updateTestStatus(TEST_STATUS_FILE, url);
            activity.reset();
            //use message to send new URL to avoid interacting with
            //WebView in non-UI thread
            handler = activity.getHandler();
            Message msg = handler.obtainMessage(
                    ReliabilityTestActivity.MSG_NAVIGATE,
                    runner.mTimeoutInMillis, runner.mDelay);
            msg.getData().putString(ReliabilityTestActivity.MSG_NAV_URL, url);
            msg.getData().putBoolean(ReliabilityTestActivity.MSG_NAV_LOGTIME,
                    runner.mLogtime);
            handler.sendMessage(msg);
            timeoutFlag = activity.waitUntilDone();
            elapsed = System.currentTimeMillis() - start;
            if(elapsed < 1000) {
                Log.w(LOGTAG, "Page load finished in " + elapsed
                        + "ms, too soon?");
            } else {
                Log.v(LOGTAG, "Page load finished in " + elapsed + "ms");
            }
            if(timeoutFlag) {
                writeTimeoutFile(url);
            }
            if(runner.mLogtime) {
                writeLoadTime(url, activity.getPageLoadTime());
            }
            System.runFinalization();
            System.gc();
            System.gc();
        }
        activity.finish();
        FsUtils.updateTestStatus(TEST_STATUS_FILE, TEST_DONE);
//        activity.finish();
        listReader.close();
    }

    public void copyRunnerAssetsToCache() {
        try {
            String out_dir = getActivity().getApplicationContext()
            .getCacheDir().getPath() + "/";

            for( int i=0; i< RELIABILITY_TEST_RUNNER_FILES.length; i++) {
                InputStream in = getActivity().getAssets().open(
                        RELIABILITY_TEST_RUNNER_FILES[i]);
                OutputStream out = new FileOutputStream(
                        out_dir + RELIABILITY_TEST_RUNNER_FILES[i]);

                byte[] buf = new byte[2048];
                int len;

                while ((len = in.read(buf)) >= 0 ) {
                    out.write(buf, 0, len);
                }
                out.close();
                in.close();
            }
        }catch (IOException e) {
            Log.e(LOGTAG, "Cannot extract scripts for testing.", e);
        }
    }

    private void fastForward(BufferedReader testListReader, String lastUrl) {
        //fastforward the BufferedReader to the position right after last url
        if(lastUrl == null)
            return;

        String line = null;
        try {
            while((line = testListReader.readLine()) != null) {
                if(lastUrl.equals(line))
                    return;
            }
        } catch (IOException ioe) {
            Log.e(LOGTAG, "Error while reading test list.", ioe);
            return;
        }
    }

    private void writeTimeoutFile(String s) {
        //append to the file containing the list of timeout urls
        try {
            BufferedOutputStream bos = new BufferedOutputStream(
                    new FileOutputStream(TEST_TIMEOUT_FILE, true));
            bos.write(s.getBytes());
            bos.write('\n');
            bos.close();
        } catch (Exception e) {
            Log.e(LOGTAG, "Cannot update file " + TEST_TIMEOUT_FILE, e);
        }
    }

    private void writeLoadTime(String s, long time) {
        //append to the file containing the list of timeout urls
        try {
            BufferedOutputStream bos = new BufferedOutputStream(
                    new FileOutputStream(TEST_LOAD_TIME_FILE, true));
            bos.write((s + '|' + time + '\n').getBytes());
            bos.close();
        } catch (Exception e) {
            Log.e(LOGTAG, "Cannot update file " + TEST_LOAD_TIME_FILE, e);
        }
    }
}
+4 −54
Original line number Diff line number Diff line
@@ -25,9 +25,6 @@ import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.net.http.SslError;
import android.os.Bundle;
import android.os.Environment;
@@ -200,8 +197,6 @@ public class TestShellActivity extends Activity implements LayoutTestController

        mResultFile = intent.getStringExtra(RESULT_FILE);
        mTimeoutInMillis = intent.getIntExtra(TIMEOUT_IN_MILLIS, 0);
        mGetDrawtime = intent.getBooleanExtra(GET_DRAW_TIME, false);
        mSaveImagePath = intent.getStringExtra(SAVE_IMAGE);
        mStopOnRefError = intent.getBooleanExtra(STOP_ON_REF_ERROR, false);
        setTitle("Test " + mCurrentTestNumber + " of " + mTotalTestCount);
        float ratio = (float)mCurrentTestNumber / mTotalTestCount;
@@ -311,6 +306,10 @@ public class TestShellActivity extends Activity implements LayoutTestController
            return;
        }

        if (mCallback != null) {
            mCallback.dumpResult(webkitData);
        }

        try {
            File parentDir = new File(mResultFile).getParentFile();
            if (!parentDir.exists()) {
@@ -564,18 +563,6 @@ public class TestShellActivity extends Activity implements LayoutTestController
        public void onPageFinished(WebView view, String url) {
            Log.v(LOGTAG, "onPageFinished, url=" + url);
            mPageFinished = true;
            // get page draw time
            if (FsUtils.isTestPageUrl(url)) {
                if (mGetDrawtime) {
                    long[] times = new long[DRAW_RUNS];
                    times = getDrawWebViewTime(mWebView, DRAW_RUNS);
                    FsUtils.writeDrawTime(DRAW_TIME_LOG, url, times);
                }
                if (mSaveImagePath != null) {
                    String name = FsUtils.getLastSegmentInPath(url);
                    drawPageToFile(mSaveImagePath + "/" + name + ".png", mWebView);
                }
            }

            // Calling finished() will check if we've met all the conditions for completing
            // this test and move to the next one if we are ready. Otherwise we ask WebCore to
@@ -830,47 +817,12 @@ public class TestShellActivity extends Activity implements LayoutTestController
        mEventSender.clearTouchMetaState();
        mPageFinished = false;
        mDumpWebKitData = false;
        mGetDrawtime = false;
        mSaveImagePath = null;
        setDefaultWebSettings(mWebView);
        mIsGeolocationPermissionSet = false;
        mPendingGeolocationPermissionCallbacks = null;
        CookieManager.getInstance().removeAllCookie();
    }

    private long[] getDrawWebViewTime(WebView view, int count) {
        if (count == 0)
            return null;
        long[] ret = new long[count];
        long start;
        Canvas canvas = new Canvas();
        Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Config.ARGB_8888);
        canvas.setBitmap(bitmap);
        for (int i = 0; i < count; i++) {
            start = System.currentTimeMillis();
            view.draw(canvas);
            ret[i] = System.currentTimeMillis() - start;
        }
        return ret;
    }

    private void drawPageToFile(String fileName, WebView view) {
        Canvas canvas = new Canvas();
        Bitmap bitmap = Bitmap.createBitmap(view.getContentWidth(), view.getContentHeight(),
                Config.ARGB_8888);
        canvas.setBitmap(bitmap);
        WebViewClassic.fromWebView(view).drawPage(canvas);
        try {
            FileOutputStream fos = new FileOutputStream(fileName);
            if(!bitmap.compress(CompressFormat.PNG, 90, fos)) {
                Log.w(LOGTAG, "Failed to compress and save image.");
            }
        } catch (IOException ioe) {
            Log.e(LOGTAG, "", ioe);
        }
        bitmap.recycle();
    }

    private boolean canMoveToNextTest() {
        return (mDumpWebKitData && mPageFinished && !mWaitUntilDone) || mTimedOut;
    }
@@ -922,9 +874,7 @@ public class TestShellActivity extends Activity implements LayoutTestController
    private String mResultFile;
    private int mTimeoutInMillis;
    private String mUiAutoTestPath;
    private String mSaveImagePath;
    private BufferedReader mTestListReader;
    private boolean mGetDrawtime;
    private int mTotalTestCount;
    private int mCurrentTestNumber;
    private boolean mStopOnRefError;
Loading