1 1.1 jmmv /* 2 1.1 jmmv * Automated Testing Framework (atf) 3 1.1 jmmv * 4 1.1.1.2 jmmv * Copyright (c) 2008 The NetBSD Foundation, Inc. 5 1.1 jmmv * All rights reserved. 6 1.1 jmmv * 7 1.1 jmmv * Redistribution and use in source and binary forms, with or without 8 1.1 jmmv * modification, are permitted provided that the following conditions 9 1.1 jmmv * are met: 10 1.1 jmmv * 1. Redistributions of source code must retain the above copyright 11 1.1 jmmv * notice, this list of conditions and the following disclaimer. 12 1.1 jmmv * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 jmmv * notice, this list of conditions and the following disclaimer in the 14 1.1 jmmv * documentation and/or other materials provided with the distribution. 15 1.1 jmmv * 16 1.1 jmmv * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 17 1.1 jmmv * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 18 1.1 jmmv * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19 1.1 jmmv * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 1.1 jmmv * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 21 1.1 jmmv * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 1.1 jmmv * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 23 1.1 jmmv * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24 1.1 jmmv * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 25 1.1 jmmv * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 26 1.1 jmmv * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27 1.1 jmmv * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 1.1 jmmv */ 29 1.1 jmmv 30 1.1 jmmv #include <stdio.h> 31 1.1 jmmv #include <stdlib.h> 32 1.1 jmmv #include <string.h> 33 1.1 jmmv 34 1.1 jmmv #include <atf-c.h> 35 1.1 jmmv 36 1.1 jmmv #include "sanity.h" 37 1.1 jmmv #include "test_helpers.h" 38 1.1 jmmv #include "text.h" 39 1.1 jmmv 40 1.1 jmmv /* --------------------------------------------------------------------- 41 1.1 jmmv * Auxiliary functions. 42 1.1 jmmv * --------------------------------------------------------------------- */ 43 1.1 jmmv 44 1.1 jmmv #define REQUIRE_ERROR(exp) \ 45 1.1 jmmv do { \ 46 1.1 jmmv atf_error_t err = exp; \ 47 1.1 jmmv ATF_REQUIRE(atf_is_error(err)); \ 48 1.1 jmmv atf_error_free(err); \ 49 1.1 jmmv } while (0) 50 1.1 jmmv 51 1.1 jmmv static 52 1.1 jmmv size_t 53 1.1 jmmv array_size(const char *words[]) 54 1.1 jmmv { 55 1.1 jmmv size_t count; 56 1.1 jmmv const char **word; 57 1.1 jmmv 58 1.1 jmmv count = 0; 59 1.1 jmmv for (word = words; *word != NULL; word++) 60 1.1 jmmv count++; 61 1.1 jmmv 62 1.1 jmmv return count; 63 1.1 jmmv } 64 1.1 jmmv 65 1.1 jmmv static 66 1.1 jmmv void 67 1.1 jmmv check_split(const char *str, const char *delim, const char *words[]) 68 1.1 jmmv { 69 1.1 jmmv atf_list_t list; 70 1.1 jmmv const char **word; 71 1.1 jmmv size_t i; 72 1.1 jmmv 73 1.1 jmmv printf("Splitting '%s' with delimiter '%s'\n", str, delim); 74 1.1 jmmv CE(atf_text_split(str, delim, &list)); 75 1.1 jmmv 76 1.1 jmmv printf("Expecting %zd words\n", array_size(words)); 77 1.1 jmmv ATF_CHECK_EQ(atf_list_size(&list), array_size(words)); 78 1.1 jmmv 79 1.1 jmmv for (word = words, i = 0; *word != NULL; word++, i++) { 80 1.1 jmmv printf("Word at position %zd should be '%s'\n", i, words[i]); 81 1.1 jmmv ATF_CHECK_STREQ((const char *)atf_list_index_c(&list, i), words[i]); 82 1.1 jmmv } 83 1.1 jmmv 84 1.1 jmmv atf_list_fini(&list); 85 1.1 jmmv } 86 1.1 jmmv 87 1.1 jmmv static 88 1.1 jmmv atf_error_t 89 1.1 jmmv word_acum(const char *word, void *data) 90 1.1 jmmv { 91 1.1 jmmv char *acum = data; 92 1.1 jmmv 93 1.1 jmmv strcat(acum, word); 94 1.1 jmmv 95 1.1 jmmv return atf_no_error(); 96 1.1 jmmv } 97 1.1 jmmv 98 1.1 jmmv static 99 1.1 jmmv atf_error_t 100 1.1.1.2 jmmv word_count(const char *word ATF_DEFS_ATTRIBUTE_UNUSED, void *data) 101 1.1 jmmv { 102 1.1 jmmv size_t *counter = data; 103 1.1 jmmv 104 1.1 jmmv (*counter)++; 105 1.1 jmmv 106 1.1 jmmv return atf_no_error(); 107 1.1 jmmv } 108 1.1 jmmv 109 1.1 jmmv struct fail_at { 110 1.1 jmmv int failpos; 111 1.1 jmmv int curpos; 112 1.1 jmmv }; 113 1.1 jmmv 114 1.1 jmmv static 115 1.1 jmmv atf_error_t 116 1.1.1.2 jmmv word_fail_at(const char *word ATF_DEFS_ATTRIBUTE_UNUSED, void *data) 117 1.1 jmmv { 118 1.1 jmmv struct fail_at *fa = data; 119 1.1 jmmv atf_error_t err; 120 1.1 jmmv 121 1.1 jmmv if (fa->failpos == fa->curpos) 122 1.1 jmmv err = atf_no_memory_error(); /* Just a random error. */ 123 1.1 jmmv else { 124 1.1 jmmv fa->curpos++; 125 1.1 jmmv err = atf_no_error(); 126 1.1 jmmv } 127 1.1 jmmv 128 1.1 jmmv return err; 129 1.1 jmmv } 130 1.1 jmmv 131 1.1 jmmv /* --------------------------------------------------------------------- 132 1.1 jmmv * Test cases for the free functions. 133 1.1 jmmv * --------------------------------------------------------------------- */ 134 1.1 jmmv 135 1.1 jmmv ATF_TC(for_each_word); 136 1.1 jmmv ATF_TC_HEAD(for_each_word, tc) 137 1.1 jmmv { 138 1.1 jmmv atf_tc_set_md_var(tc, "descr", "Checks the atf_text_for_each_word" 139 1.1 jmmv "function"); 140 1.1 jmmv } 141 1.1 jmmv ATF_TC_BODY(for_each_word, tc) 142 1.1 jmmv { 143 1.1 jmmv size_t cnt; 144 1.1 jmmv char acum[1024]; 145 1.1 jmmv 146 1.1 jmmv cnt = 0; 147 1.1 jmmv strcpy(acum, ""); 148 1.1 jmmv RE(atf_text_for_each_word("1 2 3", " ", word_count, &cnt)); 149 1.1 jmmv RE(atf_text_for_each_word("1 2 3", " ", word_acum, acum)); 150 1.1 jmmv ATF_REQUIRE(cnt == 3); 151 1.1 jmmv ATF_REQUIRE(strcmp(acum, "123") == 0); 152 1.1 jmmv 153 1.1 jmmv cnt = 0; 154 1.1 jmmv strcpy(acum, ""); 155 1.1 jmmv RE(atf_text_for_each_word("1 2 3", ".", word_count, &cnt)); 156 1.1 jmmv RE(atf_text_for_each_word("1 2 3", ".", word_acum, acum)); 157 1.1 jmmv ATF_REQUIRE(cnt == 1); 158 1.1 jmmv ATF_REQUIRE(strcmp(acum, "1 2 3") == 0); 159 1.1 jmmv 160 1.1 jmmv cnt = 0; 161 1.1 jmmv strcpy(acum, ""); 162 1.1 jmmv RE(atf_text_for_each_word("1 2 3 4 5", " ", word_count, &cnt)); 163 1.1 jmmv RE(atf_text_for_each_word("1 2 3 4 5", " ", word_acum, acum)); 164 1.1 jmmv ATF_REQUIRE(cnt == 5); 165 1.1 jmmv ATF_REQUIRE(strcmp(acum, "12345") == 0); 166 1.1 jmmv 167 1.1 jmmv cnt = 0; 168 1.1 jmmv strcpy(acum, ""); 169 1.1 jmmv RE(atf_text_for_each_word("1 2.3.4 5", " .", word_count, &cnt)); 170 1.1 jmmv RE(atf_text_for_each_word("1 2.3.4 5", " .", word_acum, acum)); 171 1.1 jmmv ATF_REQUIRE(cnt == 5); 172 1.1 jmmv ATF_REQUIRE(strcmp(acum, "12345") == 0); 173 1.1 jmmv 174 1.1 jmmv { 175 1.1 jmmv struct fail_at fa; 176 1.1 jmmv fa.failpos = 3; 177 1.1 jmmv fa.curpos = 0; 178 1.1 jmmv atf_error_t err = atf_text_for_each_word("a b c d e", " ", 179 1.1 jmmv word_fail_at, &fa); 180 1.1 jmmv ATF_REQUIRE(atf_is_error(err)); 181 1.1 jmmv ATF_REQUIRE(atf_error_is(err, "no_memory")); 182 1.1 jmmv ATF_REQUIRE(fa.curpos == 3); 183 1.1 jmmv atf_error_free(err); 184 1.1 jmmv } 185 1.1 jmmv } 186 1.1 jmmv 187 1.1 jmmv ATF_TC(format); 188 1.1 jmmv ATF_TC_HEAD(format, tc) 189 1.1 jmmv { 190 1.1 jmmv atf_tc_set_md_var(tc, "descr", "Checks the construction of free-form " 191 1.1 jmmv "strings using a variable parameters list"); 192 1.1 jmmv } 193 1.1 jmmv ATF_TC_BODY(format, tc) 194 1.1 jmmv { 195 1.1 jmmv char *str; 196 1.1 jmmv atf_error_t err; 197 1.1 jmmv 198 1.1 jmmv err = atf_text_format(&str, "%s %s %d", "Test", "string", 1); 199 1.1 jmmv ATF_REQUIRE(!atf_is_error(err)); 200 1.1 jmmv ATF_REQUIRE(strcmp(str, "Test string 1") == 0); 201 1.1 jmmv free(str); 202 1.1 jmmv } 203 1.1 jmmv 204 1.1 jmmv static 205 1.1 jmmv void 206 1.1 jmmv format_ap(char **dest, const char *fmt, ...) 207 1.1 jmmv { 208 1.1 jmmv va_list ap; 209 1.1 jmmv atf_error_t err; 210 1.1 jmmv 211 1.1 jmmv va_start(ap, fmt); 212 1.1 jmmv err = atf_text_format_ap(dest, fmt, ap); 213 1.1 jmmv va_end(ap); 214 1.1 jmmv 215 1.1 jmmv ATF_REQUIRE(!atf_is_error(err)); 216 1.1 jmmv } 217 1.1 jmmv 218 1.1 jmmv ATF_TC(format_ap); 219 1.1 jmmv ATF_TC_HEAD(format_ap, tc) 220 1.1 jmmv { 221 1.1 jmmv atf_tc_set_md_var(tc, "descr", "Checks the construction of free-form " 222 1.1 jmmv "strings using a va_list argument"); 223 1.1 jmmv } 224 1.1 jmmv ATF_TC_BODY(format_ap, tc) 225 1.1 jmmv { 226 1.1 jmmv char *str; 227 1.1 jmmv 228 1.1 jmmv format_ap(&str, "%s %s %d", "Test", "string", 1); 229 1.1 jmmv ATF_REQUIRE(strcmp(str, "Test string 1") == 0); 230 1.1 jmmv free(str); 231 1.1 jmmv } 232 1.1 jmmv 233 1.1 jmmv ATF_TC(split); 234 1.1 jmmv ATF_TC_HEAD(split, tc) 235 1.1 jmmv { 236 1.1 jmmv atf_tc_set_md_var(tc, "descr", "Checks the split function"); 237 1.1 jmmv } 238 1.1 jmmv ATF_TC_BODY(split, tc) 239 1.1 jmmv { 240 1.1 jmmv { 241 1.1 jmmv const char *words[] = { NULL }; 242 1.1 jmmv check_split("", " ", words); 243 1.1 jmmv } 244 1.1 jmmv 245 1.1 jmmv { 246 1.1 jmmv const char *words[] = { NULL }; 247 1.1 jmmv check_split(" ", " ", words); 248 1.1 jmmv } 249 1.1 jmmv 250 1.1 jmmv { 251 1.1 jmmv const char *words[] = { NULL }; 252 1.1 jmmv check_split(" ", " ", words); 253 1.1 jmmv } 254 1.1 jmmv 255 1.1 jmmv { 256 1.1 jmmv const char *words[] = { "a", "b", NULL }; 257 1.1 jmmv check_split("a b", " ", words); 258 1.1 jmmv } 259 1.1 jmmv 260 1.1 jmmv { 261 1.1 jmmv const char *words[] = { "a", "b", "c", "d", NULL }; 262 1.1 jmmv check_split("a b c d", " ", words); 263 1.1 jmmv } 264 1.1 jmmv 265 1.1 jmmv { 266 1.1 jmmv const char *words[] = { "foo", "bar", NULL }; 267 1.1 jmmv check_split("foo bar", " ", words); 268 1.1 jmmv } 269 1.1 jmmv 270 1.1 jmmv { 271 1.1 jmmv const char *words[] = { "foo", "bar", "baz", "foobar", NULL }; 272 1.1 jmmv check_split("foo bar baz foobar", " ", words); 273 1.1 jmmv } 274 1.1 jmmv 275 1.1 jmmv { 276 1.1 jmmv const char *words[] = { "foo", "bar", NULL }; 277 1.1 jmmv check_split(" foo bar", " ", words); 278 1.1 jmmv } 279 1.1 jmmv 280 1.1 jmmv { 281 1.1 jmmv const char *words[] = { "foo", "bar", NULL }; 282 1.1 jmmv check_split("foo bar", " ", words); 283 1.1 jmmv } 284 1.1 jmmv 285 1.1 jmmv { 286 1.1 jmmv const char *words[] = { "foo", "bar", NULL }; 287 1.1 jmmv check_split("foo bar ", " ", words); 288 1.1 jmmv } 289 1.1 jmmv 290 1.1 jmmv { 291 1.1 jmmv const char *words[] = { "foo", "bar", NULL }; 292 1.1 jmmv check_split(" foo bar ", " ", words); 293 1.1 jmmv } 294 1.1 jmmv } 295 1.1 jmmv 296 1.1 jmmv ATF_TC(split_delims); 297 1.1 jmmv ATF_TC_HEAD(split_delims, tc) 298 1.1 jmmv { 299 1.1 jmmv atf_tc_set_md_var(tc, "descr", "Checks the split function using " 300 1.1 jmmv "different delimiters"); 301 1.1 jmmv } 302 1.1 jmmv ATF_TC_BODY(split_delims, tc) 303 1.1 jmmv { 304 1.1 jmmv 305 1.1 jmmv { 306 1.1 jmmv const char *words[] = { NULL }; 307 1.1 jmmv check_split("", "/", words); 308 1.1 jmmv } 309 1.1 jmmv 310 1.1 jmmv { 311 1.1 jmmv const char *words[] = { " ", NULL }; 312 1.1 jmmv check_split(" ", "/", words); 313 1.1 jmmv } 314 1.1 jmmv 315 1.1 jmmv { 316 1.1 jmmv const char *words[] = { " ", NULL }; 317 1.1 jmmv check_split(" ", "/", words); 318 1.1 jmmv } 319 1.1 jmmv 320 1.1 jmmv { 321 1.1 jmmv const char *words[] = { "a", "b", NULL }; 322 1.1 jmmv check_split("a/b", "/", words); 323 1.1 jmmv } 324 1.1 jmmv 325 1.1 jmmv { 326 1.1 jmmv const char *words[] = { "a", "bcd", "ef", NULL }; 327 1.1 jmmv check_split("aLONGDELIMbcdLONGDELIMef", "LONGDELIM", words); 328 1.1 jmmv } 329 1.1 jmmv } 330 1.1 jmmv 331 1.1 jmmv ATF_TC(to_bool); 332 1.1 jmmv ATF_TC_HEAD(to_bool, tc) 333 1.1 jmmv { 334 1.1 jmmv atf_tc_set_md_var(tc, "descr", "Checks the atf_text_to_bool function"); 335 1.1 jmmv } 336 1.1 jmmv ATF_TC_BODY(to_bool, tc) 337 1.1 jmmv { 338 1.1 jmmv bool b; 339 1.1 jmmv 340 1.1 jmmv RE(atf_text_to_bool("true", &b)); ATF_REQUIRE(b); 341 1.1 jmmv RE(atf_text_to_bool("TRUE", &b)); ATF_REQUIRE(b); 342 1.1 jmmv RE(atf_text_to_bool("yes", &b)); ATF_REQUIRE(b); 343 1.1 jmmv RE(atf_text_to_bool("YES", &b)); ATF_REQUIRE(b); 344 1.1 jmmv 345 1.1 jmmv RE(atf_text_to_bool("false", &b)); ATF_REQUIRE(!b); 346 1.1 jmmv RE(atf_text_to_bool("FALSE", &b)); ATF_REQUIRE(!b); 347 1.1 jmmv RE(atf_text_to_bool("no", &b)); ATF_REQUIRE(!b); 348 1.1 jmmv RE(atf_text_to_bool("NO", &b)); ATF_REQUIRE(!b); 349 1.1 jmmv 350 1.1 jmmv b = false; 351 1.1 jmmv REQUIRE_ERROR(atf_text_to_bool("", &b)); 352 1.1 jmmv ATF_REQUIRE(!b); 353 1.1 jmmv b = true; 354 1.1 jmmv REQUIRE_ERROR(atf_text_to_bool("", &b)); 355 1.1 jmmv ATF_REQUIRE(b); 356 1.1 jmmv 357 1.1 jmmv b = false; 358 1.1 jmmv REQUIRE_ERROR(atf_text_to_bool("tru", &b)); 359 1.1 jmmv ATF_REQUIRE(!b); 360 1.1 jmmv b = true; 361 1.1 jmmv REQUIRE_ERROR(atf_text_to_bool("tru", &b)); 362 1.1 jmmv ATF_REQUIRE(b); 363 1.1 jmmv 364 1.1 jmmv b = false; 365 1.1 jmmv REQUIRE_ERROR(atf_text_to_bool("true2", &b)); 366 1.1 jmmv ATF_REQUIRE(!b); 367 1.1 jmmv b = true; 368 1.1 jmmv REQUIRE_ERROR(atf_text_to_bool("true2", &b)); 369 1.1 jmmv ATF_REQUIRE(b); 370 1.1 jmmv 371 1.1 jmmv b = false; 372 1.1 jmmv REQUIRE_ERROR(atf_text_to_bool("fals", &b)); 373 1.1 jmmv ATF_REQUIRE(!b); 374 1.1 jmmv b = true; 375 1.1 jmmv REQUIRE_ERROR(atf_text_to_bool("fals", &b)); 376 1.1 jmmv ATF_REQUIRE(b); 377 1.1 jmmv 378 1.1 jmmv b = false; 379 1.1 jmmv REQUIRE_ERROR(atf_text_to_bool("false2", &b)); 380 1.1 jmmv ATF_REQUIRE(!b); 381 1.1 jmmv b = true; 382 1.1 jmmv REQUIRE_ERROR(atf_text_to_bool("false2", &b)); 383 1.1 jmmv ATF_REQUIRE(b); 384 1.1 jmmv } 385 1.1 jmmv 386 1.1 jmmv ATF_TC(to_long); 387 1.1 jmmv ATF_TC_HEAD(to_long, tc) 388 1.1 jmmv { 389 1.1 jmmv atf_tc_set_md_var(tc, "descr", "Checks the atf_text_to_long function"); 390 1.1 jmmv } 391 1.1 jmmv ATF_TC_BODY(to_long, tc) 392 1.1 jmmv { 393 1.1 jmmv long l; 394 1.1 jmmv 395 1.1 jmmv RE(atf_text_to_long("0", &l)); ATF_REQUIRE_EQ(l, 0); 396 1.1 jmmv RE(atf_text_to_long("-5", &l)); ATF_REQUIRE_EQ(l, -5); 397 1.1 jmmv RE(atf_text_to_long("5", &l)); ATF_REQUIRE_EQ(l, 5); 398 1.1 jmmv RE(atf_text_to_long("123456789", &l)); ATF_REQUIRE_EQ(l, 123456789); 399 1.1 jmmv 400 1.1 jmmv l = 1212; 401 1.1 jmmv REQUIRE_ERROR(atf_text_to_long("", &l)); 402 1.1 jmmv ATF_REQUIRE_EQ(l, 1212); 403 1.1 jmmv REQUIRE_ERROR(atf_text_to_long("foo", &l)); 404 1.1 jmmv ATF_REQUIRE_EQ(l, 1212); 405 1.1 jmmv REQUIRE_ERROR(atf_text_to_long("1234x", &l)); 406 1.1 jmmv ATF_REQUIRE_EQ(l, 1212); 407 1.1 jmmv } 408 1.1 jmmv 409 1.1 jmmv /* --------------------------------------------------------------------- 410 1.1 jmmv * Main. 411 1.1 jmmv * --------------------------------------------------------------------- */ 412 1.1 jmmv 413 1.1 jmmv ATF_TP_ADD_TCS(tp) 414 1.1 jmmv { 415 1.1 jmmv ATF_TP_ADD_TC(tp, for_each_word); 416 1.1 jmmv ATF_TP_ADD_TC(tp, format); 417 1.1 jmmv ATF_TP_ADD_TC(tp, format_ap); 418 1.1 jmmv ATF_TP_ADD_TC(tp, split); 419 1.1 jmmv ATF_TP_ADD_TC(tp, split_delims); 420 1.1 jmmv ATF_TP_ADD_TC(tp, to_bool); 421 1.1 jmmv ATF_TP_ADD_TC(tp, to_long); 422 1.1 jmmv 423 1.1 jmmv return atf_no_error(); 424 1.1 jmmv } 425