diff options
Diffstat (limited to 'tests/test_tables.c')
-rw-r--r-- | tests/test_tables.c | 403 |
1 files changed, 0 insertions, 403 deletions
diff --git a/tests/test_tables.c b/tests/test_tables.c deleted file mode 100644 index 5c0fbb9..0000000 --- a/tests/test_tables.c +++ /dev/null @@ -1,403 +0,0 @@ -/* - * ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (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.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and - * limitations under the License. - * - * The Original Code is librabbitmq. - * - * The Initial Developers of the Original Code are LShift Ltd, Cohesive - * Financial Technologies LLC, and Rabbit Technologies Ltd. Portions - * created before 22-Nov-2008 00:00:00 GMT by LShift Ltd, Cohesive - * Financial Technologies LLC, or Rabbit Technologies Ltd are Copyright - * (C) 2007-2008 LShift Ltd, Cohesive Financial Technologies LLC, and - * Rabbit Technologies Ltd. - * - * Portions created by LShift Ltd are Copyright (C) 2007-2009 LShift - * Ltd. Portions created by Cohesive Financial Technologies LLC are - * Copyright (C) 2007-2009 Cohesive Financial Technologies - * LLC. Portions created by Rabbit Technologies Ltd are Copyright (C) - * 2007-2009 Rabbit Technologies Ltd. - * - * Portions created by Tony Garnock-Jones are Copyright (C) 2009-2010 - * LShift Ltd and Tony Garnock-Jones. - * - * All Rights Reserved. - * - * Contributor(s): ______________________________________. - * - * Alternatively, the contents of this file may be used under the terms - * of the GNU General Public License Version 2 or later (the "GPL"), in - * which case the provisions of the GPL are applicable instead of those - * above. If you wish to allow use of your version of this file only - * under the terms of the GPL, and not to allow others to use your - * version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the - * notice and other provisions required by the GPL. If you do not - * delete the provisions above, a recipient may use your version of - * this file under the terms of any one of the MPL or the GPL. - * - * ***** END LICENSE BLOCK ***** - */ - -#include <stdlib.h> -#include <stdio.h> -#include <string.h> - -#include <inttypes.h> - -#include <amqp.h> - -#include <math.h> - -#define M_PI 3.14159265358979323846264338327 - -static void dump_indent(int indent) { - int i; - for (i = 0; i < indent; i++) { putchar(' '); } -} - -static void dump_value(int indent, amqp_field_value_t v) { - dump_indent(indent); - putchar(v.kind); - putchar(' '); - switch (v.kind) { - case AMQP_FIELD_KIND_BOOLEAN: puts(v.value.boolean ? "true" : "false"); break; - case AMQP_FIELD_KIND_I8: printf("%"PRId8"\n", v.value.i8); break; - case AMQP_FIELD_KIND_U8: printf("%"PRIu8"\n", v.value.u8); break; - case AMQP_FIELD_KIND_I16: printf("%"PRId16"\n", v.value.i16); break; - case AMQP_FIELD_KIND_U16: printf("%"PRIu16"\n", v.value.u16); break; - case AMQP_FIELD_KIND_I32: printf("%"PRId32"\n", v.value.i32); break; - case AMQP_FIELD_KIND_U32: printf("%"PRIu32"\n", v.value.u32); break; - case AMQP_FIELD_KIND_I64: printf("%"PRId64"\n", v.value.i64); break; - case AMQP_FIELD_KIND_F32: printf("%g\n", (double) v.value.f32); break; - case AMQP_FIELD_KIND_F64: printf("%g\n", v.value.f64); break; - case AMQP_FIELD_KIND_DECIMAL: - printf("%d:::%u\n", v.value.decimal.decimals, v.value.decimal.value); break; - case AMQP_FIELD_KIND_UTF8: - printf("%.*s\n", (int) v.value.bytes.len, (char *) v.value.bytes.bytes); break; - case AMQP_FIELD_KIND_BYTES: - { - int i; - for (i = 0; i < v.value.bytes.len; i++) { - printf("%02x", ((char *) v.value.bytes.bytes)[i]); - } - putchar('\n'); - } - break; - case AMQP_FIELD_KIND_ARRAY: - putchar('\n'); - { - int i; - for (i = 0; i < v.value.array.num_entries; i++) { - dump_value(indent + 2, v.value.array.entries[i]); - } - } - break; - case AMQP_FIELD_KIND_TIMESTAMP: printf("%"PRIu64"\n", v.value.u64); break; - case AMQP_FIELD_KIND_TABLE: - putchar('\n'); - { - int i; - for (i = 0; i < v.value.table.num_entries; i++) { - dump_indent(indent + 2); - printf("%.*s ->\n", - (int) v.value.table.entries[i].key.len, - (char *) v.value.table.entries[i].key.bytes); - dump_value(indent + 4, v.value.table.entries[i].value); - } - } - break; - case AMQP_FIELD_KIND_VOID: putchar('\n'); break; - default: - printf("???\n"); - break; - } -} - -static uint8_t pre_encoded_table[] = { - 0x00, 0x00, 0x00, 0xff, 0x07, 0x6c, 0x6f, 0x6e, - 0x67, 0x73, 0x74, 0x72, 0x53, 0x00, 0x00, 0x00, - 0x15, 0x48, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, - 0x20, 0x61, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x09, 0x73, - 0x69, 0x67, 0x6e, 0x65, 0x64, 0x69, 0x6e, 0x74, - 0x49, 0x00, 0x00, 0x30, 0x39, 0x07, 0x64, 0x65, - 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x44, 0x03, 0x00, - 0x01, 0xe2, 0x40, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x54, 0x00, 0x00, - 0x63, 0xee, 0xa0, 0x53, 0xc1, 0x94, 0x05, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x46, 0x00, 0x00, 0x00, - 0x1f, 0x03, 0x6f, 0x6e, 0x65, 0x49, 0x00, 0x00, - 0xd4, 0x31, 0x03, 0x74, 0x77, 0x6f, 0x53, 0x00, - 0x00, 0x00, 0x0d, 0x41, 0x20, 0x6c, 0x6f, 0x6e, - 0x67, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x04, 0x62, 0x79, 0x74, 0x65, 0x62, 0xff, 0x04, - 0x6c, 0x6f, 0x6e, 0x67, 0x6c, 0x00, 0x00, 0x00, - 0x00, 0x49, 0x96, 0x02, 0xd2, 0x05, 0x73, 0x68, - 0x6f, 0x72, 0x74, 0x73, 0x02, 0x8f, 0x04, 0x62, - 0x6f, 0x6f, 0x6c, 0x74, 0x01, 0x06, 0x62, 0x69, - 0x6e, 0x61, 0x72, 0x79, 0x78, 0x00, 0x00, 0x00, - 0x0f, 0x61, 0x20, 0x62, 0x69, 0x6e, 0x61, 0x72, - 0x79, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x04, 0x76, 0x6f, 0x69, 0x64, 0x56, 0x05, 0x61, - 0x72, 0x72, 0x61, 0x79, 0x41, 0x00, 0x00, 0x00, - 0x17, 0x49, 0x00, 0x00, 0xd4, 0x31, 0x53, 0x00, - 0x00, 0x00, 0x0d, 0x41, 0x20, 0x6c, 0x6f, 0x6e, - 0x67, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x05, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x66, 0x40, - 0x49, 0x0f, 0xdb, 0x06, 0x64, 0x6f, 0x75, 0x62, - 0x6c, 0x65, 0x64, 0x40, 0x09, 0x21, 0xfb, 0x54, - 0x44, 0x2d, 0x18 -}; - -static void test_table_codec(void) { - amqp_pool_t pool; - int result; - - amqp_table_entry_t inner_entries[2]; - amqp_table_t inner_table; - - amqp_field_value_t inner_values[2]; - amqp_array_t inner_array; - - amqp_table_entry_t entries[14]; - amqp_table_t table; - - inner_entries[0].key = amqp_cstring_bytes("one"); - inner_entries[0].value.kind = AMQP_FIELD_KIND_I32; - inner_entries[0].value.value.i32 = 54321; - - inner_entries[1].key = amqp_cstring_bytes("two"); - inner_entries[1].value.kind = AMQP_FIELD_KIND_UTF8; - inner_entries[1].value.value.bytes = amqp_cstring_bytes("A long string"); - - inner_table.num_entries = 2; - inner_table.entries = inner_entries; - - inner_values[0].kind = AMQP_FIELD_KIND_I32; - inner_values[0].value.i32 = 54321; - - inner_values[1].kind = AMQP_FIELD_KIND_UTF8; - inner_values[1].value.bytes = amqp_cstring_bytes("A long string"); - - inner_array.num_entries = 2; - inner_array.entries = inner_values; - - entries[0].key = amqp_cstring_bytes("longstr"); - entries[0].value.kind = AMQP_FIELD_KIND_UTF8; - entries[0].value.value.bytes = amqp_cstring_bytes("Here is a long string"); - - entries[1].key = amqp_cstring_bytes("signedint"); - entries[1].value.kind = AMQP_FIELD_KIND_I32; - entries[1].value.value.i32 = 12345; - - entries[2].key = amqp_cstring_bytes("decimal"); - entries[2].value.kind = AMQP_FIELD_KIND_DECIMAL; - entries[2].value.value.decimal.decimals = 3; - entries[2].value.value.decimal.value = 123456; - - entries[3].key = amqp_cstring_bytes("timestamp"); - entries[3].value.kind = AMQP_FIELD_KIND_TIMESTAMP; - entries[3].value.value.u64 = 109876543209876; - - entries[4].key = amqp_cstring_bytes("table"); - entries[4].value.kind = AMQP_FIELD_KIND_TABLE; - entries[4].value.value.table = inner_table; - - entries[5].key = amqp_cstring_bytes("byte"); - entries[5].value.kind = AMQP_FIELD_KIND_I8; - entries[5].value.value.i8 = (int8_t)255; - - entries[6].key = amqp_cstring_bytes("long"); - entries[6].value.kind = AMQP_FIELD_KIND_I64; - entries[6].value.value.i64 = 1234567890; - - entries[7].key = amqp_cstring_bytes("short"); - entries[7].value.kind = AMQP_FIELD_KIND_I16; - entries[7].value.value.i16 = 655; - - entries[8].key = amqp_cstring_bytes("bool"); - entries[8].value.kind = AMQP_FIELD_KIND_BOOLEAN; - entries[8].value.value.boolean = 1; - - entries[9].key = amqp_cstring_bytes("binary"); - entries[9].value.kind = AMQP_FIELD_KIND_BYTES; - entries[9].value.value.bytes = amqp_cstring_bytes("a binary string"); - - entries[10].key = amqp_cstring_bytes("void"); - entries[10].value.kind = AMQP_FIELD_KIND_VOID; - - entries[11].key = amqp_cstring_bytes("array"); - entries[11].value.kind = AMQP_FIELD_KIND_ARRAY; - entries[11].value.value.array = inner_array; - - entries[12].key = amqp_cstring_bytes("float"); - entries[12].value.kind = AMQP_FIELD_KIND_F32; - entries[12].value.value.f32 = M_PI; - - entries[13].key = amqp_cstring_bytes("double"); - entries[13].value.kind = AMQP_FIELD_KIND_F64; - entries[13].value.value.f64 = M_PI; - - table.num_entries = 14; - table.entries = entries; - - printf("AAAAAAAAAA\n"); - - { - amqp_field_value_t val; - val.kind = AMQP_FIELD_KIND_TABLE; - val.value.table = table; - dump_value(0, val); - } - - init_amqp_pool(&pool, 4096); - - { - amqp_table_t decoded; - size_t decoding_offset = 0; - amqp_bytes_t decoding_bytes; - decoding_bytes.len = sizeof(pre_encoded_table); - decoding_bytes.bytes = pre_encoded_table; - - result = amqp_decode_table(decoding_bytes, &pool, &decoded, &decoding_offset); - if (result < 0) { - char *errstr = amqp_error_string(-result); - printf("Table decoding failed: %d (%s)\n", result, errstr); - free(errstr); - abort(); - } - printf("BBBBBBBBBB\n"); - - { - amqp_field_value_t val; - val.kind = AMQP_FIELD_KIND_TABLE; - val.value.table = decoded; - - dump_value(0, val); - } - } - - { - uint8_t encoding_buffer[4096]; - amqp_bytes_t encoding_result; - size_t offset = 0; - - memset(&encoding_buffer[0], 0, sizeof(encoding_buffer)); - encoding_result.len = sizeof(encoding_buffer); - encoding_result.bytes = &encoding_buffer[0]; - - result = amqp_encode_table(encoding_result, &table, &offset); - if (result < 0) { - char *errstr = amqp_error_string(-result); - printf("Table encoding failed: %d (%s)\n", result, errstr); - free(errstr); - abort(); - } - - if (offset != sizeof(pre_encoded_table)) { - printf("Offset should be %d, was %d\n", (int) sizeof(pre_encoded_table), (int)offset); - abort(); - } - - result = memcmp(pre_encoded_table, encoding_buffer, offset); - if (result != 0) { - printf("Table encoding differed, result = %d\n", result); - abort(); - } - } - - empty_amqp_pool(&pool); -} - -int main(int argc, char const * const *argv) { - amqp_table_entry_t entries[8]; - amqp_table_t table; - - union { - uint32_t i; - float f; - } vi; - union { - uint64_t l; - double d; - } vl; - - entries[0].key = amqp_cstring_bytes("zebra"); - entries[0].value.kind = AMQP_FIELD_KIND_UTF8; - entries[0].value.value.bytes = amqp_cstring_bytes("last"); - - entries[1].key = amqp_cstring_bytes("aardvark"); - entries[1].value.kind = AMQP_FIELD_KIND_UTF8; - entries[1].value.value.bytes = amqp_cstring_bytes("first"); - - entries[2].key = amqp_cstring_bytes("middle"); - entries[2].value.kind = AMQP_FIELD_KIND_UTF8; - entries[2].value.value.bytes = amqp_cstring_bytes("third"); - - entries[3].key = amqp_cstring_bytes("number"); - entries[3].value.kind = AMQP_FIELD_KIND_I32; - entries[3].value.value.i32 = 1234; - - entries[4].key = amqp_cstring_bytes("decimal"); - entries[4].value.kind = AMQP_FIELD_KIND_DECIMAL; - entries[4].value.value.decimal.decimals = 2; - entries[4].value.value.decimal.value = 1234; - - entries[5].key = amqp_cstring_bytes("time"); - entries[5].value.kind = AMQP_FIELD_KIND_TIMESTAMP; - entries[5].value.value.u64 = 1234123412341234; - - entries[6].key = amqp_cstring_bytes("beta"); - entries[6].value.kind = AMQP_FIELD_KIND_UTF8; - entries[6].value.value.bytes = amqp_cstring_bytes("second"); - - entries[7].key = amqp_cstring_bytes("wombat"); - entries[7].value.kind = AMQP_FIELD_KIND_UTF8; - entries[7].value.value.bytes = amqp_cstring_bytes("fourth"); - - table.num_entries = 8; - table.entries = entries; - - vi.f = M_PI; - if ((sizeof(float) != 4) || (vi.i != 0x40490fdb)) { - printf("*** ERROR: single floating point encoding does not work as expected\n"); - printf("sizeof float is %lu, float is %g, u32 is 0x%08lx\n", - (unsigned long)sizeof(float), - vi.f, - (unsigned long) vi.i); - } - - vl.d = M_PI; - if ((sizeof(double) != 8) || (vl.l != 0x400921fb54442d18L)) { - printf("*** ERROR: double floating point encoding does not work as expected\n"); - printf("sizeof double is %lu, double is %g, u64 is 0x%16"PRIx64"\n", - (unsigned long)sizeof(double), - vl.d, vl.l); - } - - test_table_codec(); - - qsort(table.entries, table.num_entries, sizeof(amqp_table_entry_t), &amqp_table_entry_cmp); - - printf("----------\n"); - - { - amqp_field_value_t val; - val.kind = AMQP_FIELD_KIND_TABLE; - val.value.table = table; - - dump_value(0, val); - } - - return 0; -} |