[jboss-cvs] JBossAS SVN: r61283 - trunk/testsuite/src/main/org/jboss/test/cluster/test.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Mon Mar 12 11:43:16 EDT 2007
Author: bstansberry at jboss.com
Date: 2007-03-12 11:43:16 -0400 (Mon, 12 Mar 2007)
New Revision: 61283
Added:
trunk/testsuite/src/main/org/jboss/test/cluster/test/PromiscuousTrafficTester.java
Log:
Put PromiscuousTrafficeTester under source control
Added: trunk/testsuite/src/main/org/jboss/test/cluster/test/PromiscuousTrafficTester.java
===================================================================
--- trunk/testsuite/src/main/org/jboss/test/cluster/test/PromiscuousTrafficTester.java (rev 0)
+++ trunk/testsuite/src/main/org/jboss/test/cluster/test/PromiscuousTrafficTester.java 2007-03-12 15:43:16 UTC (rev 61283)
@@ -0,0 +1,280 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.jboss.test.cluster.test;
+
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.InetAddress;
+import java.net.MulticastSocket;
+import java.net.UnknownHostException;
+
+/**
+ * Tests for the existence of the problem described at
+ * http://wiki.jboss.org/wiki/Wiki.jsp?page=PromiscuousTraffic
+ *
+ * @author <a href="brian.stansberry at jboss.com">Brian Stansberry</a>
+ * @version $Revision: 1.1 $
+ */
+public class PromiscuousTrafficTester
+{
+ private InetAddress goodMulticast;
+ private InetAddress badMulticast;
+ private InetAddress senderAddress;
+ private InetAddress receiverAddress;
+ private int mcastPort = 64000;
+ private int ttl = 0;
+
+ private MulticastSocket sender;
+ private MulticastReceiver goodReceiver;
+ private MulticastReceiver badReceiver;
+
+ private PromiscuousTrafficTester(String[] args) throws Exception
+ {
+ // Set defaults
+ goodMulticast = InetAddress.getByName("229.10.11.12");
+ badMulticast = InetAddress.getByName("229.10.11.13");
+ senderAddress = InetAddress.getLocalHost();
+ receiverAddress = InetAddress.getLocalHost();
+
+ // Check what was passed in
+ parseArgs(args);
+
+ try
+ {
+ setUpSockets();
+ }
+ catch (Exception e)
+ {
+ closeSockets();
+ throw e;
+ }
+ }
+
+ private void test() throws Exception
+ {
+ try
+ {
+ byte[] data = "Hello".getBytes();
+ DatagramPacket datagram = new DatagramPacket(data, 0, data.length, goodMulticast, mcastPort);
+
+ System.out.println("Sending 'Hello' on " + goodMulticast + ":" + mcastPort);
+ sender.send(datagram);
+
+ Thread.sleep(1000);
+
+ if ("Hello".equals(goodReceiver.getValue()) == false)
+ throw new IllegalStateException("Did not receive 'Hello' as expected; got " + goodReceiver.getValue());
+
+ if (badReceiver.getValue() != null)
+ {
+ System.out.println("Bad news. Detected the Promiscuous Traffic " +
+ "problem. Received " + badReceiver.getValue() +
+ " on undesired address " + badMulticast);
+ }
+ else
+ {
+ System.out.println("Good news. Did not detect the Promiscuous Traffic problem.");
+ }
+ }
+ finally
+ {
+ closeSockets();
+ }
+ }
+
+ private void parseArgs(String[] args) throws UnknownHostException
+ {
+ if (args == null || args.length == 0)
+ return;
+
+ senderAddress = InetAddress.getByName(args[0]);
+
+ if (args.length > 1)
+ receiverAddress = InetAddress.getByName(args[1]);
+ else
+ receiverAddress = senderAddress;
+
+ if (args.length > 2)
+ goodMulticast = InetAddress.getByName(args[2]);
+
+ if (args.length > 3)
+ badMulticast = InetAddress.getByName(args[3]);
+
+ if (args.length > 4)
+ mcastPort = Integer.parseInt(args[4]);
+
+ if (args.length > 5)
+ ttl = Integer.parseInt(args[5]);
+ }
+
+ private void setUpSockets() throws IOException
+ {
+ sender = new MulticastSocket();
+ sender.setInterface(senderAddress);
+ sender.setTimeToLive(ttl);
+
+ goodReceiver = new MulticastReceiver(goodMulticast);
+ goodReceiver.startListener();
+
+ badReceiver = new MulticastReceiver(badMulticast);
+ badReceiver.startListener();
+
+ // Sleep a bit to let the listeners start
+ try
+ {
+ Thread.sleep(250);
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ private void closeSockets()
+ {
+ if (goodReceiver != null)
+ goodReceiver.stopListener();
+
+ if (badReceiver != null)
+ badReceiver.stopListener();
+
+ if (sender != null)
+ sender.close();
+ }
+
+ /**
+ * Create and run the PromiscuousTrafficTester.
+ *
+ * @param args 0 or more of the following; not all need be present, but none
+ * can be skipped if subsequent values are desired:
+ * [0] Interface sender should bind to (machine name)
+ * [1] Interface receivers should bind to (same as sender interface)
+ * [2] Multicast address on which packets will be sent (229.10.11.12)
+ * [3] Multicast address on which receipt of packet means (229.10.11.13)
+ * promiscuous traffic problem is present
+ * [4] Multicast port (64000)
+ * [5] TTL of multicast packet (0)
+ */
+ public static void main(String[] args)
+ {
+ try
+ {
+ PromiscuousTrafficTester tester = new PromiscuousTrafficTester(args);
+ tester.test();
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ private class MulticastReceiver implements Runnable
+ {
+ private InetAddress group;
+ private MulticastSocket socket;
+ private String value;
+ private Exception exception;
+ private Thread thread;
+ private boolean stopping;
+
+ MulticastReceiver(InetAddress mcastAddr) throws IOException
+ {
+ group = mcastAddr;
+ socket = new MulticastSocket(mcastPort);
+ socket.setInterface(receiverAddress);
+ socket.joinGroup(mcastAddr);
+ }
+
+
+ public void run()
+ {
+ try
+ {
+ System.out.println("Listening on address " + group);
+
+ byte[] buf = new byte[256];
+ DatagramPacket packet = new DatagramPacket(buf, buf.length);
+ socket.receive(packet);
+
+ value = new String(packet.getData()).trim();
+
+ System.out.println(group + ":" + mcastPort + " -- Received " + value);
+ }
+ catch (Exception e)
+ {
+ if (!stopping)
+ {
+ this.exception = e;
+ e.printStackTrace(System.out);
+ }
+ }
+ }
+
+
+ public Exception getException()
+ {
+ return exception;
+ }
+
+ public String getValue()
+ {
+ return value;
+ }
+
+ public void startListener()
+ {
+ thread = new Thread(this);
+ thread.start();
+ }
+
+ public void stopListener()
+ {
+ stopping = true;
+
+ if (thread.isAlive())
+ {
+ try
+ {
+ thread.join(50);
+ }
+ catch (InterruptedException e)
+ {
+ }
+
+ if (thread.isAlive())
+ thread.interrupt();
+ }
+
+ try
+ {
+ socket.leaveGroup(group);
+ }
+ catch (IOException e)
+ {
+ }
+
+ socket.close();
+ }
+
+ }
+}
More information about the jboss-cvs-commits
mailing list