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