diff options
Diffstat (limited to 'test/printf.c')
-rw-r--r-- | test/printf.c | 129 |
1 files changed, 98 insertions, 31 deletions
diff --git a/test/printf.c b/test/printf.c index d739da3606..7e857dd55c 100644 --- a/test/printf.c +++ b/test/printf.c @@ -3,7 +3,8 @@ * found in the LICENSE file. */ -#include <stdarg.h> /* For va_list */ +#include <stdarg.h> +#include <stdbool.h> #include <stddef.h> #include "common.h" @@ -12,33 +13,38 @@ #include "util.h" #define INIT_VALUE 0x5E +#define NO_BYTES_TOUCHED NULL + static const char err_str[] = "ERROR"; static char output[1024]; -int run(const char *expect, size_t size_limit, int expect_ret, - const char *format, va_list args) +int run(int expect_ret, const char *expect, + bool output_null, size_t size_limit, + const char *format, va_list args) { size_t expect_size = expect ? strlen(expect) + 1 : 0; int rv; ccprintf("\n"); - ccprintf("expect='%s'\n", expect); + ccprintf("size_limit=%-4d | format='%s'\n", size_limit, format); + ccprintf("expect ='%s' | expect_status=%d\n", + expect ? expect : "NO_BYTES_TOUCHED", expect_ret); TEST_ASSERT(expect_size <= sizeof(output)); TEST_ASSERT(expect_size <= size_limit); memset(output, INIT_VALUE, sizeof(output)); - rv = vsnprintf(output, size_limit, format, args); - ccprintf("output='%s'\n", output); + rv = vsnprintf(output_null ? NULL : output, size_limit, + format, args); + ccprintf("received='%.*s' | ret =%d\n", + 30, output, rv); TEST_ASSERT_ARRAY_EQ(output, expect, expect_size); TEST_ASSERT_MEMSET(&output[expect_size], INIT_VALUE, - sizeof(output)-expect_size); + sizeof(output) - expect_size); if (rv >= 0) { - ccprintf("expect_size = %ld\n", expect_size); - ccprintf("rv = %d\n", rv); - TEST_ASSERT(rv == expect_size-1); + TEST_ASSERT(rv == expect_size - 1); TEST_ASSERT(EC_SUCCESS == expect_ret); } else { TEST_ASSERT(rv == -expect_ret); @@ -53,33 +59,68 @@ int expect_success(const char *expect, const char *format, ...) int rv; va_start(args, format); - rv = run(expect, sizeof(output), EC_SUCCESS, format, args); + rv = run(EC_SUCCESS, expect, + false, sizeof(output), + format, args); va_end(args); return rv; } -int expect(int expect_ret, size_t size_limit, const char *expect, - const char *format, ...) +int expect(int expect_ret, const char *expect, + bool output_null, size_t size_limit, + const char *format, ...) { va_list args; int rv; va_start(args, format); - rv = run(expect, size_limit, expect_ret, format, args); + rv = run(expect_ret, expect, + output_null, size_limit, + format, args); va_end(args); return rv; } -#define T(n) do { int rv = (n); if (rv != EC_SUCCESS) return rv; } while (0) +#define T(n) \ + do { \ + int rv = (n); \ + if (rv != EC_SUCCESS) \ + return rv; \ + } while (0) test_static int test_vsnprintf_args(void) { T(expect_success("", "")); T(expect_success("a", "a")); - /* T(expect(NULL, 0, EC_ERROR_INVAL, "")); fail */ - T(expect(EC_ERROR_OVERFLOW, 2, "a", "abc")); + + T(expect(/* expect an invalid args error */ + EC_ERROR_INVAL, NO_BYTES_TOUCHED, + /* given -1 as output size limit */ + false, -1, "")); + T(expect(/* expect an invalid args error */ + EC_ERROR_INVAL, NO_BYTES_TOUCHED, + /* given 0 as output size limit */ + false, 0, "")); + T(expect(/* expect SUCCESS */ + EC_SUCCESS, "", + /* given 1 as output size limit and a blank format */ + false, 1, "")); + T(expect(/* expect an overflow error */ + EC_ERROR_OVERFLOW, "", + /* given 1 as output size limit with a non-blank format */ + false, 1, "a")); + + T(expect(/* expect an invalid args error */ + EC_ERROR_INVAL, NO_BYTES_TOUCHED, + /* given NULL as the output buffer */ + true, sizeof(output), "")); + T(expect(/* expect an invalid args error */ + EC_ERROR_INVAL, NO_BYTES_TOUCHED, + /* given a NULL format string */ + false, sizeof(output), NULL)); + return EC_SUCCESS; } @@ -96,15 +137,28 @@ test_static int test_vsnprintf_int(void) T(expect_success(" +123", "%+5d", 123)); T(expect_success("00123", "%05d", 123)); T(expect_success("00123", "%005d", 123)); - /* T(expect_success("+0123", "%+05d", 123)); actual "0+123" */ - /* T(expect_success("+0123", "%+005d", 123)); actual "0+123" */ + /* + * TODO(crbug.com/974084): This odd behavior should be fixed. + * T(expect_success("+0123", "%+05d", 123)); + * Actual: "0+123" + * T(expect_success("+0123", "%+005d", 123)); + * Actual: "0+123" + */ T(expect_success(" 123", "%*d", 5, 123)); T(expect_success(" +123", "%+*d", 5, 123)); T(expect_success("00123", "%0*d", 5, 123)); - /* T(expect_success("00123", "%00*d", 5, 123)); actual "ERROR" */ + /* + * TODO(crbug.com/974084): This odd behavior should be fixed. + * T(expect_success("00123", "%00*d", 5, 123)); + * Actual: "ERROR" + */ T(expect_success("0+123", "%+0*d", 5, 123)); - /* T(expect_success("0+123", "%+00*d", 5, 123)); actual "ERROR" */ + /* + * TODO(crbug.com/974084): This odd behavior should be fixed. + * T(expect_success("0+123", "%+00*d", 5, 123)); + * Actual: "ERROR" + */ T(expect_success("123 ", "%-5d", 123)); T(expect_success("+123 ", "%-+5d", 123)); @@ -125,7 +179,7 @@ test_static int test_vsnprintf_int(void) T(expect_success("123", "%u", 123)); T(expect_success("4294967295", "%u", -1)); - T(expect_success("18446744073709551615", "%lu", (uint64_t)-1)); + T(expect_success("18446744073709551615", "%lu", (uint64_t)-1)); T(expect_success("0", "%x", 0)); T(expect_success("0", "%X", 0)); @@ -163,10 +217,23 @@ test_static int test_vsnprintf_strings(void) T(expect_success("abc", "%*s", 0, "abc")); T(expect_success("a", "%.1s", "abc")); T(expect_success("a", "%.*s", 1, "abc")); - /* T(expect_success("", "%.0s", "abc")); actual "abc" */ - /* T(expect_success("", "%.*s", 0, "abc")); actual "abc" */ - T(expect_success("ab", "%5.2s", "abc")); /* intentional */ - /* TODO(hesling): test for overruns on malformed strings */ + T(expect_success("", "%.0s", "abc")); + T(expect_success("", "%.*s", 0, "abc")); + /* + * TODO(crbug.com/974084): + * Ignoring the padding parameter is slightly + * odd behavior and could use a review. + */ + T(expect_success("ab", "%5.2s", "abc")); + T(expect_success("abc", "%.4s", "abc")); + + /* + * Given a malformed string (address 0x1 is a good example), + * if we ask for zero precision, expect no bytes to be read + * from the malformed address and a blank output string. + */ + T(expect_success("", "%.0s", (char *)1)); + return EC_SUCCESS; } @@ -176,16 +243,16 @@ test_static int test_vsnprintf_hexdump(void) T(expect_success(err_str, "%h", bytes)); T(expect_success("005e", "%.*h", 2, bytes)); - /* T(expect_success("", "%.*h", 0, bytes)); actual "ERROR" */ - /* T(expect_success(" 005e", "%5.*h", 2, bytes)); actual "005e" */ - /* T(expect_success("005e ", "%-5.*h", 2, bytes)); actual "005e" */ + T(expect_success("", "%.*h", 0, bytes)); + T(expect_success(" 005e", "%5.*h", 2, bytes)); + T(expect_success("00", "%0*.*h", 2, 0, bytes)); return EC_SUCCESS; } test_static int test_vsnprintf_combined(void) { - T(expect_success("abc", "%c%s", 'a', "bc")); - T(expect_success("12\tbc", "%d\t%s", 12, "bc")); + T(expect_success("abc", "%c%s", 'a', "bc")); + T(expect_success("12\tbc", "%d\t%s", 12, "bc")); return EC_SUCCESS; } |