m_fanOutStreamSender = new FanOutStreamSender(GrinderConstants.AGENT_FANOUT_STREAM_THREAD_COUNT);
m_timer = new Timer(false);
try {
while (true) {
m_logger.info(GrinderBuild.getName());
ScriptLocation script = null;
GrinderProperties properties;
do {
properties = createAndMergeProperties(grinderProperties,
startMessage != null ? startMessage.getProperties() : null);
properties.setProperty(GrinderProperties.CONSOLE_HOST, m_agentConfig.getControllerIP());
m_agentIdentity.setName(m_agentConfig.getAgentHostID());
final Connector connector = m_connectorFactory.create(properties);
// We only reconnect if the connection details have changed.
if (consoleCommunication != null && !consoleCommunication.getConnector().equals(connector)) {
shutdownConsoleCommunication(consoleCommunication);
consoleCommunication = null;
// Accept any startMessage from previous console - see
// bug 2092881.
}
if (consoleCommunication == null && connector != null) {
try {
consoleCommunication = new ConsoleCommunication(connector, grinderProperties.getProperty(
"grinder.user", "_default"));
consoleCommunication.start();
m_logger.info("Connect to console at {}", connector.getEndpointAsString());
} catch (CommunicationException e) {
if (m_proceedWithoutConsole) {
m_logger.warn("{}, proceeding without the console; set "
+ "grinder.useConsole=false to disable this warning.", e.getMessage());
} else {
m_logger.error(e.getMessage());
return;
}
}
}
if (consoleCommunication != null && startMessage == null) {
m_logger.info("Waiting for console signal");
m_consoleListener.waitForMessage();
if (m_consoleListener.received(ConsoleListener.START)) {
startMessage = m_consoleListener.getLastStartGrinderMessage();
continue; // Loop to handle new properties.
} else {
break; // Another message, check at end of outer while loop.
}
}
if (startMessage != null) {
final GrinderProperties messageProperties = startMessage.getProperties();
final Directory fileStoreDirectory = m_fileStore.getDirectory();
// Convert relative path to absolute path.
messageProperties.setAssociatedFile(fileStoreDirectory.getFile(messageProperties
.getAssociatedFile()));
final File consoleScript = messageProperties.resolveRelativeFile(messageProperties.getFile(
GrinderProperties.SCRIPT, GrinderProperties.DEFAULT_SCRIPT));
// We only fall back to the agent properties if the start message
// doesn't specify a script and there is no default script.
if (messageProperties.containsKey(GrinderProperties.SCRIPT) || consoleScript.canRead()) {
// The script directory may not be the file's direct parent.
script = new ScriptLocation(fileStoreDirectory, consoleScript);
}
m_agentIdentity.setNumber(startMessage.getAgentNumber());
} else {
m_agentIdentity.setNumber(-1);
}
if (script == null) {
final File scriptFile = properties.resolveRelativeFile(properties.getFile(
GrinderProperties.SCRIPT, GrinderProperties.DEFAULT_SCRIPT));
script = new ScriptLocation(scriptFile);
}
m_logger.debug("The script location is {}", script.getFile().getAbsolutePath());
if (!script.getFile().canRead()) {
m_logger.error("The script file '{}' does not exist or is not readable.", script);
script = null;
break;
}
} while (script == null);
if (script != null) {
// Set up log directory.
if (!properties.containsKey(GrinderProperties.LOG_DIRECTORY)) {
properties.setFile(GrinderProperties.LOG_DIRECTORY, new File(m_agentConfig.getHome()
.getLogDirectory(), properties.getProperty(GRINDER_PROP_TEST_ID, "default")));
}
File logFile = new File(properties.getFile(GrinderProperties.LOG_DIRECTORY, new File(".")),
m_agentIdentity.getName() + "-" + m_agentIdentity.getNumber() + ".log");
m_logger.info("log file : {}", logFile);
AbstractLanguageHandler handler = Lang.getByFileName(script.getFile()).getHandler();
final WorkerFactory workerFactory;
Properties rebasedSystemProperty = rebaseSystemClassPath(System.getProperties(), m_agentConfig.getCurrentDirectory());
String jvmArguments = buildTestRunProperties(script, handler, rebasedSystemProperty, properties);
if (!properties.getBoolean("grinder.debug.singleprocess", false)) {
// Fix to provide empty system classpath to speed up
final WorkerProcessCommandLine workerCommandLine = new WorkerProcessCommandLine(properties,
filterSystemClassPath(rebasedSystemProperty, handler, m_logger), jvmArguments,
script.getDirectory());
m_logger.info("Worker process command line: {}", workerCommandLine);
FileUtils.writeStringToFile(logFile, workerCommandLine.toString() + "\n\n");
workerFactory = new ProcessWorkerFactory(workerCommandLine, m_agentIdentity,
m_fanOutStreamSender, consoleCommunication != null, script, properties);