diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/.gitignore | 1 | ||||
-rw-r--r-- | tests/Makefile.tests | 2 | ||||
-rwxr-xr-x | tests/run_tests.sh | 5 | ||||
-rw-r--r-- | tests/string-expressions.c | 97 |
4 files changed, 104 insertions, 1 deletions
diff --git a/tests/.gitignore b/tests/.gitignore index bb5e33a..7931067 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -48,6 +48,7 @@ tmp.* /setprop_inplace /sized_cells /string_escapes +/string-expressions /subnode_iterate /subnode_offset /supernode_atdepth_offset diff --git a/tests/Makefile.tests b/tests/Makefile.tests index dafb618..fa4e2d2 100644 --- a/tests/Makefile.tests +++ b/tests/Makefile.tests @@ -20,7 +20,7 @@ LIB_TESTS_L = get_mem_rsv \ dtb_reverse dtbs_equal_unordered \ add_subnode_with_nops path_offset_aliases \ utilfdt_test \ - integer-expressions \ + integer-expressions string-expressions \ subnode_iterate LIB_TESTS = $(LIB_TESTS_L:%=$(TESTS_PREFIX)%) diff --git a/tests/run_tests.sh b/tests/run_tests.sh index 97e016b..44de059 100755 --- a/tests/run_tests.sh +++ b/tests/run_tests.sh @@ -446,6 +446,11 @@ dtc_tests () { run_dtc_test -I dts -O dtb -o integer-expressions.test.dtb integer-expressions.test.dts run_test integer-expressions integer-expressions.test.dtb + # Check string expresisons + run_test string-expressions -g string-expressions.test.dts + run_dtc_test -I dts -O dtb -o string-expressions.test.dtb string-expressions.test.dts + run_test string-expressions string-expressions.test.dtb + # Check for graceful failure in some error conditions run_sh_test dtc-fatal.sh -I dts -O dtb nosuchfile.dts run_sh_test dtc-fatal.sh -I dtb -O dtb nosuchfile.dtb diff --git a/tests/string-expressions.c b/tests/string-expressions.c new file mode 100644 index 0000000..da6854f --- /dev/null +++ b/tests/string-expressions.c @@ -0,0 +1,97 @@ +/* + * Testcase for dtc string expression support + * + * Copyright (C) 2013 David Gibson <david@gibson.dropbear.id.au> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <stdint.h> +#include <errno.h> + + +#include <libfdt.h> + +#include "tests.h" +#include "testdata.h" + +struct test_expr { + const char *expr; + const char *result; +} expr_table[] = { +#define TE(expr, res) { #expr, (res) } + TE("hello", "hello"), + TE("hello " + "world", "hello world"), + TE("hello" + " " + "world", "hello world"), + TE("hello" * 2 + " world", "hellohello world"), + TE("hello " + 2 * "world", "hello worldworld"), + TE(("hello"), "hello"), + TE(0 ? "hello" : "goodbye", "goodbye"), + TE(1 ? "hello" : "goodbye", "hello"), +}; + +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) + +int main(int argc, char *argv[]) +{ + void *fdt; + const char *res; + int reslen; + int i; + + test_init(argc, argv); + + if ((argc == 3) && (strcmp(argv[1], "-g") == 0)) { + FILE *f = fopen(argv[2], "w"); + + if (!f) + FAIL("Couldn't open \"%s\" for output: %s\n", + argv[2], strerror(errno)); + + fprintf(f, "/dts-v1/;\n"); + fprintf(f, "/ {\n"); + for (i = 0; i < ARRAY_SIZE(expr_table); i++) + fprintf(f, "\texpression-%d = %s;\n", i, + expr_table[i].expr); + fprintf(f, "};\n"); + fclose(f); + } else { + fdt = load_blob_arg(argc, argv); + + for (i = 0; i < ARRAY_SIZE(expr_table); i++) { + char propname[16]; + int len = strlen(expr_table[i].result) + 1; + + sprintf(propname, "expression-%d", i); + res = fdt_getprop(fdt, 0, propname, &reslen); + + if (reslen != len) + FAIL("Incorrect length for expression %s," + " %d instead of %d\n", + expr_table[i].expr, reslen, len); + + if (memcmp(res, expr_table[i].result, len) != 0) + FAIL("Incorrect result for expression %s," + " \"%s\" instead of \"%s\"\n", + expr_table[i].expr, res, + expr_table[i].result); + } + } + + PASS(); +} |