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

//-----------------------------------------------------
// Tests which fail, indicating a potential issue or a missing feature
//-----------------------------------------------------

// Broker side defect - not creating temp queues with prefixes

// AMQP 1.0 allows more than one txn per session, so our mechanism of installing transaction timeout tickers will need to change
org.apache.qpid.test.unit.transacted.TransactionTimeoutTest#*
org.apache.qpid.test.unit.transacted.TransactionTimeoutDisabledTest#*


// Testing behaviour of changing the topic associated with a durable subscriber
org.apache.qpid.test.unit.topic.TopicSessionTest#testSubscriptionNameReuseForDifferentTopicSingleConnection
org.apache.qpid.test.unit.topic.TopicSessionTest#testSubscriptionNameReuseForDifferentTopicTwoConnections

// the received message is being treated as an object message (because it lacks the necessary JMS annotation?)
org.apache.qpid.systest.rest.PublishMessageRestTest#testPublishMapMessage

// this test fails - likely a client bug with the modification racing the send
org.apache.qpid.test.unit.basic.BytesMessageTest#testModificationAfterSend

// This test fails with error The underlying correlation-id is not binary and so can't be returned
// however the correlation id in the incoming message was set as byte[] so the issue is within the conversion to
// the InternalMessage and back
org.apache.qpid.systest.management.amqp.AmqpManagementTest#testGetTypesOnVhostManagement


// We are allowed to consume from a temporary queue which should have been deleted
org.apache.qpid.test.unit.client.temporaryqueue.TemporaryQueueTest#testExplictTemporaryQueueDeletion

// client issue - the other tests demonstrate that it is not fulfilling the requirements of a TopicSession,
// so it shouldn't implement it ...
org.apache.qpid.test.unit.client.QueueSessionFactoryTest#testQueueSessionIsNotATopicSession
// ... and vice versa
org.apache.qpid.test.unit.client.TopicSessionFactoryTest#testTopicSessionIsNotAQueueSession
org.apache.qpid.test.unit.client.QueueSessionFactoryTest#testTopicSessionCannotCreateCreateBrowser


// No exception is thrown when attempting to consume from a deleted temp topic
org.apache.qpid.test.unit.topic.TemporaryTopicTest#testExplicitTemporaryTopicDeletion
// the temporary topic does not display topic like behaviour (only one consumer receives the message)
org.apache.qpid.test.unit.topic.TemporaryTopicTest#testMessageDeliveryUsingTemporaryTopic
// No exception is thrown when attempting to make a durable subscription to the temporary topic
org.apache.qpid.test.unit.topic.TemporaryTopicTest#testDurableSubscriptionProhibited
// Test uses AMQP 0-x ack modes and assumes the name of the queues backing subscriptions
org.apache.qpid.test.unit.topic.DurableSubscriptionTest#*

// These tests require some way to set properties on the link established by the client
org.apache.qpid.server.queue.ConsumerPriorityTest#*
org.apache.qpid.server.queue.ArrivalTimeFilterTest#*

// QPID-7603: broker side delivery count support is not complete
org.apache.qpid.test.unit.client.MaxDeliveryCountTest#*
