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

// 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.destination.AddressBasedDestinationTest#*
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.test.unit.message.UTF8Test#*
org.apache.qpid.client.SynchReceiveTest#testReceiveNoWait

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

// Under AMQP 0-8..0-9-1 temporary queues are deleted on consumer close, rather than connection close
// and for this reason this test would fail.
org.apache.qpid.test.unit.client.temporaryqueue.TemporaryQueueTest#testTemporaryQueueReused

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

// These tests rely on new address syntax
org.apache.qpid.systest.management.jmx.QueueManagementTest#testGetSetAlternateExchange
org.apache.qpid.systest.management.jmx.QueueManagementTest#testRemoveAlternateExchange
org.apache.qpid.systest.management.jmx.QueueManagementTest#testAlternateExchangeSurvivesRestart

