blob: 96f077d265007817a73c4b3c3dbcffda3b7a8e9b [file] [log] [blame]
/*
* Copyright (c) 2002, 2020 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/
package com.sun.s1asdev.ejb.mdb.msgbean.client;
import javax.naming.*;
import jakarta.jms.*;
import com.sun.ejte.ccl.reporter.SimpleReporterAdapter;
public class HelloClient {
private static SimpleReporterAdapter stat =
new SimpleReporterAdapter("appserv-tests");
// in milli-seconds
private static long TIMEOUT = 90000;
private String[] args;
public static void main (String[] args) {
HelloClient client = new HelloClient(args);
stat.addDescription("ejb-mdb-msgbean");
client.doTest();
stat.printSummary("ejb-mdb-msgbeanID");
int exitCode = 0;
System.exit(exitCode);
}
private InitialContext context;
private QueueConnection queueCon;
private QueueSession queueSession;
private QueueSender queueSender;
private QueueReceiver queueReceiver;
private jakarta.jms.Queue clientQueue;
private TopicConnection topicCon;
private TopicSession topicSession;
private TopicPublisher topicPublisher;
private TopicSubscriber topicSubscriber;
private Topic clientTopic;
public HelloClient(String[] theArgs) {
this.args = theArgs;
if( this.args.length == 0 ) {
this.args = new String[] { "all", "5" };
}
}
private static Boolean BFALSE = new Boolean(false);
private static Boolean BTRUE = new Boolean(true);
Object[][] userSpecifiedTxTest = { {"", // destname
BFALSE, // reply
BFALSE, // jdbc
BFALSE } }; // rollback
Object[][] onePhaseCommitTests = {
{ "jms/queue_cmt", BFALSE, BFALSE, BFALSE },
{ "jms/topic_cmt", BFALSE, BFALSE, BFALSE },
{ "jms/queue_bmt", BTRUE, BFALSE, BFALSE },
{ "jms/topic_bmt", BTRUE, BFALSE, BFALSE },
{ "jms/queue_bmt", BFALSE, BTRUE, BFALSE },
{ "jms/topic_bmt", BFALSE, BTRUE, BFALSE },
};
Object[][] twoPhaseCommitTests = {
{ "jms/queue_cmt", BFALSE, BTRUE, BFALSE },
{ "jms/topic_cmt", BFALSE, BTRUE, BFALSE },
{ "jms/queue_cmt", BTRUE, BFALSE, BFALSE },
{ "jms/topic_cmt", BTRUE, BFALSE, BFALSE },
{ "jms/queue_bmt", BTRUE, BTRUE, BFALSE },
{ "jms/topic_bmt", BTRUE, BTRUE, BFALSE },
{ "jms/queue_cmt", BTRUE, BTRUE, BFALSE },
{ "jms/topic_cmt", BTRUE, BTRUE, BFALSE },
};
Object[][] rollbackTests = {
{ "jms/queue_cmt", BTRUE, BFALSE, BTRUE },
{ "jms/topic_cmt", BTRUE, BFALSE, BTRUE },
{ "jms/queue_cmt", BTRUE, BTRUE, BTRUE },
{ "jms/topic_cmt", BTRUE, BTRUE, BTRUE },
{ "jms/queue_cmt", BFALSE, BFALSE, BTRUE },
{ "jms/topic_cmt", BFALSE, BFALSE, BTRUE },
{ "jms/queue_cmt", BTRUE, BFALSE, BTRUE },
{ "jms/topic_cmt", BTRUE, BFALSE, BTRUE },
};
Object[][] localTxTests = {
{ "jms/queue_cmtns", BFALSE, BFALSE, BFALSE },
{ "jms/queue_cmtns", BFALSE, BTRUE, BFALSE },
{ "jms/queue_cmtns", BTRUE, BFALSE, BFALSE },
{ "jms/queue_cmtns", BTRUE, BTRUE, BFALSE }
};
public void doTest() {
int numIter = 10;
if(args.length == 0 || (args.length > 0 &&
args[0].equals("1pc" )) ) {
System.out.println("Running 1 phase commit msgbean tests");
numIter = (args.length >= 2) ?
Integer.parseInt(args[1]) : numIter;
doTests(onePhaseCommitTests, numIter);
} else if( args[0].equals("2pc") ) {
System.out.println("Running 2 phase commit msgbean tests");
numIter = Integer.parseInt(args[1]);
doTests(twoPhaseCommitTests, numIter);
} else if( args[0].equals("localtx") ) {
System.out.println("Running localtx msgbean tests");
numIter = Integer.parseInt(args[1]);
doTests(localTxTests, numIter);
} else if( args[0].equals("rollback") ) {
System.out.println("Running rollback msgbean tests");
numIter = Integer.parseInt(args[1]);
doTests(rollbackTests, numIter);
} else if( args[0].equals("all") ) {
System.out.println("Running all msgbean tests");
numIter = Integer.parseInt(args[1]);
doTests(onePhaseCommitTests, numIter);
doTests(twoPhaseCommitTests, numIter);
doTests(localTxTests, numIter);
doTests(rollbackTests, numIter);
} else {
userSpecifiedTxTest[0][0] = args[0];
numIter = Integer.parseInt(args[1]);
System.out.println("Running " + userSpecifiedTxTest[0][0]);
System.out.println("Num iterations = " + numIter);
if( args.length == 3 ) {
userSpecifiedTxTest[0][1] =
new Boolean(args[2].indexOf("reply") != -1);
userSpecifiedTxTest[0][2] =
new Boolean((args[2].indexOf("jdbc") != -1));
userSpecifiedTxTest[0][3] =
new Boolean((args[2].indexOf("rollback") != -1));
}
doTests(userSpecifiedTxTest, numIter);
}
return;
}
private void doTests(Object[][] tests, int numIter) {
if (numIter > 20) {
TIMEOUT = TIMEOUT * (int)(numIter / 10);
}
for(int i = 0; i < tests.length; i++) {
String destName = "java:comp/env/" + (String) tests[i][0];
boolean expectReply = ((Boolean)tests[i][1]).booleanValue();
boolean jdbc = ((Boolean)tests[i][2]).booleanValue();
boolean rollback = ((Boolean)tests[i][3]).booleanValue();
String test = "msgbean " + generateTestName(destName,jdbc,
expectReply, rollback);
try {
setup();
doTest(destName, numIter, expectReply, jdbc, rollback);
stat.addStatus(test, stat.PASS);
} catch(Throwable t) {
System.out.println("Caught unexpected exception " + t);
t.printStackTrace();
stat.addStatus(test, stat.FAIL);
break;
} finally {
cleanup();
}
}
return;
}
public void setup() throws Exception {
context = new InitialContext();
QueueConnectionFactory queueConFactory =
(QueueConnectionFactory) context.lookup
("java:comp/env/jms/QCF");
queueCon = queueConFactory.createQueueConnection();
queueSession = queueCon.createQueueSession
(false, Session.AUTO_ACKNOWLEDGE);
// Producer will be specified when actual msg is sent.
queueSender = queueSession.createSender(null);
clientQueue = (jakarta.jms.Queue)
context.lookup("java:comp/env/jms/client_queue");
queueReceiver = queueSession.createReceiver(clientQueue);
TopicConnectionFactory topicConFactory =
(TopicConnectionFactory) context.lookup
("java:comp/env/jms/TCF");
topicCon = topicConFactory.createTopicConnection();
topicSession =
topicCon.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
// Producer will be specified when actual msg is published.
topicPublisher = topicSession.createPublisher(null);
clientTopic = (Topic)
context.lookup("java:comp/env/jms/client_topic");
topicSubscriber = topicSession.createSubscriber(clientTopic);
queueCon.start();
topicCon.start();
}
public void cleanup() {
try {
if( queueCon != null ) {
queueCon.close();
}
} catch(Throwable t) {
t.printStackTrace();
}
try {
if( topicCon != null ) {
topicCon.close();
}
} catch(Throwable t) {
t.printStackTrace();
}
}
public void sendMsgs(jakarta.jms.Queue queue, Message msg, int num)
throws JMSException {
for(int i = 0; i < num; i++) {
System.out.println("Sending message " + i + " to " + queue);
queueSender.send(queue, msg);
}
}
public void publishMsgs(Topic topic, Message msg, int num)
throws JMSException {
for(int i = 0; i < num; i++) {
System.out.println("Publishing message " + i + " to " + topic);
topicPublisher.publish(topic, msg);
}
}
public void recvQueueMsgs(int num) throws JMSException {
for(int i = 0; i < num; i++) {
System.out.println("Waiting for queue message " + (i+1) + " of " + num);
Message recvdmessage = queueReceiver.receive(TIMEOUT);
if( recvdmessage != null ) {
System.out.println("Received message : " +
((TextMessage)recvdmessage).getText());
} else {
System.out.println("timeout after " + TIMEOUT + " seconds");
throw new JMSException("timeout" + TIMEOUT + " seconds");
}
}
}
public void recvTopicMsgs(int num) throws JMSException {
for(int i = 0; i < num; i++) {
System.out.println("Waiting for topic message " + (i+1) + " of " + num);
Message recvdmessage = topicSubscriber.receive(TIMEOUT);
if( recvdmessage != null ) {
System.out.println("Received message : " +
((TextMessage)recvdmessage).getText());
} else {
System.out.println("timeout after " + TIMEOUT + " seconds");
throw new JMSException("timeout" + TIMEOUT + " seconds");
}
}
}
/**
* Generate testname. (Try to keep synched with target names in Makefile.)
*/
private String generateTestName(String destName, boolean doJdbc,
boolean expectReply, boolean rollbackEnabled)
{
String testName = destName.toLowerCase();
if (doJdbc) {
testName = testName + "_jdbc";
} else {
testName = testName + "_nojdbc";
}
if (expectReply) {
testName = testName + "_reply";
} else {
testName = testName + "_noreply";
}
if (rollbackEnabled) {
testName = testName + "_rollback";
}
return testName;
}
public void doTest(String destName, int numIter, boolean expectReply,
boolean doJdbc, boolean rollbackEnabled)
throws Exception
{
String testName =
generateTestName(destName, doJdbc, expectReply, rollbackEnabled);
try {
Destination dest = (Destination) context.lookup(destName);
boolean pointToPoint = dest instanceof jakarta.jms.Queue;
System.out.println("Beginning test : " + testName);
Timer.start();
if( pointToPoint ) {
Message message =
queueSession.createTextMessage(destName);
message.setBooleanProperty("doJdbc", doJdbc);
message.setBooleanProperty("rollbackEnabled", rollbackEnabled);
/* aid identifying what test message is associated with on JMS server side.
* (JMS RI Message Implementation toString() will print this property if it
* is set.)
*/
message.setStringProperty("COM_SUN_JMS_TESTNAME", testName + "_#" + numIter);
if( expectReply ) {
message.setJMSReplyTo(clientQueue);
}
sendMsgs((jakarta.jms.Queue) dest, message, numIter);
} else {
Message message =
topicSession.createTextMessage(destName);
message.setBooleanProperty("doJdbc", doJdbc);
message.setBooleanProperty("rollbackEnabled", rollbackEnabled);
/* aid identifying what test message is associated with on JMS server side.
* (JMS RI Message Implementation toString() will print this property if it
* is set.)
*/
message.setStringProperty("COM_SUN_JMS_TESTNAME", testName + "_numIter");
if( expectReply ) {
message.setJMSReplyTo(clientTopic);
}
publishMsgs((Topic) dest, message, numIter);
}
if( expectReply ) {
if( pointToPoint ) {
recvQueueMsgs(numIter);
} else {
recvTopicMsgs(numIter);
}
}
long time = Timer.stop();
System.out.println("End test : " + testName + ". Time = " +
Timer.format(time) + " -> " + (time/numIter) +
" msec/msg (" + numIter + " msgs)");
} catch (Exception e) {
System.out.println("Unexpected exception " + e + " in test " +
testName);
throw e;
}
}
// helper class for timing the tests
private static class Timer {
static long startTime;
public static void start() {
startTime = System.currentTimeMillis();
}
public static long stop() {
return System.currentTimeMillis() - startTime;
}
/**
* Returns a string that outputs time in an
* easily readable format.
*/
public static String format(long timeIn) {
double foo = ((double)timeIn)/1000;
long time = Math.round(foo);
String ret = null;
if (time < 60) {
ret = time + " seconds";
} else {
ret = (time/60) + " minutes, " +
(time%60) + " seconds (" +
time + " seconds)";
}
return ret;
}
}
}