1bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler/* Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
2bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler * Use of this source code is governed by a BSD-style license that can be
3bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler * found in the LICENSE file.
4bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler *
5bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler * Tests for string utility functions.
6bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler */
7bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
80c3ba249abb1dc60f5ebabccf84ff13206440b83Bill Richardson#include <stdint.h>
9bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler#include <stdio.h>
10bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler#include <stdlib.h>
11bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler#include <string.h>
12bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
13bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler#include "test_common.h"
14bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler#include "utility.h"
15bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler#include "vboot_common.h"
16bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
17bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
18bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler/* Test string concatenation */
19bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spanglerstatic void StrncatTest(void) {
20bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  char dest[128];
21bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
22bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  /* Null inputs */
235fed2a667096341160db8643a4a057e328953a1dBill Richardson  TEST_EQ(0, StrnAppend(dest, NULL, sizeof(dest)), "StrnAppend('', null)");
245fed2a667096341160db8643a4a057e328953a1dBill Richardson  TEST_EQ(0, StrnAppend(NULL, "Hey!", sizeof(dest)), "StrnAppend(null, '')");
25bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
26bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  /* Empty <-- empty */
27bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  *dest = 0;
285fed2a667096341160db8643a4a057e328953a1dBill Richardson  TEST_EQ(0, StrnAppend(dest, "", sizeof(dest)), "StrnAppend('', '')");
295fed2a667096341160db8643a4a057e328953a1dBill Richardson  TEST_EQ(0, strcmp(dest, ""), "StrnAppend('', '') result");
30bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
31bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  /* Nonempty <-- empty */
32bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  strcpy(dest, "Bob");
335fed2a667096341160db8643a4a057e328953a1dBill Richardson  TEST_EQ(3, StrnAppend(dest, "", sizeof(dest)), "StrnAppend(B, '')");
345fed2a667096341160db8643a4a057e328953a1dBill Richardson  TEST_EQ(0, strcmp(dest, "Bob"), "StrnAppend(B, '') result");
35bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
36bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  /* Empty <-- nonempty */
37bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  *dest = 0;
385fed2a667096341160db8643a4a057e328953a1dBill Richardson  TEST_EQ(5, StrnAppend(dest, "Alice", sizeof(dest)), "StrnAppend('', A)");
395fed2a667096341160db8643a4a057e328953a1dBill Richardson  TEST_EQ(0, strcmp(dest, "Alice"), "StrnAppend('', A) result");
40bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
41bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  /* Nonempty <-- nonempty */
42bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  strcpy(dest, "Tigre");
435fed2a667096341160db8643a4a057e328953a1dBill Richardson  TEST_EQ(10, StrnAppend(dest, "Bunny", sizeof(dest)), "StrnAppend(T, B)");
445fed2a667096341160db8643a4a057e328953a1dBill Richardson  TEST_EQ(0, strcmp(dest, "TigreBunny"), "StrnAppend(T, B) result");
45bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
46bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  /* Test clipping */
47bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  strcpy(dest, "YesI");
485fed2a667096341160db8643a4a057e328953a1dBill Richardson  TEST_EQ(7, StrnAppend(dest, "Can't", 8), "StrnAppend(Y, over)");
495fed2a667096341160db8643a4a057e328953a1dBill Richardson  TEST_EQ(0, strcmp(dest, "YesICan"), "StrnAppend(Y, over) result");
50bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
51bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  /* Test clipping if dest already overflows its claimed length */
52bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  strcpy(dest, "BudgetDeficit");
535fed2a667096341160db8643a4a057e328953a1dBill Richardson  TEST_EQ(6, StrnAppend(dest, "Spending", 7), "StrnAppend(over, over)");
545fed2a667096341160db8643a4a057e328953a1dBill Richardson  TEST_EQ(0, strcmp(dest, "Budget"), "StrnAppend(over, over) result");
55bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler}
56bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
57bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
58bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spanglerstatic void TestU64ToS(uint64_t value, uint32_t radix, uint32_t zero_pad_width,
59bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler                       const char *expect) {
60bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  char dest[UINT64_TO_STRING_MAX];
61bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
62bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  TEST_EQ(strlen(expect),
63bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler          Uint64ToString(dest, sizeof(dest), value, radix, zero_pad_width),
64bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler          "Uint64ToString");
65bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  printf("Uint64ToString expect %s got %s\n", expect, dest);
66bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  TEST_EQ(0, strcmp(dest, expect), "Uint64ToString result");
67bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler}
68bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
69bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
70bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler/* Test uint64 to string conversion */
71bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spanglerstatic void Uint64ToStringTest(void) {
72bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  char dest[UINT64_TO_STRING_MAX];
73bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
74bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  /* Test invalid inputs */
75bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  TEST_EQ(0, Uint64ToString(NULL, 8, 123, 10, 8), "Uint64ToString null dest");
76bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  TestU64ToS(0, 1, 0, "");
77bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  TestU64ToS(0, 37, 0, "");
78bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
79bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  /* Binary */
80bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  TestU64ToS(0, 2, 0, "0");
81bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  TestU64ToS(0x9A, 2, 0, "10011010");
82bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  TestU64ToS(0x71, 2, 12, "000001110001");
83bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  TestU64ToS(
84ac8805e7e9bd40c03baf44e37b26f28d9b763ab5Gabe Black      ~0ULL, 2, 0,
85bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler      "1111111111111111111111111111111111111111111111111111111111111111");
86bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
87bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  /* Decimal */
88bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  TestU64ToS(0, 10, 0, "0");
89bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  TestU64ToS(12345, 10, 0, "12345");
90bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  TestU64ToS(67890, 10, 8, "00067890");
91ac8805e7e9bd40c03baf44e37b26f28d9b763ab5Gabe Black  TestU64ToS(~0ULL, 10, 0, "18446744073709551615");
92bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
93bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  /* Hex */
94bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  TestU64ToS(0, 16, 0, "0");
95bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  TestU64ToS(0x12345678, 16, 0, "12345678");
96bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  TestU64ToS(0x9ABCDEF, 16, 8, "09abcdef");
97ac8805e7e9bd40c03baf44e37b26f28d9b763ab5Gabe Black  TestU64ToS(~0ULL, 16, 0, "ffffffffffffffff");
98bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
99bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  /* Zero pad corner cases */
100bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  /* Don't pad if over length */
101ac8805e7e9bd40c03baf44e37b26f28d9b763ab5Gabe Black  TestU64ToS(0x1234567890ULL, 16, 8, "1234567890");
102bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  /* Fail if padding won't fit in buffer */
103bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  TEST_EQ(0, Uint64ToString(dest, 8, 123, 10, 8), "Uint64ToString bad pad");
104bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  TEST_EQ(0, strcmp(dest, ""), "Uint64ToString bad pad result");
105bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
106bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler}
107bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
108bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
109bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spanglerint main(int argc, char* argv[]) {
110bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  int error_code = 0;
111bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
112bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  StrncatTest();
113bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  Uint64ToStringTest();
114bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
115bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  if (!gTestSuccess)
116bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler    error_code = 255;
117bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler
118bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler  return error_code;
119bebe53c9193dbe875d793c7cb124ed66e610e1bdRandall Spangler}
120