| 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/core/spdy_framer.h" | 5 #include "net/spdy/core/spdy_framer.h" |
| 6 | 6 |
| 7 #include <stdlib.h> | 7 #include <stdlib.h> |
| 8 #include <string.h> | 8 #include <string.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 255 framer->SerializeHeaders(headers)); | 255 framer->SerializeHeaders(headers)); |
| 256 framer->hpack_encoder_.reset(nullptr); | 256 framer->hpack_encoder_.reset(nullptr); |
| 257 auto* saved_debug_visitor = framer->debug_visitor_; | 257 auto* saved_debug_visitor = framer->debug_visitor_; |
| 258 framer->debug_visitor_ = nullptr; | 258 framer->debug_visitor_ = nullptr; |
| 259 | 259 |
| 260 std::vector<SpdySerializedFrame> frame_list; | 260 std::vector<SpdySerializedFrame> frame_list; |
| 261 ArrayOutputBuffer frame_list_buffer(frame_list_char, buffer_size); | 261 ArrayOutputBuffer frame_list_buffer(frame_list_char, buffer_size); |
| 262 SpdyFramer::SpdyHeaderFrameIterator it(framer, CloneSpdyHeadersIR(headers)); | 262 SpdyFramer::SpdyHeaderFrameIterator it(framer, CloneSpdyHeadersIR(headers)); |
| 263 while (it.HasNextFrame()) { | 263 while (it.HasNextFrame()) { |
| 264 size_t size_before = frame_list_buffer.Size(); | 264 size_t size_before = frame_list_buffer.Size(); |
| 265 it.NextFrame(&frame_list_buffer); | 265 EXPECT_GT(it.NextFrame(&frame_list_buffer), 0u); |
| 266 frame_list.emplace_back( | 266 frame_list.emplace_back( |
| 267 SpdySerializedFrame(frame_list_buffer.Begin() + size_before, | 267 SpdySerializedFrame(frame_list_buffer.Begin() + size_before, |
| 268 frame_list_buffer.Size() - size_before, false)); | 268 frame_list_buffer.Size() - size_before, false)); |
| 269 } | 269 } |
| 270 framer->debug_visitor_ = saved_debug_visitor; | 270 framer->debug_visitor_ = saved_debug_visitor; |
| 271 | 271 |
| 272 EXPECT_THAT(serialized_headers_old_version, IsFrameUnionOf(&frame_list)); | 272 EXPECT_THAT(serialized_headers_old_version, IsFrameUnionOf(&frame_list)); |
| 273 return serialized_headers_old_version; | 273 return serialized_headers_old_version; |
| 274 } | 274 } |
| 275 | 275 |
| 276 static SpdySerializedFrame SerializeHeaders(SpdyFramer* framer, | 276 static SpdySerializedFrame SerializeHeaders(SpdyFramer* framer, |
| 277 const SpdyHeadersIR& headers, | 277 const SpdyHeadersIR& headers, |
| 278 ArrayOutputBuffer* output) { | 278 ArrayOutputBuffer* output) { |
| 279 if (output == nullptr) { | 279 if (output == nullptr) { |
| 280 return SerializeHeaders(framer, headers); | 280 return SerializeHeaders(framer, headers); |
| 281 } | 281 } |
| 282 output->Reset(); | 282 output->Reset(); |
| 283 EXPECT_TRUE(framer->SerializeHeaders(headers, output)); | 283 EXPECT_TRUE(framer->SerializeHeaders(headers, output)); |
| 284 SpdySerializedFrame serialized_headers_old_version(output->Begin(), | 284 SpdySerializedFrame serialized_headers_old_version(output->Begin(), |
| 285 output->Size(), false); | 285 output->Size(), false); |
| 286 framer->hpack_encoder_.reset(nullptr); | 286 framer->hpack_encoder_.reset(nullptr); |
| 287 auto* saved_debug_visitor = framer->debug_visitor_; | 287 auto* saved_debug_visitor = framer->debug_visitor_; |
| 288 framer->debug_visitor_ = nullptr; | 288 framer->debug_visitor_ = nullptr; |
| 289 | 289 |
| 290 std::vector<SpdySerializedFrame> frame_list; | 290 std::vector<SpdySerializedFrame> frame_list; |
| 291 ArrayOutputBuffer frame_list_buffer(frame_list_char, buffer_size); | 291 ArrayOutputBuffer frame_list_buffer(frame_list_char, buffer_size); |
| 292 SpdyFramer::SpdyHeaderFrameIterator it(framer, CloneSpdyHeadersIR(headers)); | 292 SpdyFramer::SpdyHeaderFrameIterator it(framer, CloneSpdyHeadersIR(headers)); |
| 293 while (it.HasNextFrame()) { | 293 while (it.HasNextFrame()) { |
| 294 size_t size_before = frame_list_buffer.Size(); | 294 size_t size_before = frame_list_buffer.Size(); |
| 295 it.NextFrame(&frame_list_buffer); | 295 EXPECT_GT(it.NextFrame(&frame_list_buffer), 0u); |
| 296 frame_list.emplace_back( | 296 frame_list.emplace_back( |
| 297 SpdySerializedFrame(frame_list_buffer.Begin() + size_before, | 297 SpdySerializedFrame(frame_list_buffer.Begin() + size_before, |
| 298 frame_list_buffer.Size() - size_before, false)); | 298 frame_list_buffer.Size() - size_before, false)); |
| 299 } | 299 } |
| 300 framer->debug_visitor_ = saved_debug_visitor; | 300 framer->debug_visitor_ = saved_debug_visitor; |
| 301 | 301 |
| 302 EXPECT_THAT(serialized_headers_old_version, IsFrameUnionOf(&frame_list)); | 302 EXPECT_THAT(serialized_headers_old_version, IsFrameUnionOf(&frame_list)); |
| 303 return serialized_headers_old_version; | 303 return serialized_headers_old_version; |
| 304 } | 304 } |
| 305 | 305 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 325 auto* saved_debug_visitor = framer->debug_visitor_; | 325 auto* saved_debug_visitor = framer->debug_visitor_; |
| 326 framer->debug_visitor_ = nullptr; | 326 framer->debug_visitor_ = nullptr; |
| 327 | 327 |
| 328 std::vector<SpdySerializedFrame> frame_list; | 328 std::vector<SpdySerializedFrame> frame_list; |
| 329 ArrayOutputBuffer frame_list_buffer(frame_list_char, buffer_size); | 329 ArrayOutputBuffer frame_list_buffer(frame_list_char, buffer_size); |
| 330 frame_list_buffer.Reset(); | 330 frame_list_buffer.Reset(); |
| 331 SpdyFramer::SpdyPushPromiseFrameIterator it( | 331 SpdyFramer::SpdyPushPromiseFrameIterator it( |
| 332 framer, CloneSpdyPushPromiseIR(push_promise)); | 332 framer, CloneSpdyPushPromiseIR(push_promise)); |
| 333 while (it.HasNextFrame()) { | 333 while (it.HasNextFrame()) { |
| 334 size_t size_before = frame_list_buffer.Size(); | 334 size_t size_before = frame_list_buffer.Size(); |
| 335 it.NextFrame(&frame_list_buffer); | 335 EXPECT_GT(it.NextFrame(&frame_list_buffer), 0u); |
| 336 frame_list.emplace_back( | 336 frame_list.emplace_back( |
| 337 SpdySerializedFrame(frame_list_buffer.Begin() + size_before, | 337 SpdySerializedFrame(frame_list_buffer.Begin() + size_before, |
| 338 frame_list_buffer.Size() - size_before, false)); | 338 frame_list_buffer.Size() - size_before, false)); |
| 339 } | 339 } |
| 340 framer->debug_visitor_ = saved_debug_visitor; | 340 framer->debug_visitor_ = saved_debug_visitor; |
| 341 | 341 |
| 342 EXPECT_THAT(serialized_headers_old_version, IsFrameUnionOf(&frame_list)); | 342 EXPECT_THAT(serialized_headers_old_version, IsFrameUnionOf(&frame_list)); |
| 343 return serialized_headers_old_version; | 343 return serialized_headers_old_version; |
| 344 } | 344 } |
| 345 | 345 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 358 auto* saved_debug_visitor = framer->debug_visitor_; | 358 auto* saved_debug_visitor = framer->debug_visitor_; |
| 359 framer->debug_visitor_ = nullptr; | 359 framer->debug_visitor_ = nullptr; |
| 360 | 360 |
| 361 std::vector<SpdySerializedFrame> frame_list; | 361 std::vector<SpdySerializedFrame> frame_list; |
| 362 ArrayOutputBuffer frame_list_buffer(frame_list_char, buffer_size); | 362 ArrayOutputBuffer frame_list_buffer(frame_list_char, buffer_size); |
| 363 frame_list_buffer.Reset(); | 363 frame_list_buffer.Reset(); |
| 364 SpdyFramer::SpdyPushPromiseFrameIterator it( | 364 SpdyFramer::SpdyPushPromiseFrameIterator it( |
| 365 framer, CloneSpdyPushPromiseIR(push_promise)); | 365 framer, CloneSpdyPushPromiseIR(push_promise)); |
| 366 while (it.HasNextFrame()) { | 366 while (it.HasNextFrame()) { |
| 367 size_t size_before = frame_list_buffer.Size(); | 367 size_t size_before = frame_list_buffer.Size(); |
| 368 it.NextFrame(&frame_list_buffer); | 368 EXPECT_GT(it.NextFrame(&frame_list_buffer), 0u); |
| 369 frame_list.emplace_back( | 369 frame_list.emplace_back( |
| 370 SpdySerializedFrame(frame_list_buffer.Begin() + size_before, | 370 SpdySerializedFrame(frame_list_buffer.Begin() + size_before, |
| 371 frame_list_buffer.Size() - size_before, false)); | 371 frame_list_buffer.Size() - size_before, false)); |
| 372 } | 372 } |
| 373 framer->debug_visitor_ = saved_debug_visitor; | 373 framer->debug_visitor_ = saved_debug_visitor; |
| 374 | 374 |
| 375 EXPECT_THAT(serialized_headers_old_version, IsFrameUnionOf(&frame_list)); | 375 EXPECT_THAT(serialized_headers_old_version, IsFrameUnionOf(&frame_list)); |
| 376 return serialized_headers_old_version; | 376 return serialized_headers_old_version; |
| 377 } | 377 } |
| 378 }; | 378 }; |
| (...skipping 769 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1148 // Test that if we receive a PRIORITY with stream ID zero, we signal an error | 1148 // Test that if we receive a PRIORITY with stream ID zero, we signal an error |
| 1149 // (but don't crash). | 1149 // (but don't crash). |
| 1150 TEST_P(SpdyFramerTest, PriorityWithStreamIdZero) { | 1150 TEST_P(SpdyFramerTest, PriorityWithStreamIdZero) { |
| 1151 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 1151 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 1152 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 1152 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 1153 framer.set_visitor(&visitor); | 1153 framer.set_visitor(&visitor); |
| 1154 | 1154 |
| 1155 SpdyPriorityIR priority_ir(0, 1, 16, true); | 1155 SpdyPriorityIR priority_ir(0, 1, 16, true); |
| 1156 SpdySerializedFrame frame(framer.SerializeFrame(priority_ir)); | 1156 SpdySerializedFrame frame(framer.SerializeFrame(priority_ir)); |
| 1157 if (use_output_) { | 1157 if (use_output_) { |
| 1158 ASSERT_TRUE(framer.SerializeFrame(priority_ir, &output_)); | 1158 EXPECT_EQ(framer.SerializeFrame(priority_ir, &output_), frame.size()); |
| 1159 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); | 1159 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 1160 } | 1160 } |
| 1161 | 1161 |
| 1162 // We shouldn't have to read the whole frame before we signal an error. | 1162 // We shouldn't have to read the whole frame before we signal an error. |
| 1163 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); | 1163 EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); |
| 1164 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size())); | 1164 EXPECT_GT(frame.size(), framer.ProcessInput(frame.data(), frame.size())); |
| 1165 EXPECT_TRUE(framer.HasError()); | 1165 EXPECT_TRUE(framer.HasError()); |
| 1166 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.spdy_framer_error()) | 1166 EXPECT_EQ(SpdyFramer::SPDY_INVALID_STREAM_ID, framer.spdy_framer_error()) |
| 1167 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 1167 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 1168 } | 1168 } |
| (...skipping 1528 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2697 '4', '2', ';', ' ', 'v', '=', '"', '2', '4', '"'}; | 2697 '4', '2', ';', ' ', 'v', '=', '"', '2', '4', '"'}; |
| 2698 SpdyAltSvcIR altsvc_ir(3); | 2698 SpdyAltSvcIR altsvc_ir(3); |
| 2699 altsvc_ir.set_origin("origin"); | 2699 altsvc_ir.set_origin("origin"); |
| 2700 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService( | 2700 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService( |
| 2701 "pid1", "host", 443, 5, SpdyAltSvcWireFormat::VersionVector())); | 2701 "pid1", "host", 443, 5, SpdyAltSvcWireFormat::VersionVector())); |
| 2702 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService( | 2702 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService( |
| 2703 "p\"=i:d", "h_\\o\"st", 123, 42, | 2703 "p\"=i:d", "h_\\o\"st", 123, 42, |
| 2704 SpdyAltSvcWireFormat::VersionVector{24})); | 2704 SpdyAltSvcWireFormat::VersionVector{24})); |
| 2705 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir)); | 2705 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir)); |
| 2706 if (use_output_) { | 2706 if (use_output_) { |
| 2707 ASSERT_TRUE(framer.SerializeFrame(altsvc_ir, &output_)); | 2707 EXPECT_EQ(framer.SerializeFrame(altsvc_ir, &output_), frame.size()); |
| 2708 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); | 2708 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 2709 } | 2709 } |
| 2710 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); | 2710 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); |
| 2711 } | 2711 } |
| 2712 | 2712 |
| 2713 TEST_P(SpdyFramerTest, CreatePriority) { | 2713 TEST_P(SpdyFramerTest, CreatePriority) { |
| 2714 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 2714 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 2715 | 2715 |
| 2716 const char kDescription[] = "PRIORITY frame"; | 2716 const char kDescription[] = "PRIORITY frame"; |
| 2717 const unsigned char kFrameData[] = { | 2717 const unsigned char kFrameData[] = { |
| 2718 0x00, 0x00, 0x05, // Length: 5 | 2718 0x00, 0x00, 0x05, // Length: 5 |
| 2719 0x02, // Type: PRIORITY | 2719 0x02, // Type: PRIORITY |
| 2720 0x00, // Flags: none | 2720 0x00, // Flags: none |
| 2721 0x00, 0x00, 0x00, 0x02, // Stream: 2 | 2721 0x00, 0x00, 0x00, 0x02, // Stream: 2 |
| 2722 0x80, 0x00, 0x00, 0x01, // Parent: 1 (Exclusive) | 2722 0x80, 0x00, 0x00, 0x01, // Parent: 1 (Exclusive) |
| 2723 0x10, // Weight: 17 | 2723 0x10, // Weight: 17 |
| 2724 }; | 2724 }; |
| 2725 SpdyPriorityIR priority_ir(2, 1, 17, true); | 2725 SpdyPriorityIR priority_ir(2, 1, 17, true); |
| 2726 SpdySerializedFrame frame(framer.SerializeFrame(priority_ir)); | 2726 SpdySerializedFrame frame(framer.SerializeFrame(priority_ir)); |
| 2727 if (use_output_) { | 2727 if (use_output_) { |
| 2728 ASSERT_TRUE(framer.SerializeFrame(priority_ir, &output_)); | 2728 EXPECT_EQ(framer.SerializeFrame(priority_ir, &output_), frame.size()); |
| 2729 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); | 2729 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 2730 } | 2730 } |
| 2731 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); | 2731 CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); |
| 2732 } | 2732 } |
| 2733 | 2733 |
| 2734 TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlock) { | 2734 TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlock) { |
| 2735 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 2735 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 2736 SpdyHeadersIR headers_ir(1); | 2736 SpdyHeadersIR headers_ir(1); |
| 2737 headers_ir.SetHeader("alpha", "beta"); | 2737 headers_ir.SetHeader("alpha", "beta"); |
| 2738 headers_ir.SetHeader("gamma", "delta"); | 2738 headers_ir.SetHeader("gamma", "delta"); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2803 // enough to cause an overflow. | 2803 // enough to cause an overflow. |
| 2804 const size_t kBigValueSize = TestSpdyVisitor::sent_control_frame_max_size(); | 2804 const size_t kBigValueSize = TestSpdyVisitor::sent_control_frame_max_size(); |
| 2805 SpdyString big_valuex(kBigValueSize, 'x'); | 2805 SpdyString big_valuex(kBigValueSize, 'x'); |
| 2806 headers->SetHeader("aa", big_valuex); | 2806 headers->SetHeader("aa", big_valuex); |
| 2807 SpdyString big_valuez(kBigValueSize, 'z'); | 2807 SpdyString big_valuez(kBigValueSize, 'z'); |
| 2808 headers->SetHeader("bb", big_valuez); | 2808 headers->SetHeader("bb", big_valuez); |
| 2809 | 2809 |
| 2810 SpdyFramer::SpdyHeaderFrameIterator frame_it(&framer, std::move(headers)); | 2810 SpdyFramer::SpdyHeaderFrameIterator frame_it(&framer, std::move(headers)); |
| 2811 | 2811 |
| 2812 EXPECT_TRUE(frame_it.HasNextFrame()); | 2812 EXPECT_TRUE(frame_it.HasNextFrame()); |
| 2813 EXPECT_TRUE(frame_it.NextFrame(&output_)); | 2813 EXPECT_GT(frame_it.NextFrame(&output_), 0u); |
| 2814 SpdySerializedFrame headers_frame(output_.Begin(), output_.Size(), false); | 2814 SpdySerializedFrame headers_frame(output_.Begin(), output_.Size(), false); |
| 2815 EXPECT_EQ(headers_frame.size(), | 2815 EXPECT_EQ(headers_frame.size(), |
| 2816 TestSpdyVisitor::sent_control_frame_max_size()); | 2816 TestSpdyVisitor::sent_control_frame_max_size()); |
| 2817 | 2817 |
| 2818 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); | 2818 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); |
| 2819 visitor.SimulateInFramer( | 2819 visitor.SimulateInFramer( |
| 2820 reinterpret_cast<unsigned char*>(headers_frame.data()), | 2820 reinterpret_cast<unsigned char*>(headers_frame.data()), |
| 2821 headers_frame.size()); | 2821 headers_frame.size()); |
| 2822 EXPECT_TRUE(visitor.header_buffer_valid_); | 2822 EXPECT_TRUE(visitor.header_buffer_valid_); |
| 2823 EXPECT_EQ(0, visitor.error_count_); | 2823 EXPECT_EQ(0, visitor.error_count_); |
| 2824 EXPECT_EQ(1, visitor.headers_frame_count_); | 2824 EXPECT_EQ(1, visitor.headers_frame_count_); |
| 2825 EXPECT_EQ(0, visitor.continuation_count_); | 2825 EXPECT_EQ(0, visitor.continuation_count_); |
| 2826 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); | 2826 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); |
| 2827 | 2827 |
| 2828 output_.Reset(); | 2828 output_.Reset(); |
| 2829 EXPECT_TRUE(frame_it.HasNextFrame()); | 2829 EXPECT_TRUE(frame_it.HasNextFrame()); |
| 2830 EXPECT_TRUE(frame_it.NextFrame(&output_)); | 2830 EXPECT_GT(frame_it.NextFrame(&output_), 0u); |
| 2831 SpdySerializedFrame first_cont_frame(output_.Begin(), output_.Size(), false); | 2831 SpdySerializedFrame first_cont_frame(output_.Begin(), output_.Size(), false); |
| 2832 EXPECT_EQ(first_cont_frame.size(), | 2832 EXPECT_EQ(first_cont_frame.size(), |
| 2833 TestSpdyVisitor::sent_control_frame_max_size()); | 2833 TestSpdyVisitor::sent_control_frame_max_size()); |
| 2834 | 2834 |
| 2835 visitor.SimulateInFramer( | 2835 visitor.SimulateInFramer( |
| 2836 reinterpret_cast<unsigned char*>(first_cont_frame.data()), | 2836 reinterpret_cast<unsigned char*>(first_cont_frame.data()), |
| 2837 first_cont_frame.size()); | 2837 first_cont_frame.size()); |
| 2838 EXPECT_TRUE(visitor.header_buffer_valid_); | 2838 EXPECT_TRUE(visitor.header_buffer_valid_); |
| 2839 EXPECT_EQ(0, visitor.error_count_); | 2839 EXPECT_EQ(0, visitor.error_count_); |
| 2840 EXPECT_EQ(1, visitor.headers_frame_count_); | 2840 EXPECT_EQ(1, visitor.headers_frame_count_); |
| 2841 EXPECT_EQ(1, visitor.continuation_count_); | 2841 EXPECT_EQ(1, visitor.continuation_count_); |
| 2842 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); | 2842 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); |
| 2843 | 2843 |
| 2844 output_.Reset(); | 2844 output_.Reset(); |
| 2845 EXPECT_TRUE(frame_it.HasNextFrame()); | 2845 EXPECT_TRUE(frame_it.HasNextFrame()); |
| 2846 EXPECT_TRUE(frame_it.NextFrame(&output_)); | 2846 EXPECT_GT(frame_it.NextFrame(&output_), 0u); |
| 2847 SpdySerializedFrame second_cont_frame(output_.Begin(), output_.Size(), false); | 2847 SpdySerializedFrame second_cont_frame(output_.Begin(), output_.Size(), false); |
| 2848 EXPECT_LT(second_cont_frame.size(), | 2848 EXPECT_LT(second_cont_frame.size(), |
| 2849 TestSpdyVisitor::sent_control_frame_max_size()); | 2849 TestSpdyVisitor::sent_control_frame_max_size()); |
| 2850 | 2850 |
| 2851 visitor.SimulateInFramer( | 2851 visitor.SimulateInFramer( |
| 2852 reinterpret_cast<unsigned char*>(second_cont_frame.data()), | 2852 reinterpret_cast<unsigned char*>(second_cont_frame.data()), |
| 2853 second_cont_frame.size()); | 2853 second_cont_frame.size()); |
| 2854 EXPECT_TRUE(visitor.header_buffer_valid_); | 2854 EXPECT_TRUE(visitor.header_buffer_valid_); |
| 2855 EXPECT_EQ(0, visitor.error_count_); | 2855 EXPECT_EQ(0, visitor.error_count_); |
| 2856 EXPECT_EQ(1, visitor.headers_frame_count_); | 2856 EXPECT_EQ(1, visitor.headers_frame_count_); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 2872 const size_t kBigValueSize = TestSpdyVisitor::sent_control_frame_max_size(); | 2872 const size_t kBigValueSize = TestSpdyVisitor::sent_control_frame_max_size(); |
| 2873 SpdyString big_valuex(kBigValueSize, 'x'); | 2873 SpdyString big_valuex(kBigValueSize, 'x'); |
| 2874 push_promise->SetHeader("aa", big_valuex); | 2874 push_promise->SetHeader("aa", big_valuex); |
| 2875 SpdyString big_valuez(kBigValueSize, 'z'); | 2875 SpdyString big_valuez(kBigValueSize, 'z'); |
| 2876 push_promise->SetHeader("bb", big_valuez); | 2876 push_promise->SetHeader("bb", big_valuez); |
| 2877 | 2877 |
| 2878 SpdyFramer::SpdyPushPromiseFrameIterator frame_it(&framer, | 2878 SpdyFramer::SpdyPushPromiseFrameIterator frame_it(&framer, |
| 2879 std::move(push_promise)); | 2879 std::move(push_promise)); |
| 2880 | 2880 |
| 2881 EXPECT_TRUE(frame_it.HasNextFrame()); | 2881 EXPECT_TRUE(frame_it.HasNextFrame()); |
| 2882 EXPECT_TRUE(frame_it.NextFrame(&output_)); | 2882 EXPECT_GT(frame_it.NextFrame(&output_), 0u); |
| 2883 SpdySerializedFrame push_promise_frame(output_.Begin(), output_.Size(), | 2883 SpdySerializedFrame push_promise_frame(output_.Begin(), output_.Size(), |
| 2884 false); | 2884 false); |
| 2885 EXPECT_EQ(push_promise_frame.size(), | 2885 EXPECT_EQ(push_promise_frame.size(), |
| 2886 TestSpdyVisitor::sent_control_frame_max_size()); | 2886 TestSpdyVisitor::sent_control_frame_max_size()); |
| 2887 | 2887 |
| 2888 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); | 2888 TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); |
| 2889 visitor.SimulateInFramer( | 2889 visitor.SimulateInFramer( |
| 2890 reinterpret_cast<unsigned char*>(push_promise_frame.data()), | 2890 reinterpret_cast<unsigned char*>(push_promise_frame.data()), |
| 2891 push_promise_frame.size()); | 2891 push_promise_frame.size()); |
| 2892 EXPECT_TRUE(visitor.header_buffer_valid_); | 2892 EXPECT_TRUE(visitor.header_buffer_valid_); |
| 2893 EXPECT_EQ(0, visitor.error_count_); | 2893 EXPECT_EQ(0, visitor.error_count_); |
| 2894 EXPECT_EQ(1, visitor.push_promise_frame_count_); | 2894 EXPECT_EQ(1, visitor.push_promise_frame_count_); |
| 2895 EXPECT_EQ(0, visitor.continuation_count_); | 2895 EXPECT_EQ(0, visitor.continuation_count_); |
| 2896 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); | 2896 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); |
| 2897 | 2897 |
| 2898 EXPECT_TRUE(frame_it.HasNextFrame()); | 2898 EXPECT_TRUE(frame_it.HasNextFrame()); |
| 2899 output_.Reset(); | 2899 output_.Reset(); |
| 2900 EXPECT_TRUE(frame_it.NextFrame(&output_)); | 2900 EXPECT_GT(frame_it.NextFrame(&output_), 0u); |
| 2901 SpdySerializedFrame first_cont_frame(output_.Begin(), output_.Size(), false); | 2901 SpdySerializedFrame first_cont_frame(output_.Begin(), output_.Size(), false); |
| 2902 | 2902 |
| 2903 EXPECT_EQ(first_cont_frame.size(), | 2903 EXPECT_EQ(first_cont_frame.size(), |
| 2904 TestSpdyVisitor::sent_control_frame_max_size()); | 2904 TestSpdyVisitor::sent_control_frame_max_size()); |
| 2905 visitor.SimulateInFramer( | 2905 visitor.SimulateInFramer( |
| 2906 reinterpret_cast<unsigned char*>(first_cont_frame.data()), | 2906 reinterpret_cast<unsigned char*>(first_cont_frame.data()), |
| 2907 first_cont_frame.size()); | 2907 first_cont_frame.size()); |
| 2908 EXPECT_TRUE(visitor.header_buffer_valid_); | 2908 EXPECT_TRUE(visitor.header_buffer_valid_); |
| 2909 EXPECT_EQ(0, visitor.error_count_); | 2909 EXPECT_EQ(0, visitor.error_count_); |
| 2910 EXPECT_EQ(1, visitor.push_promise_frame_count_); | 2910 EXPECT_EQ(1, visitor.push_promise_frame_count_); |
| 2911 EXPECT_EQ(1, visitor.continuation_count_); | 2911 EXPECT_EQ(1, visitor.continuation_count_); |
| 2912 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); | 2912 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); |
| 2913 | 2913 |
| 2914 EXPECT_TRUE(frame_it.HasNextFrame()); | 2914 EXPECT_TRUE(frame_it.HasNextFrame()); |
| 2915 output_.Reset(); | 2915 output_.Reset(); |
| 2916 EXPECT_TRUE(frame_it.NextFrame(&output_)); | 2916 EXPECT_GT(frame_it.NextFrame(&output_), 0u); |
| 2917 SpdySerializedFrame second_cont_frame(output_.Begin(), output_.Size(), false); | 2917 SpdySerializedFrame second_cont_frame(output_.Begin(), output_.Size(), false); |
| 2918 EXPECT_LT(second_cont_frame.size(), | 2918 EXPECT_LT(second_cont_frame.size(), |
| 2919 TestSpdyVisitor::sent_control_frame_max_size()); | 2919 TestSpdyVisitor::sent_control_frame_max_size()); |
| 2920 | 2920 |
| 2921 visitor.SimulateInFramer( | 2921 visitor.SimulateInFramer( |
| 2922 reinterpret_cast<unsigned char*>(second_cont_frame.data()), | 2922 reinterpret_cast<unsigned char*>(second_cont_frame.data()), |
| 2923 second_cont_frame.size()); | 2923 second_cont_frame.size()); |
| 2924 EXPECT_TRUE(visitor.header_buffer_valid_); | 2924 EXPECT_TRUE(visitor.header_buffer_valid_); |
| 2925 EXPECT_EQ(0, visitor.error_count_); | 2925 EXPECT_EQ(0, visitor.error_count_); |
| 2926 EXPECT_EQ(1, visitor.push_promise_frame_count_); | 2926 EXPECT_EQ(1, visitor.push_promise_frame_count_); |
| 2927 EXPECT_EQ(2, visitor.continuation_count_); | 2927 EXPECT_EQ(2, visitor.continuation_count_); |
| 2928 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); | 2928 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); |
| 2929 | 2929 |
| 2930 EXPECT_FALSE(frame_it.HasNextFrame()); | 2930 EXPECT_FALSE(frame_it.HasNextFrame()); |
| 2931 } | 2931 } |
| 2932 | 2932 |
| 2933 class SpdyControlFrameIteratorTest : public ::testing::Test { |
| 2934 public: |
| 2935 SpdyControlFrameIteratorTest() : output_(output_buffer, kSize) {} |
| 2936 |
| 2937 void RunTest(std::unique_ptr<SpdyFrameIR> ir) { |
| 2938 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); |
| 2939 SpdySerializedFrame frame(framer.SerializeFrame(*ir)); |
| 2940 std::unique_ptr<SpdyFrameSequence> it = |
| 2941 SpdyFramer::CreateIterator(&framer, std::move(ir)); |
| 2942 EXPECT_TRUE(it->HasNextFrame()); |
| 2943 EXPECT_EQ(it->NextFrame(&output_), frame.size()); |
| 2944 EXPECT_FALSE(it->HasNextFrame()); |
| 2945 } |
| 2946 |
| 2947 private: |
| 2948 ArrayOutputBuffer output_; |
| 2949 }; |
| 2950 |
| 2951 TEST_F(SpdyControlFrameIteratorTest, RstStreamFrameWithIterator) { |
| 2952 auto ir = base::MakeUnique<SpdyRstStreamIR>(0, ERROR_CODE_PROTOCOL_ERROR); |
| 2953 RunTest(std::move(ir)); |
| 2954 } |
| 2955 |
| 2956 TEST_F(SpdyControlFrameIteratorTest, SettingsFrameWithIterator) { |
| 2957 auto ir = base::MakeUnique<SpdySettingsIR>(); |
| 2958 uint32_t kValue = 0x0a0b0c0d; |
| 2959 SpdySettingsIds kId = SETTINGS_INITIAL_WINDOW_SIZE; |
| 2960 ir->AddSetting(kId, kValue); |
| 2961 RunTest(std::move(ir)); |
| 2962 } |
| 2963 |
| 2964 TEST_F(SpdyControlFrameIteratorTest, PingFrameWithIterator) { |
| 2965 const SpdyPingId kPingId = 0x123456789abcdeffULL; |
| 2966 auto ir = base::MakeUnique<SpdyPingIR>(kPingId); |
| 2967 RunTest(std::move(ir)); |
| 2968 } |
| 2969 |
| 2970 TEST_F(SpdyControlFrameIteratorTest, GoAwayFrameWithIterator) { |
| 2971 auto ir = base::MakeUnique<SpdyGoAwayIR>(0, ERROR_CODE_NO_ERROR, "GA"); |
| 2972 RunTest(std::move(ir)); |
| 2973 } |
| 2974 |
| 2975 TEST_F(SpdyControlFrameIteratorTest, WindowUpdateFrameWithIterator) { |
| 2976 auto ir = base::MakeUnique<SpdyWindowUpdateIR>(1, 1); |
| 2977 RunTest(std::move(ir)); |
| 2978 } |
| 2979 |
| 2980 TEST_F(SpdyControlFrameIteratorTest, AtlSvcFrameWithIterator) { |
| 2981 auto ir = base::MakeUnique<SpdyAltSvcIR>(3); |
| 2982 ir->set_origin("origin"); |
| 2983 ir->add_altsvc(SpdyAltSvcWireFormat::AlternativeService( |
| 2984 "pid1", "host", 443, 5, SpdyAltSvcWireFormat::VersionVector())); |
| 2985 ir->add_altsvc(SpdyAltSvcWireFormat::AlternativeService( |
| 2986 "p\"=i:d", "h_\\o\"st", 123, 42, |
| 2987 SpdyAltSvcWireFormat::VersionVector{24})); |
| 2988 RunTest(std::move(ir)); |
| 2989 } |
| 2990 |
| 2991 TEST_F(SpdyControlFrameIteratorTest, PriorityFrameWithIterator) { |
| 2992 auto ir = base::MakeUnique<SpdyPriorityIR>(2, 1, 17, true); |
| 2993 RunTest(std::move(ir)); |
| 2994 } |
| 2995 |
| 2933 TEST_P(SpdyFramerTest, TooLargePushPromiseFrameUsesContinuation) { | 2996 TEST_P(SpdyFramerTest, TooLargePushPromiseFrameUsesContinuation) { |
| 2934 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); | 2997 SpdyFramer framer(SpdyFramer::DISABLE_COMPRESSION); |
| 2935 SpdyPushPromiseIR push_promise(1, 2); | 2998 SpdyPushPromiseIR push_promise(1, 2); |
| 2936 push_promise.set_padding_len(256); | 2999 push_promise.set_padding_len(256); |
| 2937 | 3000 |
| 2938 // Exact payload length will change with HPACK, but this should be long | 3001 // Exact payload length will change with HPACK, but this should be long |
| 2939 // enough to cause an overflow. | 3002 // enough to cause an overflow. |
| 2940 const size_t kBigValueSize = TestSpdyVisitor::sent_control_frame_max_size(); | 3003 const size_t kBigValueSize = TestSpdyVisitor::sent_control_frame_max_size(); |
| 2941 SpdyString big_value(kBigValueSize, 'x'); | 3004 SpdyString big_value(kBigValueSize, 'x'); |
| 2942 push_promise.SetHeader("aa", big_value); | 3005 push_promise.SetHeader("aa", big_value); |
| (...skipping 1432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4375 EXPECT_CALL(visitor, | 4438 EXPECT_CALL(visitor, |
| 4376 OnAltSvc(kStreamId, SpdyStringPiece("o_r|g!n"), altsvc_vector)); | 4439 OnAltSvc(kStreamId, SpdyStringPiece("o_r|g!n"), altsvc_vector)); |
| 4377 | 4440 |
| 4378 SpdyAltSvcIR altsvc_ir(kStreamId); | 4441 SpdyAltSvcIR altsvc_ir(kStreamId); |
| 4379 altsvc_ir.set_origin("o_r|g!n"); | 4442 altsvc_ir.set_origin("o_r|g!n"); |
| 4380 altsvc_ir.add_altsvc(altsvc1); | 4443 altsvc_ir.add_altsvc(altsvc1); |
| 4381 altsvc_ir.add_altsvc(altsvc2); | 4444 altsvc_ir.add_altsvc(altsvc2); |
| 4382 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir)); | 4445 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir)); |
| 4383 if (use_output_) { | 4446 if (use_output_) { |
| 4384 output_.Reset(); | 4447 output_.Reset(); |
| 4385 ASSERT_TRUE(framer.SerializeFrame(altsvc_ir, &output_)); | 4448 EXPECT_GT(framer.SerializeFrame(altsvc_ir, &output_), 0u); |
| 4386 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); | 4449 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 4387 } | 4450 } |
| 4388 framer.ProcessInput(frame.data(), frame.size()); | 4451 framer.ProcessInput(frame.data(), frame.size()); |
| 4389 | 4452 |
| 4390 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 4453 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
| 4391 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) | 4454 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.spdy_framer_error()) |
| 4392 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 4455 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 4393 } | 4456 } |
| 4394 | 4457 |
| 4395 TEST_P(SpdyFramerTest, OnAltSvcNoOrigin) { | 4458 TEST_P(SpdyFramerTest, OnAltSvcNoOrigin) { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4430 | 4493 |
| 4431 SpdyAltSvcIR altsvc_ir(kStreamId); | 4494 SpdyAltSvcIR altsvc_ir(kStreamId); |
| 4432 altsvc_ir.set_origin("o1"); | 4495 altsvc_ir.set_origin("o1"); |
| 4433 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService( | 4496 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService( |
| 4434 "pid1", "host", 443, 5, SpdyAltSvcWireFormat::VersionVector())); | 4497 "pid1", "host", 443, 5, SpdyAltSvcWireFormat::VersionVector())); |
| 4435 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService( | 4498 altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService( |
| 4436 "", "h1", 443, 10, SpdyAltSvcWireFormat::VersionVector())); | 4499 "", "h1", 443, 10, SpdyAltSvcWireFormat::VersionVector())); |
| 4437 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir)); | 4500 SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir)); |
| 4438 if (use_output_) { | 4501 if (use_output_) { |
| 4439 output_.Reset(); | 4502 output_.Reset(); |
| 4440 ASSERT_TRUE(framer.SerializeFrame(altsvc_ir, &output_)); | 4503 EXPECT_GT(framer.SerializeFrame(altsvc_ir, &output_), 0u); |
| 4441 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); | 4504 frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
| 4442 } | 4505 } |
| 4443 framer.ProcessInput(frame.data(), frame.size()); | 4506 framer.ProcessInput(frame.data(), frame.size()); |
| 4444 | 4507 |
| 4445 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); | 4508 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
| 4446 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, framer.spdy_framer_error()) | 4509 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, framer.spdy_framer_error()) |
| 4447 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); | 4510 << SpdyFramer::SpdyFramerErrorToString(framer.spdy_framer_error()); |
| 4448 } | 4511 } |
| 4449 | 4512 |
| 4450 TEST_P(SpdyFramerTest, OnAltSvcBadLengths) { | 4513 TEST_P(SpdyFramerTest, OnAltSvcBadLengths) { |
| (...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4812 | 4875 |
| 4813 EXPECT_EQ(1, visitor->data_frame_count_); | 4876 EXPECT_EQ(1, visitor->data_frame_count_); |
| 4814 EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_)); | 4877 EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_)); |
| 4815 EXPECT_EQ(0, visitor->headers_frame_count_); | 4878 EXPECT_EQ(0, visitor->headers_frame_count_); |
| 4816 } | 4879 } |
| 4817 } | 4880 } |
| 4818 | 4881 |
| 4819 } // namespace test | 4882 } // namespace test |
| 4820 | 4883 |
| 4821 } // namespace net | 4884 } // namespace net |
| OLD | NEW |