1b824378bSEnji Cooper /*- 2148a8da8SEnji Cooper * Copyright (c) 2017 Enji Cooper <ngie@freebsd.org> 3b824378bSEnji Cooper * 4b824378bSEnji Cooper * Redistribution and use in source and binary forms, with or without 5b824378bSEnji Cooper * modification, are permitted provided that the following conditions 6b824378bSEnji Cooper * are met: 7b824378bSEnji Cooper * 1. Redistributions of source code must retain the above copyright 8b824378bSEnji Cooper * notice, this list of conditions and the following disclaimer. 9b824378bSEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 10b824378bSEnji Cooper * notice, this list of conditions and the following disclaimer in the 11b824378bSEnji Cooper * documentation and/or other materials provided with the distribution. 12b824378bSEnji Cooper * 13b824378bSEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14b824378bSEnji Cooper * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15b824378bSEnji Cooper * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16b824378bSEnji Cooper * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 17b824378bSEnji Cooper * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18b824378bSEnji Cooper * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19b824378bSEnji Cooper * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20b824378bSEnji Cooper * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21b824378bSEnji Cooper * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22b824378bSEnji Cooper * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23b824378bSEnji Cooper * SUCH DAMAGE. 24b824378bSEnji Cooper */ 25b824378bSEnji Cooper 26b824378bSEnji Cooper #include <sys/param.h> 27b824378bSEnji Cooper #include <sys/sbuf.h> 28*991bd461SEnji Cooper 29*991bd461SEnji Cooper #include <atf-c.h> 30b824378bSEnji Cooper #include <errno.h> 31b824378bSEnji Cooper #include <libutil.h> 32b824378bSEnji Cooper #include <stdio.h> 33b824378bSEnji Cooper #include <stdlib.h> 34b824378bSEnji Cooper #include <string.h> 35b824378bSEnji Cooper 36b824378bSEnji Cooper #include "sbuf_test_common.h" 37b824378bSEnji Cooper 38b824378bSEnji Cooper static char test_string[] = "this is a test string"; 39b824378bSEnji Cooper static char test_whitespace_string[] = " \f\n\r\t\v "; 40*991bd461SEnji Cooper static int test_buffer[] = { 41*991bd461SEnji Cooper 0, 42*991bd461SEnji Cooper 1, 43*991bd461SEnji Cooper 2, 44*991bd461SEnji Cooper 3, 45*991bd461SEnji Cooper 4, 46*991bd461SEnji Cooper 5, 47*991bd461SEnji Cooper }; 48b824378bSEnji Cooper 49b824378bSEnji Cooper static void 50b824378bSEnji Cooper check_buffers_equal(const void *sb_buf, const void *test_buf, size_t len) 51b824378bSEnji Cooper { 52b824378bSEnji Cooper if (memcmp(sb_buf, test_buf, len) != 0) { 53b824378bSEnji Cooper printf("sbuf:\n"); 54*991bd461SEnji Cooper hexdump(sb_buf, len, NULL, 0), printf("test_buf:\n"); 55b824378bSEnji Cooper hexdump(test_buf, len, NULL, 0); 56b824378bSEnji Cooper atf_tc_fail("contents of sbuf didn't match test_buf contents"); 57b824378bSEnji Cooper } 58b824378bSEnji Cooper } 59b824378bSEnji Cooper 60b824378bSEnji Cooper ATF_TC_WITHOUT_HEAD(sbuf_bcat_test); 61b824378bSEnji Cooper ATF_TC_BODY(sbuf_bcat_test, tc) 62b824378bSEnji Cooper { 63b824378bSEnji Cooper struct sbuf *sb; 64b824378bSEnji Cooper int *test_buffer_tmp; 65b824378bSEnji Cooper ssize_t test_sbuf_len; 66b824378bSEnji Cooper 67b824378bSEnji Cooper test_buffer_tmp = malloc(sizeof(test_buffer) * 2); 68b824378bSEnji Cooper ATF_REQUIRE_MSG(test_buffer_tmp != NULL, "malloc failed"); 69b824378bSEnji Cooper 70b824378bSEnji Cooper memcpy(test_buffer_tmp, test_buffer, sizeof(test_buffer)); 71b824378bSEnji Cooper memcpy(&test_buffer_tmp[nitems(test_buffer)], test_buffer, 72b824378bSEnji Cooper sizeof(test_buffer)); 73b824378bSEnji Cooper 74b824378bSEnji Cooper sb = sbuf_new_auto(); 75b824378bSEnji Cooper ATF_REQUIRE_MSG(sb != NULL, "sbuf_new_auto failed: %s", 76b824378bSEnji Cooper strerror(errno)); 77b824378bSEnji Cooper 78b824378bSEnji Cooper ATF_CHECK_MSG(sbuf_bcat(sb, test_buffer, sizeof(test_buffer)) == 0, 79b824378bSEnji Cooper "sbuf_bcat failed"); 80b824378bSEnji Cooper 81b824378bSEnji Cooper test_sbuf_len = sbuf_len(sb); 82b824378bSEnji Cooper ATF_REQUIRE_MSG(test_sbuf_len == (ssize_t)sizeof(test_buffer), 83*991bd461SEnji Cooper "sbuf_len(..) => %zd (actual) != %zu (expected)", test_sbuf_len, 84*991bd461SEnji Cooper sizeof(test_buffer)); 85b824378bSEnji Cooper 86b824378bSEnji Cooper ATF_CHECK_MSG(sbuf_bcat(sb, test_buffer, sizeof(test_buffer)) == 0, 87b824378bSEnji Cooper "sbuf_bcat failed"); 88b824378bSEnji Cooper 89b824378bSEnji Cooper test_sbuf_len = sbuf_len(sb); 90b824378bSEnji Cooper ATF_REQUIRE_MSG(test_sbuf_len == (ssize_t)(2 * sizeof(test_buffer)), 91*991bd461SEnji Cooper "sbuf_len(..) => %zd (actual) != %zu (expected)", test_sbuf_len, 92*991bd461SEnji Cooper 2 * sizeof(test_buffer)); 93b824378bSEnji Cooper 94b824378bSEnji Cooper ATF_REQUIRE_MSG(sbuf_finish(sb) == 0, "sbuf_finish failed: %s", 95b824378bSEnji Cooper strerror(errno)); 96b824378bSEnji Cooper 97b824378bSEnji Cooper check_buffers_equal(sbuf_data(sb), test_buffer_tmp, 98b824378bSEnji Cooper (size_t)test_sbuf_len); 99b824378bSEnji Cooper 100b824378bSEnji Cooper sbuf_delete(sb); 101b824378bSEnji Cooper 102b824378bSEnji Cooper free(test_buffer_tmp); 103b824378bSEnji Cooper } 104b824378bSEnji Cooper 105b824378bSEnji Cooper ATF_TC_WITHOUT_HEAD(sbuf_bcpy_test); 106b824378bSEnji Cooper ATF_TC_BODY(sbuf_bcpy_test, tc) 107b824378bSEnji Cooper { 108b824378bSEnji Cooper struct sbuf *sb; 109b824378bSEnji Cooper ssize_t test_sbuf_len; 110b824378bSEnji Cooper 111b824378bSEnji Cooper sb = sbuf_new_auto(); 112b824378bSEnji Cooper ATF_REQUIRE_MSG(sb != NULL, "sbuf_new_auto failed: %s", 113b824378bSEnji Cooper strerror(errno)); 114b824378bSEnji Cooper 115b824378bSEnji Cooper ATF_CHECK_MSG(sbuf_bcpy(sb, test_buffer, sizeof(test_buffer)) == 0, 116b824378bSEnji Cooper "sbuf_bcpy failed"); 117b824378bSEnji Cooper 118b824378bSEnji Cooper test_sbuf_len = sbuf_len(sb); 119b824378bSEnji Cooper ATF_REQUIRE_MSG(test_sbuf_len == (ssize_t)sizeof(test_buffer), 120*991bd461SEnji Cooper "sbuf_len(..) => %zd (actual) != %zu (expected)", test_sbuf_len, 121*991bd461SEnji Cooper sizeof(test_buffer)); 122b824378bSEnji Cooper 123b824378bSEnji Cooper ATF_CHECK_MSG(sbuf_bcpy(sb, test_buffer, sizeof(test_buffer)) == 0, 124b824378bSEnji Cooper "sbuf_bcpy failed"); 125b824378bSEnji Cooper 126b824378bSEnji Cooper test_sbuf_len = sbuf_len(sb); 127b824378bSEnji Cooper ATF_REQUIRE_MSG(test_sbuf_len == (ssize_t)sizeof(test_buffer), 128*991bd461SEnji Cooper "sbuf_len(..) => %zd (actual) != %zu (expected)", test_sbuf_len, 129*991bd461SEnji Cooper sizeof(test_buffer)); 130b824378bSEnji Cooper 131b824378bSEnji Cooper ATF_REQUIRE_MSG(sbuf_finish(sb) == 0, "sbuf_finish failed: %s", 132b824378bSEnji Cooper strerror(errno)); 133b824378bSEnji Cooper 134b824378bSEnji Cooper check_buffers_equal(sbuf_data(sb), test_buffer, (size_t)test_sbuf_len); 135b824378bSEnji Cooper 136b824378bSEnji Cooper sbuf_delete(sb); 137b824378bSEnji Cooper } 138b824378bSEnji Cooper 139b824378bSEnji Cooper ATF_TC_WITHOUT_HEAD(sbuf_cat_test); 140b824378bSEnji Cooper ATF_TC_BODY(sbuf_cat_test, tc) 141b824378bSEnji Cooper { 142b824378bSEnji Cooper struct sbuf *sb; 143b824378bSEnji Cooper char *test_string_tmp; 144b824378bSEnji Cooper ssize_t test_sbuf_len; 145b824378bSEnji Cooper 146b824378bSEnji Cooper asprintf(&test_string_tmp, "%s%s", test_string, test_string); 147b824378bSEnji Cooper ATF_REQUIRE_MSG(test_string_tmp != NULL, "asprintf failed"); 148b824378bSEnji Cooper 149b824378bSEnji Cooper sb = sbuf_new_auto(); 150b824378bSEnji Cooper ATF_REQUIRE_MSG(sb != NULL, "sbuf_new_auto failed: %s", 151b824378bSEnji Cooper strerror(errno)); 152b824378bSEnji Cooper 153b824378bSEnji Cooper ATF_CHECK_MSG(sbuf_cat(sb, test_string) == 0, "sbuf_cat failed"); 154b824378bSEnji Cooper 155b824378bSEnji Cooper test_sbuf_len = sbuf_len(sb); 156b824378bSEnji Cooper ATF_REQUIRE_MSG(test_sbuf_len == (ssize_t)strlen(test_string), 157*991bd461SEnji Cooper "sbuf_len(..) => %zd (actual) != %zu (expected)", test_sbuf_len, 158*991bd461SEnji Cooper sizeof(test_string)); 159b824378bSEnji Cooper 160b824378bSEnji Cooper ATF_CHECK_MSG(sbuf_cat(sb, test_string) == 0, "sbuf_cat failed"); 161b824378bSEnji Cooper 162b824378bSEnji Cooper test_sbuf_len = sbuf_len(sb); 163b824378bSEnji Cooper ATF_REQUIRE_MSG(test_sbuf_len == (ssize_t)strlen(test_string_tmp), 164*991bd461SEnji Cooper "sbuf_len(..) => %zd (actual) != %zu (expected)", test_sbuf_len, 165*991bd461SEnji Cooper strlen(test_string_tmp)); 166b824378bSEnji Cooper 167b824378bSEnji Cooper ATF_REQUIRE_MSG(sbuf_finish(sb) == 0, "sbuf_finish failed: %s", 168b824378bSEnji Cooper strerror(errno)); 169b824378bSEnji Cooper 170b824378bSEnji Cooper ATF_REQUIRE_STREQ_MSG(sbuf_data(sb), test_string_tmp, 171b824378bSEnji Cooper "sbuf (\"%s\") != test string (\"%s\")", sbuf_data(sb), 172b824378bSEnji Cooper test_string_tmp); 173b824378bSEnji Cooper 174b824378bSEnji Cooper sbuf_delete(sb); 175b824378bSEnji Cooper 176b824378bSEnji Cooper free(test_string_tmp); 177b824378bSEnji Cooper } 178b824378bSEnji Cooper 179b824378bSEnji Cooper ATF_TC_WITHOUT_HEAD(sbuf_cpy_test); 180b824378bSEnji Cooper ATF_TC_BODY(sbuf_cpy_test, tc) 181b824378bSEnji Cooper { 182b824378bSEnji Cooper struct sbuf *sb; 183b824378bSEnji Cooper ssize_t test_sbuf_len; 184b824378bSEnji Cooper 185b824378bSEnji Cooper sb = sbuf_new_auto(); 186b824378bSEnji Cooper ATF_REQUIRE_MSG(sb != NULL, "sbuf_new_auto failed: %s", 187b824378bSEnji Cooper strerror(errno)); 188b824378bSEnji Cooper 189b824378bSEnji Cooper ATF_CHECK_MSG(sbuf_cpy(sb, test_string) == 0, "sbuf_cpy failed"); 190b824378bSEnji Cooper 191b824378bSEnji Cooper test_sbuf_len = sbuf_len(sb); 192b824378bSEnji Cooper ATF_REQUIRE_MSG(test_sbuf_len == (ssize_t)strlen(test_string), 193*991bd461SEnji Cooper "sbuf_len(..) => %zd (actual) != %zu (expected)", test_sbuf_len, 194*991bd461SEnji Cooper strlen(test_string)); 195b824378bSEnji Cooper 196b824378bSEnji Cooper ATF_CHECK_MSG(sbuf_cpy(sb, test_string) == 0, "sbuf_cpy failed"); 197b824378bSEnji Cooper 198b824378bSEnji Cooper test_sbuf_len = sbuf_len(sb); 199b824378bSEnji Cooper ATF_REQUIRE_MSG(test_sbuf_len == (ssize_t)strlen(test_string), 200*991bd461SEnji Cooper "sbuf_len(..) => %zd (actual) != %zu (expected)", test_sbuf_len, 201*991bd461SEnji Cooper strlen(test_string)); 202b824378bSEnji Cooper 203b824378bSEnji Cooper ATF_REQUIRE_MSG(sbuf_finish(sb) == 0, "sbuf_finish failed: %s", 204b824378bSEnji Cooper strerror(errno)); 205b824378bSEnji Cooper 206b824378bSEnji Cooper ATF_REQUIRE_STREQ_MSG(sbuf_data(sb), test_string, 207b824378bSEnji Cooper "sbuf (\"%s\") != test string (\"%s\")", sbuf_data(sb), 208b824378bSEnji Cooper test_string); 209b824378bSEnji Cooper 210b824378bSEnji Cooper sbuf_delete(sb); 211b824378bSEnji Cooper } 212b824378bSEnji Cooper 213b824378bSEnji Cooper ATF_TC_WITHOUT_HEAD(sbuf_putc_test); 214b824378bSEnji Cooper ATF_TC_BODY(sbuf_putc_test, tc) 215b824378bSEnji Cooper { 216b824378bSEnji Cooper struct sbuf *sb; 217b824378bSEnji Cooper ssize_t test_sbuf_len; 218b824378bSEnji Cooper size_t i; 219b824378bSEnji Cooper 220b824378bSEnji Cooper sb = sbuf_new_auto(); 221b824378bSEnji Cooper ATF_REQUIRE_MSG(sb != NULL, "sbuf_new_auto failed: %s", 222b824378bSEnji Cooper strerror(errno)); 223b824378bSEnji Cooper 224b824378bSEnji Cooper for (i = 0; i <= strlen(test_string); i++) { /* Include the NUL */ 225b824378bSEnji Cooper ATF_REQUIRE_MSG(sbuf_putc(sb, test_string[i]) == 0, 226b824378bSEnji Cooper "sbuf_putc failed"); 227b824378bSEnji Cooper 228b824378bSEnji Cooper /* The best we can do until sbuf_finish(3) is called. */ 229b824378bSEnji Cooper test_sbuf_len = sbuf_len(sb); 230b824378bSEnji Cooper ATF_REQUIRE_MSG((ssize_t)(i + 1) == test_sbuf_len, 231b824378bSEnji Cooper "sbuf_len(..) => %zd (actual) != %zu (expected)", 232b824378bSEnji Cooper test_sbuf_len, i + 1); 233b824378bSEnji Cooper } 234b824378bSEnji Cooper 235b824378bSEnji Cooper ATF_REQUIRE_MSG(sbuf_finish(sb) == 0, "sbuf_finish failed: %s", 236b824378bSEnji Cooper strerror(errno)); 237b824378bSEnji Cooper 238b824378bSEnji Cooper ATF_REQUIRE_STREQ_MSG(sbuf_data(sb), test_string, 239b824378bSEnji Cooper "sbuf (\"%s\") != test string (\"%s\")", sbuf_data(sb), 240b824378bSEnji Cooper test_string); 241b824378bSEnji Cooper 242b824378bSEnji Cooper sbuf_delete(sb); 243b824378bSEnji Cooper } 244b824378bSEnji Cooper 245b824378bSEnji Cooper ATF_TC_WITHOUT_HEAD(sbuf_trim_test); 246b824378bSEnji Cooper ATF_TC_BODY(sbuf_trim_test, tc) 247b824378bSEnji Cooper { 248b824378bSEnji Cooper struct sbuf *sb; 249b824378bSEnji Cooper ssize_t exp_sbuf_len, test_sbuf_len; 250b824378bSEnji Cooper 251b824378bSEnji Cooper sb = sbuf_new_auto(); 252b824378bSEnji Cooper ATF_REQUIRE_MSG(sb != NULL, "sbuf_new_auto failed: %s", 253b824378bSEnji Cooper strerror(errno)); 254b824378bSEnji Cooper 255b824378bSEnji Cooper ATF_CHECK_MSG(sbuf_cpy(sb, test_string) == 0, "sbuf_cpy failed"); 256b824378bSEnji Cooper ATF_CHECK_MSG(sbuf_cat(sb, test_whitespace_string) == 0, 257b824378bSEnji Cooper "sbuf_cat failed"); 258b824378bSEnji Cooper 259b824378bSEnji Cooper /* The best we can do until sbuf_finish(3) is called. */ 260b824378bSEnji Cooper exp_sbuf_len = (ssize_t)(strlen(test_string) + 261b824378bSEnji Cooper strlen(test_whitespace_string)); 262b824378bSEnji Cooper test_sbuf_len = sbuf_len(sb); 263b824378bSEnji Cooper ATF_REQUIRE_MSG(exp_sbuf_len == test_sbuf_len, 264*991bd461SEnji Cooper "sbuf_len(..) => %zd (actual) != %zu (expected)", test_sbuf_len, 265*991bd461SEnji Cooper exp_sbuf_len); 266b824378bSEnji Cooper 267b824378bSEnji Cooper ATF_REQUIRE_MSG(sbuf_trim(sb) == 0, "sbuf_trim failed"); 268b824378bSEnji Cooper 269b824378bSEnji Cooper ATF_REQUIRE_MSG(sbuf_finish(sb) == 0, "sbuf_finish failed: %s", 270b824378bSEnji Cooper strerror(errno)); 271b824378bSEnji Cooper 272b824378bSEnji Cooper ATF_REQUIRE_STREQ_MSG(sbuf_data(sb), test_string, 273b824378bSEnji Cooper "sbuf (\"%s\") != test string (\"%s\") (trimmed)", sbuf_data(sb), 274b824378bSEnji Cooper test_string); 275b824378bSEnji Cooper 276b824378bSEnji Cooper sbuf_delete(sb); 277b824378bSEnji Cooper } 278b824378bSEnji Cooper 279b824378bSEnji Cooper ATF_TP_ADD_TCS(tp) 280b824378bSEnji Cooper { 281b824378bSEnji Cooper ATF_TP_ADD_TC(tp, sbuf_bcat_test); 282b824378bSEnji Cooper ATF_TP_ADD_TC(tp, sbuf_bcpy_test); 283b824378bSEnji Cooper ATF_TP_ADD_TC(tp, sbuf_cat_test); 284b824378bSEnji Cooper ATF_TP_ADD_TC(tp, sbuf_cpy_test); 285b824378bSEnji Cooper ATF_TP_ADD_TC(tp, sbuf_putc_test); 286b824378bSEnji Cooper ATF_TP_ADD_TC(tp, sbuf_trim_test); 287b824378bSEnji Cooper 288b824378bSEnji Cooper return (atf_no_error()); 289b824378bSEnji Cooper } 290