
On May 27, 2016, at 12:13 , Maxime Ripard maxime.ripard@free-electrons.com wrote:
This adds a bunch of unit tests for the "fdt apply" command.
They've all been run successfully in the sandbox. However, as you still require an out-of-tree dtc with overlay support, this is disabled by default.
Signed-off-by: Maxime Ripard maxime.ripard@free-electrons.com
Makefile | 1 + include/test/overlay.h | 16 ++++ include/test/suites.h | 1 + test/Kconfig | 1 + test/cmd_ut.c | 6 ++ test/overlay/Kconfig | 10 +++ test/overlay/Makefile | 15 ++++ test/overlay/cmd_ut_overlay.c | 176 ++++++++++++++++++++++++++++++++++++++ test/overlay/test-fdt-base.dts | 17 ++++ test/overlay/test-fdt-overlay.dts | 60 +++++++++++++ 10 files changed, 303 insertions(+) create mode 100644 include/test/overlay.h create mode 100644 test/overlay/Kconfig create mode 100644 test/overlay/Makefile create mode 100644 test/overlay/cmd_ut_overlay.c create mode 100644 test/overlay/test-fdt-base.dts create mode 100644 test/overlay/test-fdt-overlay.dts
diff --git a/Makefile b/Makefile index 954a865381af..71272501a75e 100644 --- a/Makefile +++ b/Makefile @@ -665,6 +665,7 @@ libs-$(CONFIG_HAS_POST) += post/ libs-y += test/ libs-y += test/dm/ libs-$(CONFIG_UT_ENV) += test/env/ +libs-$(CONFIG_UT_OVERLAY) += test/overlay/
libs-y += $(if $(BOARDDIR),board/$(BOARDDIR)/)
diff --git a/include/test/overlay.h b/include/test/overlay.h new file mode 100644 index 000000000000..392f28ff8405 --- /dev/null +++ b/include/test/overlay.h @@ -0,0 +1,16 @@ +/*
- Copyright (c) 2016 NextThing Co
- Copyright (c) 2016 Free Electrons
- SPDX-License-Identifier: GPL-2.0+
- */
+#ifndef __TEST_OVERLAY_H__ +#define __TEST_OVERLAY_H__
+#include <test/test.h>
+/* Declare a new environment test */ +#define OVERLAY_TEST(_name, _flags) UNIT_TEST(_name, _flags, overlay_test)
+#endif /* __TEST_OVERLAY_H__ */ diff --git a/include/test/suites.h b/include/test/suites.h index f5790333ff8e..0e94feb07a79 100644 --- a/include/test/suites.h +++ b/include/test/suites.h @@ -10,6 +10,7 @@
int do_ut_dm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); int do_ut_env(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); +int do_ut_overlay(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); int do_ut_time(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
#endif /* __TEST_SUITES_H__ */ diff --git a/test/Kconfig b/test/Kconfig index d71c332eee27..3643761bc6ef 100644 --- a/test/Kconfig +++ b/test/Kconfig @@ -17,3 +17,4 @@ config UT_TIME
source "test/dm/Kconfig" source "test/env/Kconfig" +source "test/overlay/Kconfig" diff --git a/test/cmd_ut.c b/test/cmd_ut.c index f6e1f413db7f..14333423a178 100644 --- a/test/cmd_ut.c +++ b/test/cmd_ut.c @@ -19,6 +19,9 @@ static cmd_tbl_t cmd_ut_sub[] = { #if defined(CONFIG_UT_ENV) U_BOOT_CMD_MKENT(env, CONFIG_SYS_MAXARGS, 1, do_ut_env, "", ""), #endif +#ifdef CONFIG_UT_OVERLAY
- U_BOOT_CMD_MKENT(overlay, CONFIG_SYS_MAXARGS, 1, do_ut_overlay, "", ""),
+#endif #ifdef CONFIG_UT_TIME U_BOOT_CMD_MKENT(time, CONFIG_SYS_MAXARGS, 1, do_ut_time, "", ""), #endif @@ -68,6 +71,9 @@ static char ut_help_text[] = #ifdef CONFIG_UT_ENV "ut env [test-name]\n" #endif +#ifdef CONFIG_UT_OVERLAY
- "ut overlay [test-name]\n"
+#endif #ifdef CONFIG_UT_TIME "ut time - Very basic test of time functions\n" #endif diff --git a/test/overlay/Kconfig b/test/overlay/Kconfig new file mode 100644 index 000000000000..b8e01a934373 --- /dev/null +++ b/test/overlay/Kconfig @@ -0,0 +1,10 @@ +config UT_OVERLAY
- bool "Enable Device Tree Overlays Unit Tests"
- depends on UNIT_TEST
- help
This enables the 'ut overlay' command which runs a series of unit
tests on the fdt overlay code.
If all is well then all tests pass although there will be a few
messages printed along the way.
Be warned that it requires an out-of-tree dtc compiler with patches
to support the DT overlays, otherwise it will fail.
diff --git a/test/overlay/Makefile b/test/overlay/Makefile new file mode 100644 index 000000000000..907f08544619 --- /dev/null +++ b/test/overlay/Makefile @@ -0,0 +1,15 @@ +# +# Copyright (c) 2016 NextThing Co +# Copyright (c) 2016 Free Electrons +# +# SPDX-License-Identifier: GPL-2.0+ +#
+# Test files +obj-y += cmd_ut_overlay.o
+DTC_FLAGS += -@
+# DT overlays +obj-y += test-fdt-base.dtb.o +obj-y += test-fdt-overlay.dtb.o diff --git a/test/overlay/cmd_ut_overlay.c b/test/overlay/cmd_ut_overlay.c new file mode 100644 index 000000000000..3ff1d61b7e31 --- /dev/null +++ b/test/overlay/cmd_ut_overlay.c @@ -0,0 +1,176 @@ +/*
- Copyright (c) 2016 NextThing Co
- Copyright (c) 2016 Free Electrons
- SPDX-License-Identifier: GPL-2.0+
- */
+#include <common.h> +#include <command.h> +#include <errno.h> +#include <malloc.h>
+#include <linux/sizes.h>
+#include <test/ut.h> +#include <test/overlay.h>
+/* 4k ought to be enough for anybody */ +#define FDT_COPY_SIZE (4 * SZ_1K)
+extern u32 __dtb_test_fdt_base_begin; +extern u32 __dtb_test_fdt_overlay_begin;
+static int fdt_getprop_u32(void *fdt, const char *path, const char *name,
u32 *out)
+{
- const fdt32_t *val;
- int node_off;
- int len;
- node_off = fdt_path_offset(fdt, path);
- if (node_off < 0)
return node_off;
- val = fdt_getprop(fdt, node_off, name, &len);
- if (!val || (len != sizeof(uint32_t)))
return -FDT_ERR_NOTFOUND;
- *out = fdt32_to_cpu(*val);
- return 0;
+}
+static int fdt_getprop_str(void *fdt, const char *path, const char *name,
const char **out)
+{
- int node_off;
- node_off = fdt_path_offset(fdt, path);
- if (node_off < 0)
return node_off;
- return fdt_get_string(fdt, node_off, name, out);
+}
+static int fdt_overlay_change_int_property(struct unit_test_state *uts) +{
- void *fdt = uts->priv;
- u32 val = 0;
- ut_assertok(fdt_getprop_u32(fdt, "/test-node", "test-int-property",
&val));
- ut_asserteq(43, val);
- return CMD_RET_SUCCESS;
+} +OVERLAY_TEST(fdt_overlay_change_int_property, 0);
+static int fdt_overlay_change_str_property(struct unit_test_state *uts) +{
- void *fdt = uts->priv;
- const char *val = NULL;
- ut_assertok(fdt_getprop_str(fdt, "/test-node", "test-str-property",
&val));
- ut_asserteq_str("foobar", val);
- return CMD_RET_SUCCESS;
+} +OVERLAY_TEST(fdt_overlay_change_str_property, 0);
+static int fdt_overlay_add_str_property(struct unit_test_state *uts) +{
- void *fdt = uts->priv;
- const char *val = NULL;
- ut_assertok(fdt_getprop_str(fdt, "/test-node", "test-str-property-2",
&val));
- ut_asserteq_str("foobar2", val);
- return CMD_RET_SUCCESS;
+} +OVERLAY_TEST(fdt_overlay_add_str_property, 0);
+static int fdt_overlay_add_node_by_phandle(struct unit_test_state *uts) +{
- void *fdt = uts->priv;
- int off;
- off = fdt_path_offset(fdt, "/test-node/new-node");
- ut_assert(off >= 0);
- ut_assertnonnull(fdt_getprop(fdt, off, "new-property", NULL));
- return CMD_RET_SUCCESS;
+} +OVERLAY_TEST(fdt_overlay_add_node_by_phandle, 0);
+static int fdt_overlay_add_node_by_path(struct unit_test_state *uts) +{
- void *fdt = uts->priv;
- int off;
- off = fdt_path_offset(fdt, "/new-node");
- ut_assert(off >= 0);
- ut_assertnonnull(fdt_getprop(fdt, off, "new-property", NULL));
- return CMD_RET_SUCCESS;
+} +OVERLAY_TEST(fdt_overlay_add_node_by_path, 0);
+int do_ut_overlay(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{
- struct unit_test *tests = ll_entry_start(struct unit_test,
overlay_test);
- const int n_ents = ll_entry_count(struct unit_test, overlay_test);
- struct unit_test_state *uts;
- struct unit_test *test;
- void *fdt_base = &__dtb_test_fdt_base_begin;
- void *fdt_overlay = &__dtb_test_fdt_overlay_begin;
- void *fdt_base_copy;
- ut_assertok(fdt_check_header(fdt_base));
- ut_assertok(fdt_check_header(fdt_overlay));
- uts = calloc(1, sizeof(*uts));
- if (!uts)
return -ENOMEM;
- fdt_base_copy = malloc(FDT_COPY_SIZE);
- if (!fdt_base_copy)
return -ENOMEM;
- uts->priv = fdt_base_copy;
- /*
* Resize the FDT to 4k so that we have room to operate on
*
* (and relocate it since the memory might be mapped
* read-only)
*/
- ut_assertok(fdt_open_into(fdt_base, fdt_base_copy, FDT_COPY_SIZE));
- /* Apply the overlay */
- ut_assertok(fdt_overlay_apply(fdt_base_copy, fdt_overlay));
- if (argc == 1)
printf("Running %d environment tests\n", n_ents);
- for (test = tests; test < tests + n_ents; test++) {
if (argc > 1 && strcmp(argv[1], test->name))
continue;
printf("Test: %s\n", test->name);
uts->start = mallinfo();
test->func(uts);
- }
- printf("Failures: %d\n", uts->fail_count);
- free(fdt_base_copy);
- free(uts);
- return uts->fail_count ? CMD_RET_FAILURE : 0;
+} diff --git a/test/overlay/test-fdt-base.dts b/test/overlay/test-fdt-base.dts new file mode 100644 index 000000000000..e8fa9bb5be82 --- /dev/null +++ b/test/overlay/test-fdt-base.dts @@ -0,0 +1,17 @@ +/*
- Copyright (c) 2016 NextThing Co
- Copyright (c) 2016 Free Electrons
- SPDX-License-Identifier: GPL-2.0+
- */
+/dts-v1/;
+/ {
- test: test-node {
test-int-property = <42>;
test-str-property = "foo";
- };
+};
diff --git a/test/overlay/test-fdt-overlay.dts b/test/overlay/test-fdt-overlay.dts new file mode 100644 index 000000000000..ca3abcff287c --- /dev/null +++ b/test/overlay/test-fdt-overlay.dts @@ -0,0 +1,60 @@ +/*
- Copyright (c) 2016 NextThing Co
- Copyright (c) 2016 Free Electrons
- SPDX-License-Identifier: GPL-2.0+
- */
+/dts-v1/; +/plugin/;
+/ {
- /* Test that we can change an int by another */
- fragment@0 {
target = <&test>;
__overlay__ {
test-int-property = <43>;
};
- };
- /* Test that we can replace a string by a longer one */
- fragment@1 {
target = <&test>;
__overlay__ {
test-str-property = "foobar";
};
- };
- /* Test that we add a new property */
- fragment@2 {
target = <&test>;
__overlay__ {
test-str-property-2 = "foobar2";
};
- };
- /* Test that we add a new node (by phandle) */
- fragment@3 {
target = <&test>;
__overlay__ {
new-node {
new-property;
};
};
- };
- /* Test that we add a new node (by path) */
- fragment@4 {
target-path = "/";
__overlay__ {
new-node {
new-property;
};
};
- };
+};
2.8.2
Acked-by: Pantelis Antoniou pantelis.antoniou@konsulko.com