1 /**
2 *
3 */
4 package org.xmlBlaster.test.client;
5
6 import java.util.logging.Logger;
7
8 import junit.framework.TestCase;
9
10 import org.xmlBlaster.client.I_Callback;
11 import org.xmlBlaster.client.I_XmlBlasterAccess;
12 import org.xmlBlaster.client.key.PublishKey;
13 import org.xmlBlaster.client.key.UpdateKey;
14 import org.xmlBlaster.client.qos.ConnectQos;
15 import org.xmlBlaster.client.qos.ConnectReturnQos;
16 import org.xmlBlaster.client.qos.DisconnectQos;
17 import org.xmlBlaster.client.qos.PublishQos;
18 import org.xmlBlaster.client.qos.PublishReturnQos;
19 import org.xmlBlaster.client.qos.UpdateQos;
20 import org.xmlBlaster.test.Util;
21 import org.xmlBlaster.util.EmbeddedXmlBlaster;
22 import org.xmlBlaster.util.Global;
23 import org.xmlBlaster.util.MsgUnit;
24 import org.xmlBlaster.util.SessionName;
25 import org.xmlBlaster.util.XmlBlasterException;
26 import org.xmlBlaster.util.def.Constants;
27 import org.xmlBlaster.util.qos.address.Destination;
28
29 /**
30 * Testing XmlBlasterAccess.request() method.
31 * <br />
32 * We send a request and expect a response.
33 * @author Marcel Ruff
34 */
35 public class TestRequestResponse extends TestCase {
36 private static Logger log = Logger.getLogger(TestRequestResponse.class.getName());
37
38 private Global glob;
39 private EmbeddedXmlBlaster serverThread;
40 private int serverPort = 9583;
41 private boolean startEmbedded = true;
42
43 private I_XmlBlasterAccess sender = null;
44 private final String senderName = "TheDesperate";
45 private I_XmlBlasterAccess receiver = null;
46 private final String receiverName = "TheKnowing";
47
48 public void testRequestResponse() {
49 Global glob = Global.instance();
50
51 try {
52
53 { // setup the sender client ...
54 sender = glob.getXmlBlasterAccess();
55
56 ConnectQos qos = new ConnectQos(sender.getGlobal(), senderName, "secret");
57 ConnectReturnQos conRetQos = sender.connect(qos, null); // Login to xmlBlaster
58
59 log.info("Sender connected to xmlBlaster " + conRetQos.getSessionName().getRelativeName());
60 }
61
62
63 { // setup the receiver client which processes the request (usually another process) ...
64 Global globReceiver = glob.getClone(null);
65 receiver = globReceiver.getXmlBlasterAccess();
66
67 ConnectQos qos = new ConnectQos(receiver.getGlobal(), receiverName, "secret");
68 ConnectReturnQos conRetQos = receiver.connect(qos, new I_Callback() {
69 public String update(String cbSessionId, UpdateKey updateKey, byte[] content, UpdateQos updateQos) {
70 log.info(receiverName+": Receiving asynchronous message '" + updateKey.getOid() + "' in receiver default handler");
71 log.info(receiverName+": Received: " + updateKey.toXml() + "\n <content>" + new String(content) + "</content>" + updateQos.toXml());
72
73 if (updateKey.isInternal()) return "";
74 if (updateQos.isErased()) return "";
75 try {
76 String tempTopicOid = updateQos.getClientProperty(Constants.JMS_REPLY_TO, ""); // __jms:JMSReplyTo
77 log.info(receiverName+": Got request, using topic '" + tempTopicOid + "' for response");
78
79 // Send reply back ...
80 PublishKey pk = new PublishKey(receiver.getGlobal(), tempTopicOid, "text/plain", "1.0");
81 PublishQos pq = new PublishQos(receiver.getGlobal());
82 MsgUnit msgUnit = new MsgUnit(pk, "On doubt no ultimate truth, my dear.", pq);
83 //try { Thread.sleep(8000); } catch (InterruptedException e) { e.printStackTrace(); }
84 PublishReturnQos retQos = receiver.publish(msgUnit);
85 log.info(receiverName+": Published reply message using temporary topic " + retQos.getKeyOid());
86 }
87 catch (XmlBlasterException e) {
88 log.severe(receiverName+": Sending reply to " + updateQos.getSender() + " failed: " + e.getMessage());
89 }
90 return "";
91 }
92 }); // Login to xmlBlaster, default handler for updates
93
94 log.info("Receiver connected to xmlBlaster " + conRetQos.getSessionName().getRelativeName());
95 }
96
97 // Send a message to 'receiver' and block for the reply
98 PublishKey pk = new PublishKey(sender.getGlobal(), "requestForEnlightenment");
99 PublishQos pq = new PublishQos(sender.getGlobal());
100 pq.addDestination(new Destination(new SessionName(sender.getGlobal(), receiverName)));
101 MsgUnit msgUnit = new MsgUnit(pk, "Tell me the truth!", pq);
102 MsgUnit[] replies = sender.request(msgUnit, 3000, 1);
103 assertEquals("Missing reply message.", 1, replies.length);
104 assertEquals("On doubt no ultimate truth, my dear.", replies[0].getContentStr());
105 log.info(senderName+": Got " + replies.length + " reply :\n" + replies[0].toXml());
106 }
107 catch (XmlBlasterException e) {
108 fail("We have a problem: " + e.getMessage());
109 }
110 finally {
111 if (sender != null && sender.isConnected()) { sender.disconnect(new DisconnectQos(sender.getGlobal())); }
112 if (receiver != null && receiver.isConnected()) { receiver.disconnect(new DisconnectQos(receiver.getGlobal())); }
113 }
114 }
115
116 /**
117 * @param arg0
118 */
119 public TestRequestResponse(String arg0) {
120 super(arg0);
121 }
122
123 /* (non-Javadoc)
124 * @see junit.framework.TestCase#setUp()
125 */
126 protected void setUp() throws Exception {
127 super.setUp();
128 this.glob = Global.instance();
129 this.startEmbedded = this.glob.getProperty().get("startEmbedded", this.startEmbedded);
130 if (this.startEmbedded) {
131 glob.init(Util.getOtherServerPorts(serverPort));
132 String[] args = { };
133 glob.init(args);
134 this.serverThread = EmbeddedXmlBlaster.startXmlBlaster(glob);
135 log.info("XmlBlaster is ready for testing");
136 }
137
138 }
139
140 /* (non-Javadoc)
141 * @see junit.framework.TestCase#tearDown()
142 */
143 protected void tearDown() throws Exception {
144 super.tearDown();
145 if (this.startEmbedded) {
146 try { Thread.sleep(500L); } catch( InterruptedException i) {} // Wait some time
147 EmbeddedXmlBlaster.stopXmlBlaster(this.serverThread);
148 this.serverThread = null;
149 }
150
151 // reset to default server port (necessary if other tests follow in the same JVM).
152 Util.resetPorts();
153 }
154 }
syntax highlighted by Code2HTML, v. 0.9.1