Home | History | Annotate | Download | only in linux
      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