summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorRandall Spangler <rspangler@chromium.org>2011-07-07 10:30:25 -0700
committerRandall Spangler <rspangler@chromium.org>2011-07-08 09:17:07 -0700
commitbebe53c9193dbe875d793c7cb124ed66e610e1bd (patch)
tree8933d26b404b4a477d99ef97d2507431e8c1210b /tests
parent93cf15e9a1c29962d6f08be6102d2ea7876d969f (diff)
downloadvboot-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/Makefile2
-rw-r--r--tests/utility_string_tests.c121
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;
+}