//
// 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
org.apache.qpid.systest.rest.PublishMessageRestTest#testPublishListMessage

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


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


// The test tests something not required by the spec (see JMS 2.0 section 4.2.7). The new JMS client does not enforce this.
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#*

