1 /*------------------------------------------------------------------------------
  2 Name:      TestPtSession.java
  3 Project:   xmlBlaster.org
  4 Copyright: xmlBlaster.org, see xmlBlaster-LICENSE file
  5 ------------------------------------------------------------------------------*/
  6 package org.xmlBlaster.test.qos;
  7 
  8 import java.util.logging.Logger;
  9 import org.xmlBlaster.util.Global;
 10 import org.xmlBlaster.util.XmlBlasterException;
 11 import org.xmlBlaster.util.SessionName;
 12 import org.xmlBlaster.client.qos.ConnectQos;
 13 import org.xmlBlaster.client.qos.ConnectReturnQos;
 14 import org.xmlBlaster.client.I_XmlBlasterAccess;
 15 import org.xmlBlaster.client.qos.PublishQos;
 16 import org.xmlBlaster.client.qos.PublishReturnQos;
 17 import org.xmlBlaster.util.MsgUnit;
 18 import org.xmlBlaster.util.def.Constants;
 19 import org.xmlBlaster.util.qos.address.Destination;
 20 import org.xmlBlaster.util.EmbeddedXmlBlaster;
 21 import org.xmlBlaster.test.Util;
 22 import org.xmlBlaster.test.MsgInterceptor;
 23 
 24 import junit.framework.*;
 25 
 26 
 27 /**
 28  * This client tests the
 29  * engine.qos.publish.destination.PtPa href="http://www.xmlblaster.org/xmlBlaster/doc/requirements/engine.qos.publish.destination.PtP.html">engine.qos.publish.destination.PtP requirement</a>
 30  * <p />
 31  * We login as a publisher for PtP messages and many receivers.
 32  * Depending on the destination name a message is sent to all sessions or
 33  * only to specified sessions of the same user.
 34  * <p />
 35  * We start our own xmlBlaster server in a thread.
 36  * This client may be invoked multiple time on the same xmlBlaster server,
 37  * as it cleans up everything after his tests are done.
 38  * <p>
 39  * Invoke examples:<br />
 40  * <pre>
 41  *    java junit.textui.TestRunner -noloading org.xmlBlaster.test.qos.TestPtSession
 42  *    java junit.swingui.TestRunner -noloading org.xmlBlaster.test.qos.TestPtSession
 43  * </pre>
 44  */
 45 public class TestPtSession extends TestCase {
 46    private Global glob;
 47    private static Logger log = Logger.getLogger(TestPtSession.class.getName());
 48 
 49    class ConHolder {
 50       public I_XmlBlasterAccess con;
 51       public MsgInterceptor update;
 52       public ConnectReturnQos connectReturnQos;
 53    };
 54 
 55    private int numCons = 5;
 56    private ConHolder[] conHolderArr;
 57 
 58    private String name;
 59    private String passwd = "secret";
 60    private EmbeddedXmlBlaster serverThread;
 61    private int serverPort = 9560;
 62    private boolean startEmbedded = true;
 63 
 64    private final String msgOid = "ptpTestMessage";
 65 
 66    private int msgSequenceNumber = 0;
 67 
 68    /**
 69     * Constructs the TestPtSession object.
 70     * <p />
 71     * @param testName   The name used in the test suite
 72     * @param name       The name to login to the xmlBlaster
 73     */
 74    public TestPtSession(Global glob, String testName, String name) {
 75       super(testName);
 76       this.glob = glob;
 77 
 78       this.name = name;
 79    }
 80 
 81    /**
 82     * Sets up the fixture.
 83     * <p />
 84     * We start an own xmlBlaster server in a separate thread.
 85     * <p />
 86     * Then we connect our 5 clients
 87     */
 88    protected void setUp() {  
 89       this.startEmbedded = glob.getProperty().get("startEmbedded", this.startEmbedded);
 90 
 91       if (this.startEmbedded) {
 92          glob.init(Util.getOtherServerPorts(serverPort));
 93          String[] args = {};
 94          glob.init(args);
 95 
 96          serverThread = EmbeddedXmlBlaster.startXmlBlaster(glob);
 97          log.info("XmlBlaster is ready for testing the session PtP messages");
 98       }
 99       else
100          log.warning("You need to start an external xmlBlaster server for this test or use option -startEmbedded true");
101 
102       this.conHolderArr = new ConHolder[numCons];
103 
104       for(int ii=0; ii<conHolderArr.length; ii++) {
105          this.conHolderArr[ii] = new ConHolder();
106          try {
107             log.info("Connecting ...");
108             Global globTmp = glob.getClone(null);
109             this.conHolderArr[ii].con = globTmp.getXmlBlasterAccess();
110             ConnectQos qos = new ConnectQos(globTmp, name, passwd);
111             this.conHolderArr[ii].update = new MsgInterceptor(globTmp, log, null);
112             this.conHolderArr[ii].connectReturnQos = this.conHolderArr[ii].con.connect(qos, this.conHolderArr[ii].update);
113          }
114          catch (Exception e) {
115             Thread.dumpStack();
116             log.severe("Can't connect to xmlBlaster: " + e.toString());
117             fail("Can't connect to xmlBlaster: " + e.toString());
118          }
119       }
120 
121       for(int ii=0; ii<conHolderArr.length; ii++) {
122          this.conHolderArr[ii].update.clear();
123       }
124    }
125 
126    private void publish(ConHolder conHolder, String oid, SessionName[] sessionNameArr) {
127       try {
128          msgSequenceNumber++;
129          String content = "" + msgSequenceNumber;
130          
131          PublishQos pq = new PublishQos(glob);
132          for(int i=0; i<sessionNameArr.length; i++)
133             pq.addDestination(new Destination(sessionNameArr[i]));
134          
135          MsgUnit msgUnit = new MsgUnit("<key oid='"+oid+"'/>", content.getBytes(), pq.toXml());
136 
137          PublishReturnQos rq = conHolder.con.publish(msgUnit);
138          
139          log.info("SUCCESS publish '" + oid + "' with " + sessionNameArr.length + " destinations, returned state=" + rq.getState());
140          assertEquals("Returned oid wrong", oid, rq.getKeyOid());
141          assertEquals("Return not OK", Constants.STATE_OK, rq.getState());
142       } catch(XmlBlasterException e) {
143          log.warning("XmlBlasterException: " + e.getMessage());
144          fail("publish - XmlBlasterException: " + e.getMessage());
145       }
146    }
147 
148    /**
149     * Test all tuples of possibilities
150     */
151    public void testPtSession() {
152       log.info("testPtSession() ...");
153       long sleep = 1000L;
154 
155       {
156          log.info("TEST #1: Sending PtP message to all sessions of client " + name);
157          SessionName[] sessionNameArr = { new SessionName(glob, name) };
158          publish(this.conHolderArr[0], this.msgOid, sessionNameArr);
159          for(int ii=0; ii<this.conHolderArr.length; ii++) {
160             assertEquals("", 1, this.conHolderArr[ii].update.waitOnUpdate(sleep, msgOid, Constants.STATE_OK));
161             this.conHolderArr[ii].update.clear();
162          }
163       }
164 
165       {
166          SessionName sessionName3 = this.conHolderArr[3].connectReturnQos.getSessionName();
167          log.info("TEST #2: Sending PtP message to session " + sessionName3.getAbsoluteName());
168          SessionName[] sessionNameArr = { sessionName3 };
169          publish(this.conHolderArr[0], this.msgOid, sessionNameArr);
170          for(int ii=0; ii<this.conHolderArr.length; ii++) {
171             int numExpected = (ii==3) ? 1 : 0;
172             assertEquals("ii="+ii, numExpected, this.conHolderArr[ii].update.waitOnUpdate(sleep, msgOid, Constants.STATE_OK));
173             this.conHolderArr[ii].update.clear();
174          }
175       }
176 
177       {
178          SessionName sessionName1 = this.conHolderArr[1].connectReturnQos.getSessionName();
179          SessionName sessionName3 = this.conHolderArr[3].connectReturnQos.getSessionName();
180          log.info("TEST #3: Sending PtP message to session " + sessionName3.getAbsoluteName() + " and " + sessionName1.getAbsoluteName());
181          SessionName[] sessionNameArr = { sessionName3, sessionName1 };
182          publish(this.conHolderArr[0], this.msgOid, sessionNameArr);
183          for(int ii=0; ii<this.conHolderArr.length; ii++) {
184             int numExpected = (ii==1 || ii==3) ? 1 : 0;
185             assertEquals("ii="+ii, numExpected, this.conHolderArr[ii].update.waitOnUpdate(sleep, msgOid, Constants.STATE_OK));
186             this.conHolderArr[ii].update.clear();
187          }
188       }
189 
190       log.info("Success in testPtSession()");
191    }
192 
193    /**
194     * Tears down the fixture.
195     * <p />
196     * cleaning up .... erase() the previous message OID and logout
197     */
198    protected void tearDown() {
199       for(int ii=0; ii<conHolderArr.length; ii++) {
200          conHolderArr[ii].con.disconnect(null);
201       }
202       this.conHolderArr = null;
203 
204       if (this.startEmbedded) {
205          EmbeddedXmlBlaster.stopXmlBlaster(this.serverThread);
206          this.serverThread = null;
207 
208          // reset to default server port (necessary if other tests follow in the same JVM).
209          Util.resetPorts();
210 
211          this.serverThread = null;
212       }
213 
214       log.severe("DEBUG ONLY: tearDown() all resources released");
215       this.glob = null;
216      
217       Global.instance().shutdown();
218    }
219 
220    /**
221     * Method is used by TestRunner to load these tests
222     */
223    public static Test suite() {
224        TestSuite suite= new TestSuite();
225        suite.addTest(new TestPtSession(Global.instance(), "testPtSession", "PtSession"));
226        return suite;
227    }
228 
229    /**
230     * Invoke: 
231     * <pre>
232     *  java org.xmlBlaster.test.qos.TestPtSession  -logging/org.xmlBlaster.client.qos FINE -logging/org.xmlBlaster.util.qos FINE -logging/org.xmlBlaster.engine FINEST -startEmbedded false
233     *  java -Djava.compiler= junit.textui.TestRunner -noloading org.xmlBlaster.test.qos.TestPtSession
234     * <pre>
235     */
236    public static void main(String args[]) {
237       Global glob = new Global();
238       if (glob.init(args) != 0) {
239          System.exit(0);
240       }
241       TestPtSession testSub = new TestPtSession(glob, "TestPtSession", "TestPtSession");
242       testSub.setUp();
243       testSub.testPtSession();
244       testSub.tearDown();
245    }
246 }


syntax highlighted by Code2HTML, v. 0.9.1