| /* |
| * |
| * 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 "./pn_test.hpp" |
| |
| #include "core/data.h" |
| |
| #include <proton/codec.h> |
| #include <proton/error.h> |
| |
| using namespace pn_test; |
| |
| // Make sure we can grow the capacity of a pn_data_t all the way to the max and |
| // we stop there. |
| TEST_CASE("data_grow") { |
| auto_free<pn_data_t, pn_data_free> data(pn_data(0)); |
| int code = 0; |
| while (pn_data_size(data) < PNI_NID_MAX && !code) { |
| code = pn_data_put_int(data, 1); |
| } |
| CHECK_THAT(*pn_data_error(data), error_empty()); |
| CHECK(pn_data_size(data) == PNI_NID_MAX); |
| code = pn_data_put_int(data, 1); |
| INFO(pn_code(code)); |
| CHECK(code == PN_OUT_OF_MEMORY); |
| CHECK(pn_data_size(data) == PNI_NID_MAX); |
| } |
| |
| TEST_CASE("data_multiple") { |
| auto_free<pn_data_t, pn_data_free> data(pn_data(1)); |
| auto_free<pn_data_t, pn_data_free> src(pn_data(1)); |
| |
| /* NULL data pointer */ |
| pn_data_fill(data, "M", NULL); |
| CHECK("null" == inspect(data)); |
| |
| /* Empty data object */ |
| pn_data_clear(data); |
| pn_data_fill(data, "M", src.get()); |
| CHECK("null" == inspect(data)); |
| |
| /* Empty array */ |
| pn_data_clear(data); |
| pn_data_clear(src); |
| pn_data_put_array(src, false, PN_SYMBOL); |
| pn_data_fill(data, "M", src.get()); |
| CHECK("null" == inspect(data)); |
| |
| /* Single-element array */ |
| pn_data_clear(data); |
| pn_data_clear(src); |
| pn_data_put_array(src, false, PN_SYMBOL); |
| pn_data_enter(src); |
| pn_data_put_symbol(src, pn_bytes("foo")); |
| pn_data_fill(data, "M", src.get()); |
| CHECK(":foo" == inspect(data)); |
| |
| /* Multi-element array */ |
| pn_data_clear(data); |
| pn_data_clear(src); |
| pn_data_put_array(src, false, PN_SYMBOL); |
| pn_data_enter(src); |
| pn_data_put_symbol(src, pn_bytes("foo")); |
| pn_data_put_symbol(src, pn_bytes("bar")); |
| pn_data_fill(data, "M", src.get()); |
| CHECK("@PN_SYMBOL[:foo, :bar]" == inspect(data)); |
| |
| /* Non-array */ |
| pn_data_clear(data); |
| pn_data_clear(src); |
| pn_data_put_symbol(src, pn_bytes("baz")); |
| pn_data_fill(data, "M", src.get()); |
| CHECK(":baz" == inspect(data)); |
| |
| /* Described list with open frame descriptor */ |
| pn_data_clear(data); |
| pn_data_fill(data, "DL[]", (uint64_t)16); |
| CHECK("@open(16) []" == inspect(data)); |
| |
| /* open frame with some fields */ |
| pn_data_clear(data); |
| pn_data_fill(data, "DL[SSnI]", (uint64_t)16, "container-1", 0, 965); |
| CHECK("@open(16) [container-id=\"container-1\", channel-max=965]" == inspect(data)); |
| |
| /* Map */ |
| pn_data_clear(data); |
| pn_data_fill(data, "{S[iii]SI}", "foo", 1, 987, 3, "bar", 965); |
| CHECK("{\"foo\"=[1, 987, 3], \"bar\"=965}" == inspect(data)); |
| } |