diff options
author | Oliver O'Halloran <oohall@gmail.com> | 2016-01-18 14:23:18 +1100 |
---|---|---|
committer | Stewart Smith <stewart@linux.vnet.ibm.com> | 2016-01-21 15:26:42 +1100 |
commit | 5d9b239fadc6c0bdf18e34a48a4b0ade956994e6 (patch) | |
tree | 8511e25b0e2e742b09e0758e6854e169cd2e176a /core | |
parent | b35c7652ba04019e0c9ace0092369daab8177d1d (diff) | |
download | skiboot-5d9b239fadc6c0bdf18e34a48a4b0ade956994e6.zip skiboot-5d9b239fadc6c0bdf18e34a48a4b0ade956994e6.tar.gz skiboot-5d9b239fadc6c0bdf18e34a48a4b0ade956994e6.tar.bz2 |
DT sorting test
Moved the dt_dump() into test/dt_common.c so that it can be shared
between hdata/test/hdata_to_dt.c and core/test/run-device.c
run-device.c contains two tests, one basic sorting test and a
generate-and-sort test.
Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
[stewart@linux.vnet.ibm.com: remove trailing whitespace]
Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
Diffstat (limited to 'core')
-rw-r--r-- | core/device.c | 2 | ||||
-rw-r--r-- | core/test/run-device.c | 71 |
2 files changed, 72 insertions, 1 deletions
diff --git a/core/device.c b/core/device.c index 2b44edb..ba983c7 100644 --- a/core/device.c +++ b/core/device.c @@ -75,7 +75,7 @@ static const char *get_unitname(const struct dt_node *node) return c + 1; } -static int dt_cmp_subnodes(const struct dt_node *a, const struct dt_node *b) +int dt_cmp_subnodes(const struct dt_node *a, const struct dt_node *b) { const char *a_unit = get_unitname(a); const char *b_unit = get_unitname(b); diff --git a/core/test/run-device.c b/core/test/run-device.c index cd6ec8d..61ecf84 100644 --- a/core/test/run-device.c +++ b/core/test/run-device.c @@ -15,6 +15,7 @@ */ #include <skiboot.h> +#include <stdlib.h> /* Override this for testing. */ #define is_rodata(p) fake_is_rodata(p) @@ -32,6 +33,7 @@ static inline bool fake_is_rodata(const void *p) #include "../device.c" #include "../../ccan/list/list.c" /* For list_check */ #include <assert.h> +#include "../../test/dt_common.c" static void check_path(const struct dt_node *node, const char * expected_path) { @@ -44,6 +46,49 @@ static void check_path(const struct dt_node *node, const char * expected_path) free(path); } +/* constructs a random nodes only device tree */ +static void build_tree(int max_depth, int min_depth, struct dt_node *parent) +{ + char name[64]; + int i; + + for (i = 0; i < max_depth; i++) { + struct dt_node *new; + + snprintf(name, sizeof name, "prefix@%.8x", rand()); + + new = dt_new(parent, name); + + if(max_depth > min_depth) + build_tree(max_depth - 1, min_depth, new); + } +} + +static bool is_sorted(const struct dt_node *root) +{ + struct dt_node *end = list_tail(&root->children, struct dt_node, list); + struct dt_node *node; + + dt_for_each_child(root, node) { + struct dt_node *next = + list_entry(node->list.next, struct dt_node, list); + + /* current node must be "less than" the next node */ + if (node != end && dt_cmp_subnodes(node, next) != -1) { + printf("nodes '%s' and '%s' out of order\n", + node->name, next->name); + + return false; + } + + if (!is_sorted(node)) + return false; + } + + return true; +} + + int main(void) { struct dt_node *root, *c1, *c2, *gc1, *gc2, *gc3, *ggc1; @@ -297,5 +342,31 @@ int main(void) assert(dt_find_by_phandle(root, 0xf0f) == NULL); dt_free(root); + + /* basic sorting */ + root = dt_new_root("rewt"); + dt_new(root, "a@1"); + dt_new(root, "a@2"); + dt_new(root, "a@3"); + dt_new(root, "a@4"); + dt_new(root, "b@4"); + dt_new(root, "c@4"); + + assert(is_sorted(root)); + + dt_free(root); + + /* Test child node sorting */ + root = dt_new_root("test root"); + build_tree(5, 3, root); + + if (!is_sorted(root)) { + dump_dt(root, 1, false); + } + assert(is_sorted(root)); + + dt_free(root); + return 0; } + |