| Index: net/spdy/spdy_network_transaction_unittest.cc
|
| diff --git a/net/spdy/spdy_network_transaction_unittest.cc b/net/spdy/spdy_network_transaction_unittest.cc
|
| index c6e1cb072d3274252e637d0b21dfe543201291de..15323c537905d48da0f6ee0879684b283f5c760e 100644
|
| --- a/net/spdy/spdy_network_transaction_unittest.cc
|
| +++ b/net/spdy/spdy_network_transaction_unittest.cc
|
| @@ -28,21 +28,6 @@
|
|
|
| namespace net {
|
|
|
| -// NOTE: In GCC, on a Mac, this can't be in an anonymous namespace!
|
| -// This struct holds information used to construct spdy control and data frames.
|
| -struct SpdyHeaderInfo {
|
| - int kind;
|
| - spdy::SpdyStreamId id;
|
| - spdy::SpdyStreamId assoc_id;
|
| - int priority;
|
| - spdy::SpdyControlFlags control_flags;
|
| - bool compressed;
|
| - int status;
|
| - const char* data;
|
| - uint32 data_length;
|
| - spdy::SpdyDataFlags data_flags;
|
| -};
|
| -
|
| namespace {
|
|
|
| // Helper to manage the lifetimes of the dependencies for a
|
| @@ -93,322 +78,6 @@ HttpNetworkSession* CreateSession(SessionDependencies* session_deps) {
|
| NULL);
|
| }
|
|
|
| -// Chop a frame into an array of MockWrites.
|
| -// |data| is the frame to chop.
|
| -// |length| is the length of the frame to chop.
|
| -// |num_chunks| is the number of chunks to create.
|
| -MockWrite* ChopFrame(const char* data, int length, int num_chunks) {
|
| - MockWrite* chunks = new MockWrite[num_chunks];
|
| - int chunk_size = length / num_chunks;
|
| - for (int index = 0; index < num_chunks; index++) {
|
| - const char* ptr = data + (index * chunk_size);
|
| - if (index == num_chunks - 1)
|
| - chunk_size += length % chunk_size; // The last chunk takes the remainder.
|
| - chunks[index] = MockWrite(true, ptr, chunk_size);
|
| - }
|
| - return chunks;
|
| -}
|
| -
|
| -// ----------------------------------------------------------------------------
|
| -
|
| -// Adds headers and values to a map.
|
| -// |extra_headers| is an array of { name, value } pairs, arranged as strings
|
| -// where the even entries are the header names, and the odd entries are the
|
| -// header values.
|
| -// |headers| gets filled in from |extra_headers|.
|
| -void AppendHeadersToSpdyFrame(const char* const extra_headers[],
|
| - int extra_header_count,
|
| - spdy::SpdyHeaderBlock* headers) {
|
| - std::string this_header;
|
| - std::string this_value;
|
| -
|
| - if (!extra_header_count)
|
| - return;
|
| -
|
| - // Sanity check: Non-NULL header list.
|
| - DCHECK(NULL != extra_headers) << "NULL header value pair list";
|
| - // Sanity check: Non-NULL header map.
|
| - DCHECK(NULL != headers) << "NULL header map";
|
| - // Copy in the headers.
|
| - for (int i = 0; i < extra_header_count; i++) {
|
| - // Sanity check: Non-empty header.
|
| - DCHECK_NE('\0', *extra_headers[i * 2]) << "Empty header value pair";
|
| - this_header = extra_headers[i * 2];
|
| - std::string::size_type header_len = this_header.length();
|
| - if (!header_len)
|
| - continue;
|
| - this_value = extra_headers[1 + (i * 2)];
|
| - std::string new_value;
|
| - if (headers->find(this_header) != headers->end()) {
|
| - // More than one entry in the header.
|
| - // Don't add the header again, just the append to the value,
|
| - // separated by a NULL character.
|
| -
|
| - // Adjust the value.
|
| - new_value = (*headers)[this_header];
|
| - // Put in a NULL separator.
|
| - new_value.append(1, '\0');
|
| - // Append the new value.
|
| - new_value += this_value;
|
| - } else {
|
| - // Not a duplicate, just write the value.
|
| - new_value = this_value;
|
| - }
|
| - (*headers)[this_header] = new_value;
|
| - }
|
| -}
|
| -
|
| -// Writes |str| of the given |len| to the buffer pointed to by |buffer_handle|.
|
| -// Uses a template so buffer_handle can be a char* or an unsigned char*.
|
| -// Updates the |*buffer_handle| pointer by |len|
|
| -// Returns the number of bytes written into *|buffer_handle|
|
| -template<class T>
|
| -int AppendToBuffer(const void* str,
|
| - int len,
|
| - T** buffer_handle,
|
| - int* buffer_len_remaining) {
|
| - if (len <= 0)
|
| - return 0;
|
| - DCHECK(NULL != buffer_handle) << "NULL buffer handle";
|
| - DCHECK(NULL != *buffer_handle) << "NULL pointer";
|
| - DCHECK(NULL != buffer_len_remaining)
|
| - << "NULL buffer remainder length pointer";
|
| - DCHECK_GE(*buffer_len_remaining, len) << "Insufficient buffer size";
|
| - memcpy(*buffer_handle, str, len);
|
| - *buffer_handle += len;
|
| - *buffer_len_remaining -= len;
|
| - return len;
|
| -}
|
| -
|
| -// Writes |val| to a location of size |len|, in big-endian format.
|
| -// in the buffer pointed to by |buffer_handle|.
|
| -// Updates the |*buffer_handle| pointer by |len|
|
| -// Returns the number of bytes written
|
| -int AppendToBuffer(int val,
|
| - int len,
|
| - unsigned char** buffer_handle,
|
| - int* buffer_len_remaining) {
|
| - if (len <= 0)
|
| - return 0;
|
| - DCHECK((size_t) len <= sizeof(len)) << "Data length too long for data type";
|
| - DCHECK(NULL != buffer_handle) << "NULL buffer handle";
|
| - DCHECK(NULL != *buffer_handle) << "NULL pointer";
|
| - DCHECK(NULL != buffer_len_remaining)
|
| - << "NULL buffer remainder length pointer";
|
| - DCHECK_GE(*buffer_len_remaining, len) << "Insufficient buffer size";
|
| - for (int i = 0; i < len; i++) {
|
| - int shift = (8 * (len - (i + 1)));
|
| - unsigned char val_chunk = (val >> shift) & 0x0FF;
|
| - *(*buffer_handle)++ = val_chunk;
|
| - *buffer_len_remaining += 1;
|
| - }
|
| - return len;
|
| -}
|
| -
|
| -// Construct a SPDY packet.
|
| -// |head| is the start of the packet, up to but not including
|
| -// the header value pairs.
|
| -// |extra_headers| are the extra header-value pairs, which typically
|
| -// will vary the most between calls.
|
| -// |tail| is any (relatively constant) header-value pairs to add.
|
| -// |buffer| is the buffer we're filling in.
|
| -// Returns a SpdFrame.
|
| -spdy::SpdyFrame* ConstructSpdyPacket(const SpdyHeaderInfo* header_info,
|
| - const char* const extra_headers[],
|
| - int extra_header_count,
|
| - const char* const tail[],
|
| - int tail_header_count) {
|
| - spdy::SpdyFramer framer;
|
| - spdy::SpdyHeaderBlock headers;
|
| - // Copy in the extra headers to our map.
|
| - AppendHeadersToSpdyFrame(extra_headers, extra_header_count, &headers);
|
| - // Copy in the tail headers to our map.
|
| - if (tail && tail_header_count)
|
| - AppendHeadersToSpdyFrame(tail, tail_header_count, &headers);
|
| - spdy::SpdyFrame* frame = NULL;
|
| - switch (header_info->kind) {
|
| - case spdy::SYN_STREAM:
|
| - frame = framer.CreateSynStream(header_info->id, header_info->assoc_id,
|
| - header_info->priority,
|
| - header_info->control_flags,
|
| - header_info->compressed, &headers);
|
| - break;
|
| - case spdy::SYN_REPLY:
|
| - frame = framer.CreateSynReply(header_info->id, header_info->control_flags,
|
| - header_info->compressed, &headers);
|
| - break;
|
| - case spdy::RST_STREAM:
|
| - frame = framer.CreateRstStream(header_info->id, header_info->status);
|
| - break;
|
| - default:
|
| - frame = framer.CreateDataFrame(header_info->id, header_info->data,
|
| - header_info->data_length,
|
| - header_info->data_flags);
|
| - break;
|
| - }
|
| - return frame;
|
| -}
|
| -
|
| -// Construct an expected SPDY reply string.
|
| -// |extra_headers| are the extra header-value pairs, which typically
|
| -// will vary the most between calls.
|
| -// |buffer| is the buffer we're filling in.
|
| -// Returns the number of bytes written into |buffer|.
|
| -int ConstructSpdyReply(const char* const extra_headers[],
|
| - int extra_header_count,
|
| - char* buffer,
|
| - int buffer_length) {
|
| - int packet_size = 0;
|
| - int header_count = 0;
|
| - char* buffer_write = buffer;
|
| - int buffer_left = buffer_length;
|
| - spdy::SpdyHeaderBlock headers;
|
| - if (!buffer || !buffer_length)
|
| - return 0;
|
| - // Copy in the extra headers.
|
| - AppendHeadersToSpdyFrame(extra_headers, extra_header_count, &headers);
|
| - header_count = headers.size();
|
| - // The iterator gets us the list of header/value pairs in sorted order.
|
| - spdy::SpdyHeaderBlock::iterator next = headers.begin();
|
| - spdy::SpdyHeaderBlock::iterator last = headers.end();
|
| - for ( ; next != last; ++next) {
|
| - // Write the header.
|
| - int value_len, current_len, offset;
|
| - const char* header_string = next->first.c_str();
|
| - packet_size += AppendToBuffer(header_string,
|
| - next->first.length(),
|
| - &buffer_write,
|
| - &buffer_left);
|
| - packet_size += AppendToBuffer(": ",
|
| - strlen(": "),
|
| - &buffer_write,
|
| - &buffer_left);
|
| - // Write the value(s).
|
| - const char* value_string = next->second.c_str();
|
| - // Check if it's split among two or more values.
|
| - value_len = next->second.length();
|
| - current_len = strlen(value_string);
|
| - offset = 0;
|
| - // Handle the first N-1 values.
|
| - while (current_len < value_len) {
|
| - // Finish this line -- write the current value.
|
| - packet_size += AppendToBuffer(value_string + offset,
|
| - current_len - offset,
|
| - &buffer_write,
|
| - &buffer_left);
|
| - packet_size += AppendToBuffer("\n",
|
| - strlen("\n"),
|
| - &buffer_write,
|
| - &buffer_left);
|
| - // Advance to next value.
|
| - offset = current_len + 1;
|
| - current_len += 1 + strlen(value_string + offset);
|
| - // Start another line -- add the header again.
|
| - packet_size += AppendToBuffer(header_string,
|
| - next->first.length(),
|
| - &buffer_write,
|
| - &buffer_left);
|
| - packet_size += AppendToBuffer(": ",
|
| - strlen(": "),
|
| - &buffer_write,
|
| - &buffer_left);
|
| - }
|
| - EXPECT_EQ(value_len, current_len);
|
| - // Copy the last (or only) value.
|
| - packet_size += AppendToBuffer(value_string + offset,
|
| - value_len - offset,
|
| - &buffer_write,
|
| - &buffer_left);
|
| - packet_size += AppendToBuffer("\n",
|
| - strlen("\n"),
|
| - &buffer_write,
|
| - &buffer_left);
|
| - }
|
| - return packet_size;
|
| -}
|
| -
|
| -// Construct an expected SPDY SETTINGS frame.
|
| -// |settings| are the settings to set.
|
| -// Returns the constructed frame. The caller takes ownership of the frame.
|
| -spdy::SpdyFrame* ConstructSpdySettings(spdy::SpdySettings settings) {
|
| - spdy::SpdyFramer framer;
|
| - return framer.CreateSettings(settings);
|
| -}
|
| -
|
| -// Construct a single SPDY header entry, for validation.
|
| -// |extra_headers| are the extra header-value pairs.
|
| -// |buffer| is the buffer we're filling in.
|
| -// |index| is the index of the header we want.
|
| -// Returns the number of bytes written into |buffer|.
|
| -int ConstructSpdyHeader(const char* const extra_headers[],
|
| - int extra_header_count,
|
| - char* buffer,
|
| - int buffer_length,
|
| - int index) {
|
| - const char* this_header = NULL;
|
| - const char* this_value = NULL;
|
| - if (!buffer || !buffer_length)
|
| - return 0;
|
| - *buffer = '\0';
|
| - // Sanity check: Non-empty header list.
|
| - DCHECK(NULL != extra_headers) << "NULL extra headers pointer";
|
| - // Sanity check: Index out of range.
|
| - DCHECK((index >= 0) && (index < extra_header_count))
|
| - << "Index " << index
|
| - << " out of range [0, " << extra_header_count << ")";
|
| - this_header = extra_headers[index * 2];
|
| - // Sanity check: Non-empty header.
|
| - if (!*this_header)
|
| - return 0;
|
| - std::string::size_type header_len = strlen(this_header);
|
| - if (!header_len)
|
| - return 0;
|
| - this_value = extra_headers[1 + (index * 2)];
|
| - // Sanity check: Non-empty value.
|
| - if (!*this_value)
|
| - this_value = "";
|
| - int n = base::snprintf(buffer,
|
| - buffer_length,
|
| - "%s: %s\r\n",
|
| - this_header,
|
| - this_value);
|
| - return n;
|
| -}
|
| -
|
| -// Constructs a standard SPDY GET packet.
|
| -// |extra_headers| are the extra header-value pairs, which typically
|
| -// will vary the most between calls.
|
| -// Returns a SpdFrame.
|
| -spdy::SpdyFrame* ConstructSpdyGet(const char* const extra_headers[],
|
| - int extra_header_count) {
|
| - SpdyHeaderInfo SynStartHeader = {
|
| - spdy::SYN_STREAM, // Kind = Syn
|
| - 1, // Stream ID
|
| - 0, // Associated stream ID
|
| - 3, // Priority
|
| - spdy::CONTROL_FLAG_FIN, // Control Flags
|
| - false, // Compressed
|
| - 200, // Status
|
| - NULL, // Data
|
| - 0, // Length
|
| - spdy::DATA_FLAG_NONE // Data Flags
|
| - };
|
| - static const char* const kStandardGetHeaders[] = {
|
| - "method",
|
| - "GET",
|
| - "url",
|
| - "http://www.google.com/",
|
| - "version",
|
| - "HTTP/1.1"
|
| - };
|
| - return ConstructSpdyPacket(
|
| - &SynStartHeader,
|
| - extra_headers,
|
| - extra_header_count,
|
| - kStandardGetHeaders,
|
| - arraysize(kStandardGetHeaders) / 2);
|
| -}
|
| -
|
| } // namespace
|
|
|
| class SpdyNetworkTransactionTest : public PlatformTest {
|
| @@ -524,14 +193,13 @@ TEST_F(SpdyNetworkTransactionTest, Constructor) {
|
| }
|
|
|
| TEST_F(SpdyNetworkTransactionTest, Get) {
|
| - MockWrite writes[] = {
|
| - MockWrite(true, reinterpret_cast<const char*>(kGetSyn),
|
| - arraysize(kGetSyn)),
|
| - };
|
| + // Construct the request.
|
| + scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0));
|
| + MockWrite writes[] = { CreateMockWrite(req.get()) };
|
|
|
| + scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0));
|
| MockRead reads[] = {
|
| - MockRead(true, reinterpret_cast<const char*>(kGetSynReply),
|
| - arraysize(kGetSynReply)),
|
| + CreateMockRead(resp.get()),
|
| MockRead(true, reinterpret_cast<const char*>(kGetBodyFrame),
|
| arraysize(kGetBodyFrame)),
|
| MockRead(true, 0, 0) // EOF
|
| @@ -591,7 +259,7 @@ TEST_F(SpdyNetworkTransactionTest, EmptyPost) {
|
| 0x01, 0x00, 0x00, 0x4a, // flags, len
|
| 0x00, 0x00, 0x00, 0x01, // stream id
|
| 0x00, 0x00, 0x00, 0x00, // associated
|
| - 0xc0, 0x00, 0x00, 0x03, // 4 headers
|
| + 0xc0, 0x00, 0x00, 0x03, // 3 headers
|
| 0x00, 0x06, 'm', 'e', 't', 'h', 'o', 'd',
|
| 0x00, 0x04, 'P', 'O', 'S', 'T',
|
| 0x00, 0x03, 'u', 'r', 'l',
|
| @@ -691,16 +359,13 @@ TEST_F(SpdyNetworkTransactionTest, ResponseWithTwoSynReplies) {
|
| // We disable SSL for this test.
|
| SpdySession::SetSSLMode(false);
|
|
|
| - MockWrite writes[] = {
|
| - MockWrite(true, reinterpret_cast<const char*>(kGetSyn),
|
| - arraysize(kGetSyn)),
|
| - };
|
| + scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0));
|
| + MockWrite writes[] = { CreateMockWrite(req.get()) };
|
|
|
| + scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0));
|
| MockRead reads[] = {
|
| - MockRead(true, reinterpret_cast<const char*>(kGetSynReply),
|
| - arraysize(kGetSynReply)),
|
| - MockRead(true, reinterpret_cast<const char*>(kGetSynReply),
|
| - arraysize(kGetSynReply)),
|
| + CreateMockRead(resp.get()),
|
| + CreateMockRead(resp.get()),
|
| MockRead(true, reinterpret_cast<const char*>(kGetBodyFrame),
|
| arraysize(kGetBodyFrame)),
|
| MockRead(true, 0, 0) // EOF
|
| @@ -733,15 +398,16 @@ TEST_F(SpdyNetworkTransactionTest, ResponseWithTwoSynReplies) {
|
| }
|
|
|
| TEST_F(SpdyNetworkTransactionTest, CancelledTransaction) {
|
| + // Construct the request.
|
| + scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0));
|
| MockWrite writes[] = {
|
| - MockWrite(true, reinterpret_cast<const char*>(kGetSyn),
|
| - arraysize(kGetSyn)),
|
| + CreateMockWrite(req.get()),
|
| MockRead(true, 0, 0) // EOF
|
| };
|
|
|
| + scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0));
|
| MockRead reads[] = {
|
| - MockRead(true, reinterpret_cast<const char*>(kGetSynReply),
|
| - arraysize(kGetSynReply)),
|
| + CreateMockRead(resp.get()),
|
| // This following read isn't used by the test, except during the
|
| // RunAllPending() call at the end since the SpdySession survives the
|
| // SpdyNetworkTransaction and still tries to continue Read()'ing. Any
|
| @@ -791,14 +457,12 @@ class DeleteSessionCallback : public CallbackRunner< Tuple1<int> > {
|
| // transaction. Failures will usually be valgrind errors. See
|
| // http://crbug.com/46925
|
| TEST_F(SpdyNetworkTransactionTest, DeleteSessionOnReadCallback) {
|
| - MockWrite writes[] = {
|
| - MockWrite(true, reinterpret_cast<const char*>(kGetSyn),
|
| - arraysize(kGetSyn), 1),
|
| - };
|
| + scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0));
|
| + MockWrite writes[] = { CreateMockWrite(req.get()) };
|
|
|
| + scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0));
|
| MockRead reads[] = {
|
| - MockRead(true, reinterpret_cast<const char*>(kGetSynReply),
|
| - arraysize(kGetSynReply), 2),
|
| + CreateMockRead(resp.get(), 2),
|
| MockRead(true, ERR_IO_PENDING, 3), // Force a pause
|
| MockRead(true, reinterpret_cast<const char*>(kGetBodyFrame),
|
| arraysize(kGetBodyFrame), 4),
|
| @@ -921,10 +585,8 @@ TEST_F(SpdyNetworkTransactionTest, SynReplyHeaders) {
|
| };
|
|
|
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) {
|
| - MockWrite writes[] = {
|
| - MockWrite(true, reinterpret_cast<const char*>(kGetSyn),
|
| - arraysize(kGetSyn)),
|
| - };
|
| + scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0));
|
| + MockWrite writes[] = { CreateMockWrite(req.get()) };
|
|
|
| MockRead reads[] = {
|
| MockRead(true, reinterpret_cast<const char*>(test_cases[i].syn_reply),
|
| @@ -965,10 +627,10 @@ TEST_F(SpdyNetworkTransactionTest, SynReplyHeadersVary) {
|
| spdy::SYN_REPLY, // Syn Reply
|
| 1, // Stream ID
|
| 0, // Associated Stream ID
|
| - 3, // Priority
|
| + SPDY_PRIORITY_LOWEST, // Priority
|
| spdy::CONTROL_FLAG_NONE, // Control Flags
|
| false, // Compressed
|
| - 200, // Status
|
| + spdy::INVALID, // Status
|
| NULL, // Data
|
| 0, // Data Length
|
| spdy::DATA_FLAG_NONE // Data Flags
|
| @@ -1051,10 +713,7 @@ TEST_F(SpdyNetworkTransactionTest, SynReplyHeadersVary) {
|
| test_cases[i].num_headers[0]));
|
|
|
| MockWrite writes[] = {
|
| - MockWrite(
|
| - true,
|
| - frame_req->data(),
|
| - frame_req->length() + spdy::SpdyFrame::size()),
|
| + CreateMockWrite(frame_req.get()),
|
| };
|
|
|
| // Construct the reply.
|
| @@ -1066,9 +725,7 @@ TEST_F(SpdyNetworkTransactionTest, SynReplyHeadersVary) {
|
| 0));
|
|
|
| MockRead reads[] = {
|
| - MockRead(true,
|
| - frame_reply->data(),
|
| - frame_reply->length() + spdy::SpdyFrame::size()),
|
| + CreateMockRead(frame_reply.get()),
|
| MockRead(true,
|
| reinterpret_cast<const char*>(kGetBodyFrame),
|
| arraysize(kGetBodyFrame)),
|
| @@ -1121,10 +778,10 @@ TEST_F(SpdyNetworkTransactionTest, SynReplyHeadersVary) {
|
|
|
| // Construct the expected header reply string.
|
| char reply_buffer[256] = "";
|
| - ConstructSpdyReply(test_cases[i].extra_headers[1],
|
| - test_cases[i].num_headers[1],
|
| - reply_buffer,
|
| - 256);
|
| + ConstructSpdyReplyString(test_cases[i].extra_headers[1],
|
| + test_cases[i].num_headers[1],
|
| + reply_buffer,
|
| + 256);
|
|
|
| EXPECT_EQ(std::string(reply_buffer), lines) << i;
|
| }
|
| @@ -1166,9 +823,9 @@ TEST_F(SpdyNetworkTransactionTest, InvalidSynReply) {
|
| };
|
|
|
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) {
|
| + scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0));
|
| MockWrite writes[] = {
|
| - MockWrite(true, reinterpret_cast<const char*>(kGetSyn),
|
| - arraysize(kGetSyn)),
|
| + CreateMockWrite(req.get()),
|
| MockWrite(true, 0, 0) // EOF
|
| };
|
|
|
| @@ -1211,9 +868,9 @@ TEST_F(SpdyNetworkTransactionTest, CorruptFrameSessionError) {
|
| };
|
|
|
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) {
|
| + scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0));
|
| MockWrite writes[] = {
|
| - MockWrite(true, reinterpret_cast<const char*>(kGetSyn),
|
| - arraysize(kGetSyn)),
|
| + CreateMockWrite(req.get()),
|
| MockWrite(true, 0, 0) // EOF
|
| };
|
|
|
| @@ -1398,10 +1055,8 @@ TEST_F(SpdyNetworkTransactionTest, ServerPush) {
|
| const char syn_body_data2[] = "hello my darling hello my baby";
|
| const char* syn_body_data = NULL;
|
|
|
| - MockWrite writes[] = {
|
| - MockWrite(true, reinterpret_cast<const char*>(kGetSyn),
|
| - arraysize(kGetSyn)),
|
| - };
|
| + scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0));
|
| + MockWrite writes[] = { CreateMockWrite(req.get()) };
|
|
|
| // This array is for request before and after push is received. The push
|
| // body is only one 'packet', to allow the initial transaction to read all
|
| @@ -1552,17 +1207,18 @@ TEST_F(SpdyNetworkTransactionTest, ServerPush) {
|
|
|
| // Test that we shutdown correctly on write errors.
|
| TEST_F(SpdyNetworkTransactionTest, WriteError) {
|
| + scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0));
|
| MockWrite writes[] = {
|
| // We'll write 10 bytes successfully
|
| - MockWrite(true, reinterpret_cast<const char*>(kGetSyn), 10),
|
| + MockWrite(true, req->data(), 10),
|
| // Followed by ERROR!
|
| MockWrite(true, ERR_FAILED),
|
| MockWrite(true, 0, 0) // EOF
|
| };
|
|
|
| + scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0));
|
| MockRead reads[] = {
|
| - MockRead(true, reinterpret_cast<const char*>(kGetSynReply),
|
| - arraysize(kGetSynReply)),
|
| + CreateMockRead(resp.get(), 2),
|
| MockRead(true, reinterpret_cast<const char*>(kGetBodyFrame),
|
| arraysize(kGetBodyFrame)),
|
| MockRead(true, 0, 0) // EOF
|
| @@ -1581,13 +1237,13 @@ TEST_F(SpdyNetworkTransactionTest, WriteError) {
|
| // Test that partial writes work.
|
| TEST_F(SpdyNetworkTransactionTest, PartialWrite) {
|
| // Chop the SYN_STREAM frame into 5 chunks.
|
| + scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0));
|
| const int kChunks = 5;
|
| - scoped_array<MockWrite> writes(ChopFrame(
|
| - reinterpret_cast<const char*>(kGetSyn), arraysize(kGetSyn), kChunks));
|
| + scoped_array<MockWrite> writes(ChopFrame(req.get(), kChunks));
|
|
|
| + scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0));
|
| MockRead reads[] = {
|
| - MockRead(true, reinterpret_cast<const char*>(kGetSynReply),
|
| - arraysize(kGetSynReply)),
|
| + CreateMockRead(resp.get()),
|
| MockRead(true, reinterpret_cast<const char*>(kGetBodyFrame),
|
| arraysize(kGetBodyFrame)),
|
| MockRead(true, 0, 0) // EOF
|
| @@ -1613,15 +1269,15 @@ TEST_F(SpdyNetworkTransactionTest, ConnectFailure) {
|
| };
|
|
|
| for (size_t index = 0; index < arraysize(connects); ++index) {
|
| + scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0));
|
| MockWrite writes[] = {
|
| - MockWrite(true, reinterpret_cast<const char*>(kGetSyn),
|
| - arraysize(kGetSyn)),
|
| + CreateMockWrite(req.get()),
|
| MockWrite(true, 0, 0) // EOF
|
| };
|
|
|
| + scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0));
|
| MockRead reads[] = {
|
| - MockRead(true, reinterpret_cast<const char*>(kGetSynReply),
|
| - arraysize(kGetSynReply)),
|
| + CreateMockRead(resp.get()),
|
| MockRead(true, reinterpret_cast<const char*>(kGetBodyFrame),
|
| arraysize(kGetBodyFrame)),
|
| MockRead(true, 0, 0) // EOF
|
| @@ -1646,9 +1302,9 @@ TEST_F(SpdyNetworkTransactionTest, DecompressFailureOnSynReply) {
|
| MockWrite(true, 0, 0) // EOF
|
| };
|
|
|
| + scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0));
|
| MockRead reads[] = {
|
| - MockRead(true, reinterpret_cast<const char*>(kGetSynReply),
|
| - arraysize(kGetSynReply)),
|
| + CreateMockRead(resp.get()),
|
| MockRead(true, reinterpret_cast<const char*>(kGetBodyFrame),
|
| arraysize(kGetBodyFrame)),
|
| MockRead(true, 0, 0) // EOF
|
| @@ -1671,14 +1327,12 @@ TEST_F(SpdyNetworkTransactionTest, DecompressFailureOnSynReply) {
|
|
|
| // Test that the NetLog contains good data for a simple GET request.
|
| TEST_F(SpdyNetworkTransactionTest, NetLog) {
|
| - MockWrite writes[] = {
|
| - MockWrite(true, reinterpret_cast<const char*>(kGetSyn),
|
| - arraysize(kGetSyn)),
|
| - };
|
| + scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0));
|
| + MockWrite writes[] = { CreateMockWrite(req.get()) };
|
|
|
| + scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0));
|
| MockRead reads[] = {
|
| - MockRead(true, reinterpret_cast<const char*>(kGetSynReply),
|
| - arraysize(kGetSynReply)),
|
| + CreateMockRead(resp.get()),
|
| MockRead(true, reinterpret_cast<const char*>(kGetBodyFrame),
|
| arraysize(kGetBodyFrame)),
|
| MockRead(true, 0, 0) // EOF
|
| @@ -1734,10 +1388,8 @@ TEST_F(SpdyNetworkTransactionTest, NetLog) {
|
| // on the network, but issued a Read for only 5 of those bytes) that the data
|
| // flow still works correctly.
|
| TEST_F(SpdyNetworkTransactionTest, BufferFull) {
|
| - MockWrite writes[] = {
|
| - MockWrite(true, reinterpret_cast<const char*>(kGetSyn),
|
| - arraysize(kGetSyn)),
|
| - };
|
| + scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0));
|
| + MockWrite writes[] = { CreateMockWrite(req.get()) };
|
|
|
| static const unsigned char kCombinedDataFrames[] = {
|
| 0x00, 0x00, 0x00, 0x01, // header
|
| @@ -1754,9 +1406,9 @@ TEST_F(SpdyNetworkTransactionTest, BufferFull) {
|
| 'd',
|
| };
|
|
|
| + scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0));
|
| MockRead reads[] = {
|
| - MockRead(true, reinterpret_cast<const char*>(kGetSynReply),
|
| - arraysize(kGetSynReply)),
|
| + CreateMockRead(resp.get()),
|
| MockRead(true, ERR_IO_PENDING), // Force a pause
|
| MockRead(true, reinterpret_cast<const char*>(kCombinedDataFrames),
|
| arraysize(kCombinedDataFrames)),
|
| @@ -1838,10 +1490,8 @@ TEST_F(SpdyNetworkTransactionTest, BufferFull) {
|
| // at the same time, ensure that we don't notify a read completion for
|
| // each data frame individually.
|
| TEST_F(SpdyNetworkTransactionTest, Buffering) {
|
| - MockWrite writes[] = {
|
| - MockWrite(true, reinterpret_cast<const char*>(kGetSyn),
|
| - arraysize(kGetSyn)),
|
| - };
|
| + scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0));
|
| + MockWrite writes[] = { CreateMockWrite(req.get()) };
|
|
|
| // 4 data frames in a single read.
|
| static const unsigned char kCombinedDataFrames[] = {
|
| @@ -1859,9 +1509,9 @@ TEST_F(SpdyNetworkTransactionTest, Buffering) {
|
| 'm', 'e', 's', 's', 'a', 'g', 'e',
|
| };
|
|
|
| + scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0));
|
| MockRead reads[] = {
|
| - MockRead(true, reinterpret_cast<const char*>(kGetSynReply),
|
| - arraysize(kGetSynReply)),
|
| + CreateMockRead(resp.get()),
|
| MockRead(true, ERR_IO_PENDING), // Force a pause
|
| MockRead(true, reinterpret_cast<const char*>(kCombinedDataFrames),
|
| arraysize(kCombinedDataFrames)),
|
| @@ -1942,10 +1592,8 @@ TEST_F(SpdyNetworkTransactionTest, Buffering) {
|
|
|
| // Verify the case where we buffer data but read it after it has been buffered.
|
| TEST_F(SpdyNetworkTransactionTest, BufferedAll) {
|
| - MockWrite writes[] = {
|
| - MockWrite(true, reinterpret_cast<const char*>(kGetSyn),
|
| - arraysize(kGetSyn)),
|
| - };
|
| + scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0));
|
| + MockWrite writes[] = { CreateMockWrite(req.get()) };
|
|
|
| // The Syn Reply and all data frames in a single read.
|
| static const unsigned char kCombinedFrames[] = {
|
| @@ -2051,10 +1699,8 @@ TEST_F(SpdyNetworkTransactionTest, BufferedAll) {
|
|
|
| // Verify the case where we buffer data and close the connection.
|
| TEST_F(SpdyNetworkTransactionTest, BufferedClosed) {
|
| - MockWrite writes[] = {
|
| - MockWrite(true, reinterpret_cast<const char*>(kGetSyn),
|
| - arraysize(kGetSyn)),
|
| - };
|
| + scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0));
|
| + MockWrite writes[] = { CreateMockWrite(req.get()) };
|
|
|
| // All data frames in a single read.
|
| static const unsigned char kCombinedFrames[] = {
|
| @@ -2073,9 +1719,9 @@ TEST_F(SpdyNetworkTransactionTest, BufferedClosed) {
|
| // NOTE: We didn't FIN the stream.
|
| };
|
|
|
| + scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0));
|
| MockRead reads[] = {
|
| - MockRead(true, reinterpret_cast<const char*>(kGetSynReply),
|
| - arraysize(kGetSynReply)),
|
| + CreateMockRead(resp.get()),
|
| MockRead(true, ERR_IO_PENDING), // Force a wait
|
| MockRead(true, reinterpret_cast<const char*>(kCombinedFrames),
|
| arraysize(kCombinedFrames)),
|
| @@ -2153,10 +1799,8 @@ TEST_F(SpdyNetworkTransactionTest, BufferedClosed) {
|
|
|
| // Verify the case where we buffer data and cancel the transaction.
|
| TEST_F(SpdyNetworkTransactionTest, BufferedCancelled) {
|
| - MockWrite writes[] = {
|
| - MockWrite(true, reinterpret_cast<const char*>(kGetSyn),
|
| - arraysize(kGetSyn)),
|
| - };
|
| + scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0));
|
| + MockWrite writes[] = { CreateMockWrite(req.get()) };
|
|
|
| static const unsigned char kDataFrame[] = {
|
| 0x00, 0x00, 0x00, 0x01, // header
|
| @@ -2165,9 +1809,9 @@ TEST_F(SpdyNetworkTransactionTest, BufferedCancelled) {
|
| // NOTE: We didn't FIN the stream.
|
| };
|
|
|
| + scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0));
|
| MockRead reads[] = {
|
| - MockRead(true, reinterpret_cast<const char*>(kGetSynReply),
|
| - arraysize(kGetSynReply)),
|
| + CreateMockRead(resp.get()),
|
| MockRead(true, ERR_IO_PENDING), // Force a wait
|
| MockRead(true, reinterpret_cast<const char*>(kDataFrame),
|
| arraysize(kDataFrame)),
|
| @@ -2236,10 +1880,10 @@ TEST_F(SpdyNetworkTransactionTest, SettingsSaved) {
|
| spdy::SYN_REPLY, // Syn Reply
|
| 1, // Stream ID
|
| 0, // Associated Stream ID
|
| - 3, // Priority
|
| + SPDY_PRIORITY_LOWEST, // Priority
|
| spdy::CONTROL_FLAG_NONE, // Control Flags
|
| false, // Compressed
|
| - 200, // Status
|
| + spdy::INVALID, // Status
|
| NULL, // Data
|
| 0, // Data Length
|
| spdy::DATA_FLAG_NONE // Data Flags
|
| @@ -2258,10 +1902,7 @@ TEST_F(SpdyNetworkTransactionTest, SettingsSaved) {
|
|
|
| // Construct the request.
|
| scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0));
|
| -
|
| - MockWrite writes[] = {
|
| - MockWrite(true, req->data(), req->length() + spdy::SpdyFrame::size()),
|
| - };
|
| + MockWrite writes[] = { CreateMockWrite(req.get()) };
|
|
|
| // Construct the reply.
|
| scoped_ptr<spdy::SpdyFrame> reply(
|
| @@ -2298,11 +1939,10 @@ TEST_F(SpdyNetworkTransactionTest, SettingsSaved) {
|
| }
|
|
|
| MockRead reads[] = {
|
| - MockRead(true, reply->data(), reply->length() + spdy::SpdyFrame::size()),
|
| + CreateMockRead(reply.get()),
|
| MockRead(true, reinterpret_cast<const char*>(kGetBodyFrame),
|
| arraysize(kGetBodyFrame)),
|
| - MockRead(true, settings_frame->data(),
|
| - settings_frame->length() + spdy::SpdyFrame::size()),
|
| + CreateMockRead(settings_frame.get()),
|
| MockRead(true, 0, 0) // EOF
|
| };
|
|
|
| @@ -2345,10 +1985,10 @@ TEST_F(SpdyNetworkTransactionTest, SettingsPlayback) {
|
| spdy::SYN_REPLY, // Syn Reply
|
| 1, // Stream ID
|
| 0, // Associated Stream ID
|
| - 3, // Priority
|
| + SPDY_PRIORITY_LOWEST, // Priority
|
| spdy::CONTROL_FLAG_NONE, // Control Flags
|
| false, // Compressed
|
| - 200, // Status
|
| + spdy::INVALID, // Status
|
| NULL, // Data
|
| 0, // Data Length
|
| spdy::DATA_FLAG_NONE // Data Flags
|
| @@ -2396,9 +2036,8 @@ TEST_F(SpdyNetworkTransactionTest, SettingsPlayback) {
|
| scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0));
|
|
|
| MockWrite writes[] = {
|
| - MockWrite(true, settings_frame->data(),
|
| - settings_frame->length() + spdy::SpdyFrame::size()),
|
| - MockWrite(true, req->data(), req->length() + spdy::SpdyFrame::size()),
|
| + CreateMockWrite(settings_frame.get()),
|
| + CreateMockWrite(req.get()),
|
| };
|
|
|
| // Construct the reply.
|
| @@ -2410,7 +2049,7 @@ TEST_F(SpdyNetworkTransactionTest, SettingsPlayback) {
|
| 0));
|
|
|
| MockRead reads[] = {
|
| - MockRead(true, reply->data(), reply->length() + spdy::SpdyFrame::size()),
|
| + CreateMockRead(reply.get()),
|
| MockRead(true, reinterpret_cast<const char*>(kGetBodyFrame),
|
| arraysize(kGetBodyFrame)),
|
| MockRead(true, 0, 0) // EOF
|
| @@ -2449,10 +2088,8 @@ TEST_F(SpdyNetworkTransactionTest, SettingsPlayback) {
|
| }
|
|
|
| TEST_F(SpdyNetworkTransactionTest, GoAwayWithActiveStream) {
|
| - MockWrite writes[] = {
|
| - MockWrite(true, reinterpret_cast<const char*>(kGetSyn),
|
| - arraysize(kGetSyn)),
|
| - };
|
| + scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0));
|
| + MockWrite writes[] = { CreateMockWrite(req.get()) };
|
|
|
| MockRead reads[] = {
|
| MockRead(true, reinterpret_cast<const char*>(kGoAway),
|
| @@ -2470,14 +2107,12 @@ TEST_F(SpdyNetworkTransactionTest, GoAwayWithActiveStream) {
|
| }
|
|
|
| TEST_F(SpdyNetworkTransactionTest, CloseWithActiveStream) {
|
| - MockWrite writes[] = {
|
| - MockWrite(true, reinterpret_cast<const char*>(kGetSyn),
|
| - arraysize(kGetSyn)),
|
| - };
|
| + scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0));
|
| + MockWrite writes[] = { CreateMockWrite(req.get()) };
|
|
|
| + scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0));
|
| MockRead reads[] = {
|
| - MockRead(true, reinterpret_cast<const char*>(kGetSynReply),
|
| - arraysize(kGetSynReply)),
|
| + CreateMockRead(resp.get()),
|
| MockRead(false, 0, 0) // EOF
|
| };
|
|
|
|
|