xref: /aosp_15_r20/external/dtc/tests/get_path.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  * libfdt - Flat Device Tree manipulation
4*cd60bc56SAndroid Build Coastguard Worker  *	Testcase for fdt_get_path()
5*cd60bc56SAndroid Build Coastguard Worker  * Copyright (C) 2006 David Gibson, IBM Corporation.
6*cd60bc56SAndroid Build Coastguard Worker  */
7*cd60bc56SAndroid Build Coastguard Worker #include <stdlib.h>
8*cd60bc56SAndroid Build Coastguard Worker #include <stdio.h>
9*cd60bc56SAndroid Build Coastguard Worker #include <string.h>
10*cd60bc56SAndroid Build Coastguard Worker #include <stdint.h>
11*cd60bc56SAndroid Build Coastguard Worker 
12*cd60bc56SAndroid Build Coastguard Worker #include <libfdt.h>
13*cd60bc56SAndroid Build Coastguard Worker 
14*cd60bc56SAndroid Build Coastguard Worker #include "tests.h"
15*cd60bc56SAndroid Build Coastguard Worker #include "testdata.h"
16*cd60bc56SAndroid Build Coastguard Worker 
17*cd60bc56SAndroid Build Coastguard Worker #define POISON	('\xff')
18*cd60bc56SAndroid Build Coastguard Worker 
check_path_buf(void * fdt,const char * path,int pathlen,int buflen)19*cd60bc56SAndroid Build Coastguard Worker static void check_path_buf(void *fdt, const char *path, int pathlen, int buflen)
20*cd60bc56SAndroid Build Coastguard Worker {
21*cd60bc56SAndroid Build Coastguard Worker 	int offset;
22*cd60bc56SAndroid Build Coastguard Worker 	char buf[buflen+1];
23*cd60bc56SAndroid Build Coastguard Worker 	int len;
24*cd60bc56SAndroid Build Coastguard Worker 
25*cd60bc56SAndroid Build Coastguard Worker 	offset = fdt_path_offset(fdt, path);
26*cd60bc56SAndroid Build Coastguard Worker 	if (offset < 0)
27*cd60bc56SAndroid Build Coastguard Worker 		FAIL("Couldn't find path \"%s\": %s", path, fdt_strerror(offset));
28*cd60bc56SAndroid Build Coastguard Worker 
29*cd60bc56SAndroid Build Coastguard Worker 	memset(buf, POISON, sizeof(buf)); /* poison the buffer */
30*cd60bc56SAndroid Build Coastguard Worker 
31*cd60bc56SAndroid Build Coastguard Worker 	len = fdt_get_path(fdt, offset, buf, buflen);
32*cd60bc56SAndroid Build Coastguard Worker 	verbose_printf("get_path() %s -> %d -> %s\n", path, offset,
33*cd60bc56SAndroid Build Coastguard Worker 		       len >= 0 ? buf : "<error>");
34*cd60bc56SAndroid Build Coastguard Worker 
35*cd60bc56SAndroid Build Coastguard Worker 	if (buflen <= pathlen) {
36*cd60bc56SAndroid Build Coastguard Worker 		if (len != -FDT_ERR_NOSPACE)
37*cd60bc56SAndroid Build Coastguard Worker 			FAIL("fdt_get_path([%d bytes]) returns %d with "
38*cd60bc56SAndroid Build Coastguard Worker 			     "insufficient buffer space", buflen, len);
39*cd60bc56SAndroid Build Coastguard Worker 	} else {
40*cd60bc56SAndroid Build Coastguard Worker 		if (len < 0)
41*cd60bc56SAndroid Build Coastguard Worker 			FAIL("fdt_get_path([%d bytes]): %s", buflen,
42*cd60bc56SAndroid Build Coastguard Worker 			     fdt_strerror(len));
43*cd60bc56SAndroid Build Coastguard Worker 		if (len != 0)
44*cd60bc56SAndroid Build Coastguard Worker 			FAIL("fdt_get_path([%d bytes]) returns %d "
45*cd60bc56SAndroid Build Coastguard Worker 			     "instead of 0", buflen, len);
46*cd60bc56SAndroid Build Coastguard Worker 		if (strcmp(buf, path) != 0)
47*cd60bc56SAndroid Build Coastguard Worker 			FAIL("fdt_get_path([%d bytes]) returns \"%s\" "
48*cd60bc56SAndroid Build Coastguard Worker 			     "instead of \"%s\"", buflen, buf, path);
49*cd60bc56SAndroid Build Coastguard Worker 	}
50*cd60bc56SAndroid Build Coastguard Worker 
51*cd60bc56SAndroid Build Coastguard Worker 	if (buf[buflen] != POISON)
52*cd60bc56SAndroid Build Coastguard Worker 		FAIL("fdt_get_path([%d bytes]) overran buffer", buflen);
53*cd60bc56SAndroid Build Coastguard Worker }
54*cd60bc56SAndroid Build Coastguard Worker 
check_path(void * fdt,const char * path)55*cd60bc56SAndroid Build Coastguard Worker static void check_path(void *fdt, const char *path)
56*cd60bc56SAndroid Build Coastguard Worker {
57*cd60bc56SAndroid Build Coastguard Worker 	int pathlen = strlen(path);
58*cd60bc56SAndroid Build Coastguard Worker 
59*cd60bc56SAndroid Build Coastguard Worker 	check_path_buf(fdt, path, pathlen, 1024);
60*cd60bc56SAndroid Build Coastguard Worker 	check_path_buf(fdt, path, pathlen, pathlen+1);
61*cd60bc56SAndroid Build Coastguard Worker 	check_path_buf(fdt, path, pathlen, pathlen);
62*cd60bc56SAndroid Build Coastguard Worker 	check_path_buf(fdt, path, pathlen, 0);
63*cd60bc56SAndroid Build Coastguard Worker 	check_path_buf(fdt, path, pathlen, 2);
64*cd60bc56SAndroid Build Coastguard Worker }
65*cd60bc56SAndroid Build Coastguard Worker 
main(int argc,char * argv[])66*cd60bc56SAndroid Build Coastguard Worker int main(int argc, char *argv[])
67*cd60bc56SAndroid Build Coastguard Worker {
68*cd60bc56SAndroid Build Coastguard Worker 	void *fdt;
69*cd60bc56SAndroid Build Coastguard Worker 
70*cd60bc56SAndroid Build Coastguard Worker 	test_init(argc, argv);
71*cd60bc56SAndroid Build Coastguard Worker 	fdt = load_blob_arg(argc, argv);
72*cd60bc56SAndroid Build Coastguard Worker 
73*cd60bc56SAndroid Build Coastguard Worker 	check_path(fdt, "/");
74*cd60bc56SAndroid Build Coastguard Worker 	check_path(fdt, "/subnode@1");
75*cd60bc56SAndroid Build Coastguard Worker 	check_path(fdt, "/subnode@2");
76*cd60bc56SAndroid Build Coastguard Worker 	check_path(fdt, "/subnode@1/subsubnode");
77*cd60bc56SAndroid Build Coastguard Worker 	check_path(fdt, "/subnode@2/subsubnode@0");
78*cd60bc56SAndroid Build Coastguard Worker 
79*cd60bc56SAndroid Build Coastguard Worker 	PASS();
80*cd60bc56SAndroid Build Coastguard Worker }
81