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

//These tests require a persistent store
org.apache.qpid.server.persistent.NoLocalAfterRecoveryTest#*
org.apache.qpid.server.store.PersistentStoreTest#*
org.apache.qpid.server.store.SplitStoreTest#*
org.apache.qpid.server.logging.AlertingTest#testAlertingReallyWorksWithRestart
org.apache.qpid.server.logging.AlertingTest#testAlertingReallyWorksWithChanges
org.apache.qpid.test.unit.ack.ClientAcknowledgeTest#testClientAckWithLargeFlusherPeriod

org.apache.qpid.test.unit.ct.DurableSubscriberTest#*

org.apache.qpid.test.unit.xa.QueueTest#testRecover
org.apache.qpid.test.unit.xa.QueueTest#testSendAndRecover
org.apache.qpid.test.unit.xa.TopicTest#testMultiMessagesDurSubCrash
org.apache.qpid.test.unit.xa.TopicTest#testDurSubCrash
org.apache.qpid.test.unit.xa.TopicTest#testRecover

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

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.berkeleydb.*
org.apache.qpid.server.store.berkeleydb.replication.*
org.apache.qpid.server.store.berkeleydb.upgrade.*
org.apache.qpid.server.virtualhostnode.berkeleydb.*

org.apache.qpid.test.unit.client.MaxDeliveryCountTest#testWhenBrokerIsRestartedAfterEnqeuingMessages

org.apache.qpid.systest.rest.VirtualHostRestTest#testRecoverVirtualHostInDesiredStateStoppedWithDescription
org.apache.qpid.systest.rest.VirtualHostRestTest#testMutateStateOfVirtualHostWithQueuesAndMessages

org.apache.qpid.systest.rest.VirtualHostNodeRestTest#testCreateAndDeleteVirtualHostNode

org.apache.qpid.client.failover.FailoverBehaviourTest#testFlowControlFlagResetOnFailover
org.apache.qpid.client.failover.FailoverBehaviourTest#testFailoverHandlerTimeoutReconnected
org.apache.qpid.server.failover.FailoverMethodTest#testNoFailover

