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