test_merge_capabilities.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. /*
  2. * Copyright 2015 Alan Antonuk. All Rights Reserved.
  3. *
  4. * Permission is hereby granted, free of charge, to any person
  5. * obtaining a copy of this software and associated documentation
  6. * files (the "Software"), to deal in the Software without
  7. * restriction, including without limitation the rights to use, copy,
  8. * modify, merge, publish, distribute, sublicense, and/or sell copies
  9. * of the Software, and to permit persons to whom the Software is
  10. * furnished to do so, subject to the following conditions:
  11. *
  12. * The above copyright notice and this permission notice shall be
  13. * included in all copies or substantial portions of the Software.
  14. *
  15. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  16. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  17. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  18. * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  19. * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  20. * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  21. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  22. * SOFTWARE.
  23. */
  24. #include "amqp_socket.h"
  25. #include "amqp_table.h"
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28. static int compare_bytes(amqp_bytes_t l, amqp_bytes_t r);
  29. static int compare_amqp_table_entry(amqp_table_entry_t result,
  30. amqp_table_entry_t expect);
  31. static int compare_field_value(amqp_field_value_t result,
  32. amqp_field_value_t expect);
  33. static int compare_amqp_table(amqp_table_t* result, amqp_table_t* expect);
  34. static int compare_bytes(amqp_bytes_t l, amqp_bytes_t r) {
  35. if (l.len == r.len &&
  36. (l.bytes == r.bytes || 0 == memcmp(l.bytes, r.bytes, l.len))) {
  37. return 1;
  38. }
  39. return 0;
  40. }
  41. static int compare_amqp_table_entry(amqp_table_entry_t result,
  42. amqp_table_entry_t expect) {
  43. if (!compare_bytes(result.key, expect.key)) {
  44. return 0;
  45. }
  46. return compare_field_value(result.value, expect.value);
  47. }
  48. static int compare_field_value(amqp_field_value_t result,
  49. amqp_field_value_t expect) {
  50. if (result.kind != expect.kind) {
  51. return 0;
  52. }
  53. switch (result.kind) {
  54. case AMQP_FIELD_KIND_BOOLEAN:
  55. return result.value.boolean == expect.value.boolean;
  56. case AMQP_FIELD_KIND_I8:
  57. return result.value.i8 == expect.value.i8;
  58. case AMQP_FIELD_KIND_U8:
  59. return result.value.u8 == expect.value.u8;
  60. case AMQP_FIELD_KIND_I16:
  61. return result.value.i16 == expect.value.i16;
  62. case AMQP_FIELD_KIND_U16:
  63. return result.value.u16 == expect.value.u16;
  64. case AMQP_FIELD_KIND_I32:
  65. return result.value.i32 == expect.value.i32;
  66. case AMQP_FIELD_KIND_U32:
  67. return result.value.u32 == expect.value.u32;
  68. case AMQP_FIELD_KIND_I64:
  69. return result.value.i64 == expect.value.i64;
  70. case AMQP_FIELD_KIND_U64:
  71. case AMQP_FIELD_KIND_TIMESTAMP:
  72. return result.value.u64 == expect.value.u64;
  73. case AMQP_FIELD_KIND_F32:
  74. return result.value.f32 == expect.value.f32;
  75. case AMQP_FIELD_KIND_F64:
  76. return result.value.f64 == expect.value.f64;
  77. case AMQP_FIELD_KIND_DECIMAL:
  78. return !memcmp(&result.value.decimal, &expect.value.decimal,
  79. sizeof(expect.value.decimal));
  80. case AMQP_FIELD_KIND_UTF8:
  81. case AMQP_FIELD_KIND_BYTES:
  82. return compare_bytes(result.value.bytes, expect.value.bytes);
  83. case AMQP_FIELD_KIND_ARRAY: {
  84. int i;
  85. if (result.value.array.num_entries != expect.value.array.num_entries) {
  86. return 0;
  87. }
  88. for (i = 0; i < result.value.array.num_entries; ++i) {
  89. if (!compare_field_value(result.value.array.entries[i],
  90. expect.value.array.entries[i])) {
  91. return 0;
  92. }
  93. }
  94. return 1;
  95. }
  96. case AMQP_FIELD_KIND_TABLE:
  97. return compare_amqp_table(&result.value.table, &expect.value.table);
  98. case AMQP_FIELD_KIND_VOID:
  99. return 1;
  100. }
  101. return 1;
  102. }
  103. static int compare_amqp_table(amqp_table_t* result, amqp_table_t* expect) {
  104. int i;
  105. if (result->num_entries != expect->num_entries) {
  106. return 0;
  107. }
  108. for (i = 0; i < expect->num_entries; ++i) {
  109. if (!compare_amqp_table_entry(expect->entries[i], result->entries[i])) {
  110. return 0;
  111. }
  112. }
  113. return 1;
  114. }
  115. static void test_merge_capabilities(amqp_table_t* base, amqp_table_t* add,
  116. amqp_table_t* expect) {
  117. amqp_pool_t pool;
  118. amqp_table_t result;
  119. int res;
  120. init_amqp_pool(&pool, 4096);
  121. res = amqp_merge_capabilities(base, add, &result, &pool);
  122. if (AMQP_STATUS_OK != res) {
  123. fprintf(stderr, "amqp_merge_capabilities returned !ok: %d\n", res);
  124. abort();
  125. }
  126. if (!compare_amqp_table(&result, expect)) {
  127. fprintf(stderr, "amqp_merge_capabilities incorrect result.\n");
  128. abort();
  129. }
  130. empty_amqp_pool(&pool);
  131. return;
  132. }
  133. int main(void) {
  134. {
  135. amqp_table_t sub_base;
  136. amqp_table_t sub_add;
  137. amqp_table_t sub_expect;
  138. amqp_table_t base;
  139. amqp_table_t add;
  140. amqp_table_t expect;
  141. amqp_table_entry_t sub_base_entries[1];
  142. amqp_table_entry_t sub_add_entries[2];
  143. amqp_table_entry_t sub_expect_entries[2];
  144. amqp_table_entry_t base_entries[3];
  145. amqp_table_entry_t add_entries[3];
  146. amqp_table_entry_t expect_entries[4];
  147. sub_base_entries[0] = amqp_table_construct_utf8_entry("foo", "bar");
  148. sub_base.num_entries =
  149. sizeof(sub_base_entries) / sizeof(amqp_table_entry_t);
  150. sub_base.entries = sub_base_entries;
  151. sub_add_entries[0] = amqp_table_construct_utf8_entry("something", "else");
  152. sub_add_entries[1] = amqp_table_construct_utf8_entry("foo", "baz");
  153. sub_add.num_entries = sizeof(sub_add_entries) / sizeof(amqp_table_entry_t);
  154. sub_add.entries = sub_add_entries;
  155. sub_expect_entries[0] = amqp_table_construct_utf8_entry("foo", "baz");
  156. sub_expect_entries[1] =
  157. amqp_table_construct_utf8_entry("something", "else");
  158. sub_expect.num_entries =
  159. sizeof(sub_expect_entries) / sizeof(amqp_table_entry_t);
  160. sub_expect.entries = sub_expect_entries;
  161. base_entries[0] = amqp_table_construct_utf8_entry("product", "1.0");
  162. base_entries[1] = amqp_table_construct_utf8_entry("nooverride", "yeah");
  163. base_entries[2] = amqp_table_construct_table_entry("props", &sub_base);
  164. base.num_entries = sizeof(base_entries) / sizeof(amqp_table_entry_t);
  165. base.entries = base_entries;
  166. add_entries[0] = amqp_table_construct_bool_entry("bool_entry", 1);
  167. add_entries[1] = amqp_table_construct_utf8_entry("product", "2.0");
  168. add_entries[2] = amqp_table_construct_table_entry("props", &sub_add);
  169. add.num_entries = sizeof(add_entries) / sizeof(amqp_table_entry_t);
  170. add.entries = add_entries;
  171. expect_entries[0] = amqp_table_construct_utf8_entry("product", "2.0"),
  172. expect_entries[1] = amqp_table_construct_utf8_entry("nooverride", "yeah"),
  173. expect_entries[2] = amqp_table_construct_table_entry("props", &sub_expect);
  174. expect_entries[3] = amqp_table_construct_bool_entry("bool_entry", 1);
  175. expect.num_entries = sizeof(expect_entries) / sizeof(amqp_table_entry_t);
  176. expect.entries = expect_entries;
  177. test_merge_capabilities(&base, &add, &expect);
  178. }
  179. fprintf(stderr, "ok\n");
  180. return 0;
  181. }