You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2018/07/03 22:13:15 UTC

[26/89] [abbrv] [partial] qpid-proton git commit: PROTON-1728: Reorganize the source tree

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37136940/c/src/transactions.xml
----------------------------------------------------------------------
diff --git a/c/src/transactions.xml b/c/src/transactions.xml
new file mode 100644
index 0000000..663eb7b
--- /dev/null
+++ b/c/src/transactions.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0"?>
+
+<!--
+Copyright Bank of America, N.A., Barclays Bank PLC, Cisco Systems, Credit
+Suisse, Deutsche Boerse, Envoy Technologies Inc., Goldman Sachs, HCL
+Technologies Ltd, IIT Software GmbH, iMatix Corporation, INETCO Systems Limited,
+Informatica Corporation, JPMorgan Chase & Co., Kaazing Corporation, N.A,
+Microsoft Corporation, my-Channels, Novell, Progress Software, Red Hat Inc.,
+Software AG, Solace Systems Inc., StormMQ Ltd., Tervela Inc., TWIST Process
+Innovations Ltd, VMware, Inc., and WS02 Inc. 2006-2011. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+3. The name of the author may not be used to endorse or promote products
+derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<amqp name="transactions" xmlns="http://www.amqp.org/schema/amqp.xsd">
+  <section name="coordination">
+    <type name="coordinator" class="composite" source="list" provides="target">
+      <descriptor name="amqp:coordinator:list" code="0x00000000:0x00000030"/>
+      <field name="capabilities" type="symbol" requires="txn-capability" multiple="true"/>
+    </type>
+    <type name="declare" class="composite" source="list">
+      <descriptor name="amqp:declare:list" code="0x00000000:0x00000031"/>
+      <field name="global-id" type="*" requires="global-tx-id"/>
+    </type>
+    <type name="discharge" class="composite" source="list">
+      <descriptor name="amqp:discharge:list" code="0x00000000:0x00000032"/>
+      <field name="txn-id" type="*" mandatory="true" requires="txn-id"/>
+      <field name="fail" type="boolean"/>
+    </type>
+    <type name="transaction-id" class="restricted" source="binary" provides="txn-id"/>
+    <type name="declared" class="composite" source="list" provides="delivery-state, outcome">
+      <descriptor name="amqp:declared:list" code="0x00000000:0x00000033"/>
+      <field name="txn-id" type="*" mandatory="true" requires="txn-id"/>
+    </type>
+    <type name="transactional-state" class="composite" source="list" provides="delivery-state">
+      <descriptor name="amqp:transactional-state:list" code="0x00000000:0x00000034"/>
+      <field name="txn-id" type="*" mandatory="true" requires="txn-id"/>
+      <field name="outcome" type="*" requires="outcome"/>
+    </type>
+    <type name="txn-capability" class="restricted" source="symbol" provides="txn-capability">
+      <choice name="local-transactions" value="amqp:local-transactions"/>
+      <choice name="distributed-transactions" value="amqp:distributed-transactions"/>
+      <choice name="promotable-transactions" value="amqp:promotable-transactions"/>
+      <choice name="multi-txns-per-ssn" value="amqp:multi-txns-per-ssn"/>
+      <choice name="multi-ssns-per-txn" value="amqp:multi-ssns-per-txn"/>
+    </type>
+    <type name="transaction-error" class="restricted" source="symbol" provides="error-condition">
+      <choice name="unknown-id" value="amqp:transaction:unknown-id"/>
+      <choice name="transaction-rollback" value="amqp:transaction:rollback"/>
+      <choice name="transaction-timeout" value="amqp:transaction:timeout"/>
+    </type>
+  </section>
+</amqp>

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37136940/c/src/transport.xml
----------------------------------------------------------------------
diff --git a/c/src/transport.xml b/c/src/transport.xml
new file mode 100644
index 0000000..7ff2fd4
--- /dev/null
+++ b/c/src/transport.xml
@@ -0,0 +1,200 @@
+<?xml version="1.0"?>
+
+<!--
+Copyright Bank of America, N.A., Barclays Bank PLC, Cisco Systems, Credit
+Suisse, Deutsche Boerse, Envoy Technologies Inc., Goldman Sachs, HCL
+Technologies Ltd, IIT Software GmbH, iMatix Corporation, INETCO Systems Limited,
+Informatica Corporation, JPMorgan Chase & Co., Kaazing Corporation, N.A,
+Microsoft Corporation, my-Channels, Novell, Progress Software, Red Hat Inc.,
+Software AG, Solace Systems Inc., StormMQ Ltd., Tervela Inc., TWIST Process
+Innovations Ltd, VMware, Inc., and WS02 Inc. 2006-2011. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+3. The name of the author may not be used to endorse or promote products
+derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<amqp name="transport" xmlns="http://www.amqp.org/schema/amqp.xsd">
+  <section name="performatives">
+    <type name="open" class="composite" source="list" provides="frame">
+      <descriptor name="amqp:open:list" code="0x00000000:0x00000010"/>
+      <field name="container-id" type="string" mandatory="true"/>
+      <field name="hostname" type="string"/>
+      <field name="max-frame-size" type="uint" default="4294967295"/>
+      <field name="channel-max" type="ushort" default="65535"/>
+      <field name="idle-time-out" type="milliseconds"/>
+      <field name="outgoing-locales" type="ietf-language-tag" multiple="true"/>
+      <field name="incoming-locales" type="ietf-language-tag" multiple="true"/>
+      <field name="offered-capabilities" type="symbol" multiple="true"/>
+      <field name="desired-capabilities" type="symbol" multiple="true"/>
+      <field name="properties" type="fields"/>
+    </type>
+    <type name="begin" class="composite" source="list" provides="frame">
+      <descriptor name="amqp:begin:list" code="0x00000000:0x00000011"/>
+      <field name="remote-channel" type="ushort"/>
+      <field name="next-outgoing-id" type="transfer-number" mandatory="true"/>
+      <field name="incoming-window" type="uint" mandatory="true"/>
+      <field name="outgoing-window" type="uint" mandatory="true"/>
+      <field name="handle-max" type="handle" default="4294967295"/>
+      <field name="offered-capabilities" type="symbol" multiple="true"/>
+      <field name="desired-capabilities" type="symbol" multiple="true"/>
+      <field name="properties" type="fields"/>
+    </type>
+    <type name="attach" class="composite" source="list" provides="frame">
+      <descriptor name="amqp:attach:list" code="0x00000000:0x00000012"/>
+      <field name="name" type="string" mandatory="true"/>
+      <field name="handle" type="handle" mandatory="true"/>
+      <field name="role" type="role" mandatory="true"/>
+      <field name="snd-settle-mode" type="sender-settle-mode" default="mixed"/>
+      <field name="rcv-settle-mode" type="receiver-settle-mode" default="first"/>
+      <field name="source" type="*" requires="source"/>
+      <field name="target" type="*" requires="target"/>
+      <field name="unsettled" type="map"/>
+      <field name="incomplete-unsettled" type="boolean" default="false"/>
+      <field name="initial-delivery-count" type="sequence-no"/>
+      <field name="max-message-size" type="ulong"/>
+      <field name="offered-capabilities" type="symbol" multiple="true"/>
+      <field name="desired-capabilities" type="symbol" multiple="true"/>
+      <field name="properties" type="fields"/>
+    </type>
+    <type name="flow" class="composite" source="list" provides="frame">
+      <descriptor name="amqp:flow:list" code="0x00000000:0x00000013"/>
+      <field name="next-incoming-id" type="transfer-number"/>
+      <field name="incoming-window" type="uint" mandatory="true"/>
+      <field name="next-outgoing-id" type="transfer-number" mandatory="true"/>
+      <field name="outgoing-window" type="uint" mandatory="true"/>
+      <field name="handle" type="handle"/>
+      <field name="delivery-count" type="sequence-no"/>
+      <field name="link-credit" type="uint"/>
+      <field name="available" type="uint"/>
+      <field name="drain" type="boolean" default="false"/>
+      <field name="echo" type="boolean" default="false"/>
+      <field name="properties" type="fields"/>
+    </type>
+    <type name="transfer" class="composite" source="list" provides="frame">
+      <descriptor name="amqp:transfer:list" code="0x00000000:0x00000014"/>
+      <field name="handle" type="handle" mandatory="true"/>
+      <field name="delivery-id" type="delivery-number"/>
+      <field name="delivery-tag" type="delivery-tag"/>
+      <field name="message-format" type="message-format"/>
+      <field name="settled" type="boolean"/>
+      <field name="more" type="boolean" default="false"/>
+      <field name="rcv-settle-mode" type="receiver-settle-mode"/>
+      <field name="state" type="*" requires="delivery-state"/>
+      <field name="resume" type="boolean" default="false"/>
+      <field name="aborted" type="boolean" default="false"/>
+      <field name="batchable" type="boolean" default="false"/>
+    </type>
+    <type name="disposition" class="composite" source="list" provides="frame">
+      <descriptor name="amqp:disposition:list" code="0x00000000:0x00000015"/>
+      <field name="role" type="role" mandatory="true"/>
+      <field name="first" type="delivery-number" mandatory="true"/>
+      <field name="last" type="delivery-number"/>
+      <field name="settled" type="boolean" default="false"/>
+      <field name="state" type="*" requires="delivery-state"/>
+      <field name="batchable" type="boolean" default="false"/>
+    </type>
+    <type name="detach" class="composite" source="list" provides="frame">
+      <descriptor name="amqp:detach:list" code="0x00000000:0x00000016"/>
+      <field name="handle" type="handle" mandatory="true"/>
+      <field name="closed" type="boolean" default="false"/>
+      <field name="error" type="error"/>
+    </type>
+    <type name="end" class="composite" source="list" provides="frame">
+      <descriptor name="amqp:end:list" code="0x00000000:0x00000017"/>
+      <field name="error" type="error"/>
+    </type>
+    <type name="close" class="composite" source="list" provides="frame">
+      <descriptor name="amqp:close:list" code="0x00000000:0x00000018"/>
+      <field name="error" type="error"/>
+    </type>
+  </section>
+  <section name="definitions">
+    <type name="role" class="restricted" source="boolean">
+      <choice name="sender" value="false"/>
+      <choice name="receiver" value="true"/>
+    </type>
+    <type name="sender-settle-mode" class="restricted" source="ubyte">
+      <choice name="unsettled" value="0"/>
+      <choice name="settled" value="1"/>
+      <choice name="mixed" value="2"/>
+    </type>
+    <type name="receiver-settle-mode" class="restricted" source="ubyte">
+      <choice name="first" value="0"/>
+      <choice name="second" value="1"/>
+    </type>
+    <type name="handle" class="restricted" source="uint"/>
+    <type name="seconds" class="restricted" source="uint"/>
+    <type name="milliseconds" class="restricted" source="uint"/>
+    <type name="delivery-tag" class="restricted" source="binary"/>
+    <type name="delivery-number" class="restricted" source="sequence-no"/>
+    <type name="transfer-number" class="restricted" source="sequence-no"/>
+    <type name="sequence-no" class="restricted" source="uint"/>
+    <type name="message-format" class="restricted" source="uint"/>
+    <type name="ietf-language-tag" class="restricted" source="symbol"/>
+    <type name="fields" class="restricted" source="map"/>
+    <type name="error" class="composite" source="list">
+      <descriptor name="amqp:error:list" code="0x00000000:0x0000001d"/>
+      <field name="condition" type="symbol" mandatory="true" requires="error-condition"/>
+      <field name="description" type="string"/>
+      <field name="info" type="fields"/>
+    </type>
+    <type name="amqp-error" class="restricted" source="symbol" provides="error-condition">
+      <choice name="internal-error" value="amqp:internal-error"/>
+      <choice name="not-found" value="amqp:not-found"/>
+      <choice name="unauthorized-access" value="amqp:unauthorized-access"/>
+      <choice name="decode-error" value="amqp:decode-error"/>
+      <choice name="resource-limit-exceeded" value="amqp:resource-limit-exceeded"/>
+      <choice name="not-allowed" value="amqp:not-allowed"/>
+      <choice name="invalid-field" value="amqp:invalid-field"/>
+      <choice name="not-implemented" value="amqp:not-implemented"/>
+      <choice name="resource-locked" value="amqp:resource-locked"/>
+      <choice name="precondition-failed" value="amqp:precondition-failed"/>
+      <choice name="resource-deleted" value="amqp:resource-deleted"/>
+      <choice name="illegal-state" value="amqp:illegal-state"/>
+      <choice name="frame-size-too-small" value="amqp:frame-size-too-small"/>
+    </type>
+    <type name="connection-error" class="restricted" source="symbol" provides="error-condition">
+      <choice name="connection-forced" value="amqp:connection:forced"/>
+      <choice name="framing-error" value="amqp:connection:framing-error"/>
+      <choice name="redirect" value="amqp:connection:redirect"/>
+    </type>
+    <type name="session-error" class="restricted" source="symbol" provides="error-condition">
+      <choice name="window-violation" value="amqp:session:window-violation"/>
+      <choice name="errant-link" value="amqp:session:errant-link"/>
+      <choice name="handle-in-use" value="amqp:session:handle-in-use"/>
+      <choice name="unattached-handle" value="amqp:session:unattached-handle"/>
+    </type>
+    <type name="link-error" class="restricted" source="symbol" provides="error-condition">
+      <choice name="detach-forced" value="amqp:link:detach-forced"/>
+      <choice name="transfer-limit-exceeded" value="amqp:link:transfer-limit-exceeded"/>
+      <choice name="message-size-exceeded" value="amqp:link:message-size-exceeded"/>
+      <choice name="redirect" value="amqp:link:redirect"/>
+      <choice name="stolen" value="amqp:link:stolen"/>
+    </type>
+    <definition name="PORT" value="5672"/>
+    <definition name="SECURE-PORT" value="5671"/>
+    <definition name="MAJOR" value="1"/>
+    <definition name="MINOR" value="0"/>
+    <definition name="REVISION" value="0"/>
+    <definition name="MIN-MAX-FRAME-SIZE" value="512"/>
+  </section>
+</amqp>

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37136940/c/src/types.xml
----------------------------------------------------------------------
diff --git a/c/src/types.xml b/c/src/types.xml
new file mode 100644
index 0000000..4aa9c0f
--- /dev/null
+++ b/c/src/types.xml
@@ -0,0 +1,125 @@
+<?xml version="1.0"?>
+
+<!--
+Copyright Bank of America, N.A., Barclays Bank PLC, Cisco Systems, Credit
+Suisse, Deutsche Boerse, Envoy Technologies Inc., Goldman Sachs, HCL
+Technologies Ltd, IIT Software GmbH, iMatix Corporation, INETCO Systems Limited,
+Informatica Corporation, JPMorgan Chase & Co., Kaazing Corporation, N.A,
+Microsoft Corporation, my-Channels, Novell, Progress Software, Red Hat Inc.,
+Software AG, Solace Systems Inc., StormMQ Ltd., Tervela Inc., TWIST Process
+Innovations Ltd, VMware, Inc., and WS02 Inc. 2006-2011. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+3. The name of the author may not be used to endorse or promote products
+derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<amqp name="types" xmlns="http://www.amqp.org/schema/amqp.xsd">
+  <section name="encodings">
+    <type name="null" class="primitive">
+      <encoding code="0x40" category="fixed" width="0"/>
+    </type>
+    <type name="boolean" class="primitive">
+      <encoding code="0x56" category="fixed" width="1"/>
+      <encoding name="true" code="0x41" category="fixed" width="0"/>
+      <encoding name="false" code="0x42" category="fixed" width="0"/>
+    </type>
+    <type name="ubyte" class="primitive">
+      <encoding code="0x50" category="fixed" width="1"/>
+    </type>
+    <type name="ushort" class="primitive">
+      <encoding code="0x60" category="fixed" width="2"/>
+    </type>
+    <type name="uint" class="primitive">
+      <encoding code="0x70" category="fixed" width="4"/>
+      <encoding name="smalluint" code="0x52" category="fixed" width="1"/>
+      <encoding name="uint0" code="0x43" category="fixed" width="0"/>
+    </type>
+    <type name="ulong" class="primitive">
+      <encoding code="0x80" category="fixed" width="8"/>
+      <encoding name="smallulong" code="0x53" category="fixed" width="1"/>
+      <encoding name="ulong0" code="0x44" category="fixed" width="0"/>
+    </type>
+    <type name="byte" class="primitive">
+      <encoding code="0x51" category="fixed" width="1"/>
+    </type>
+    <type name="short" class="primitive">
+      <encoding code="0x61" category="fixed" width="2"/>
+    </type>
+    <type name="int" class="primitive">
+      <encoding code="0x71" category="fixed" width="4"/>
+      <encoding name="smallint" code="0x54" category="fixed" width="1"/>
+    </type>
+    <type name="long" class="primitive">
+      <encoding code="0x81" category="fixed" width="8"/>
+      <encoding name="smalllong" code="0x55" category="fixed" width="1"/>
+    </type>
+    <type name="float" class="primitive">
+      <encoding name="ieee-754" code="0x72" category="fixed" width="4"/>
+    </type>
+    <type name="double" class="primitive">
+      <encoding name="ieee-754" code="0x82" category="fixed" width="8"/>
+    </type>
+    <type name="decimal32" class="primitive">
+      <encoding name="ieee-754" code="0x74" category="fixed" width="4"/>
+    </type>
+    <type name="decimal64" class="primitive">
+      <encoding name="ieee-754" code="0x84" category="fixed" width="8"/>
+    </type>
+    <type name="decimal128" class="primitive">
+      <encoding name="ieee-754" code="0x94" category="fixed" width="16"/>
+    </type>
+    <type name="char" class="primitive">
+      <encoding name="utf32" code="0x73" category="fixed" width="4"/>
+    </type>
+    <type name="timestamp" class="primitive">
+      <encoding name="ms64" code="0x83" category="fixed" width="8"/>
+    </type>
+    <type name="uuid" class="primitive">
+      <encoding code="0x98" category="fixed" width="16"/>
+    </type>
+    <type name="binary" class="primitive">
+      <encoding name="vbin8" code="0xa0" category="variable" width="1"/>
+      <encoding name="vbin32" code="0xb0" category="variable" width="4"/>
+    </type>
+    <type name="string" class="primitive">
+      <encoding name="str8-utf8" code="0xa1" category="variable" width="1"/>
+      <encoding name="str32-utf8" code="0xb1" category="variable" width="4"/>
+    </type>
+    <type name="symbol" class="primitive">
+      <encoding name="sym8" code="0xa3" category="variable" width="1"/>
+      <encoding name="sym32" code="0xb3" category="variable" width="4"/>
+    </type>
+    <type name="list" class="primitive">
+      <encoding name="list0" code="0x45" category="fixed" width="0"/>
+      <encoding name="list8" code="0xc0" category="compound" width="1"/>
+      <encoding name="list32" code="0xd0" category="compound" width="4"/>
+    </type>
+    <type name="map" class="primitive">
+      <encoding name="map8" code="0xc1" category="compound" width="1"/>
+      <encoding name="map32" code="0xd1" category="compound" width="4"/>
+    </type>
+    <type name="array" class="primitive">
+      <encoding name="array8" code="0xe0" category="array" width="1"/>
+      <encoding name="array32" code="0xf0" category="array" width="4"/>
+    </type>
+  </section>
+</amqp>

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37136940/c/tests/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/c/tests/CMakeLists.txt b/c/tests/CMakeLists.txt
new file mode 100644
index 0000000..3b43fc8
--- /dev/null
+++ b/c/tests/CMakeLists.txt
@@ -0,0 +1,66 @@
+#
+# 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.
+#
+
+add_definitions(${COMPILE_WARNING_FLAGS} ${COMPILE_PLATFORM_FLAGS})
+
+configure_file(test_config.h.in test_config.h)
+include_directories(${CMAKE_CURRENT_BINARY_DIR})
+
+macro (pn_add_c_test test)
+  add_executable (${test} ${ARGN})
+  target_link_libraries (${test} qpid-proton-core ${PLATFORM_LIBS})
+  if (BUILD_WITH_CXX)
+    set_source_files_properties (${ARGN} PROPERTIES LANGUAGE CXX)
+  endif (BUILD_WITH_CXX)
+  add_test (NAME ${test}
+    COMMAND ${PN_ENV_SCRIPT} -- "PATH=$<TARGET_FILE_DIR:qpid-proton-core>" ${memcheck-cmd} $<TARGET_FILE:${test}>)
+endmacro(pn_add_c_test)
+
+pn_add_c_test (c-object-tests object.c)
+pn_add_c_test (c-message-tests message.c)
+pn_add_c_test (c-engine-tests engine.c)
+pn_add_c_test (c-refcount-tests refcount.c)
+pn_add_c_test (c-event-tests event.c)
+pn_add_c_test (c-data-tests data.c)
+pn_add_c_test (c-condition-tests condition.c)
+pn_add_c_test (c-connection-driver-tests connection_driver.c)
+pn_add_c_test (c-ssl-tests ssl.c)
+
+pn_add_c_test (c-parse-url-tests parse-url.c)
+target_link_libraries (c-parse-url-tests qpid-proton)
+
+if(HAS_PROACTOR)
+  pn_add_c_test (c-proactor-tests proactor.c)
+  target_link_libraries (c-proactor-tests qpid-proton-proactor)
+
+  if(WIN32)
+    set(path "$<TARGET_FILE_DIR:c-broker>\\;$<TARGET_FILE_DIR:qpid-proton>")
+  else(WIN32)
+    set(path "$<TARGET_FILE_DIR:c-broker>:$ENV{PATH}")
+  endif(WIN32)
+  # Add the tools directory for the 'proctest' module
+  set_search_path(pypath "${CMAKE_SOURCE_DIR}/tools/python" "$ENV{PYTHON_PATH}")
+
+  add_test(NAME c-fdlimit-tests COMMAND ${PN_ENV_SCRIPT} -- "PATH=${path}" "PYTHONPATH=${pypath}" ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/fdlimit.py)
+endif(HAS_PROACTOR)
+
+# fuzz tests: tests/fuzz
+if (ENABLE_FUZZ_TESTING)
+  add_subdirectory(fuzz)
+endif (ENABLE_FUZZ_TESTING)

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37136940/c/tests/condition.c
----------------------------------------------------------------------
diff --git a/c/tests/condition.c b/c/tests/condition.c
new file mode 100644
index 0000000..5ecc263
--- /dev/null
+++ b/c/tests/condition.c
@@ -0,0 +1,56 @@
+/*
+ * 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.
+ */
+
+#include <proton/condition.h>
+#include <proton/connection.h>
+#include <stdio.h>
+#include <string.h>
+
+static int fail = 0;
+
+#define TEST_ASSERT(B)                                  \
+    if(!(B)) {                                          \
+        ++fail;                                         \
+        printf("%s:%d %s\n", __FILE__, __LINE__ , #B); \
+    }
+
+int main(int argc, char **argv) {
+    pn_connection_t *c = pn_connection();
+    pn_condition_t *cond = pn_connection_condition(c);
+
+    // Verify empty
+    TEST_ASSERT(!pn_condition_is_set(cond));
+    TEST_ASSERT(!pn_condition_get_name(cond));
+    TEST_ASSERT(!pn_condition_get_description(cond));
+
+    // Format a condition
+    pn_condition_format(cond, "foo", "hello %d", 42);
+    TEST_ASSERT(pn_condition_is_set(cond));
+    TEST_ASSERT(strcmp("foo", pn_condition_get_name(cond)) == 0);
+    TEST_ASSERT(strcmp("hello 42", pn_condition_get_description(cond)) == 0);
+
+    // Clear and verify empty
+    pn_condition_clear(cond);
+    TEST_ASSERT(!pn_condition_is_set(cond));
+    TEST_ASSERT(!pn_condition_get_name(cond));
+    TEST_ASSERT(!pn_condition_get_description(cond));
+
+    pn_connection_free(c);
+    return fail;
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37136940/c/tests/connection_driver.c
----------------------------------------------------------------------
diff --git a/c/tests/connection_driver.c b/c/tests/connection_driver.c
new file mode 100644
index 0000000..f152e89
--- /dev/null
+++ b/c/tests/connection_driver.c
@@ -0,0 +1,394 @@
+/*
+ * 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.
+ */
+
+
+#include "test_handler.h"
+#include <proton/codec.h>
+#include <proton/connection_driver.h>
+#include <proton/connection.h>
+#include <proton/delivery.h>
+#include <proton/message.h>
+#include <proton/session.h>
+#include <proton/link.h>
+
+/* Handler that replies to REMOTE_OPEN, stores the opened object on the handler */
+static pn_event_type_t open_handler(test_handler_t *th, pn_event_t *e) {
+  switch (pn_event_type(e)) {
+   case PN_CONNECTION_REMOTE_OPEN:
+    th->connection = pn_event_connection(e);
+    pn_connection_open(th->connection);
+    break;
+   case PN_SESSION_REMOTE_OPEN:
+    th->session =  pn_event_session(e);
+    pn_session_open(th->session);
+    break;
+   case PN_LINK_REMOTE_OPEN:
+    th->link = pn_event_link(e);
+    pn_link_open(th->link);
+    break;
+   default:
+    break;
+  }
+  return PN_EVENT_NONE;
+}
+
+/* Handler that returns control on PN_DELIVERY and stores the delivery on the handler */
+static pn_event_type_t delivery_handler(test_handler_t *th, pn_event_t *e) {
+  switch (pn_event_type(e)) {
+   case PN_DELIVERY: {
+     th->delivery = pn_event_delivery(e);
+    return PN_DELIVERY;
+   }
+   default:
+    return open_handler(th, e);
+  }
+}
+
+/* Blow-by-blow event verification of a single message transfer */
+static void test_message_transfer(test_t *t) {
+  test_connection_driver_t client, server;
+  test_connection_driver_init(&client, t, open_handler, NULL);
+  test_connection_driver_init(&server, t, delivery_handler, NULL);
+  pn_transport_set_server(server.driver.transport);
+
+  pn_connection_open(client.driver.connection);
+  pn_session_t *ssn = pn_session(client.driver.connection);
+  pn_session_open(ssn);
+  pn_link_t *snd = pn_sender(ssn, "x");
+  pn_link_open(snd);
+  test_connection_drivers_run(&client, &server);
+
+  TEST_HANDLER_EXPECT(
+    &client.handler,
+    PN_CONNECTION_INIT, PN_CONNECTION_LOCAL_OPEN,
+    PN_SESSION_INIT, PN_SESSION_LOCAL_OPEN,
+    PN_LINK_INIT, PN_LINK_LOCAL_OPEN,
+    PN_CONNECTION_BOUND, PN_CONNECTION_REMOTE_OPEN, PN_SESSION_REMOTE_OPEN, PN_LINK_REMOTE_OPEN,
+    0);
+
+  TEST_HANDLER_EXPECT(
+    &server.handler,
+    PN_CONNECTION_INIT, PN_CONNECTION_BOUND, PN_CONNECTION_REMOTE_OPEN,
+    PN_SESSION_INIT, PN_SESSION_REMOTE_OPEN,
+    PN_LINK_INIT, PN_LINK_REMOTE_OPEN,
+    PN_CONNECTION_LOCAL_OPEN, PN_TRANSPORT,
+    PN_SESSION_LOCAL_OPEN, PN_TRANSPORT,
+    PN_LINK_LOCAL_OPEN, PN_TRANSPORT,
+    0);
+
+  pn_link_t *rcv = server.handler.link;
+  TEST_CHECK(t, rcv);
+  TEST_CHECK(t, pn_link_is_receiver(rcv));
+  pn_link_flow(rcv, 1);
+  test_connection_drivers_run(&client, &server);
+  TEST_HANDLER_EXPECT(&client.handler, PN_LINK_FLOW, 0);
+
+  /* Encode and send a message */
+  pn_message_t *m = pn_message();
+  pn_data_put_string(pn_message_body(m), pn_bytes(4, "abc")); /* Include trailing NULL */
+  pn_rwbytes_t buf = { 0 };
+  ssize_t size = message_encode(m, &buf);
+  pn_message_free(m);
+  pn_delivery(snd, PN_BYTES_LITERAL(x));
+  TEST_INT_EQUAL(t, size, pn_link_send(snd, buf.start, size));
+  TEST_CHECK(t, pn_link_advance(snd));
+  test_connection_drivers_run(&client, &server);
+  TEST_HANDLER_EXPECT(&server.handler, PN_TRANSPORT, PN_DELIVERY, 0);
+
+  /* Receive and decode the message */
+  pn_delivery_t *dlv = server.handler.delivery;
+  TEST_ASSERT(dlv);
+  pn_message_t *m2 = pn_message();
+  pn_rwbytes_t buf2 = { 0 };
+  message_decode(m2, dlv, &buf2);
+  pn_data_t *body = pn_message_body(m2);
+  pn_data_rewind(body);
+  TEST_CHECK(t, pn_data_next(body));
+  TEST_CHECK(t, PN_STRING == pn_data_type(body));
+  TEST_CHECK(t, 4 == pn_data_get_string(pn_message_body(m2)).size);
+  TEST_STR_EQUAL(t, "abc", pn_data_get_string(pn_message_body(m2)).start);
+  pn_message_free(m2);
+
+  free(buf.start);
+  free(buf2.start);
+  test_connection_driver_destroy(&client);
+  test_connection_driver_destroy(&server);
+}
+
+/* Handler that opens a connection and sender link */
+pn_event_type_t send_client_handler(test_handler_t *th, pn_event_t *e) {
+  switch (pn_event_type(e)) {
+   case PN_CONNECTION_LOCAL_OPEN: {
+    pn_connection_open(pn_event_connection(e));
+    pn_session_t *ssn = pn_session(pn_event_connection(e));
+    pn_session_open(ssn);
+    pn_link_t *snd = pn_sender(ssn, "x");
+    pn_link_open(snd);
+    break;
+   }
+   case PN_LINK_REMOTE_OPEN: {
+    th->link = pn_event_link(e);
+    return PN_LINK_REMOTE_OPEN;
+   }
+   default:
+    break;
+  }
+  return PN_EVENT_NONE;
+}
+
+/* Send a message in pieces, ensure each can be received before the next is sent */
+static void test_message_stream(test_t *t) {
+  /* Set up the link, give credit, start the delivery */
+  test_connection_driver_t client, server;
+  test_connection_driver_init(&client, t, send_client_handler, NULL);
+  test_connection_driver_init(&server, t, delivery_handler, NULL);
+  pn_transport_set_server(server.driver.transport);
+
+  pn_connection_open(client.driver.connection);
+  test_connection_drivers_run(&client, &server);
+  pn_link_t *rcv = server.handler.link;
+  pn_link_t *snd = client.handler.link;
+  pn_link_flow(rcv, 1);
+  test_connection_drivers_run(&client, &server);
+  TEST_HANDLER_EXPECT_LAST(&client.handler, PN_LINK_FLOW);
+  TEST_HANDLER_EXPECT_LAST(&server.handler, PN_TRANSPORT);
+
+  /* Encode a large (not very) message to send in chunks */
+  pn_message_t *m = pn_message();
+  char body[1024] = { 0 };
+  pn_data_put_binary(pn_message_body(m), pn_bytes(sizeof(body), body));
+  pn_rwbytes_t buf = { 0 };
+  ssize_t size = message_encode(m, &buf);
+
+  /* Send and receive the message in chunks */
+  static const ssize_t CHUNK = 100;
+  pn_delivery(snd, PN_BYTES_LITERAL(x));
+  pn_rwbytes_t buf2 = { 0 };
+  ssize_t received = 0;
+  for (ssize_t i = 0; i < size; i += CHUNK) {
+    /* Send a chunk */
+    ssize_t c = (i+CHUNK < size) ? CHUNK : size - i;
+    TEST_CHECK(t, c == pn_link_send(snd, buf.start + i, c));
+    test_connection_drivers_run(&client, &server);
+    TEST_HANDLER_EXPECT_LAST(&server.handler, PN_DELIVERY);
+    /* Receive a chunk */
+    pn_delivery_t *dlv = server.handler.delivery;
+    pn_link_t *l = pn_delivery_link(dlv);
+    ssize_t dsize = pn_delivery_pending(dlv);
+    rwbytes_ensure(&buf2, received+dsize);
+    TEST_ASSERT(dsize == pn_link_recv(l, buf2.start + received, dsize));
+    received += dsize;
+  }
+  TEST_CHECK(t, pn_link_advance(snd));
+  TEST_CHECK(t, received == size);
+  TEST_CHECK(t, !memcmp(buf.start, buf2.start, size));
+
+  pn_message_free(m);
+  free(buf.start);
+  free(buf2.start);
+  test_connection_driver_destroy(&client);
+  test_connection_driver_destroy(&server);
+}
+
+// Test aborting a delivery
+static void test_message_abort(test_t *t) {
+  /* Set up the link, give credit, start the delivery */
+  test_connection_driver_t client, server;
+  test_connection_driver_init(&client, t, send_client_handler, NULL);
+  test_connection_driver_init(&server, t, delivery_handler, NULL);
+  pn_transport_set_server(server.driver.transport);
+  pn_connection_open(client.driver.connection);
+
+  test_connection_drivers_run(&client, &server);
+  pn_link_t *rcv = server.handler.link;
+  pn_link_t *snd = client.handler.link;
+  char data[100] = {0};          /* Dummy data to send. */
+  char rbuf[sizeof(data)] = {0}; /* Read buffer for incoming data. */
+
+  /* Send 2 frames with data */
+  pn_link_flow(rcv, 1);
+  TEST_INT_EQUAL(t, 1, pn_link_credit(rcv));
+  test_connection_drivers_run(&client, &server);
+  TEST_INT_EQUAL(t, 1, pn_link_credit(snd));
+  pn_delivery_t *sd = pn_delivery(snd, PN_BYTES_LITERAL(1)); /* Sender delivery */
+  for (size_t i = 0; i < 2; ++i) {
+    TEST_INT_EQUAL(t, sizeof(data), pn_link_send(snd, data, sizeof(data)));
+    test_connection_drivers_run(&client, &server);
+    TEST_HANDLER_EXPECT_LAST(&server.handler, PN_DELIVERY);
+    pn_delivery_t *rd = server.handler.delivery;
+    TEST_CHECK(t, !pn_delivery_aborted(rd));
+    TEST_CHECK(t, pn_delivery_partial(rd));
+    TEST_INT_EQUAL(t, 1, pn_link_credit(rcv));
+    TEST_INT_EQUAL(t, sizeof(data), pn_delivery_pending(rd));
+    TEST_INT_EQUAL(t, sizeof(rbuf), pn_link_recv(pn_delivery_link(rd), rbuf, sizeof(rbuf)));
+    TEST_INT_EQUAL(t, 0, pn_link_recv(pn_delivery_link(rd), rbuf, sizeof(rbuf)));
+    TEST_INT_EQUAL(t, 1, pn_link_credit(rcv));
+  }
+  TEST_INT_EQUAL(t, 1, pn_link_credit(snd));
+  /* Abort the delivery */
+  pn_delivery_abort(sd);
+  TEST_INT_EQUAL(t, 0, pn_link_credit(snd));
+  TEST_CHECK(t, pn_link_current(snd) != sd); /* Settled */
+  test_connection_drivers_run(&client, &server);
+  TEST_HANDLER_EXPECT_LAST(&server.handler, PN_DELIVERY);
+  TEST_INT_EQUAL(t, 0, pn_link_credit(snd));
+
+  /* Receive the aborted=true frame, should be empty */
+  pn_delivery_t *rd = server.handler.delivery;
+  TEST_CHECK(t, pn_delivery_aborted(rd));
+  TEST_CHECK(t, !pn_delivery_partial(rd)); /* Aborted deliveries are never partial */
+  TEST_CHECK(t, pn_delivery_settled(rd)); /* Aborted deliveries are remote settled */
+  TEST_INT_EQUAL(t, 1, pn_delivery_pending(rd));
+  TEST_INT_EQUAL(t, PN_ABORTED, pn_link_recv(pn_delivery_link(rd), rbuf, sizeof(rbuf)));
+  pn_delivery_settle(rd);       /* Must be settled locally to free it */
+
+  TEST_INT_EQUAL(t, 0, pn_link_credit(snd));
+  TEST_INT_EQUAL(t, 0, pn_link_credit(rcv));
+
+  /* Abort a delivery before any data has been framed, should be dropped. */
+  pn_link_flow(rcv, 1);
+  TEST_INT_EQUAL(t, 1, pn_link_credit(rcv));
+  test_connection_drivers_run(&client, &server);
+  test_handler_clear(&client.handler, 0);
+  test_handler_clear(&server.handler, 0);
+
+  sd = pn_delivery(snd, PN_BYTES_LITERAL(x));
+  TEST_INT_EQUAL(t, sizeof(data), pn_link_send(snd, data, sizeof(data)));
+  pn_delivery_abort(sd);
+  TEST_CHECK(t, pn_link_current(snd) != sd); /* Settled, possibly freed */
+  test_connection_drivers_run(&client, &server);
+  TEST_HANDLER_EXPECT(&server.handler, 0); /* Expect no delivery at the server */
+  /* Client gets transport/flow after abort to ensure other messages are sent */
+  TEST_HANDLER_EXPECT(&client.handler, PN_TRANSPORT, PN_LINK_FLOW, 0);
+  /* Aborted delivery consumes no credit */
+  TEST_INT_EQUAL(t, 1, pn_link_credit(rcv));
+  TEST_INT_EQUAL(t, 1, pn_link_credit(snd));
+
+  test_connection_driver_destroy(&client);
+  test_connection_driver_destroy(&server);
+}
+
+
+int send_receive_message(test_t *t, const char* tag,
+                         test_connection_driver_t *src, test_connection_driver_t *dst)
+{
+  int errors = t->errors;
+  char data[100] = {0};          /* Dummy data to send. */
+  strncpy(data, tag, sizeof(data));
+  data[99] = 0; /* Ensure terminated as we strcmp this later*/
+
+  if (!TEST_CHECK(t, pn_link_credit(src->handler.link))) return 1;
+
+  pn_delivery_t *sd = pn_delivery(src->handler.link, pn_dtag(tag, strlen(tag)));
+  dst->handler.delivery = NULL;
+  TEST_CHECK(t, pn_delivery_current(sd));
+  TEST_INT_EQUAL(t, sizeof(data), pn_link_send(src->handler.link, data, sizeof(data)));
+  pn_delivery_settle(sd);
+  test_connection_drivers_run(src, dst);
+  pn_delivery_t *rd = dst->handler.delivery;
+  dst->handler.delivery = NULL;
+  if (!TEST_CHECK(t, rd)) return 1;
+
+  TEST_CHECK(t, pn_delivery_current(rd));
+  char rbuf[sizeof(data)] = {0}; /* Read buffer for incoming data. */
+  TEST_INT_EQUAL(t, sizeof(rbuf), pn_link_recv(pn_delivery_link(rd), rbuf, sizeof(rbuf)));
+  TEST_STR_EQUAL(t, data, rbuf);
+  pn_delivery_settle(rd);
+  return t->errors > errors;
+}
+
+#define SEND_RECEIVE_MESSAGE(T, TAG, SRC, DST)                  \
+  TEST_INT_EQUAL(T, 0, send_receive_message(T, TAG, SRC, DST))
+
+// Test mixing aborted and good deliveries, make sure credit is correct.
+static void test_message_abort_mixed(test_t *t) {
+  /* Set up the link, give credit, start the delivery */
+  test_connection_driver_t client, server;
+  test_connection_driver_init(&client, t, send_client_handler, NULL);
+  test_connection_driver_init(&server, t, delivery_handler, NULL);
+  pn_transport_set_server(server.driver.transport);
+  pn_connection_open(client.driver.connection);
+
+  test_connection_drivers_run(&client, &server);
+  pn_link_t *rcv = server.handler.link;
+  pn_link_t *snd = client.handler.link;
+  char data[100] = {0};          /* Dummy data to send. */
+  char rbuf[sizeof(data)] = {0}; /* Read buffer for incoming data. */
+
+  /* We will send 3 good messages, interleaved with aborted ones */
+  pn_link_flow(rcv, 5);
+  test_connection_drivers_run(&client, &server);
+  SEND_RECEIVE_MESSAGE(t, "one", &client, &server);
+  TEST_INT_EQUAL(t, 4, pn_link_credit(snd));
+  TEST_INT_EQUAL(t, 4, pn_link_credit(rcv));
+  pn_delivery_t *sd, *rd;
+
+  /* Send a frame, then an abort */
+  sd = pn_delivery(snd, PN_BYTES_LITERAL("x1"));
+  server.handler.delivery = NULL;
+  TEST_INT_EQUAL(t, sizeof(data), pn_link_send(snd, data, sizeof(data)));
+  TEST_INT_EQUAL(t, 4, pn_link_credit(snd)); /* Nothing sent yet */
+  test_connection_drivers_run(&client, &server);
+  rd = server.handler.delivery;
+  if (!TEST_CHECK(t, rd)) goto cleanup;
+  TEST_INT_EQUAL(t, sizeof(rbuf), pn_link_recv(pn_delivery_link(rd), rbuf, sizeof(rbuf)));
+
+  pn_delivery_abort(sd);
+  test_connection_drivers_run(&client, &server);
+  TEST_CHECK(t, pn_delivery_aborted(rd));
+  pn_delivery_settle(rd);
+  /* Abort after sending data consumes credit */
+  TEST_INT_EQUAL(t, 3, pn_link_credit(snd));
+  TEST_INT_EQUAL(t, 3, pn_link_credit(rcv));
+
+  SEND_RECEIVE_MESSAGE(t, "two", &client, &server);
+  TEST_INT_EQUAL(t, 2, pn_link_credit(snd));
+  TEST_INT_EQUAL(t, 2, pn_link_credit(rcv));
+
+  /* Abort a delivery before any data has been framed, should be dropped. */
+  test_handler_clear(&server.handler, 0);
+  sd = pn_delivery(snd, PN_BYTES_LITERAL(4));
+  TEST_INT_EQUAL(t, sizeof(data), pn_link_send(snd, data, sizeof(data)));
+  pn_delivery_abort(sd);
+  TEST_CHECK(t, pn_link_current(snd) != sd); /* Advanced */
+  test_connection_drivers_run(&client, &server);
+  TEST_HANDLER_EXPECT(&server.handler, PN_TRANSPORT, 0);
+  /* Aborting wit no frames sent should leave credit untouched */
+  TEST_INT_EQUAL(t, 2, pn_link_credit(snd));
+  TEST_INT_EQUAL(t, 2, pn_link_credit(rcv));
+
+  SEND_RECEIVE_MESSAGE(t, "three", &client, &server);
+  TEST_INT_EQUAL(t, 1, pn_link_credit(rcv));
+  TEST_INT_EQUAL(t, 1, pn_link_credit(snd));
+
+ cleanup:
+  test_connection_driver_destroy(&client);
+  test_connection_driver_destroy(&server);
+}
+
+
+int main(int argc, char **argv) {
+  int failed = 0;
+  RUN_ARGV_TEST(failed, t, test_message_transfer(&t));
+  RUN_ARGV_TEST(failed, t, test_message_stream(&t));
+  RUN_ARGV_TEST(failed, t, test_message_abort(&t));
+  RUN_ARGV_TEST(failed, t, test_message_abort_mixed(&t));
+  return failed;
+
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37136940/c/tests/data.c
----------------------------------------------------------------------
diff --git a/c/tests/data.c b/c/tests/data.c
new file mode 100644
index 0000000..10e7039
--- /dev/null
+++ b/c/tests/data.c
@@ -0,0 +1,49 @@
+/*
+ *
+ * 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.
+ *
+ */
+
+#undef NDEBUG                   /* Make sure that assert() is enabled even in a release build. */
+
+#include <proton/codec.h>
+#include "core/data.h"
+#include <assert.h>
+#include <stdio.h>
+
+// Make sure we can grow the capacity of a pn_data_t all the way to the max and we stop there.
+static void test_grow(void)
+{
+  pn_data_t* data = pn_data(0);
+  while (pn_data_size(data) < PNI_NID_MAX) {
+    int code = pn_data_put_int(data, 1);
+    if (code) fprintf(stderr, "%d: %s", code, pn_error_text(pn_data_error(data)));
+    assert(code == 0);
+  }
+  assert(pn_data_size(data) == PNI_NID_MAX);
+  int code = pn_data_put_int(data, 1);
+  if (code != PN_OUT_OF_MEMORY)
+    fprintf(stderr, "expected PN_OUT_OF_MEMORY, got  %s\n", pn_code(code));
+  assert(code == PN_OUT_OF_MEMORY);
+  assert(pn_data_size(data) == PNI_NID_MAX);
+  pn_data_free(data);
+}
+
+int main(int argc, char **argv) {
+  test_grow();
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37136940/c/tests/engine.c
----------------------------------------------------------------------
diff --git a/c/tests/engine.c b/c/tests/engine.c
new file mode 100644
index 0000000..41d17a0
--- /dev/null
+++ b/c/tests/engine.c
@@ -0,0 +1,369 @@
+/*
+ *
+ * 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.
+ *
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <proton/engine.h>
+
+// never remove 'assert()'
+#undef NDEBUG
+#include <assert.h>
+
+// push data from one transport to another
+static int xfer(pn_transport_t *src, pn_transport_t *dest)
+{
+    ssize_t out = pn_transport_pending(src);
+    if (out > 0) {
+        ssize_t in = pn_transport_capacity(dest);
+        if (in > 0) {
+            size_t count = (size_t)((out < in) ? out : in);
+            pn_transport_push(dest,
+                              pn_transport_head(src),
+                              count);
+            pn_transport_pop(src, count);
+            return (int)count;
+        }
+    }
+    return 0;
+}
+
+// transfer all available data between two transports
+static int pump(pn_transport_t *t1, pn_transport_t *t2)
+{
+    int total = 0;
+    int work;
+    do {
+        work = xfer(t1, t2) + xfer(t2, t1);
+        total += work;
+    } while (work);
+    return total;
+}
+
+// handle state changes of the endpoints
+static void process_endpoints(pn_connection_t *conn)
+{
+    pn_session_t *ssn = pn_session_head(conn, PN_LOCAL_UNINIT);
+    while (ssn) {
+        //fprintf(stderr, "Opening session %p\n", (void*)ssn);
+        pn_session_open(ssn);
+        ssn = pn_session_next(ssn, PN_LOCAL_UNINIT);
+    }
+
+    pn_link_t *link = pn_link_head(conn, PN_LOCAL_UNINIT);
+    while (link) {
+        //fprintf(stderr, "Opening link %p\n", (void*)link);
+        pn_link_open(link);
+        link = pn_link_next(link, PN_LOCAL_UNINIT);
+    }
+
+    link = pn_link_head(conn, PN_LOCAL_ACTIVE | PN_REMOTE_CLOSED);
+    while (link) {
+        //fprintf(stderr, "Closing link %p\n", (void*)link);
+        pn_link_close(link);
+        link = pn_link_next(link, PN_LOCAL_ACTIVE | PN_REMOTE_CLOSED);
+    }
+
+    ssn = pn_session_head(conn, PN_LOCAL_ACTIVE | PN_REMOTE_CLOSED);
+    while (ssn) {
+        //fprintf(stderr, "Closing session %p\n", (void*)ssn);
+        pn_session_close(ssn);
+        ssn = pn_session_next(ssn, PN_LOCAL_ACTIVE | PN_REMOTE_CLOSED);
+    }
+}
+
+// bring up a session and a link between the two connections
+static void test_setup(pn_connection_t *c1, pn_transport_t *t1,
+                       pn_connection_t *c2, pn_transport_t *t2)
+{
+    pn_connection_open(c1);
+    pn_connection_open(c2);
+
+    pn_session_t *s1 = pn_session(c1);
+    pn_session_open(s1);
+
+    pn_link_t *tx = pn_sender(s1, "sender");
+    pn_link_open(tx);
+
+    while (pump(t1, t2)) {
+        process_endpoints(c1);
+        process_endpoints(c2);
+    }
+
+    // session and link should be up, c2 should have a receiver link:
+
+    assert(pn_session_state( s1 ) == (PN_LOCAL_ACTIVE | PN_REMOTE_ACTIVE));
+    assert(pn_link_state( tx ) == (PN_LOCAL_ACTIVE | PN_REMOTE_ACTIVE));
+
+    pn_link_t *rx = pn_link_head(c2, (PN_LOCAL_ACTIVE | PN_REMOTE_ACTIVE));
+    assert(rx && pn_link_is_receiver(rx));
+}
+
+// test that free'ing the connection should free all contained
+// resources (session, links, deliveries)
+int test_free_connection(int argc, char **argv)
+{
+    fprintf(stdout, "test_free_connection\n");
+    pn_connection_t *c1 = pn_connection();
+    pn_transport_t  *t1 = pn_transport();
+    pn_transport_bind(t1, c1);
+
+    pn_connection_t *c2 = pn_connection();
+    pn_transport_t  *t2 = pn_transport();
+    pn_transport_set_server(t2);
+    pn_transport_bind(t2, c2);
+
+    //pn_transport_trace(t1, PN_TRACE_FRM);
+    test_setup(c1, t1,
+               c2, t2);
+
+    pn_link_t *tx = pn_link_head(c1, (PN_LOCAL_ACTIVE | PN_REMOTE_ACTIVE));
+    assert(tx);
+    pn_link_t *rx = pn_link_head(c2, (PN_LOCAL_ACTIVE | PN_REMOTE_ACTIVE));
+    assert(rx);
+
+    // transfer some data across the link:
+    pn_link_flow(rx, 10);
+    pn_delivery_t *d1 = pn_delivery(tx, pn_dtag("tag-1", 6));
+    while (pump(t1, t2)) {
+        process_endpoints(c1);
+        process_endpoints(c2);
+    }
+    assert(pn_delivery_writable(d1));
+    pn_link_send(tx, "ABC", 4);
+    pn_link_advance(tx);
+
+    // now free the connection, but keep processing the transport
+    process_endpoints(c1);
+    pn_connection_free(c1);
+    while (pump(t1, t2)) {
+        process_endpoints(c2);
+    }
+
+    // delivery should have transfered:
+    assert(pn_link_current(rx) &&
+           pn_delivery_readable(pn_link_current(rx)));
+
+    pn_transport_unbind(t1);
+    pn_transport_free(t1);
+
+    pn_connection_free(c2);
+    pn_transport_unbind(t2);
+    pn_transport_free(t2);
+
+    return 0;
+}
+
+int test_free_session(int argc, char **argv)
+{
+    fprintf(stdout, "test_free_session\n");
+    pn_connection_t *c1 = pn_connection();
+    pn_transport_t  *t1 = pn_transport();
+    pn_transport_bind(t1, c1);
+
+    pn_connection_t *c2 = pn_connection();
+    pn_transport_t  *t2 = pn_transport();
+    pn_transport_set_server(t2);
+    pn_transport_bind(t2, c2);
+
+    //pn_transport_trace(t1, PN_TRACE_FRM);
+    test_setup(c1, t1,
+               c2, t2);
+
+    pn_session_t *ssn = pn_session_head(c1, (PN_LOCAL_ACTIVE | PN_REMOTE_ACTIVE));
+    assert(ssn);
+    pn_link_t *tx = pn_link_head(c1, (PN_LOCAL_ACTIVE | PN_REMOTE_ACTIVE));
+    assert(tx);
+    pn_link_t *rx = pn_link_head(c2, (PN_LOCAL_ACTIVE | PN_REMOTE_ACTIVE));
+    assert(rx);
+
+    // prepare for transfer: request some credit
+    pn_link_flow(rx, 10);
+    pn_delivery_t *d1 = pn_delivery(tx, pn_dtag("tag-1", 6));
+    while (pump(t1, t2)) {
+        process_endpoints(c1);
+        process_endpoints(c2);
+    }
+    assert(pn_delivery_writable(d1));
+
+    // send some data, but also close the session:
+    pn_link_send(tx, "ABC", 4);
+    pn_link_advance(tx);
+
+    pn_session_close(ssn);
+    pn_session_free(ssn);
+
+    while (pump(t1, t2)) {
+        process_endpoints(c1);
+        process_endpoints(c2);
+    }
+
+    // delivery should have transfered:
+    assert(pn_link_current(rx));
+    assert(pn_delivery_readable(pn_link_current(rx)));
+
+    // c2's session should see the close:
+    pn_session_t *ssn2 = pn_session_head(c2, 0);
+    assert(ssn2 && pn_session_state(ssn2) == (PN_LOCAL_CLOSED | PN_REMOTE_CLOSED));
+
+    pn_transport_unbind(t1);
+    pn_transport_free(t1);
+    pn_connection_free(c1);
+
+    pn_transport_unbind(t2);
+    pn_transport_free(t2);
+    pn_connection_free(c2);
+
+    return 0;
+}
+
+int test_free_link(int argc, char **argv)
+{
+    fprintf(stdout, "test_free_link\n");
+    pn_connection_t *c1 = pn_connection();
+    pn_transport_t  *t1 = pn_transport();
+    pn_transport_bind(t1, c1);
+
+    pn_connection_t *c2 = pn_connection();
+    pn_transport_t  *t2 = pn_transport();
+    pn_transport_set_server(t2);
+    pn_transport_bind(t2, c2);
+
+    //pn_transport_trace(t1, PN_TRACE_FRM);
+    test_setup(c1, t1,
+               c2, t2);
+
+    pn_link_t *tx = pn_link_head(c1, (PN_LOCAL_ACTIVE | PN_REMOTE_ACTIVE));
+    assert(tx);
+    pn_link_t *rx = pn_link_head(c2, (PN_LOCAL_ACTIVE | PN_REMOTE_ACTIVE));
+    assert(rx);
+
+    // prepare for transfer: request some credit
+    pn_link_flow(rx, 10);
+    pn_delivery_t *d1 = pn_delivery(tx, pn_dtag("tag-1", 6));
+    while (pump(t1, t2)) {
+        process_endpoints(c1);
+        process_endpoints(c2);
+    }
+    assert(pn_delivery_writable(d1));
+
+    // send some data, then close and destroy the link:
+    pn_link_send(tx, "ABC", 4);
+    pn_link_advance(tx);
+
+    pn_link_close(tx);
+    pn_link_free(tx);
+
+    while (pump(t1, t2)) {
+        process_endpoints(c1);
+        process_endpoints(c2);
+    }
+
+    // the data transfer will complete and the link close
+    // should have been sent to the peer
+    assert(pn_link_current(rx));
+    assert(pn_link_state(rx) == (PN_LOCAL_CLOSED | PN_REMOTE_CLOSED));
+
+    pn_transport_unbind(t1);
+    pn_transport_free(t1);
+    pn_connection_free(c1);
+
+    pn_transport_unbind(t2);
+    pn_transport_free(t2);
+    pn_connection_free(c2);
+
+    return 0;
+}
+
+// regression test fo PROTON-1466 - confusion between links with prefix names
+static int test_link_name_prefix(int argc, char **argv)
+{
+    fprintf(stdout, "test_link_name_prefix\n");
+    pn_connection_t *c1 = pn_connection();
+    pn_transport_t  *t1 = pn_transport();
+    pn_transport_bind(t1, c1);
+
+    pn_connection_t *c2 = pn_connection();
+    pn_transport_t  *t2 = pn_transport();
+    pn_transport_set_server(t2);
+    pn_transport_bind(t2, c2);
+
+    pn_connection_open(c1);
+    pn_connection_open(c2);
+
+    pn_session_t *s1 = pn_session(c1);
+    pn_session_open(s1);
+
+    pn_link_t *l = pn_receiver(s1, "l");
+    pn_link_open(l);
+    pn_link_t *lll = pn_receiver(s1, "lll");
+    pn_link_open(lll);
+    pn_link_t *ll = pn_receiver(s1, "ll");
+    pn_link_open(ll);
+
+    while (pump(t1, t2)) {
+        process_endpoints(c1);
+        process_endpoints(c2);
+    }
+
+    // session and link should be up, c2 should have a receiver link:
+    assert(pn_session_state( s1 ) == (PN_LOCAL_ACTIVE | PN_REMOTE_ACTIVE));
+    assert(pn_link_state( l ) == (PN_LOCAL_ACTIVE | PN_REMOTE_ACTIVE));
+    assert(pn_link_state( lll ) == (PN_LOCAL_ACTIVE | PN_REMOTE_ACTIVE));
+    assert(pn_link_state( ll ) == (PN_LOCAL_ACTIVE | PN_REMOTE_ACTIVE));
+
+    pn_link_t *r = pn_link_head(c2, (PN_LOCAL_ACTIVE | PN_REMOTE_ACTIVE));
+    assert(!strcmp(pn_link_name(r), "l"));
+    r = pn_link_next(r, (PN_LOCAL_ACTIVE | PN_REMOTE_ACTIVE));
+    assert(!strcmp(pn_link_name(r), "lll"));
+    r = pn_link_next(r, (PN_LOCAL_ACTIVE | PN_REMOTE_ACTIVE));
+    assert(!strcmp(pn_link_name(r), "ll"));
+
+    pn_transport_unbind(t1);
+    pn_transport_free(t1);
+    pn_connection_free(c1);
+
+    pn_transport_unbind(t2);
+    pn_transport_free(t2);
+    pn_connection_free(c2);
+
+    return 0;
+}
+
+typedef int (*test_ptr_t)(int argc, char **argv);
+
+test_ptr_t tests[] = {test_free_connection,
+                      test_free_session,
+                      test_free_link,
+                      test_link_name_prefix,
+                      NULL};
+
+int main(int argc, char **argv)
+{
+    test_ptr_t *test = tests;
+    while (*test) {
+        int rc = (*test++)(argc, argv);
+        if (rc)
+            return rc;
+    }
+    return 0;
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37136940/c/tests/event.c
----------------------------------------------------------------------
diff --git a/c/tests/event.c b/c/tests/event.c
new file mode 100644
index 0000000..6746c3b
--- /dev/null
+++ b/c/tests/event.c
@@ -0,0 +1,109 @@
+/*
+ *
+ * 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.
+ *
+ */
+
+#include <proton/object.h>
+#include <proton/event.h>
+#include <stdlib.h>
+
+#define assert(E) ((E) ? 0 : (abort(), 0))
+
+static void test_collector(void) {
+  pn_collector_t *collector = pn_collector();
+  assert(collector);
+  pn_free(collector);
+}
+
+#define SETUP_COLLECTOR \
+  void *obj = pn_class_new(PN_OBJECT, 0); \
+  pn_collector_t *collector = pn_collector(); \
+  assert(collector); \
+  pn_event_t *event = pn_collector_put(collector, PN_OBJECT, obj, (pn_event_type_t) 0); \
+  pn_decref(obj); \
+
+static void test_collector_put(void) {
+  SETUP_COLLECTOR;
+  assert(event);
+  assert(pn_event_context(event) == obj);
+  pn_free(collector);
+}
+
+static void test_collector_peek(void) {
+  SETUP_COLLECTOR;
+  pn_event_t *head = pn_collector_peek(collector);
+  assert(head == event);
+  pn_free(collector);
+}
+
+static void test_collector_pop(void) {
+  SETUP_COLLECTOR;
+  pn_event_t *head = pn_collector_peek(collector);
+  assert(head == event);
+  pn_collector_pop(collector);
+  head = pn_collector_peek(collector);
+  assert(!head);
+  pn_free(collector);
+}
+
+static void test_collector_pool(void) {
+  SETUP_COLLECTOR;
+  pn_event_t *head = pn_collector_peek(collector);
+  assert(head == event);
+  pn_collector_pop(collector);
+  head = pn_collector_peek(collector);
+  assert(!head);
+  void *obj2 = pn_class_new(PN_OBJECT, 0);
+  pn_event_t *event2 = pn_collector_put(collector, PN_OBJECT, obj2, (pn_event_type_t) 0);
+  pn_decref(obj2);
+  assert(event == event2);
+  pn_free(collector);
+}
+
+static void test_event_incref(bool eventfirst) {
+  SETUP_COLLECTOR;
+  pn_event_t *head = pn_collector_peek(collector);
+  assert(head == event);
+  pn_incref(head);
+  pn_collector_pop(collector);
+  assert(!pn_collector_peek(collector));
+  void *obj2 = pn_class_new(PN_OBJECT, 0);
+  pn_event_t *event2 = pn_collector_put(collector, PN_OBJECT, obj2, (pn_event_type_t) 0);
+  pn_decref(obj2);
+  assert(head != event2);
+  if (eventfirst) {
+    pn_decref(head);
+    pn_free(collector);
+  } else {
+    pn_free(collector);
+    pn_decref(head);
+  }
+}
+
+int main(int argc, char **argv)
+{
+  test_collector();
+  test_collector_put();
+  test_collector_peek();
+  test_collector_pop();
+  test_collector_pool();
+  test_event_incref(true);
+  test_event_incref(false);
+  return 0;
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37136940/c/tests/fdlimit.py
----------------------------------------------------------------------
diff --git a/c/tests/fdlimit.py b/c/tests/fdlimit.py
new file mode 100644
index 0000000..57faef8
--- /dev/null
+++ b/c/tests/fdlimit.py
@@ -0,0 +1,87 @@
+#
+# 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
+#
+from __future__ import print_function
+
+from proctest import *
+
+def wait_listening(proc):
+    m = proc.wait_re("listening on ([0-9]+)$")
+    return m.group(1), m.group(0)+"\n" # Return (port, line)
+
+class LimitedBroker(object):
+    def __init__(self, test, fdlimit):
+        self.test = test
+        self.fdlimit = fdlimit
+
+    def __enter__(self):
+        self.proc = self.test.proc(["broker", "", "0"])
+        self.port, _ = wait_listening(self.proc)
+        return self
+
+    def __exit__(self, *args):
+        b = getattr(self, "proc")
+        if b:
+            if b.poll() not in [1, None]: # Broker crashed or got expected connection error
+                raise ProcError(b, "broker crash")
+            b.kill()
+
+# Check if we can run prlimit to control resources
+try:
+    Proc(["prlimit"]).wait_exit()
+except:
+    print("Skipping test: prlimit not available")
+    sys.exit(0)
+
+class FdLimitTest(ProcTestCase):
+
+    def proc(self, *args, **kwargs):
+        """Skip valgrind for all processes started by this test"""
+        return super(FdLimitTest, self).proc(*args, valgrind=False, **kwargs)
+
+    def test_fd_limit_broker(self):
+        """Check behaviour when running out of file descriptors on accept"""
+        # Not too many FDs but not too few either, some are used for system purposes.
+        fdlimit = 256
+        with LimitedBroker(self, fdlimit) as b:
+            receivers = []
+            # Start enough receivers to use all FDs, make sure the broker logs an error
+            for i in range(fdlimit+1):
+                receivers.append(self.proc(["receive", "", b.port, str(i)]))
+
+            # Note: libuv silently swallows EMFILE/ENFILE errors so there is no error reporting.
+            # The epoll proactor will close the users connection with the EMFILE/ENFILE error
+            if "TRANSPORT_CLOSED" in b.proc.out:
+                self.assertIn("open files", b.proc.out)
+
+            # All FDs are now in use, send attempt should fail or hang
+            self.assertIn(self.proc(["send", "", b.port, "x"]).poll(), [1, None])
+
+            # Kill receivers to free up FDs
+            for r in receivers:
+                r.kill()
+            for r in receivers:
+                r.wait_exit(expect=None)
+            # send/receive should succeed now
+            self.assertIn("10 messages sent", self.proc(["send", "", b.port]).wait_exit())
+            self.assertIn("10 messages received", self.proc(["receive", "", b.port]).wait_exit())
+
+if __name__ == "__main__":
+    main()
+
+

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37136940/c/tests/fuzz/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/c/tests/fuzz/CMakeLists.txt b/c/tests/fuzz/CMakeLists.txt
new file mode 100644
index 0000000..f870d61
--- /dev/null
+++ b/c/tests/fuzz/CMakeLists.txt
@@ -0,0 +1,62 @@
+#
+# 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.
+#
+
+add_definitions(${COMPILE_WARNING_FLAGS} ${COMPILE_PLATFORM_FLAGS})
+
+option(FUZZ_REGRESSION_TESTS "Run fuzz tests with regression test driver" ON)
+option(FUZZ_LONG_TESTS "Run fuzz tests that take a long time" OFF)
+
+if (FUZZ_REGRESSION_TESTS)
+  set(FUZZING_LIBRARY StandaloneFuzzTargetMain)
+else ()
+  set(FUZZING_LIBRARY FuzzingEngine)
+endif ()
+
+add_library (StandaloneFuzzTargetMain STATIC StandaloneFuzzTargetMain.c StandaloneFuzzTargetInit.c)
+
+macro (pn_add_fuzz_test test)
+  add_executable (${test} ${ARGN})
+  target_link_libraries (${test} qpid-proton-core ${FUZZING_LIBRARY})
+
+  if (FUZZ_REGRESSION_TESTS)
+    # StandaloneFuzzTargetMain cannot walk directory trees
+    file(GLOB_RECURSE files ${CMAKE_CURRENT_SOURCE_DIR}/${test}/*)
+    add_test (${test} ${memcheck-cmd} ${CMAKE_CURRENT_BINARY_DIR}/${test} ${files})
+  else ()
+    add_test (${test} ${CMAKE_CURRENT_BINARY_DIR}/${test} -runs=1 ${CMAKE_CURRENT_SOURCE_DIR}/${test})
+  endif ()
+endmacro(pn_add_fuzz_test)
+
+# Fuzz tests at the User API level
+pn_add_fuzz_test (fuzz-connection-driver fuzz-connection-driver.c)
+pn_add_fuzz_test (fuzz-message-decode fuzz-message-decode.c)
+
+# pn_url_parse is not in proton core and is only used by messenger so compile specially
+pn_add_fuzz_test (fuzz-url fuzz-url.c ${PN_C_SOURCE_DIR}/extra/url.c ${PN_C_SOURCE_DIR}/core/util.c)
+
+# This regression test can take a very long time so don't run by default
+if(HAS_PROACTOR AND FUZZ_LONG_TESTS)
+  pn_add_fuzz_test (fuzz-proactor-receive fuzz-proactor-receive.c)
+  target_link_libraries(fuzz-proactor-receive qpid-proton-proactor)
+endif()
+
+# Fuzz tests of internals
+
+# pni_sniff_header is internal so it has to be compiled specially
+pn_add_fuzz_test (fuzz-sniff-header fuzz-sniff-header.c ${PN_C_SOURCE_DIR}/core/autodetect.c)

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37136940/c/tests/fuzz/Dockerfile
----------------------------------------------------------------------
diff --git a/c/tests/fuzz/Dockerfile b/c/tests/fuzz/Dockerfile
new file mode 100644
index 0000000..053879a
--- /dev/null
+++ b/c/tests/fuzz/Dockerfile
@@ -0,0 +1,48 @@
+# Copyright 2017 Google Inc.
+#
+# Licensed 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.
+#
+################################################################################
+
+FROM ossfuzz/base-builder
+MAINTAINER jdanek@redhat.com
+RUN apt-get install -y \
+    cmake \
+    libuv1-dev
+    # (optional) add vim
+
+# (optional) customize enviromental variables
+#ENV FUZZING_ENGINE
+#ENV SANITIZER_FLAGS
+
+# copy qpid-proton from filesystem into the container
+COPY . ./qpid-proton
+WORKDIR /src/qpid-proton
+
+# refresh the build directory if it exists already
+RUN rm build -rf || true
+
+# /usr/local/bin/compile compiles libFuzzer, then calls /src/build.sh
+# and sets correct environment variables for it
+RUN echo cmake .. -DCMAKE_BUILD_TYPE=Debug -DFUZZ_TEST=ON -DFUZZING_ENGINE=ON > /src/build.sh
+
+# build it
+RUN mkdir build
+WORKDIR /src/qpid-proton/build
+RUN /usr/local/bin/compile
+WORKDIR /src/qpid-proton/build/proton-c/src/tests/fuzz
+RUN make
+RUN ls
+
+# run corpus through fuzzer and irrespective of result start bash
+ENTRYPOINT make test; bash

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37136940/c/tests/fuzz/README.md
----------------------------------------------------------------------
diff --git a/c/tests/fuzz/README.md b/c/tests/fuzz/README.md
new file mode 100644
index 0000000..08ddd06
--- /dev/null
+++ b/c/tests/fuzz/README.md
@@ -0,0 +1,68 @@
+# Fuzz testing for qpid-proton-c
+
+## Dockerfile
+
+Easiest way to build and run the fuzzing is using attached Dockerfile. Run the following command from the top directory of the project
+
+    docker build -f proton-c/src/tests/fuzz/Dockerfile -t qpid-proton-fuzz .
+ 
+Then run the built image and execute a fuzzer to check that all works
+
+    docker run --cap-add SYS_PTRACE -it qpid-proton-fuzz
+    ./fuzz-url /src/proton-c/src/tests/fuzz/fuzz-url/crash /src/proton-c/src/tests/fuzz/fuzz-url/corpus
+    
+You can bind a local directory to the container with the `-v local:remote` option. The `--rm` option is also useful. See https://docs.docker.com/engine/reference/run/.
+
+The docker image is based on `ossfuzz/basebuilder`, which is Ubuntu 16.04 Xenial with clang 5.0 and libc++.
+
+## Building
+
+There are two cmake options to control compilation of fuzzers
+
+* `FUZZ_TEST` (default: `OFF`) adds fuzzers to the build and to regression tests
+* `FUZZING_ENGINE` (default: `OFF`) links fuzzers with `libFuzzingEngine` when `ON`
+
+When `FUZZING_ENGINE` is `OFF`, fuzzers are linked with a simple driver suitable only for regression testing.
+
+### with a simple driver
+
+There are no special prerequisites and no extra configuration is necessary.
+
+### with libFuzzer
+
+1. Download and compile libFuzzer. Use http://llvm.org/docs/LibFuzzer.html for detailed instructions.
+2. Rename/link `libFuzzer.a` (from previous step) to `libFuzzingEngine.a`
+3. Build qpid-proton with the following configuration
+  * set `CC` and `CXX` variables to the same compiler you used to build libFuzzer (some recent clang)
+  * set `CFLAGS` and `CXXFLAGS` with the coverage and sanitizer(s) you want to use, see libFuzzer documentation for details
+  * set `LDFLAGS` to add the directory with `libFuzzingEngine.a` to your link path if necessary
+  * set `FUZZ_TEST=ON` and `FUZZING_ENGINE=ON`
+
+For example:
+
+    FLAGS="-fsanitize-coverage=trace-pc-guard -fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls"
+    
+    CC=~/third_party/llvm-build/Release+Asserts/bin/clang \
+    CXX=~/third_party/llvm-build/Release+Asserts/bin/clang++ \
+    CFLAGS="$FLAGS" \
+    CXXFLAGS="$FLAGS" \
+    LDFLAGS="-L/path/to/libFuzzingEngine/directory" \
+    cmake .. -DCMAKE_BUILD_TYPE=Debug -DFUZZ_TEST=ON -DFUZZING_ENGINE=ON
+
+## Running
+
+Execute one of the `fuzz-*` binaries. 
+
+### With simple driver
+
+When given file paths as command line arguments, it will run the fuzzed function with each of the inputs in turn once and then exit.
+
+### WIth libFuzzer
+
+When given a folder as first argument, it will load corpus from the folder and also store newly discovered inputs (that extend code coverage) there. See http://llvm.org/docs/LibFuzzer.html for details.
+
+# Justifications
+
+The reason for renaming the fuzzing library to `libFuzzingEngine` is to be compatible with https://github.com/google/oss-fuzz.
+
+In fuzzing data directories, corpus and crashes are two different subdirectories, because fuzzers can perform corpus minimization. Crashes should not be subjected to corpus minimization, so they need to be kept separately.

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37136940/c/tests/fuzz/StandaloneFuzzTargetInit.c
----------------------------------------------------------------------
diff --git a/c/tests/fuzz/StandaloneFuzzTargetInit.c b/c/tests/fuzz/StandaloneFuzzTargetInit.c
new file mode 100644
index 0000000..4c6293c
--- /dev/null
+++ b/c/tests/fuzz/StandaloneFuzzTargetInit.c
@@ -0,0 +1,26 @@
+/*
+ *
+ * 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.
+ *
+ */
+
+int LLVMFuzzerInitialize(int *argc, char ***argv)
+{
+  return 0;
+}
+

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37136940/c/tests/fuzz/StandaloneFuzzTargetMain.c
----------------------------------------------------------------------
diff --git a/c/tests/fuzz/StandaloneFuzzTargetMain.c b/c/tests/fuzz/StandaloneFuzzTargetMain.c
new file mode 100644
index 0000000..0138745
--- /dev/null
+++ b/c/tests/fuzz/StandaloneFuzzTargetMain.c
@@ -0,0 +1,42 @@
+/*===- StandaloneFuzzTargetMain.c - standalone main() for fuzz targets. ---===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+// This main() function can be linked to a fuzz target (i.e. a library
+// that exports LLVMFuzzerTestOneInput() and possibly LLVMFuzzerInitialize())
+// instead of libFuzzer. This main() function will not perform any fuzzing
+// but will simply feed all input files one by one to the fuzz target.
+//
+// Use this file to provide reproducers for bugs when linking against libFuzzer
+// or other fuzzing engine is undesirable.
+//===----------------------------------------------------------------------===*/
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+extern int LLVMFuzzerInitialize(int *argc, char ***argv);
+extern int LLVMFuzzerTestOneInput(const unsigned char *data, size_t size);
+
+int main(int argc, char **argv) {
+  fprintf(stderr, "StandaloneFuzzTargetMain: running %d inputs\n", argc - 1);
+  LLVMFuzzerInitialize(&argc, &argv);
+
+  for (int i = 1; i < argc; i++) {
+    fprintf(stderr, "Running: %s\n", argv[i]);
+    FILE *f = fopen(argv[i], "r");
+    assert(f);
+    fseek(f, 0, SEEK_END);
+    size_t len = ftell(f);
+    fseek(f, 0, SEEK_SET);
+    unsigned char *buf = (unsigned char*)malloc(len);
+    size_t n_read = fread(buf, 1, len, f);
+    assert(n_read == len);
+    LLVMFuzzerTestOneInput(buf, len);
+    free(buf);
+    fprintf(stderr, "Done:    %s: (%zd bytes)\n", argv[i], n_read);
+  }
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37136940/c/tests/fuzz/fuzz-connection-driver.c
----------------------------------------------------------------------
diff --git a/c/tests/fuzz/fuzz-connection-driver.c b/c/tests/fuzz/fuzz-connection-driver.c
new file mode 100644
index 0000000..dcc5757
--- /dev/null
+++ b/c/tests/fuzz/fuzz-connection-driver.c
@@ -0,0 +1,222 @@
+/*
+ *
+ * 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.
+ *
+ */
+
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "proton/connection_driver.h"
+#include "proton/engine.h"
+#include "proton/log.h"
+#include "proton/message.h"
+
+#include "libFuzzingEngine.h"
+
+// This fuzzer is a variant of the receive.c proactor example
+
+#define MAX_SIZE 1024
+
+typedef char str[MAX_SIZE];
+
+typedef struct app_data_t {
+  str container_id;
+  pn_rwbytes_t message_buffer;
+  int message_count;
+  int received;
+} app_data_t;
+
+static void fdc_write(pn_connection_driver_t *driver);
+size_t fcd_read(pn_connection_driver_t *driver, uint8_t **data, size_t *size);
+static void decode_message(pn_delivery_t *dlv);
+static void handle(app_data_t *app, pn_event_t *event);
+static void check_condition(pn_event_t *e, pn_condition_t *cond);
+
+// const bool VERBOSE = true;
+const bool VERBOSE = false;
+// const bool ERRORS = true;
+const bool ERRORS = false;
+
+// I could not get rid of the error messages on stderr in any other way
+void devnull(pn_transport_t *transport, const char *message) {}
+
+int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
+  if (VERBOSE)
+    printf("BEGIN LLVMFuzzerTestOneInput\n");
+  app_data_t app = {{0}};
+  snprintf(app.container_id, sizeof(app.container_id), "%s:%06x",
+           "fuzz_connection_driver", rand() & 0xffffff);
+
+  pn_connection_driver_t driver;
+  if (pn_connection_driver_init(&driver, NULL, NULL) != 0) {
+    printf("pn_connection_driver_init\n");
+    exit(1);
+  }
+
+  pn_log_enable(false);
+  pn_log_logger(NULL);
+  pn_transport_trace(driver.transport, PN_TRACE_OFF);
+  pn_transport_set_tracer(driver.transport, devnull);
+
+  uint8_t *data = (uint8_t *)Data;
+  size_t size = Size;
+
+  fdc_write(&driver);
+
+  pn_event_t *event;
+  while ((event = pn_connection_driver_next_event(&driver)) != NULL) {
+    handle(&app, event);
+  }
+
+  fdc_write(&driver);
+
+  do {
+    fdc_write(&driver);
+    fcd_read(&driver, &data, &size);
+    if (VERBOSE)
+      printf("size is %d, data is %p\n", (int)size, (void *)data);
+    pn_event_t *event;
+    while ((event = pn_connection_driver_next_event(&driver)) != NULL) {
+      handle(&app, event);
+    }
+  } while (size > 0);
+
+  pn_connection_driver_close(&driver);
+  pn_connection_driver_destroy(
+      &driver); // TODO: documentation says pn_connection_driver_free
+  if (VERBOSE)
+    printf("END LLVMFuzzerTestOneInput\n");
+  return 0;
+}
+
+static void handle(app_data_t *app, pn_event_t *event) {
+  switch (pn_event_type(event)) {
+
+  case PN_CONNECTION_INIT: {
+    pn_connection_t *c = pn_event_connection(event);
+    pn_connection_set_container(c, app->container_id);
+    pn_connection_open(c);
+    pn_session_t *s = pn_session(c);
+    pn_session_open(s);
+    pn_link_t *l = pn_receiver(s, "my_receiver");
+    pn_terminus_set_address(pn_link_source(l), NULL);
+    pn_link_open(l);
+    pn_link_flow(l, 20);
+  } break;
+
+  case PN_DELIVERY: {
+    /* A message has been received */
+    pn_link_t *link = NULL;
+    pn_delivery_t *dlv = pn_event_delivery(event);
+    if (pn_delivery_readable(dlv) && !pn_delivery_partial(dlv)) {
+      link = pn_delivery_link(dlv);
+      decode_message(dlv);
+      /* Accept the delivery */
+      pn_delivery_update(dlv, PN_ACCEPTED);
+      /* done with the delivery, move to the next and free it */
+      pn_link_advance(link);
+      pn_delivery_settle(dlv); /* dlv is now freed */
+    }
+  } break;
+
+  case PN_TRANSPORT_ERROR:
+    check_condition(event, pn_transport_condition(pn_event_transport(event)));
+    pn_connection_close(pn_event_connection(event));
+    break;
+
+  case PN_CONNECTION_REMOTE_CLOSE:
+    check_condition(event,
+                    pn_connection_remote_condition(pn_event_connection(event)));
+    pn_connection_close(pn_event_connection(event));
+    break;
+
+  case PN_SESSION_REMOTE_CLOSE:
+    check_condition(event,
+                    pn_session_remote_condition(pn_event_session(event)));
+    pn_connection_close(pn_event_connection(event));
+    break;
+
+  case PN_LINK_REMOTE_CLOSE:
+  case PN_LINK_REMOTE_DETACH:
+    check_condition(event, pn_link_remote_condition(pn_event_link(event)));
+    pn_connection_close(pn_event_connection(event));
+    break;
+
+  default:
+    break;
+  }
+}
+
+static void check_condition(pn_event_t *e, pn_condition_t *cond) {
+  if (VERBOSE)
+    printf("beginning check_condition\n");
+  if (pn_condition_is_set(cond)) {
+    if (VERBOSE || ERRORS)
+      fprintf(stderr, "%s: %s: %s\n", pn_event_type_name(pn_event_type(e)),
+              pn_condition_get_name(cond), pn_condition_get_description(cond));
+  }
+}
+
+static void decode_message(pn_delivery_t *dlv) {
+  static char buffer[MAX_SIZE];
+  ssize_t len;
+  // try to decode the message body
+  if (pn_delivery_pending(dlv) < MAX_SIZE) {
+    // read in the raw data
+    len = pn_link_recv(pn_delivery_link(dlv), buffer, MAX_SIZE);
+    if (len > 0) {
+      // decode it into a proton message
+      pn_message_t *m = pn_message();
+      if (PN_OK == pn_message_decode(m, buffer, len)) {
+        pn_string_t *s = pn_string(NULL);
+        pn_inspect(pn_message_body(m), s);
+        if (ERRORS)
+          printf("%s\n", pn_string_get(s));
+        pn_free(s);
+      }
+      pn_message_free(m);
+    }
+  }
+}
+
+// reads up to `size` bytes from `data`,
+// updates `data` pointer and `size` to the unread portion of original `data`,
+// returns new value of `size`
+size_t fcd_read(pn_connection_driver_t *driver, uint8_t **data, size_t *size) {
+  pn_rwbytes_t buf = pn_connection_driver_read_buffer(driver);
+  size_t s = (*size < buf.size) ? *size : buf.size;
+  if (buf.start == NULL) {
+    exit(1);
+  }
+  memcpy(buf.start, *data, s);
+
+  pn_connection_driver_read_done(driver, s);
+  *data += s;
+  *size -= s;
+
+  return *size;
+}
+
+// drops the data in the buffer and reports them as written
+static void fdc_write(pn_connection_driver_t *driver) {
+  pn_bytes_t buffer = pn_connection_driver_write_buffer(driver);
+  pn_connection_driver_write_done(driver, buffer.size);
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37136940/c/tests/fuzz/fuzz-connection-driver/corpus/00022848b6f91bd22d74aee65c17c9132934bc98
----------------------------------------------------------------------
diff --git a/c/tests/fuzz/fuzz-connection-driver/corpus/00022848b6f91bd22d74aee65c17c9132934bc98 b/c/tests/fuzz/fuzz-connection-driver/corpus/00022848b6f91bd22d74aee65c17c9132934bc98
new file mode 100644
index 0000000..53ba380
Binary files /dev/null and b/c/tests/fuzz/fuzz-connection-driver/corpus/00022848b6f91bd22d74aee65c17c9132934bc98 differ

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37136940/c/tests/fuzz/fuzz-connection-driver/corpus/010bab9b627b9bf8cd0b1ff32b19d4669e756e06
----------------------------------------------------------------------
diff --git a/c/tests/fuzz/fuzz-connection-driver/corpus/010bab9b627b9bf8cd0b1ff32b19d4669e756e06 b/c/tests/fuzz/fuzz-connection-driver/corpus/010bab9b627b9bf8cd0b1ff32b19d4669e756e06
new file mode 100644
index 0000000..a7a837b
Binary files /dev/null and b/c/tests/fuzz/fuzz-connection-driver/corpus/010bab9b627b9bf8cd0b1ff32b19d4669e756e06 differ

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37136940/c/tests/fuzz/fuzz-connection-driver/corpus/011724655b0a5e891284003b6c82e9f3f09d719b
----------------------------------------------------------------------
diff --git a/c/tests/fuzz/fuzz-connection-driver/corpus/011724655b0a5e891284003b6c82e9f3f09d719b b/c/tests/fuzz/fuzz-connection-driver/corpus/011724655b0a5e891284003b6c82e9f3f09d719b
new file mode 100644
index 0000000..623499e
Binary files /dev/null and b/c/tests/fuzz/fuzz-connection-driver/corpus/011724655b0a5e891284003b6c82e9f3f09d719b differ

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37136940/c/tests/fuzz/fuzz-connection-driver/corpus/015b054164d0c060dba0ad2c350e12c83f71c129
----------------------------------------------------------------------
diff --git a/c/tests/fuzz/fuzz-connection-driver/corpus/015b054164d0c060dba0ad2c350e12c83f71c129 b/c/tests/fuzz/fuzz-connection-driver/corpus/015b054164d0c060dba0ad2c350e12c83f71c129
new file mode 100644
index 0000000..d73f0d8
Binary files /dev/null and b/c/tests/fuzz/fuzz-connection-driver/corpus/015b054164d0c060dba0ad2c350e12c83f71c129 differ

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37136940/c/tests/fuzz/fuzz-connection-driver/corpus/017176f4a9cd5500e6b7ef139cf519d3f113d6eb
----------------------------------------------------------------------
diff --git a/c/tests/fuzz/fuzz-connection-driver/corpus/017176f4a9cd5500e6b7ef139cf519d3f113d6eb b/c/tests/fuzz/fuzz-connection-driver/corpus/017176f4a9cd5500e6b7ef139cf519d3f113d6eb
new file mode 100644
index 0000000..33ac12f
Binary files /dev/null and b/c/tests/fuzz/fuzz-connection-driver/corpus/017176f4a9cd5500e6b7ef139cf519d3f113d6eb differ

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37136940/c/tests/fuzz/fuzz-connection-driver/corpus/0339eecf1be50ea807e7bdf8b544e513d0f48a6a
----------------------------------------------------------------------
diff --git a/c/tests/fuzz/fuzz-connection-driver/corpus/0339eecf1be50ea807e7bdf8b544e513d0f48a6a b/c/tests/fuzz/fuzz-connection-driver/corpus/0339eecf1be50ea807e7bdf8b544e513d0f48a6a
new file mode 100644
index 0000000..7e33f7b
Binary files /dev/null and b/c/tests/fuzz/fuzz-connection-driver/corpus/0339eecf1be50ea807e7bdf8b544e513d0f48a6a differ

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37136940/c/tests/fuzz/fuzz-connection-driver/corpus/042fdec751947c700c94c604c4e5f8c8b2f890df
----------------------------------------------------------------------
diff --git a/c/tests/fuzz/fuzz-connection-driver/corpus/042fdec751947c700c94c604c4e5f8c8b2f890df b/c/tests/fuzz/fuzz-connection-driver/corpus/042fdec751947c700c94c604c4e5f8c8b2f890df
new file mode 100644
index 0000000..f3acd0d
Binary files /dev/null and b/c/tests/fuzz/fuzz-connection-driver/corpus/042fdec751947c700c94c604c4e5f8c8b2f890df differ

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37136940/c/tests/fuzz/fuzz-connection-driver/corpus/0445e9084cd366adadef0db16b39389a1fbb0b96
----------------------------------------------------------------------
diff --git a/c/tests/fuzz/fuzz-connection-driver/corpus/0445e9084cd366adadef0db16b39389a1fbb0b96 b/c/tests/fuzz/fuzz-connection-driver/corpus/0445e9084cd366adadef0db16b39389a1fbb0b96
new file mode 100644
index 0000000..fa2477b
Binary files /dev/null and b/c/tests/fuzz/fuzz-connection-driver/corpus/0445e9084cd366adadef0db16b39389a1fbb0b96 differ

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37136940/c/tests/fuzz/fuzz-connection-driver/corpus/04935c57adc38f1bd00edd8223bff34cf7943f10
----------------------------------------------------------------------
diff --git a/c/tests/fuzz/fuzz-connection-driver/corpus/04935c57adc38f1bd00edd8223bff34cf7943f10 b/c/tests/fuzz/fuzz-connection-driver/corpus/04935c57adc38f1bd00edd8223bff34cf7943f10
new file mode 100644
index 0000000..15c558d
Binary files /dev/null and b/c/tests/fuzz/fuzz-connection-driver/corpus/04935c57adc38f1bd00edd8223bff34cf7943f10 differ

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37136940/c/tests/fuzz/fuzz-connection-driver/corpus/04d63f6a39107e6e2762fc094c19d1be98a1b677
----------------------------------------------------------------------
diff --git a/c/tests/fuzz/fuzz-connection-driver/corpus/04d63f6a39107e6e2762fc094c19d1be98a1b677 b/c/tests/fuzz/fuzz-connection-driver/corpus/04d63f6a39107e6e2762fc094c19d1be98a1b677
new file mode 100644
index 0000000..4cce0be
Binary files /dev/null and b/c/tests/fuzz/fuzz-connection-driver/corpus/04d63f6a39107e6e2762fc094c19d1be98a1b677 differ


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org