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

org.apache.qpid.server.transport.TCPandSSLTransportTest#*

# Transformer on IBM JDK has different whitespace behaviour
org.apache.qpid.disttest.results.ResultsXmlWriterTest#*

# THe IBMJSSE2 trust factory (IbmX509) validates the entire certificate chain, including trusted certificates.
# https://www.ibm.com/support/knowledgecenter/en/SSYKE2_8.0.0/com.ibm.java.security.component.80.doc/security-component/jsse2Docs/knowndiffsun.html
org.apache.qpid.server.security.FileTrustStoreTest#testUseOfExpiredTrustAnchorAllowed

# (QPID-7955) Behaviourial difference between the IBM JDK and the Open JDK
# https://www.ibm.com/developerworks/community/forums/html/topic?id=8482d948-665c-47a2-862e-457e49ac71a4&ps=25
org.apache.qpid.server.logging.logback.Logback1027WorkaroundTurboFilterTest#testSuppressedExceptionRecursion
org.apache.qpid.server.logging.logback.Logback1027WorkaroundTurboFilterTest#testInitCauseRecursion

