Home | History | Annotate | Download | only in flip
      1 // Copyright (c) 2009 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 "flip_protocol.h"
      6 
      7 #include "base/scoped_ptr.h"
      8 #include "net/flip/flip_bitmasks.h"
      9 #include "net/flip/flip_framer.h"
     10 #include "testing/platform_test.h"
     11 
     12 using flip::FlipDataFrame;
     13 using flip::FlipFrame;
     14 using flip::FlipControlFrame;
     15 using flip::FlipSynStreamControlFrame;
     16 using flip::FlipSynReplyControlFrame;
     17 using flip::FlipFinStreamControlFrame;
     18 using flip::FlipFramer;
     19 using flip::FlipHeaderBlock;
     20 using flip::FlagsAndLength;
     21 using flip::kLengthMask;
     22 using flip::kStreamIdMask;
     23 using flip::kFlipProtocolVersion;
     24 using flip::SYN_STREAM;
     25 using flip::SYN_REPLY;
     26 using flip::FIN_STREAM;
     27 using flip::CONTROL_FLAG_FIN;
     28 using flip::CONTROL_FLAG_NONE;
     29 
     30 namespace {
     31 
     32 // Test our protocol constants
     33 TEST(FlipProtocolTest, ProtocolConstants) {
     34   EXPECT_EQ(8u, FlipFrame::size());
     35   EXPECT_EQ(8u, FlipDataFrame::size());
     36   EXPECT_EQ(12u, FlipControlFrame::size());
     37   EXPECT_EQ(14u, FlipSynStreamControlFrame::size());
     38   EXPECT_EQ(14u, FlipSynReplyControlFrame::size());
     39   EXPECT_EQ(16u, FlipFinStreamControlFrame::size());
     40   EXPECT_EQ(4u, sizeof(FlagsAndLength));
     41   EXPECT_EQ(1, SYN_STREAM);
     42   EXPECT_EQ(2, SYN_REPLY);
     43   EXPECT_EQ(3, FIN_STREAM);
     44 }
     45 
     46 // Test some of the protocol helper functions
     47 TEST(FlipProtocolTest, FrameStructs) {
     48   FlipFrame frame(FlipFrame::size());
     49   frame.set_length(12345);
     50   frame.set_flags(10);
     51   EXPECT_EQ(12345u, frame.length());
     52   EXPECT_EQ(10u, frame.flags());
     53   EXPECT_EQ(false, frame.is_control_frame());
     54 
     55   frame.set_length(0);
     56   frame.set_flags(10);
     57   EXPECT_EQ(0u, frame.length());
     58   EXPECT_EQ(10u, frame.flags());
     59   EXPECT_EQ(false, frame.is_control_frame());
     60 }
     61 
     62 TEST(FlipProtocolTest, DataFrameStructs) {
     63   FlipDataFrame data_frame;
     64   data_frame.set_stream_id(12345);
     65   EXPECT_EQ(12345u, data_frame.stream_id());
     66 }
     67 
     68 TEST(FlipProtocolTest, ControlFrameStructs) {
     69   FlipFramer framer;
     70   FlipHeaderBlock headers;
     71 
     72   scoped_ptr<FlipSynStreamControlFrame> syn_frame(
     73       framer.CreateSynStream(123, 2, CONTROL_FLAG_FIN, false, &headers));
     74   EXPECT_EQ(kFlipProtocolVersion, syn_frame->version());
     75   EXPECT_EQ(true, syn_frame->is_control_frame());
     76   EXPECT_EQ(SYN_STREAM, syn_frame->type());
     77   EXPECT_EQ(123u, syn_frame->stream_id());
     78   EXPECT_EQ(2u, syn_frame->priority());
     79   EXPECT_EQ(2, syn_frame->header_block_len());
     80   EXPECT_EQ(1u, syn_frame->flags());
     81 
     82   scoped_ptr<FlipSynReplyControlFrame> syn_reply(
     83       framer.CreateSynReply(123, CONTROL_FLAG_NONE, false, &headers));
     84   EXPECT_EQ(kFlipProtocolVersion, syn_reply->version());
     85   EXPECT_EQ(true, syn_reply->is_control_frame());
     86   EXPECT_EQ(SYN_REPLY, syn_reply->type());
     87   EXPECT_EQ(123u, syn_reply->stream_id());
     88   EXPECT_EQ(2, syn_reply->header_block_len());
     89   EXPECT_EQ(0, syn_reply->flags());
     90 
     91   scoped_ptr<FlipFinStreamControlFrame> fin_frame(
     92       framer.CreateFinStream(123, 444));
     93   EXPECT_EQ(kFlipProtocolVersion, fin_frame->version());
     94   EXPECT_EQ(true, fin_frame->is_control_frame());
     95   EXPECT_EQ(FIN_STREAM, fin_frame->type());
     96   EXPECT_EQ(123u, fin_frame->stream_id());
     97   EXPECT_EQ(444u, fin_frame->status());
     98   fin_frame->set_status(555);
     99   EXPECT_EQ(555u, fin_frame->status());
    100   EXPECT_EQ(0, fin_frame->flags());
    101 }
    102 
    103 TEST(FlipProtocolTest, TestDataFrame) {
    104   FlipDataFrame frame;
    105 
    106   // Set the stream ID to various values.
    107   frame.set_stream_id(0);
    108   EXPECT_EQ(0u, frame.stream_id());
    109   EXPECT_FALSE(frame.is_control_frame());
    110   frame.set_stream_id(~0 & kStreamIdMask);
    111   EXPECT_EQ(~0 & kStreamIdMask, frame.stream_id());
    112   EXPECT_FALSE(frame.is_control_frame());
    113 
    114   // Set length to various values.  Make sure that when you set_length(x),
    115   // length() == x.  Also make sure the flags are unaltered.
    116   memset(frame.data(), '1', FlipDataFrame::size());
    117   int8 flags = frame.flags();
    118   frame.set_length(0);
    119   EXPECT_EQ(0u, frame.length());
    120   EXPECT_EQ(flags, frame.flags());
    121   frame.set_length(kLengthMask);
    122   EXPECT_EQ(kLengthMask, frame.length());
    123   EXPECT_EQ(flags, frame.flags());
    124   frame.set_length(5u);
    125   EXPECT_EQ(5u, frame.length());
    126   EXPECT_EQ(flags, frame.flags());
    127 
    128   // Set flags to various values.  Make sure that when you set_flags(x),
    129   // flags() == x.  Also make sure the length is unaltered.
    130   memset(frame.data(), '1', FlipDataFrame::size());
    131   uint32 length = frame.length();
    132   frame.set_flags(0);
    133   EXPECT_EQ(0u, frame.flags());
    134   EXPECT_EQ(length, frame.length());
    135   int8 all_flags = ~0;
    136   frame.set_flags(all_flags);
    137   flags = frame.flags();
    138   EXPECT_EQ(all_flags, flags);
    139   EXPECT_EQ(length, frame.length());
    140   frame.set_flags(5u);
    141   EXPECT_EQ(5u, frame.flags());
    142   EXPECT_EQ(length, frame.length());
    143 }
    144 
    145 // Make sure that overflows both die in debug mode, and do not cause problems
    146 // in opt mode.  Note:  Chrome doesn't die on DCHECK failures, so the
    147 // EXPECT_DEBUG_DEATH doesn't work.
    148 TEST(FlipProtocolDeathTest, TestDataFrame) {
    149   FlipDataFrame frame;
    150 
    151   frame.set_stream_id(0);
    152 #ifndef WIN32
    153   EXPECT_DEBUG_DEATH(frame.set_stream_id(~0), "");
    154 #endif
    155   EXPECT_FALSE(frame.is_control_frame());
    156 
    157   frame.set_flags(0);
    158 #ifndef WIN32
    159   EXPECT_DEBUG_DEATH(frame.set_length(~0), "");
    160 #endif
    161   EXPECT_EQ(0, frame.flags());
    162 }
    163 
    164 TEST(FlipProtocolDeathTest, TestFlipControlFrame) {
    165   FlipControlFrame frame(FlipControlFrame::size());
    166   memset(frame.data(), '1', FlipControlFrame::size());
    167 
    168   // Set the stream ID to various values.
    169   frame.set_stream_id(0);
    170   EXPECT_EQ(0u, frame.stream_id());
    171   EXPECT_FALSE(frame.is_control_frame());
    172   frame.set_stream_id(~0 & kStreamIdMask);
    173   EXPECT_EQ(~0 & kStreamIdMask, frame.stream_id());
    174   EXPECT_FALSE(frame.is_control_frame());
    175 }
    176 
    177 }  // namespace
    178 
    179