1 /*------------------------------------------------------------------------------
2 Name: TestPersistence2.java
3 Project: xmlBlaster.org
4 Copyright: xmlBlaster.org, see xmlBlaster-LICENSE file
5 Comment: Testing persistent messages
6 ------------------------------------------------------------------------------*/
7 package org.xmlBlaster.test.persistence;
8
9 // 24/09/1 19:27 mAd@ktaland.com
10 //
11 // to test this code Alown :
12 // java \
13 // -cp lib/javarb.jar:lib/xmlBlaster.jar:lib/junit.jar:lib/testsuite.jar \
14 // junit.textui.TestRunner \
15 // org.xmlBlaster.test.persistence.TestPersistence2
16 //
17
18 import java.util.logging.Logger;
19 import java.util.logging.Level;
20
21 import org.xmlBlaster.util.FileLocator;
22 import org.xmlBlaster.util.Global;
23 import org.xmlBlaster.util.def.Constants;
24 import org.xmlBlaster.client.qos.ConnectQos;
25 import org.xmlBlaster.util.XmlBlasterException;
26 import org.xmlBlaster.client.qos.EraseReturnQos;
27 import org.xmlBlaster.client.I_XmlBlasterAccess;
28 import org.xmlBlaster.util.MsgUnit;
29
30 import org.xmlBlaster.util.EmbeddedXmlBlaster;
31
32 import org.xmlBlaster.test.Util;
33 import org.xmlBlaster.test.Msg;
34 import org.xmlBlaster.test.MsgInterceptor;
35 import junit.framework.*;
36
37
38 /**
39 * This client tests the persistence driver, the $lt;persistent> flag.
40 * <p>
41 * Invoke examples:<br />
42 * <pre>
43 * java junit.textui.TestRunner org.xmlBlaster.test.persistence.TestPersistence2
44 *
45 * java junit.swingui.TestRunner -noloading org.xmlBlaster.test.persistence.TestPersistence2
46 * </pre>
47 * @author mAd@ktaland.com
48 */
49 public class TestPersistence2 extends TestCase
50 {
51 private final static String ME = "TestPersistence2";
52 private final Global glob;
53 private static Logger log = Logger.getLogger(TestPersistence2.class.getName());
54
55 private final String senderName = "Gesa";
56 private final String senderPasswd = "secret";
57
58 private String publishOid = "HelloPersistent";
59 private I_XmlBlasterAccess senderConnection = null;
60 private String senderContent = "Some persistent content";
61
62 private EmbeddedXmlBlaster serverThread;
63 private int serverPort = 7604;
64
65 private MsgInterceptor updateInterceptor;
66
67 /**
68 * Constructs the TestPersistence2 object.
69 * <p />
70 * @param testName The name used in the test suite
71 * @param loginName The name to login to the xmlBlaster
72 */
73 public TestPersistence2(Global glob, String testName)
74 {
75 super(testName);
76 this.glob = glob;
77
78 }
79
80
81 /**
82 * Sets up the fixture.
83 * <p />
84 * Creates a CORBA connection and does a login.<br />
85 * - One connection for the sender client<br />
86 */
87 protected void setUp()
88 {
89 serverThread = EmbeddedXmlBlaster.startXmlBlaster(Util.getOtherServerPorts(serverPort));
90 log.info("XmlBlaster is ready for testing on bootstrapPort " + serverPort);
91
92 doLogin();
93 }
94
95 private void doLogin() {
96 try {
97 Global senderGlobal = Util.getOtherServerPorts(glob, serverPort);
98 this.senderConnection = senderGlobal.getXmlBlasterAccess();
99 ConnectQos qos = new ConnectQos(senderGlobal, senderName, senderPasswd);
100
101 this.updateInterceptor = new MsgInterceptor(senderGlobal, log, null);
102 this.senderConnection.connect(qos, this.updateInterceptor);
103 }
104 catch (XmlBlasterException e) {
105 log.warning("setUp() - login failed");
106 }
107 catch (Exception e) {
108 log.severe(e.toString());
109 e.printStackTrace();
110 }
111 }
112
113
114 /**
115 * Tears down the fixture.
116 * <p />
117 * cleaning up .... logout
118 */
119 protected void tearDown()
120 {
121 try { Thread.sleep(200L); } catch( InterruptedException i) {} // Wait 200 milli seconds, until all updates are processed ...
122
123 String xmlKey = "<key oid='" + publishOid + "' queryType='EXACT'>\n</key>";
124 String qos = "<qos></qos>";
125 try {
126 EraseReturnQos[] arr = this.senderConnection.erase(xmlKey, qos);
127 if (arr.length != 1) log.severe("Erased " + arr.length + " messages:");
128 } catch(XmlBlasterException e) { log.severe("XmlBlasterException: " + e.getMessage()); }
129 //checkContent(false);
130
131 this.senderConnection.disconnect(null);
132 this.senderConnection = null;
133
134 try { Thread.sleep(500L); } catch( InterruptedException i) {} // Wait some time
135 EmbeddedXmlBlaster.stopXmlBlaster(this.serverThread);
136 this.serverThread = null;
137 // reset to default server bootstrapPort (necessary if other tests follow in the same JVM).
138 Util.resetPorts();
139 }
140
141
142 /**
143 * Publish a persistent message.
144 * <p />
145 */
146 public void sendPersistent()
147 {
148 if (log.isLoggable(Level.FINE)) log.fine("Testing a persistent message ...");
149
150 String xmlKey = "<key oid='" + publishOid + "' contentMime='text/plain' contentMimeExtended='2.0' domain='RUGBY'/>";
151
152 String qos = "<qos>" +
153 " <persistent />" +
154 "</qos>";
155
156 try {
157 MsgUnit msgUnit = new MsgUnit(xmlKey, senderContent.getBytes(), qos);
158 String returnedOid = this.senderConnection.publish(msgUnit).getKeyOid();
159 assertEquals("Retunred oid is invalid", publishOid, returnedOid);
160 log.info("Sending of '" + senderContent + "' done, returned oid=" + publishOid);
161 } catch(XmlBlasterException e) {
162 log.severe("publish() XmlBlasterException: " + e.getMessage());
163 assertTrue("publish - XmlBlasterException: " + e.getMessage(), false);
164 }
165
166 assertEquals("numReceived after sending", 0, this.updateInterceptor.waitOnUpdate(1000L, publishOid, Constants.STATE_OK));
167 assertEquals("", 0, this.updateInterceptor.count());
168 }
169
170
171 /**
172 * TEST: Publish a persistent message.
173 * <p />
174 */
175 public void testPersistent()
176 {
177 sendPersistent();
178 checkContent(true);
179
180 senderContent = senderContent + " again";
181 sendPersistent();
182 RestartTestServer();
183
184 doLogin();
185
186 try {
187 this.senderConnection.subscribe("<key oid='" + publishOid + "'/>", "<qos/>");
188 log.info("Subscribe done");
189 } catch(XmlBlasterException e) {
190 log.severe("subscribe() XmlBlasterException: " + e.getMessage());
191 fail("subscribe - XmlBlasterException: " + e.getMessage());
192 }
193
194 assertEquals("", 1, this.updateInterceptor.waitOnUpdate(2000L, publishOid, Constants.STATE_OK));
195 //this.updateInterceptor.compareToReceived(sentArr, null);
196 //this.updateInterceptor.compareToReceived(sentQos);
197
198 Msg msg = this.updateInterceptor.getMsgs()[0];
199
200 assertEquals("Wrong sender", senderName, msg.getUpdateQos().getSender().getLoginName());
201 assertEquals("Wrong oid of message returned", publishOid, msg.getUpdateKey().getOid());
202 assertEquals("Wrong mime of message returned", "text/plain", msg.getUpdateKey().getContentMime());
203 assertEquals("Wrong extended mime of message returned", "2.0", msg.getUpdateKey().getContentMimeExtended());
204 assertEquals("Wrong domain of message returned", "RUGBY", msg.getUpdateKey().getDomain());
205 assertEquals("Message content is corrupted", new String(senderContent), msg.getContentStr());
206
207 this.updateInterceptor.clear();
208 //checkContent(true);
209 }
210
211 /**
212 * a dirty hack to restart the Test Server between send and checkcontent.
213 * - disconnect(null)
214 * - stopXmlBlaster()
215 * - delay()
216 * - startXmlBlaster()
217 * - delay()
218 * - login()
219 * <p />
220 */
221 public void RestartTestServer() {
222 long delay4Server = 4000L ;
223 log.info("Restarting Test Server" );
224
225 try {
226 this.senderConnection.disconnect(null);
227 EmbeddedXmlBlaster.stopXmlBlaster(serverThread);
228 serverThread = null ;
229 Util.delay( delay4Server ); // Wait some time
230
231 serverThread = EmbeddedXmlBlaster.startXmlBlaster(Util.getOtherServerPorts(serverPort));
232 Util.delay( delay4Server ); // Wait some time
233
234 Global globSender = Util.getOtherServerPorts(glob, serverPort);
235 this.senderConnection = globSender.getXmlBlasterAccess(); // Find orb
236 ConnectQos qos = new ConnectQos(globSender, senderName, senderPasswd);
237 this.updateInterceptor = new MsgInterceptor(globSender, log, null);
238 this.senderConnection.connect(qos, this.updateInterceptor);
239 }
240 catch (XmlBlasterException e) {
241 log.warning("setUp() - login failed");
242 }
243 catch (Exception e) {
244 log.severe(e.toString());
245 e.printStackTrace();
246 }
247 }
248
249 /**
250 * If the FileDriver is used, check if the correct content is written.
251 * @deprecated FileDriver is deprecated
252 */
253 void checkContent(boolean checkContent)
254 {
255 String driverType = glob.getProperty().get("Persistence.Driver.Type", (String)null);
256 if (driverType == null || !driverType.equals("filestore")) {
257 log.info("Sorry, can't check persistence store, only checks for FileDriver is implemented");
258 return;
259 }
260
261 String path = glob.getProperty().get("Persistence.Path", (String)null);
262 if (path == null) {
263 log.info("Sorry, xmlBlaster is running memory based only, no checks possible");
264 return;
265 }
266
267 if (checkContent) {
268
269 log.info("Checking content of message " + publishOid);
270
271 try {
272 String persistenceContent = FileLocator.readAsciiFile(path, publishOid);
273 assertEquals("Written content is corrupted", senderContent, persistenceContent);
274 }
275 catch (Exception e) {
276 assertTrue("Couldn't read file " + FileLocator.concatPath(path, publishOid), false);
277 }
278 }
279 else { // Check if erased
280 java.io.File f = new java.io.File(path, publishOid);
281 if (f.exists())
282 assertTrue("File " + FileLocator.concatPath(path, publishOid) + " is not erased properly", false);
283 }
284 }
285
286 /**
287 * Method is used by TestRunner to load these tests
288 */
289 public static Test suite()
290 {
291 TestSuite suite= new TestSuite();
292 suite.addTest(new TestPersistence2(new Global(), "testPersistent"));
293 return suite;
294 }
295
296 /**
297 * Invoke: java org.xmlBlaster.test.persistence.TestPersistence2
298 * @deprecated Use the TestRunner from the testsuite to run it:<p />
299 * <pre> java -Djava.compiler= junit.textui.TestRunner org.xmlBlaster.test.persistence.TestPersistence2</pre>
300 */
301 public static void main(String args[])
302 {
303 Global glob = new Global();
304 if (glob.init(args) != 0) {
305 System.err.println(ME + ": Init failed");
306 System.exit(1);
307 }
308 TestPersistence2 testSub = new TestPersistence2(glob, "TestPersistence2");
309 testSub.setUp();
310 testSub.testPersistent();
311 testSub.tearDown();
312 }
313 }
syntax highlighted by Code2HTML, v. 0.9.1