1 // Copyright (c) 2009, Google Inc. 2 // All rights reserved. 3 // 4 // Redistribution and use in source and binary forms, with or without 5 // modification, are permitted provided that the following conditions are 6 // met: 7 // 8 // * Redistributions of source code must retain the above copyright 9 // notice, this list of conditions and the following disclaimer. 10 // * Redistributions in binary form must reproduce the above 11 // copyright notice, this list of conditions and the following disclaimer 12 // in the documentation and/or other materials provided with the 13 // distribution. 14 // * Neither the name of Google Inc. nor the names of its 15 // contributors may be used to endorse or promote products derived from 16 // this software without specific prior written permission. 17 // 18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 30 #include "breakpad_googletest_includes.h" 31 #include "common/linux/linux_libc_support.h" 32 33 namespace { 34 typedef testing::Test LinuxLibcSupportTest; 35 } 36 37 TEST(LinuxLibcSupportTest, strlen) { 38 static const char* test_data[] = { "", "a", "aa", "aaa", "aabc", NULL }; 39 for (unsigned i = 0; ; ++i) { 40 if (!test_data[i]) 41 break; 42 ASSERT_EQ(strlen(test_data[i]), my_strlen(test_data[i])); 43 } 44 } 45 46 TEST(LinuxLibcSupportTest, strcmp) { 47 static const char* test_data[] = { 48 "", "", 49 "a", "", 50 "", "a", 51 "a", "b", 52 "a", "a", 53 "ab", "aa", 54 "abc", "ab", 55 "abc", "abc", 56 NULL, 57 }; 58 59 for (unsigned i = 0; ; ++i) { 60 if (!test_data[i*2]) 61 break; 62 int libc_result = strcmp(test_data[i*2], test_data[i*2 + 1]); 63 if (libc_result > 1) 64 libc_result = 1; 65 else if (libc_result < -1) 66 libc_result = -1; 67 ASSERT_EQ(my_strcmp(test_data[i*2], test_data[i*2 + 1]), libc_result); 68 } 69 } 70 71 TEST(LinuxLibcSupportTest, strtoui) { 72 int result; 73 74 ASSERT_FALSE(my_strtoui(&result, "")); 75 ASSERT_FALSE(my_strtoui(&result, "-1")); 76 ASSERT_FALSE(my_strtoui(&result, "-")); 77 ASSERT_FALSE(my_strtoui(&result, "a")); 78 ASSERT_FALSE(my_strtoui(&result, "23472893472938472987987398472398")); 79 80 ASSERT_TRUE(my_strtoui(&result, "0")); 81 ASSERT_EQ(result, 0); 82 ASSERT_TRUE(my_strtoui(&result, "1")); 83 ASSERT_EQ(result, 1); 84 ASSERT_TRUE(my_strtoui(&result, "12")); 85 ASSERT_EQ(result, 12); 86 ASSERT_TRUE(my_strtoui(&result, "123")); 87 ASSERT_EQ(result, 123); 88 ASSERT_TRUE(my_strtoui(&result, "0123")); 89 ASSERT_EQ(result, 123); 90 } 91 92 TEST(LinuxLibcSupportTest, uint_len) { 93 ASSERT_EQ(my_uint_len(0), 1U); 94 ASSERT_EQ(my_uint_len(2), 1U); 95 ASSERT_EQ(my_uint_len(5), 1U); 96 ASSERT_EQ(my_uint_len(9), 1U); 97 ASSERT_EQ(my_uint_len(10), 2U); 98 ASSERT_EQ(my_uint_len(99), 2U); 99 ASSERT_EQ(my_uint_len(100), 3U); 100 ASSERT_EQ(my_uint_len(101), 3U); 101 ASSERT_EQ(my_uint_len(1000), 4U); 102 // 0xFFFFFFFFFFFFFFFF 103 ASSERT_EQ(my_uint_len(18446744073709551615LLU), 20U); 104 } 105 106 TEST(LinuxLibcSupportTest, uitos) { 107 char buf[32]; 108 109 my_uitos(buf, 0, 1); 110 ASSERT_EQ(0, memcmp(buf, "0", 1)); 111 112 my_uitos(buf, 1, 1); 113 ASSERT_EQ(0, memcmp(buf, "1", 1)); 114 115 my_uitos(buf, 10, 2); 116 ASSERT_EQ(0, memcmp(buf, "10", 2)); 117 118 my_uitos(buf, 63, 2); 119 ASSERT_EQ(0, memcmp(buf, "63", 2)); 120 121 my_uitos(buf, 101, 3); 122 ASSERT_EQ(0, memcmp(buf, "101", 2)); 123 124 // 0xFFFFFFFFFFFFFFFF 125 my_uitos(buf, 18446744073709551615LLU, 20); 126 ASSERT_EQ(0, memcmp(buf, "18446744073709551615", 20)); 127 } 128 129 TEST(LinuxLibcSupportTest, strchr) { 130 ASSERT_EQ(NULL, my_strchr("abc", 'd')); 131 ASSERT_EQ(NULL, my_strchr("", 'd')); 132 ASSERT_EQ(NULL, my_strchr("efghi", 'd')); 133 134 ASSERT_TRUE(my_strchr("a", 'a')); 135 ASSERT_TRUE(my_strchr("abc", 'a')); 136 ASSERT_TRUE(my_strchr("bcda", 'a')); 137 ASSERT_TRUE(my_strchr("sdfasdf", 'a')); 138 139 static const char abc3[] = "abcabcabc"; 140 ASSERT_EQ(abc3, my_strchr(abc3, 'a')); 141 } 142 143 TEST(LinuxLibcSupportTest, strrchr) { 144 ASSERT_EQ(NULL, my_strrchr("abc", 'd')); 145 ASSERT_EQ(NULL, my_strrchr("", 'd')); 146 ASSERT_EQ(NULL, my_strrchr("efghi", 'd')); 147 148 ASSERT_TRUE(my_strrchr("a", 'a')); 149 ASSERT_TRUE(my_strrchr("abc", 'a')); 150 ASSERT_TRUE(my_strrchr("bcda", 'a')); 151 ASSERT_TRUE(my_strrchr("sdfasdf", 'a')); 152 153 static const char abc3[] = "abcabcabc"; 154 ASSERT_EQ(abc3 + 6, my_strrchr(abc3, 'a')); 155 } 156 157 TEST(LinuxLibcSupportTest, memchr) { 158 ASSERT_EQ(NULL, my_memchr("abc", 'd', 3)); 159 ASSERT_EQ(NULL, my_memchr("abcd", 'd', 3)); 160 ASSERT_EQ(NULL, my_memchr("a", 'a', 0)); 161 162 static const char abc3[] = "abcabcabc"; 163 ASSERT_EQ(abc3, my_memchr(abc3, 'a', 3)); 164 ASSERT_EQ(abc3, my_memchr(abc3, 'a', 9)); 165 ASSERT_EQ(abc3+1, my_memchr(abc3, 'b', 9)); 166 ASSERT_EQ(abc3+2, my_memchr(abc3, 'c', 9)); 167 } 168 169 TEST(LinuxLibcSupportTest, read_hex_ptr) { 170 uintptr_t result; 171 const char* last; 172 173 last = my_read_hex_ptr(&result, ""); 174 ASSERT_EQ(result, 0U); 175 ASSERT_EQ(*last, 0); 176 177 last = my_read_hex_ptr(&result, "0"); 178 ASSERT_EQ(result, 0U); 179 ASSERT_EQ(*last, 0); 180 181 last = my_read_hex_ptr(&result, "0123"); 182 ASSERT_EQ(result, 0x123U); 183 ASSERT_EQ(*last, 0); 184 185 last = my_read_hex_ptr(&result, "0123a"); 186 ASSERT_EQ(result, 0x123aU); 187 ASSERT_EQ(*last, 0); 188 189 last = my_read_hex_ptr(&result, "0123a-"); 190 ASSERT_EQ(result, 0x123aU); 191 ASSERT_EQ(*last, '-'); 192 } 193 194 TEST(LinuxLibcSupportTest, read_decimal_ptr) { 195 uintptr_t result; 196 const char* last; 197 198 last = my_read_decimal_ptr(&result, "0"); 199 ASSERT_EQ(result, 0U); 200 ASSERT_EQ(*last, 0); 201 202 last = my_read_decimal_ptr(&result, "0123"); 203 ASSERT_EQ(result, 123U); 204 ASSERT_EQ(*last, 0); 205 206 last = my_read_decimal_ptr(&result, "1234"); 207 ASSERT_EQ(result, 1234U); 208 ASSERT_EQ(*last, 0); 209 210 last = my_read_decimal_ptr(&result, "01234-"); 211 ASSERT_EQ(result, 1234U); 212 ASSERT_EQ(*last, '-'); 213 } 214