logging_test.cc
1 // Copyright (c) 2018 The LevelDB Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. See the AUTHORS file for names of contributors. 4 5 #include <limits> 6 #include <string> 7 8 #include "leveldb/slice.h" 9 #include "util/logging.h" 10 #include "util/testharness.h" 11 12 namespace leveldb { 13 14 class Logging {}; 15 16 TEST(Logging, NumberToString) { 17 ASSERT_EQ("0", NumberToString(0)); 18 ASSERT_EQ("1", NumberToString(1)); 19 ASSERT_EQ("9", NumberToString(9)); 20 21 ASSERT_EQ("10", NumberToString(10)); 22 ASSERT_EQ("11", NumberToString(11)); 23 ASSERT_EQ("19", NumberToString(19)); 24 ASSERT_EQ("99", NumberToString(99)); 25 26 ASSERT_EQ("100", NumberToString(100)); 27 ASSERT_EQ("109", NumberToString(109)); 28 ASSERT_EQ("190", NumberToString(190)); 29 ASSERT_EQ("123", NumberToString(123)); 30 ASSERT_EQ("12345678", NumberToString(12345678)); 31 32 static_assert(std::numeric_limits<uint64_t>::max() == 18446744073709551615U, 33 "Test consistency check"); 34 ASSERT_EQ("18446744073709551000", NumberToString(18446744073709551000U)); 35 ASSERT_EQ("18446744073709551600", NumberToString(18446744073709551600U)); 36 ASSERT_EQ("18446744073709551610", NumberToString(18446744073709551610U)); 37 ASSERT_EQ("18446744073709551614", NumberToString(18446744073709551614U)); 38 ASSERT_EQ("18446744073709551615", NumberToString(18446744073709551615U)); 39 } 40 41 void ConsumeDecimalNumberRoundtripTest(uint64_t number, 42 const std::string& padding = "") { 43 std::string decimal_number = NumberToString(number); 44 std::string input_string = decimal_number + padding; 45 Slice input(input_string); 46 Slice output = input; 47 uint64_t result; 48 ASSERT_TRUE(ConsumeDecimalNumber(&output, &result)); 49 ASSERT_EQ(number, result); 50 ASSERT_EQ(decimal_number.size(), output.data() - input.data()); 51 ASSERT_EQ(padding.size(), output.size()); 52 } 53 54 TEST(Logging, ConsumeDecimalNumberRoundtrip) { 55 ConsumeDecimalNumberRoundtripTest(0); 56 ConsumeDecimalNumberRoundtripTest(1); 57 ConsumeDecimalNumberRoundtripTest(9); 58 59 ConsumeDecimalNumberRoundtripTest(10); 60 ConsumeDecimalNumberRoundtripTest(11); 61 ConsumeDecimalNumberRoundtripTest(19); 62 ConsumeDecimalNumberRoundtripTest(99); 63 64 ConsumeDecimalNumberRoundtripTest(100); 65 ConsumeDecimalNumberRoundtripTest(109); 66 ConsumeDecimalNumberRoundtripTest(190); 67 ConsumeDecimalNumberRoundtripTest(123); 68 ASSERT_EQ("12345678", NumberToString(12345678)); 69 70 for (uint64_t i = 0; i < 100; ++i) { 71 uint64_t large_number = std::numeric_limits<uint64_t>::max() - i; 72 ConsumeDecimalNumberRoundtripTest(large_number); 73 } 74 } 75 76 TEST(Logging, ConsumeDecimalNumberRoundtripWithPadding) { 77 ConsumeDecimalNumberRoundtripTest(0, " "); 78 ConsumeDecimalNumberRoundtripTest(1, "abc"); 79 ConsumeDecimalNumberRoundtripTest(9, "x"); 80 81 ConsumeDecimalNumberRoundtripTest(10, "_"); 82 ConsumeDecimalNumberRoundtripTest(11, std::string("\0\0\0", 3)); 83 ConsumeDecimalNumberRoundtripTest(19, "abc"); 84 ConsumeDecimalNumberRoundtripTest(99, "padding"); 85 86 ConsumeDecimalNumberRoundtripTest(100, " "); 87 88 for (uint64_t i = 0; i < 100; ++i) { 89 uint64_t large_number = std::numeric_limits<uint64_t>::max() - i; 90 ConsumeDecimalNumberRoundtripTest(large_number, "pad"); 91 } 92 } 93 94 void ConsumeDecimalNumberOverflowTest(const std::string& input_string) { 95 Slice input(input_string); 96 Slice output = input; 97 uint64_t result; 98 ASSERT_EQ(false, ConsumeDecimalNumber(&output, &result)); 99 } 100 101 TEST(Logging, ConsumeDecimalNumberOverflow) { 102 static_assert(std::numeric_limits<uint64_t>::max() == 18446744073709551615U, 103 "Test consistency check"); 104 ConsumeDecimalNumberOverflowTest("18446744073709551616"); 105 ConsumeDecimalNumberOverflowTest("18446744073709551617"); 106 ConsumeDecimalNumberOverflowTest("18446744073709551618"); 107 ConsumeDecimalNumberOverflowTest("18446744073709551619"); 108 ConsumeDecimalNumberOverflowTest("18446744073709551620"); 109 ConsumeDecimalNumberOverflowTest("18446744073709551621"); 110 ConsumeDecimalNumberOverflowTest("18446744073709551622"); 111 ConsumeDecimalNumberOverflowTest("18446744073709551623"); 112 ConsumeDecimalNumberOverflowTest("18446744073709551624"); 113 ConsumeDecimalNumberOverflowTest("18446744073709551625"); 114 ConsumeDecimalNumberOverflowTest("18446744073709551626"); 115 116 ConsumeDecimalNumberOverflowTest("18446744073709551700"); 117 118 ConsumeDecimalNumberOverflowTest("99999999999999999999"); 119 } 120 121 void ConsumeDecimalNumberNoDigitsTest(const std::string& input_string) { 122 Slice input(input_string); 123 Slice output = input; 124 uint64_t result; 125 ASSERT_EQ(false, ConsumeDecimalNumber(&output, &result)); 126 ASSERT_EQ(input.data(), output.data()); 127 ASSERT_EQ(input.size(), output.size()); 128 } 129 130 TEST(Logging, ConsumeDecimalNumberNoDigits) { 131 ConsumeDecimalNumberNoDigitsTest(""); 132 ConsumeDecimalNumberNoDigitsTest(" "); 133 ConsumeDecimalNumberNoDigitsTest("a"); 134 ConsumeDecimalNumberNoDigitsTest(" 123"); 135 ConsumeDecimalNumberNoDigitsTest("a123"); 136 ConsumeDecimalNumberNoDigitsTest(std::string("\000123", 4)); 137 ConsumeDecimalNumberNoDigitsTest(std::string("\177123", 4)); 138 ConsumeDecimalNumberNoDigitsTest(std::string("\377123", 4)); 139 } 140 141 } // namespace leveldb 142 143 int main(int argc, char** argv) { return leveldb::test::RunAllTests(); }