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