/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */ package org.apache.qpid.systest.disttest.clientonly; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageProducer; import javax.jms.Queue; import javax.jms.Session; import org.apache.qpid.disttest.client.Client; import org.apache.qpid.disttest.client.ClientState; import org.apache.qpid.disttest.jms.ClientJmsDelegate; import org.apache.qpid.disttest.jms.JmsMessageAdaptor; import org.apache.qpid.disttest.message.Command; import org.apache.qpid.disttest.message.CommandType; import org.apache.qpid.disttest.message.CreateConnectionCommand; import org.apache.qpid.disttest.message.CreateSessionCommand; import org.apache.qpid.disttest.message.NoOpCommand; import org.apache.qpid.disttest.message.RegisterClientCommand; import org.apache.qpid.disttest.message.Response; import org.apache.qpid.disttest.message.StopClientCommand; import org.apache.qpid.systest.disttest.DistributedTestSystemTestBase; public class BasicDistributedClientTest extends DistributedTestSystemTestBase { private Session _session = null; private MessageProducer _clientQueueProducer; private Client _client; private ControllerQueue _controllerQueue; private ClientJmsDelegate _clientJmsDelegate = null; @Override protected void setUp() throws Exception { super.setUp(); _controllerQueue = new ControllerQueue(_connection, _context); _session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE); _clientJmsDelegate = new ClientJmsDelegate(_context); _client = new Client(_clientJmsDelegate); _client.start(); } @Override protected void tearDown() throws Exception { try { _controllerQueue.close(); if (_session != null) { _session.close(); } } finally { super.tearDown(); } } public void testClientSendsRegistrationMessage() throws Exception { final RegisterClientCommand regClientCommand = _controllerQueue.getNext(); assertNotNull("Client must have a non-null name", regClientCommand.getClientName()); assertEquals("Unexpected client name", _clientJmsDelegate.getClientName(), regClientCommand.getClientName()); assertNotNull("Client queue name should not be null", regClientCommand.getClientQueueName()); } public void testClientSendsCommandResponses() throws Exception { final RegisterClientCommand registrationCommand = _controllerQueue.getNext(); createClientQueueProducer(registrationCommand); sendCommandToClient(new NoOpCommand()); final Response responseCommand = _controllerQueue.getNext(); assertEquals("Incorrect client message type", CommandType.RESPONSE, responseCommand.getType()); } public void testClientCanBeStoppedViaCommand() throws Exception { assertEquals("Expected client to be in STARTED state", ClientState.READY, _client.getState()); final RegisterClientCommand registrationCommand = _controllerQueue.getNext(); createClientQueueProducer(registrationCommand); final Command stopClientCommand = new StopClientCommand(); sendCommandToClient(stopClientCommand); _client.waitUntilStopped(1000); Response response = _controllerQueue.getNext(); assertNotNull(response); assertFalse("response shouldn't contain error", response.hasError()); assertEquals("Expected client to be in STOPPED state", ClientState.STOPPED, _client.getState()); } public void testClientCanCreateTestConnection() throws Exception { assertEquals("Unexpected number of test connections", 0, _clientJmsDelegate.getNoOfTestConnections()); final RegisterClientCommand registration = _controllerQueue.getNext(); createClientQueueProducer(registration); final CreateConnectionCommand createConnectionCommand = new CreateConnectionCommand(); createConnectionCommand.setConnectionName("newTestConnection"); createConnectionCommand.setConnectionFactoryName("connectionfactory"); sendCommandToClient(createConnectionCommand); Response response = _controllerQueue.getNext(); assertFalse("Response message should not have indicated an error", response.hasError()); assertEquals("Unexpected number of test connections", 1, _clientJmsDelegate.getNoOfTestConnections()); } public void testClientCanCreateTestSession() throws Exception { assertEquals("Unexpected number of test sessions", 0, _clientJmsDelegate.getNoOfTestSessions()); final RegisterClientCommand registration = _controllerQueue.getNext(); createClientQueueProducer(registration); final CreateConnectionCommand createConnectionCommand = new CreateConnectionCommand(); createConnectionCommand.setConnectionName("newTestConnection"); createConnectionCommand.setConnectionFactoryName("connectionfactory"); sendCommandToClient(createConnectionCommand); Response response = _controllerQueue.getNext(); assertFalse("Response message should not have indicated an error", response.hasError()); final CreateSessionCommand createSessionCommand = new CreateSessionCommand(); createSessionCommand.setConnectionName("newTestConnection"); createSessionCommand.setSessionName("newTestSession"); createSessionCommand.setAcknowledgeMode(Session.AUTO_ACKNOWLEDGE); sendCommandToClient(createSessionCommand); response = _controllerQueue.getNext(); assertFalse("Response message should not have indicated an error", response.hasError()); assertEquals("Unexpected number of test sessions", 1, _clientJmsDelegate.getNoOfTestSessions()); } private void sendCommandToClient(final Command command) throws JMSException { final Message message = JmsMessageAdaptor.commandToMessage(_session, command); _clientQueueProducer.send(message); } private void createClientQueueProducer( final RegisterClientCommand registration) throws JMSException { final Destination clientCommandQueue = createDestinationFromRegistration(registration); _clientQueueProducer = _session.createProducer(clientCommandQueue); } private Queue createDestinationFromRegistration( final RegisterClientCommand registrationCommand) throws JMSException { String clientQueueName = registrationCommand.getClientQueueName(); assertNotNull("Null client queue in register message", clientQueueName); return _session.createQueue(clientQueueName); } }