//
// 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.
//

// Exclude client test of initial context factory, as the 1.0 profile uses the 1.0 context factory
org.apache.qpid.jndi.PropertiesFileInitialContextFactoryTest#*

// Exclude Address based tests
org.apache.qpid.client.failover.AddressBasedFailoverBehaviourTest#*
org.apache.qpid.test.client.destination.AddressBasedDestinationTest#*
org.apache.qpid.test.client.queue.QueuePolicyTest#*

// Exclude tests of AMQP 0-x features
org.apache.qpid.test.client.ImmediateAndMandatoryPublishingTest#*
org.apache.qpid.test.client.CloseOnNoRouteForMandatoryMessageTest#*
org.apache.qpid.server.exchange.ReturnUnroutableMandatoryMessageTest#*
org.apache.qpid.server.queue.ModelTest#*

// Exclude tests of connection URL failover method property
org.apache.qpid.server.failover.FailoverMethodTest#*

// Testing that the 0-x implementation of a durable topic does not cause queue growth when messages are excluded by selectors
org.apache.qpid.test.unit.topic.TopicSessionTest#testNonMatchingMessagesHandledCorrectly

// These tests explicitly meddle with prefetch - maybe there should be equivalents for AMQP 1.0
org.apache.qpid.test.unit.transacted.CommitRollbackTest#testRollbackSessionAfterCreditExhausted

// Excluded due to client issue QPIDJMS-231: Prefetched messages are not released on consumer close
org.apache.qpid.test.unit.transacted.CommitRollbackTest#testSend2ThenCloseAfter1andTryAgain

// This test covers the client version specific mechanisms for restricting the types of Object which can be sent via an ObjectMessage
org.apache.qpid.client.message.ObjectMessageClassWhitelistingTest#*

// This test checks that the client behaves in a non-JMS spec compliant way
org.apache.qpid.test.unit.message.JMSPropertiesTest#testQpidExtensionProperties

// This test mainly covers the AMQP 0-x client's heartbeating implementation
org.apache.qpid.client.HeartbeatTest#*

// This is a test of the MapMessage implementation for the 0-x client
org.apache.qpid.client.message.AMQPEncodedMapMessageTest#*

// Uses an 0-x client API to acknowledge up to a particular message rather than the most recent
org.apache.qpid.test.unit.ack.RecoverTest#testRecoverResendsMsgsAckOnEarlier
// Tests the effect of setting the prefetch value
org.apache.qpid.test.unit.ack.RecoverTest#testRecoverSessionAfterCreditExhausted

// 0-x specific acknowledge modes
org.apache.qpid.test.client.QueueBrowserNoAckTest#*
org.apache.qpid.test.client.QueueBrowserPreAckTest#*

// The new client does not (and should not) support our custom MD5 HEXED / HASHED mechanisms
org.apache.qpid.server.security.auth.manager.MD5AuthenticationManagerTest#*

// The binding logging tests focus on the behaviour of the old client with regard to creating (and binding) queues on
// the creation of consumers.
org.apache.qpid.server.logging.BindingLoggingTest#*

// These tests are 0-8/9/9-1 specific and are also excluded in the 0-10 profile
org.apache.qpid.server.logging.ChannelLoggingTest#testChannelStartsFlowStopped
org.apache.qpid.server.logging.ChannelLoggingTest#testChannelStartConsumerFlowStarted
// This test is testing AMQP 0-x specific behaviour
org.apache.qpid.server.logging.ChannelLoggingTest#testChannelClosedOnExclusiveQueueDeclaredOnDifferentSession


// These tests test acknowledge modes that are 0-8/9/10 client specific
org.apache.qpid.test.unit.ack.AcknowledgeTest#testNoAck
org.apache.qpid.test.unit.ack.AcknowledgeTest#testPreAck
org.apache.qpid.test.unit.ack.AcknowledgeOnMessageTest#testNoAck
org.apache.qpid.test.unit.ack.AcknowledgeOnMessageTest#testPreAck

// This test is checking features of the 0-x client specific implementation of Session
org.apache.qpid.test.unit.client.AMQSessionTest#*

// Low level test on ensuring frames are not bigger than negotiated max - there should probably be an equivalent for 1.0
org.apache.qpid.transport.MaxFrameSizeTest#*

// This test is concerned with the 0-x client establishing a connection to a supported version
org.apache.qpid.transport.ProtocolNegotiationTest#testProtocolNegotiationFromUnsupportedVersion

// These tests are testing extensions to JMS on the 0-x client to manipulate AMQP 0-x model objects like Queues and Exchanges
org.apache.qpid.client.session.ExchangeDeleteTest#*
org.apache.qpid.client.session.QueueDeclareTest#*
org.apache.qpid.client.session.QueueDeleteTest#*

// The tests are Protocol version specific constraints on total header property size
org.apache.qpid.test.unit.basic.PropertyValueTest#testOverlyLargeHeaderRejected_08091
org.apache.qpid.test.unit.basic.PropertyValueTest#testLargeHeader_08091_HeadersFillContentHeaderFrame
org.apache.qpid.test.unit.basic.PropertyValueTest#testLargeHeader_010_HeadersFillContentHeaderFrame

// This test concerns 0-8/0-10 bytes limiting flow control
org.apache.qpid.test.client.ConsumerFlowControlTest#*

// Tests are tests of the 0-x client behaviour
org.apache.qpid.test.client.ProducerFlowControlTest#*

// Failover tests are tests of the 0-x client behaviour
org.apache.qpid.client.failover.FailoverBehaviourTest#*
org.apache.qpid.client.failover.MultipleBrokersFailoverTest#*
org.apache.qpid.test.client.failover.FailoverTest#*


// Tests explicit binding using the mechanisms of the 0-x client/protocol
org.apache.qpid.server.queue.QueueBindTest#*

// Tests for configuration options for the 0-x client
org.apache.qpid.test.unit.basic.InvalidDestinationTest#testInvalidDestinationOnMessageProducer
org.apache.qpid.test.unit.basic.InvalidDestinationTest#testInvalidDestinationOnMessageProducerURL

// Tests the issue of connection exceptions being generated for unroutable messages in the 0-x client
org.apache.qpid.test.unit.client.connection.ExceptionListenerTest#testExceptionListenerConnectionStopDeadlock

// These tests specifically test BURL behaviour
org.apache.qpid.server.queue.NodeAutoCreationPolicyTest#testSendingToQueuePatternBURL
org.apache.qpid.server.queue.NodeAutoCreationPolicyTest#testSendingToNonMatchingQueuePatternBURL

// Message encryption not currently supported by the 1.0 client
org.apache.qpid.systest.messageencryption.MessageEncryptionTest#*
// Message compression not currently supported by the 1.0 client
org.apache.qpid.systest.MessageCompressionTest#*

// Specifically testing the 0-x ConnectionFactory
org.apache.qpid.test.unit.client.connection.ConnectionFactoryTest#*
// Specifically testing the 0-x Connection
org.apache.qpid.test.unit.client.connection.ConnectionTest#*
// Tests conversion between 0-8/9/9-1 and 0-10
org.apache.qpid.server.message.MessageProtocolConversionTest#*

// Tests the interaction between the Broker's supported protocols and what the 0-x client agrees to
org.apache.qpid.server.SupportedProtocolVersionsTest#*

// Tests the client setting of JMSXUserId and the client options to control that
org.apache.qpid.test.client.message.JMSXUserIDTest#*

// Test of 0-x client settings around creating exchanges/queues dynamically
org.apache.qpid.test.unit.client.DynamicQueueExchangeCreateTest#*

// This test aims to establish a connection without going through SASL exchanges.  The model for 1.0 is different, and
// this should probably be tested in a new protocol specific broker test
org.apache.qpid.transport.ConnectionEstablishmentTest#*

// test of 0-10 client specific behaviour
org.apache.qpid.test.client.message.JMSDestinationTest#testReceiveResend
// BURL specific tests
org.apache.qpid.test.client.message.JMSDestinationTest#testQueueWithBindingUrlUsingCustomExchange
org.apache.qpid.test.client.message.JMSDestinationTest#testQueueWithBindingUrlUsingAmqDirectExchange
org.apache.qpid.test.client.message.JMSDestinationTest#testQueueWithBindingUrlUsingDefaultExchange

// test of 0-x client threading / exception handling
org.apache.qpid.test.unit.close.JavaServerCloseRaceConditionTest#*

// Durable topic subscriptions will be reimplemented with the shared topic subscriptions (QPID-7569)
org.apache.qpid.server.logging.ConsumerLoggingTest#testSubscriptionCreateDurable
org.apache.qpid.server.logging.ConsumerLoggingTest#testSubscriptionCreateDurableWithArguments

// Qpid JMS Client does not accept key material in forms apart from JKS and PKCS
org.apache.qpid.client.ssl.SSLTest#testCreateSSLConnectionWithCertificateTrust
org.apache.qpid.client.ssl.SSLTest#testCreateSSLWithCertFileAndPrivateKey
// Test requires modification of javax.net.ssl system properties but Qpid JMS Client reads them only once
org.apache.qpid.client.ssl.SSLTest#testCreateSSLConnectionUsingSystemProperties
org.apache.qpid.client.ssl.SSLTest#testSslConnectionOption
org.apache.qpid.client.ssl.SSLTest#testVerifyLocalHost
org.apache.qpid.server.security.auth.manager.MultipleAuthenticationManagersTest#testMultipleAuthenticationManagers
// Test framework does not allow us to override hostname
org.apache.qpid.client.ssl.SSLTest#testHostVerificationIsOnByDefault
org.apache.qpid.client.ssl.SSLTest#testVerifyHostNameWithIncorrectHostname
// 0-x client specific feature
org.apache.qpid.client.ssl.SSLTest#testSslConnectionOptionOverridesBrokerlistOption
/ Test is 0-10 specific
org.apache.qpid.client.ssl.SSLTest#testMultipleCertsInSingleStore

// Tests assume BURL and/or Connection URL formats
org.apache.qpid.server.store.berkeleydb.replication.MultiNodeTest#*
org.apache.qpid.server.store.berkeleydb.replication.TwoNodeTest#*

// Qpid JMS Client does not support the use of preestablished socket
org.apache.qpid.client.connection.ExistingSocketTest#*

// These tests assume names of queues backing durable subscriptions
org.apache.qpid.server.store.berkeleydb.BDBUpgradeTest#testConsumptionOfUpgradedMessages
org.apache.qpid.server.store.berkeleydb.BDBUpgradeTest#testDurableSubscriptionWithoutSelector
org.apache.qpid.server.store.berkeleydb.BDBUpgradeTest#testSelectorDurability

// this test makes assumptions about the way the client uses sessions.
org.apache.qpid.systest.rest.ConnectionRestTest#*

// Tests verify the 0-x client's ability to create queues and that the server logs creation/deletion faithfully
org.apache.qpid.server.logging.DurableQueueLoggingTest#*
org.apache.qpid.server.logging.QueueLoggingTest#*
org.apache.qpid.server.logging.TransientQueueLoggingTest#*

// Tests verify the 0-x client's behaviour on recover which is not applicable to new client
org.apache.qpid.test.unit.client.MaxDeliveryCountTest#testSynchronousClientAckSession
org.apache.qpid.test.unit.client.MaxDeliveryCountTest#testAsynchronousClientAckSession
org.apache.qpid.test.unit.client.MaxDeliveryCountTest#testAsynchronousDupsOkSession
org.apache.qpid.test.unit.client.MaxDeliveryCountTest#testAsynchronousAutoAckSession




