xref: /aosp_15_r20/external/cronet/net/websockets/websocket_inflater_test.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "net/websockets/websocket_inflater.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <string>
8*6777b538SAndroid Build Coastguard Worker #include <vector>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "net/base/io_buffer.h"
11*6777b538SAndroid Build Coastguard Worker #include "net/websockets/websocket_deflater.h"
12*6777b538SAndroid Build Coastguard Worker #include "net/websockets/websocket_test_util.h"
13*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker namespace net {
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker namespace {
18*6777b538SAndroid Build Coastguard Worker 
ToString(IOBufferWithSize * buffer)19*6777b538SAndroid Build Coastguard Worker std::string ToString(IOBufferWithSize* buffer) {
20*6777b538SAndroid Build Coastguard Worker   return std::string(buffer->data(), buffer->size());
21*6777b538SAndroid Build Coastguard Worker }
22*6777b538SAndroid Build Coastguard Worker 
TEST(WebSocketInflaterTest,Construct)23*6777b538SAndroid Build Coastguard Worker TEST(WebSocketInflaterTest, Construct) {
24*6777b538SAndroid Build Coastguard Worker   WebSocketInflater inflater;
25*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.Initialize(15));
26*6777b538SAndroid Build Coastguard Worker 
27*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0u, inflater.CurrentOutputSize());
28*6777b538SAndroid Build Coastguard Worker }
29*6777b538SAndroid Build Coastguard Worker 
TEST(WebSocketInflaterTest,InflateHelloTakeOverContext)30*6777b538SAndroid Build Coastguard Worker TEST(WebSocketInflaterTest, InflateHelloTakeOverContext) {
31*6777b538SAndroid Build Coastguard Worker   WebSocketInflater inflater;
32*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.Initialize(15));
33*6777b538SAndroid Build Coastguard Worker   scoped_refptr<IOBufferWithSize> actual1, actual2;
34*6777b538SAndroid Build Coastguard Worker 
35*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.AddBytes("\xf2\x48\xcd\xc9\xc9\x07\x00", 7));
36*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.Finish());
37*6777b538SAndroid Build Coastguard Worker   actual1 = inflater.GetOutput(inflater.CurrentOutputSize());
38*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(actual1.get());
39*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("Hello", ToString(actual1.get()));
40*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0u, inflater.CurrentOutputSize());
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.AddBytes("\xf2\x00\x11\x00\x00", 5));
43*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.Finish());
44*6777b538SAndroid Build Coastguard Worker   actual2 = inflater.GetOutput(inflater.CurrentOutputSize());
45*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(actual2.get());
46*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("Hello", ToString(actual2.get()));
47*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0u, inflater.CurrentOutputSize());
48*6777b538SAndroid Build Coastguard Worker }
49*6777b538SAndroid Build Coastguard Worker 
TEST(WebSocketInflaterTest,InflateHelloSmallCapacity)50*6777b538SAndroid Build Coastguard Worker TEST(WebSocketInflaterTest, InflateHelloSmallCapacity) {
51*6777b538SAndroid Build Coastguard Worker   WebSocketInflater inflater(1, 1);
52*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.Initialize(15));
53*6777b538SAndroid Build Coastguard Worker   std::string actual;
54*6777b538SAndroid Build Coastguard Worker 
55*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.AddBytes("\xf2\x48\xcd\xc9\xc9\x07\x00", 7));
56*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.Finish());
57*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < 5; ++i) {
58*6777b538SAndroid Build Coastguard Worker     ASSERT_EQ(1u, inflater.CurrentOutputSize());
59*6777b538SAndroid Build Coastguard Worker     scoped_refptr<IOBufferWithSize> buffer = inflater.GetOutput(1);
60*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(buffer.get());
61*6777b538SAndroid Build Coastguard Worker     ASSERT_EQ(1, buffer->size());
62*6777b538SAndroid Build Coastguard Worker     actual += ToString(buffer.get());
63*6777b538SAndroid Build Coastguard Worker   }
64*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("Hello", actual);
65*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0u, inflater.CurrentOutputSize());
66*6777b538SAndroid Build Coastguard Worker }
67*6777b538SAndroid Build Coastguard Worker 
TEST(WebSocketInflaterTest,InflateHelloSmallCapacityGetTotalOutput)68*6777b538SAndroid Build Coastguard Worker TEST(WebSocketInflaterTest, InflateHelloSmallCapacityGetTotalOutput) {
69*6777b538SAndroid Build Coastguard Worker   WebSocketInflater inflater(1, 1);
70*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.Initialize(15));
71*6777b538SAndroid Build Coastguard Worker   scoped_refptr<IOBufferWithSize> actual;
72*6777b538SAndroid Build Coastguard Worker 
73*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.AddBytes("\xf2\x48\xcd\xc9\xc9\x07\x00", 7));
74*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.Finish());
75*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(1u, inflater.CurrentOutputSize());
76*6777b538SAndroid Build Coastguard Worker   actual = inflater.GetOutput(1024);
77*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("Hello", ToString(actual.get()));
78*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0u, inflater.CurrentOutputSize());
79*6777b538SAndroid Build Coastguard Worker }
80*6777b538SAndroid Build Coastguard Worker 
TEST(WebSocketInflaterTest,InflateInvalidData)81*6777b538SAndroid Build Coastguard Worker TEST(WebSocketInflaterTest, InflateInvalidData) {
82*6777b538SAndroid Build Coastguard Worker   WebSocketInflater inflater;
83*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.Initialize(15));
84*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(inflater.AddBytes("\xf2\x48\xcd\xc9INVALID DATA", 16));
85*6777b538SAndroid Build Coastguard Worker }
86*6777b538SAndroid Build Coastguard Worker 
TEST(WebSocketInflaterTest,ChokedInvalidData)87*6777b538SAndroid Build Coastguard Worker TEST(WebSocketInflaterTest, ChokedInvalidData) {
88*6777b538SAndroid Build Coastguard Worker   WebSocketInflater inflater(1, 1);
89*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.Initialize(15));
90*6777b538SAndroid Build Coastguard Worker 
91*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(inflater.AddBytes("\xf2\x48\xcd\xc9INVALID DATA", 16));
92*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(inflater.Finish());
93*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1u, inflater.CurrentOutputSize());
94*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(inflater.GetOutput(1024).get());
95*6777b538SAndroid Build Coastguard Worker }
96*6777b538SAndroid Build Coastguard Worker 
TEST(WebSocketInflaterTest,MultipleAddBytesCalls)97*6777b538SAndroid Build Coastguard Worker TEST(WebSocketInflaterTest, MultipleAddBytesCalls) {
98*6777b538SAndroid Build Coastguard Worker   WebSocketInflater inflater;
99*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.Initialize(15));
100*6777b538SAndroid Build Coastguard Worker   std::string input("\xf2\x48\xcd\xc9\xc9\x07\x00", 7);
101*6777b538SAndroid Build Coastguard Worker   scoped_refptr<IOBufferWithSize> actual;
102*6777b538SAndroid Build Coastguard Worker 
103*6777b538SAndroid Build Coastguard Worker   for (char& c : input) {
104*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(inflater.AddBytes(&c, 1));
105*6777b538SAndroid Build Coastguard Worker   }
106*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.Finish());
107*6777b538SAndroid Build Coastguard Worker   actual = inflater.GetOutput(5);
108*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(actual.get());
109*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("Hello", ToString(actual.get()));
110*6777b538SAndroid Build Coastguard Worker }
111*6777b538SAndroid Build Coastguard Worker 
TEST(WebSocketInflaterTest,Reset)112*6777b538SAndroid Build Coastguard Worker TEST(WebSocketInflaterTest, Reset) {
113*6777b538SAndroid Build Coastguard Worker   WebSocketInflater inflater;
114*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.Initialize(15));
115*6777b538SAndroid Build Coastguard Worker   scoped_refptr<IOBufferWithSize> actual1, actual2;
116*6777b538SAndroid Build Coastguard Worker 
117*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.AddBytes("\xf2\x48\xcd\xc9\xc9\x07\x00", 7));
118*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.Finish());
119*6777b538SAndroid Build Coastguard Worker   actual1 = inflater.GetOutput(inflater.CurrentOutputSize());
120*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(actual1.get());
121*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("Hello", ToString(actual1.get()));
122*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0u, inflater.CurrentOutputSize());
123*6777b538SAndroid Build Coastguard Worker 
124*6777b538SAndroid Build Coastguard Worker   // Reset the stream with a block [BFINAL = 1, BTYPE = 00, LEN = 0]
125*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.AddBytes("\x01", 1));
126*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.Finish());
127*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(0u, inflater.CurrentOutputSize());
128*6777b538SAndroid Build Coastguard Worker 
129*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.AddBytes("\xf2\x48\xcd\xc9\xc9\x07\x00", 7));
130*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.Finish());
131*6777b538SAndroid Build Coastguard Worker   actual2 = inflater.GetOutput(inflater.CurrentOutputSize());
132*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(actual2.get());
133*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("Hello", ToString(actual2.get()));
134*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0u, inflater.CurrentOutputSize());
135*6777b538SAndroid Build Coastguard Worker }
136*6777b538SAndroid Build Coastguard Worker 
TEST(WebSocketInflaterTest,ResetAndLostContext)137*6777b538SAndroid Build Coastguard Worker TEST(WebSocketInflaterTest, ResetAndLostContext) {
138*6777b538SAndroid Build Coastguard Worker   WebSocketInflater inflater;
139*6777b538SAndroid Build Coastguard Worker   scoped_refptr<IOBufferWithSize> actual1, actual2;
140*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.Initialize(15));
141*6777b538SAndroid Build Coastguard Worker 
142*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.AddBytes("\xf2\x48\xcd\xc9\xc9\x07\x00", 7));
143*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.Finish());
144*6777b538SAndroid Build Coastguard Worker   actual1 = inflater.GetOutput(inflater.CurrentOutputSize());
145*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(actual1.get());
146*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("Hello", ToString(actual1.get()));
147*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0u, inflater.CurrentOutputSize());
148*6777b538SAndroid Build Coastguard Worker 
149*6777b538SAndroid Build Coastguard Worker   // Reset the stream with a block [BFINAL = 1, BTYPE = 00, LEN = 0]
150*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.AddBytes("\x01", 1));
151*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.Finish());
152*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(0u, inflater.CurrentOutputSize());
153*6777b538SAndroid Build Coastguard Worker 
154*6777b538SAndroid Build Coastguard Worker   // The context is already reset.
155*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(inflater.AddBytes("\xf2\x00\x11\x00\x00", 5));
156*6777b538SAndroid Build Coastguard Worker }
157*6777b538SAndroid Build Coastguard Worker 
TEST(WebSocketInflaterTest,CallAddBytesAndFinishWithoutGetOutput)158*6777b538SAndroid Build Coastguard Worker TEST(WebSocketInflaterTest, CallAddBytesAndFinishWithoutGetOutput) {
159*6777b538SAndroid Build Coastguard Worker   WebSocketInflater inflater;
160*6777b538SAndroid Build Coastguard Worker   scoped_refptr<IOBufferWithSize> actual1, actual2;
161*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.Initialize(15));
162*6777b538SAndroid Build Coastguard Worker 
163*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.AddBytes("\xf2\x48\xcd\xc9\xc9\x07\x00", 7));
164*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.Finish());
165*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(5u, inflater.CurrentOutputSize());
166*6777b538SAndroid Build Coastguard Worker 
167*6777b538SAndroid Build Coastguard Worker   // This is a test for memory leak detectors.
168*6777b538SAndroid Build Coastguard Worker }
169*6777b538SAndroid Build Coastguard Worker 
TEST(WebSocketInflaterTest,CallAddBytesAndFinishWithoutGetOutputChoked)170*6777b538SAndroid Build Coastguard Worker TEST(WebSocketInflaterTest, CallAddBytesAndFinishWithoutGetOutputChoked) {
171*6777b538SAndroid Build Coastguard Worker   WebSocketInflater inflater(1, 1);
172*6777b538SAndroid Build Coastguard Worker   scoped_refptr<IOBufferWithSize> actual1, actual2;
173*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.Initialize(15));
174*6777b538SAndroid Build Coastguard Worker 
175*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.AddBytes("\xf2\x48\xcd\xc9\xc9\x07\x00", 7));
176*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.Finish());
177*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1u, inflater.CurrentOutputSize());
178*6777b538SAndroid Build Coastguard Worker 
179*6777b538SAndroid Build Coastguard Worker   // This is a test for memory leak detectors.
180*6777b538SAndroid Build Coastguard Worker }
181*6777b538SAndroid Build Coastguard Worker 
TEST(WebSocketInflaterTest,LargeRandomDeflateInflate)182*6777b538SAndroid Build Coastguard Worker TEST(WebSocketInflaterTest, LargeRandomDeflateInflate) {
183*6777b538SAndroid Build Coastguard Worker   const size_t size = 64 * 1024;
184*6777b538SAndroid Build Coastguard Worker   LinearCongruentialGenerator generator(133);
185*6777b538SAndroid Build Coastguard Worker   std::vector<char> input;
186*6777b538SAndroid Build Coastguard Worker   std::vector<char> output;
187*6777b538SAndroid Build Coastguard Worker   scoped_refptr<IOBufferWithSize> compressed;
188*6777b538SAndroid Build Coastguard Worker 
189*6777b538SAndroid Build Coastguard Worker   WebSocketDeflater deflater(WebSocketDeflater::TAKE_OVER_CONTEXT);
190*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(deflater.Initialize(8));
191*6777b538SAndroid Build Coastguard Worker   WebSocketInflater inflater(256, 256);
192*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.Initialize(8));
193*6777b538SAndroid Build Coastguard Worker 
194*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < size; ++i)
195*6777b538SAndroid Build Coastguard Worker     input.push_back(static_cast<char>(generator.Generate()));
196*6777b538SAndroid Build Coastguard Worker 
197*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(deflater.AddBytes(input.data(), input.size()));
198*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(deflater.Finish());
199*6777b538SAndroid Build Coastguard Worker 
200*6777b538SAndroid Build Coastguard Worker   compressed = deflater.GetOutput(deflater.CurrentOutputSize());
201*6777b538SAndroid Build Coastguard Worker 
202*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(compressed.get());
203*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(0u, deflater.CurrentOutputSize());
204*6777b538SAndroid Build Coastguard Worker 
205*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.AddBytes(compressed->data(), compressed->size()));
206*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(inflater.Finish());
207*6777b538SAndroid Build Coastguard Worker 
208*6777b538SAndroid Build Coastguard Worker   while (inflater.CurrentOutputSize() > 0) {
209*6777b538SAndroid Build Coastguard Worker     scoped_refptr<IOBufferWithSize> uncompressed =
210*6777b538SAndroid Build Coastguard Worker         inflater.GetOutput(inflater.CurrentOutputSize());
211*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(uncompressed.get());
212*6777b538SAndroid Build Coastguard Worker     output.insert(output.end(),
213*6777b538SAndroid Build Coastguard Worker                   uncompressed->data(),
214*6777b538SAndroid Build Coastguard Worker                   uncompressed->data() + uncompressed->size());
215*6777b538SAndroid Build Coastguard Worker   }
216*6777b538SAndroid Build Coastguard Worker 
217*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output, input);
218*6777b538SAndroid Build Coastguard Worker }
219*6777b538SAndroid Build Coastguard Worker 
220*6777b538SAndroid Build Coastguard Worker }  // unnamed namespace
221*6777b538SAndroid Build Coastguard Worker 
222*6777b538SAndroid Build Coastguard Worker }  // namespace net
223