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

// QPID-3391: the C++ broker does not currently validate the exchange creation arguments
org.apache.qpid.test.client.destination.AddressBasedDestinationTest#testCreateExchangeWithNonsenseArgs

// QPID-3576: Java client issue. MessageConsumer#close() time-out.
org.apache.qpid.test.client.destination.AddressBasedDestinationTest#testDeleteOptions

// Those tests are testing 0.8 specific semantics
org.apache.qpid.test.client.ImmediateAndMandatoryPublishingTest#*

// the 0.10 c++ broker does not implement forget
org.apache.qpid.test.unit.xa.FaultTest#testForget

// the 0-10 c++ broker does not implement priority / this test depends on a Java broker extension for queue creation
org.apache.qpid.server.queue.PriorityTest#*
org.apache.qpid.server.queue.AMQPriorityQueueTest#*

// the 0-10 c++ broker does not implement the extended LVQ semantics which the Java Broker does
org.apache.qpid.server.queue.ConflationQueueTest#*

// the 0-10 c++ broker does not implement sorted queues
org.apache.qpid.server.queue.SortedQueueTest#*

// the 0-10 c++ broker does not implement DLQ
org.apache.qpid.test.unit.client.MaxDeliveryCountTest#*

//this test checks explicitly for 0-8 flow control semantics
org.apache.qpid.test.client.FlowControlTest#*

// 0-10 c++ broker doesn't implement virtual hosts, or those wackhy exchanges
org.apache.qpid.test.unit.client.connection.ConnectionTest#testUnresolvedVirtualHostFailure
org.apache.qpid.test.unit.client.connection.ConnectionTest#testDefaultExchanges

// 0-10 c++ broker in cpp.testprofile is started with no auth so won't pass this test
org.apache.qpid.test.unit.client.connection.ConnectionTest#testPasswordFailureConnection

// InVM Broker tests
org.apache.qpid.test.client.timeouts.SyncWaitDelayTest#*

// QPID-1262, QPID-1119 : This test fails occasionally due to potential protocol issue.
org.apache.qpid.test.client.timeouts.SyncWaitTimeoutDelayTest#*

// c++ broker doesn't support message bouncing
org.apache.qpid.server.exchange.ReturnUnroutableMandatoryMessageTest#*

// c++ broker expires messages on delivery or when the queue cleaner thread runs.
org.apache.qpid.server.queue.TimeToLiveTest#testActiveTTL
org.apache.qpid.server.queue.TimeToLiveTest#testActiveTTLwithDurableSubscription

// QPID-1727 , QPID-1726 :c++ broker does not support flow to disk on transient queues. Also it requries a persistent store impl. for Apache
org.apache.qpid.test.client.QueueBrowsingFlowToDiskTest#*

// This test currently does not pick up the runtime location of the nonVm queueBacking store.
org.apache.qpid.test.unit.close.FlowToDiskBackingQueueDeleteTest#*

//QPID-1818 : 0-10 Client code path does not correctly restore a transacted session after failover.
org.apache.qpid.server.persistent.NoLocalAfterRecoveryTest#*

// QPID-1730: the C++ server has a totally different logging mechanism. We should split this file differently
org.apache.qpid.server.AlertingTest#*

// The C++ server has a totally different persistence mechanism
org.apache.qpid.server.store.PersistentStoreTest#*

// These tests are for the Java broker persistent store modules
org.apache.qpid.server.store.MessageStoreTest#testMessagePersistence
org.apache.qpid.server.store.MessageStoreTest#testMessageRemoval
org.apache.qpid.server.store.MessageStoreTest#testBindingPersistence
org.apache.qpid.server.store.MessageStoreTest#testDurableBindingRemoval
org.apache.qpid.server.store.MessageStoreTest#testQueuePersistence
org.apache.qpid.server.store.MessageStoreTest#testDurableQueueRemoval
org.apache.qpid.server.store.MessageStoreTest#testExchangePersistence
org.apache.qpid.server.store.MessageStoreTest#testDurableExchangeRemoval
org.apache.qpid.server.store.DurableConfigurationStoreTest#*

// CPP Broker does not follow the same Logging convention as the Java broker
org.apache.qpid.server.BrokerStartupTest#*
org.apache.qpid.server.logging.*
org.apache.qpid.server.logging.messages.*
org.apache.qpid.server.logging.subjects.*
org.apache.qpid.server.logging.actors.*

// CPP Broker does not have a JMX interface to test
org.apache.qpid.server.jmx.mbeans.*
org.apache.qpid.systest.management.jmx.*

// JMX is used in this test for validation
org.apache.qpid.server.queue.ModelTest#*

// 0-10 is not supported by the MethodRegistry
org.apache.qpid.test.unit.close.JavaServerCloseRaceConditionTest#*

// QPID-2084 : this test needs more work for 0-10
org.apache.qpid.test.unit.client.DynamicQueueExchangeCreateTest#*

// QPID-2118 : 0-10 Java client has differrent error handling to 0-8 code path
org.apache.qpid.test.client.message.SelectorTest#testRuntimeSelectorError

//QPID-942 : Implemented Channel.Flow based Producer Side flow control to the Java Broker (not in CPP Broker)
org.apache.qpid.server.queue.ProducerFlowControlTest#*
//QPID-3986 : Flow control invoked on total store disk usage
org.apache.qpid.server.store.StoreOverfullTest#*
// 0-8/0-9/0-9-1 and/or Java broker specific failover tests related to the above Producer Flow Control mechanisms
org.apache.qpid.client.failover.FailoverBehaviourTest#testFailoverHandlerTimeoutExpires
org.apache.qpid.client.failover.FailoverBehaviourTest#testFlowControlFlagResetOnFailover
org.apache.qpid.client.failover.AddressBasedFailoverBehaviourTest#testFailoverHandlerTimeoutExpires
org.apache.qpid.client.failover.AddressBasedFailoverBehaviourTest#testFlowControlFlagResetOnFailover

org.apache.qpid.test.client.RollbackOrderTest#testOrderingAfterRollbackOnMessage#*

// Excluded because Java plugins not used in CPP broker
org.apache.qpid.server.virtualhost.plugin.*
org.apache.qpid.info.test.*
org.apache.qpid.server.security.access.*
org.apache.qpid.server.security.access.plugins.*
org.apache.qpid.server.security.auth.manager.*
org.apache.qpid.server.security.acl.*
org.apache.qpid.server.configuration.*
org.apache.qpid.server.configuration.plugins.*
org.apache.qpid.server.security.firewall.FirewallConfigTest#*
org.apache.qpid.server.security.firewall.FirewallConfigurationTest#*
org.apache.qpid.server.plugins.PluginTest#*

// Transacion timeouts not implemented in CPP broker
org.apache.qpid.test.unit.transacted.TransactionTimeoutDisabledTest#*
org.apache.qpid.test.unit.transacted.TransactionTimeoutConfigurationTest#*
org.apache.qpid.test.unit.transacted.TransactionTimeoutTest#*

// Java broker only
org.apache.qpid.server.SupportedProtocolVersionsTest#*
org.apache.qpid.server.stats.StatisticsReportingTest#*

// QPID-3133: On 0-10, the exception listener is currently not invoked when reconnection fails to occurs.
org.apache.qpid.server.failover.FailoverMethodTest#*

// CPP Broker does not implement non-"shared group" message groups
org.apache.qpid.server.queue.MessageGroupQueueTest#testSimpleGroupAssignment
org.apache.qpid.server.queue.MessageGroupQueueTest#testConsumerCloseGroupAssignment
org.apache.qpid.server.queue.MessageGroupQueueTest#testConsumerCloseWithRelease
org.apache.qpid.server.queue.MessageGroupQueueTest#testGroupAssignmentSurvivesEmpty

// CPP Broker does not implement message conversion from 0-9-1
org.apache.qpid.server.message.MessageProtocolConversionTest#*

// passwd script is a Java Broker specific command line tool
org.apache.qpid.scripts.QpidPasswdTest#*

// QPID-3604: Immediate Prefetch no longer supported by 0-10
org.apache.qpid.client.AsynchMessageListenerTest#testImmediatePrefetchWithMessageListener

// QPID-3936: Exclude Performance Test Framework tests
org.apache.qpid.systest.disttest.*
org.apache.qpid.disttest.*

// Exclude java broker REST API tests
org.apache.qpid.systest.rest.*
org.apache.qpid.systest.rest.acl.*

// Exclude failover tests requiring virtual host functionality
org.apache.qpid.client.failover.MultipleBrokersFailoverTest#*

// Uses Java broker specific configuration
org.apache.qpid.client.ssl.SSLTest#testClientCertMissingWhilstWanting

// QPID-2796 : Java 0-10 client only sends heartbeats in response to heartbeats from the server, not timeout based
org.apache.qpid.client.HeartbeatTest#testReadOnlyConnectionHeartbeats

