//
// 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#*

// 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#*

// 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
org.apache.qpid.server.queue.NodeAutoCreationPolicyTest#testLegacyQueueDeclareArgumentAlternateBindingCreation

// 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#*

// 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.SessionRestTest#*

// 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 call Session#recover() to redeliver messages from broker 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

//ACL tests not applicable for AMQP 1.0
org.apache.qpid.server.security.acl.MessagingACLTest#testPublishToDefaultExchangeSuccess
org.apache.qpid.server.security.acl.MessagingACLTest#testPublishToDefaultExchangeFailure
org.apache.qpid.server.security.acl.Amqp0xMessagingACLTest#*

// QPID-7919 : We can't currently ACL the ability to create temporary queues (or exchanges) as these need to
// run as system as so avoid the ACL check.
org.apache.qpid.server.security.acl.MessagingACLTest#testCreateTemporaryQueueFailed

