blob: 9529f51814903c2239ebb4b5d34494eba8e9040f [file] [log] [blame]
renjietangd21094b2019-06-14 09:39:11 -07001// Copyright 2019 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/third_party/quiche/src/quic/core/qpack/qpack_send_stream.h"
6
bnc3fc60df2019-07-17 11:55:10 -07007#include "net/third_party/quiche/src/quic/core/http/http_constants.h"
bnc8464f312019-06-21 11:43:07 -07008#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
renjietangbb2e22a2019-09-12 15:46:39 -07009#include "net/third_party/quiche/src/quic/test_tools/quic_config_peer.h"
renjietangd21094b2019-06-14 09:39:11 -070010#include "net/third_party/quiche/src/quic/test_tools/quic_spdy_session_peer.h"
11#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
12
13namespace quic {
14namespace test {
15
16namespace {
17using ::testing::_;
18using ::testing::Invoke;
19using ::testing::StrictMock;
20
21struct TestParams {
22 TestParams(const ParsedQuicVersion& version, Perspective perspective)
23 : version(version), perspective(perspective) {
24 QUIC_LOG(INFO) << "TestParams: version: "
25 << ParsedQuicVersionToString(version)
26 << ", perspective: " << perspective;
27 }
28
29 TestParams(const TestParams& other)
30 : version(other.version), perspective(other.perspective) {}
31
32 ParsedQuicVersion version;
33 Perspective perspective;
34};
35
dschinazi88bd5b02019-10-10 00:52:20 -070036// Used by ::testing::PrintToStringParamName().
37std::string PrintToString(const TestParams& tp) {
38 return QuicStrCat(
39 ParsedQuicVersionToString(tp.version), "_",
40 (tp.perspective == Perspective::IS_CLIENT ? "client" : "server"));
41}
42
renjietangd21094b2019-06-14 09:39:11 -070043std::vector<TestParams> GetTestParams() {
44 std::vector<TestParams> params;
45 ParsedQuicVersionVector all_supported_versions = AllSupportedVersions();
46 for (const auto& version : AllSupportedVersions()) {
renjietanga29a96a2019-10-10 12:47:50 -070047 if (!VersionUsesHttp3(version.transport_version)) {
renjietangd21094b2019-06-14 09:39:11 -070048 continue;
49 }
50 for (Perspective p : {Perspective::IS_SERVER, Perspective::IS_CLIENT}) {
51 params.emplace_back(version, p);
52 }
53 }
54 return params;
55}
56
57class QpackSendStreamTest : public QuicTestWithParam<TestParams> {
58 public:
59 QpackSendStreamTest()
60 : connection_(new StrictMock<MockQuicConnection>(
61 &helper_,
62 &alarm_factory_,
63 perspective(),
64 SupportedVersions(GetParam().version))),
65 session_(connection_) {
66 session_.Initialize();
renjietangbb2e22a2019-09-12 15:46:39 -070067 QuicConfigPeer::SetReceivedInitialSessionFlowControlWindow(
68 session_.config(), kMinimumFlowControlSendWindow);
dschinazi18cdf132019-10-09 16:08:18 -070069 QuicConfigPeer::SetReceivedInitialMaxStreamDataBytesUnidirectional(
70 session_.config(), kMinimumFlowControlSendWindow);
renjietangbb2e22a2019-09-12 15:46:39 -070071 QuicConfigPeer::SetReceivedMaxIncomingUnidirectionalStreams(
72 session_.config(), 3);
73 session_.OnConfigNegotiated();
renjietang77dd8242019-08-09 13:00:42 -070074
renjietang578cf9f2019-08-23 11:57:52 -070075 qpack_send_stream_ =
76 QuicSpdySessionPeer::GetQpackDecoderSendStream(&session_);
renjietang77dd8242019-08-09 13:00:42 -070077
renjietangd21094b2019-06-14 09:39:11 -070078 ON_CALL(session_, WritevData(_, _, _, _, _))
79 .WillByDefault(Invoke(MockQuicSession::ConsumeData));
80 }
81
82 Perspective perspective() const { return GetParam().perspective; }
83
84 MockQuicConnectionHelper helper_;
85 MockAlarmFactory alarm_factory_;
86 StrictMock<MockQuicConnection>* connection_;
87 StrictMock<MockQuicSpdySession> session_;
renjietang77dd8242019-08-09 13:00:42 -070088 QpackSendStream* qpack_send_stream_;
renjietangd21094b2019-06-14 09:39:11 -070089};
90
91INSTANTIATE_TEST_SUITE_P(Tests,
92 QpackSendStreamTest,
dschinazi88bd5b02019-10-10 00:52:20 -070093 ::testing::ValuesIn(GetTestParams()),
94 ::testing::PrintToStringParamName());
renjietangd21094b2019-06-14 09:39:11 -070095
96TEST_P(QpackSendStreamTest, WriteStreamTypeOnlyFirstTime) {
renjietangd21094b2019-06-14 09:39:11 -070097 std::string data = "data";
98 EXPECT_CALL(session_, WritevData(_, _, 1, _, _));
99 EXPECT_CALL(session_, WritevData(_, _, data.length(), _, _));
100 qpack_send_stream_->WriteStreamData(QuicStringPiece(data));
101
102 EXPECT_CALL(session_, WritevData(_, _, data.length(), _, _));
103 qpack_send_stream_->WriteStreamData(QuicStringPiece(data));
renjietangd6f5afa2019-08-19 11:27:55 -0700104 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(0);
renjietangc8c02a52019-08-22 10:38:37 -0700105 qpack_send_stream_->MaybeSendStreamType();
renjietangd21094b2019-06-14 09:39:11 -0700106}
107
108TEST_P(QpackSendStreamTest, ResetQpackStream) {
109 QuicRstStreamFrame rst_frame(kInvalidControlFrameId, qpack_send_stream_->id(),
110 QUIC_STREAM_CANCELLED, 1234);
111 EXPECT_CALL(*connection_, CloseConnection(QUIC_INVALID_STREAM_ID, _, _));
112 qpack_send_stream_->OnStreamReset(rst_frame);
113}
114
115TEST_P(QpackSendStreamTest, ReceiveDataOnSendStream) {
116 QuicStreamFrame frame(qpack_send_stream_->id(), false, 0, "test");
117 EXPECT_CALL(
118 *connection_,
119 CloseConnection(QUIC_DATA_RECEIVED_ON_WRITE_UNIDIRECTIONAL_STREAM, _, _));
120 qpack_send_stream_->OnStreamFrame(frame);
121}
122
123} // namespace
124} // namespace test
125} // namespace quic