| /* |
| * lws-api-test-lws_map |
| * |
| * Written in 2010-2021 by Andy Green <andy@warmcat.com> |
| * |
| * This file is made available under the Creative Commons CC0 1.0 |
| * Universal Public Domain Dedication. |
| * |
| * unit tests for lws_map |
| */ |
| |
| #include <libwebsockets.h> |
| |
| /* custom key and comparator for test 3 */ |
| |
| typedef struct mykey { |
| int key; |
| } mykey_t; |
| |
| static int |
| compare_mykey_t(const lws_map_key_t key1, size_t kl1, |
| const lws_map_value_t key2, size_t kl2) |
| { |
| const mykey_t *m1 = (mykey_t *)key1, *m2 = (mykey_t *)key2; |
| |
| return m1->key != m2->key; |
| } |
| |
| int main(int argc, const char **argv) |
| { |
| int e = 0, logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE, |
| expected = 4, pass = 0; |
| mykey_t k1 = { .key = 123 }, k2 = { .key = 234 }, k3 = { .key = 999 }; |
| struct lwsac *ac = NULL; |
| lws_map_item_t *item; |
| lws_map_info_t info; |
| lws_map_t *map; |
| const char *p; |
| |
| if ((p = lws_cmdline_option(argc, argv, "-d"))) |
| logs = atoi(p); |
| |
| lws_set_log_level(logs, NULL); |
| lwsl_user("LWS API selftest: lws_map\n"); |
| |
| /* Test 1: string keys */ |
| |
| lwsl_user("%s: test1\n", __func__); |
| memset(&info, 0, sizeof(info)); |
| map = lws_map_create(&info); |
| if (!map) { |
| e++; |
| goto end_t1; |
| } |
| if (!lws_map_item_create_ks(map, "abc", (lws_map_value_t)"def", 3)) { |
| e++; |
| goto end_t1; |
| } |
| if (!lws_map_item_create_ks(map, "123", (lws_map_value_t)"4567", 4)) { |
| e++; |
| goto end_t1; |
| } |
| item = lws_map_item_lookup_ks(map, "abc"); |
| if (!item) { |
| e++; |
| goto end_t1; |
| } |
| |
| if (lws_map_item_value_len(item) != 3 || |
| memcmp(lws_map_item_value(item), "def", 3)) { |
| e++; |
| goto end_t1; |
| } |
| |
| item = lws_map_item_lookup_ks(map, "123"); |
| if (!item) { |
| e++; |
| goto end_t1; |
| } |
| |
| if (lws_map_item_value_len(item) != 4 || |
| memcmp(lws_map_item_value(item), "4567", 4)) { |
| e++; |
| goto end_t1; |
| } |
| |
| item = lws_map_item_lookup_ks(map, "nope"); |
| if (item) { |
| e++; |
| goto end_t1; |
| } |
| |
| pass++; |
| |
| end_t1: |
| lws_map_destroy(&map); |
| |
| /* Test 2: Use lwsac item allocators */ |
| |
| lwsl_user("%s: test2\n", __func__); |
| memset(&info, 0, sizeof(info)); |
| info._alloc = lws_map_alloc_lwsac; |
| info._free = lws_map_free_lwsac; |
| info.opaque = (void *)∾ |
| |
| map = lws_map_create(&info); |
| if (!map) { |
| e++; |
| goto end_t2; |
| } |
| if (!lws_map_item_create_ks(map, "abc", "def", 3)) { |
| e++; |
| goto end_t2; |
| } |
| if (!lws_map_item_create_ks(map, "123", "4567", 4)) { |
| e++; |
| goto end_t2; |
| } |
| item = lws_map_item_lookup_ks(map, "abc"); |
| if (!item) { |
| e++; |
| goto end_t2; |
| } |
| |
| if (lws_map_item_value_len(item) != 3 || |
| memcmp(lws_map_item_value(item), "def", 3)) { |
| e++; |
| goto end_t2; |
| } |
| |
| item = lws_map_item_lookup_ks(map, "123"); |
| if (!item) { |
| e++; |
| goto end_t2; |
| } |
| |
| if (lws_map_item_value_len(item) != 4 || |
| memcmp(lws_map_item_value(item), "4567", 4)) { |
| e++; |
| goto end_t2; |
| } |
| |
| item = lws_map_item_lookup_ks(map, "nope"); |
| if (item) { |
| e++; |
| goto end_t2; |
| } |
| |
| pass++; |
| |
| end_t2: |
| lws_map_destroy(&map); |
| lwsac_free(&ac); |
| |
| /* Test 3: custom key object and comparator */ |
| |
| lwsl_user("%s: test3\n", __func__); |
| memset(&info, 0, sizeof(info)); |
| info._compare = compare_mykey_t; |
| |
| map = lws_map_create(&info); |
| if (!map) { |
| e++; |
| goto end_t3; |
| } |
| if (!lws_map_item_create(map, (lws_map_key_t)&k1, sizeof(k1), |
| (lws_map_value_t)"def", 3)) { |
| lwsl_err("%s: t3; a\n", __func__); |
| e++; |
| goto end_t3; |
| } |
| if (!lws_map_item_create(map, (lws_map_key_t)&k2, sizeof(k2), |
| (lws_map_value_t)"4567", 4)) { |
| lwsl_err("%s: t3; b\n", __func__); |
| e++; |
| goto end_t3; |
| } |
| item = lws_map_item_lookup(map, (lws_map_key_t)&k1, sizeof(k1)); |
| if (!item) { |
| lwsl_err("%s: t3; c\n", __func__); |
| e++; |
| goto end_t3; |
| } |
| |
| if (lws_map_item_value_len(item) != 3 || |
| memcmp(lws_map_item_value(item), "def", 3)) { |
| lwsl_err("%s: t3; d\n", __func__); |
| e++; |
| goto end_t3; |
| } |
| |
| item = lws_map_item_lookup(map, (lws_map_key_t)&k2, sizeof(k2)); |
| if (!item) { |
| lwsl_err("%s: t3; e\n", __func__); |
| e++; |
| goto end_t3; |
| } |
| |
| if (lws_map_item_value_len(item) != 4 || |
| memcmp(lws_map_item_value(item), "4567", 4)) { |
| lwsl_err("%s: t3; f\n", __func__); |
| e++; |
| goto end_t3; |
| } |
| |
| item = lws_map_item_lookup(map, (lws_map_key_t)&k3, sizeof(k3)); |
| if (item) { |
| lwsl_err("%s: t3; g\n", __func__); |
| e++; |
| goto end_t3; |
| } |
| |
| pass++; |
| |
| end_t3: |
| lws_map_destroy(&map); |
| |
| /* Test 4: same key items */ |
| |
| lwsl_user("%s: test4\n", __func__); |
| memset(&info, 0, sizeof(info)); |
| map = lws_map_create(&info); |
| if (!map) { |
| e++; |
| goto end_t4; |
| } |
| if (!lws_map_item_create_ks(map, "abc", (lws_map_value_t)"def", 3)) { |
| e++; |
| goto end_t4; |
| } |
| if (!lws_map_item_create_ks(map, "abc", (lws_map_value_t)"4567", 4)) { |
| e++; |
| goto end_t4; |
| } |
| item = lws_map_item_lookup_ks(map, "abc"); |
| if (!item) { |
| e++; |
| goto end_t4; |
| } |
| |
| if (lws_map_item_value_len(item) != 4 || |
| memcmp(lws_map_item_value(item), "4567", 4)) { |
| e++; |
| goto end_t4; |
| } |
| |
| pass++; |
| |
| end_t4: |
| lws_map_destroy(&map); |
| |
| if (e) |
| goto bail; |
| |
| lwsl_user("Completed: PASS %d / %d\n", pass, expected); |
| |
| return 0; |
| |
| bail: |
| lwsl_user("Completed: FAIL, passed %d / %d (e %d)\n", pass, |
| expected, e); |
| |
| return 1; |
| } |