diff options
author | Randall Spangler <rspangler@chromium.org> | 2011-07-07 10:30:25 -0700 |
---|---|---|
committer | Randall Spangler <rspangler@chromium.org> | 2011-07-08 09:17:07 -0700 |
commit | bebe53c9193dbe875d793c7cb124ed66e610e1bd (patch) | |
tree | 8933d26b404b4a477d99ef97d2507431e8c1210b /tests | |
parent | 93cf15e9a1c29962d6f08be6102d2ea7876d969f (diff) | |
download | vboot-bebe53c9193dbe875d793c7cb124ed66e610e1bd.tar.gz |
Add string utility functions.
These are used by the coming-soon vboot wrapper (vboot_api_kernel) to
display debug information when Tab is pressed at a BIOS screen.
BUG=chromium-os:17035
TEST=make && make runtests (runs new test!)
Change-Id: I4893f31e9333f4e9d458a6e347213eef22f770cd
Reviewed-on: http://gerrit.chromium.org/gerrit/3759
Reviewed-by: Bill Richardson <wfrichar@chromium.org>
Tested-by: Randall Spangler <rspangler@chromium.org>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/Makefile | 2 | ||||
-rw-r--r-- | tests/utility_string_tests.c | 121 |
2 files changed, 123 insertions, 0 deletions
diff --git a/tests/Makefile b/tests/Makefile index e97bbe11..e2a4af53 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -15,6 +15,7 @@ TEST_NAMES = cgptlib_test \ rsa_verify_benchmark \ sha_benchmark \ sha_tests \ + utility_string_tests \ vboot_common_tests \ vboot_common2_tests \ vboot_common3_tests \ @@ -90,6 +91,7 @@ runcryptotests: # Run other misc tests runmisctests: ./run_vbutil_tests.sh + ${BUILD_ROOT}/utility_string_tests #This will exercise vbutil_kernel and vbutil_firmware runfuzztests: diff --git a/tests/utility_string_tests.c b/tests/utility_string_tests.c new file mode 100644 index 00000000..91f57146 --- /dev/null +++ b/tests/utility_string_tests.c @@ -0,0 +1,121 @@ +/* Copyright (c) 2011 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + * + * Tests for string utility functions. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "test_common.h" +#include "utility.h" +#include "vboot_common.h" + + +/* Test string concatenation */ +static void StrncatTest(void) { + char dest[128]; + + /* Null inputs */ + TEST_EQ(0, Strncat(dest, NULL, sizeof(dest)), "Strncat('', null)"); + TEST_EQ(0, Strncat(NULL, "Hey!", sizeof(dest)), "Strncat(null, '')"); + + /* Empty <-- empty */ + *dest = 0; + TEST_EQ(0, Strncat(dest, "", sizeof(dest)), "Strncat('', '')"); + TEST_EQ(0, strcmp(dest, ""), "Strncat('', '') result"); + + /* Nonempty <-- empty */ + strcpy(dest, "Bob"); + TEST_EQ(3, Strncat(dest, "", sizeof(dest)), "Strncat(B, '')"); + TEST_EQ(0, strcmp(dest, "Bob"), "Strncat(B, '') result"); + + /* Empty <-- nonempty */ + *dest = 0; + TEST_EQ(5, Strncat(dest, "Alice", sizeof(dest)), "Strncat('', A)"); + TEST_EQ(0, strcmp(dest, "Alice"), "Strncat('', A) result"); + + /* Nonempty <-- nonempty */ + strcpy(dest, "Tigre"); + TEST_EQ(10, Strncat(dest, "Bunny", sizeof(dest)), "Strncat(T, B)"); + TEST_EQ(0, strcmp(dest, "TigreBunny"), "Strncat(T, B) result"); + + /* Test clipping */ + strcpy(dest, "YesI"); + TEST_EQ(7, Strncat(dest, "Can't", 8), "Strncat(Y, over)"); + TEST_EQ(0, strcmp(dest, "YesICan"), "Strncat(Y, over) result"); + + /* Test clipping if dest already overflows its claimed length */ + strcpy(dest, "BudgetDeficit"); + TEST_EQ(6, Strncat(dest, "Spending", 7), "Strncat(over, over)"); + TEST_EQ(0, strcmp(dest, "Budget"), "Strncat(over, over) result"); +} + + +static void TestU64ToS(uint64_t value, uint32_t radix, uint32_t zero_pad_width, + const char *expect) { + char dest[UINT64_TO_STRING_MAX]; + + TEST_EQ(strlen(expect), + Uint64ToString(dest, sizeof(dest), value, radix, zero_pad_width), + "Uint64ToString"); + printf("Uint64ToString expect %s got %s\n", expect, dest); + TEST_EQ(0, strcmp(dest, expect), "Uint64ToString result"); +} + + +/* Test uint64 to string conversion */ +static void Uint64ToStringTest(void) { + char dest[UINT64_TO_STRING_MAX]; + + /* Test invalid inputs */ + TEST_EQ(0, Uint64ToString(NULL, 8, 123, 10, 8), "Uint64ToString null dest"); + TestU64ToS(0, 1, 0, ""); + TestU64ToS(0, 37, 0, ""); + + /* Binary */ + TestU64ToS(0, 2, 0, "0"); + TestU64ToS(0x9A, 2, 0, "10011010"); + TestU64ToS(0x71, 2, 12, "000001110001"); + TestU64ToS( + ~UINT64_C(0), 2, 0, + "1111111111111111111111111111111111111111111111111111111111111111"); + + /* Decimal */ + TestU64ToS(0, 10, 0, "0"); + TestU64ToS(12345, 10, 0, "12345"); + TestU64ToS(67890, 10, 8, "00067890"); + TestU64ToS(~UINT64_C(0), 10, 0, "18446744073709551615"); + + /* Hex */ + TestU64ToS(0, 16, 0, "0"); + TestU64ToS(0x12345678, 16, 0, "12345678"); + TestU64ToS(0x9ABCDEF, 16, 8, "09abcdef"); + TestU64ToS(~UINT64_C(0), 16, 0, "ffffffffffffffff"); + + /* Zero pad corner cases */ + /* Don't pad if over length */ + TestU64ToS(0x1234567890, 16, 8, "1234567890"); + /* Fail if padding won't fit in buffer */ + TEST_EQ(0, Uint64ToString(dest, 8, 123, 10, 8), "Uint64ToString bad pad"); + TEST_EQ(0, strcmp(dest, ""), "Uint64ToString bad pad result"); + +} + + +/* disable MSVC warnings on unused arguments */ +__pragma(warning (disable: 4100)) + +int main(int argc, char* argv[]) { + int error_code = 0; + + StrncatTest(); + Uint64ToStringTest(); + + if (!gTestSuccess) + error_code = 255; + + return error_code; +} |