diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2018-07-09 11:00:21 +1000 |
---|---|---|
committer | David Gibson <david@gibson.dropbear.id.au> | 2018-07-09 15:03:14 +1000 |
commit | 9b0e4fe26093cf3846868543b24b874990ec76e1 (patch) | |
tree | 946eeddcf3a67ffcbf71a2ed504a3d201063e4f9 /tests | |
parent | 1087504bb3e8b00988e7bb99784eb02d4d9d9fd1 (diff) | |
download | dtc-9b0e4fe26093cf3846868543b24b874990ec76e1.zip dtc-9b0e4fe26093cf3846868543b24b874990ec76e1.tar.gz dtc-9b0e4fe26093cf3846868543b24b874990ec76e1.tar.bz2 |
tests: Improve fdt_resize() tests
We primarily test fdt_resize() in the sw_tree1 testcase, but it has
some deficiencies:
- It didn't check for errors actually originating in fdt_resize(),
just for errors before and after
- It only tested cases where the resized buffer was at the same
address as the original one, whereas fdt_resize() is also supposed
to work if the new buffer is entirely separate, or partly
overlapping
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Diffstat (limited to 'tests')
-rwxr-xr-x | tests/run_tests.sh | 2 | ||||
-rw-r--r-- | tests/sw_tree1.c | 35 |
2 files changed, 33 insertions, 4 deletions
diff --git a/tests/run_tests.sh b/tests/run_tests.sh index 759625d..cf87066 100755 --- a/tests/run_tests.sh +++ b/tests/run_tests.sh @@ -348,7 +348,7 @@ libfdt_tests () { run_test sw_states # Resizing tests - for mode in resize realloc; do + for mode in resize realloc newalloc; do run_test sw_tree1 $mode tree1_tests sw_tree1.test.dtb tree1_tests unfinished_tree1.test.dtb diff --git a/tests/sw_tree1.c b/tests/sw_tree1.c index 386b05f..2a67c12 100644 --- a/tests/sw_tree1.c +++ b/tests/sw_tree1.c @@ -35,10 +35,13 @@ static enum { FIXED = 0, RESIZE, REALLOC, + NEWALLOC, } alloc_mode; static void realloc_fdt(void **fdt, size_t *size, bool created) { + int err; + switch (alloc_mode) { case FIXED: if (!(*fdt)) @@ -52,7 +55,10 @@ static void realloc_fdt(void **fdt, size_t *size, bool created) *fdt = xmalloc(SPACE); } else if (*size < SPACE) { *size += 1; - fdt_resize(*fdt, *fdt, *size); + err = fdt_resize(*fdt, *fdt, *size); + if (err < 0) + FAIL("fdt_resize() failed: %s", + fdt_strerror(err)); } else { FAIL("Ran out of space"); } @@ -61,9 +67,29 @@ static void realloc_fdt(void **fdt, size_t *size, bool created) case REALLOC: *size += 1; *fdt = xrealloc(*fdt, *size); - if (created) - fdt_resize(*fdt, *fdt, *size); + if (created) { + err = fdt_resize(*fdt, *fdt, *size); + if (err < 0) + FAIL("fdt_resize() failed: %s", + fdt_strerror(err)); + } + return; + + case NEWALLOC: { + void *buf; + + *size += 1; + buf = xmalloc(*size); + if (created) { + err = fdt_resize(*fdt, buf, *size); + if (err < 0) + FAIL("fdt_resize() failed: %s", + fdt_strerror(err)); + } + free(*fdt); + *fdt = buf; return; + } default: CONFIG("Bad allocation mode"); @@ -101,6 +127,9 @@ int main(int argc, char *argv[]) } else if (streq(argv[1], "realloc")) { alloc_mode = REALLOC; size = 0; + } else if (streq(argv[1], "newalloc")) { + alloc_mode = NEWALLOC; + size = 0; } else { char *endp; |