Home | History | Annotate | Download | only in quic
      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
      3 // found in the LICENSE file.
      4 
      5 #include "net/quic/quic_protocol.h"
      6 
      7 #include "base/stl_util.h"
      8 #include "testing/gtest/include/gtest/gtest.h"
      9 
     10 namespace net {
     11 namespace test {
     12 namespace {
     13 
     14 TEST(QuicProtocolTest, MakeQuicTag) {
     15   QuicTag tag = MakeQuicTag('A', 'B', 'C', 'D');
     16   char bytes[4];
     17   memcpy(bytes, &tag, 4);
     18   EXPECT_EQ('A', bytes[0]);
     19   EXPECT_EQ('B', bytes[1]);
     20   EXPECT_EQ('C', bytes[2]);
     21   EXPECT_EQ('D', bytes[3]);
     22 }
     23 
     24 TEST(QuicProtocolTest, IsAawaitingPacket) {
     25   ReceivedPacketInfo received_info;
     26   received_info.largest_observed = 10u;
     27   EXPECT_TRUE(IsAwaitingPacket(received_info, 11u));
     28   EXPECT_FALSE(IsAwaitingPacket(received_info, 1u));
     29 
     30   received_info.missing_packets.insert(10);
     31   EXPECT_TRUE(IsAwaitingPacket(received_info, 10u));
     32 }
     33 
     34 TEST(QuicProtocolTest, InsertMissingPacketsBetween) {
     35   ReceivedPacketInfo received_info;
     36   InsertMissingPacketsBetween(&received_info, 4u, 10u);
     37   EXPECT_EQ(6u, received_info.missing_packets.size());
     38 
     39   QuicPacketSequenceNumber i = 4;
     40   for (SequenceNumberSet::iterator it = received_info.missing_packets.begin();
     41        it != received_info.missing_packets.end(); ++it, ++i) {
     42     EXPECT_EQ(i, *it);
     43   }
     44 }
     45 
     46 TEST(QuicProtocolTest, QuicVersionToQuicTag) {
     47   // If you add a new version to the QuicVersion enum you will need to add a new
     48   // case to QuicVersionToQuicTag, otherwise this test will fail.
     49 
     50   // TODO(rtenneti): Enable checking of Log(ERROR) messages.
     51 #if 0
     52   // Any logs would indicate an unsupported version which we don't expect.
     53   ScopedMockLog log(kDoNotCaptureLogsYet);
     54   EXPECT_CALL(log, Log(_, _, _)).Times(0);
     55   log.StartCapturingLogs();
     56 #endif
     57 
     58   // Explicitly test a specific version.
     59   EXPECT_EQ(MakeQuicTag('Q', '0', '1', '2'),
     60             QuicVersionToQuicTag(QUIC_VERSION_12));
     61 
     62   // Loop over all supported versions and make sure that we never hit the
     63   // default case (i.e. all supported versions should be successfully converted
     64   // to valid QuicTags).
     65   for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
     66     QuicVersion version = kSupportedQuicVersions[i];
     67     EXPECT_LT(0u, QuicVersionToQuicTag(version));
     68   }
     69 }
     70 
     71 TEST(QuicProtocolTest, QuicVersionToQuicTagUnsupported) {
     72   // TODO(rtenneti): Enable checking of Log(ERROR) messages.
     73 #if 0
     74   // TODO(rjshade): Change to DFATAL once we actually support multiple versions,
     75   // and QuicConnectionTest::SendVersionNegotiationPacket can be changed to use
     76   // mis-matched versions rather than relying on QUIC_VERSION_UNSUPPORTED.
     77   ScopedMockLog log(kDoNotCaptureLogsYet);
     78   EXPECT_CALL(log, Log(ERROR, _, "Unsupported QuicVersion: 0")).Times(1);
     79   log.StartCapturingLogs();
     80 #endif
     81 
     82   EXPECT_EQ(0u, QuicVersionToQuicTag(QUIC_VERSION_UNSUPPORTED));
     83 }
     84 
     85 TEST(QuicProtocolTest, QuicTagToQuicVersion) {
     86   // If you add a new version to the QuicVersion enum you will need to add a new
     87   // case to QuicTagToQuicVersion, otherwise this test will fail.
     88 
     89   // TODO(rtenneti): Enable checking of Log(ERROR) messages.
     90 #if 0
     91   // Any logs would indicate an unsupported version which we don't expect.
     92   ScopedMockLog log(kDoNotCaptureLogsYet);
     93   EXPECT_CALL(log, Log(_, _, _)).Times(0);
     94   log.StartCapturingLogs();
     95 #endif
     96 
     97   // Explicitly test specific versions.
     98   EXPECT_EQ(QUIC_VERSION_12,
     99             QuicTagToQuicVersion(MakeQuicTag('Q', '0', '1', '2')));
    100 
    101   for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
    102     QuicVersion version = kSupportedQuicVersions[i];
    103 
    104     // Get the tag from the version (we can loop over QuicVersions easily).
    105     QuicTag tag = QuicVersionToQuicTag(version);
    106     EXPECT_LT(0u, tag);
    107 
    108     // Now try converting back.
    109     QuicVersion tag_to_quic_version = QuicTagToQuicVersion(tag);
    110     EXPECT_EQ(version, tag_to_quic_version);
    111     EXPECT_NE(QUIC_VERSION_UNSUPPORTED, tag_to_quic_version);
    112   }
    113 }
    114 
    115 TEST(QuicProtocolTest, QuicTagToQuicVersionUnsupported) {
    116   // TODO(rtenneti): Enable checking of Log(ERROR) messages.
    117 #if 0
    118   ScopedMockLog log(kDoNotCaptureLogsYet);
    119 #ifndef NDEBUG
    120   EXPECT_CALL(log, Log(INFO, _, "Unsupported QuicTag version: FAKE")).Times(1);
    121 #endif
    122   log.StartCapturingLogs();
    123 #endif
    124 
    125   EXPECT_EQ(QUIC_VERSION_UNSUPPORTED,
    126             QuicTagToQuicVersion(MakeQuicTag('F', 'A', 'K', 'E')));
    127 }
    128 
    129 TEST(QuicProtocolTest, QuicVersionToString) {
    130   EXPECT_EQ("QUIC_VERSION_12", QuicVersionToString(QUIC_VERSION_12));
    131   EXPECT_EQ("QUIC_VERSION_UNSUPPORTED",
    132             QuicVersionToString(QUIC_VERSION_UNSUPPORTED));
    133 
    134   QuicVersion single_version[] = {QUIC_VERSION_12};
    135   QuicVersionVector versions_vector;
    136   for (size_t i = 0; i < arraysize(single_version); ++i) {
    137     versions_vector.push_back(single_version[i]);
    138   }
    139   EXPECT_EQ("QUIC_VERSION_12", QuicVersionVectorToString(versions_vector));
    140 
    141   QuicVersion multiple_versions[] = {QUIC_VERSION_UNSUPPORTED, QUIC_VERSION_12};
    142   versions_vector.clear();
    143   for (size_t i = 0; i < arraysize(multiple_versions); ++i) {
    144     versions_vector.push_back(multiple_versions[i]);
    145   }
    146   EXPECT_EQ("QUIC_VERSION_UNSUPPORTED,QUIC_VERSION_12",
    147             QuicVersionVectorToString(versions_vector));
    148 
    149   // Make sure that all supported versions are present in QuicVersionToString.
    150   for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
    151     QuicVersion version = kSupportedQuicVersions[i];
    152     EXPECT_NE("QUIC_VERSION_UNSUPPORTED", QuicVersionToString(version));
    153   }
    154 }
    155 
    156 }  // namespace
    157 }  // namespace test
    158 }  // namespace net
    159