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 <algorithm> 6 #include <iostream> 7 8 #include "base/memory/scoped_ptr.h" 9 #include "base/sys_byteorder.h" 10 #include "net/spdy/spdy_frame_reader.h" 11 #include "testing/platform_test.h" 12 13 namespace net { 14 15 TEST(SpdyFrameReaderTest, ReadUInt16) { 16 // Frame data in network byte order. 17 const uint16 kFrameData[] = { 18 htons(1), htons(1<<15), 19 }; 20 21 SpdyFrameReader frame_reader(reinterpret_cast<const char *>(kFrameData), 22 arraysize(kFrameData) * sizeof(uint16)); 23 EXPECT_FALSE(frame_reader.IsDoneReading()); 24 25 uint16 uint16_val; 26 EXPECT_TRUE(frame_reader.ReadUInt16(&uint16_val)); 27 EXPECT_FALSE(frame_reader.IsDoneReading()); 28 EXPECT_EQ(1, uint16_val); 29 30 EXPECT_TRUE(frame_reader.ReadUInt16(&uint16_val)); 31 EXPECT_TRUE(frame_reader.IsDoneReading()); 32 EXPECT_EQ(1<<15, uint16_val); 33 } 34 35 TEST(SpdyFrameReaderTest, ReadUInt32) { 36 // Frame data in network byte order. 37 const uint32 kFrameData[] = { 38 htonl(1), htonl(1<<31), 39 }; 40 41 SpdyFrameReader frame_reader(reinterpret_cast<const char *>(kFrameData), 42 arraysize(kFrameData) * sizeof(uint32)); 43 EXPECT_FALSE(frame_reader.IsDoneReading()); 44 45 uint32 uint32_val; 46 EXPECT_TRUE(frame_reader.ReadUInt32(&uint32_val)); 47 EXPECT_FALSE(frame_reader.IsDoneReading()); 48 EXPECT_EQ(1u, uint32_val); 49 50 EXPECT_TRUE(frame_reader.ReadUInt32(&uint32_val)); 51 EXPECT_TRUE(frame_reader.IsDoneReading()); 52 EXPECT_EQ(1u<<31, uint32_val); 53 } 54 55 TEST(SpdyFrameReaderTest, ReadStringPiece16) { 56 // Frame data in network byte order. 57 const char kFrameData[] = { 58 0x00, 0x02, // uint16(2) 59 0x48, 0x69, // "Hi" 60 0x00, 0x10, // uint16(16) 61 0x54, 0x65, 0x73, 0x74, 62 0x69, 0x6e, 0x67, 0x2c, 63 0x20, 0x31, 0x2c, 0x20, 64 0x32, 0x2c, 0x20, 0x33, // "Testing, 1, 2, 3" 65 }; 66 67 SpdyFrameReader frame_reader(kFrameData, arraysize(kFrameData)); 68 EXPECT_FALSE(frame_reader.IsDoneReading()); 69 70 base::StringPiece stringpiece_val; 71 EXPECT_TRUE(frame_reader.ReadStringPiece16(&stringpiece_val)); 72 EXPECT_FALSE(frame_reader.IsDoneReading()); 73 EXPECT_EQ(0, stringpiece_val.compare("Hi")); 74 75 EXPECT_TRUE(frame_reader.ReadStringPiece16(&stringpiece_val)); 76 EXPECT_TRUE(frame_reader.IsDoneReading()); 77 EXPECT_EQ(0, stringpiece_val.compare("Testing, 1, 2, 3")); 78 } 79 80 TEST(SpdyFrameReaderTest, ReadStringPiece32) { 81 // Frame data in network byte order. 82 const char kFrameData[] = { 83 0x00, 0x00, 0x00, 0x03, // uint32(3) 84 0x66, 0x6f, 0x6f, // "foo" 85 0x00, 0x00, 0x00, 0x10, // uint32(16) 86 0x54, 0x65, 0x73, 0x74, 87 0x69, 0x6e, 0x67, 0x2c, 88 0x20, 0x34, 0x2c, 0x20, 89 0x35, 0x2c, 0x20, 0x36, // "Testing, 4, 5, 6" 90 }; 91 92 SpdyFrameReader frame_reader(kFrameData, arraysize(kFrameData)); 93 EXPECT_FALSE(frame_reader.IsDoneReading()); 94 95 base::StringPiece stringpiece_val; 96 EXPECT_TRUE(frame_reader.ReadStringPiece32(&stringpiece_val)); 97 EXPECT_FALSE(frame_reader.IsDoneReading()); 98 EXPECT_EQ(0, stringpiece_val.compare("foo")); 99 100 EXPECT_TRUE(frame_reader.ReadStringPiece32(&stringpiece_val)); 101 EXPECT_TRUE(frame_reader.IsDoneReading()); 102 EXPECT_EQ(0, stringpiece_val.compare("Testing, 4, 5, 6")); 103 } 104 105 TEST(SpdyFrameReaderTest, ReadUInt16WithBufferTooSmall) { 106 // Frame data in network byte order. 107 const char kFrameData[] = { 108 0x00, // part of a uint16 109 }; 110 111 SpdyFrameReader frame_reader(kFrameData, arraysize(kFrameData)); 112 EXPECT_FALSE(frame_reader.IsDoneReading()); 113 114 uint16 uint16_val; 115 EXPECT_FALSE(frame_reader.ReadUInt16(&uint16_val)); 116 } 117 118 TEST(SpdyFrameReaderTest, ReadUInt32WithBufferTooSmall) { 119 // Frame data in network byte order. 120 const char kFrameData[] = { 121 0x00, 0x00, 0x00, // part of a uint32 122 }; 123 124 SpdyFrameReader frame_reader(kFrameData, arraysize(kFrameData)); 125 EXPECT_FALSE(frame_reader.IsDoneReading()); 126 127 uint32 uint32_val; 128 EXPECT_FALSE(frame_reader.ReadUInt32(&uint32_val)); 129 130 // Also make sure that trying to read a uint16, which technically could work, 131 // fails immediately due to previously encountered failed read. 132 uint16 uint16_val; 133 EXPECT_FALSE(frame_reader.ReadUInt16(&uint16_val)); 134 } 135 136 // Tests ReadStringPiece16() with a buffer too small to fit the entire string. 137 TEST(SpdyFrameReaderTest, ReadStringPiece16WithBufferTooSmall) { 138 // Frame data in network byte order. 139 const char kFrameData[] = { 140 0x00, 0x03, // uint16(3) 141 0x48, 0x69, // "Hi" 142 }; 143 144 SpdyFrameReader frame_reader(kFrameData, arraysize(kFrameData)); 145 EXPECT_FALSE(frame_reader.IsDoneReading()); 146 147 base::StringPiece stringpiece_val; 148 EXPECT_FALSE(frame_reader.ReadStringPiece16(&stringpiece_val)); 149 150 // Also make sure that trying to read a uint16, which technically could work, 151 // fails immediately due to previously encountered failed read. 152 uint16 uint16_val; 153 EXPECT_FALSE(frame_reader.ReadUInt16(&uint16_val)); 154 } 155 156 // Tests ReadStringPiece16() with a buffer too small even to fit the length. 157 TEST(SpdyFrameReaderTest, ReadStringPiece16WithBufferWayTooSmall) { 158 // Frame data in network byte order. 159 const char kFrameData[] = { 160 0x00, // part of a uint16 161 }; 162 163 SpdyFrameReader frame_reader(kFrameData, arraysize(kFrameData)); 164 EXPECT_FALSE(frame_reader.IsDoneReading()); 165 166 base::StringPiece stringpiece_val; 167 EXPECT_FALSE(frame_reader.ReadStringPiece16(&stringpiece_val)); 168 169 // Also make sure that trying to read a uint16, which technically could work, 170 // fails immediately due to previously encountered failed read. 171 uint16 uint16_val; 172 EXPECT_FALSE(frame_reader.ReadUInt16(&uint16_val)); 173 } 174 175 // Tests ReadStringPiece32() with a buffer too small to fit the entire string. 176 TEST(SpdyFrameReaderTest, ReadStringPiece32WithBufferTooSmall) { 177 // Frame data in network byte order. 178 const char kFrameData[] = { 179 0x00, 0x00, 0x00, 0x03, // uint32(3) 180 0x48, 0x69, // "Hi" 181 }; 182 183 SpdyFrameReader frame_reader(kFrameData, arraysize(kFrameData)); 184 EXPECT_FALSE(frame_reader.IsDoneReading()); 185 186 base::StringPiece stringpiece_val; 187 EXPECT_FALSE(frame_reader.ReadStringPiece32(&stringpiece_val)); 188 189 // Also make sure that trying to read a uint16, which technically could work, 190 // fails immediately due to previously encountered failed read. 191 uint16 uint16_val; 192 EXPECT_FALSE(frame_reader.ReadUInt16(&uint16_val)); 193 } 194 195 // Tests ReadStringPiece32() with a buffer too small even to fit the length. 196 TEST(SpdyFrameReaderTest, ReadStringPiece32WithBufferWayTooSmall) { 197 // Frame data in network byte order. 198 const char kFrameData[] = { 199 0x00, 0x00, 0x00, // part of a uint32 200 }; 201 202 SpdyFrameReader frame_reader(kFrameData, arraysize(kFrameData)); 203 EXPECT_FALSE(frame_reader.IsDoneReading()); 204 205 base::StringPiece stringpiece_val; 206 EXPECT_FALSE(frame_reader.ReadStringPiece32(&stringpiece_val)); 207 208 // Also make sure that trying to read a uint16, which technically could work, 209 // fails immediately due to previously encountered failed read. 210 uint16 uint16_val; 211 EXPECT_FALSE(frame_reader.ReadUInt16(&uint16_val)); 212 } 213 214 TEST(SpdyFrameReaderTest, ReadBytes) { 215 // Frame data in network byte order. 216 const char kFrameData[] = { 217 0x66, 0x6f, 0x6f, // "foo" 218 0x48, 0x69, // "Hi" 219 }; 220 221 SpdyFrameReader frame_reader(kFrameData, arraysize(kFrameData)); 222 EXPECT_FALSE(frame_reader.IsDoneReading()); 223 224 char dest1[3] = {}; 225 EXPECT_TRUE(frame_reader.ReadBytes(&dest1, arraysize(dest1))); 226 EXPECT_FALSE(frame_reader.IsDoneReading()); 227 EXPECT_EQ("foo", base::StringPiece(dest1, arraysize(dest1))); 228 229 char dest2[2] = {}; 230 EXPECT_TRUE(frame_reader.ReadBytes(&dest2, arraysize(dest2))); 231 EXPECT_TRUE(frame_reader.IsDoneReading()); 232 EXPECT_EQ("Hi", base::StringPiece(dest2, arraysize(dest2))); 233 } 234 235 TEST(SpdyFrameReaderTest, ReadBytesWithBufferTooSmall) { 236 // Frame data in network byte order. 237 const char kFrameData[] = { 238 0x01, 239 }; 240 241 SpdyFrameReader frame_reader(kFrameData, arraysize(kFrameData)); 242 EXPECT_FALSE(frame_reader.IsDoneReading()); 243 244 char dest[arraysize(kFrameData) + 2] = {}; 245 EXPECT_FALSE(frame_reader.ReadBytes(&dest, arraysize(kFrameData) + 1)); 246 EXPECT_STREQ("", dest); 247 } 248 249 } // namespace net 250