/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 2010-2017 Oracle and/or its affiliates. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License"). You
* may not use this file except in compliance with the License. You can
* obtain a copy of the License at
* https://oss.oracle.com/licenses/CDDL+GPL-1.1
* or LICENSE.txt. See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at LICENSE.txt.
*
* GPL Classpath Exception:
* Oracle designates this particular file as subject to the "Classpath"
* exception as provided by Oracle in the GPL Version 2 section of the License
* file that accompanied this code.
*
* Modifications:
* If applicable, add the following below the License Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyright [year] [name of copyright owner]"
*
* Contributor(s):
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license." If you don't indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above. However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/
package admin;
import com.sun.appserv.test.BaseDevTest;
/*
import com.sun.messaging.AdminConnectionConfiguration;
import com.sun.messaging.AdminConnectionFactory;
*
*/
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import java.util.HashMap;
import java.util.Map;
/*
* @author Satish
*/
public class ConfigureJmsClusterTest extends AdminBaseDevTest {
public static final String CLUSTER_NAME = "cluster1";
public static final String INSTANCE1_NAME = "instance1";
public static final String INSTANCE2_NAME = "instance2";
public static final String STANDALONE_INSTANCE_NAME = "instance3";
public static void main(String[] args) {
new ConfigureJmsClusterTest().runTests();
}
@Override
protected String getTestDescription() {
return "Unit test for dynamically changing master broker";
}
@Override
public void cleanup() {
try {
asadmin("stop-local-instance", STANDALONE_INSTANCE_NAME);
// asadmin("delete-local-instance", STANDALONE_INSTANCE_NAME);
asadmin("stop-local-instance", INSTANCE1_NAME);
asadmin("stop-local-instance", INSTANCE2_NAME);
asadmin("stop-cluster", CLUSTER_NAME);
asadmin("delete-local-instance", INSTANCE1_NAME);
asadmin("delete-local-instance", INSTANCE2_NAME);
asadmin("delete-cluster", CLUSTER_NAME);
asadmin("stop-database");
} catch (Exception e) {
e.printStackTrace();
}
}
public void runTests() {
startDomain();
asadmin("create-cluster", CLUSTER_NAME);
configurejmscluster();
asadmin("create-local-instance", "--cluster", CLUSTER_NAME,
/*"--node", "localhost",*/ "--systemproperties",
"HTTP_LISTENER_PORT=18080:HTTP_SSL_LISTENER_PORT=18181:IIOP_SSL_LISTENER_PORT=13800:IIOP_LISTENER_PORT=13700:JMX_SYSTEM_CONNECTOR_PORT=17676:IIOP_SSL_MUTUALAUTH_PORT=13801:JMS_PROVIDER_PORT=18686:ASADMIN_LISTENER_PORT=14848",
INSTANCE1_NAME);
asadmin("create-local-instance", "--cluster", CLUSTER_NAME,
/*"--node", "localhost",*/ "--systemproperties",
"HTTP_LISTENER_PORT=28080:HTTP_SSL_LISTENER_PORT=28181:IIOP_SSL_LISTENER_PORT=23800:IIOP_LISTENER_PORT=23700:JMX_SYSTEM_CONNECTOR_PORT=27676:IIOP_SSL_MUTUALAUTH_PORT=23801:JMS_PROVIDER_PORT=28686:ASADMIN_LISTENER_PORT=24848",
INSTANCE2_NAME);
asadmin("start-cluster", CLUSTER_NAME);
//checkMasterBroker("18686");
asadmin("stop-local-instance", INSTANCE1_NAME);
createJmsDest("testqueue2");
listJmsDest("testqueue2");
configureJmsClusterWithoutForce();
configureJmsClusterWithForce();
asadmin("stop-cluster", CLUSTER_NAME);
asadmin ("start-cluster", CLUSTER_NAME);
try{
Thread.sleep(5000);
}catch(Exception e)
{
e.printStackTrace();
}
//checkMasterBroker("18686");
createJmsDest("anothertestqueue");
listJmsDest("anothertestqueue");
cleanup();
stopDomain();
stat.printSummary();
}
private void configurejmscluster(){
String testName = "RunConfigureJmsCluster";
asadmin("start-database");
AsadminReturn result = asadminWithOutput("configure-jms-cluster", "--clustertype", "conventional",
"--messagestoretype", "file", "--configstoretype", "shareddb", "--dbvendor", "derby", "--dbuser", "dbuser",
"--dburl", "jdbc:derby://localhost:1527/testdb/retreiveMessagesFromServerOnGetMessage=true;create=true", "cluster1");
reportResultStatus(testName, result);
}
private void checkMasterBroker(String jmsport){
String testName = "checkMasterBroker";
Object output = jmxCall(jmsport, "com.sun.messaging.jms.server:type=Cluster,subtype=Monitor", "MasterBrokerInfo");
AsadminReturn result = new AsadminReturn();//asadminWithOutput(DELETE_CONNECTOR_RESOURCE,TARGET_OPTION, target, RESOURCE_NAME);
result.returnValue = result != null;
if(output != null) result.out = (String) (((CompositeDataSupport) output).get("imq.cluster.nomasterbroker"));
result.err="";
System.out.println("MasterBroker " + result.out);
//result.out=
reportResultStatus(testName, result);
reportExpectedResult(testName, result, "true");
}
private void createJmsDest(String destname){
String testName = "CreateJMSDest";
AsadminReturn result = asadminWithOutput("create-jmsdest", "--target", CLUSTER_NAME, "--desttype", "queue", destname);
reportResultStatus(testName, result);
}
private void listJmsDest(String destname){
String testName = "ListJMSDest";
AsadminReturn result = asadminWithOutput("list-jmsdest", CLUSTER_NAME);
reportResultStatus(testName, result);
reportExpectedResult(testName, result, destname);
}
private void configureJmsClusterWithoutForce(){
asadmin("start-local-instance", INSTANCE1_NAME);
String testName = "RunConfigureJmsClusterWithoutForce";
AsadminReturn result = asadminWithOutput("configure-jms-cluster", "--clustertype", "conventional",
"--messagestoretype", "file", "--configstoretype", "masterbroker", "cluster1");
reportFailureResultStatus(testName, result);
}
private void configureJmsClusterWithForce(){
String testName = "RunConfigureJmsClusterWithForce";
AsadminReturn result = asadminWithOutput("configure-jms-cluster", "--clustertype", "conventional",
"--messagestoretype", "file", "--configstoretype", "masterbroker", "--force", "cluster1");
reportResultStatus(testName, result);
}
public Object jmxCall(String jmsProviderPort, String objectName, String attrName){
/*
* Commented out because building this code depends on having GlassFish already downloaded.
* The admin devtest must build without having GlassFish present.
try{
AdminConnectionFactory acf = new AdminConnectionFactory();
acf.setProperty(AdminConnectionConfiguration.imqAddress, "localhost:" + jmsProviderPort);
JMXConnector connector = acf.createConnection("admin","admin");
MBeanServerConnection mbsc = connector.getMBeanServerConnection();
System.out.println("connected to target server");
ObjectName objName
= new ObjectName(objectName);
Object attrvalue = mbsc.getAttribute(objName, attrName);
connector.close();
return attrvalue;
}catch(Exception ex){
ex.printStackTrace();
}
*/
return null;
}
private void reportFailureResultStatus(String testName, AsadminReturn result) {
report(testName, ! result.returnValue);
report(testName, ! result.err.isEmpty());
}
private void reportResultStatus(String testName, AsadminReturn result) {
report(testName, result.returnValue);
report(testName, result.err.isEmpty());
}
private void reportExpectedFailureResult(String testName, AsadminReturn result, String... expected) {
for (String token : expected) {
report(testName, result.err.contains(token));
}
}
private void reportExpectedResult(String testName, AsadminReturn result, String... expected) {
for (String token : expected) {
report(testName, result.out.contains(token));
}
}
private void reportUnexpectedResult(String testName, AsadminReturn result, String... unexpected) {
for (String token : unexpected) {
report(testName, !result.out.contains(token));
}
}
}