You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by db...@apache.org on 2005/12/06 04:27:22 UTC
svn commit: r354273 - in /geronimo/gbuild/trunk:
gbuild-agent-application/src/conf/
gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/
gbuild-agent/src/main/resources/META-INF/plexus/
gbuild-agent/src/test/java/org/apache/geronimo/gbuild/agent/
Author: dblevins
Date: Mon Dec 5 19:27:18 2005
New Revision: 354273
URL: http://svn.apache.org/viewcvs?rev=354273&view=rev
Log:
New Extension to kill processes left over after a run.
New Extension to send generic notifications to a topic.
Agent to read notifications from a topic and log them using a configurable format
Added:
geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildActivityMonitor.java
geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildActivityNotifier.java
geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/KillProcessesExtension.java
geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/ReportActivityExtension.java
geronimo/gbuild/trunk/gbuild-agent/src/test/java/org/apache/geronimo/gbuild/agent/KillProcessesExtensionTest.java
Modified:
geronimo/gbuild/trunk/gbuild-agent-application/src/conf/application.xml
geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/AbstractContinuumAgentAction.java
geronimo/gbuild/trunk/gbuild-agent/src/main/resources/META-INF/plexus/components.xml
Modified: geronimo/gbuild/trunk/gbuild-agent-application/src/conf/application.xml
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent-application/src/conf/application.xml?rev=354273&r1=354272&r2=354273&view=diff
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent-application/src/conf/application.xml (original)
+++ geronimo/gbuild/trunk/gbuild-agent-application/src/conf/application.xml Mon Dec 5 19:27:18 2005
@@ -5,7 +5,6 @@
<role>org.apache.geronimo.gbuild.agent.BuildAgent</role>
<role-hint>build-executor</role-hint>
</component>
-<!--
<component>
<role>org.apache.geronimo.gbuild.agent.BuildAgent</role>
<role-hint>build-producer</role-hint>
@@ -18,7 +17,12 @@
<role>org.apache.geronimo.gbuild.agent.BuildAgent</role>
<role-hint>ping-monitor</role-hint>
</component>
+<!--
-->
+ <component>
+ <role>org.apache.geronimo.gbuild.agent.BuildAgent</role>
+ <role-hint>build-activity</role-hint>
+ </component>
</load-on-start>
<resources>
@@ -31,7 +35,7 @@
<implementation>org.apache.geronimo.gbuild.agent.ClientManager</implementation>
<configuration>
<broker-url>tcp://ci.gbuild.org:16161</broker-url>
- <ping-interval>10000</ping-interval>
+ <ping-interval>300000</ping-interval>
<reconnect-attempts>10</reconnect-attempts>
<reconnect-delay>600000</reconnect-delay>
</configuration>
Modified: geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/AbstractContinuumAgentAction.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/AbstractContinuumAgentAction.java?rev=354273&r1=354272&r2=354273&view=diff
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/AbstractContinuumAgentAction.java (original)
+++ geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/AbstractContinuumAgentAction.java Mon Dec 5 19:27:18 2005
@@ -42,13 +42,13 @@
public static final String KEY_TRIGGER = "trigger";
- public static final String KEY_HOST_NAME = "hostName";
+ public static final String KEY_HOST_NAME = "host-name";
- public static final String KEY_HOST_ADDRESS = "hostAddress";
+ public static final String KEY_HOST_ADDRESS = "host-address";
public static final String KEY_CONTRIBUTOR = "contributor";
- public static final String KEY_ADMIN_ADDRESS = "adminAddress";
+ public static final String KEY_ADMIN_ADDRESS = "admin-address";
public static final String KEY_OS_VERSION = "os.version";
Added: geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildActivityMonitor.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildActivityMonitor.java?rev=354273&view=auto
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildActivityMonitor.java (added)
+++ geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildActivityMonitor.java Mon Dec 5 19:27:18 2005
@@ -0,0 +1,111 @@
+/**
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * 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 org.apache.geronimo.gbuild.agent;
+
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.StartingException;
+
+import javax.jms.Session;
+import javax.jms.MessageConsumer;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.ObjectMessage;
+import javax.jms.Connection;
+import java.util.Map;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class BuildActivityMonitor extends AbstractContinuumBuildAgent {
+
+ /**
+ * @plexus.configuration
+ */
+ private String buildActivityTopic;
+
+ /**
+ * @plexus.configuration
+ */
+ private String logFormat;
+ private StringTemplate template;
+
+ public synchronized void start() throws StartingException {
+ template = new StringTemplate(logFormat);
+ super.start();
+ }
+
+ public void execute(Map context) throws Exception {
+ getLogger().info(template.apply(context));
+ }
+
+ public void run() {
+ try {
+ getLogger().info("Build Activity Agent.");
+ getLogger().debug("buildActivityTopic " + buildActivityTopic);
+
+ while (isRunning()) {
+ // Create a Session
+ Client client = getClient();
+
+ Session session = client.getSession();
+
+ MessageConsumer resultsConsumer = createConsumer(session, buildActivityTopic);
+
+ try {
+ consumeMessages(client, resultsConsumer);
+ } catch (JMSException e) {
+ getLogger().error("Agent recieved JMS Exception. ("+e.getMessage()+")");
+ }
+ }
+
+ } catch (Exception e) {
+ getLogger().error("Agent failed.", e);
+ }
+ }
+
+ private void consumeMessages(Client client, MessageConsumer resultsConsumer) throws JMSException {
+ while (client.isConnected() && isRunning()) {
+ // Wait for a message
+ Message message = resultsConsumer.receive(1000);
+
+ if (message == null){
+
+ continue;
+
+ } else if (message instanceof ObjectMessage) {
+
+ try {
+ Connection connection = client.getConnection();
+ getLogger().info("Message Received "+ message.getJMSMessageID() +" on "+ connection.getClientID()+":"+buildActivityTopic);
+
+ ObjectMessage objectMessage = (ObjectMessage) message;
+
+ Map context = getMap(objectMessage, message);
+
+ execute(context);
+
+ getLogger().info("Finished processing "+ message.getJMSMessageID());
+
+ } catch (Exception e) {
+ getLogger().error("Failed Processing message "+message.getJMSMessageID());
+ }
+
+ } else {
+ getLogger().warn("Agent received incorrect message type: "+message.getClass().getName());
+ }
+ }
+ }
+}
Added: geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildActivityNotifier.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildActivityNotifier.java?rev=354273&view=auto
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildActivityNotifier.java (added)
+++ geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildActivityNotifier.java Mon Dec 5 19:27:18 2005
@@ -0,0 +1,83 @@
+/**
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * 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 org.apache.geronimo.gbuild.agent;
+
+import org.codehaus.plexus.logging.AbstractLogEnabled;
+
+import javax.jms.ObjectMessage;
+import javax.jms.MessageProducer;
+import javax.jms.JMSException;
+import java.util.Map;
+import java.util.HashMap;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class BuildActivityNotifier extends AbstractLogEnabled {
+
+ /**
+ * @plexus.requirement
+ */
+ private ClientManager clientManager;
+
+ /**
+ * @plexus.configuration
+ */
+ private String buildActivityTopic;
+
+
+ public void sendNotification(Map build, String notification) {
+ HashMap map = new HashMap();
+
+ map.putAll(build);
+
+ ContinuumBuildAgent.setSystemProperty(map, ContinuumBuildAgent.KEY_OS_VERSION);
+
+ ContinuumBuildAgent.setSystemProperty(map, ContinuumBuildAgent.KEY_OS_NAME);
+
+ ContinuumBuildAgent.setSystemProperty(map, ContinuumBuildAgent.KEY_JAVA_VERSION);
+
+ ContinuumBuildAgent.setSystemProperty(map, ContinuumBuildAgent.KEY_JAVA_VENDOR);
+
+ try {
+ InetAddress localHost = InetAddress.getLocalHost();
+
+ map.put(ContinuumBuildAgent.KEY_HOST_NAME, localHost.getHostName());
+
+ map.put(ContinuumBuildAgent.KEY_HOST_ADDRESS, localHost.getHostAddress());
+ } catch (UnknownHostException e) {
+ getLogger().warn("Unable to determine local host information", e);
+ }
+
+ map.put("notification", notification);
+
+ try {
+ Client client = clientManager.getClient();
+
+ ObjectMessage message = client.getSession().createObjectMessage(map);
+
+ MessageProducer producer = client.createTopicProducer(buildActivityTopic);
+
+ producer.send(message);
+ } catch (JMSException e1) {
+ getLogger().error("Send failed.", e1);
+ }
+ }
+
+}
Added: geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/KillProcessesExtension.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/KillProcessesExtension.java?rev=354273&view=auto
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/KillProcessesExtension.java (added)
+++ geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/KillProcessesExtension.java Mon Dec 5 19:27:18 2005
@@ -0,0 +1,155 @@
+/**
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * 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 org.apache.geronimo.gbuild.agent;
+
+import org.codehaus.plexus.logging.AbstractLogEnabled;
+import org.codehaus.plexus.util.cli.CommandLineException;
+import org.codehaus.plexus.util.cli.CommandLineUtils;
+import org.codehaus.plexus.util.cli.Commandline;
+
+import java.io.File;
+import java.util.Map;
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class KillProcessesExtension extends AbstractLogEnabled implements BuildAgentExtention {
+
+ /**
+ * @plexus.requirement
+ */
+ private BuildActivityNotifier notifier;
+
+ private String regex;
+
+ public static final String GREP_FOR_PROCESS_IDS = "ps ax | grep 'java.*geronimo-' | perl -pe 's/^ *([0-9]+) .*/$1/g'";
+
+ public void preProcess(Map build) {
+ }
+
+ public void postProcess(Map build, Map results) {
+ boolean isWindows = System.getProperty("os.name").startsWith("Windows");
+
+ if (isWindows){
+ return;
+ }
+
+ String[] ids = null;
+
+ List pids = null;
+ try {
+ pids = findProcessIds(regex);
+ } catch (Exception e) {
+ getLogger().warn("Failed to get a list of running processes. ", e);
+ return;
+ }
+
+ String processes = "";
+ for (int i = 0; i < pids.size(); i++) {
+ String pid = (String) pids.get(i);
+ processes += pid +", ";
+ }
+
+ processes = processes.replaceAll(", $","");
+
+ if (pids.size() > 0){
+
+ String message = "Found " + pids.size()+ " processes matching \""+regex+"\" (" + processes + ").";
+
+ results.put("header.hung-processes", processes);
+ getLogger().info(message);
+ notifier.sendNotification(build, message);
+
+ try {
+ killProcesses(pids);
+ } catch (Exception e) {
+ getLogger().error("Unable to kill "+pids.size()+" processes matching \""+regex+"\" (" + processes + ").", e);
+ }
+
+ } else {
+ getLogger().debug("No processes found matching \""+regex+"\".");
+ }
+ }
+
+ public static void killProcesses(List pids) throws Exception {
+ ExecResult res = exec("kill", (String[]) pids.toArray(new String[]{}));
+ if (res.exitCode != 0){
+ throw new IllegalStateException("Command returned error exit code " + res.exitCode + ".");
+ }
+ }
+
+ public static List findProcessIds(String regex) throws Exception {
+ ExecResult res = exec("sh", new String[]{"-c","\"ps ax\""});
+ if (res.exitCode != 0){
+ throw new IllegalStateException("Command returned error exit code " + res.exitCode + ".");
+ }
+ String stdout = res.getStdout();
+ String[] lines = stdout.split("[\n\r]");
+ List list = new ArrayList();
+ for (int i = 0; i < lines.length; i++) {
+ String line = lines[i];
+ if (line.matches(regex)){
+ line = line.replaceFirst(" *","");
+ String pid = line.split(" +")[0];
+ list.add(pid);
+ }
+ }
+ return list;
+ }
+
+ public static class ExecResult {
+ private final int exitCode;
+ private final String stdout;
+ private final String stderr;
+
+ public ExecResult(int exitCode, String stdout, String stderr) {
+ this.exitCode = exitCode;
+ this.stdout = stdout;
+ this.stderr = stderr;
+ }
+
+ public int getExitCode() {
+ return exitCode;
+ }
+
+ public String getStdout() {
+ return stdout;
+ }
+
+ public String getStderr() {
+ return stderr;
+ }
+ }
+
+ public static ExecResult exec(String cmd, String[] arguments) throws CommandLineException {
+ Commandline commandline = new Commandline();
+ commandline.setExecutable(cmd);
+ commandline.setWorkingDirectory(new File(".").getAbsolutePath());
+
+ for (int i = 0; i < arguments.length; i++) {
+ commandline.createArgument().setLine(arguments[i]);
+ }
+
+ CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
+ CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
+ int exitCode = CommandLineUtils.executeCommandLine(commandline, stdout, stderr);
+ return new ExecResult(exitCode, stdout.getOutput(), stderr.getOutput());
+ }
+
+}
Added: geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/ReportActivityExtension.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/ReportActivityExtension.java?rev=354273&view=auto
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/ReportActivityExtension.java (added)
+++ geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/ReportActivityExtension.java Mon Dec 5 19:27:18 2005
@@ -0,0 +1,40 @@
+/**
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * 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 org.apache.geronimo.gbuild.agent;
+
+import org.codehaus.plexus.logging.AbstractLogEnabled;
+
+import java.util.Map;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class ReportActivityExtension extends AbstractLogEnabled implements BuildAgentExtention {
+
+ /**
+ * @plexus.requirement
+ */
+ private BuildActivityNotifier notifier;
+
+ public void preProcess(Map build) {
+ notifier.sendNotification(build, "Started");
+ }
+
+ public void postProcess(Map build, Map results) {
+ notifier.sendNotification(build, "Completed");
+ }
+}
Modified: geronimo/gbuild/trunk/gbuild-agent/src/main/resources/META-INF/plexus/components.xml
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/src/main/resources/META-INF/plexus/components.xml?rev=354273&r1=354272&r2=354273&view=diff
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/src/main/resources/META-INF/plexus/components.xml (original)
+++ geronimo/gbuild/trunk/gbuild-agent/src/main/resources/META-INF/plexus/components.xml Mon Dec 5 19:27:18 2005
@@ -1,22 +1,12 @@
<component-set>
<components>
- <!--
- <component>
- <role>org.apache.geronimo.gbuild.Main</role>
- <implementation>org.apache.geronimo.gbuild.Main</implementation>
- <requirements>
- <requirement>
- <role>org.apache.geronimo.gbuild.BuildAgent</role>
- </requirement>
- </requirements>
- </component>
- -->
+
<component>
<role>org.apache.geronimo.gbuild.agent.ClientManager</role>
<implementation>org.apache.geronimo.gbuild.agent.ClientManager</implementation>
<configuration>
<broker-url>tcp://localhost:61616</broker-url>
- <ping-interval>10000</ping-interval>
+ <ping-interval>300000</ping-interval>
<reconnect-attempts>10</reconnect-attempts>
<reconnect-delay>600000</reconnect-delay>
</configuration>
@@ -191,6 +181,63 @@
<role>org.apache.geronimo.gbuild.agent.ClientManager</role>
</requirement>
</requirements>
+ </component>
+
+ <!--
+ | Build Activity
+ -->
+ <component>
+ <role>org.apache.geronimo.gbuild.agent.BuildAgent</role>
+ <role-hint>build-activity</role-hint>
+ <implementation>org.apache.geronimo.gbuild.agent.BuildActivityMonitor</implementation>
+ <requirements>
+ <requirement>
+ <role>org.apache.geronimo.gbuild.agent.ClientManager</role>
+ </requirement>
+ </requirements>
+ <configuration>
+ <log-format>[{host-name}:{host-address}] {project.name}-{project.version} - {build.name} {build.id} - {notification}</log-format>
+ <build-activity-topic>BUILD.ACTIVITY</build-activity-topic>
+ </configuration>
+ </component>
+
+ <component>
+ <role>org.apache.geronimo.gbuild.agent.BuildActivityNotifier</role>
+ <role-hint>ping-monitor</role-hint>
+ <implementation>org.apache.geronimo.gbuild.agent.BuildActivityNotifier</implementation>
+ <requirements>
+ <requirement>
+ <role>org.apache.geronimo.gbuild.agent.ClientManager</role>
+ </requirement>
+ </requirements>
+ <configuration>
+ <build-activity-topic>BUILD.ACTIVITY</build-activity-topic>
+ </configuration>
+ </component>
+
+ <component>
+ <role>org.apache.geronimo.gbuild.agent.BuildAgentExtention</role>
+ <role-hint>report-activity</role-hint>
+ <implementation>org.apache.geronimo.gbuild.agent.ReportActivityExtension</implementation>
+ <requirements>
+ <requirement>
+ <role>org.apache.geronimo.gbuild.agent.BuildActivityNotifier</role>
+ </requirement>
+ </requirements>
+ </component>
+
+ <component>
+ <role>org.apache.geronimo.gbuild.agent.BuildAgentExtention</role>
+ <role-hint>clean-dead-processes</role-hint>
+ <implementation>org.apache.geronimo.gbuild.agent.KillProcessesExtension</implementation>
+ <requirements>
+ <requirement>
+ <role>org.apache.geronimo.gbuild.agent.BuildActivityNotifier</role>
+ </requirement>
+ </requirements>
+ <configuration>
+ <regex>.*geronimo-tck.*</regex>
+ </configuration>
</component>
</components>
Added: geronimo/gbuild/trunk/gbuild-agent/src/test/java/org/apache/geronimo/gbuild/agent/KillProcessesExtensionTest.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/src/test/java/org/apache/geronimo/gbuild/agent/KillProcessesExtensionTest.java?rev=354273&view=auto
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/src/test/java/org/apache/geronimo/gbuild/agent/KillProcessesExtensionTest.java (added)
+++ geronimo/gbuild/trunk/gbuild-agent/src/test/java/org/apache/geronimo/gbuild/agent/KillProcessesExtensionTest.java Mon Dec 5 19:27:18 2005
@@ -0,0 +1,34 @@
+package org.apache.geronimo.gbuild.agent;
+/**
+ * @version $Rev$ $Date$
+ */
+
+import junit.framework.*;
+import org.apache.geronimo.gbuild.agent.KillProcessesExtension;
+
+import java.util.List;
+
+public class KillProcessesExtensionTest extends TestCase {
+
+ public void testFindProcessIds() throws Exception {
+ boolean isWindows = System.getProperty("os.name").startsWith("Windows");
+
+ if (isWindows){
+ return;
+ }
+
+ Runtime runtime = Runtime.getRuntime();
+
+ runtime.exec("sleep 43210");
+ runtime.exec("sleep 43210");
+ runtime.exec("sleep 43210");
+
+ List pids = KillProcessesExtension.findProcessIds(".*sleep 43210.*");
+
+ assertEquals("processes started: pids.size", 3, pids.size());
+ KillProcessesExtension.killProcesses(pids);
+
+ pids = KillProcessesExtension.findProcessIds(".*sleep 43210.*");
+ assertEquals("processes killed: pids.size", 0, pids.size());
+ }
+}
\ No newline at end of file