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