//
// 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: JMS 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#*
org.apache.qpid.test.client.CloseOnNoRouteForMandatoryMessageTest#*

// 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 extension for queue creation from Broker for Java
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 Broker for Java 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#*
org.apache.qpid.test.unit.topic.DurableSubscriptionTest#testUnsubscribeWhenUsingSelectorMakesTopicUnreachable
org.apache.qpid.test.unit.client.connection.ExceptionListenerTest#testExceptionListenerConnectionStopDeadlock

// 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#*
org.apache.qpid.server.store.SplitStoreTest#*

// These tests are for persistent store modules from Broker for Java
org.apache.qpid.server.store.VirtualHostMessageStoreTest#testMessagePersistence
org.apache.qpid.server.store.VirtualHostMessageStoreTest#testMessageRemoval
org.apache.qpid.server.store.VirtualHostMessageStoreTest#testBindingPersistence
org.apache.qpid.server.store.VirtualHostMessageStoreTest#testDurableBindingRemoval
org.apache.qpid.server.store.VirtualHostMessageStoreTest#testQueuePersistence
org.apache.qpid.server.store.VirtualHostMessageStoreTest#testDurableQueueRemoval
org.apache.qpid.server.store.VirtualHostMessageStoreTest#testExchangePersistence
org.apache.qpid.server.store.VirtualHostMessageStoreTest#testDurableExchangeRemoval
org.apache.qpid.server.store.VirtualHostMessageStoreTest#testQueueExchangeAndBindingCreation
org.apache.qpid.server.store.DurableConfigurationStoreTest#*

// CPP Broker does not follow the same Logging convention as the Broker for Java
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#*
org.apache.qpid.server.queue.LiveQueueOperationsTest#*

// 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 : JMS client for AMQP 0-10 has differrent error handling then 0-8 code path
org.apache.qpid.test.client.message.SelectorTest#testRuntimeSelectorError

//QPID-942 : Implemented Channel.Flow based Producer Side flow control to the Broker for Java (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 Broker for Java 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 plugins from Broker for Java are 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#*

// Broker for Java 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 Broker for Java 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

// Broker for Java has an extenstion to allow it to influence the prefix of temporary queue names
org.apache.qpid.client.TemporaryQueuePrefixTest#*

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

// Exclude REST API tests for Broker for Java
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 Broker for Java specific configuration
org.apache.qpid.client.ssl.SSLTest#testClientCertMissingWhilstWanting
org.apache.qpid.client.ssl.SSLTest#testCreateSSLandTCPonSamePort


// QPID-2796 : JMS client for AMQP 0-10 only sends heartbeats in response to heartbeats from the server, not timeout based
org.apache.qpid.client.HeartbeatTest#testUnidirectionalHeartbeating
org.apache.qpid.client.HeartbeatTest#testHeartbeatsEnabledBrokerSide

// Exclude Broker for Java specific behavior allowing queue re-bind to topic exchanges on 0.8/0-10 paths
org.apache.qpid.server.queue.QueueBindTest#testQueueCanBeReboundOnTopicExchange

// Tests queue message durability settings which are a Broker for Java specific feature
org.apache.qpid.server.queue.QueueMessageDurabilityTest#*

// QPID-4429 : C++ Broker does not enforce max frame size negotiation rules as per the spec
org.apache.qpid.transport.MaxFrameSizeTest#*

// CPP Broker does not timeout connections with no activity like the Broker for Java
org.apache.qpid.transport.ProtocolNegotiationTest#testNoProtocolHeaderSent_BrokerClosesConnection
org.apache.qpid.transport.ProtocolNegotiationTest#testNoConnectionOpenSent_BrokerClosesConnection

// QPID-6000 : Tests Java specific message compression functionality, and uses the REST API to test it
org.apache.qpid.systest.MessageCompressionTest#*


org.apache.qpid.test.unit.client.AMQSessionTest#testQueueDepthForQueueThatDoesNotExistLegacyBehaviour_08_091

org.apache.qpid.client.prefetch.PrefetchBehaviourTest#testPrefetchWindowExpandsOnReceiveTransaction

org.apache.qpid.client.SyncPublishTest#*

org.apache.qpid.server.queue.ArrivalTimeFilterTest#*
org.apache.qpid.server.queue.DefaultFiltersTest#*
org.apache.qpid.server.queue.EnsureNondestructiveConsumersTest#*
org.apache.qpid.server.protocol.v0_8.*

//Broker for Java BDB System Tests
org.apache.qpid.server.store.berkeleydb.*
org.apache.qpid.server.store.berkeleydb.replication.*

// These tests are 0-8..0-91 specific
org.apache.qpid.test.unit.basic.PropertyValueTest#testLargeHeader_08091_HeadersFillContentHeaderFrame
org.apache.qpid.test.unit.basic.PropertyValueTest#testOverlyLargeHeaderRejected_08091

// QPID-6786 Sending headers larger than [first] transfer/frame size (which is outside the spec) isn't supported against the C++ broker
org.apache.qpid.test.unit.basic.PropertyValueTest#testLargeHeader_010_HeadersFillContentHeaderFrame

# QPID-7156: Test requires a Broker with a virtualhost
org.apache.qpid.test.unit.client.connection.BrokerClosesClientConnectionTest#testClientCloseOnVirtualHostStop
