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