OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/websockets/websocket_inflater.h" | 5 #include "net/websockets/websocket_inflater.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 19 matching lines...) Expand all Loading... |
30 } | 30 } |
31 | 31 |
32 TEST(WebSocketInflaterTest, InflateHelloTakeOverContext) { | 32 TEST(WebSocketInflaterTest, InflateHelloTakeOverContext) { |
33 WebSocketInflater inflater; | 33 WebSocketInflater inflater; |
34 ASSERT_TRUE(inflater.Initialize(15)); | 34 ASSERT_TRUE(inflater.Initialize(15)); |
35 scoped_refptr<IOBufferWithSize> actual1, actual2; | 35 scoped_refptr<IOBufferWithSize> actual1, actual2; |
36 | 36 |
37 ASSERT_TRUE(inflater.AddBytes("\xf2\x48\xcd\xc9\xc9\x07\x00", 7)); | 37 ASSERT_TRUE(inflater.AddBytes("\xf2\x48\xcd\xc9\xc9\x07\x00", 7)); |
38 ASSERT_TRUE(inflater.Finish()); | 38 ASSERT_TRUE(inflater.Finish()); |
39 actual1 = inflater.GetOutput(inflater.CurrentOutputSize()); | 39 actual1 = inflater.GetOutput(inflater.CurrentOutputSize()); |
40 ASSERT_TRUE(actual1); | 40 ASSERT_TRUE(actual1.get()); |
41 EXPECT_EQ("Hello", ToString(actual1.get())); | 41 EXPECT_EQ("Hello", ToString(actual1.get())); |
42 EXPECT_EQ(0u, inflater.CurrentOutputSize()); | 42 EXPECT_EQ(0u, inflater.CurrentOutputSize()); |
43 | 43 |
44 ASSERT_TRUE(inflater.AddBytes("\xf2\x00\x11\x00\x00", 5)); | 44 ASSERT_TRUE(inflater.AddBytes("\xf2\x00\x11\x00\x00", 5)); |
45 ASSERT_TRUE(inflater.Finish()); | 45 ASSERT_TRUE(inflater.Finish()); |
46 actual2 = inflater.GetOutput(inflater.CurrentOutputSize()); | 46 actual2 = inflater.GetOutput(inflater.CurrentOutputSize()); |
47 ASSERT_TRUE(actual2); | 47 ASSERT_TRUE(actual2.get()); |
48 EXPECT_EQ("Hello", ToString(actual2.get())); | 48 EXPECT_EQ("Hello", ToString(actual2.get())); |
49 EXPECT_EQ(0u, inflater.CurrentOutputSize()); | 49 EXPECT_EQ(0u, inflater.CurrentOutputSize()); |
50 } | 50 } |
51 | 51 |
52 TEST(WebSocketInflaterTest, InflateHelloSmallCapacity) { | 52 TEST(WebSocketInflaterTest, InflateHelloSmallCapacity) { |
53 WebSocketInflater inflater(1, 1); | 53 WebSocketInflater inflater(1, 1); |
54 ASSERT_TRUE(inflater.Initialize(15)); | 54 ASSERT_TRUE(inflater.Initialize(15)); |
55 std::string actual; | 55 std::string actual; |
56 | 56 |
57 ASSERT_TRUE(inflater.AddBytes("\xf2\x48\xcd\xc9\xc9\x07\x00", 7)); | 57 ASSERT_TRUE(inflater.AddBytes("\xf2\x48\xcd\xc9\xc9\x07\x00", 7)); |
58 ASSERT_TRUE(inflater.Finish()); | 58 ASSERT_TRUE(inflater.Finish()); |
59 for (size_t i = 0; i < 5; ++i) { | 59 for (size_t i = 0; i < 5; ++i) { |
60 ASSERT_EQ(1u, inflater.CurrentOutputSize()); | 60 ASSERT_EQ(1u, inflater.CurrentOutputSize()); |
61 scoped_refptr<IOBufferWithSize> buffer = inflater.GetOutput(1); | 61 scoped_refptr<IOBufferWithSize> buffer = inflater.GetOutput(1); |
62 ASSERT_TRUE(buffer); | 62 ASSERT_TRUE(buffer.get()); |
63 ASSERT_EQ(1, buffer->size()); | 63 ASSERT_EQ(1, buffer->size()); |
64 actual += ToString(buffer.get()); | 64 actual += ToString(buffer.get()); |
65 } | 65 } |
66 EXPECT_EQ("Hello", actual); | 66 EXPECT_EQ("Hello", actual); |
67 EXPECT_EQ(0u, inflater.CurrentOutputSize()); | 67 EXPECT_EQ(0u, inflater.CurrentOutputSize()); |
68 } | 68 } |
69 | 69 |
70 TEST(WebSocketInflaterTest, InflateHelloSmallCapacityGetTotalOutput) { | 70 TEST(WebSocketInflaterTest, InflateHelloSmallCapacityGetTotalOutput) { |
71 WebSocketInflater inflater(1, 1); | 71 WebSocketInflater inflater(1, 1); |
72 ASSERT_TRUE(inflater.Initialize(15)); | 72 ASSERT_TRUE(inflater.Initialize(15)); |
73 scoped_refptr<IOBufferWithSize> actual; | 73 scoped_refptr<IOBufferWithSize> actual; |
74 | 74 |
75 ASSERT_TRUE(inflater.AddBytes("\xf2\x48\xcd\xc9\xc9\x07\x00", 7)); | 75 ASSERT_TRUE(inflater.AddBytes("\xf2\x48\xcd\xc9\xc9\x07\x00", 7)); |
76 ASSERT_TRUE(inflater.Finish()); | 76 ASSERT_TRUE(inflater.Finish()); |
77 ASSERT_EQ(1u, inflater.CurrentOutputSize()); | 77 ASSERT_EQ(1u, inflater.CurrentOutputSize()); |
78 actual = inflater.GetOutput(1024); | 78 actual = inflater.GetOutput(1024); |
79 EXPECT_EQ("Hello", ToString(actual)); | 79 EXPECT_EQ("Hello", ToString(actual.get())); |
80 EXPECT_EQ(0u, inflater.CurrentOutputSize()); | 80 EXPECT_EQ(0u, inflater.CurrentOutputSize()); |
81 } | 81 } |
82 | 82 |
83 TEST(WebSocketInflaterTest, InflateInvalidData) { | 83 TEST(WebSocketInflaterTest, InflateInvalidData) { |
84 WebSocketInflater inflater; | 84 WebSocketInflater inflater; |
85 ASSERT_TRUE(inflater.Initialize(15)); | 85 ASSERT_TRUE(inflater.Initialize(15)); |
86 EXPECT_FALSE(inflater.AddBytes("\xf2\x48\xcd\xc9INVALID DATA", 16)); | 86 EXPECT_FALSE(inflater.AddBytes("\xf2\x48\xcd\xc9INVALID DATA", 16)); |
87 } | 87 } |
88 | 88 |
89 TEST(WebSocketInflaterTest, ChokedInvalidData) { | 89 TEST(WebSocketInflaterTest, ChokedInvalidData) { |
(...skipping 10 matching lines...) Expand all Loading... |
100 WebSocketInflater inflater; | 100 WebSocketInflater inflater; |
101 ASSERT_TRUE(inflater.Initialize(15)); | 101 ASSERT_TRUE(inflater.Initialize(15)); |
102 std::string input("\xf2\x48\xcd\xc9\xc9\x07\x00", 7); | 102 std::string input("\xf2\x48\xcd\xc9\xc9\x07\x00", 7); |
103 scoped_refptr<IOBufferWithSize> actual; | 103 scoped_refptr<IOBufferWithSize> actual; |
104 | 104 |
105 for (size_t i = 0; i < input.size(); ++i) { | 105 for (size_t i = 0; i < input.size(); ++i) { |
106 ASSERT_TRUE(inflater.AddBytes(&input[i], 1)); | 106 ASSERT_TRUE(inflater.AddBytes(&input[i], 1)); |
107 } | 107 } |
108 ASSERT_TRUE(inflater.Finish()); | 108 ASSERT_TRUE(inflater.Finish()); |
109 actual = inflater.GetOutput(5); | 109 actual = inflater.GetOutput(5); |
110 ASSERT_TRUE(actual); | 110 ASSERT_TRUE(actual.get()); |
111 EXPECT_EQ("Hello", ToString(actual.get())); | 111 EXPECT_EQ("Hello", ToString(actual.get())); |
112 } | 112 } |
113 | 113 |
114 TEST(WebSocketInflaterTest, Reset) { | 114 TEST(WebSocketInflaterTest, Reset) { |
115 WebSocketInflater inflater; | 115 WebSocketInflater inflater; |
116 ASSERT_TRUE(inflater.Initialize(15)); | 116 ASSERT_TRUE(inflater.Initialize(15)); |
117 scoped_refptr<IOBufferWithSize> actual1, actual2; | 117 scoped_refptr<IOBufferWithSize> actual1, actual2; |
118 | 118 |
119 ASSERT_TRUE(inflater.AddBytes("\xf2\x48\xcd\xc9\xc9\x07\x00", 7)); | 119 ASSERT_TRUE(inflater.AddBytes("\xf2\x48\xcd\xc9\xc9\x07\x00", 7)); |
120 ASSERT_TRUE(inflater.Finish()); | 120 ASSERT_TRUE(inflater.Finish()); |
121 actual1 = inflater.GetOutput(inflater.CurrentOutputSize()); | 121 actual1 = inflater.GetOutput(inflater.CurrentOutputSize()); |
122 ASSERT_TRUE(actual1); | 122 ASSERT_TRUE(actual1.get()); |
123 EXPECT_EQ("Hello", ToString(actual1.get())); | 123 EXPECT_EQ("Hello", ToString(actual1.get())); |
124 EXPECT_EQ(0u, inflater.CurrentOutputSize()); | 124 EXPECT_EQ(0u, inflater.CurrentOutputSize()); |
125 | 125 |
126 // Reset the stream with a block [BFINAL = 1, BTYPE = 00, LEN = 0] | 126 // Reset the stream with a block [BFINAL = 1, BTYPE = 00, LEN = 0] |
127 ASSERT_TRUE(inflater.AddBytes("\x01", 1)); | 127 ASSERT_TRUE(inflater.AddBytes("\x01", 1)); |
128 ASSERT_TRUE(inflater.Finish()); | 128 ASSERT_TRUE(inflater.Finish()); |
129 ASSERT_EQ(0u, inflater.CurrentOutputSize()); | 129 ASSERT_EQ(0u, inflater.CurrentOutputSize()); |
130 | 130 |
131 ASSERT_TRUE(inflater.AddBytes("\xf2\x48\xcd\xc9\xc9\x07\x00", 7)); | 131 ASSERT_TRUE(inflater.AddBytes("\xf2\x48\xcd\xc9\xc9\x07\x00", 7)); |
132 ASSERT_TRUE(inflater.Finish()); | 132 ASSERT_TRUE(inflater.Finish()); |
133 actual2 = inflater.GetOutput(inflater.CurrentOutputSize()); | 133 actual2 = inflater.GetOutput(inflater.CurrentOutputSize()); |
134 ASSERT_TRUE(actual2); | 134 ASSERT_TRUE(actual2.get()); |
135 EXPECT_EQ("Hello", ToString(actual2.get())); | 135 EXPECT_EQ("Hello", ToString(actual2.get())); |
136 EXPECT_EQ(0u, inflater.CurrentOutputSize()); | 136 EXPECT_EQ(0u, inflater.CurrentOutputSize()); |
137 } | 137 } |
138 | 138 |
139 TEST(WebSocketInflaterTest, ResetAndLostContext) { | 139 TEST(WebSocketInflaterTest, ResetAndLostContext) { |
140 WebSocketInflater inflater; | 140 WebSocketInflater inflater; |
141 scoped_refptr<IOBufferWithSize> actual1, actual2; | 141 scoped_refptr<IOBufferWithSize> actual1, actual2; |
142 ASSERT_TRUE(inflater.Initialize(15)); | 142 ASSERT_TRUE(inflater.Initialize(15)); |
143 | 143 |
144 ASSERT_TRUE(inflater.AddBytes("\xf2\x48\xcd\xc9\xc9\x07\x00", 7)); | 144 ASSERT_TRUE(inflater.AddBytes("\xf2\x48\xcd\xc9\xc9\x07\x00", 7)); |
145 ASSERT_TRUE(inflater.Finish()); | 145 ASSERT_TRUE(inflater.Finish()); |
146 actual1 = inflater.GetOutput(inflater.CurrentOutputSize()); | 146 actual1 = inflater.GetOutput(inflater.CurrentOutputSize()); |
147 ASSERT_TRUE(actual1); | 147 ASSERT_TRUE(actual1.get()); |
148 EXPECT_EQ("Hello", ToString(actual1.get())); | 148 EXPECT_EQ("Hello", ToString(actual1.get())); |
149 EXPECT_EQ(0u, inflater.CurrentOutputSize()); | 149 EXPECT_EQ(0u, inflater.CurrentOutputSize()); |
150 | 150 |
151 // Reset the stream with a block [BFINAL = 1, BTYPE = 00, LEN = 0] | 151 // Reset the stream with a block [BFINAL = 1, BTYPE = 00, LEN = 0] |
152 ASSERT_TRUE(inflater.AddBytes("\x01", 1)); | 152 ASSERT_TRUE(inflater.AddBytes("\x01", 1)); |
153 ASSERT_TRUE(inflater.Finish()); | 153 ASSERT_TRUE(inflater.Finish()); |
154 ASSERT_EQ(0u, inflater.CurrentOutputSize()); | 154 ASSERT_EQ(0u, inflater.CurrentOutputSize()); |
155 | 155 |
156 // The context is already reset. | 156 // The context is already reset. |
157 ASSERT_FALSE(inflater.AddBytes("\xf2\x00\x11\x00\x00", 5)); | 157 ASSERT_FALSE(inflater.AddBytes("\xf2\x00\x11\x00\x00", 5)); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 ASSERT_TRUE(inflater.Initialize(8)); | 194 ASSERT_TRUE(inflater.Initialize(8)); |
195 | 195 |
196 for (size_t i = 0; i < size; ++i) | 196 for (size_t i = 0; i < size; ++i) |
197 input.push_back(static_cast<char>(generator.Generate())); | 197 input.push_back(static_cast<char>(generator.Generate())); |
198 | 198 |
199 ASSERT_TRUE(deflater.AddBytes(&input[0], input.size())); | 199 ASSERT_TRUE(deflater.AddBytes(&input[0], input.size())); |
200 ASSERT_TRUE(deflater.Finish()); | 200 ASSERT_TRUE(deflater.Finish()); |
201 | 201 |
202 compressed = deflater.GetOutput(deflater.CurrentOutputSize()); | 202 compressed = deflater.GetOutput(deflater.CurrentOutputSize()); |
203 | 203 |
204 ASSERT_TRUE(compressed); | 204 ASSERT_TRUE(compressed.get()); |
205 ASSERT_EQ(0u, deflater.CurrentOutputSize()); | 205 ASSERT_EQ(0u, deflater.CurrentOutputSize()); |
206 | 206 |
207 ASSERT_TRUE(inflater.AddBytes(compressed->data(), compressed->size())); | 207 ASSERT_TRUE(inflater.AddBytes(compressed->data(), compressed->size())); |
208 ASSERT_TRUE(inflater.Finish()); | 208 ASSERT_TRUE(inflater.Finish()); |
209 | 209 |
210 while (inflater.CurrentOutputSize() > 0) { | 210 while (inflater.CurrentOutputSize() > 0) { |
211 scoped_refptr<IOBufferWithSize> uncompressed = | 211 scoped_refptr<IOBufferWithSize> uncompressed = |
212 inflater.GetOutput(inflater.CurrentOutputSize()); | 212 inflater.GetOutput(inflater.CurrentOutputSize()); |
213 ASSERT_TRUE(uncompressed); | 213 ASSERT_TRUE(uncompressed.get()); |
214 output.insert(output.end(), | 214 output.insert(output.end(), |
215 uncompressed->data(), | 215 uncompressed->data(), |
216 uncompressed->data() + uncompressed->size()); | 216 uncompressed->data() + uncompressed->size()); |
217 } | 217 } |
218 | 218 |
219 EXPECT_EQ(output, input); | 219 EXPECT_EQ(output, input); |
220 } | 220 } |
221 | 221 |
222 } // unnamed namespace | 222 } // unnamed namespace |
223 | 223 |
224 } // namespace net | 224 } // namespace net |
OLD | NEW |