/*
* JBoss, Home of Professional Open Source.
* Copyright 2015, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.as.test.integration.messaging.mgmt;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP_ADDR;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OUTCOME;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.RESULT;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SUCCESS;
import static org.jboss.as.test.shared.ServerReload.executeReloadAndWaitForCompletion;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.io.File;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSConsumer;
import javax.jms.JMSContext;
import javax.jms.JMSException;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.NamingException;
import org.jboss.arquillian.container.test.api.RunAsClient;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.as.arquillian.api.ContainerResource;
import org.jboss.as.arquillian.container.ManagementClient;
import org.jboss.as.controller.client.ModelControllerClient;
import org.jboss.as.test.integration.common.jms.JMSOperations;
import org.jboss.as.test.integration.common.jms.JMSOperationsProvider;
import org.jboss.as.test.shared.util.AssumeTestGroupUtil;
import org.jboss.dmr.ModelNode;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* @author <a href="http://jmesnil.net/">Jeff Mesnil</a> (c) 2015 Red Hat inc.
*/
@RunWith(Arquillian.class)
@RunAsClient
public class ExportImportJournalTestCase {
protected final String jmsQueueName = "ExportImportJournalTestCase-Queue";
protected final String jmsQueueLookup = "jms/" + jmsQueueName;
@ContainerResource
private Context remoteContext;
@ContainerResource
private ManagementClient managementClient;
@BeforeClass
public static void beforeClass() {
AssumeTestGroupUtil.assumeElytronProfileTestsEnabled();
}
protected static void sendMessage(Context ctx, String destinationLookup, String text) throws NamingException, JMSException {
ConnectionFactory cf = (ConnectionFactory) ctx.lookup("jms/RemoteConnectionFactory");
assertNotNull(cf);
Destination destination = (Destination) ctx.lookup(destinationLookup);
assertNotNull(destination);
try (JMSContext context = cf.createContext("guest", "guest")) {
TextMessage message = context.createTextMessage(text);
message.setJMSDeliveryMode(DeliveryMode.PERSISTENT);
context.createProducer().send(destination, message);
}
}
protected static void receiveMessage(Context ctx, String destinationLookup, boolean expectReceivedMessage, String expectedText) throws NamingException {
ConnectionFactory cf = (ConnectionFactory) ctx.lookup("jms/RemoteConnectionFactory");
assertNotNull(cf);
Destination destination = (Destination) ctx.lookup(destinationLookup);
assertNotNull(destination);
try (JMSContext context = cf.createContext("guest", "guest")) {
JMSConsumer consumer = context.createConsumer(destination);
String text = consumer.receiveBody(String.class, 5000);
if (expectReceivedMessage) {
assertNotNull(text);
assertEquals(expectedText, text);
} else {
assertNull("should not have received any message", text);
}
}
}
protected static ModelNode execute(ModelControllerClient client, ModelNode operation) throws Exception {
//System.out.println("operation = " + operation);
ModelNode response = client.execute(operation);
//System.out.println("response = " + response);
boolean success = SUCCESS.equals(response.get(OUTCOME).asString());
if (success) {
return response.get(RESULT);
}
throw new Exception("Operation failed");
}
@Before
public void setUp() {
JMSOperations jmsOperations = JMSOperationsProvider.getInstance(managementClient.getControllerClient());
jmsOperations.createJmsQueue(jmsQueueName, "java:jboss/exported/" + jmsQueueLookup);
jmsOperations.close();
}
@After
public void tearDown() {
JMSOperations jmsOperations = JMSOperationsProvider.getInstance(managementClient.getControllerClient());
jmsOperations.removeJmsQueue(jmsQueueName);
jmsOperations.close();
}
@Test
public void testExportImportJournal() throws Exception {
// send a persistent message
String text = java.util.UUID.randomUUID().toString();
sendMessage(remoteContext, jmsQueueLookup, text);
// reload in admin-only mode
executeReloadAndWaitForCompletion(managementClient.getControllerClient(), true);
// export the journal (must be performed in admin-only mode)
String dumpFilePath = exportJournal();
// reload in normal mode
executeReloadAndWaitForCompletion(managementClient.getControllerClient(), false);
// remove all messages
removeAllMessagesFromQueue(jmsQueueName);
// no message to receive
receiveMessage(remoteContext, jmsQueueLookup, false, null);
// import the journal (must be performed in normal mode)
importJournal(dumpFilePath);
// check the message is received
receiveMessage(remoteContext, jmsQueueLookup, true, text);
// remove the dump file
File f = new File(dumpFilePath);
f.delete();
}
private void removeAllMessagesFromQueue(String jmsQueueName) throws Exception {
ModelNode removeAllMessagesOp = new ModelNode();
removeAllMessagesOp.get(OP_ADDR).add("subsystem", "messaging-activemq");
removeAllMessagesOp.get(OP_ADDR).add("server", "default");
removeAllMessagesOp.get(OP_ADDR).add("jms-queue", jmsQueueName);
removeAllMessagesOp.get(OP).set("remove-messages");
execute(managementClient.getControllerClient(), removeAllMessagesOp);
}
private String exportJournal() throws Exception {
ModelNode exportJournalOp = new ModelNode();
exportJournalOp.get(OP_ADDR).add("subsystem", "messaging-activemq");
exportJournalOp.get(OP_ADDR).add("server", "default");
exportJournalOp.get(OP).set("export-journal");
ModelNode result = execute(managementClient.getControllerClient(), exportJournalOp);
//System.out.println("result = " + result);
String dumpFilePath = result.asString();
return dumpFilePath;
}
private void importJournal(String dumpFilePath) throws Exception {
ModelNode importJournalOp = new ModelNode();
importJournalOp.get(OP_ADDR).add("subsystem", "messaging-activemq");
importJournalOp.get(OP_ADDR).add("server", "default");
importJournalOp.get(OP).set("import-journal");
importJournalOp.get("file").set(dumpFilePath);
execute(managementClient.getControllerClient(), importJournalOp);
}
}