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.

Issues addressed by release:

Version 0.3.0
-------------

Version 0.2.0
-------------
Bug
  [QPIDIT-46] - Correctly encode AMQP types within complex types list and map
  [QPIDIT-79] - Stopping Python tests using ctrl+c sometimes results in a zombie shim
  [QPIDIT-85] - Tests don't limit the number of times it tries to connect to a broker
  [QPIDIT-106] - Cmake does not find custom-installed maven
  [QPIDIT-113] - AMQP.NetLite shims produce error message on stderr which should be ignored
  [QPIDIT-114] - [AMQP.NetLite] AMQP char type is not supported, but is not excluded from test
Improvement
  [QPIDIT-65] - Add command-line controls to JMS_hdrs_props_test to control test more precisely
  [QPIDIT-93] - Optionally produce xUnit XML report with test results
  [QPIDIT-109] - Add ability to run Proton Python shims under Python 3
  [QPIDIT-110] - Add check for failure of Sender shim, if so, kill Receiver shim
  [QPIDIT-112] - Change test queue prefix from "jms.queue.qpid_interop" to "qit"
  [QPIDIT-115] - Print both stderr and stdout output when stderr output is detected on a shim
Task
  [QPIDIT-37] - Add test timeout to receiver shims so that when not all expected messages are received, the test does not wait indefinitely
  [QPIDIT-61] - Condense common code from the Python tests into a test module.
  [QPIDIT-107] - Add support for JMS message properties in ProtonCpp shim
  [QPIDIT-119] - Add AMQP complex type test

Version 0.1.0
-------------
Sub-task
  [QPIDIT-36] - Allow receiver and sender to operate concurrently for operation against Dispatch Router
Bug
  [QPIDIT-24] - Broker identification failure blocks tests
  [QPIDIT-34] - Update to jsoncpp text format has broken test harness for all C++ shims
  [QPIDIT-38] - Artemis broker-added properties not handled correctly in python receive shim
  [QPIDIT-40] - Sender and Receiver threads don't stop when tests end in some error conditions
  [QPIDIT-49] - Quickstart needs to describe C++ dependencies
  [QPIDIT-50] - Large content Sender.cpp does not compile
  [QPIDIT-51] - Method needed to skip sensing broker type
  [QPIDIT-55] - Proton install dir is hard coded into cmake
  [QPIDIT-56] - Rhea installs to /usr/lib regardless of cmake install dir
  [QPIDIT-57] - Cmake installer should check for presence of Node.js and Rhea client
  [QPIDIT-66] - Shims should install into a libexec directory, not into the Python site-packages path
  [QPIDIT-67] - Compile errors after recent header cleanup in Proton C++ bindings
  [QPIDIT-69] - JMS tests fail with "Import Error: no module names jms_types"
  [QPIDIT-70] - [amqpnetlite] Receiver shim does not properly encode json results
  [QPIDIT-71] - [amqpnetlite] cmake fails to detect program mono version
  [QPIDIT-72] - [amqpnetlite] types test Receiver returns wrong value for null message
  [QPIDIT-73] - Rhea shim char type broken by recent updates to Rhea
  [QPIDIT-82] - JMS tests fail intermittently with null message
  [QPIDIT-83] - JAVA classpath points to maven repository rather than installed location
  [QPIDIT-88] - Need to specify supported AMQP types per shim
  [QPIDIT-91] - AmqpNetLite does not include large_content test
  [QPIDIT-92] - AmqpNetLite types_test Receiver compile error with Lite v2.0.0
New Feature
  [QPIDIT-21] - Add shims for C++ client
  [QPIDIT-44] - Add AMQP large content test
  [QPIDIT-62] - Add AMQP.Net Lite client shims
Improvement
  [QPIDIT-20] - Add ability to detect broker, skip tests that fail for that broker
  [QPIDIT-22] - Add ability to run on Jenkins CI
  [QPIDIT-32] - Use Maven to build Java components
  [QPIDIT-33] - Add JMS message headers and properties to test suite
  [QPIDIT-41] - Rearrange test directory structure to better organize tests and shims
  [QPIDIT-42] - Split JMS message test into two separate tests: message bodies, and message headers/properties
  [QPIDIT-53] - Eliminate use of authentication when collecting broker connection properties
  [QPIDIT-84] - Update README, QUICKSTART, add a users' guide
  [QPIDIT-95] - update to use the current v18 apache parent pom
  [QPIDIT-96] - Improvements in Java component management
  [QPIDIT-98] - Change Proton C++ Receiver shims to use latest non-deprecated API calls
Task
  [QPIDIT-1] - Initial code import
  [QPIDIT-2] - Add command-line options to control which shims and/or AMQP type combinations to run
  [QPIDIT-13] - Submit patch to Proton for AMQP type support needed by ProtonPython shim
  [QPIDIT-16] - Place Qpid JMS shim build management under Maven
  [QPIDIT-17] - Add JMS test suite
  [QPIDIT-18] - Use existing structured text representation standard for communicating between test and shims
  [QPIDIT-35] - Add Dispatch Router to Jenkins CI
  [QPIDIT-47] - Add Rhea javascript shim for AMQP types test
  [QPIDIT-48] - Add test options which allow separate addresses for the sender and receiver
  [QPIDIT-52] - Make qpid-interop-test installable
  [QPIDIT-59] - Create a HOWTO file on writing a new shim
  [QPIDIT-60] - Create a HOWTO file on writing a new test
  [QPIDIT-97] - Release qpid-interop-test 0.1.0
