Home | History | Annotate | Download | only in quic
      1 // Copyright (c) 2013 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/quic/quic_config.h"
      6 
      7 #include "net/quic/crypto/crypto_handshake.h"
      8 #include "net/quic/crypto/crypto_protocol.h"
      9 #include "net/quic/quic_protocol.h"
     10 #include "net/quic/quic_time.h"
     11 #include "testing/gtest/include/gtest/gtest.h"
     12 
     13 using std::string;
     14 
     15 namespace net {
     16 namespace test {
     17 namespace {
     18 
     19 class QuicConfigTest : public ::testing::Test {
     20  protected:
     21   QuicConfigTest() {
     22     config_.SetDefaults();
     23   }
     24 
     25   QuicConfig config_;
     26 };
     27 
     28 TEST_F(QuicConfigTest, ToHandshakeMessage) {
     29   config_.set_idle_connection_state_lifetime(QuicTime::Delta::FromSeconds(5),
     30                                              QuicTime::Delta::FromSeconds(2));
     31   config_.set_max_streams_per_connection(4, 2);
     32   CryptoHandshakeMessage msg;
     33   config_.ToHandshakeMessage(&msg);
     34 
     35   uint32 value;
     36   QuicErrorCode error = msg.GetUint32(kICSL, &value);
     37   EXPECT_EQ(QUIC_NO_ERROR, error);
     38   EXPECT_EQ(5u, value);
     39 
     40   error = msg.GetUint32(kMSPC, &value);
     41   EXPECT_EQ(QUIC_NO_ERROR, error);
     42   EXPECT_EQ(4u, value);
     43 
     44   const QuicTag* out;
     45   size_t out_len;
     46   error = msg.GetTaglist(kCGST, &out, &out_len);
     47   EXPECT_EQ(1u, out_len);
     48   EXPECT_EQ(kQBIC, *out);
     49 }
     50 
     51 TEST_F(QuicConfigTest, ProcessClientHello) {
     52   QuicConfig client_config;
     53   QuicTagVector cgst;
     54   cgst.push_back(kINAR);
     55   cgst.push_back(kQBIC);
     56   client_config.set_congestion_control(cgst, kQBIC);
     57   client_config.set_idle_connection_state_lifetime(
     58       QuicTime::Delta::FromSeconds(2 * kDefaultTimeoutSecs),
     59       QuicTime::Delta::FromSeconds(kDefaultTimeoutSecs));
     60   client_config.set_max_streams_per_connection(
     61       2 * kDefaultMaxStreamsPerConnection, kDefaultMaxStreamsPerConnection);
     62 
     63   CryptoHandshakeMessage msg;
     64   client_config.ToHandshakeMessage(&msg);
     65   string error_details;
     66   const QuicErrorCode error = config_.ProcessClientHello(msg, &error_details);
     67   EXPECT_EQ(QUIC_NO_ERROR, error);
     68   EXPECT_TRUE(config_.negotiated());
     69   EXPECT_EQ(kQBIC, config_.congestion_control());
     70   EXPECT_EQ(QuicTime::Delta::FromSeconds(kDefaultTimeoutSecs),
     71             config_.idle_connection_state_lifetime());
     72   EXPECT_EQ(kDefaultMaxStreamsPerConnection,
     73             config_.max_streams_per_connection());
     74   EXPECT_EQ(QuicTime::Delta::FromSeconds(0), config_.keepalive_timeout());
     75 }
     76 
     77 TEST_F(QuicConfigTest, ProcessServerHello) {
     78   QuicConfig server_config;
     79   QuicTagVector cgst;
     80   cgst.push_back(kQBIC);
     81   server_config.set_congestion_control(cgst, kQBIC);
     82   server_config.set_idle_connection_state_lifetime(
     83       QuicTime::Delta::FromSeconds(kDefaultTimeoutSecs / 2),
     84       QuicTime::Delta::FromSeconds(kDefaultTimeoutSecs / 2));
     85   server_config.set_max_streams_per_connection(
     86       kDefaultMaxStreamsPerConnection / 2,
     87       kDefaultMaxStreamsPerConnection / 2);
     88 
     89   CryptoHandshakeMessage msg;
     90   server_config.ToHandshakeMessage(&msg);
     91   string error_details;
     92   const QuicErrorCode error = config_.ProcessServerHello(msg, &error_details);
     93   EXPECT_EQ(QUIC_NO_ERROR, error);
     94   EXPECT_TRUE(config_.negotiated());
     95   EXPECT_EQ(kQBIC, config_.congestion_control());
     96   EXPECT_EQ(QuicTime::Delta::FromSeconds(kDefaultTimeoutSecs / 2),
     97             config_.idle_connection_state_lifetime());
     98   EXPECT_EQ(kDefaultMaxStreamsPerConnection / 2,
     99             config_.max_streams_per_connection());
    100   EXPECT_EQ(QuicTime::Delta::FromSeconds(0), config_.keepalive_timeout());
    101 }
    102 
    103 TEST_F(QuicConfigTest, MissingValueInCHLO) {
    104   CryptoHandshakeMessage msg;
    105   msg.SetValue(kICSL, 1);
    106   msg.SetVector(kCGST, QuicTagVector(1, kQBIC));
    107   // Missing kMSPC. KATO is optional.
    108   string error_details;
    109   const QuicErrorCode error = config_.ProcessClientHello(msg, &error_details);
    110   EXPECT_EQ(QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND, error);
    111 }
    112 
    113 TEST_F(QuicConfigTest, MissingValueInSHLO) {
    114   CryptoHandshakeMessage msg;
    115   msg.SetValue(kICSL, 1);
    116   msg.SetValue(kMSPC, 3);
    117   // Missing CGST. KATO is optional.
    118   string error_details;
    119   const QuicErrorCode error = config_.ProcessServerHello(msg, &error_details);
    120   EXPECT_EQ(QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND, error);
    121 }
    122 
    123 TEST_F(QuicConfigTest, OutOfBoundSHLO) {
    124   QuicConfig server_config;
    125   server_config.set_idle_connection_state_lifetime(
    126       QuicTime::Delta::FromSeconds(2 * kDefaultTimeoutSecs),
    127       QuicTime::Delta::FromSeconds(2 * kDefaultTimeoutSecs));
    128 
    129   CryptoHandshakeMessage msg;
    130   server_config.ToHandshakeMessage(&msg);
    131   string error_details;
    132   const QuicErrorCode error = config_.ProcessServerHello(msg, &error_details);
    133   EXPECT_EQ(QUIC_INVALID_NEGOTIATED_VALUE, error);
    134 }
    135 
    136 TEST_F(QuicConfigTest, MultipleNegotiatedValuesInVectorTag) {
    137   QuicConfig server_config;
    138   QuicTagVector cgst;
    139   cgst.push_back(kQBIC);
    140   cgst.push_back(kINAR);
    141   server_config.set_congestion_control(cgst, kQBIC);
    142 
    143   CryptoHandshakeMessage msg;
    144   server_config.ToHandshakeMessage(&msg);
    145   string error_details;
    146   const QuicErrorCode error = config_.ProcessServerHello(msg, &error_details);
    147   EXPECT_EQ(QUIC_INVALID_NEGOTIATED_VALUE, error);
    148 }
    149 
    150 TEST_F(QuicConfigTest, NoOverLapInCGST) {
    151   QuicConfig server_config;
    152   server_config.SetDefaults();
    153   QuicTagVector cgst;
    154   cgst.push_back(kINAR);
    155   server_config.set_congestion_control(cgst, kINAR);
    156 
    157   CryptoHandshakeMessage msg;
    158   string error_details;
    159   server_config.ToHandshakeMessage(&msg);
    160   const QuicErrorCode error = config_.ProcessClientHello(msg, &error_details);
    161   LOG(INFO) << QuicUtils::ErrorToString(error);
    162   EXPECT_EQ(QUIC_CRYPTO_MESSAGE_PARAMETER_NO_OVERLAP, error);
    163 }
    164 
    165 }  // namespace
    166 }  // namespace test
    167 }  // namespace net
    168