package net.heartsome.license.test;

import net.heartsome.license.constants.Constants;
import net.heartsome.license.webservice.ServiceUtilTest;

import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;

public class LicenseActivateCheckDeactivate extends AbstractJavaSamplerClient {

	private SampleResult results;
	private String licenseID;
	private String hardwareCode;
	private String installCode;
	private int waitTimeMillis;
	private int intervalTimeMillis;
	private String strResult;
	private long startTime;
	private long pastTime;
	private int waitCount = 0;

	@Override
	public SampleResult runTest(JavaSamplerContext context) {
		results = new SampleResult();
		results.sampleStart();

		licenseID = context.getParameter("LicenseID");
		hardwareCode = context.getParameter("HardwareCode");
		installCode = context.getParameter("InstallCode");
		waitTimeMillis = Integer.valueOf(context.getParameter("WaitSeconds")) * 1000;
		intervalTimeMillis = Integer.valueOf(context
				.getParameter("IntervalSeconds")) * 1000;
		strResult = licenseID + ":\n";
		startTime = System.currentTimeMillis();

		// 检查许可证状态,应为未激活,然后激活
		check(NextAction.ACTIVATE, "不通过");

		// 等待两次测试之间的间隔时间
		wait(intervalTimeMillis);

		pastTime = System.currentTimeMillis() - startTime - waitTimeMillis
				* waitCount - intervalTimeMillis;

		results.setResponseMessage(strResult + "\n实际耗时(毫秒):" + pastTime);
		results.sampleEnd();
		return results;
	}

	public Arguments getDefaultParameters() {
		Arguments args = new Arguments();
		args.addArgument("LicenseID", "89U1jiKrhD5IG1yNU0O2CinG");
		args.addArgument("HardwareCode", "TestHW");
		args.addArgument("InstallCode", "TestInstall");
		args.addArgument("WaitSeconds", "5");
		args.addArgument("IntervalSeconds", "30");
		return args;
	}

	/**
	 * 检查许可证状态,
	 * 
	 * @param na
	 *            检查后的下一步操作
	 * @param expected
	 *            预期检查结果
	 */
	private void check(NextAction na, String expected) {
		try {
			String result = ServiceUtilTest.check(licenseID, hardwareCode,
					installCode);
			if (result.equals("Check Success")) {
				strResult += ("预期" + expected + ",验证通过!\n");

				// 若下一步为取消激活,则当前应该是已激活
				if (na.equals(NextAction.DEACTIVATE)) {
					results.setSuccessful(true);
					wait(waitTimeMillis);
					deactivate();
					// 否则应该为未激活状态,非预期结果,故测试失败
				} else {
					results.setSuccessful(false);
				}

			} else {
				strResult += ("预期" + expected + ",验证未通过,返回结果为:" + result + "\n");

				// 下一步为激活,则当前应为未激活
				if (na.equals(NextAction.ACTIVATE)) {
					results.setSuccessful(true);
					wait(waitTimeMillis);
					activate();
					// 若测试结束,应已成功取消激活
				} else if (na.equals(NextAction.END)) {
					results.setSuccessful(true);
					results.setResponseCodeOK();
					// 否则应为已激活状态,非预期结果,故测试失败
				} else {
					results.setSuccessful(false);
				}
			}
		} catch (Exception e) {
			results.setSuccessful(false);
			strResult += "验证失败,异常信息:\n" + e.getMessage() + "\n";
		}
	}

	/**
	 * 激活许可证
	 */
	private void activate() {
		try {
			String result = ServiceUtilTest.active(licenseID, hardwareCode,
					installCode);
			if (result.equals("Active Success")) {
				strResult += "激活成功!\n";
				results.setSuccessful(true);

				// 等待指定时间
				wait(waitTimeMillis);

				// 检查许可证激活状态,并指定下一步操作为取消激活
				check(NextAction.DEACTIVATE, "通过");
			} else {
				results.setSuccessful(false);
				strResult = strResult + "激活失败,返回结果为:" + result + "\n";
			}

		} catch (Exception e) {
			// e.printStackTrace();
			results.setSuccessful(false);
			strResult = strResult + "激活失败,异常信息:\n" + e.getMessage() + "\n";
		}
	}

	/**
	 * 取消激活许可证
	 */
	private void deactivate() {
		try {
			String result = ServiceUtilTest.cancel(licenseID, hardwareCode,
					installCode);
			if (Constants.RETURN_LOGOUTSUCESS.equals(result)) {
				results.setSuccessful(true);
				strResult += "取消激活成功!\n";

				// 等待指定时间
				wait(waitTimeMillis);

				// 检查许可证激活状态,并指明测试结束
				check(NextAction.END, "不通过");
			} else {
				results.setSuccessful(false);
				strResult += "取消激活失败,返回结果为:" + result + "\n";
			}
		} catch (Exception e) {
			results.setSuccessful(false);
			strResult += "取消激活失败,异常信息:\n" + e.getMessage() + "\n";
		}
	}

	/**
	 * 等待指定毫秒数
	 * 
	 * @param waitTimeMillis
	 */
	private void wait(int waitTimeMillis) {
		if (waitTimeMillis != 0) {
			try {
				Thread.sleep(waitTimeMillis);
				waitCount++;
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * @author felix_lu 下一步操作:激活、取消激活、结束
	 */
	private enum NextAction {
		ACTIVATE, DEACTIVATE, END
	}
}