package com.android.cts.monkey;

import com.android.cts.tradefed.build.CtsBuildHelper;
import com.android.cts.util.AbiUtils;
import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.testtype.DeviceTestCase;
import com.android.tradefed.testtype.IAbi;
import com.android.tradefed.testtype.IAbiReceiver;
import com.android.tradefed.testtype.IBuildReceiver;

import java.io.File;

abstract class AbstractMonkeyTest extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {

    static final String[] PKGS = {"com.android.cts.monkey", "com.android.cts.monkey2"};
    static final String[] APKS = {"CtsMonkeyApp.apk", "CtsMonkeyApp2.apk"};

    /**
     * Base monkey command with flags to avoid side effects like airplane mode.
     */
    static final String MONKEY_CMD = "monkey --pct-touch 0 --pct-motion 0 --pct-majornav 0 --pct-syskeys 0 --pct-anyevent 0 --pct-rotation 0";

    IAbi mAbi;
    CtsBuildHelper mBuild;
    ITestDevice mDevice;

    @Override
    public void setAbi(IAbi abi) {
        mAbi = abi;
    }

    @Override
    public void setBuild(IBuildInfo buildInfo) {
        mBuild = CtsBuildHelper.createBuildHelper(buildInfo);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        mDevice = getDevice();
        String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
        for (int i = 0; i < PKGS.length; i++) {
            mDevice.uninstallPackage(PKGS[i]);
            File app = mBuild.getTestApp(APKS[i]);
            mDevice.installPackage(app, false, options);
        }
        clearLogCat();
    }

    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
        for (int i = 0; i < PKGS.length; i++) {
            mDevice.uninstallPackage(PKGS[i]);
        }
    }

    private void clearLogCat() throws DeviceNotAvailableException {
        mDevice.executeAdbCommand("logcat", "-c");
    }
}
