xref: /aosp_15_r20/external/icing/icing/util/encode-util_test.cc (revision 8b6cd535a057e39b3b86660c4aa06c99747c2136)
1*8b6cd535SAndroid Build Coastguard Worker // Copyright (C) 2023 Google LLC
2*8b6cd535SAndroid Build Coastguard Worker //
3*8b6cd535SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*8b6cd535SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*8b6cd535SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*8b6cd535SAndroid Build Coastguard Worker //
7*8b6cd535SAndroid Build Coastguard Worker //      http://www.apache.org/licenses/LICENSE-2.0
8*8b6cd535SAndroid Build Coastguard Worker //
9*8b6cd535SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*8b6cd535SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*8b6cd535SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*8b6cd535SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*8b6cd535SAndroid Build Coastguard Worker // limitations under the License.
14*8b6cd535SAndroid Build Coastguard Worker 
15*8b6cd535SAndroid Build Coastguard Worker #include "icing/util/encode-util.h"
16*8b6cd535SAndroid Build Coastguard Worker 
17*8b6cd535SAndroid Build Coastguard Worker #include <cstdint>
18*8b6cd535SAndroid Build Coastguard Worker #include <string>
19*8b6cd535SAndroid Build Coastguard Worker 
20*8b6cd535SAndroid Build Coastguard Worker #include "gmock/gmock.h"
21*8b6cd535SAndroid Build Coastguard Worker #include "gtest/gtest.h"
22*8b6cd535SAndroid Build Coastguard Worker 
23*8b6cd535SAndroid Build Coastguard Worker namespace icing {
24*8b6cd535SAndroid Build Coastguard Worker namespace lib {
25*8b6cd535SAndroid Build Coastguard Worker namespace encode_util {
26*8b6cd535SAndroid Build Coastguard Worker 
27*8b6cd535SAndroid Build Coastguard Worker namespace {
28*8b6cd535SAndroid Build Coastguard Worker 
29*8b6cd535SAndroid Build Coastguard Worker using ::testing::Eq;
30*8b6cd535SAndroid Build Coastguard Worker using ::testing::Gt;
31*8b6cd535SAndroid Build Coastguard Worker using ::testing::SizeIs;
32*8b6cd535SAndroid Build Coastguard Worker 
TEST(EncodeUtilTest,IntCStringZeroConversion)33*8b6cd535SAndroid Build Coastguard Worker TEST(EncodeUtilTest, IntCStringZeroConversion) {
34*8b6cd535SAndroid Build Coastguard Worker   uint64_t value = 0;
35*8b6cd535SAndroid Build Coastguard Worker   std::string encoded_str = EncodeIntToCString(value);
36*8b6cd535SAndroid Build Coastguard Worker 
37*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(encoded_str, SizeIs(Gt(0)));
38*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(DecodeIntFromCString(encoded_str), Eq(value));
39*8b6cd535SAndroid Build Coastguard Worker }
40*8b6cd535SAndroid Build Coastguard Worker 
TEST(EncodeUtilTest,IntCStringConversionIsReversible)41*8b6cd535SAndroid Build Coastguard Worker TEST(EncodeUtilTest, IntCStringConversionIsReversible) {
42*8b6cd535SAndroid Build Coastguard Worker   uint64_t value = 123456;
43*8b6cd535SAndroid Build Coastguard Worker   std::string encoded_str = EncodeIntToCString(value);
44*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(DecodeIntFromCString(encoded_str), Eq(value));
45*8b6cd535SAndroid Build Coastguard Worker }
46*8b6cd535SAndroid Build Coastguard Worker 
TEST(EncodeUtilTest,MultipleIntCStringConversionsAreReversible)47*8b6cd535SAndroid Build Coastguard Worker TEST(EncodeUtilTest, MultipleIntCStringConversionsAreReversible) {
48*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(DecodeIntFromCString(EncodeIntToCString(25)), Eq(25));
49*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(DecodeIntFromCString(EncodeIntToCString(766)), Eq(766));
50*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(DecodeIntFromCString(EncodeIntToCString(2305)), Eq(2305));
51*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(DecodeIntFromCString(EncodeIntToCString(6922)), Eq(6922));
52*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(DecodeIntFromCString(EncodeIntToCString(62326)), Eq(62326));
53*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(DecodeIntFromCString(EncodeIntToCString(186985)), Eq(186985));
54*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(DecodeIntFromCString(EncodeIntToCString(560962)), Eq(560962));
55*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(DecodeIntFromCString(EncodeIntToCString(1682893)), Eq(1682893));
56*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(DecodeIntFromCString(EncodeIntToCString(15146065)), Eq(15146065));
57*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(DecodeIntFromCString(EncodeIntToCString(136314613)),
58*8b6cd535SAndroid Build Coastguard Worker               Eq(136314613));
59*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(DecodeIntFromCString(EncodeIntToCString(1226831545)),
60*8b6cd535SAndroid Build Coastguard Worker               Eq(1226831545));
61*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(DecodeIntFromCString(EncodeIntToCString(11041483933)),
62*8b6cd535SAndroid Build Coastguard Worker               Eq(11041483933));
63*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(DecodeIntFromCString(EncodeIntToCString(2683080596566)),
64*8b6cd535SAndroid Build Coastguard Worker               Eq(2683080596566));
65*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(DecodeIntFromCString(EncodeIntToCString(72443176107373)),
66*8b6cd535SAndroid Build Coastguard Worker               Eq(72443176107373));
67*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(DecodeIntFromCString(EncodeIntToCString(1955965754899162)),
68*8b6cd535SAndroid Build Coastguard Worker               Eq(1955965754899162));
69*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(DecodeIntFromCString(EncodeIntToCString(52811075382277465)),
70*8b6cd535SAndroid Build Coastguard Worker               Eq(52811075382277465));
71*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(DecodeIntFromCString(EncodeIntToCString(4277697105964474945)),
72*8b6cd535SAndroid Build Coastguard Worker               Eq(4277697105964474945));
73*8b6cd535SAndroid Build Coastguard Worker }
74*8b6cd535SAndroid Build Coastguard Worker 
TEST(EncodeUtilTest,MultipleValidEncodedCStringIntConversionsAreReversible)75*8b6cd535SAndroid Build Coastguard Worker TEST(EncodeUtilTest, MultipleValidEncodedCStringIntConversionsAreReversible) {
76*8b6cd535SAndroid Build Coastguard Worker   // Only valid encoded C string (no zero bytes, length is between 1 and 10) are
77*8b6cd535SAndroid Build Coastguard Worker   // reversible.
78*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(EncodeIntToCString(DecodeIntFromCString("foo")), Eq("foo"));
79*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(EncodeIntToCString(DecodeIntFromCString("bar")), Eq("bar"));
80*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(EncodeIntToCString(DecodeIntFromCString("baz")), Eq("baz"));
81*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(EncodeIntToCString(DecodeIntFromCString("Icing")), Eq("Icing"));
82*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(EncodeIntToCString(DecodeIntFromCString("Google")), Eq("Google"));
83*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(EncodeIntToCString(DecodeIntFromCString("Youtube")),
84*8b6cd535SAndroid Build Coastguard Worker               Eq("Youtube"));
85*8b6cd535SAndroid Build Coastguard Worker }
86*8b6cd535SAndroid Build Coastguard Worker 
TEST(EncodeUtilTest,EncodeStringToCString)87*8b6cd535SAndroid Build Coastguard Worker TEST(EncodeUtilTest, EncodeStringToCString) {
88*8b6cd535SAndroid Build Coastguard Worker   std::string digest;
89*8b6cd535SAndroid Build Coastguard Worker   digest.push_back(0b00000000);  // '\0'
90*8b6cd535SAndroid Build Coastguard Worker   digest.push_back(0b00000001);  // '\1'
91*8b6cd535SAndroid Build Coastguard Worker   digest.push_back(0b00000010);  // '\2'
92*8b6cd535SAndroid Build Coastguard Worker   digest.push_back(0b00000011);  // '\3'
93*8b6cd535SAndroid Build Coastguard Worker   digest.push_back(0b00000100);  // '\4'
94*8b6cd535SAndroid Build Coastguard Worker   digest.push_back(0b00000101);  // '\5'
95*8b6cd535SAndroid Build Coastguard Worker   digest.push_back(0b00000110);  // '\6'
96*8b6cd535SAndroid Build Coastguard Worker   digest.push_back(0b00000111);  // '\7'
97*8b6cd535SAndroid Build Coastguard Worker   digest.push_back(0b00001000);  // '\8'
98*8b6cd535SAndroid Build Coastguard Worker   digest.push_back(0b00001001);  // '\9'
99*8b6cd535SAndroid Build Coastguard Worker   std::string encoded_digest;
100*8b6cd535SAndroid Build Coastguard Worker   // 1 + first 7 bits from '\0'
101*8b6cd535SAndroid Build Coastguard Worker   encoded_digest.push_back(0b10000000);
102*8b6cd535SAndroid Build Coastguard Worker   // 1 + last 1 bit from '\0' + first 6 bits from '\1'
103*8b6cd535SAndroid Build Coastguard Worker   encoded_digest.push_back(0b10000000);
104*8b6cd535SAndroid Build Coastguard Worker   // 1 + last 2 bits from '\1' + first 5 bits from '\2'
105*8b6cd535SAndroid Build Coastguard Worker   encoded_digest.push_back(0b10100000);
106*8b6cd535SAndroid Build Coastguard Worker   // 1 + last 3 bits from '\2' + first 4 bits from '\3'
107*8b6cd535SAndroid Build Coastguard Worker   encoded_digest.push_back(0b10100000);
108*8b6cd535SAndroid Build Coastguard Worker   // 1 + last 4 bits from '\3' + first 3 bits from '\4'
109*8b6cd535SAndroid Build Coastguard Worker   encoded_digest.push_back(0b10011000);
110*8b6cd535SAndroid Build Coastguard Worker   // 1 + last 5 bits from '\4' + first 2 bits from '\5'
111*8b6cd535SAndroid Build Coastguard Worker   encoded_digest.push_back(0b10010000);
112*8b6cd535SAndroid Build Coastguard Worker   // 1 + last 6 bits from '\5' + first 1 bits from '\6'
113*8b6cd535SAndroid Build Coastguard Worker   encoded_digest.push_back(0b10001010);
114*8b6cd535SAndroid Build Coastguard Worker   // 1 + last 7 bits from '\6'
115*8b6cd535SAndroid Build Coastguard Worker   encoded_digest.push_back(0b10000110);
116*8b6cd535SAndroid Build Coastguard Worker   // 1 + first 7 bits from '\7'
117*8b6cd535SAndroid Build Coastguard Worker   encoded_digest.push_back(0b10000011);
118*8b6cd535SAndroid Build Coastguard Worker   // 1 + last 1 bit from '\7' + first 6 bits from '\8'
119*8b6cd535SAndroid Build Coastguard Worker   encoded_digest.push_back(0b11000010);
120*8b6cd535SAndroid Build Coastguard Worker   // 1 + last 2 bit from '\8' + first 5 bits from '\9'
121*8b6cd535SAndroid Build Coastguard Worker   encoded_digest.push_back(0b10000001);
122*8b6cd535SAndroid Build Coastguard Worker   // 1 + last 3 bit from '\9' + filled with 0s
123*8b6cd535SAndroid Build Coastguard Worker   encoded_digest.push_back(0b10010000);
124*8b6cd535SAndroid Build Coastguard Worker 
125*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(EncodeStringToCString(digest), Eq(encoded_digest));
126*8b6cd535SAndroid Build Coastguard Worker }
127*8b6cd535SAndroid Build Coastguard Worker 
TEST(EncodeUtilTest,EncodeEmptyStringToCString)128*8b6cd535SAndroid Build Coastguard Worker TEST(EncodeUtilTest, EncodeEmptyStringToCString) {
129*8b6cd535SAndroid Build Coastguard Worker   std::string digest;
130*8b6cd535SAndroid Build Coastguard Worker   std::string encoded_digest;
131*8b6cd535SAndroid Build Coastguard Worker 
132*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(EncodeStringToCString(digest), Eq(encoded_digest));
133*8b6cd535SAndroid Build Coastguard Worker }
134*8b6cd535SAndroid Build Coastguard Worker 
TEST(EncodeUtilTest,EncodeMiddle0ByteStringToCStringConversions)135*8b6cd535SAndroid Build Coastguard Worker TEST(EncodeUtilTest, EncodeMiddle0ByteStringToCStringConversions) {
136*8b6cd535SAndroid Build Coastguard Worker   std::string digest;
137*8b6cd535SAndroid Build Coastguard Worker   digest.push_back(0b00000001);  // '\1'
138*8b6cd535SAndroid Build Coastguard Worker   digest.push_back(0b00000010);  // '\2'
139*8b6cd535SAndroid Build Coastguard Worker   digest.push_back(0b00000011);  // '\3'
140*8b6cd535SAndroid Build Coastguard Worker   digest.push_back(0b00000000);  // '\0'
141*8b6cd535SAndroid Build Coastguard Worker   digest.push_back(0b00000100);  // '\4'
142*8b6cd535SAndroid Build Coastguard Worker   digest.push_back(0b00000101);  // '\5'
143*8b6cd535SAndroid Build Coastguard Worker   digest.push_back(0b00000110);  // '\6'
144*8b6cd535SAndroid Build Coastguard Worker   std::string encoded_digest;
145*8b6cd535SAndroid Build Coastguard Worker   // 1 + first 7 bits from '\1'
146*8b6cd535SAndroid Build Coastguard Worker   encoded_digest.push_back(0b10000000);
147*8b6cd535SAndroid Build Coastguard Worker   // 1 + last 1 bit from '\1' + first 6 bits from '\2'
148*8b6cd535SAndroid Build Coastguard Worker   encoded_digest.push_back(0b11000000);
149*8b6cd535SAndroid Build Coastguard Worker   // 1 + last 2 bits from '\2' + first 5 bits from '\3'
150*8b6cd535SAndroid Build Coastguard Worker   encoded_digest.push_back(0b11000000);
151*8b6cd535SAndroid Build Coastguard Worker   // 1 + last 3 bits from '\3' + first 4 bits from '\0'
152*8b6cd535SAndroid Build Coastguard Worker   encoded_digest.push_back(0b10110000);
153*8b6cd535SAndroid Build Coastguard Worker   // 1 + last 4 bits from '\0' + first 3 bits from '\4'
154*8b6cd535SAndroid Build Coastguard Worker   encoded_digest.push_back(0b10000000);
155*8b6cd535SAndroid Build Coastguard Worker   // 1 + last 5 bits from '\4' + first 2 bits from '\5'
156*8b6cd535SAndroid Build Coastguard Worker   encoded_digest.push_back(0b10010000);
157*8b6cd535SAndroid Build Coastguard Worker   // 1 + last 6 bits from '\5' + first 1 bits from '\6'
158*8b6cd535SAndroid Build Coastguard Worker   encoded_digest.push_back(0b10001010);
159*8b6cd535SAndroid Build Coastguard Worker   // 1 + last 7 bits from '\6'
160*8b6cd535SAndroid Build Coastguard Worker   encoded_digest.push_back(0b10000110);
161*8b6cd535SAndroid Build Coastguard Worker 
162*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(EncodeStringToCString(digest), Eq(encoded_digest));
163*8b6cd535SAndroid Build Coastguard Worker }
164*8b6cd535SAndroid Build Coastguard Worker 
TEST(EncodeUtilTest,Encode32BytesDigestToCStringLength)165*8b6cd535SAndroid Build Coastguard Worker TEST(EncodeUtilTest, Encode32BytesDigestToCStringLength) {
166*8b6cd535SAndroid Build Coastguard Worker   std::string digest(32, 0b00000000);
167*8b6cd535SAndroid Build Coastguard Worker   // 37 = ceil(32 / 7.0 * 8.0)
168*8b6cd535SAndroid Build Coastguard Worker   EXPECT_THAT(EncodeStringToCString(digest).size(), Eq(37));
169*8b6cd535SAndroid Build Coastguard Worker }
170*8b6cd535SAndroid Build Coastguard Worker 
171*8b6cd535SAndroid Build Coastguard Worker }  // namespace
172*8b6cd535SAndroid Build Coastguard Worker 
173*8b6cd535SAndroid Build Coastguard Worker }  // namespace encode_util
174*8b6cd535SAndroid Build Coastguard Worker }  // namespace lib
175*8b6cd535SAndroid Build Coastguard Worker }  // namespace icing
176