OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/quic/bidirectional_stream_quic_impl.h" | 5 #include "net/quic/bidirectional_stream_quic_impl.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/callback_helpers.h" | 9 #include "base/callback_helpers.h" |
10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 EXPECT_EQ(send_request_headers_automatically_, request_headers_sent); | 83 EXPECT_EQ(send_request_headers_automatically_, request_headers_sent); |
84 CHECK(!not_expect_callback_); | 84 CHECK(!not_expect_callback_); |
85 is_ready_ = true; | 85 is_ready_ = true; |
86 loop_->Quit(); | 86 loop_->Quit(); |
87 } | 87 } |
88 | 88 |
89 void OnHeadersReceived(const SpdyHeaderBlock& response_headers) override { | 89 void OnHeadersReceived(const SpdyHeaderBlock& response_headers) override { |
90 CHECK(!on_failed_called_); | 90 CHECK(!on_failed_called_); |
91 CHECK(!not_expect_callback_); | 91 CHECK(!not_expect_callback_); |
92 | 92 |
93 response_headers_ = response_headers; | 93 response_headers_ = response_headers.Clone(); |
94 loop_->Quit(); | 94 loop_->Quit(); |
95 } | 95 } |
96 | 96 |
97 void OnDataRead(int bytes_read) override { | 97 void OnDataRead(int bytes_read) override { |
98 CHECK(!on_failed_called_); | 98 CHECK(!on_failed_called_); |
99 CHECK(!not_expect_callback_); | 99 CHECK(!not_expect_callback_); |
100 CHECK(!callback_.is_null()); | 100 CHECK(!callback_.is_null()); |
101 | 101 |
102 ++on_data_read_count_; | 102 ++on_data_read_count_; |
103 CHECK_GE(bytes_read, OK); | 103 CHECK_GE(bytes_read, OK); |
104 data_received_.append(read_buf_->data(), bytes_read); | 104 data_received_.append(read_buf_->data(), bytes_read); |
105 base::ResetAndReturn(&callback_).Run(bytes_read); | 105 base::ResetAndReturn(&callback_).Run(bytes_read); |
106 } | 106 } |
107 | 107 |
108 void OnDataSent() override { | 108 void OnDataSent() override { |
109 CHECK(!on_failed_called_); | 109 CHECK(!on_failed_called_); |
110 CHECK(!not_expect_callback_); | 110 CHECK(!not_expect_callback_); |
111 | 111 |
112 ++on_data_sent_count_; | 112 ++on_data_sent_count_; |
113 loop_->Quit(); | 113 loop_->Quit(); |
114 } | 114 } |
115 | 115 |
116 void OnTrailersReceived(const SpdyHeaderBlock& trailers) override { | 116 void OnTrailersReceived(const SpdyHeaderBlock& trailers) override { |
117 CHECK(!on_failed_called_); | 117 CHECK(!on_failed_called_); |
118 CHECK(!not_expect_callback_); | 118 CHECK(!not_expect_callback_); |
119 | 119 |
120 trailers_ = trailers; | 120 trailers_ = trailers.Clone(); |
121 loop_->Quit(); | 121 loop_->Quit(); |
122 } | 122 } |
123 | 123 |
124 void OnFailed(int error) override { | 124 void OnFailed(int error) override { |
125 CHECK(!on_failed_called_); | 125 CHECK(!on_failed_called_); |
126 CHECK(!not_expect_callback_); | 126 CHECK(!not_expect_callback_); |
127 CHECK_EQ(OK, error_); | 127 CHECK_EQ(OK, error_); |
128 CHECK_NE(OK, error); | 128 CHECK_NE(OK, error); |
129 | 129 |
130 on_failed_called_ = true; | 130 on_failed_called_ = true; |
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
486 size_t* spdy_headers_frame_length, | 486 size_t* spdy_headers_frame_length, |
487 QuicStreamOffset* offset) { | 487 QuicStreamOffset* offset) { |
488 return server_maker_.MakeResponseHeadersPacket( | 488 return server_maker_.MakeResponseHeadersPacket( |
489 packet_number, stream_id_, !kIncludeVersion, fin, | 489 packet_number, stream_id_, !kIncludeVersion, fin, |
490 std::move(response_headers), spdy_headers_frame_length, offset); | 490 std::move(response_headers), spdy_headers_frame_length, offset); |
491 } | 491 } |
492 | 492 |
493 std::unique_ptr<QuicReceivedPacket> ConstructResponseTrailersPacket( | 493 std::unique_ptr<QuicReceivedPacket> ConstructResponseTrailersPacket( |
494 QuicPacketNumber packet_number, | 494 QuicPacketNumber packet_number, |
495 bool fin, | 495 bool fin, |
496 const SpdyHeaderBlock& trailers, | 496 SpdyHeaderBlock trailers, |
497 size_t* spdy_headers_frame_length, | 497 size_t* spdy_headers_frame_length, |
498 QuicStreamOffset* offset) { | 498 QuicStreamOffset* offset) { |
499 return server_maker_.MakeResponseHeadersPacket( | 499 return server_maker_.MakeResponseHeadersPacket( |
500 packet_number, stream_id_, !kIncludeVersion, fin, trailers, | 500 packet_number, stream_id_, !kIncludeVersion, fin, std::move(trailers), |
501 spdy_headers_frame_length, offset); | 501 spdy_headers_frame_length, offset); |
502 } | 502 } |
503 | 503 |
504 std::unique_ptr<QuicReceivedPacket> ConstructClientRstStreamPacket( | 504 std::unique_ptr<QuicReceivedPacket> ConstructClientRstStreamPacket( |
505 QuicPacketNumber packet_number) { | 505 QuicPacketNumber packet_number) { |
506 return ConstructRstStreamCancelledPacket(packet_number, 0, &client_maker_); | 506 return ConstructRstStreamCancelledPacket(packet_number, 0, &client_maker_); |
507 } | 507 } |
508 | 508 |
509 std::unique_ptr<QuicReceivedPacket> ConstructServerRstStreamPacket( | 509 std::unique_ptr<QuicReceivedPacket> ConstructServerRstStreamPacket( |
510 QuicPacketNumber packet_number) { | 510 QuicPacketNumber packet_number) { |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
652 EXPECT_EQ(std::string(kResponseBody), delegate->data_received()); | 652 EXPECT_EQ(std::string(kResponseBody), delegate->data_received()); |
653 TestCompletionCallback cb2; | 653 TestCompletionCallback cb2; |
654 EXPECT_EQ(ERR_IO_PENDING, delegate->ReadData(cb2.callback())); | 654 EXPECT_EQ(ERR_IO_PENDING, delegate->ReadData(cb2.callback())); |
655 | 655 |
656 SpdyHeaderBlock trailers; | 656 SpdyHeaderBlock trailers; |
657 size_t spdy_trailers_frame_length; | 657 size_t spdy_trailers_frame_length; |
658 trailers["foo"] = "bar"; | 658 trailers["foo"] = "bar"; |
659 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(kResponseBody)); | 659 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(kResponseBody)); |
660 // Server sends trailers. | 660 // Server sends trailers. |
661 ProcessPacket(ConstructResponseTrailersPacket( | 661 ProcessPacket(ConstructResponseTrailersPacket( |
662 4, kFin, trailers, &spdy_trailers_frame_length, &offset)); | 662 4, kFin, trailers.Clone(), &spdy_trailers_frame_length, &offset)); |
663 | 663 |
664 delegate->WaitUntilNextCallback(); // OnTrailersReceived | 664 delegate->WaitUntilNextCallback(); // OnTrailersReceived |
665 EXPECT_EQ(OK, cb2.WaitForResult()); | 665 EXPECT_EQ(OK, cb2.WaitForResult()); |
666 trailers.erase(kFinalOffsetHeaderKey); | 666 trailers.erase(kFinalOffsetHeaderKey); |
667 EXPECT_EQ(trailers, delegate->trailers()); | 667 EXPECT_EQ(trailers, delegate->trailers()); |
668 | 668 |
669 EXPECT_EQ(OK, delegate->ReadData(cb2.callback())); | 669 EXPECT_EQ(OK, delegate->ReadData(cb2.callback())); |
670 base::RunLoop().RunUntilIdle(); | 670 base::RunLoop().RunUntilIdle(); |
671 | 671 |
672 EXPECT_EQ(2, delegate->on_data_read_count()); | 672 EXPECT_EQ(2, delegate->on_data_read_count()); |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
776 delegate->SendvData({buf3, buf4, buf5}, | 776 delegate->SendvData({buf3, buf4, buf5}, |
777 {buf3->size(), buf4->size(), buf5->size()}, kFin); | 777 {buf3->size(), buf4->size(), buf5->size()}, kFin); |
778 delegate->WaitUntilNextCallback(); // OnDataSent | 778 delegate->WaitUntilNextCallback(); // OnDataSent |
779 | 779 |
780 size_t spdy_trailers_frame_length; | 780 size_t spdy_trailers_frame_length; |
781 SpdyHeaderBlock trailers; | 781 SpdyHeaderBlock trailers; |
782 trailers["foo"] = "bar"; | 782 trailers["foo"] = "bar"; |
783 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(kResponseBody)); | 783 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(kResponseBody)); |
784 // Server sends trailers. | 784 // Server sends trailers. |
785 ProcessPacket(ConstructResponseTrailersPacket( | 785 ProcessPacket(ConstructResponseTrailersPacket( |
786 4, kFin, trailers, &spdy_trailers_frame_length, &offset)); | 786 4, kFin, trailers.Clone(), &spdy_trailers_frame_length, &offset)); |
787 | 787 |
788 delegate->WaitUntilNextCallback(); // OnTrailersReceived | 788 delegate->WaitUntilNextCallback(); // OnTrailersReceived |
789 trailers.erase(kFinalOffsetHeaderKey); | 789 trailers.erase(kFinalOffsetHeaderKey); |
790 EXPECT_EQ(trailers, delegate->trailers()); | 790 EXPECT_EQ(trailers, delegate->trailers()); |
791 EXPECT_EQ(OK, delegate->ReadData(cb.callback())); | 791 EXPECT_EQ(OK, delegate->ReadData(cb.callback())); |
792 | 792 |
793 EXPECT_EQ(1, delegate->on_data_read_count()); | 793 EXPECT_EQ(1, delegate->on_data_read_count()); |
794 EXPECT_EQ(2, delegate->on_data_sent_count()); | 794 EXPECT_EQ(2, delegate->on_data_sent_count()); |
795 EXPECT_EQ(kProtoQUIC1SPDY3, delegate->GetProtocol()); | 795 EXPECT_EQ(kProtoQUIC1SPDY3, delegate->GetProtocol()); |
796 EXPECT_EQ( | 796 EXPECT_EQ( |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
872 | 872 |
873 delegate->SendData(buf2, buf2->size(), true); | 873 delegate->SendData(buf2, buf2->size(), true); |
874 delegate->WaitUntilNextCallback(); // OnDataSent | 874 delegate->WaitUntilNextCallback(); // OnDataSent |
875 | 875 |
876 size_t spdy_trailers_frame_length; | 876 size_t spdy_trailers_frame_length; |
877 SpdyHeaderBlock trailers; | 877 SpdyHeaderBlock trailers; |
878 trailers["foo"] = "bar"; | 878 trailers["foo"] = "bar"; |
879 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(kResponseBody)); | 879 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(kResponseBody)); |
880 // Server sends trailers. | 880 // Server sends trailers. |
881 ProcessPacket(ConstructResponseTrailersPacket( | 881 ProcessPacket(ConstructResponseTrailersPacket( |
882 4, kFin, trailers, &spdy_trailers_frame_length, &offset)); | 882 4, kFin, trailers.Clone(), &spdy_trailers_frame_length, &offset)); |
883 | 883 |
884 delegate->WaitUntilNextCallback(); // OnTrailersReceived | 884 delegate->WaitUntilNextCallback(); // OnTrailersReceived |
885 trailers.erase(kFinalOffsetHeaderKey); | 885 trailers.erase(kFinalOffsetHeaderKey); |
886 EXPECT_EQ(trailers, delegate->trailers()); | 886 EXPECT_EQ(trailers, delegate->trailers()); |
887 EXPECT_EQ(OK, delegate->ReadData(cb.callback())); | 887 EXPECT_EQ(OK, delegate->ReadData(cb.callback())); |
888 | 888 |
889 EXPECT_EQ(1, delegate->on_data_read_count()); | 889 EXPECT_EQ(1, delegate->on_data_read_count()); |
890 EXPECT_EQ(2, delegate->on_data_sent_count()); | 890 EXPECT_EQ(2, delegate->on_data_sent_count()); |
891 EXPECT_EQ(kProtoQUIC1SPDY3, delegate->GetProtocol()); | 891 EXPECT_EQ(kProtoQUIC1SPDY3, delegate->GetProtocol()); |
892 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length + | 892 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length + |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
975 delegate->SendvData({buf3, buf4, buf5}, | 975 delegate->SendvData({buf3, buf4, buf5}, |
976 {buf3->size(), buf4->size(), buf5->size()}, kFin); | 976 {buf3->size(), buf4->size(), buf5->size()}, kFin); |
977 delegate->WaitUntilNextCallback(); // OnDataSent | 977 delegate->WaitUntilNextCallback(); // OnDataSent |
978 | 978 |
979 size_t spdy_trailers_frame_length; | 979 size_t spdy_trailers_frame_length; |
980 SpdyHeaderBlock trailers; | 980 SpdyHeaderBlock trailers; |
981 trailers["foo"] = "bar"; | 981 trailers["foo"] = "bar"; |
982 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(kResponseBody)); | 982 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(kResponseBody)); |
983 // Server sends trailers. | 983 // Server sends trailers. |
984 ProcessPacket(ConstructResponseTrailersPacket( | 984 ProcessPacket(ConstructResponseTrailersPacket( |
985 4, kFin, trailers, &spdy_trailers_frame_length, &offset)); | 985 4, kFin, trailers.Clone(), &spdy_trailers_frame_length, &offset)); |
986 | 986 |
987 delegate->WaitUntilNextCallback(); // OnTrailersReceived | 987 delegate->WaitUntilNextCallback(); // OnTrailersReceived |
988 trailers.erase(kFinalOffsetHeaderKey); | 988 trailers.erase(kFinalOffsetHeaderKey); |
989 EXPECT_EQ(trailers, delegate->trailers()); | 989 EXPECT_EQ(trailers, delegate->trailers()); |
990 EXPECT_EQ(OK, delegate->ReadData(cb.callback())); | 990 EXPECT_EQ(OK, delegate->ReadData(cb.callback())); |
991 | 991 |
992 EXPECT_EQ(1, delegate->on_data_read_count()); | 992 EXPECT_EQ(1, delegate->on_data_read_count()); |
993 EXPECT_EQ(2, delegate->on_data_sent_count()); | 993 EXPECT_EQ(2, delegate->on_data_sent_count()); |
994 EXPECT_EQ(kProtoQUIC1SPDY3, delegate->GetProtocol()); | 994 EXPECT_EQ(kProtoQUIC1SPDY3, delegate->GetProtocol()); |
995 EXPECT_EQ( | 995 EXPECT_EQ( |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1055 ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0, kResponseBody)); | 1055 ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0, kResponseBody)); |
1056 | 1056 |
1057 EXPECT_EQ(static_cast<int>(strlen(kResponseBody)), cb.WaitForResult()); | 1057 EXPECT_EQ(static_cast<int>(strlen(kResponseBody)), cb.WaitForResult()); |
1058 | 1058 |
1059 size_t spdy_trailers_frame_length; | 1059 size_t spdy_trailers_frame_length; |
1060 SpdyHeaderBlock trailers; | 1060 SpdyHeaderBlock trailers; |
1061 trailers["foo"] = "bar"; | 1061 trailers["foo"] = "bar"; |
1062 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(kResponseBody)); | 1062 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(kResponseBody)); |
1063 // Server sends trailers. | 1063 // Server sends trailers. |
1064 ProcessPacket(ConstructResponseTrailersPacket( | 1064 ProcessPacket(ConstructResponseTrailersPacket( |
1065 4, kFin, trailers, &spdy_trailers_frame_length, &offset)); | 1065 4, kFin, trailers.Clone(), &spdy_trailers_frame_length, &offset)); |
1066 | 1066 |
1067 delegate->WaitUntilNextCallback(); // OnTrailersReceived | 1067 delegate->WaitUntilNextCallback(); // OnTrailersReceived |
1068 trailers.erase(kFinalOffsetHeaderKey); | 1068 trailers.erase(kFinalOffsetHeaderKey); |
1069 EXPECT_EQ(trailers, delegate->trailers()); | 1069 EXPECT_EQ(trailers, delegate->trailers()); |
1070 EXPECT_EQ(OK, delegate->ReadData(cb.callback())); | 1070 EXPECT_EQ(OK, delegate->ReadData(cb.callback())); |
1071 | 1071 |
1072 EXPECT_EQ(1, delegate->on_data_read_count()); | 1072 EXPECT_EQ(1, delegate->on_data_read_count()); |
1073 EXPECT_EQ(1, delegate->on_data_sent_count()); | 1073 EXPECT_EQ(1, delegate->on_data_sent_count()); |
1074 EXPECT_EQ(kProtoQUIC1SPDY3, delegate->GetProtocol()); | 1074 EXPECT_EQ(kProtoQUIC1SPDY3, delegate->GetProtocol()); |
1075 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length + | 1075 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length + |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1132 ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0, kResponseBody)); | 1132 ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0, kResponseBody)); |
1133 | 1133 |
1134 EXPECT_EQ(static_cast<int>(strlen(kResponseBody)), cb.WaitForResult()); | 1134 EXPECT_EQ(static_cast<int>(strlen(kResponseBody)), cb.WaitForResult()); |
1135 | 1135 |
1136 size_t spdy_trailers_frame_length; | 1136 size_t spdy_trailers_frame_length; |
1137 SpdyHeaderBlock trailers; | 1137 SpdyHeaderBlock trailers; |
1138 trailers["foo"] = "bar"; | 1138 trailers["foo"] = "bar"; |
1139 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(kResponseBody)); | 1139 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(kResponseBody)); |
1140 // Server sends trailers. | 1140 // Server sends trailers. |
1141 ProcessPacket(ConstructResponseTrailersPacket( | 1141 ProcessPacket(ConstructResponseTrailersPacket( |
1142 4, kFin, trailers, &spdy_trailers_frame_length, &offset)); | 1142 4, kFin, trailers.Clone(), &spdy_trailers_frame_length, &offset)); |
1143 | 1143 |
1144 delegate->WaitUntilNextCallback(); // OnTrailersReceived | 1144 delegate->WaitUntilNextCallback(); // OnTrailersReceived |
1145 trailers.erase(kFinalOffsetHeaderKey); | 1145 trailers.erase(kFinalOffsetHeaderKey); |
1146 EXPECT_EQ(trailers, delegate->trailers()); | 1146 EXPECT_EQ(trailers, delegate->trailers()); |
1147 EXPECT_EQ(OK, delegate->ReadData(cb.callback())); | 1147 EXPECT_EQ(OK, delegate->ReadData(cb.callback())); |
1148 | 1148 |
1149 EXPECT_EQ(1, delegate->on_data_read_count()); | 1149 EXPECT_EQ(1, delegate->on_data_read_count()); |
1150 EXPECT_EQ(1, delegate->on_data_sent_count()); | 1150 EXPECT_EQ(1, delegate->on_data_sent_count()); |
1151 EXPECT_EQ(kProtoQUIC1SPDY3, delegate->GetProtocol()); | 1151 EXPECT_EQ(kProtoQUIC1SPDY3, delegate->GetProtocol()); |
1152 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length + | 1152 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length + |
(...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1651 | 1651 |
1652 EXPECT_EQ(static_cast<int64_t>(strlen(kResponseBody)), cb.WaitForResult()); | 1652 EXPECT_EQ(static_cast<int64_t>(strlen(kResponseBody)), cb.WaitForResult()); |
1653 EXPECT_EQ(std::string(kResponseBody), delegate->data_received()); | 1653 EXPECT_EQ(std::string(kResponseBody), delegate->data_received()); |
1654 | 1654 |
1655 size_t spdy_trailers_frame_length; | 1655 size_t spdy_trailers_frame_length; |
1656 SpdyHeaderBlock trailers; | 1656 SpdyHeaderBlock trailers; |
1657 trailers["foo"] = "bar"; | 1657 trailers["foo"] = "bar"; |
1658 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(kResponseBody)); | 1658 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(kResponseBody)); |
1659 // Server sends trailers. | 1659 // Server sends trailers. |
1660 ProcessPacket(ConstructResponseTrailersPacket( | 1660 ProcessPacket(ConstructResponseTrailersPacket( |
1661 4, kFin, trailers, &spdy_trailers_frame_length, &offset)); | 1661 4, kFin, trailers.Clone(), &spdy_trailers_frame_length, &offset)); |
1662 | 1662 |
1663 delegate->WaitUntilNextCallback(); // OnTrailersReceived | 1663 delegate->WaitUntilNextCallback(); // OnTrailersReceived |
1664 trailers.erase(kFinalOffsetHeaderKey); | 1664 trailers.erase(kFinalOffsetHeaderKey); |
1665 EXPECT_EQ(trailers, delegate->trailers()); | 1665 EXPECT_EQ(trailers, delegate->trailers()); |
1666 | 1666 |
1667 base::RunLoop().RunUntilIdle(); | 1667 base::RunLoop().RunUntilIdle(); |
1668 | 1668 |
1669 EXPECT_EQ(1, delegate->on_data_read_count()); | 1669 EXPECT_EQ(1, delegate->on_data_read_count()); |
1670 EXPECT_EQ(0, delegate->on_data_sent_count()); | 1670 EXPECT_EQ(0, delegate->on_data_sent_count()); |
1671 } | 1671 } |
1672 | 1672 |
1673 } // namespace test | 1673 } // namespace test |
1674 | 1674 |
1675 } // namespace net | 1675 } // namespace net |
OLD | NEW |