xref: /aosp_15_r20/external/dtc/tests/utilfdt_test.c (revision cd60bc56d4bea3af4ec04523e4d71c2b272c8aff)
1*cd60bc56SAndroid Build Coastguard Worker // SPDX-License-Identifier: LGPL-2.1-or-later
2*cd60bc56SAndroid Build Coastguard Worker /*
3*cd60bc56SAndroid Build Coastguard Worker  * Copyright 2011 The Chromium Authors, All Rights Reserved.
4*cd60bc56SAndroid Build Coastguard Worker  *
5*cd60bc56SAndroid Build Coastguard Worker  * utilfdt_test - Tests for utilfdt library
6*cd60bc56SAndroid Build Coastguard Worker  */
7*cd60bc56SAndroid Build Coastguard Worker #include <assert.h>
8*cd60bc56SAndroid Build Coastguard Worker #include <stdlib.h>
9*cd60bc56SAndroid Build Coastguard Worker #include <stdio.h>
10*cd60bc56SAndroid Build Coastguard Worker #include <string.h>
11*cd60bc56SAndroid Build Coastguard Worker #include <stdint.h>
12*cd60bc56SAndroid Build Coastguard Worker #include <stdarg.h>
13*cd60bc56SAndroid Build Coastguard Worker 
14*cd60bc56SAndroid Build Coastguard Worker #include <libfdt.h>
15*cd60bc56SAndroid Build Coastguard Worker #include <util.h>
16*cd60bc56SAndroid Build Coastguard Worker 
17*cd60bc56SAndroid Build Coastguard Worker #include "tests.h"
18*cd60bc56SAndroid Build Coastguard Worker #include "testdata.h"
19*cd60bc56SAndroid Build Coastguard Worker 
check(const char * fmt,int expect_type,int expect_size)20*cd60bc56SAndroid Build Coastguard Worker static void check(const char *fmt, int expect_type, int expect_size)
21*cd60bc56SAndroid Build Coastguard Worker {
22*cd60bc56SAndroid Build Coastguard Worker 	int type;
23*cd60bc56SAndroid Build Coastguard Worker 	int size;
24*cd60bc56SAndroid Build Coastguard Worker 
25*cd60bc56SAndroid Build Coastguard Worker 	if (utilfdt_decode_type(fmt, &type, &size))
26*cd60bc56SAndroid Build Coastguard Worker 		FAIL("format '%s': valid format string returned failure", fmt);
27*cd60bc56SAndroid Build Coastguard Worker 	if (expect_type != type)
28*cd60bc56SAndroid Build Coastguard Worker 		FAIL("format '%s': expected type='%c', got type='%c'", fmt,
29*cd60bc56SAndroid Build Coastguard Worker 		     expect_type, type);
30*cd60bc56SAndroid Build Coastguard Worker 	if (expect_size != size)
31*cd60bc56SAndroid Build Coastguard Worker 		FAIL("format '%s': expected size=%d, got size=%d", fmt,
32*cd60bc56SAndroid Build Coastguard Worker 		     expect_size, size);
33*cd60bc56SAndroid Build Coastguard Worker }
34*cd60bc56SAndroid Build Coastguard Worker 
checkfail(const char * fmt)35*cd60bc56SAndroid Build Coastguard Worker static void checkfail(const char *fmt)
36*cd60bc56SAndroid Build Coastguard Worker {
37*cd60bc56SAndroid Build Coastguard Worker 	int type;
38*cd60bc56SAndroid Build Coastguard Worker 	int size;
39*cd60bc56SAndroid Build Coastguard Worker 
40*cd60bc56SAndroid Build Coastguard Worker 	if (!utilfdt_decode_type(fmt, &type, &size))
41*cd60bc56SAndroid Build Coastguard Worker 		FAIL("format '%s': invalid format string returned success",
42*cd60bc56SAndroid Build Coastguard Worker 		     fmt);
43*cd60bc56SAndroid Build Coastguard Worker }
44*cd60bc56SAndroid Build Coastguard Worker 
45*cd60bc56SAndroid Build Coastguard Worker /**
46*cd60bc56SAndroid Build Coastguard Worker  * Add the given modifier to each of the valid sizes, and check that we get
47*cd60bc56SAndroid Build Coastguard Worker  * correct values.
48*cd60bc56SAndroid Build Coastguard Worker  *
49*cd60bc56SAndroid Build Coastguard Worker  * \param modifier	Modifer string to use as a prefix
50*cd60bc56SAndroid Build Coastguard Worker  * \param expected_size	The size (in bytes) that we expect (ignored for
51*cd60bc56SAndroid Build Coastguard Worker  *			strings)
52*cd60bc56SAndroid Build Coastguard Worker  */
check_sizes(char * modifier,int expected_size)53*cd60bc56SAndroid Build Coastguard Worker static void check_sizes(char *modifier, int expected_size)
54*cd60bc56SAndroid Build Coastguard Worker {
55*cd60bc56SAndroid Build Coastguard Worker 	char fmt[10], *ptr;
56*cd60bc56SAndroid Build Coastguard Worker 
57*cd60bc56SAndroid Build Coastguard Worker 	/* set up a string with a hole in it for the format character */
58*cd60bc56SAndroid Build Coastguard Worker 	if (strlen(modifier) + 2 >= sizeof(fmt))
59*cd60bc56SAndroid Build Coastguard Worker 		FAIL("modifier string '%s' too long", modifier);
60*cd60bc56SAndroid Build Coastguard Worker 	strcpy(fmt, modifier);
61*cd60bc56SAndroid Build Coastguard Worker 	ptr = fmt + strlen(fmt);
62*cd60bc56SAndroid Build Coastguard Worker 	ptr[1] = '\0';
63*cd60bc56SAndroid Build Coastguard Worker 
64*cd60bc56SAndroid Build Coastguard Worker 	/* now try each format character in turn */
65*cd60bc56SAndroid Build Coastguard Worker 	*ptr = 'i';
66*cd60bc56SAndroid Build Coastguard Worker 	check(fmt, 'i', expected_size);
67*cd60bc56SAndroid Build Coastguard Worker 
68*cd60bc56SAndroid Build Coastguard Worker 	*ptr = 'u';
69*cd60bc56SAndroid Build Coastguard Worker 	check(fmt, 'u', expected_size);
70*cd60bc56SAndroid Build Coastguard Worker 
71*cd60bc56SAndroid Build Coastguard Worker 	*ptr = 'x';
72*cd60bc56SAndroid Build Coastguard Worker 	check(fmt, 'x', expected_size);
73*cd60bc56SAndroid Build Coastguard Worker 
74*cd60bc56SAndroid Build Coastguard Worker 	*ptr = 's';
75*cd60bc56SAndroid Build Coastguard Worker 	check(fmt, 's', -1);
76*cd60bc56SAndroid Build Coastguard Worker 
77*cd60bc56SAndroid Build Coastguard Worker 	*ptr = 'r';
78*cd60bc56SAndroid Build Coastguard Worker 	check(fmt, 'r', -1);
79*cd60bc56SAndroid Build Coastguard Worker }
80*cd60bc56SAndroid Build Coastguard Worker 
test_utilfdt_decode_type(void)81*cd60bc56SAndroid Build Coastguard Worker static void test_utilfdt_decode_type(void)
82*cd60bc56SAndroid Build Coastguard Worker {
83*cd60bc56SAndroid Build Coastguard Worker 	char fmt[10];
84*cd60bc56SAndroid Build Coastguard Worker 	int ch;
85*cd60bc56SAndroid Build Coastguard Worker 
86*cd60bc56SAndroid Build Coastguard Worker 	/* check all the valid modifiers and sizes */
87*cd60bc56SAndroid Build Coastguard Worker 	check_sizes("", -1);
88*cd60bc56SAndroid Build Coastguard Worker 	check_sizes("b", 1);
89*cd60bc56SAndroid Build Coastguard Worker 	check_sizes("hh", 1);
90*cd60bc56SAndroid Build Coastguard Worker 	check_sizes("h", 2);
91*cd60bc56SAndroid Build Coastguard Worker 	check_sizes("l", 4);
92*cd60bc56SAndroid Build Coastguard Worker 
93*cd60bc56SAndroid Build Coastguard Worker 	/* try every other character */
94*cd60bc56SAndroid Build Coastguard Worker 	checkfail("");
95*cd60bc56SAndroid Build Coastguard Worker 	for (ch = ' '; ch < 127; ch++) {
96*cd60bc56SAndroid Build Coastguard Worker 		if (!strchr("iuxsr", ch)) {
97*cd60bc56SAndroid Build Coastguard Worker 			*fmt = ch;
98*cd60bc56SAndroid Build Coastguard Worker 			fmt[1] = '\0';
99*cd60bc56SAndroid Build Coastguard Worker 			checkfail(fmt);
100*cd60bc56SAndroid Build Coastguard Worker 		}
101*cd60bc56SAndroid Build Coastguard Worker 	}
102*cd60bc56SAndroid Build Coastguard Worker 
103*cd60bc56SAndroid Build Coastguard Worker 	/* try a few modifiers at the end */
104*cd60bc56SAndroid Build Coastguard Worker 	checkfail("sx");
105*cd60bc56SAndroid Build Coastguard Worker 	checkfail("ihh");
106*cd60bc56SAndroid Build Coastguard Worker 	checkfail("xb");
107*cd60bc56SAndroid Build Coastguard Worker 
108*cd60bc56SAndroid Build Coastguard Worker 	/* and one for the doomsday archives */
109*cd60bc56SAndroid Build Coastguard Worker 	checkfail("He has all the virtues I dislike and none of the vices "
110*cd60bc56SAndroid Build Coastguard Worker 			"I admire.");
111*cd60bc56SAndroid Build Coastguard Worker }
112*cd60bc56SAndroid Build Coastguard Worker 
main(int argc,char * argv[])113*cd60bc56SAndroid Build Coastguard Worker int main(int argc, char *argv[])
114*cd60bc56SAndroid Build Coastguard Worker {
115*cd60bc56SAndroid Build Coastguard Worker 	test_utilfdt_decode_type();
116*cd60bc56SAndroid Build Coastguard Worker 	PASS();
117*cd60bc56SAndroid Build Coastguard Worker }
118