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

// REST management 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 Broker for 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.*
org.apache.qpid.server.virtualhostnode.berkeleydb.*

// Broker for Java Derby Tests
org.apache.qpid.server.store.derby.*

// 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-6703 Use of Broker for Java specific queue creation arguments to properly fulfill JMS TemporaryQueue contract
org.apache.qpid.test.unit.client.temporaryqueue.TemporaryQueueTest#testClosingSessionDoesNotDeleteQueue

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

# cpp broker allows anonymous access by default
# the following test requires running broker with authentication enabled
org.apache.qpid.transport.ConnectionEstablishmentTest#testAuthenticationBypass

#Node Creation Policy Tests use Broker for Java Specific Config
org.apache.qpid.server.queue.NodeAutoCreationPolicyTest#*

# The consumer x-priority feature is Java Broker Specific
org.apache.qpid.server.queue.ConsumerPriorityTest#*
