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