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_deflater.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <string>
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker #include "net/base/io_buffer.h"
10*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
11*6777b538SAndroid Build Coastguard Worker
12*6777b538SAndroid Build Coastguard Worker namespace net {
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard Worker namespace {
15*6777b538SAndroid Build Coastguard Worker
ToString(IOBufferWithSize * buffer)16*6777b538SAndroid Build Coastguard Worker std::string ToString(IOBufferWithSize* buffer) {
17*6777b538SAndroid Build Coastguard Worker return std::string(buffer->data(), buffer->size());
18*6777b538SAndroid Build Coastguard Worker }
19*6777b538SAndroid Build Coastguard Worker
TEST(WebSocketDeflaterTest,Construct)20*6777b538SAndroid Build Coastguard Worker TEST(WebSocketDeflaterTest, Construct) {
21*6777b538SAndroid Build Coastguard Worker WebSocketDeflater deflater(WebSocketDeflater::TAKE_OVER_CONTEXT);
22*6777b538SAndroid Build Coastguard Worker deflater.Initialize(8);
23*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0u, deflater.CurrentOutputSize());
24*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(deflater.Finish());
25*6777b538SAndroid Build Coastguard Worker scoped_refptr<IOBufferWithSize> actual =
26*6777b538SAndroid Build Coastguard Worker deflater.GetOutput(deflater.CurrentOutputSize());
27*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::string("\00", 1), ToString(actual.get()));
28*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0u, deflater.CurrentOutputSize());
29*6777b538SAndroid Build Coastguard Worker }
30*6777b538SAndroid Build Coastguard Worker
TEST(WebSocketDeflaterTest,DeflateHelloTakeOverContext)31*6777b538SAndroid Build Coastguard Worker TEST(WebSocketDeflaterTest, DeflateHelloTakeOverContext) {
32*6777b538SAndroid Build Coastguard Worker WebSocketDeflater deflater(WebSocketDeflater::TAKE_OVER_CONTEXT);
33*6777b538SAndroid Build Coastguard Worker deflater.Initialize(15);
34*6777b538SAndroid Build Coastguard Worker scoped_refptr<IOBufferWithSize> actual1, actual2;
35*6777b538SAndroid Build Coastguard Worker
36*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(deflater.AddBytes("Hello", 5));
37*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(deflater.Finish());
38*6777b538SAndroid Build Coastguard Worker actual1 = deflater.GetOutput(deflater.CurrentOutputSize());
39*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::string("\xf2\x48\xcd\xc9\xc9\x07\x00", 7),
40*6777b538SAndroid Build Coastguard Worker ToString(actual1.get()));
41*6777b538SAndroid Build Coastguard Worker
42*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(deflater.AddBytes("Hello", 5));
43*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(deflater.Finish());
44*6777b538SAndroid Build Coastguard Worker actual2 = deflater.GetOutput(deflater.CurrentOutputSize());
45*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::string("\xf2\x00\x11\x00\x00", 5), ToString(actual2.get()));
46*6777b538SAndroid Build Coastguard Worker }
47*6777b538SAndroid Build Coastguard Worker
TEST(WebSocketDeflaterTest,DeflateHelloDoNotTakeOverContext)48*6777b538SAndroid Build Coastguard Worker TEST(WebSocketDeflaterTest, DeflateHelloDoNotTakeOverContext) {
49*6777b538SAndroid Build Coastguard Worker WebSocketDeflater deflater(WebSocketDeflater::DO_NOT_TAKE_OVER_CONTEXT);
50*6777b538SAndroid Build Coastguard Worker deflater.Initialize(15);
51*6777b538SAndroid Build Coastguard Worker scoped_refptr<IOBufferWithSize> actual1, actual2;
52*6777b538SAndroid Build Coastguard Worker
53*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(deflater.AddBytes("Hello", 5));
54*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(deflater.Finish());
55*6777b538SAndroid Build Coastguard Worker actual1 = deflater.GetOutput(deflater.CurrentOutputSize());
56*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::string("\xf2\x48\xcd\xc9\xc9\x07\x00", 7),
57*6777b538SAndroid Build Coastguard Worker ToString(actual1.get()));
58*6777b538SAndroid Build Coastguard Worker
59*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(deflater.AddBytes("Hello", 5));
60*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(deflater.Finish());
61*6777b538SAndroid Build Coastguard Worker actual2 = deflater.GetOutput(deflater.CurrentOutputSize());
62*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::string("\xf2\x48\xcd\xc9\xc9\x07\x00", 7),
63*6777b538SAndroid Build Coastguard Worker ToString(actual2.get()));
64*6777b538SAndroid Build Coastguard Worker }
65*6777b538SAndroid Build Coastguard Worker
TEST(WebSocketDeflaterTest,MultipleAddBytesCalls)66*6777b538SAndroid Build Coastguard Worker TEST(WebSocketDeflaterTest, MultipleAddBytesCalls) {
67*6777b538SAndroid Build Coastguard Worker WebSocketDeflater deflater(WebSocketDeflater::DO_NOT_TAKE_OVER_CONTEXT);
68*6777b538SAndroid Build Coastguard Worker deflater.Initialize(15);
69*6777b538SAndroid Build Coastguard Worker std::string input(32, 'a');
70*6777b538SAndroid Build Coastguard Worker scoped_refptr<IOBufferWithSize> actual;
71*6777b538SAndroid Build Coastguard Worker
72*6777b538SAndroid Build Coastguard Worker for (char& c : input) {
73*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(deflater.AddBytes(&c, 1));
74*6777b538SAndroid Build Coastguard Worker }
75*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(deflater.Finish());
76*6777b538SAndroid Build Coastguard Worker actual = deflater.GetOutput(deflater.CurrentOutputSize());
77*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::string("\x4a\x4c\xc4\x0f\x00\x00", 6), ToString(actual.get()));
78*6777b538SAndroid Build Coastguard Worker }
79*6777b538SAndroid Build Coastguard Worker
TEST(WebSocketDeflaterTest,GetMultipleDeflatedOutput)80*6777b538SAndroid Build Coastguard Worker TEST(WebSocketDeflaterTest, GetMultipleDeflatedOutput) {
81*6777b538SAndroid Build Coastguard Worker WebSocketDeflater deflater(WebSocketDeflater::TAKE_OVER_CONTEXT);
82*6777b538SAndroid Build Coastguard Worker deflater.Initialize(15);
83*6777b538SAndroid Build Coastguard Worker scoped_refptr<IOBufferWithSize> actual;
84*6777b538SAndroid Build Coastguard Worker
85*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(deflater.AddBytes("Hello", 5));
86*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(deflater.Finish());
87*6777b538SAndroid Build Coastguard Worker deflater.PushSyncMark();
88*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(deflater.Finish());
89*6777b538SAndroid Build Coastguard Worker deflater.PushSyncMark();
90*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(deflater.AddBytes("Hello", 5));
91*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(deflater.Finish());
92*6777b538SAndroid Build Coastguard Worker
93*6777b538SAndroid Build Coastguard Worker actual = deflater.GetOutput(deflater.CurrentOutputSize());
94*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::string("\xf2\x48\xcd\xc9\xc9\x07\x00\x00\x00\xff\xff"
95*6777b538SAndroid Build Coastguard Worker "\x00\x00\x00\xff\xff"
96*6777b538SAndroid Build Coastguard Worker "\xf2\x00\x11\x00\x00", 21),
97*6777b538SAndroid Build Coastguard Worker ToString(actual.get()));
98*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0u, deflater.CurrentOutputSize());
99*6777b538SAndroid Build Coastguard Worker }
100*6777b538SAndroid Build Coastguard Worker
TEST(WebSocketDeflaterTest,WindowBits8)101*6777b538SAndroid Build Coastguard Worker TEST(WebSocketDeflaterTest, WindowBits8) {
102*6777b538SAndroid Build Coastguard Worker WebSocketDeflater deflater(WebSocketDeflater::DO_NOT_TAKE_OVER_CONTEXT);
103*6777b538SAndroid Build Coastguard Worker deflater.Initialize(8);
104*6777b538SAndroid Build Coastguard Worker // Set the head and tail of |input| so that back-reference
105*6777b538SAndroid Build Coastguard Worker // can be used if the window size is sufficiently-large.
106*6777b538SAndroid Build Coastguard Worker const std::string word = "Chromium";
107*6777b538SAndroid Build Coastguard Worker std::string input = word + std::string(256, 'a') + word;
108*6777b538SAndroid Build Coastguard Worker scoped_refptr<IOBufferWithSize> actual;
109*6777b538SAndroid Build Coastguard Worker
110*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(deflater.AddBytes(input.data(), input.size()));
111*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(deflater.Finish());
112*6777b538SAndroid Build Coastguard Worker actual = deflater.GetOutput(deflater.CurrentOutputSize());
113*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::string("r\xce(\xca\xcf\xcd,\xcdM\x1c\xe1\xc0\x39\xa3"
114*6777b538SAndroid Build Coastguard Worker "(?7\xb3\x34\x17\x00", 21),
115*6777b538SAndroid Build Coastguard Worker ToString(actual.get()));
116*6777b538SAndroid Build Coastguard Worker }
117*6777b538SAndroid Build Coastguard Worker
TEST(WebSocketDeflaterTest,WindowBits10)118*6777b538SAndroid Build Coastguard Worker TEST(WebSocketDeflaterTest, WindowBits10) {
119*6777b538SAndroid Build Coastguard Worker WebSocketDeflater deflater(WebSocketDeflater::DO_NOT_TAKE_OVER_CONTEXT);
120*6777b538SAndroid Build Coastguard Worker deflater.Initialize(10);
121*6777b538SAndroid Build Coastguard Worker // Set the head and tail of |input| so that back-reference
122*6777b538SAndroid Build Coastguard Worker // can be used if the window size is sufficiently-large.
123*6777b538SAndroid Build Coastguard Worker const std::string word = "Chromium";
124*6777b538SAndroid Build Coastguard Worker std::string input = word + std::string(256, 'a') + word;
125*6777b538SAndroid Build Coastguard Worker scoped_refptr<IOBufferWithSize> actual;
126*6777b538SAndroid Build Coastguard Worker
127*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(deflater.AddBytes(input.data(), input.size()));
128*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(deflater.Finish());
129*6777b538SAndroid Build Coastguard Worker actual = deflater.GetOutput(deflater.CurrentOutputSize());
130*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(
131*6777b538SAndroid Build Coastguard Worker std::string("r\xce(\xca\xcf\xcd,\xcdM\x1c\xe1\xc0\x19\x1a\x0e\0\0", 17),
132*6777b538SAndroid Build Coastguard Worker ToString(actual.get()));
133*6777b538SAndroid Build Coastguard Worker }
134*6777b538SAndroid Build Coastguard Worker
135*6777b538SAndroid Build Coastguard Worker } // namespace
136*6777b538SAndroid Build Coastguard Worker
137*6777b538SAndroid Build Coastguard Worker } // namespace net
138