xref: /netbsd-src/tests/lib/libutil/t_snprintb.c (revision 53b02e147d4ed531c0d2a5ca9b3e8026ba3e99b5)
1 /* $NetBSD: t_snprintb.c,v 1.8 2019/12/08 17:37:16 christos Exp $ */
2 
3 /*
4  * Copyright (c) 2002, 2004, 2008, 2010 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code was contributed to The NetBSD Foundation by Christos Zoulas.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
19  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
20  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
22  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 #include <sys/cdefs.h>
32 __COPYRIGHT("@(#) Copyright (c) 2008, 2010\
33  The NetBSD Foundation, inc. All rights reserved.");
34 __RCSID("$NetBSD: t_snprintb.c,v 1.8 2019/12/08 17:37:16 christos Exp $");
35 
36 #include <string.h>
37 #include <util.h>
38 
39 #include <atf-c.h>
40 
41 static void
42 h_snprintb(const char *fmt, uint64_t val, const char *expected)
43 {
44 	char actual[1024];
45 	int len, rlen;
46 
47 	len = snprintb(actual, sizeof(actual), fmt, val);
48 	rlen = (int)strlen(actual);
49 
50 	ATF_REQUIRE_STREQ_MSG(expected, actual, "format=%s val=%" PRIu64,
51 	    fmt, val);
52 	ATF_REQUIRE_EQ_MSG(rlen, len, "expected=%d actual=%d", rlen, len);
53 }
54 
55 ATF_TC(snprintb);
56 ATF_TC_HEAD(snprintb, tc)
57 {
58 	atf_tc_set_md_var(tc, "descr", "Checks snprintb(3)");
59 }
60 ATF_TC_BODY(snprintb, tc)
61 {
62 	h_snprintb("\10\2BITTWO\1BITONE", 3, "03<BITTWO,BITONE>");
63 	h_snprintb("\177\20b\0A\0\0", 0, "0");
64 
65 	h_snprintb("\177\20b\05NOTBOOT\0b\06FPP\0b\013SDVMA\0b\015VIDEO\0"
66 		"b\020LORES\0b\021FPA\0b\022DIAG\0b\016CACHE\0"
67 		"b\017IOCACHE\0b\022LOOPBACK\0b\04DBGCACHE\0",
68 		0xe860, "0xe860<NOTBOOT,FPP,SDVMA,VIDEO,CACHE,IOCACHE>");
69 
70 	h_snprintb("\177\20f\0\4FOO\0=\1ONE\0=\2TWO\0\0", 1,
71 	    "0x1<FOO=0x1=ONE>");
72 	h_snprintb("\177\20f\0\4X\0=\1ONE\0=\2TWO\0\0", 1,
73 	    "0x1<X=0x1=ONE>");
74 	h_snprintb("\177\020F\0\4\0:\1ONE\0:\2TWO\0\0", 1,
75 	    "0x1<ONE>");
76 
77 	h_snprintb("\177\20f\0\4FOO\0=\1ONE\0=\2TWO\0\0", 2,
78 	    "0x2<FOO=0x2=TWO>");
79 	h_snprintb("\177\20f\0\4X\0=\1ONE\0=\2TWO\0\0", 2,
80 	    "0x2<X=0x2=TWO>");
81 	h_snprintb("\177\020F\0\4\0:\1ONE\0:\2TWO\0\0", 2,
82 	    "0x2<TWO>");
83 
84 	h_snprintb("\177\20f\0\4FOO\0=\1ONE\0=\2TWO\0*=OTHER\0\0", 3,
85 	    "0x3<FOO=0x3=OTHER>");
86 	h_snprintb("\177\20f\0\4X\0=\1ONE\0=\2TWO\0*=Other(%jd)\0\0", 3,
87 	    "0x3<X=0x3=Other(3)>");
88 	h_snprintb("\177\20f\0\x8X\0=\1ONE\0=\2TWO\0*=other(%jo)\0\0", 0x20,
89 	    "0x20<X=0x20=other(40)>");
90 	h_snprintb("\177\020F\0\4\0:\1ONE\0:\2TWO\0\0", 3,
91 	    "0x3<>");
92 
93 	h_snprintb("\177\20f\0\4Field_1\0=\1ONE\0=\2TWO\0"
94 		   "f\4\4Field_2\0=\1ONE\0=\2TWO\0\0", 0x12,
95 	    "0x12<Field_1=0x2=TWO,Field_2=0x1=ONE>");
96 
97 	h_snprintb("\177\20f\0\4Field_1\0=\1ONE\0=\2TWO\0"
98 		   "F\x8\4\0*Field_3=%jd\0"
99 		   "f\4\4Field_2\0:\1:ONE\0:\2:TWO\0\0", 0xD12,
100 	    "0xd12<Field_1=0x2=TWO,Field_3=13,Field_2=0x1:ONE>");
101 }
102 
103 static void
104 h_snprintb_m(const char *fmt, uint64_t val, int line_max, const char *res,
105      int rlen)
106 {
107 	char buf[1024];
108 	int len;
109 
110 	len = snprintb_m(buf, sizeof(buf), fmt, val, line_max);
111 
112 	const char *expected = res;
113 	char *actual = buf;
114 	int l = 0;
115 	for (size_t i = 0; l < rlen; i++) {
116 		l = (int)strlen(actual);
117 		if (l == 0)
118 			break;
119 		ATF_REQUIRE_STREQ_MSG(expected, actual,
120 		    "%zu: fmt=%s val=%" PRIu64, i, fmt, val);
121 		actual += l;
122 		expected += l;
123 	}
124 
125 	ATF_REQUIRE_EQ_MSG(rlen, len, "expected=%d actual=%d", rlen, len);
126 }
127 
128 ATF_TC(snprintb_m);
129 ATF_TC_HEAD(snprintb_m, tc)
130 {
131 	atf_tc_set_md_var(tc, "descr", "Checks snprintb_m(3)");
132 }
133 ATF_TC_BODY(snprintb_m, tc)
134 {
135 	h_snprintb_m("\177\020b\0LSB\0b\1_BITONE\0f\4\4NIBBLE2\0"
136 			"f\x10\4BURST\0=\4FOUR\0=\xfSIXTEEN\0"
137 			"b\x1fMSB\0\0",
138                      0x800f0701,
139 		     33,
140 		     "0x800f0701<LSB,NIBBLE2=0>\0"
141 			"0x800f0701<BURST=0xf=SIXTEEN,MSB>\0\0",
142 		     60);
143 
144 	h_snprintb_m("\177\020b\0LSB\0b\1_BITONE\0f\4\4NIBBLE2\0"
145 			"f\x10\4BURST\0=\4FOUR\0=\xfSIXTEEN\0"
146 			"b\x1fMSB\0\0",
147                      0x800f0701,
148 		     32,
149 		     "0x800f0701<LSB,NIBBLE2=0>\0"
150 			"0x800f0701<BURST=0xf=SIXTEEN>\0"
151 			"0x800f0701<MSB>\0\0",
152 		     72);
153 }
154 
155 ATF_TP_ADD_TCS(tp)
156 {
157 
158 	ATF_TP_ADD_TC(tp, snprintb);
159 	ATF_TP_ADD_TC(tp, snprintb_m);
160 
161 	return atf_no_error();
162 }
163