package com.intuit.tank.harness; /* * #%L * Intuit Tank Agent (apiharness) * %% * Copyright (C) 2011 - 2015 Intuit Inc. * %% * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * #L% */ import java.util.Stack; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.intuit.tank.harness.data.HDTestPlan; import com.intuit.tank.harness.logging.LogUtil; import com.intuit.tank.logging.LogEventType; import com.intuit.tank.vm.api.enumerated.WatsAgentCommand; public class TestPlanStarter implements Runnable { private static final Logger LOG = LogManager.getLogger(TestPlanStarter.class); private HDTestPlan plan; private int numThreads; private Stack<Thread> runners = new Stack<Thread>(); private int threadsStarted; private boolean done; public TestPlanStarter(HDTestPlan plan, int numThreads) { super(); this.plan = plan; this.numThreads = (int) Math.floor(numThreads * (plan.getUserPercentage() / 100D)); } public void run() { // start initial users int numStartUsers = APITestHarness.getInstance().getAgentRunData().getNumStartUsers(); if (threadsStarted < numStartUsers && threadsStarted < numThreads) { LOG.info(LogUtil.getLogMessage("Starting initial " + numStartUsers + " users for plan " + plan.getTestPlanName() + "...")); while (threadsStarted < numStartUsers && threadsStarted < numThreads && !runners.isEmpty()) { runners.pop().start(); APITestHarness.getInstance().threadStarted(); threadsStarted++; } } // start rest of users sleeping between each interval LOG.info(LogUtil.getLogMessage("Starting ramp of additional " + (numThreads - threadsStarted) + " users for plan " + plan.getTestPlanName() + "...")); while (threadsStarted < numThreads && !runners.isEmpty()) { if ((threadsStarted - numStartUsers) % APITestHarness.getInstance().getAgentRunData().getUserInterval() == 0) { waitForRampTime(); } while (APITestHarness.getInstance().getCmd() == WatsAgentCommand.pause) { if (APITestHarness.getInstance().hasMetSimulationTime()) { APITestHarness.getInstance().setCommand(WatsAgentCommand.stop); break; } else { try { Thread.sleep(APITestHarness.POLL_INTERVAL); } catch (InterruptedException e) { // ignore } } } while (APITestHarness.getInstance().getCmd() == WatsAgentCommand.pause_ramp) { if (APITestHarness.getInstance().hasMetSimulationTime()) { APITestHarness.getInstance().setCommand(WatsAgentCommand.stop); break; } else { try { Thread.sleep(APITestHarness.POLL_INTERVAL); } catch (InterruptedException e) { // ignore } } } if (APITestHarness.getInstance().getCmd() == WatsAgentCommand.stop || APITestHarness.getInstance().getCmd() == WatsAgentCommand.kill) { break; } runners.pop().start(); APITestHarness.getInstance().threadStarted(); threadsStarted++; } done = true; } public int getThreadsStarted() { return threadsStarted; } public HDTestPlan getPlan() { return plan; } public int getNumThreads() { return numThreads; } public void setNumThreads(int numThreads) { this.numThreads = numThreads; } public boolean isDone() { return done; } public void addThread(Thread t) { runners.add(t); } private void waitForRampTime() { try { long rampDelay = 0; int ramp = (numThreads - APITestHarness.getInstance().getAgentRunData().getNumStartUsers()); if (ramp > 0) { rampDelay = (APITestHarness.getInstance().getAgentRunData().getRampTime() * APITestHarness .getInstance().getAgentRunData().getUserInterval()) / ramp; } if (rampDelay > 0) { Thread.sleep(rampDelay); } else if (APITestHarness.getInstance().getAgentRunData().getRampTime() > 0) { LOG.info(LogUtil.getLogMessage("No Ramp - " + rampDelay, LogEventType.System)); } } catch (Exception t) { LOG.error(LogUtil.getLogMessage("Error trying to wait for ramp", LogEventType.System), t); } } }