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

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 Qpid Broker-J 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.ConsumerFlowControlTest#*

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

// CPP Broker does not follow the same Logging convention as the Qpid Broker-J
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 Qpid Broker-J (not in CPP Broker)
org.apache.qpid.server.queue.ProducerFlowControlTest#*
org.apache.qpid.test.client.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 Qpid Broker-J 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 Qpid Broker-J 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#*

// Qpid Broker-J 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 Qpid Broker-J 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 Broker-J 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.*
org.apache.qpid.systest.disttest.endtoend.*

// Exclude REST API tests for Qpid Broker-J
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 Qpid Broker-J 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 Qpid Broker-J 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 Qpid Broker-J specific feature
org.apache.qpid.server.queue.QueueMessageDurabilityTest#*

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

// QPID-6000 : Tests Qpid Broker-J 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.*

//Qpid Broker-J BDB System Tests
org.apache.qpid.server.store.berkeleydb.*
org.apache.qpid.server.store.berkeleydb.replication.*
org.apache.qpid.server.virtualhostnode.berkeleydb.*

// Qpid Broker-J 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 Qpid Broker-J 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

#Node Creation Policy Tests use Qpid Broker-J Specific Config
org.apache.qpid.server.queue.NodeAutoCreationPolicyTest#*

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

#The C++ broker does not implement AMQP management
org.apache.qpid.systest.management.amqp.*

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

# Exclude the AMQP 1.0 protocol test suite
org.apache.qpid.tests.protocol.v1_0.*

org.apache.qpid.server.queue.FlowToDiskTest#*

# QPID-7818: Messages published into non existing queue are discarded on 0-10 path
org.apache.qpid.systest.AnonymousProducerTest#testPublishIntoNonExistingQueue
org.apache.qpid.systest.AnonymousProducerTest#testSyncPublishIntoNonExistingQueue

# Tests require AMQP management
org.apache.qpid.server.routing.AlternateBindingRoutingTest#*

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

# Exchange to Exchange bindings not support by CPP Broker.
org.apache.qpid.server.routing.ExchangeRoutingTest#*

# For 0-8..0-10 these tests assume that the Broker defaults to use header JMSXGroupID which is not true for the CPP Broker.
org.apache.qpid.server.queue.MessageGroupQueueTest#testSharedGroupSimpleGroupAssignmentWithJMSXGroupID
org.apache.qpid.server.queue.MessageGroupQueueTest#testSimpleGroupAssignmentWithJMSXGroupID