1 /* $NetBSD: t_print.c,v 1.2 2016/08/27 11:30:49 christos Exp $ */ 2 3 /*- 4 * Copyright (c) 2014 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Christos Zoulas. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 #include <sys/cdefs.h> 32 __RCSID("$NetBSD: t_print.c,v 1.2 2016/08/27 11:30:49 christos Exp $"); 33 34 #include "net/dl_print.c" 35 36 #include <atf-c.h> 37 38 static const struct { 39 struct dl_addr ia; 40 const char *str; 41 int len; 42 } tst[] = { 43 { 44 { 45 .dl_type = 6, 46 .dl_nlen = 0, 47 .dl_alen = 6, 48 .dl_slen = 0, 49 .dl_data = { 50 (char)0x01, (char)0xa2, (char)0x03, 51 (char)0xc4, (char)0x05, (char)0xf6, 52 }, 53 }, 54 "/6#01:a2:03:c4:05:f6", 55 20, 56 }, 57 { 58 { 59 .dl_type = 24, 60 .dl_nlen = 3, 61 .dl_alen = 6, 62 .dl_slen = 0, 63 .dl_data = { 64 'l', 'o', '0', 65 (char)0x11, (char)0x22, (char)0x33, 66 (char)0x44, (char)0x55, (char)0x66, 67 }, 68 }, 69 "lo0/24#11:22:33:44:55:66", 70 24, 71 }, 72 { 73 { 74 .dl_type = 24, 75 .dl_nlen = 7, 76 .dl_alen = 1, 77 .dl_slen = 0, 78 .dl_data = { 79 'n', 'p', 'f', 'l', 'o', 'g', '0', (char)0xa5, 80 }, 81 }, 82 "npflog0/24#a5", 83 13, 84 }, 85 { 86 { 87 .dl_type = 0, 88 .dl_nlen = 0, 89 .dl_alen = 0, 90 .dl_slen = 0, 91 .dl_data = { 92 '\0' 93 }, 94 }, 95 "/0#", 96 3, 97 }, 98 }; 99 100 101 ATF_TC(dl_print); 102 ATF_TC_HEAD(dl_print, tc) 103 { 104 105 atf_tc_set_md_var(tc, "descr", "printing of link address"); 106 } 107 108 ATF_TC_BODY(dl_print, tc) 109 { 110 char buf[LINK_ADDRSTRLEN]; 111 int r; 112 size_t l = sizeof(buf); 113 114 for (size_t i = 0; i < __arraycount(tst); i++) { 115 r = dl_print(buf, l, &tst[i].ia); 116 ATF_REQUIRE_STREQ(buf, tst[i].str); 117 ATF_REQUIRE_EQ(r, tst[i].len); 118 } 119 120 l = 4; 121 for (size_t i = 0; i < __arraycount(tst); i++) { 122 r = dl_print(buf, l, &tst[i].ia); 123 ATF_CHECK(strncmp(buf, tst[i].str, l - 1) == 0); 124 if (r > (int)l) 125 ATF_REQUIRE_EQ(buf[l - 1], '\0'); 126 ATF_REQUIRE_EQ(r, tst[i].len); 127 } 128 } 129 130 ATF_TC(sdl_print); 131 ATF_TC_HEAD(sdl_print, tc) 132 { 133 134 atf_tc_set_md_var(tc, "descr", "printing of sockaddr_dl"); 135 } 136 137 ATF_TC_BODY(sdl_print, tc) 138 { 139 char buf[1024]; 140 char res[1024]; 141 int r, e; 142 size_t l = sizeof(buf); 143 struct sockaddr_dl sdl; 144 145 memset(&sdl, 0, sizeof(sdl)); 146 for (size_t i = 0; i < __arraycount(tst); i++) { 147 memcpy(&sdl.sdl_addr, &tst[i].ia, sizeof(sdl.sdl_addr)); 148 sdl.sdl_index = (uint16_t)i; 149 r = sdl_print(buf, l, &sdl); 150 if (i == 3) 151 e = snprintf(res, l, "link#%zu", i); 152 else 153 e = snprintf(res, l, "[%s]:%zu", tst[i].str, i); 154 ATF_REQUIRE_STREQ(buf, res); 155 ATF_REQUIRE_EQ(r, e); 156 } 157 158 l = 8; 159 for (size_t i = 0; i < __arraycount(tst); i++) { 160 memcpy(&sdl.sdl_addr, &tst[i].ia, sizeof(sdl.sdl_addr)); 161 sdl.sdl_index = (uint16_t)i; 162 r = sdl_print(buf, l, &sdl); 163 if (i == 3) 164 e = snprintf(res, l, "link#%zu", i); 165 else 166 e = snprintf(res, l, "[%s]:%zu", tst[i].str, i); 167 ATF_REQUIRE_STREQ(buf, res); 168 ATF_REQUIRE_EQ(r, e); 169 } 170 } 171 172 ATF_TP_ADD_TCS(tp) 173 { 174 175 ATF_TP_ADD_TC(tp, dl_print); 176 ATF_TP_ADD_TC(tp, sdl_print); 177 return atf_no_error(); 178 } 179