//
// 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-J
org.apache.qpid.test.client.destination.AddressBasedDestinationTest#testBrowseMode
//QPID-3392: the Apache Qpid Broker-J 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
// QPID-7692: Receiving a message sent using a destination which has no subject fails when client is in BURL dest syntax mode.
org.apache.qpid.test.client.destination.AddressBasedDestinationTest#testJMSDestination_DestinationWithoutSubject

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

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

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

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

# Exclude the JMS 2.0 test suite
org.apache.qpid.systests.jms_2_0.*

// Exclude 1.0 protocol tests
org.apache.qpid.tests.protocol.v1_0.*

// Tests AMQP 1.0 specific routing semantics
org.apache.qpid.systest.MessageRoutingTest#*

// QPID-7948: A publish confirms defect prevents this test passing.
org.apache.qpid.server.security.acl.MessagingACLTest#testPublishToTempTopicSuccess

// Test requires ability to address the $management node.  Fails for 0-9 only as client erroneously tries to declare an exchange
// Already fixed for next Qpid Client AMQP 0-x release (6.3.x)
org.apache.qpid.server.stats.StatisticsReportingTest#testBrokerStatistics
org.apache.qpid.server.stats.StatisticsReportingTest#testVirtualHostConnectionStatistics

