//
// 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 the following from brokers using the 0-8/0-9/0-9-1 protocols
//======================================================================

// These tests requires a broker capable of 0-8/0-9/0-9-1 and 0-10 concurrently
org.apache.qpid.test.client.message.JMSDestinationTest#testReceiveResend
org.apache.qpid.server.message.MessageProtocolConversionTest#*

//QPID-3422: test fails because ring queue is not implemented on Apache Qpid Broker for Java
org.apache.qpid.test.client.destination.AddressBasedDestinationTest#testBrowseMode
//QPID-3392: the Apache Qpid Broker for Java does not yet implement exchange creation arguments
org.apache.qpid.test.client.destination.AddressBasedDestinationTest#testCreateExchangeWithArgs
org.apache.qpid.test.client.destination.AddressBasedDestinationTest#testSessionCreateTopicWithExchangeArgs
//QPID-3678: zero capacity not supported in 0-9-1
org.apache.qpid.test.client.destination.AddressBasedDestinationTest#testZeroCapacityForSynchronousReceive
//QPID-6037: the 0-9-1 client takes the view that if you don't specify the node type but you ask for a JMS Topic
//           you want a topic behaviour.  The 0-10 client thinks you must want a queue.
org.apache.qpid.test.client.destination.AddressBasedDestinationTest#testJMSTopicIsTreatedAsQueueIn0_10

// The new addressing based syntax is not supported for AMQP 0-8/0-9 versions
org.apache.qpid.client.failover.AddressBasedFailoverBehaviourTest#*
org.apache.qpid.test.client.queue.QueuePolicyTest#testRingPolicy
org.apache.qpid.test.client.queue.QueuePolicyTest#testRejectPolicy
org.apache.qpid.test.unit.message.JMSPropertiesTest#testApplicationProperties
org.apache.qpid.server.queue.AddressBasedSortedQueueTest#*

// Those tests are written against the 0.10 path
org.apache.qpid.client.SynchReceiveTest#testReceiveNoWait
org.apache.qpid.server.logging.ChannelLoggingTest#testChannelClosedOnExclusiveQueueDeclaredOnDifferentSession

// Makes explicit use of 0-10 connection object
org.apache.qpid.client.ssl.SSLTest#testMultipleCertsInSingleStore

// Tests 0.10 client feature
org.apache.qpid.test.unit.client.connection.ConnectionTest#testUnsupportedSASLMechanism

// uses AMQP 0-10 related properties
org.apache.qpid.test.unit.message.JMSPropertiesTest#testQpidExtensionProperties

// LVQ tests use new address syntax and can not be run on 0.9.1 profiles
org.apache.qpid.test.client.queue.LVQTest#*

// Verification of unique client id is 0-10 specific
org.apache.qpid.test.unit.client.connection.ConnectionTest#testClientIDVerificationForSameUser
org.apache.qpid.test.unit.client.connection.ConnectionTest#testClientIDVerificationForDifferentUsers

// QPID-3604 This fix is applied only to the 0-10 code, hence this test does not work for pre 0-10.
org.apache.qpid.client.prefetch.PrefetchBehaviourTest#testConnectionStop

//XA functionality is not implemented in pre 0-10
org.apache.qpid.jms.xa.XAResourceTest#*

//Tests durable subscription selector verification behaviour that 0-8/0-9/0-9-1 cant provide
org.apache.qpid.test.unit.ct.DurableSubscriberTest#testResubscribeWithChangedSelectorAndRestart

// JCA system tests require XA support (should look to see if we can reduce scope of excludes here)
org.apache.qpid.ra.QpidRAConnectionTest#*
org.apache.qpid.ra.QpidRAXAResourceTest#*

// QPID-3396
org.apache.qpid.test.unit.client.connection.ConnectionTest#testExceptionWhenUserPassIsRequired

// Testing of large 0-10 headers (QPID-6786)
org.apache.qpid.test.unit.basic.PropertyValueTest#testLargeHeader_010_HeadersFillContentHeaderFrame
