Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(105)

Side by Side Diff: net/socket/ssl_server_socket_unittest.cc

Issue 396003002: Fix buffer reuse bug in SSLServerSocket tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // This test suite uses SSLClientSocket to test the implementation of 5 // This test suite uses SSLClientSocket to test the implementation of
6 // SSLServerSocket. In order to establish connections between the sockets 6 // SSLServerSocket. In order to establish connections between the sockets
7 // we need two additional classes: 7 // we need two additional classes:
8 // 1. FakeSocket 8 // 1. FakeSocket
9 // Connects SSL socket to FakeDataChannel. This class is just a stub. 9 // Connects SSL socket to FakeDataChannel. This class is just a stub.
10 // 10 //
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 class FakeDataChannel { 55 class FakeDataChannel {
56 public: 56 public:
57 FakeDataChannel() 57 FakeDataChannel()
58 : read_buf_len_(0), 58 : read_buf_len_(0),
59 closed_(false), 59 closed_(false),
60 write_called_after_close_(false), 60 write_called_after_close_(false),
61 weak_factory_(this) { 61 weak_factory_(this) {
62 } 62 }
63 63
64 int Read(IOBuffer* buf, int buf_len, const CompletionCallback& callback) { 64 int Read(IOBuffer* buf, int buf_len, const CompletionCallback& callback) {
65 DCHECK(read_callback_.is_null());
66 DCHECK(!read_buf_);
65 if (closed_) 67 if (closed_)
66 return 0; 68 return 0;
67 if (data_.empty()) { 69 if (data_.empty()) {
68 read_callback_ = callback; 70 read_callback_ = callback;
69 read_buf_ = buf; 71 read_buf_ = buf;
70 read_buf_len_ = buf_len; 72 read_buf_len_ = buf_len;
71 return net::ERR_IO_PENDING; 73 return net::ERR_IO_PENDING;
Ryan Sleevi 2014/07/15 20:09:53 I'll send you a cookie* if you want to grab a foll
72 } 74 }
73 return PropogateData(buf, buf_len); 75 return PropogateData(buf, buf_len);
74 } 76 }
75 77
76 int Write(IOBuffer* buf, int buf_len, const CompletionCallback& callback) { 78 int Write(IOBuffer* buf, int buf_len, const CompletionCallback& callback) {
79 DCHECK(write_callback_.is_null());
77 if (closed_) { 80 if (closed_) {
78 if (write_called_after_close_) 81 if (write_called_after_close_)
79 return net::ERR_CONNECTION_RESET; 82 return net::ERR_CONNECTION_RESET;
80 write_called_after_close_ = true; 83 write_called_after_close_ = true;
81 write_callback_ = callback; 84 write_callback_ = callback;
82 base::MessageLoop::current()->PostTask( 85 base::MessageLoop::current()->PostTask(
83 FROM_HERE, base::Bind(&FakeDataChannel::DoWriteCallback, 86 FROM_HERE, base::Bind(&FakeDataChannel::DoWriteCallback,
84 weak_factory_.GetWeakPtr())); 87 weak_factory_.GetWeakPtr()));
85 return net::ERR_IO_PENDING; 88 return net::ERR_IO_PENDING;
86 } 89 }
87 data_.push(new net::DrainableIOBuffer(buf, buf_len)); 90 // This function returns synchronously, so make a copy of the buffer.
91 data_.push(new net::DrainableIOBuffer(
92 new net::StringIOBuffer(std::string(buf->data(), buf_len)),
93 buf_len));
88 base::MessageLoop::current()->PostTask( 94 base::MessageLoop::current()->PostTask(
89 FROM_HERE, base::Bind(&FakeDataChannel::DoReadCallback, 95 FROM_HERE, base::Bind(&FakeDataChannel::DoReadCallback,
90 weak_factory_.GetWeakPtr())); 96 weak_factory_.GetWeakPtr()));
91 return buf_len; 97 return buf_len;
92 } 98 }
93 99
94 // Closes the FakeDataChannel. After Close() is called, Read() returns 0, 100 // Closes the FakeDataChannel. After Close() is called, Read() returns 0,
95 // indicating EOF, and Write() fails with ERR_CONNECTION_RESET. Note that 101 // indicating EOF, and Write() fails with ERR_CONNECTION_RESET. Note that
96 // after the FakeDataChannel is closed, the first Write() call completes 102 // after the FakeDataChannel is closed, the first Write() call completes
97 // asynchronously, which is necessary to reproduce bug 127822. 103 // asynchronously, which is necessary to reproduce bug 127822.
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after
470 EXPECT_TRUE(server_ret > 0 || server_ret == net::ERR_IO_PENDING); 476 EXPECT_TRUE(server_ret > 0 || server_ret == net::ERR_IO_PENDING);
471 server_ret = read_callback.GetResult(server_ret); 477 server_ret = read_callback.GetResult(server_ret);
472 ASSERT_GT(server_ret, 0); 478 ASSERT_GT(server_ret, 0);
473 read_buf->DidConsume(server_ret); 479 read_buf->DidConsume(server_ret);
474 } 480 }
475 EXPECT_EQ(write_buf->size(), read_buf->BytesConsumed()); 481 EXPECT_EQ(write_buf->size(), read_buf->BytesConsumed());
476 read_buf->SetOffset(0); 482 read_buf->SetOffset(0);
477 EXPECT_EQ(0, memcmp(write_buf->data(), read_buf->data(), write_buf->size())); 483 EXPECT_EQ(0, memcmp(write_buf->data(), read_buf->data(), write_buf->size()));
478 } 484 }
479 485
480 // Flaky on Android: http://crbug.com/381147
481 #if defined(OS_ANDROID)
482 #define MAYBE_ClientWriteAfterServerClose DISABLED_ClientWriteAfterServerClose
483 #else
484 #define MAYBE_ClientWriteAfterServerClose ClientWriteAfterServerClose
485 #endif
486 // A regression test for bug 127822 (http://crbug.com/127822). 486 // A regression test for bug 127822 (http://crbug.com/127822).
487 // If the server closes the connection after the handshake is finished, 487 // If the server closes the connection after the handshake is finished,
488 // the client's Write() call should not cause an infinite loop. 488 // the client's Write() call should not cause an infinite loop.
489 // NOTE: this is a test for SSLClientSocket rather than SSLServerSocket. 489 // NOTE: this is a test for SSLClientSocket rather than SSLServerSocket.
490 TEST_F(SSLServerSocketTest, MAYBE_ClientWriteAfterServerClose) { 490 TEST_F(SSLServerSocketTest, ClientWriteAfterServerClose) {
491 Initialize(); 491 Initialize();
492 492
493 TestCompletionCallback connect_callback; 493 TestCompletionCallback connect_callback;
494 TestCompletionCallback handshake_callback; 494 TestCompletionCallback handshake_callback;
495 495
496 // Establish connection. 496 // Establish connection.
497 int client_ret = client_socket_->Connect(connect_callback.callback()); 497 int client_ret = client_socket_->Connect(connect_callback.callback());
498 ASSERT_TRUE(client_ret == net::OK || client_ret == net::ERR_IO_PENDING); 498 ASSERT_TRUE(client_ret == net::OK || client_ret == net::ERR_IO_PENDING);
499 499
500 int server_ret = server_socket_->Handshake(handshake_callback.callback()); 500 int server_ret = server_socket_->Handshake(handshake_callback.callback());
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
578 const char* kKeyingLabelBad = "EXPERIMENTAL-server-socket-test-bad"; 578 const char* kKeyingLabelBad = "EXPERIMENTAL-server-socket-test-bad";
579 unsigned char client_bad[kKeyingMaterialSize]; 579 unsigned char client_bad[kKeyingMaterialSize];
580 rv = client_socket_->ExportKeyingMaterial(kKeyingLabelBad, 580 rv = client_socket_->ExportKeyingMaterial(kKeyingLabelBad,
581 false, kKeyingContext, 581 false, kKeyingContext,
582 client_bad, sizeof(client_bad)); 582 client_bad, sizeof(client_bad));
583 ASSERT_EQ(rv, net::OK); 583 ASSERT_EQ(rv, net::OK);
584 EXPECT_NE(0, memcmp(server_out, client_bad, sizeof(server_out))); 584 EXPECT_NE(0, memcmp(server_out, client_bad, sizeof(server_out)));
585 } 585 }
586 586
587 } // namespace net 587 } // namespace net
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698