Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / net / tools / quic / quic_server_session_test.cc
index 22308fb..4c75ded 100644 (file)
@@ -7,11 +7,13 @@
 #include "net/quic/crypto/quic_crypto_server_config.h"
 #include "net/quic/crypto/quic_random.h"
 #include "net/quic/quic_connection.h"
+#include "net/quic/quic_flags.h"
 #include "net/quic/quic_utils.h"
+#include "net/quic/test_tools/quic_config_peer.h"
 #include "net/quic/test_tools/quic_connection_peer.h"
 #include "net/quic/test_tools/quic_data_stream_peer.h"
+#include "net/quic/test_tools/quic_session_peer.h"
 #include "net/quic/test_tools/quic_test_utils.h"
-#include "net/tools/epoll_server/epoll_server.h"
 #include "net/tools/quic/quic_spdy_server_stream.h"
 #include "net/tools/quic/test_tools/quic_test_utils.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
 using __gnu_cxx::vector;
 using net::test::MockConnection;
+using net::test::QuicConfigPeer;
 using net::test::QuicConnectionPeer;
 using net::test::QuicDataStreamPeer;
+using net::test::QuicSessionPeer;
 using net::test::SupportedVersions;
+using net::test::ValueRestore;
+using net::test::kClientDataStreamId1;
+using net::test::kClientDataStreamId2;
+using net::test::kClientDataStreamId3;
+using net::test::kClientDataStreamId4;
 using testing::StrictMock;
 using testing::_;
 
@@ -49,11 +58,16 @@ class QuicServerSessionTest : public ::testing::TestWithParam<QuicVersion> {
                        QuicRandom::GetInstance()) {
     config_.SetDefaults();
     config_.set_max_streams_per_connection(3, 3);
+    config_.SetInitialFlowControlWindowToSend(
+        kInitialSessionFlowControlWindowForTest);
+    config_.SetInitialStreamFlowControlWindowToSend(
+        kInitialStreamFlowControlWindowForTest);
+    config_.SetInitialSessionFlowControlWindowToSend(
+        kInitialSessionFlowControlWindowForTest);
 
     connection_ =
         new StrictMock<MockConnection>(true, SupportedVersions(GetParam()));
-    session_.reset(new QuicServerSession(
-        config_, connection_, &owner_));
+    session_.reset(new QuicServerSession(config_, connection_, &owner_));
     session_->InitializeSession(crypto_config_);
     visitor_ = QuicConnectionPeer::GetVisitor(connection_);
   }
@@ -72,19 +86,18 @@ INSTANTIATE_TEST_CASE_P(Tests, QuicServerSessionTest,
                         ::testing::ValuesIn(QuicSupportedVersions()));
 
 TEST_P(QuicServerSessionTest, CloseStreamDueToReset) {
-  QuicStreamId stream_id = 5;
   // Open a stream, then reset it.
   // Send two bytes of payload to open it.
-  QuicStreamFrame data1(stream_id, false, 0, MakeIOVector("HT"));
+  QuicStreamFrame data1(kClientDataStreamId1, false, 0, MakeIOVector("HT"));
   vector<QuicStreamFrame> frames;
   frames.push_back(data1);
   session_->OnStreamFrames(frames);
   EXPECT_EQ(1u, session_->GetNumOpenStreams());
 
   // Send a reset (and expect the peer to send a RST in response).
-  QuicRstStreamFrame rst1(stream_id, QUIC_STREAM_NO_ERROR, 0);
-  EXPECT_CALL(*connection_,
-              SendRstStream(stream_id, QUIC_RST_FLOW_CONTROL_ACCOUNTING, 0));
+  QuicRstStreamFrame rst1(kClientDataStreamId1, QUIC_STREAM_NO_ERROR, 0);
+  EXPECT_CALL(*connection_, SendRstStream(kClientDataStreamId1,
+                                          QUIC_RST_FLOW_CONTROL_ACCOUNTING, 0));
   visitor_->OnRstStream(rst1);
   EXPECT_EQ(0u, session_->GetNumOpenStreams());
 
@@ -97,17 +110,15 @@ TEST_P(QuicServerSessionTest, CloseStreamDueToReset) {
 }
 
 TEST_P(QuicServerSessionTest, NeverOpenStreamDueToReset) {
-  QuicStreamId stream_id = 5;
-
   // Send a reset (and expect the peer to send a RST in response).
-  QuicRstStreamFrame rst1(stream_id, QUIC_STREAM_NO_ERROR, 0);
-  EXPECT_CALL(*connection_,
-              SendRstStream(stream_id, QUIC_RST_FLOW_CONTROL_ACCOUNTING, 0));
+  QuicRstStreamFrame rst1(kClientDataStreamId1, QUIC_STREAM_NO_ERROR, 0);
+  EXPECT_CALL(*connection_, SendRstStream(kClientDataStreamId1,
+                                          QUIC_RST_FLOW_CONTROL_ACCOUNTING, 0));
   visitor_->OnRstStream(rst1);
   EXPECT_EQ(0u, session_->GetNumOpenStreams());
 
   // Send two bytes of payload.
-  QuicStreamFrame data1(stream_id, false, 0, MakeIOVector("HT"));
+  QuicStreamFrame data1(kClientDataStreamId1, false, 0, MakeIOVector("HT"));
   vector<QuicStreamFrame> frames;
   frames.push_back(data1);
   visitor_->OnStreamFrames(frames);
@@ -118,29 +129,29 @@ TEST_P(QuicServerSessionTest, NeverOpenStreamDueToReset) {
 }
 
 TEST_P(QuicServerSessionTest, AcceptClosedStream) {
-  QuicStreamId stream_id = 5;
   vector<QuicStreamFrame> frames;
   // Send (empty) compressed headers followed by two bytes of data.
-  frames.push_back(QuicStreamFrame(stream_id, false, 0,
+  frames.push_back(QuicStreamFrame(kClientDataStreamId1, false, 0,
                                    MakeIOVector("\1\0\0\0\0\0\0\0HT")));
-  frames.push_back(QuicStreamFrame(stream_id + 2, false, 0,
+  frames.push_back(QuicStreamFrame(kClientDataStreamId2, false, 0,
                                    MakeIOVector("\2\0\0\0\0\0\0\0HT")));
   visitor_->OnStreamFrames(frames);
   EXPECT_EQ(2u, session_->GetNumOpenStreams());
 
   // Send a reset (and expect the peer to send a RST in response).
-  QuicRstStreamFrame rst(stream_id, QUIC_STREAM_NO_ERROR, 0);
-  EXPECT_CALL(*connection_,
-              SendRstStream(stream_id, QUIC_RST_FLOW_CONTROL_ACCOUNTING, 0));
+  QuicRstStreamFrame rst(kClientDataStreamId1, QUIC_STREAM_NO_ERROR, 0);
+  EXPECT_CALL(*connection_, SendRstStream(kClientDataStreamId1,
+                                          QUIC_RST_FLOW_CONTROL_ACCOUNTING, 0));
   visitor_->OnRstStream(rst);
 
   // If we were tracking, we'd probably want to reject this because it's data
   // past the reset point of stream 3.  As it's a closed stream we just drop the
   // data on the floor, but accept the packet because it has data for stream 5.
   frames.clear();
-  frames.push_back(QuicStreamFrame(stream_id, false, 2, MakeIOVector("TP")));
-  frames.push_back(QuicStreamFrame(stream_id + 2, false, 2,
-                                   MakeIOVector("TP")));
+  frames.push_back(
+      QuicStreamFrame(kClientDataStreamId1, false, 2, MakeIOVector("TP")));
+  frames.push_back(
+      QuicStreamFrame(kClientDataStreamId2, false, 2, MakeIOVector("TP")));
   visitor_->OnStreamFrames(frames);
   // The stream should never be opened, now that the reset is received.
   EXPECT_EQ(1u, session_->GetNumOpenStreams());
@@ -148,28 +159,26 @@ TEST_P(QuicServerSessionTest, AcceptClosedStream) {
 }
 
 TEST_P(QuicServerSessionTest, MaxNumConnections) {
-  QuicStreamId stream_id = 5;
   EXPECT_EQ(0u, session_->GetNumOpenStreams());
-  EXPECT_TRUE(QuicServerSessionPeer::GetIncomingDataStream(session_.get(),
-                                                           stream_id));
-  EXPECT_TRUE(QuicServerSessionPeer::GetIncomingDataStream(session_.get(),
-                                                           stream_id + 2));
-  EXPECT_TRUE(QuicServerSessionPeer::GetIncomingDataStream(session_.get(),
-                                                           stream_id + 4));
+  EXPECT_TRUE(QuicServerSessionPeer::GetIncomingDataStream(
+      session_.get(), kClientDataStreamId1));
+  EXPECT_TRUE(QuicServerSessionPeer::GetIncomingDataStream(
+      session_.get(), kClientDataStreamId2));
+  EXPECT_TRUE(QuicServerSessionPeer::GetIncomingDataStream(
+      session_.get(), kClientDataStreamId3));
   EXPECT_CALL(*connection_, SendConnectionClose(QUIC_TOO_MANY_OPEN_STREAMS));
-  EXPECT_FALSE(QuicServerSessionPeer::GetIncomingDataStream(session_.get(),
-                                                            stream_id + 6));
+  EXPECT_FALSE(QuicServerSessionPeer::GetIncomingDataStream(
+      session_.get(), kClientDataStreamId4));
 }
 
 TEST_P(QuicServerSessionTest, MaxNumConnectionsImplicit) {
-  QuicStreamId stream_id = 5;
   EXPECT_EQ(0u, session_->GetNumOpenStreams());
-  EXPECT_TRUE(QuicServerSessionPeer::GetIncomingDataStream(session_.get(),
-                                                           stream_id));
+  EXPECT_TRUE(QuicServerSessionPeer::GetIncomingDataStream(
+      session_.get(), kClientDataStreamId1));
   // Implicitly opens two more streams.
   EXPECT_CALL(*connection_, SendConnectionClose(QUIC_TOO_MANY_OPEN_STREAMS));
-  EXPECT_FALSE(QuicServerSessionPeer::GetIncomingDataStream(session_.get(),
-                                                            stream_id + 6));
+  EXPECT_FALSE(QuicServerSessionPeer::GetIncomingDataStream(
+      session_.get(), kClientDataStreamId4));
 }
 
 TEST_P(QuicServerSessionTest, GetEvenIncomingError) {
@@ -179,6 +188,25 @@ TEST_P(QuicServerSessionTest, GetEvenIncomingError) {
             QuicServerSessionPeer::GetIncomingDataStream(session_.get(), 4));
 }
 
+TEST_P(QuicServerSessionTest, SetFecProtectionFromConfig) {
+  ValueRestore<bool> old_flag(&FLAGS_enable_quic_fec, true);
+
+  // Set received config to have FEC connection option.
+  QuicTagVector copt;
+  copt.push_back(kFHDR);
+  QuicConfigPeer::SetReceivedConnectionOptions(session_->config(), copt);
+  session_->OnConfigNegotiated();
+
+  // Verify that headers stream is always protected and data streams are
+  // optionally protected.
+  EXPECT_EQ(FEC_PROTECT_ALWAYS,
+            QuicSessionPeer::GetHeadersStream(session_.get())->fec_policy());
+  QuicDataStream* stream = QuicServerSessionPeer::GetIncomingDataStream(
+      session_.get(), kClientDataStreamId1);
+  ASSERT_TRUE(stream);
+  EXPECT_EQ(FEC_PROTECT_OPTIONAL, stream->fec_policy());
+}
+
 }  // namespace
 }  // namespace test
 }  // namespace tools