Android Open Source - Cafe Cafe Test Case






From Project

Back to project page Cafe.

License

The source code is released under:

Apache License

If you think the Android project Cafe listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Copyright (C) 2011 Baidu.com Inc/*from   w w  w  . j  ava2s .c o  m*/
 *
 * 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.baidu.cafe;

import junit.framework.Assert;
import android.app.Activity;
import android.graphics.Rect;
import android.test.ActivityInstrumentationTestCase2;
import android.view.KeyEvent;
import android.view.Window;

import com.baidu.cafe.CafeExceptionHandler.ExceptionCallBack;
import com.baidu.cafe.local.LocalLib;
import com.baidu.cafe.local.Log;
import com.baidu.cafe.remote.Armser;
import com.baidu.cafe.utils.CommandResult;
import com.baidu.cafe.utils.ShellExecute;
import com.baidu.cafe.utils.ShellExecute.CallBack;

/**
 * @author luxiaoyu01@baidu.com
 * @date 2011-6-11
 * @version
 * @todo
 */
public class CafeTestCase<T extends Activity> extends ActivityInstrumentationTestCase2<T> implements
        ExceptionCallBack {
    public final static int                 SCREEN_ORIENTATION_PORTRAIT  = 0;
    public final static int                 SCREEN_ORIENTATION_LANDSCAPE = 1;
    public final static int                 TIMEOUT_GET_ACTIVITY         = 1000 * 10;

    public static Armser                    remote                       = null;
    public static Class<?>                  mActivityClass               = null;
    public static String                    mTargetFilesDir              = "";

    protected static LocalLib               local                        = null;

    private final static String             TAG                          = "CafeTestCase";
    private final static int                TEAR_DOWN_TIMEOUT            = 5000;

    private static String                   mPackageName                 = null;
    private Thread.UncaughtExceptionHandler orignal                      = null;
    private TearDownHelper                  mTearDownHelper              = null;
    private boolean                         mIsViewServerOpen            = false;
    private long                            mBeginTime;
    private int                             mPackageRcv;
    private int                             mPackageSnd;
    private Activity                        mActivity                    = null;

    /**
     * only for Android version number > 2.1
     * 
     * @param activityClass
     */
    public CafeTestCase(Class<T> activityClass) {
        super(activityClass);
        mActivityClass = activityClass;
    }

    /**
     * For Android full version
     * 
     * @param packageName
     * @param activityClass
     */
    public CafeTestCase(String packageName, Class<T> activityClass) {
        super(packageName, activityClass);
        mActivityClass = activityClass;
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        Log.init(this, Log.DEFAULT);
        mTargetFilesDir = getInstrumentation().getTargetContext().getFilesDir().toString();
        remote = new Armser(getInstrumentation().getContext());
        remote.bind(getInstrumentation().getContext());
        //launchActivityIfNotAvailable();
        remote.setStatusBarHeight(getStatusBarHeight());
        String command = "chmod 777 " + mTargetFilesDir;
        CommandResult cr = LocalLib.executeOnDevice(command, "/", 1000);
        if (null == cr) {
            Log.i(command + " failed!");
        } else {
            Log.i(command + " " + (cr.ret == 0 ? "success" : "failed!\n" + cr.console.toString()));
        }
        remote.copyAssets(mTargetFilesDir);
        local = new LocalLib(getInstrumentation(), getActivity());
        LocalLib.mPackageName = mPackageName = local.getCurrentActivity().getPackageName();
        orignal = Thread.getDefaultUncaughtExceptionHandler();
        Thread.setDefaultUncaughtExceptionHandler(new CafeExceptionHandler(orignal, this));
        if (remote.isViewServerOpen()) {
            mIsViewServerOpen = true;
            mTearDownHelper = new TearDownHelper(remote);
        } else {
            mIsViewServerOpen = false;
            Log.i("View server is not open !!!");
            Log.i("remote.clickXXX() can not work !!!");
        }
        mBeginTime = System.currentTimeMillis();
        mPackageRcv = LocalLib.getPackageRcv(mPackageName);
        mPackageSnd = LocalLib.getPackageSnd(mPackageName);
    }

    private void launchActivityIfNotAvailable() {
        if (null == remote) {
            Log.i("null == remote at launchActivityIfNotAvailable");
            return;
        }
        int count = 0;

        while (count < 6) {
            count++;
            Boolean ret = ShellExecute.doInTimeout(new CallBack<Boolean>() {

                @Override
                public Boolean runInTimeout() throws InterruptedException {
                    mActivity = getActivity();
                    return true;
                }
            }, TIMEOUT_GET_ACTIVITY);

            if (null == ret) {
                // press home key
                remote.pressKey(KeyEvent.KEYCODE_HOME);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                // launch activity
                String activityName = mActivityClass.getName();
                String cmd = String.format("am start -a android.intent.action.MAIN -n %s/%s",
                        mActivityClass.getPackage().getName(), activityName);
                Log.i("execute cmd " + cmd);
                new ShellExecute().execute(cmd, "/", 3000);
            } else {
                Log.i("get activity success");
                return;
            }
        }

        Assert.assertTrue("get activity failed!!!", false);
    }

    private int getStatusBarHeight() {
        Rect rect = new Rect();
        getActivity().getWindow().findViewById(Window.ID_ANDROID_CONTENT)
                .getWindowVisibleDisplayFrame(rect);
        Log.i("" + rect.top);
        return rect.top;
    }

    private void cafeTearDown() throws Exception {
        if (mIsViewServerOpen) {
            mTearDownHelper.backToHome();
            mTearDownHelper.killWindowsFromBirthToNow();
            mTearDownHelper = null;
            remote.waitForAllDumpCompleted();
        }

        try {
            local.finalize();
            local = null;
        } catch (Throwable e) {
            e.printStackTrace();
        }

        // It costs too much time.
        //remote.unbind(getInstrumentation().getContext());

        if (orignal != null) {
            Thread.setDefaultUncaughtExceptionHandler(orignal);
            orignal = null;
        }

        getActivity().finish();
        remote = null;
        super.tearDown();
    }

    @Override
    protected void tearDown() throws Exception {
        CommandResult ret = (CommandResult) ShellExecute.doInTimeout(new CallBack<CommandResult>() {
            @Override
            public CommandResult runInTimeout() throws InterruptedException {
                try {
                    cafeTearDown();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return new CommandResult();
            }
        }, TEAR_DOWN_TIMEOUT);

        if (ret == null) {
            Log.i("tear down time out!");
        } else {
            Log.i("tear down success!");
        }
    }

    /**
     * This function will be called when the program to be tested has crashed.
     * You can add you own operation when crash has happened. Subclasses that
     * override this method. You can call super.callWhenExceptionHappen(),it
     * will take a screencap when crash is happening.
     */
    @Override
    public void callWhenExceptionHappen() {
        Log.i(TAG, "XXXXXXXXXX--my exceptionhandler callback--XXXXXXXXXXXXXXXXXXXX");
    }

}




Java Source Code List

com.baidu.cafe.CafeExceptionHandler.java
com.baidu.cafe.CafeListener.java
com.baidu.cafe.CafeServiceTestCase.java
com.baidu.cafe.CafeTestCase.java
com.baidu.cafe.CafeTestRunner.java
com.baidu.cafe.TearDownHelper.java
com.baidu.cafe.local.DESEncryption.java
com.baidu.cafe.local.FPSTracer.java
com.baidu.cafe.local.FileUtils.java
com.baidu.cafe.local.LocalLib.java
com.baidu.cafe.local.Log.java
com.baidu.cafe.local.NetworkUtils.java
com.baidu.cafe.local.SnapshotHelper.java
com.baidu.cafe.local.record.CafeWebViewClient.java
com.baidu.cafe.local.record.OutputEvent.java
com.baidu.cafe.local.record.ViewRecorderSDK.java
com.baidu.cafe.local.record.ViewRecorder.java
com.baidu.cafe.local.record.WebElementRecorder.java
com.baidu.cafe.local.traveler.APPTraveler.java
com.baidu.cafe.local.traveler.Logger.java
com.baidu.cafe.local.traveler.Operation.java
com.baidu.cafe.local.traveler.Util.java
com.baidu.cafe.local.traveler.ViewHelper.java
com.baidu.cafe.remote.ArmsBinder.java
com.baidu.cafe.remote.ArmsBootupReceiver.java
com.baidu.cafe.remote.Arms.java
com.baidu.cafe.remote.Armser.java
com.baidu.cafe.remote.BatteryState.java
com.baidu.cafe.remote.LockActivity.java
com.baidu.cafe.remote.Log.java
com.baidu.cafe.remote.MonkeyNetwork.java
com.baidu.cafe.remote.MyIntent.java
com.baidu.cafe.remote.SystemLib.java
com.baidu.cafe.remote.UILib.java
com.baidu.cafe.remote.ViewPropertyProvider.java
com.baidu.cafe.utils.CommandResult.java
com.baidu.cafe.utils.ReflectHelper.java
com.baidu.cafe.utils.ShellExecute.java
com.baidu.cafe.utils.Strings.java
com.baidu.cafe.utils.TreeNode.java