/* * Copyright (c) 2001-2007 Sun Microsystems, Inc. All rights reserved. * * The Sun Project JXTA(TM) Software License * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The end-user documentation included with the redistribution, if any, must * include the following acknowledgment: "This product includes software * developed by Sun Microsystems, Inc. for JXTA(TM) technology." * Alternately, this acknowledgment may appear in the software itself, if * and wherever such third-party acknowledgments normally appear. * * 4. The names "Sun", "Sun Microsystems, Inc.", "JXTA" and "Project JXTA" must * not be used to endorse or promote products derived from this software * without prior written permission. For written permission, please contact * Project JXTA at http://www.jxta.org. * * 5. Products derived from this software may not be called "JXTA", nor may * "JXTA" appear in their name, without prior written permission of Sun. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SUN * MICROSYSTEMS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * JXTA is a registered trademark of Sun Microsystems, Inc. in the United * States and other countries. * * Please see the license information page at : * <http://www.jxta.org/project/www/license.html> for instructions on use of * the license in source files. * * ==================================================================== * * This software consists of voluntary contributions made by many individuals * on behalf of Project JXTA. For more information on Project JXTA, please see * http://www.jxta.org. * * This license is based on the BSD license adopted by the Apache Foundation. */ package net.jxta.protocol; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import junit.framework.*; import java.io.InputStreamReader; import java.io.StringReader; import java.io.StringWriter; import java.io.Reader; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.HashSet; import java.util.List; import java.util.Vector; import java.util.Set; import net.jxta.document.AdvertisementFactory; import net.jxta.document.StructuredDocumentFactory; import net.jxta.document.StructuredTextDocument; import net.jxta.document.MimeMediaType; import net.jxta.document.XMLDocument; import net.jxta.endpoint.EndpointAddress; import net.jxta.id.IDFactory; import net.jxta.peer.PeerID; import net.jxta.impl.protocol.RouteQuery; import net.jxta.impl.protocol.RouteResponse; /** * This is a simple test for Route and AccessPoint advertisement */ public class TestRouteAdv extends TestCase { public TestRouteAdv(java.lang.String testName) { super(testName); } public static void main(java.lang.String[] args) { junit.textui.TestRunner.run(suite()); } public static Test suite() { TestSuite suite = new TestSuite(TestRouteAdv.class); return suite; } @Override protected void setUp() {} public void testRouteAdv() { // create access point advertisment for destination System.out.println("Create an access point advertisement"); AccessPointAdvertisement ap = (AccessPointAdvertisement) AdvertisementFactory.newAdvertisement(AccessPointAdvertisement.getAdvertisementType()); ap.setPeerID(IDFactory.newPeerID(IDFactory.newPeerGroupID())); Vector addresses = new Vector(); addresses.add("TCP:123.123.123.123"); addresses.add("TCP:134.134.134.134"); ap.setEndpointAddresses(addresses); try { // let's print the advertisement as a plain text document StructuredTextDocument doc = (StructuredTextDocument) ap.getDocument(MimeMediaType.XMLUTF8); System.out.println("AccessPointAdvertisement original : "); System.out.println(doc.toString()); StringWriter out = new StringWriter(); out.write(doc.toString()); out.close(); StringReader in = new StringReader(out.toString()); XMLDocument advDocument = (XMLDocument) StructuredDocumentFactory.newStructuredDocument( MimeMediaType.XMLUTF8, in); AccessPointAdvertisement apAdv = (AccessPointAdvertisement) AdvertisementFactory.newAdvertisement(advDocument); in.close(); doc = (StructuredTextDocument) apAdv.getDocument(MimeMediaType.XMLUTF8); System.out.println("AccessPointAdvertisement reconstructed : "); System.out.println(doc.toString()); // verify advertisement assertEquals(ap.getPeerID(), apAdv.getPeerID()); Enumeration e1 = apAdv.getEndpointAddresses(); for (Enumeration e = Collections.enumeration(addresses); e.hasMoreElements();) { assertEquals(e.nextElement(), e1.nextElement()); } } catch (Exception ex) { ex.printStackTrace(); fail("Error constructing advertisement"); } // create Route advertisment with a single destination System.out.println("Create Route with single destination "); RouteAdvertisement route = (RouteAdvertisement) AdvertisementFactory.newAdvertisement(RouteAdvertisement.getAdvertisementType()); route.setDest(ap); try { // let's print the advertisement as a plain text document StructuredTextDocument doc = (StructuredTextDocument) route.getDocument(MimeMediaType.XMLUTF8); System.out.println(doc.toString()); StringWriter out = new StringWriter(); out.write(doc.toString()); out.close(); StringReader in = new StringReader(out.toString()); XMLDocument advDocument = (XMLDocument) StructuredDocumentFactory.newStructuredDocument( MimeMediaType.XMLUTF8, in); RouteAdvertisement routeAdv = (RouteAdvertisement) AdvertisementFactory.newAdvertisement(advDocument); in.close(); doc = (StructuredTextDocument) routeAdv.getDocument(MimeMediaType.XMLUTF8); System.out.println("RouteAdvertisement reconstructed : "); System.out.println(doc.toString()); // verify advertisement ap = route.getDest(); AccessPointAdvertisement ap1 = routeAdv.getDest(); assertEquals(ap.getPeerID(), ap1.getPeerID()); Enumeration e1 = ap1.getEndpointAddresses(); for (Enumeration e = ap.getEndpointAddresses(); e.hasMoreElements();) { assertEquals(e.nextElement(), e1.nextElement()); } Enumeration r1 = routeAdv.getHops(); for (Enumeration e = routeAdv.getHops(); e.hasMoreElements();) { ap = (AccessPointAdvertisement) e.nextElement(); ap1 = (AccessPointAdvertisement) r1.nextElement(); assertEquals(ap.getPeerID(), ap1.getPeerID()); e1 = ap1.getEndpointAddresses(); for (Enumeration e2 = ap.getEndpointAddresses(); e2.hasMoreElements();) { assertEquals(e2.nextElement(), e1.nextElement()); } } } catch (Exception ex) { ex.printStackTrace(); fail("Error constructing advertisement"); } // create access point advertisment for hops AccessPointAdvertisement ap1 = (AccessPointAdvertisement) AdvertisementFactory.newAdvertisement(AccessPointAdvertisement.getAdvertisementType()); ap1.setPeerID(IDFactory.newPeerID(IDFactory.newPeerGroupID())); addresses = new Vector(); addresses.add("TCP:222.222.222.222"); addresses.add("TCP:244.244.244.244"); ap1.setEndpointAddresses(addresses); AccessPointAdvertisement ap2 = (AccessPointAdvertisement) AdvertisementFactory.newAdvertisement(AccessPointAdvertisement.getAdvertisementType()); ap2.setPeerID(IDFactory.newPeerID(IDFactory.newPeerGroupID())); addresses = new Vector(); addresses.add("TCP:666.666.666.666"); addresses.add("TCP:777.777.777.777"); ap2.setEndpointAddresses(addresses); // create Route advertisment with a single destination System.out.println("Create Route with destination and one hope"); RouteAdvertisement route1 = (RouteAdvertisement) AdvertisementFactory.newAdvertisement(RouteAdvertisement.getAdvertisementType()); route1.setDest(ap); Vector hops = new Vector(); hops.add(ap1); hops.add(ap2); route1.setHops(hops); try { // let's print the advertisement as a plain text document StructuredTextDocument doc = (StructuredTextDocument) route1.getDocument(MimeMediaType.XMLUTF8); StringWriter out = new StringWriter(); doc.sendToWriter(out); System.out.println(out.toString()); FileOutputStream fp = new FileOutputStream("route1.adv"); fp.write(out.toString().getBytes()); fp.close(); out.close(); FileInputStream is = new FileInputStream("route1.adv"); XMLDocument advDocument = (XMLDocument) StructuredDocumentFactory.newStructuredDocument( MimeMediaType.XMLUTF8, is); RouteAdvertisement routeAdv = (RouteAdvertisement) AdvertisementFactory.newAdvertisement(advDocument); is.close(); doc = (StructuredTextDocument) routeAdv.getDocument(MimeMediaType.XMLUTF8); System.out.println("RouteAdvertisement reconstructed from file"); out = new StringWriter(); doc.sendToWriter(out); System.out.println(out.toString()); out.close(); // verify advertisement ap = route1.getDest(); ap1 = routeAdv.getDest(); assertEquals(ap.getPeerID(), ap1.getPeerID()); Enumeration e1 = ap1.getEndpointAddresses(); for (Enumeration e = ap.getEndpointAddresses(); e.hasMoreElements();) { assertEquals(e.nextElement(), e1.nextElement()); } Enumeration r1 = routeAdv.getHops(); for (Enumeration e = routeAdv.getHops(); e.hasMoreElements();) { ap = (AccessPointAdvertisement) e.nextElement(); ap1 = (AccessPointAdvertisement) r1.nextElement(); assertEquals(ap.getPeerID(), ap1.getPeerID()); e1 = ap1.getEndpointAddresses(); for (Enumeration e2 = ap.getEndpointAddresses(); e2.hasMoreElements();) { assertEquals(e2.nextElement(), e1.nextElement()); } } } catch (Exception ex) { ex.printStackTrace(); fail("Error constructing advertisement"); } } public void testAddDestRoute() { // create access point advertisment for destination System.out.println("Test add and remove of endpoint addresses"); AccessPointAdvertisement ap = (AccessPointAdvertisement) AdvertisementFactory.newAdvertisement(AccessPointAdvertisement.getAdvertisementType()); ap.setPeerID(IDFactory.newPeerID(IDFactory.newPeerGroupID())); Vector addresses = new Vector(); addresses.add("TCP://123.123.123.123"); addresses.add("TCP://134.134.134.134"); ap.setEndpointAddresses(addresses); // create the route RouteAdvertisement route = (RouteAdvertisement) AdvertisementFactory.newAdvertisement(RouteAdvertisement.getAdvertisementType()); route.setDest(ap); // add new addresses to the destination List<EndpointAddress> newaddresses = new ArrayList<EndpointAddress>(); newaddresses.add(new EndpointAddress("TCP://222.123.123.123")); newaddresses.add(new EndpointAddress("TCP://222.134.134.134")); route.addDestEndpointAddresses(newaddresses); addresses.add("TCP://222.123.123.123"); addresses.add("TCP://222.134.134.134"); // verify advertisement Enumeration e1 = Collections.enumeration(addresses); for (Enumeration e = route.getDest().getEndpointAddresses(); e.hasMoreElements();) { assertEquals(e.nextElement().toString(), e1.nextElement().toString()); } // test to remove access point route.removeDestEndpointAddresses(newaddresses); addresses.remove("TCP://222.123.123.123"); addresses.remove("TCP://222.134.134.134"); // verify advertisement e1 = Collections.enumeration(addresses); for (Enumeration e = route.getDest().getEndpointAddresses(); e.hasMoreElements();) { assertEquals(e.nextElement().toString(), e1.nextElement().toString()); } } public void testDestDisplay() { // create access point advertisment for destination System.out.println("Test debug route display"); AccessPointAdvertisement ap = (AccessPointAdvertisement) AdvertisementFactory.newAdvertisement(AccessPointAdvertisement.getAdvertisementType()); ap.setPeerID(IDFactory.newPeerID(IDFactory.newPeerGroupID())); Vector addresses = new Vector(); addresses.add("TCP:123.123.123.123"); addresses.add("TCP:134.134.134.134"); ap.setEndpointAddresses(addresses); // create the route RouteAdvertisement route = (RouteAdvertisement) AdvertisementFactory.newAdvertisement(RouteAdvertisement.getAdvertisementType()); route.setDest(ap); AccessPointAdvertisement ap2 = (AccessPointAdvertisement) AdvertisementFactory.newAdvertisement(AccessPointAdvertisement.getAdvertisementType()); ap2.setPeerID(IDFactory.newPeerID(IDFactory.newPeerGroupID())); addresses = new Vector(); addresses.add("TCP:666.666.666.666"); addresses.add("TCP:777.777.777.777"); ap2.setEndpointAddresses(addresses); AccessPointAdvertisement ap4 = (AccessPointAdvertisement) AdvertisementFactory.newAdvertisement(AccessPointAdvertisement.getAdvertisementType()); ap4.setPeerID(IDFactory.newPeerID(IDFactory.newPeerGroupID())); addresses = new Vector(); addresses.add("TCP:888.888.888.888"); addresses.add("TCP:999.999.999.999"); ap4.setEndpointAddresses(addresses); Vector hops = new Vector(); hops.add(ap2); hops.add(ap4); route.setHops(hops); route.setHops(hops); System.out.println(route.display()); } public void testHops() { System.out.println("Test hops"); AccessPointAdvertisement ap = (AccessPointAdvertisement) AdvertisementFactory.newAdvertisement(AccessPointAdvertisement.getAdvertisementType()); PeerID pid = IDFactory.newPeerID(IDFactory.newPeerGroupID()); ap.setPeerID(pid); // create the route RouteAdvertisement route = (RouteAdvertisement) AdvertisementFactory.newAdvertisement(RouteAdvertisement.getAdvertisementType()); route.setDest(ap); assertEquals(pid, route.getDestPeerID()); AccessPointAdvertisement ap2 = (AccessPointAdvertisement) AdvertisementFactory.newAdvertisement(AccessPointAdvertisement.getAdvertisementType()); ap2.setPeerID(IDFactory.newPeerID(IDFactory.newPeerGroupID())); AccessPointAdvertisement ap4 = (AccessPointAdvertisement) AdvertisementFactory.newAdvertisement(AccessPointAdvertisement.getAdvertisementType()); ap4.setPeerID(ap.getPeerID()); Vector hops = new Vector(); hops.add(ap2); hops.add(ap4); route.setHops(hops); assertEquals(true, route.containsHop(ap.getPeerID())); } public void testRouteQuery() { AccessPointAdvertisement ap = (AccessPointAdvertisement) AdvertisementFactory.newAdvertisement(AccessPointAdvertisement.getAdvertisementType()); ap.setPeerID(IDFactory.newPeerID(IDFactory.newPeerGroupID())); Vector addresses = new Vector(); addresses.add("TCP:123.123.123.123"); addresses.add("TCP:134.134.134.134"); ap.setEndpointAddresses(addresses); // create the route RouteAdvertisement route = (RouteAdvertisement) AdvertisementFactory.newAdvertisement(RouteAdvertisement.getAdvertisementType()); route.setDest(ap); AccessPointAdvertisement ap2 = (AccessPointAdvertisement) AdvertisementFactory.newAdvertisement(AccessPointAdvertisement.getAdvertisementType()); ap2.setPeerID(IDFactory.newPeerID(IDFactory.newPeerGroupID())); addresses = new Vector(); addresses.add("TCP:666.666.666.666"); addresses.add("TCP:777.777.777.777"); ap2.setEndpointAddresses(addresses); AccessPointAdvertisement ap4 = (AccessPointAdvertisement) AdvertisementFactory.newAdvertisement(AccessPointAdvertisement.getAdvertisementType()); ap4.setPeerID(IDFactory.newPeerID(IDFactory.newPeerGroupID())); addresses = new Vector(); addresses.add("TCP:888.888.888.888"); addresses.add("TCP:999.999.999.999"); ap4.setEndpointAddresses(addresses); Vector hops = new Vector(); hops.add(ap2); hops.add(ap4); route.setHops(hops); PeerID pid = IDFactory.newPeerID(IDFactory.newPeerGroupID()); Set badHops = new HashSet(); RouteQuery query = new RouteQuery(); query.setDestPeerID(pid); query.setSrcRoute(route); query.setBadHops(badHops); // write to a file try { ByteArrayOutputStream fp = new ByteArrayOutputStream(); fp.write(query.toString().getBytes()); fp.close(); Reader is = new InputStreamReader(new ByteArrayInputStream(fp.toByteArray())); RouteQuery query1 = null; XMLDocument doc = (XMLDocument) StructuredDocumentFactory.newStructuredDocument(MimeMediaType.XMLUTF8, is); query1 = new RouteQuery(doc); is.close(); assertEquals(query.getDestPeerID().toString(), query1.getDestPeerID().toString()); // verify advertisement ap = query.getSrcRoute().getDest(); AccessPointAdvertisement ap1 = query1.getSrcRoute().getDest(); assertEquals(ap.getPeerID(), ap1.getPeerID()); Enumeration e1 = ap1.getEndpointAddresses(); for (Enumeration e = ap.getEndpointAddresses(); e.hasMoreElements();) { assertEquals(e.nextElement(), e1.nextElement()); } Enumeration r1 = query.getSrcRoute().getHops(); for (Enumeration e = query1.getSrcRoute().getHops(); e.hasMoreElements();) { ap = (AccessPointAdvertisement) e.nextElement(); ap1 = (AccessPointAdvertisement) r1.nextElement(); assertEquals(ap.getPeerID(), ap1.getPeerID()); e1 = ap1.getEndpointAddresses(); for (Enumeration e2 = ap.getEndpointAddresses(); e2.hasMoreElements();) { assertEquals(e2.nextElement(), e1.nextElement()); } } System.out.println(query1.toString()); } catch (Exception ex) { ex.printStackTrace(); fail("Error constructing advertisement"); } } public void testRouteResponse() { AccessPointAdvertisement ap = (AccessPointAdvertisement) AdvertisementFactory.newAdvertisement(AccessPointAdvertisement.getAdvertisementType()); ap.setPeerID(IDFactory.newPeerID(IDFactory.newPeerGroupID())); Vector addresses = new Vector(); addresses.add("TCP:123.123.123.123"); addresses.add("TCP:134.134.134.134"); ap.setEndpointAddresses(addresses); // create the route RouteAdvertisement route = (RouteAdvertisement) AdvertisementFactory.newAdvertisement(RouteAdvertisement.getAdvertisementType()); route.setDest(ap); AccessPointAdvertisement ap2 = (AccessPointAdvertisement) AdvertisementFactory.newAdvertisement(AccessPointAdvertisement.getAdvertisementType()); ap2.setPeerID(IDFactory.newPeerID(IDFactory.newPeerGroupID())); addresses = new Vector(); addresses.add("TCP:666.666.666.666"); addresses.add("TCP:777.777.777.777"); ap2.setEndpointAddresses(addresses); AccessPointAdvertisement ap4 = (AccessPointAdvertisement) AdvertisementFactory.newAdvertisement(AccessPointAdvertisement.getAdvertisementType()); ap4.setPeerID(IDFactory.newPeerID(IDFactory.newPeerGroupID())); addresses = new Vector(); addresses.add("TCP:888.888.888.888"); addresses.add("TCP:999.999.999.999"); ap4.setEndpointAddresses(addresses); Vector hops = new Vector(); hops.add(ap2); hops.add(ap4); route.setHops(hops); AccessPointAdvertisement apDst = (AccessPointAdvertisement) AdvertisementFactory.newAdvertisement(AccessPointAdvertisement.getAdvertisementType()); apDst.setPeerID(IDFactory.newPeerID(IDFactory.newPeerGroupID())); addresses = new Vector(); addresses.add("TCP:234.234.234.234"); addresses.add("TCP:256.256.278.256"); apDst.setEndpointAddresses(addresses); // create the route RouteAdvertisement routeDst = (RouteAdvertisement) AdvertisementFactory.newAdvertisement(RouteAdvertisement.getAdvertisementType()); routeDst.setDest(apDst); AccessPointAdvertisement ap2Dst = (AccessPointAdvertisement) AdvertisementFactory.newAdvertisement(AccessPointAdvertisement.getAdvertisementType()); ap2Dst.setPeerID(IDFactory.newPeerID(IDFactory.newPeerGroupID())); addresses = new Vector(); addresses.add("TCP:166.166.166.166"); addresses.add("TCP:277.277.277.277"); ap2Dst.setEndpointAddresses(addresses); AccessPointAdvertisement ap4Dst = (AccessPointAdvertisement) AdvertisementFactory.newAdvertisement(AccessPointAdvertisement.getAdvertisementType()); ap4Dst.setPeerID(IDFactory.newPeerID(IDFactory.newPeerGroupID())); addresses = new Vector(); addresses.add("TCP:188.188.818.818"); addresses.add("TCP:929.929.929.929"); ap4Dst.setEndpointAddresses(addresses); Vector hopsDst = new Vector(); hopsDst.add(ap2Dst); hopsDst.add(ap4Dst); routeDst.setHops(hopsDst); RouteResponse response = new RouteResponse(); response.setDestRoute(routeDst); response.setSrcRoute(route); // write to a file try { FileOutputStream fp = new FileOutputStream("routeresponse.msg"); fp.write(response.toString().getBytes("UTF-8")); fp.close(); FileInputStream is = new FileInputStream("routeresponse.msg"); RouteResponse response1 = null; XMLDocument asDoc = (XMLDocument) StructuredDocumentFactory.newStructuredDocument(MimeMediaType.XMLUTF8, is); is.close(); response1 = new RouteResponse(asDoc); // verify advertisement ap = response.getSrcRoute().getDest(); AccessPointAdvertisement ap1 = response1.getSrcRoute().getDest(); assertEquals(ap.getPeerID(), ap1.getPeerID()); Enumeration e1 = ap1.getEndpointAddresses(); for (Enumeration e = ap.getEndpointAddresses(); e.hasMoreElements();) { assertEquals(e.nextElement(), e1.nextElement()); } Enumeration r1 = response.getSrcRoute().getHops(); for (Enumeration e = response.getSrcRoute().getHops(); e.hasMoreElements();) { ap = (AccessPointAdvertisement) e.nextElement(); ap1 = (AccessPointAdvertisement) r1.nextElement(); assertEquals(ap.getPeerID(), ap1.getPeerID()); e1 = ap1.getEndpointAddresses(); for (Enumeration e2 = ap.getEndpointAddresses(); e2.hasMoreElements();) { assertEquals(e2.nextElement(), e1.nextElement()); } } ap = response.getDestRoute().getDest(); ap1 = response1.getDestRoute().getDest(); assertEquals(ap.getPeerID(), ap1.getPeerID()); e1 = ap1.getEndpointAddresses(); for (Enumeration e = ap.getEndpointAddresses(); e.hasMoreElements();) { assertEquals(e.nextElement(), e1.nextElement()); } r1 = response.getDestRoute().getHops(); for (Enumeration e = response.getDestRoute().getHops(); e.hasMoreElements();) { ap = (AccessPointAdvertisement) e.nextElement(); ap1 = (AccessPointAdvertisement) r1.nextElement(); assertEquals(ap.getPeerID(), ap1.getPeerID()); e1 = ap1.getEndpointAddresses(); for (Enumeration e2 = ap.getEndpointAddresses(); e2.hasMoreElements();) { assertEquals(e2.nextElement(), e1.nextElement()); } } System.out.println(response1.toString()); } catch (Exception ex) { ex.printStackTrace(); fail("Error constructing advertisement"); } } }