/* * * 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.test.unit.client.connection; import javax.jms.Connection; import javax.jms.QueueSession; import javax.jms.TopicSession; import org.apache.qpid.AMQConnectionFailureException; import org.apache.qpid.AMQException; import org.apache.qpid.AMQUnresolvedAddressException; import org.apache.qpid.client.AMQConnection; import org.apache.qpid.client.AMQConnectionURL; import org.apache.qpid.client.AMQQueue; import org.apache.qpid.client.AMQSession; import org.apache.qpid.client.AMQTopic; import org.apache.qpid.configuration.ClientProperties; import org.apache.qpid.exchange.ExchangeDefaults; import org.apache.qpid.framing.AMQShortString; import org.apache.qpid.jms.BrokerDetails; import org.apache.qpid.jms.ConnectionURL; import org.apache.qpid.jms.Session; import org.apache.qpid.test.utils.QpidBrokerTestCase; public class ConnectionTest extends QpidBrokerTestCase { String _broker_NotRunning = "tcp://localhost:" + findFreePort(); String _broker_BadDNS = "tcp://hg3sgaaw4lgihjs"; public void testSimpleConnection() throws Exception { AMQConnection conn = null; try { conn = new AMQConnection(getBroker().toString(), "guest", "guest", "fred", "test"); } catch (Exception e) { fail("Connection to " + getBroker() + " should succeed. Reason: " + e); } finally { if(conn != null) { conn.close(); } } } public void testDefaultExchanges() throws Exception { AMQConnection conn = null; try { BrokerDetails broker = getBroker(); broker.setProperty(BrokerDetails.OPTIONS_RETRY, "1"); ConnectionURL url = new AMQConnectionURL("amqp://guest:guest@clientid/test?brokerlist='" + broker + "'&defaultQueueExchange='test.direct'" + "&defaultTopicExchange='test.topic'" + "&temporaryQueueExchange='tmp.direct'" + "&temporaryTopicExchange='tmp.topic'"); System.err.println(url.toString()); conn = new AMQConnection(url); AMQSession sess = (AMQSession) conn.createSession(false, Session.AUTO_ACKNOWLEDGE); sess.declareExchange(new AMQShortString("test.direct"), ExchangeDefaults.DIRECT_EXCHANGE_CLASS, false); sess.declareExchange(new AMQShortString("tmp.direct"), ExchangeDefaults.DIRECT_EXCHANGE_CLASS, false); sess.declareExchange(new AMQShortString("tmp.topic"), ExchangeDefaults.TOPIC_EXCHANGE_CLASS, false); sess.declareExchange(new AMQShortString("test.topic"), ExchangeDefaults.TOPIC_EXCHANGE_CLASS, false); QueueSession queueSession = conn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); AMQQueue queue = (AMQQueue) queueSession.createQueue("MyQueue"); assertEquals(queue.getExchangeName().toString(), "test.direct"); AMQQueue tempQueue = (AMQQueue) queueSession.createTemporaryQueue(); assertEquals(tempQueue.getExchangeName().toString(), "tmp.direct"); queueSession.close(); TopicSession topicSession = conn.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); AMQTopic topic = (AMQTopic) topicSession.createTopic("silly.topic"); assertEquals(topic.getExchangeName().toString(), "test.topic"); AMQTopic tempTopic = (AMQTopic) topicSession.createTemporaryTopic(); assertEquals(tempTopic.getExchangeName().toString(), "tmp.topic"); topicSession.close(); } catch (Exception e) { fail("Connection to " + getBroker() + " should succeed. Reason: " + e); } finally { conn.close(); } } public void testPasswordFailureConnection() throws Exception { AMQConnection conn = null; try { BrokerDetails broker = getBroker(); broker.setProperty(BrokerDetails.OPTIONS_RETRY, "0"); conn = new AMQConnection("amqp://guest:rubbishpassword@clientid/test?brokerlist='" + broker + "'"); fail("Connection should not be established password is wrong."); } catch (AMQConnectionFailureException amqe) { assertNotNull("No cause set:" + amqe.getMessage(), amqe.getCause()); assertTrue("Exception was wrong type", amqe.getCause() instanceof AMQException); } finally { if (conn != null) { conn.close(); } } } public void testConnectionFailure() throws Exception { AMQConnection conn = null; try { conn = new AMQConnection("amqp://guest:guest@clientid/testpath?brokerlist='" + _broker_NotRunning + "?retries='0''"); fail("Connection should not be established"); } catch (AMQException amqe) { if (!(amqe instanceof AMQConnectionFailureException)) { fail("Correct exception not thrown. Excpected 'AMQConnectionException' got: " + amqe); } } finally { if (conn != null) { conn.close(); } } } public void testUnresolvedHostFailure() throws Exception { AMQConnection conn = null; try { conn = new AMQConnection("amqp://guest:guest@clientid/testpath?brokerlist='" + _broker_BadDNS + "?retries='0''"); fail("Connection should not be established"); } catch (AMQException amqe) { if (!(amqe instanceof AMQUnresolvedAddressException)) { fail("Correct exception not thrown. Excpected 'AMQUnresolvedAddressException' got: " + amqe); } } finally { if (conn != null) { conn.close(); } } } public void testUnresolvedVirtualHostFailure() throws Exception { AMQConnection conn = null; try { BrokerDetails broker = getBroker(); broker.setProperty(BrokerDetails.OPTIONS_RETRY, "0"); conn = new AMQConnection("amqp://guest:guest@clientid/rubbishhost?brokerlist='" + broker + "'"); fail("Connection should not be established"); } catch (AMQException amqe) { if (!(amqe instanceof AMQConnectionFailureException)) { fail("Correct exception not thrown. Excpected 'AMQConnectionFailureException' got: " + amqe); } } finally { if (conn != null) { conn.close(); } } } public void testClientIdCannotBeChanged() throws Exception { Connection connection = new AMQConnection(getBroker().toString(), "guest", "guest", "fred", "test"); try { connection.setClientID("someClientId"); fail("No IllegalStateException thrown when resetting clientid"); } catch (javax.jms.IllegalStateException e) { // PASS } finally { if (connection != null) { connection.close(); } } } public void testClientIdIsPopulatedAutomatically() throws Exception { Connection connection = new AMQConnection(getBroker().toString(), "guest", "guest", null, "test"); try { assertNotNull(connection.getClientID()); } finally { connection.close(); } connection.close(); } public void testUnsupportedSASLMechanism() throws Exception { BrokerDetails broker = getBroker(); broker.setProperty(BrokerDetails.OPTIONS_SASL_MECHS, "MY_MECH"); try { Connection connection = new AMQConnection(broker.toString(), "guest", "guest", null, "test"); connection.close(); fail("The client should throw a ConnectionException stating the" + " broker does not support the SASL mech specified by the client"); } catch (Exception e) { assertTrue("Unexpected exception message : " + e.getMessage(), e.getMessage().contains("Client and broker have no SASL mechanisms in common.")); assertTrue("Unexpected exception message : " + e.getMessage(), e.getMessage().contains("Client restricted itself to : MY_MECH")); } } /** * Tests that when the same user connects twice with same clientid, the second connection * fails if the clientid verification feature is enabled (which uses a dummy 0-10 Session * with the clientid as its name to detect the previous usage of the clientid by the user) */ public void testClientIDVerificationForSameUser() throws Exception { setTestSystemProperty(ClientProperties.QPID_VERIFY_CLIENT_ID, "true"); BrokerDetails broker = getBroker(); try { Connection con = new AMQConnection(broker.toString(), "guest", "guest", "client_id", "test"); Connection con2 = new AMQConnection(broker.toString(), "guest", "guest", "client_id", "test"); fail("The client should throw a ConnectionException stating the" + " client ID is not unique"); } catch (Exception e) { assertTrue("Incorrect exception thrown: " + e.getMessage(), e.getMessage().contains("ClientID must be unique")); } } /** * Tests that when different users connects with same clientid, the second connection * succeeds even though the clientid verification feature is enabled (which uses a dummy * 0-10 Session with the clientid as its name; these are only verified unique on a * per-principal basis) */ public void testClientIDVerificationForDifferentUsers() throws Exception { setTestSystemProperty(ClientProperties.QPID_VERIFY_CLIENT_ID, "true"); BrokerDetails broker = getBroker(); try { Connection con = new AMQConnection(broker.toString(), "guest", "guest", "client_id", "test"); Connection con2 = new AMQConnection(broker.toString(), "admin", "admin", "client_id", "test"); } catch (Exception e) { fail("Unexpected exception thrown, client id was not unique but usernames were different! " + e.getMessage()); } } public static junit.framework.Test suite() { return new junit.framework.TestSuite(ConnectionTest.class); } }