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