| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/spdy/buffered_spdy_framer.h" | 5 #include "net/spdy/buffered_spdy_framer.h" |
| 6 | 6 |
| 7 #include "net/spdy/spdy_test_util_spdy3.h" | 7 #include "net/spdy/spdy_test_util_spdy3.h" |
| 8 #include "testing/platform_test.h" | 8 #include "testing/platform_test.h" |
| 9 | 9 |
| 10 using namespace net::test_spdy3; | 10 using namespace net::test_spdy3; |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 SpdyStreamId header_stream_id_; | 136 SpdyStreamId header_stream_id_; |
| 137 | 137 |
| 138 // Headers from OnSyn, OnSynReply and OnHeaders for verification. | 138 // Headers from OnSyn, OnSynReply and OnHeaders for verification. |
| 139 SpdyHeaderBlock headers_; | 139 SpdyHeaderBlock headers_; |
| 140 }; | 140 }; |
| 141 | 141 |
| 142 } // namespace | 142 } // namespace |
| 143 | 143 |
| 144 class BufferedSpdyFramerSpdy3Test : public PlatformTest { | 144 class BufferedSpdyFramerSpdy3Test : public PlatformTest { |
| 145 protected: | 145 protected: |
| 146 void EnableCompression(bool enabled) { | |
| 147 SpdyFramer::set_enable_compression_default(enabled); | |
| 148 } | |
| 149 | |
| 150 // Returns true if the two header blocks have equivalent content. | 146 // Returns true if the two header blocks have equivalent content. |
| 151 bool CompareHeaderBlocks(const SpdyHeaderBlock* expected, | 147 bool CompareHeaderBlocks(const SpdyHeaderBlock* expected, |
| 152 const SpdyHeaderBlock* actual) { | 148 const SpdyHeaderBlock* actual) { |
| 153 if (expected->size() != actual->size()) { | 149 if (expected->size() != actual->size()) { |
| 154 LOG(ERROR) << "Expected " << expected->size() << " headers; actually got " | 150 LOG(ERROR) << "Expected " << expected->size() << " headers; actually got " |
| 155 << actual->size() << "."; | 151 << actual->size() << "."; |
| 156 return false; | 152 return false; |
| 157 } | 153 } |
| 158 for (SpdyHeaderBlock::const_iterator it = expected->begin(); | 154 for (SpdyHeaderBlock::const_iterator it = expected->begin(); |
| 159 it != expected->end(); | 155 it != expected->end(); |
| 160 ++it) { | 156 ++it) { |
| 161 SpdyHeaderBlock::const_iterator it2 = actual->find(it->first); | 157 SpdyHeaderBlock::const_iterator it2 = actual->find(it->first); |
| 162 if (it2 == actual->end()) { | 158 if (it2 == actual->end()) { |
| 163 LOG(ERROR) << "Expected header name '" << it->first << "'."; | 159 LOG(ERROR) << "Expected header name '" << it->first << "'."; |
| 164 return false; | 160 return false; |
| 165 } | 161 } |
| 166 if (it->second.compare(it2->second) != 0) { | 162 if (it->second.compare(it2->second) != 0) { |
| 167 LOG(ERROR) << "Expected header named '" << it->first | 163 LOG(ERROR) << "Expected header named '" << it->first |
| 168 << "' to have a value of '" << it->second | 164 << "' to have a value of '" << it->second |
| 169 << "'. The actual value received was '" << it2->second | 165 << "'. The actual value received was '" << it2->second |
| 170 << "'."; | 166 << "'."; |
| 171 return false; | 167 return false; |
| 172 } | 168 } |
| 173 } | 169 } |
| 174 return true; | 170 return true; |
| 175 } | 171 } |
| 172 |
| 173 private: |
| 174 SpdyTestStateHelper spdy_state_; |
| 176 }; | 175 }; |
| 177 | 176 |
| 178 TEST_F(BufferedSpdyFramerSpdy3Test, OnSetting) { | 177 TEST_F(BufferedSpdyFramerSpdy3Test, OnSetting) { |
| 179 EnableCompression(false); | |
| 180 | |
| 181 SpdyFramer framer(3); | 178 SpdyFramer framer(3); |
| 182 SpdySettings settings; | 179 SpdySettings settings; |
| 183 settings.push_back(SpdySetting(SettingsFlagsAndId(0, 1), 0x00000002)); | 180 settings.push_back(SpdySetting(SettingsFlagsAndId(0, 1), 0x00000002)); |
| 184 settings.push_back(SpdySetting(SettingsFlagsAndId(0, 1), 0x00000003)); | 181 settings.push_back(SpdySetting(SettingsFlagsAndId(0, 1), 0x00000003)); |
| 185 | 182 |
| 186 scoped_ptr<SpdyFrame> control_frame(framer.CreateSettings(settings)); | 183 scoped_ptr<SpdyFrame> control_frame(framer.CreateSettings(settings)); |
| 187 TestBufferedSpdyVisitor visitor; | 184 TestBufferedSpdyVisitor visitor; |
| 188 | 185 |
| 189 visitor.SimulateInFramer( | 186 visitor.SimulateInFramer( |
| 190 reinterpret_cast<unsigned char*>(control_frame->data()), | 187 reinterpret_cast<unsigned char*>(control_frame->data()), |
| 191 control_frame->length() + SpdyControlFrame::kHeaderSize); | 188 control_frame->length() + SpdyControlFrame::kHeaderSize); |
| 192 EXPECT_EQ(1, visitor.error_count_); | 189 EXPECT_EQ(1, visitor.error_count_); |
| 193 EXPECT_EQ(1, visitor.setting_count_); | 190 EXPECT_EQ(1, visitor.setting_count_); |
| 194 } | 191 } |
| 195 | 192 |
| 196 TEST_F(BufferedSpdyFramerSpdy3Test, ReadSynStreamHeaderBlock) { | 193 TEST_F(BufferedSpdyFramerSpdy3Test, ReadSynStreamHeaderBlock) { |
| 197 EnableCompression(false); | |
| 198 | |
| 199 SpdyHeaderBlock headers; | 194 SpdyHeaderBlock headers; |
| 200 headers["aa"] = "vv"; | 195 headers["aa"] = "vv"; |
| 201 headers["bb"] = "ww"; | 196 headers["bb"] = "ww"; |
| 202 BufferedSpdyFramer framer(3); | 197 BufferedSpdyFramer framer(3); |
| 203 scoped_ptr<SpdySynStreamControlFrame> control_frame( | 198 scoped_ptr<SpdySynStreamControlFrame> control_frame( |
| 204 framer.CreateSynStream(1, // stream_id | 199 framer.CreateSynStream(1, // stream_id |
| 205 0, // associated_stream_id | 200 0, // associated_stream_id |
| 206 1, // priority | 201 1, // priority |
| 207 CONTROL_FLAG_NONE, | 202 CONTROL_FLAG_NONE, |
| 208 true, // compress | 203 true, // compress |
| 209 &headers)); | 204 &headers)); |
| 210 EXPECT_TRUE(control_frame.get() != NULL); | 205 EXPECT_TRUE(control_frame.get() != NULL); |
| 211 | 206 |
| 212 TestBufferedSpdyVisitor visitor; | 207 TestBufferedSpdyVisitor visitor; |
| 213 visitor.SimulateInFramer( | 208 visitor.SimulateInFramer( |
| 214 reinterpret_cast<unsigned char*>(control_frame.get()->data()), | 209 reinterpret_cast<unsigned char*>(control_frame.get()->data()), |
| 215 control_frame.get()->length() + SpdyControlFrame::kHeaderSize); | 210 control_frame.get()->length() + SpdyControlFrame::kHeaderSize); |
| 216 EXPECT_EQ(0, visitor.error_count_); | 211 EXPECT_EQ(0, visitor.error_count_); |
| 217 EXPECT_EQ(1, visitor.syn_frame_count_); | 212 EXPECT_EQ(1, visitor.syn_frame_count_); |
| 218 EXPECT_EQ(0, visitor.syn_reply_frame_count_); | 213 EXPECT_EQ(0, visitor.syn_reply_frame_count_); |
| 219 EXPECT_EQ(0, visitor.headers_frame_count_); | 214 EXPECT_EQ(0, visitor.headers_frame_count_); |
| 220 EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); | 215 EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); |
| 221 } | 216 } |
| 222 | 217 |
| 223 TEST_F(BufferedSpdyFramerSpdy3Test, ReadSynReplyHeaderBlock) { | 218 TEST_F(BufferedSpdyFramerSpdy3Test, ReadSynReplyHeaderBlock) { |
| 224 EnableCompression(false); | |
| 225 | |
| 226 SpdyHeaderBlock headers; | 219 SpdyHeaderBlock headers; |
| 227 headers["alpha"] = "beta"; | 220 headers["alpha"] = "beta"; |
| 228 headers["gamma"] = "delta"; | 221 headers["gamma"] = "delta"; |
| 229 BufferedSpdyFramer framer(3); | 222 BufferedSpdyFramer framer(3); |
| 230 scoped_ptr<SpdySynReplyControlFrame> control_frame( | 223 scoped_ptr<SpdySynReplyControlFrame> control_frame( |
| 231 framer.CreateSynReply(1, // stream_id | 224 framer.CreateSynReply(1, // stream_id |
| 232 CONTROL_FLAG_NONE, | 225 CONTROL_FLAG_NONE, |
| 233 true, // compress | 226 true, // compress |
| 234 &headers)); | 227 &headers)); |
| 235 EXPECT_TRUE(control_frame.get() != NULL); | 228 EXPECT_TRUE(control_frame.get() != NULL); |
| 236 | 229 |
| 237 TestBufferedSpdyVisitor visitor; | 230 TestBufferedSpdyVisitor visitor; |
| 238 visitor.SimulateInFramer( | 231 visitor.SimulateInFramer( |
| 239 reinterpret_cast<unsigned char*>(control_frame.get()->data()), | 232 reinterpret_cast<unsigned char*>(control_frame.get()->data()), |
| 240 control_frame.get()->length() + SpdyControlFrame::kHeaderSize); | 233 control_frame.get()->length() + SpdyControlFrame::kHeaderSize); |
| 241 EXPECT_EQ(0, visitor.error_count_); | 234 EXPECT_EQ(0, visitor.error_count_); |
| 242 EXPECT_EQ(0, visitor.syn_frame_count_); | 235 EXPECT_EQ(0, visitor.syn_frame_count_); |
| 243 EXPECT_EQ(1, visitor.syn_reply_frame_count_); | 236 EXPECT_EQ(1, visitor.syn_reply_frame_count_); |
| 244 EXPECT_EQ(0, visitor.headers_frame_count_); | 237 EXPECT_EQ(0, visitor.headers_frame_count_); |
| 245 EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); | 238 EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); |
| 246 } | 239 } |
| 247 | 240 |
| 248 TEST_F(BufferedSpdyFramerSpdy3Test, ReadHeadersHeaderBlock) { | 241 TEST_F(BufferedSpdyFramerSpdy3Test, ReadHeadersHeaderBlock) { |
| 249 EnableCompression(false); | |
| 250 | |
| 251 SpdyHeaderBlock headers; | 242 SpdyHeaderBlock headers; |
| 252 headers["alpha"] = "beta"; | 243 headers["alpha"] = "beta"; |
| 253 headers["gamma"] = "delta"; | 244 headers["gamma"] = "delta"; |
| 254 BufferedSpdyFramer framer(3); | 245 BufferedSpdyFramer framer(3); |
| 255 scoped_ptr<SpdyHeadersControlFrame> control_frame( | 246 scoped_ptr<SpdyHeadersControlFrame> control_frame( |
| 256 framer.CreateHeaders(1, // stream_id | 247 framer.CreateHeaders(1, // stream_id |
| 257 CONTROL_FLAG_NONE, | 248 CONTROL_FLAG_NONE, |
| 258 true, // compress | 249 true, // compress |
| 259 &headers)); | 250 &headers)); |
| 260 EXPECT_TRUE(control_frame.get() != NULL); | 251 EXPECT_TRUE(control_frame.get() != NULL); |
| 261 | 252 |
| 262 TestBufferedSpdyVisitor visitor; | 253 TestBufferedSpdyVisitor visitor; |
| 263 visitor.SimulateInFramer( | 254 visitor.SimulateInFramer( |
| 264 reinterpret_cast<unsigned char*>(control_frame.get()->data()), | 255 reinterpret_cast<unsigned char*>(control_frame.get()->data()), |
| 265 control_frame.get()->length() + SpdyControlFrame::kHeaderSize); | 256 control_frame.get()->length() + SpdyControlFrame::kHeaderSize); |
| 266 EXPECT_EQ(0, visitor.error_count_); | 257 EXPECT_EQ(0, visitor.error_count_); |
| 267 EXPECT_EQ(0, visitor.syn_frame_count_); | 258 EXPECT_EQ(0, visitor.syn_frame_count_); |
| 268 EXPECT_EQ(0, visitor.syn_reply_frame_count_); | 259 EXPECT_EQ(0, visitor.syn_reply_frame_count_); |
| 269 EXPECT_EQ(1, visitor.headers_frame_count_); | 260 EXPECT_EQ(1, visitor.headers_frame_count_); |
| 270 EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); | 261 EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); |
| 271 } | 262 } |
| 272 } // namespace spdy | 263 } // namespace spdy |
| OLD | NEW |