1d4afb5ceSopenharmony_ci/* 2d4afb5ceSopenharmony_ci * lws-api-test-lws_map 3d4afb5ceSopenharmony_ci * 4d4afb5ceSopenharmony_ci * Written in 2010-2021 by Andy Green <andy@warmcat.com> 5d4afb5ceSopenharmony_ci * 6d4afb5ceSopenharmony_ci * This file is made available under the Creative Commons CC0 1.0 7d4afb5ceSopenharmony_ci * Universal Public Domain Dedication. 8d4afb5ceSopenharmony_ci * 9d4afb5ceSopenharmony_ci * unit tests for lws_map 10d4afb5ceSopenharmony_ci */ 11d4afb5ceSopenharmony_ci 12d4afb5ceSopenharmony_ci#include <libwebsockets.h> 13d4afb5ceSopenharmony_ci 14d4afb5ceSopenharmony_citypedef struct lws_map_item lws_map_item_t; 15d4afb5ceSopenharmony_ci 16d4afb5ceSopenharmony_ci/* custom key and comparator for test 3 */ 17d4afb5ceSopenharmony_ci 18d4afb5ceSopenharmony_citypedef struct mykey { 19d4afb5ceSopenharmony_ci int key; 20d4afb5ceSopenharmony_ci} mykey_t; 21d4afb5ceSopenharmony_ci 22d4afb5ceSopenharmony_cistatic int 23d4afb5ceSopenharmony_cicompare_mykey_t(const lws_map_key_t key1, size_t kl1, 24d4afb5ceSopenharmony_ci const lws_map_value_t key2, size_t kl2) 25d4afb5ceSopenharmony_ci{ 26d4afb5ceSopenharmony_ci const mykey_t *m1 = (mykey_t *)key1, *m2 = (mykey_t *)key2; 27d4afb5ceSopenharmony_ci 28d4afb5ceSopenharmony_ci return m1->key != m2->key; 29d4afb5ceSopenharmony_ci} 30d4afb5ceSopenharmony_ci 31d4afb5ceSopenharmony_ciint main(int argc, const char **argv) 32d4afb5ceSopenharmony_ci{ 33d4afb5ceSopenharmony_ci int e = 0, logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE, 34d4afb5ceSopenharmony_ci expected = 4, pass = 0; 35d4afb5ceSopenharmony_ci mykey_t k1 = { .key = 123 }, k2 = { .key = 234 }, k3 = { .key = 999 }; 36d4afb5ceSopenharmony_ci struct lwsac *ac = NULL; 37d4afb5ceSopenharmony_ci lws_map_item_t *item; 38d4afb5ceSopenharmony_ci lws_map_info_t info; 39d4afb5ceSopenharmony_ci lws_map_t *map; 40d4afb5ceSopenharmony_ci const char *p; 41d4afb5ceSopenharmony_ci 42d4afb5ceSopenharmony_ci if ((p = lws_cmdline_option(argc, argv, "-d"))) 43d4afb5ceSopenharmony_ci logs = atoi(p); 44d4afb5ceSopenharmony_ci 45d4afb5ceSopenharmony_ci lws_set_log_level(logs, NULL); 46d4afb5ceSopenharmony_ci lwsl_user("LWS API selftest: lws_map\n"); 47d4afb5ceSopenharmony_ci 48d4afb5ceSopenharmony_ci /* Test 1: string keys */ 49d4afb5ceSopenharmony_ci 50d4afb5ceSopenharmony_ci lwsl_user("%s: test1\n", __func__); 51d4afb5ceSopenharmony_ci memset(&info, 0, sizeof(info)); 52d4afb5ceSopenharmony_ci map = lws_map_create(&info); 53d4afb5ceSopenharmony_ci if (!map) { 54d4afb5ceSopenharmony_ci e++; 55d4afb5ceSopenharmony_ci goto end_t1; 56d4afb5ceSopenharmony_ci } 57d4afb5ceSopenharmony_ci if (!lws_map_item_create_ks(map, "abc", (lws_map_value_t)"def", 3)) { 58d4afb5ceSopenharmony_ci e++; 59d4afb5ceSopenharmony_ci goto end_t1; 60d4afb5ceSopenharmony_ci } 61d4afb5ceSopenharmony_ci if (!lws_map_item_create_ks(map, "123", (lws_map_value_t)"4567", 4)) { 62d4afb5ceSopenharmony_ci e++; 63d4afb5ceSopenharmony_ci goto end_t1; 64d4afb5ceSopenharmony_ci } 65d4afb5ceSopenharmony_ci item = lws_map_item_lookup_ks(map, "abc"); 66d4afb5ceSopenharmony_ci if (!item) { 67d4afb5ceSopenharmony_ci e++; 68d4afb5ceSopenharmony_ci goto end_t1; 69d4afb5ceSopenharmony_ci } 70d4afb5ceSopenharmony_ci 71d4afb5ceSopenharmony_ci if (lws_map_item_value_len(item) != 3 || 72d4afb5ceSopenharmony_ci memcmp(lws_map_item_value(item), "def", 3)) { 73d4afb5ceSopenharmony_ci e++; 74d4afb5ceSopenharmony_ci goto end_t1; 75d4afb5ceSopenharmony_ci } 76d4afb5ceSopenharmony_ci 77d4afb5ceSopenharmony_ci item = lws_map_item_lookup_ks(map, "123"); 78d4afb5ceSopenharmony_ci if (!item) { 79d4afb5ceSopenharmony_ci e++; 80d4afb5ceSopenharmony_ci goto end_t1; 81d4afb5ceSopenharmony_ci } 82d4afb5ceSopenharmony_ci 83d4afb5ceSopenharmony_ci if (lws_map_item_value_len(item) != 4 || 84d4afb5ceSopenharmony_ci memcmp(lws_map_item_value(item), "4567", 4)) { 85d4afb5ceSopenharmony_ci e++; 86d4afb5ceSopenharmony_ci goto end_t1; 87d4afb5ceSopenharmony_ci } 88d4afb5ceSopenharmony_ci 89d4afb5ceSopenharmony_ci item = lws_map_item_lookup_ks(map, "nope"); 90d4afb5ceSopenharmony_ci if (item) { 91d4afb5ceSopenharmony_ci e++; 92d4afb5ceSopenharmony_ci goto end_t1; 93d4afb5ceSopenharmony_ci } 94d4afb5ceSopenharmony_ci 95d4afb5ceSopenharmony_ci pass++; 96d4afb5ceSopenharmony_ci 97d4afb5ceSopenharmony_ciend_t1: 98d4afb5ceSopenharmony_ci lws_map_destroy(&map); 99d4afb5ceSopenharmony_ci 100d4afb5ceSopenharmony_ci /* Test 2: Use lwsac item allocators */ 101d4afb5ceSopenharmony_ci 102d4afb5ceSopenharmony_ci lwsl_user("%s: test2\n", __func__); 103d4afb5ceSopenharmony_ci memset(&info, 0, sizeof(info)); 104d4afb5ceSopenharmony_ci info._alloc = lws_map_alloc_lwsac; 105d4afb5ceSopenharmony_ci info._free = lws_map_free_lwsac; 106d4afb5ceSopenharmony_ci info.opaque = (void *)∾ 107d4afb5ceSopenharmony_ci 108d4afb5ceSopenharmony_ci map = lws_map_create(&info); 109d4afb5ceSopenharmony_ci if (!map) { 110d4afb5ceSopenharmony_ci e++; 111d4afb5ceSopenharmony_ci goto end_t2; 112d4afb5ceSopenharmony_ci } 113d4afb5ceSopenharmony_ci if (!lws_map_item_create_ks(map, "abc", "def", 3)) { 114d4afb5ceSopenharmony_ci e++; 115d4afb5ceSopenharmony_ci goto end_t2; 116d4afb5ceSopenharmony_ci } 117d4afb5ceSopenharmony_ci if (!lws_map_item_create_ks(map, "123", "4567", 4)) { 118d4afb5ceSopenharmony_ci e++; 119d4afb5ceSopenharmony_ci goto end_t2; 120d4afb5ceSopenharmony_ci } 121d4afb5ceSopenharmony_ci item = lws_map_item_lookup_ks(map, "abc"); 122d4afb5ceSopenharmony_ci if (!item) { 123d4afb5ceSopenharmony_ci e++; 124d4afb5ceSopenharmony_ci goto end_t2; 125d4afb5ceSopenharmony_ci } 126d4afb5ceSopenharmony_ci 127d4afb5ceSopenharmony_ci if (lws_map_item_value_len(item) != 3 || 128d4afb5ceSopenharmony_ci memcmp(lws_map_item_value(item), "def", 3)) { 129d4afb5ceSopenharmony_ci e++; 130d4afb5ceSopenharmony_ci goto end_t2; 131d4afb5ceSopenharmony_ci } 132d4afb5ceSopenharmony_ci 133d4afb5ceSopenharmony_ci item = lws_map_item_lookup_ks(map, "123"); 134d4afb5ceSopenharmony_ci if (!item) { 135d4afb5ceSopenharmony_ci e++; 136d4afb5ceSopenharmony_ci goto end_t2; 137d4afb5ceSopenharmony_ci } 138d4afb5ceSopenharmony_ci 139d4afb5ceSopenharmony_ci if (lws_map_item_value_len(item) != 4 || 140d4afb5ceSopenharmony_ci memcmp(lws_map_item_value(item), "4567", 4)) { 141d4afb5ceSopenharmony_ci e++; 142d4afb5ceSopenharmony_ci goto end_t2; 143d4afb5ceSopenharmony_ci } 144d4afb5ceSopenharmony_ci 145d4afb5ceSopenharmony_ci item = lws_map_item_lookup_ks(map, "nope"); 146d4afb5ceSopenharmony_ci if (item) { 147d4afb5ceSopenharmony_ci e++; 148d4afb5ceSopenharmony_ci goto end_t2; 149d4afb5ceSopenharmony_ci } 150d4afb5ceSopenharmony_ci 151d4afb5ceSopenharmony_ci pass++; 152d4afb5ceSopenharmony_ci 153d4afb5ceSopenharmony_ciend_t2: 154d4afb5ceSopenharmony_ci lws_map_destroy(&map); 155d4afb5ceSopenharmony_ci lwsac_free(&ac); 156d4afb5ceSopenharmony_ci 157d4afb5ceSopenharmony_ci /* Test 3: custom key object and comparator */ 158d4afb5ceSopenharmony_ci 159d4afb5ceSopenharmony_ci lwsl_user("%s: test3\n", __func__); 160d4afb5ceSopenharmony_ci memset(&info, 0, sizeof(info)); 161d4afb5ceSopenharmony_ci info._compare = compare_mykey_t; 162d4afb5ceSopenharmony_ci 163d4afb5ceSopenharmony_ci map = lws_map_create(&info); 164d4afb5ceSopenharmony_ci if (!map) { 165d4afb5ceSopenharmony_ci e++; 166d4afb5ceSopenharmony_ci goto end_t3; 167d4afb5ceSopenharmony_ci } 168d4afb5ceSopenharmony_ci if (!lws_map_item_create(map, (lws_map_key_t)&k1, sizeof(k1), 169d4afb5ceSopenharmony_ci (lws_map_value_t)"def", 3)) { 170d4afb5ceSopenharmony_ci lwsl_err("%s: t3; a\n", __func__); 171d4afb5ceSopenharmony_ci e++; 172d4afb5ceSopenharmony_ci goto end_t3; 173d4afb5ceSopenharmony_ci } 174d4afb5ceSopenharmony_ci if (!lws_map_item_create(map, (lws_map_key_t)&k2, sizeof(k2), 175d4afb5ceSopenharmony_ci (lws_map_value_t)"4567", 4)) { 176d4afb5ceSopenharmony_ci lwsl_err("%s: t3; b\n", __func__); 177d4afb5ceSopenharmony_ci e++; 178d4afb5ceSopenharmony_ci goto end_t3; 179d4afb5ceSopenharmony_ci } 180d4afb5ceSopenharmony_ci item = lws_map_item_lookup(map, (lws_map_key_t)&k1, sizeof(k1)); 181d4afb5ceSopenharmony_ci if (!item) { 182d4afb5ceSopenharmony_ci lwsl_err("%s: t3; c\n", __func__); 183d4afb5ceSopenharmony_ci e++; 184d4afb5ceSopenharmony_ci goto end_t3; 185d4afb5ceSopenharmony_ci } 186d4afb5ceSopenharmony_ci 187d4afb5ceSopenharmony_ci if (lws_map_item_value_len(item) != 3 || 188d4afb5ceSopenharmony_ci memcmp(lws_map_item_value(item), "def", 3)) { 189d4afb5ceSopenharmony_ci lwsl_err("%s: t3; d\n", __func__); 190d4afb5ceSopenharmony_ci e++; 191d4afb5ceSopenharmony_ci goto end_t3; 192d4afb5ceSopenharmony_ci } 193d4afb5ceSopenharmony_ci 194d4afb5ceSopenharmony_ci item = lws_map_item_lookup(map, (lws_map_key_t)&k2, sizeof(k2)); 195d4afb5ceSopenharmony_ci if (!item) { 196d4afb5ceSopenharmony_ci lwsl_err("%s: t3; e\n", __func__); 197d4afb5ceSopenharmony_ci e++; 198d4afb5ceSopenharmony_ci goto end_t3; 199d4afb5ceSopenharmony_ci } 200d4afb5ceSopenharmony_ci 201d4afb5ceSopenharmony_ci if (lws_map_item_value_len(item) != 4 || 202d4afb5ceSopenharmony_ci memcmp(lws_map_item_value(item), "4567", 4)) { 203d4afb5ceSopenharmony_ci lwsl_err("%s: t3; f\n", __func__); 204d4afb5ceSopenharmony_ci e++; 205d4afb5ceSopenharmony_ci goto end_t3; 206d4afb5ceSopenharmony_ci } 207d4afb5ceSopenharmony_ci 208d4afb5ceSopenharmony_ci item = lws_map_item_lookup(map, (lws_map_key_t)&k3, sizeof(k3)); 209d4afb5ceSopenharmony_ci if (item) { 210d4afb5ceSopenharmony_ci lwsl_err("%s: t3; g\n", __func__); 211d4afb5ceSopenharmony_ci e++; 212d4afb5ceSopenharmony_ci goto end_t3; 213d4afb5ceSopenharmony_ci } 214d4afb5ceSopenharmony_ci 215d4afb5ceSopenharmony_ci pass++; 216d4afb5ceSopenharmony_ci 217d4afb5ceSopenharmony_ciend_t3: 218d4afb5ceSopenharmony_ci lws_map_destroy(&map); 219d4afb5ceSopenharmony_ci 220d4afb5ceSopenharmony_ci /* Test 4: same key items */ 221d4afb5ceSopenharmony_ci 222d4afb5ceSopenharmony_ci lwsl_user("%s: test4\n", __func__); 223d4afb5ceSopenharmony_ci memset(&info, 0, sizeof(info)); 224d4afb5ceSopenharmony_ci map = lws_map_create(&info); 225d4afb5ceSopenharmony_ci if (!map) { 226d4afb5ceSopenharmony_ci e++; 227d4afb5ceSopenharmony_ci goto end_t4; 228d4afb5ceSopenharmony_ci } 229d4afb5ceSopenharmony_ci if (!lws_map_item_create_ks(map, "abc", (lws_map_value_t)"def", 3)) { 230d4afb5ceSopenharmony_ci e++; 231d4afb5ceSopenharmony_ci goto end_t4; 232d4afb5ceSopenharmony_ci } 233d4afb5ceSopenharmony_ci if (!lws_map_item_create_ks(map, "abc", (lws_map_value_t)"4567", 4)) { 234d4afb5ceSopenharmony_ci e++; 235d4afb5ceSopenharmony_ci goto end_t4; 236d4afb5ceSopenharmony_ci } 237d4afb5ceSopenharmony_ci item = lws_map_item_lookup_ks(map, "abc"); 238d4afb5ceSopenharmony_ci if (!item) { 239d4afb5ceSopenharmony_ci e++; 240d4afb5ceSopenharmony_ci goto end_t4; 241d4afb5ceSopenharmony_ci } 242d4afb5ceSopenharmony_ci 243d4afb5ceSopenharmony_ci if (lws_map_item_value_len(item) != 4 || 244d4afb5ceSopenharmony_ci memcmp(lws_map_item_value(item), "4567", 4)) { 245d4afb5ceSopenharmony_ci e++; 246d4afb5ceSopenharmony_ci goto end_t4; 247d4afb5ceSopenharmony_ci } 248d4afb5ceSopenharmony_ci 249d4afb5ceSopenharmony_ci pass++; 250d4afb5ceSopenharmony_ci 251d4afb5ceSopenharmony_ciend_t4: 252d4afb5ceSopenharmony_ci lws_map_destroy(&map); 253d4afb5ceSopenharmony_ci 254d4afb5ceSopenharmony_ci if (e) 255d4afb5ceSopenharmony_ci goto bail; 256d4afb5ceSopenharmony_ci 257d4afb5ceSopenharmony_ci lwsl_user("Completed: PASS %d / %d\n", pass, expected); 258d4afb5ceSopenharmony_ci 259d4afb5ceSopenharmony_ci return 0; 260d4afb5ceSopenharmony_ci 261d4afb5ceSopenharmony_cibail: 262d4afb5ceSopenharmony_ci lwsl_user("Completed: FAIL, passed %d / %d (e %d)\n", pass, 263d4afb5ceSopenharmony_ci expected, e); 264d4afb5ceSopenharmony_ci 265d4afb5ceSopenharmony_ci return 1; 266d4afb5ceSopenharmony_ci} 267