1240116Smarcel/* 2240116Smarcel * Automated Testing Framework (atf) 3240116Smarcel * 4240116Smarcel * Copyright (c) 2008 The NetBSD Foundation, Inc. 5240116Smarcel * All rights reserved. 6240116Smarcel * 7240116Smarcel * Redistribution and use in source and binary forms, with or without 8240116Smarcel * modification, are permitted provided that the following conditions 9240116Smarcel * are met: 10240116Smarcel * 1. Redistributions of source code must retain the above copyright 11240116Smarcel * notice, this list of conditions and the following disclaimer. 12240116Smarcel * 2. Redistributions in binary form must reproduce the above copyright 13240116Smarcel * notice, this list of conditions and the following disclaimer in the 14240116Smarcel * documentation and/or other materials provided with the distribution. 15240116Smarcel * 16240116Smarcel * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 17240116Smarcel * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 18240116Smarcel * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19240116Smarcel * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20240116Smarcel * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 21240116Smarcel * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22240116Smarcel * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 23240116Smarcel * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24240116Smarcel * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 25240116Smarcel * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 26240116Smarcel * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27240116Smarcel * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28240116Smarcel */ 29240116Smarcel 30240116Smarcel#include <stdio.h> 31240116Smarcel#include <string.h> 32240116Smarcel 33240116Smarcel#include <atf-c.h> 34240116Smarcel 35240116Smarcel#include "atf-c/utils.h" 36240116Smarcel 37240116Smarcel#include "map.h" 38240116Smarcel#include "test_helpers.h" 39240116Smarcel 40240116Smarcel/* --------------------------------------------------------------------- 41240116Smarcel * Tests for the "atf_map" type. 42240116Smarcel * --------------------------------------------------------------------- */ 43240116Smarcel 44240116Smarcel/* 45240116Smarcel * Constructors and destructors. 46240116Smarcel */ 47240116Smarcel 48240116SmarcelATF_TC(map_init); 49240116SmarcelATF_TC_HEAD(map_init, tc) 50240116Smarcel{ 51240116Smarcel atf_tc_set_md_var(tc, "descr", "Checks the atf_map_init function"); 52240116Smarcel} 53240116SmarcelATF_TC_BODY(map_init, tc) 54240116Smarcel{ 55240116Smarcel atf_map_t map; 56240116Smarcel 57240116Smarcel RE(atf_map_init(&map)); 58240116Smarcel ATF_REQUIRE_EQ(atf_map_size(&map), 0); 59240116Smarcel atf_map_fini(&map); 60240116Smarcel} 61240116Smarcel 62240116SmarcelATF_TC_WITHOUT_HEAD(map_init_charpp_null); 63240116SmarcelATF_TC_BODY(map_init_charpp_null, tc) 64240116Smarcel{ 65240116Smarcel atf_map_t map; 66240116Smarcel 67240116Smarcel RE(atf_map_init_charpp(&map, NULL)); 68240116Smarcel ATF_REQUIRE_EQ(atf_map_size(&map), 0); 69240116Smarcel atf_map_fini(&map); 70240116Smarcel} 71240116Smarcel 72240116SmarcelATF_TC_WITHOUT_HEAD(map_init_charpp_empty); 73240116SmarcelATF_TC_BODY(map_init_charpp_empty, tc) 74240116Smarcel{ 75240116Smarcel const char *const array[] = { NULL }; 76240116Smarcel atf_map_t map; 77240116Smarcel 78240116Smarcel RE(atf_map_init_charpp(&map, array)); 79240116Smarcel ATF_REQUIRE_EQ(atf_map_size(&map), 0); 80240116Smarcel atf_map_fini(&map); 81240116Smarcel} 82240116Smarcel 83240116SmarcelATF_TC_WITHOUT_HEAD(map_init_charpp_some); 84240116SmarcelATF_TC_BODY(map_init_charpp_some, tc) 85240116Smarcel{ 86240116Smarcel const char *const array[] = { "K1", "V1", "K2", "V2", NULL }; 87240116Smarcel atf_map_t map; 88240116Smarcel atf_map_citer_t iter; 89240116Smarcel 90240116Smarcel RE(atf_map_init_charpp(&map, array)); 91240116Smarcel ATF_REQUIRE_EQ(atf_map_size(&map), 2); 92240116Smarcel 93240116Smarcel iter = atf_map_find_c(&map, "K1"); 94240116Smarcel ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 95240116Smarcel ATF_REQUIRE(strcmp(atf_map_citer_key(iter), "K1") == 0); 96240116Smarcel ATF_REQUIRE(strcmp(atf_map_citer_data(iter), "V1") == 0); 97240116Smarcel 98240116Smarcel iter = atf_map_find_c(&map, "K2"); 99240116Smarcel ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 100240116Smarcel ATF_REQUIRE(strcmp(atf_map_citer_key(iter), "K2") == 0); 101240116Smarcel ATF_REQUIRE(strcmp(atf_map_citer_data(iter), "V2") == 0); 102240116Smarcel 103240116Smarcel atf_map_fini(&map); 104240116Smarcel} 105240116Smarcel 106240116SmarcelATF_TC_WITHOUT_HEAD(map_init_charpp_short); 107240116SmarcelATF_TC_BODY(map_init_charpp_short, tc) 108240116Smarcel{ 109240116Smarcel const char *const array[] = { "K1", "V1", "K2", NULL }; 110240116Smarcel atf_map_t map; 111240116Smarcel 112240116Smarcel atf_error_t err = atf_map_init_charpp(&map, array); 113240116Smarcel ATF_REQUIRE(atf_is_error(err)); 114240116Smarcel ATF_REQUIRE(atf_error_is(err, "libc")); 115240116Smarcel} 116240116Smarcel 117240116Smarcel/* 118240116Smarcel * Getters. 119240116Smarcel */ 120240116Smarcel 121240116SmarcelATF_TC(find); 122240116SmarcelATF_TC_HEAD(find, tc) 123240116Smarcel{ 124240116Smarcel atf_tc_set_md_var(tc, "descr", "Checks the atf_map_find function"); 125240116Smarcel} 126240116SmarcelATF_TC_BODY(find, tc) 127240116Smarcel{ 128240116Smarcel atf_map_t map; 129240116Smarcel char val1[] = "V1"; 130240116Smarcel char val2[] = "V2"; 131240116Smarcel atf_map_iter_t iter; 132240116Smarcel 133240116Smarcel RE(atf_map_init(&map)); 134240116Smarcel RE(atf_map_insert(&map, "K1", val1, false)); 135240116Smarcel RE(atf_map_insert(&map, "K2", val2, false)); 136240116Smarcel 137240116Smarcel iter = atf_map_find(&map, "K0"); 138240116Smarcel ATF_REQUIRE(atf_equal_map_iter_map_iter(iter, atf_map_end(&map))); 139240116Smarcel 140240116Smarcel iter = atf_map_find(&map, "K1"); 141240116Smarcel ATF_REQUIRE(!atf_equal_map_iter_map_iter(iter, atf_map_end(&map))); 142240116Smarcel ATF_REQUIRE(strcmp(atf_map_iter_key(iter), "K1") == 0); 143240116Smarcel ATF_REQUIRE(strcmp(atf_map_iter_data(iter), "V1") == 0); 144240116Smarcel strcpy(atf_map_iter_data(iter), "Z1"); 145240116Smarcel 146240116Smarcel iter = atf_map_find(&map, "K1"); 147240116Smarcel ATF_REQUIRE(!atf_equal_map_iter_map_iter(iter, atf_map_end(&map))); 148240116Smarcel ATF_REQUIRE(strcmp(atf_map_iter_key(iter), "K1") == 0); 149240116Smarcel ATF_REQUIRE(strcmp(atf_map_iter_data(iter), "Z1") == 0); 150240116Smarcel 151240116Smarcel iter = atf_map_find(&map, "K2"); 152240116Smarcel ATF_REQUIRE(!atf_equal_map_iter_map_iter(iter, atf_map_end(&map))); 153240116Smarcel ATF_REQUIRE(strcmp(atf_map_iter_key(iter), "K2") == 0); 154240116Smarcel ATF_REQUIRE(strcmp(atf_map_iter_data(iter), "V2") == 0); 155240116Smarcel 156240116Smarcel atf_map_fini(&map); 157240116Smarcel} 158240116Smarcel 159240116SmarcelATF_TC(find_c); 160240116SmarcelATF_TC_HEAD(find_c, tc) 161240116Smarcel{ 162240116Smarcel atf_tc_set_md_var(tc, "descr", "Checks the atf_map_find_c function"); 163240116Smarcel} 164240116SmarcelATF_TC_BODY(find_c, tc) 165240116Smarcel{ 166240116Smarcel atf_map_t map; 167240116Smarcel char val1[] = "V1"; 168240116Smarcel char val2[] = "V2"; 169240116Smarcel atf_map_citer_t iter; 170240116Smarcel 171240116Smarcel RE(atf_map_init(&map)); 172240116Smarcel RE(atf_map_insert(&map, "K1", val1, false)); 173240116Smarcel RE(atf_map_insert(&map, "K2", val2, false)); 174240116Smarcel 175240116Smarcel iter = atf_map_find_c(&map, "K0"); 176240116Smarcel ATF_REQUIRE(atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 177240116Smarcel 178240116Smarcel iter = atf_map_find_c(&map, "K1"); 179240116Smarcel ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 180240116Smarcel ATF_REQUIRE(strcmp(atf_map_citer_key(iter), "K1") == 0); 181240116Smarcel ATF_REQUIRE(strcmp(atf_map_citer_data(iter), "V1") == 0); 182240116Smarcel 183240116Smarcel iter = atf_map_find_c(&map, "K2"); 184240116Smarcel ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 185240116Smarcel ATF_REQUIRE(strcmp(atf_map_citer_key(iter), "K2") == 0); 186240116Smarcel ATF_REQUIRE(strcmp(atf_map_citer_data(iter), "V2") == 0); 187240116Smarcel 188240116Smarcel atf_map_fini(&map); 189240116Smarcel} 190240116Smarcel 191240116SmarcelATF_TC_WITHOUT_HEAD(to_charpp_empty); 192240116SmarcelATF_TC_BODY(to_charpp_empty, tc) 193240116Smarcel{ 194240116Smarcel atf_map_t map; 195240116Smarcel char **array; 196240116Smarcel 197240116Smarcel RE(atf_map_init(&map)); 198240116Smarcel ATF_REQUIRE((array = atf_map_to_charpp(&map)) != NULL); 199240116Smarcel atf_map_fini(&map); 200240116Smarcel 201240116Smarcel ATF_CHECK_EQ(NULL, array[0]); 202240116Smarcel atf_utils_free_charpp(array); 203240116Smarcel} 204240116Smarcel 205240116SmarcelATF_TC_WITHOUT_HEAD(to_charpp_some); 206240116SmarcelATF_TC_BODY(to_charpp_some, tc) 207240116Smarcel{ 208240116Smarcel atf_map_t map; 209240116Smarcel char **array; 210240116Smarcel 211240116Smarcel char s1[] = "one"; 212240116Smarcel char s2[] = "two"; 213240116Smarcel char s3[] = "three"; 214240116Smarcel 215240116Smarcel RE(atf_map_init(&map)); 216240116Smarcel RE(atf_map_insert(&map, "K1", s1, false)); 217240116Smarcel RE(atf_map_insert(&map, "K2", s2, false)); 218240116Smarcel RE(atf_map_insert(&map, "K3", s3, false)); 219240116Smarcel ATF_REQUIRE((array = atf_map_to_charpp(&map)) != NULL); 220240116Smarcel atf_map_fini(&map); 221240116Smarcel 222240116Smarcel ATF_CHECK_STREQ("K1", array[0]); 223240116Smarcel ATF_CHECK_STREQ("one", array[1]); 224240116Smarcel ATF_CHECK_STREQ("K2", array[2]); 225240116Smarcel ATF_CHECK_STREQ("two", array[3]); 226240116Smarcel ATF_CHECK_STREQ("K3", array[4]); 227240116Smarcel ATF_CHECK_STREQ("three", array[5]); 228240116Smarcel ATF_CHECK_EQ(NULL, array[6]); 229240116Smarcel atf_utils_free_charpp(array); 230240116Smarcel} 231240116Smarcel 232240116Smarcel/* 233240116Smarcel * Modifiers. 234240116Smarcel */ 235240116Smarcel 236240116SmarcelATF_TC(map_insert); 237240116SmarcelATF_TC_HEAD(map_insert, tc) 238240116Smarcel{ 239240116Smarcel atf_tc_set_md_var(tc, "descr", "Checks the atf_map_insert function"); 240240116Smarcel} 241240116SmarcelATF_TC_BODY(map_insert, tc) 242240116Smarcel{ 243240116Smarcel atf_map_t map; 244240116Smarcel char buf[] = "1st test string"; 245240116Smarcel char buf2[] = "2nd test string"; 246240116Smarcel const char *ptr; 247240116Smarcel atf_map_citer_t iter; 248240116Smarcel 249240116Smarcel RE(atf_map_init(&map)); 250240116Smarcel 251240116Smarcel printf("Inserting some values\n"); 252240116Smarcel ATF_REQUIRE_EQ(atf_map_size(&map), 0); 253240116Smarcel RE(atf_map_insert(&map, "K1", buf, false)); 254240116Smarcel ATF_REQUIRE_EQ(atf_map_size(&map), 1); 255240116Smarcel RE(atf_map_insert(&map, "K2", buf, false)); 256240116Smarcel ATF_REQUIRE_EQ(atf_map_size(&map), 2); 257240116Smarcel RE(atf_map_insert(&map, "K3", buf, false)); 258240116Smarcel ATF_REQUIRE_EQ(atf_map_size(&map), 3); 259240116Smarcel 260240116Smarcel printf("Replacing a value\n"); 261240116Smarcel iter = atf_map_find_c(&map, "K3"); 262240116Smarcel ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 263240116Smarcel ptr = atf_map_citer_data(iter); 264240116Smarcel ATF_REQUIRE_EQ(ptr, buf); 265240116Smarcel RE(atf_map_insert(&map, "K3", buf2, false)); 266240116Smarcel ATF_REQUIRE_EQ(atf_map_size(&map), 3); 267240116Smarcel iter = atf_map_find_c(&map, "K3"); 268240116Smarcel ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 269240116Smarcel ptr = atf_map_citer_data(iter); 270240116Smarcel ATF_REQUIRE_EQ(ptr, buf2); 271240116Smarcel 272240116Smarcel atf_map_fini(&map); 273240116Smarcel} 274240116Smarcel 275240116Smarcel/* 276240116Smarcel * Macros. 277240116Smarcel */ 278240116Smarcel 279240116SmarcelATF_TC(map_for_each); 280240116SmarcelATF_TC_HEAD(map_for_each, tc) 281240116Smarcel{ 282240116Smarcel atf_tc_set_md_var(tc, "descr", "Checks the atf_map_for_each macro"); 283240116Smarcel} 284240116SmarcelATF_TC_BODY(map_for_each, tc) 285240116Smarcel{ 286240116Smarcel atf_map_t map; 287240116Smarcel atf_map_iter_t iter; 288240116Smarcel size_t count, i, size; 289240116Smarcel char keys[10][5]; 290240116Smarcel int nums[10]; 291240116Smarcel 292240116Smarcel printf("Iterating over empty map\n"); 293240116Smarcel RE(atf_map_init(&map)); 294240116Smarcel count = 0; 295240116Smarcel atf_map_for_each(iter, &map) { 296240116Smarcel count++; 297240116Smarcel printf("Item count is now %zd\n", count); 298240116Smarcel } 299240116Smarcel ATF_REQUIRE_EQ(count, 0); 300240116Smarcel atf_map_fini(&map); 301240116Smarcel 302240116Smarcel for (size = 0; size <= 10; size++) { 303240116Smarcel printf("Iterating over map of %zd elements\n", size); 304240116Smarcel RE(atf_map_init(&map)); 305240116Smarcel for (i = 0; i < size; i++) { 306240116Smarcel nums[i] = i + 1; 307240116Smarcel snprintf(keys[i], sizeof(keys[i]), "%d", nums[i]); 308240116Smarcel RE(atf_map_insert(&map, keys[i], &nums[i], false)); 309240116Smarcel } 310240116Smarcel count = 0; 311240116Smarcel atf_map_for_each(iter, &map) { 312240116Smarcel printf("Retrieved item: %d\n", *(int *)atf_map_iter_data(iter)); 313240116Smarcel count++; 314240116Smarcel } 315240116Smarcel ATF_REQUIRE_EQ(count, size); 316240116Smarcel atf_map_fini(&map); 317240116Smarcel } 318240116Smarcel} 319240116Smarcel 320240116SmarcelATF_TC(map_for_each_c); 321240116SmarcelATF_TC_HEAD(map_for_each_c, tc) 322240116Smarcel{ 323240116Smarcel atf_tc_set_md_var(tc, "descr", "Checks the atf_map_for_each_c macro"); 324240116Smarcel} 325240116SmarcelATF_TC_BODY(map_for_each_c, tc) 326240116Smarcel{ 327240116Smarcel atf_map_t map; 328240116Smarcel atf_map_citer_t iter; 329240116Smarcel size_t count, i, size; 330240116Smarcel char keys[10][5]; 331240116Smarcel int nums[10]; 332240116Smarcel 333240116Smarcel printf("Iterating over empty map\n"); 334240116Smarcel RE(atf_map_init(&map)); 335240116Smarcel count = 0; 336240116Smarcel atf_map_for_each_c(iter, &map) { 337240116Smarcel count++; 338240116Smarcel printf("Item count is now %zd\n", count); 339240116Smarcel } 340240116Smarcel ATF_REQUIRE_EQ(count, 0); 341240116Smarcel atf_map_fini(&map); 342240116Smarcel 343240116Smarcel for (size = 0; size <= 10; size++) { 344240116Smarcel printf("Iterating over map of %zd elements\n", size); 345240116Smarcel RE(atf_map_init(&map)); 346240116Smarcel for (i = 0; i < size; i++) { 347240116Smarcel nums[i] = i + 1; 348240116Smarcel snprintf(keys[i], sizeof(keys[i]), "%d", nums[i]); 349240116Smarcel RE(atf_map_insert(&map, keys[i], &nums[i], false)); 350240116Smarcel } 351240116Smarcel count = 0; 352240116Smarcel atf_map_for_each_c(iter, &map) { 353240116Smarcel printf("Retrieved item: %d\n", 354240116Smarcel *(const int *)atf_map_citer_data(iter)); 355240116Smarcel count++; 356240116Smarcel } 357240116Smarcel ATF_REQUIRE_EQ(count, size); 358240116Smarcel atf_map_fini(&map); 359240116Smarcel } 360240116Smarcel} 361240116Smarcel 362240116Smarcel/* 363240116Smarcel * Other. 364240116Smarcel */ 365240116Smarcel 366240116SmarcelATF_TC(stable_keys); 367240116SmarcelATF_TC_HEAD(stable_keys, tc) 368240116Smarcel{ 369240116Smarcel atf_tc_set_md_var(tc, "descr", "Checks that the keys do not change " 370240116Smarcel "even if their original values do"); 371240116Smarcel} 372240116SmarcelATF_TC_BODY(stable_keys, tc) 373240116Smarcel{ 374240116Smarcel atf_map_t map; 375240116Smarcel atf_map_citer_t iter; 376240116Smarcel char key[] = "K1"; 377240116Smarcel 378240116Smarcel RE(atf_map_init(&map)); 379240116Smarcel 380240116Smarcel RE(atf_map_insert(&map, key, strdup("test-value"), true)); 381240116Smarcel iter = atf_map_find_c(&map, "K1"); 382240116Smarcel ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 383240116Smarcel iter = atf_map_find_c(&map, "K2"); 384240116Smarcel ATF_REQUIRE(atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 385240116Smarcel 386240116Smarcel strcpy(key, "K2"); 387240116Smarcel iter = atf_map_find_c(&map, "K1"); 388240116Smarcel ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 389240116Smarcel iter = atf_map_find_c(&map, "K2"); 390240116Smarcel ATF_REQUIRE(atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 391240116Smarcel 392240116Smarcel atf_map_fini(&map); 393240116Smarcel} 394240116Smarcel 395240116Smarcel/* --------------------------------------------------------------------- 396240116Smarcel * Main. 397240116Smarcel * --------------------------------------------------------------------- */ 398240116Smarcel 399240116SmarcelATF_TP_ADD_TCS(tp) 400240116Smarcel{ 401240116Smarcel /* Constructors and destructors. */ 402240116Smarcel ATF_TP_ADD_TC(tp, map_init); 403240116Smarcel ATF_TP_ADD_TC(tp, map_init_charpp_null); 404240116Smarcel ATF_TP_ADD_TC(tp, map_init_charpp_empty); 405240116Smarcel ATF_TP_ADD_TC(tp, map_init_charpp_some); 406240116Smarcel ATF_TP_ADD_TC(tp, map_init_charpp_short); 407240116Smarcel 408240116Smarcel /* Getters. */ 409240116Smarcel ATF_TP_ADD_TC(tp, find); 410240116Smarcel ATF_TP_ADD_TC(tp, find_c); 411240116Smarcel ATF_TP_ADD_TC(tp, to_charpp_empty); 412240116Smarcel ATF_TP_ADD_TC(tp, to_charpp_some); 413240116Smarcel 414240116Smarcel /* Modifiers. */ 415240116Smarcel ATF_TP_ADD_TC(tp, map_insert); 416240116Smarcel 417240116Smarcel /* Macros. */ 418240116Smarcel ATF_TP_ADD_TC(tp, map_for_each); 419240116Smarcel ATF_TP_ADD_TC(tp, map_for_each_c); 420240116Smarcel 421240116Smarcel /* Other. */ 422240116Smarcel ATF_TP_ADD_TC(tp, stable_keys); 423240116Smarcel 424240116Smarcel return atf_no_error(); 425240116Smarcel} 426