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

Unified Diff: extensions/browser/api/cast_channel/cast_socket_unittest.cc

Issue 408633002: Fix error handling for message parse errors that occur during connection setup. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Merging in changes 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « extensions/browser/api/cast_channel/cast_socket.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: extensions/browser/api/cast_channel/cast_socket_unittest.cc
diff --git a/extensions/browser/api/cast_channel/cast_socket_unittest.cc b/extensions/browser/api/cast_channel/cast_socket_unittest.cc
index 6abaf35ca673123a619124b8eb03cd5eb5123886..b42860a26ff676ef950ff61aafe038435bced144 100644
--- a/extensions/browser/api/cast_channel/cast_socket_unittest.cc
+++ b/extensions/browser/api/cast_channel/cast_socket_unittest.cc
@@ -173,6 +173,7 @@ class TestCastSocket : public CastSocket {
connect_index_(0),
extract_cert_result_(true),
verify_challenge_result_(true),
+ verify_challenge_disallow_(false),
tcp_unresponsive_(false),
mock_timer_(new base::MockTimer(false, false)) {}
@@ -267,6 +268,8 @@ class TestCastSocket : public CastSocket {
mock_timer_->Fire();
}
+ void DisallowVerifyChallengeResult() { verify_challenge_disallow_ = true; }
+
private:
virtual scoped_ptr<net::TCPClientSocket> CreateTcpSocket() OVERRIDE {
if (tcp_unresponsive_) {
@@ -300,6 +303,7 @@ class TestCastSocket : public CastSocket {
}
virtual bool VerifyChallengeReply() OVERRIDE {
+ EXPECT_EQ(false, verify_challenge_disallow_);
return verify_challenge_result_;
}
@@ -322,6 +326,7 @@ class TestCastSocket : public CastSocket {
bool extract_cert_result_;
// Simulated result of verifying challenge reply.
bool verify_challenge_result_;
+ bool verify_challenge_disallow_;
// If true, makes TCP connection process stall. For timeout testing.
bool tcp_unresponsive_;
scoped_ptr<base::MockTimer> mock_timer_;
@@ -341,7 +346,18 @@ class CastSocketTest : public testing::Test {
test_messages_[i], &test_protos_[i]));
ASSERT_TRUE(CastSocket::Serialize(test_protos_[i], &test_proto_strs_[i]));
}
+ }
+ virtual void TearDown() OVERRIDE {
+ EXPECT_CALL(handler_, OnCloseComplete(net::OK));
+ socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete,
+ base::Unretained(&handler_)));
+ }
+
+ // The caller can specify non-standard namespaces by setting "auth_namespace"
+ // (useful for negative test cases.)
+ void SetupAuthMessage(
+ const char* auth_namespace = "urn:x-cast:com.google.cast.tp.deviceauth") {
// Create a test auth request.
CastMessage request;
CreateAuthChallengeMessage(&request);
@@ -349,22 +365,13 @@ class CastSocketTest : public testing::Test {
// Create a test auth reply.
MessageInfo reply;
- CreateBinaryMessage("urn:x-cast:com.google.cast.tp.deviceauth",
- "sender-0",
- "receiver-0",
- "abcd",
- &reply);
+ CreateBinaryMessage(
+ auth_namespace, "sender-0", "receiver-0", "abcd", &reply);
CastMessage reply_msg;
ASSERT_TRUE(MessageInfoToCastMessage(reply, &reply_msg));
ASSERT_TRUE(CastSocket::Serialize(reply_msg, &auth_reply_));
}
- virtual void TearDown() OVERRIDE {
- EXPECT_CALL(handler_, OnCloseComplete(net::OK));
- socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete,
- base::Unretained(&handler_)));
- }
-
void CreateCastSocket() {
socket_ = TestCastSocket::Create(&mock_delegate_);
}
@@ -409,6 +416,7 @@ class CastSocketTest : public testing::Test {
TEST_F(CastSocketTest, TestConnectAndClose) {
CreateCastSocket();
ConnectHelper();
+ SetupAuthMessage();
EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
@@ -424,6 +432,7 @@ TEST_F(CastSocketTest, TestConnectAndClose) {
// - SSL connection succeeds (async)
TEST_F(CastSocketTest, TestConnect) {
CreateCastSocket();
+ SetupAuthMessage();
socket_->SetupTcp1Connect(net::ASYNC, net::OK);
socket_->SetupSsl1Connect(net::ASYNC, net::OK);
socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING);
@@ -445,6 +454,7 @@ TEST_F(CastSocketTest, TestConnect) {
// - Second SSL connection succeeds (async)
TEST_F(CastSocketTest, TestConnectTwoStep) {
CreateCastSocket();
+ SetupAuthMessage();
socket_->SetupTcp1Connect(net::ASYNC, net::OK);
socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID);
socket_->SetupTcp2Connect(net::ASYNC, net::OK);
@@ -469,6 +479,7 @@ TEST_F(CastSocketTest, TestConnectTwoStep) {
// - The flow should NOT be tried again
TEST_F(CastSocketTest, TestConnectMaxTwoAttempts) {
CreateCastSocket();
+ SetupAuthMessage();
socket_->SetupTcp1Connect(net::ASYNC, net::OK);
socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID);
socket_->SetupTcp2Connect(net::ASYNC, net::OK);
@@ -494,6 +505,7 @@ TEST_F(CastSocketTest, TestConnectMaxTwoAttempts) {
// - Credentials are verified successfuly
TEST_F(CastSocketTest, TestConnectFullSecureFlowAsync) {
CreateCastSocketSecure();
+ SetupAuthMessage();
socket_->SetupTcp1Connect(net::ASYNC, net::OK);
socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID);
@@ -515,6 +527,7 @@ TEST_F(CastSocketTest, TestConnectFullSecureFlowAsync) {
// Same as TestFullSecureConnectionFlowAsync, but operations are synchronous.
TEST_F(CastSocketTest, TestConnectFullSecureFlowSync) {
CreateCastSocketSecure();
+ SetupAuthMessage();
socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::ERR_CERT_AUTHORITY_INVALID);
@@ -533,9 +546,35 @@ TEST_F(CastSocketTest, TestConnectFullSecureFlowSync) {
EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
}
+// Test that an AuthMessage with a mangled namespace triggers cancelation
+// of the connection event loop.
+TEST_F(CastSocketTest, TestConnectAuthMessageCorrupted) {
+ CreateCastSocketSecure();
+ SetupAuthMessage("bogus_namespace");
+
+ socket_->SetupTcp1Connect(net::ASYNC, net::OK);
+ socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID);
+ socket_->SetupTcp2Connect(net::ASYNC, net::OK);
+ socket_->SetupSsl2Connect(net::ASYNC, net::OK);
+ socket_->AddWriteResultForMessage(net::ASYNC, auth_request_);
+ socket_->AddReadResultForMessage(net::ASYNC, auth_reply_);
+ socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING);
+ // Guard against VerifyChallengeResult() being triggered.
+ socket_->DisallowVerifyChallengeResult();
+
+ EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED));
+ socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
+ base::Unretained(&handler_)));
+ RunPendingTasks();
+
+ EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
+ EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
+}
+
// Test connection error - TCP connect fails (async)
TEST_F(CastSocketTest, TestConnectTcpConnectErrorAsync) {
CreateCastSocketSecure();
+ SetupAuthMessage();
socket_->SetupTcp1Connect(net::ASYNC, net::ERR_FAILED);
@@ -551,6 +590,7 @@ TEST_F(CastSocketTest, TestConnectTcpConnectErrorAsync) {
// Test connection error - TCP connect fails (sync)
TEST_F(CastSocketTest, TestConnectTcpConnectErrorSync) {
CreateCastSocketSecure();
+ SetupAuthMessage();
socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::ERR_FAILED);
@@ -585,6 +625,7 @@ TEST_F(CastSocketTest, TestConnectTcpTimeoutError) {
// Test connection error - SSL connect fails (async)
TEST_F(CastSocketTest, TestConnectSslConnectErrorAsync) {
CreateCastSocketSecure();
+ SetupAuthMessage();
socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::ERR_FAILED);
@@ -601,6 +642,7 @@ TEST_F(CastSocketTest, TestConnectSslConnectErrorAsync) {
// Test connection error - SSL connect fails (sync)
TEST_F(CastSocketTest, TestConnectSslConnectErrorSync) {
CreateCastSocketSecure();
+ SetupAuthMessage();
socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
socket_->SetupSsl1Connect(net::ASYNC, net::ERR_FAILED);
@@ -617,6 +659,7 @@ TEST_F(CastSocketTest, TestConnectSslConnectErrorSync) {
// Test connection error - cert extraction error (async)
TEST_F(CastSocketTest, TestConnectCertExtractionErrorAsync) {
CreateCastSocket();
+ SetupAuthMessage();
socket_->SetupTcp1Connect(net::ASYNC, net::OK);
socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID);
// Set cert extraction to fail
@@ -634,6 +677,7 @@ TEST_F(CastSocketTest, TestConnectCertExtractionErrorAsync) {
// Test connection error - cert extraction error (sync)
TEST_F(CastSocketTest, TestConnectCertExtractionErrorSync) {
CreateCastSocket();
+ SetupAuthMessage();
socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::ERR_CERT_AUTHORITY_INVALID);
// Set cert extraction to fail
@@ -651,6 +695,7 @@ TEST_F(CastSocketTest, TestConnectCertExtractionErrorSync) {
// Test connection error - challenge send fails
TEST_F(CastSocketTest, TestConnectChallengeSendError) {
CreateCastSocketSecure();
+ SetupAuthMessage();
socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::OK);
@@ -668,6 +713,7 @@ TEST_F(CastSocketTest, TestConnectChallengeSendError) {
// Test connection error - challenge reply receive fails
TEST_F(CastSocketTest, TestConnectChallengeReplyReceiveError) {
CreateCastSocketSecure();
+ SetupAuthMessage();
socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::OK);
@@ -686,6 +732,7 @@ TEST_F(CastSocketTest, TestConnectChallengeReplyReceiveError) {
// Test connection error - challenge reply verification fails
TEST_F(CastSocketTest, TestConnectChallengeVerificationFails) {
CreateCastSocketSecure();
+ SetupAuthMessage();
socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::OK);
@@ -708,6 +755,7 @@ TEST_F(CastSocketTest, TestWriteAsync) {
CreateCastSocket();
socket_->AddWriteResultForMessage(net::ASYNC, test_proto_strs_[0]);
ConnectHelper();
+ SetupAuthMessage();
EXPECT_CALL(handler_, OnWriteComplete(test_proto_strs_[0].size()));
socket_->SendMessage(test_messages_[0],
@@ -724,6 +772,7 @@ TEST_F(CastSocketTest, TestWriteSync) {
CreateCastSocket();
socket_->AddWriteResultForMessage(net::SYNCHRONOUS, test_proto_strs_[0]);
ConnectHelper();
+ SetupAuthMessage();
EXPECT_CALL(handler_, OnWriteComplete(test_proto_strs_[0].size()));
socket_->SendMessage(test_messages_[0],
@@ -740,6 +789,7 @@ TEST_F(CastSocketTest, TestWriteChunkedAsync) {
CreateCastSocket();
socket_->AddWriteResultForMessage(net::ASYNC, test_proto_strs_[0], 2);
ConnectHelper();
+ SetupAuthMessage();
EXPECT_CALL(handler_, OnWriteComplete(test_proto_strs_[0].size()));
socket_->SendMessage(test_messages_[0],
@@ -756,6 +806,7 @@ TEST_F(CastSocketTest, TestWriteChunkedSync) {
CreateCastSocket();
socket_->AddWriteResultForMessage(net::SYNCHRONOUS, test_proto_strs_[0], 2);
ConnectHelper();
+ SetupAuthMessage();
EXPECT_CALL(handler_, OnWriteComplete(test_proto_strs_[0].size()));
socket_->SendMessage(test_messages_[0],
@@ -776,6 +827,7 @@ TEST_F(CastSocketTest, TestWriteManyAsync) {
EXPECT_CALL(handler_, OnWriteComplete(msg_size));
}
ConnectHelper();
+ SetupAuthMessage();
for (size_t i = 0; i < arraysize(test_messages_); i++) {
socket_->SendMessage(test_messages_[i],
@@ -797,6 +849,7 @@ TEST_F(CastSocketTest, TestWriteManySync) {
EXPECT_CALL(handler_, OnWriteComplete(msg_size));
}
ConnectHelper();
+ SetupAuthMessage();
for (size_t i = 0; i < arraysize(test_messages_); i++) {
socket_->SendMessage(test_messages_[i],
@@ -812,6 +865,7 @@ TEST_F(CastSocketTest, TestWriteManySync) {
// Test write error - not connected
TEST_F(CastSocketTest, TestWriteErrorNotConnected) {
CreateCastSocket();
+ SetupAuthMessage();
EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED));
socket_->SendMessage(test_messages_[0],
@@ -826,6 +880,7 @@ TEST_F(CastSocketTest, TestWriteErrorNotConnected) {
TEST_F(CastSocketTest, TestWriteErrorLargeMessage) {
CreateCastSocket();
ConnectHelper();
+ SetupAuthMessage();
EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED));
size_t size = CastSocket::MessageHeader::max_message_size() + 1;
@@ -844,6 +899,7 @@ TEST_F(CastSocketTest, TestWriteNetworkErrorSync) {
CreateCastSocket();
socket_->AddWriteResult(net::SYNCHRONOUS, net::ERR_FAILED);
ConnectHelper();
+ SetupAuthMessage();
EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED));
EXPECT_CALL(mock_delegate_,
@@ -862,6 +918,7 @@ TEST_F(CastSocketTest, TestWriteErrorAsync) {
CreateCastSocket();
socket_->AddWriteResult(net::ASYNC, net::ERR_FAILED);
ConnectHelper();
+ SetupAuthMessage();
EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED));
EXPECT_CALL(mock_delegate_,
@@ -880,6 +937,7 @@ TEST_F(CastSocketTest, TestWriteErrorZeroBytesWritten) {
CreateCastSocket();
socket_->AddWriteResult(net::SYNCHRONOUS, 0);
ConnectHelper();
+ SetupAuthMessage();
EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED));
EXPECT_CALL(mock_delegate_,
@@ -899,6 +957,7 @@ TEST_F(CastSocketTest, TestWriteErrorWithMultiplePendingWritesAsync) {
CreateCastSocket();
socket_->AddWriteResult(net::ASYNC, net::ERR_SOCKET_NOT_CONNECTED);
ConnectHelper();
+ SetupAuthMessage();
const int num_writes = arraysize(test_messages_);
EXPECT_CALL(handler_, OnWriteComplete(net::ERR_SOCKET_NOT_CONNECTED))
@@ -923,6 +982,7 @@ TEST_F(CastSocketTest, TestReadAsync) {
EXPECT_CALL(mock_delegate_,
OnMessage(socket_.get(), A<const MessageInfo&>()));
ConnectHelper();
+ SetupAuthMessage();
EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
@@ -931,6 +991,7 @@ TEST_F(CastSocketTest, TestReadAsync) {
// Test read success - single message (sync)
TEST_F(CastSocketTest, TestReadSync) {
CreateCastSocket();
+ SetupAuthMessage();
socket_->AddReadResultForMessage(net::SYNCHRONOUS, test_proto_strs_[0]);
EXPECT_CALL(mock_delegate_,
OnMessage(socket_.get(), A<const MessageInfo&>()));
@@ -943,6 +1004,7 @@ TEST_F(CastSocketTest, TestReadSync) {
// Test read success - single message received in multiple chunks (async)
TEST_F(CastSocketTest, TestReadChunkedAsync) {
CreateCastSocket();
+ SetupAuthMessage();
socket_->AddReadResultForMessage(net::ASYNC, test_proto_strs_[0], 2);
EXPECT_CALL(mock_delegate_,
OnMessage(socket_.get(), A<const MessageInfo&>()));
@@ -955,6 +1017,7 @@ TEST_F(CastSocketTest, TestReadChunkedAsync) {
// Test read success - single message received in multiple chunks (sync)
TEST_F(CastSocketTest, TestReadChunkedSync) {
CreateCastSocket();
+ SetupAuthMessage();
socket_->AddReadResultForMessage(net::SYNCHRONOUS, test_proto_strs_[0], 2);
EXPECT_CALL(mock_delegate_,
OnMessage(socket_.get(), A<const MessageInfo&>()));
@@ -967,6 +1030,7 @@ TEST_F(CastSocketTest, TestReadChunkedSync) {
// Test read success - multiple messages (async)
TEST_F(CastSocketTest, TestReadManyAsync) {
CreateCastSocket();
+ SetupAuthMessage();
size_t num_reads = arraysize(test_proto_strs_);
for (size_t i = 0; i < num_reads; i++)
socket_->AddReadResultForMessage(net::ASYNC, test_proto_strs_[i]);
@@ -982,6 +1046,7 @@ TEST_F(CastSocketTest, TestReadManyAsync) {
// Test read success - multiple messages (sync)
TEST_F(CastSocketTest, TestReadManySync) {
CreateCastSocket();
+ SetupAuthMessage();
size_t num_reads = arraysize(test_proto_strs_);
for (size_t i = 0; i < num_reads; i++)
socket_->AddReadResultForMessage(net::SYNCHRONOUS, test_proto_strs_[i]);
@@ -997,6 +1062,7 @@ TEST_F(CastSocketTest, TestReadManySync) {
// Test read error - network error (async)
TEST_F(CastSocketTest, TestReadErrorAsync) {
CreateCastSocket();
+ SetupAuthMessage();
socket_->AddReadResult(net::ASYNC, net::ERR_SOCKET_NOT_CONNECTED);
EXPECT_CALL(mock_delegate_,
OnError(socket_.get(),
@@ -1010,6 +1076,7 @@ TEST_F(CastSocketTest, TestReadErrorAsync) {
// Test read error - network error (sync)
TEST_F(CastSocketTest, TestReadErrorSync) {
CreateCastSocket();
+ SetupAuthMessage();
socket_->AddReadResult(net::SYNCHRONOUS, net::ERR_SOCKET_NOT_CONNECTED);
EXPECT_CALL(mock_delegate_,
OnError(socket_.get(),
@@ -1023,6 +1090,7 @@ TEST_F(CastSocketTest, TestReadErrorSync) {
// Test read error - header parse error
TEST_F(CastSocketTest, TestReadHeaderParseError) {
CreateCastSocket();
+ SetupAuthMessage();
uint32 body_size = base::HostToNet32(
CastSocket::MessageHeader::max_message_size() + 1);
// TODO(munjal): Add a method to cast_message_util.h to serialize messages
@@ -1042,6 +1110,7 @@ TEST_F(CastSocketTest, TestReadHeaderParseError) {
// Test read error - body parse error
TEST_F(CastSocketTest, TestReadBodyParseError) {
CreateCastSocket();
+ SetupAuthMessage();
char body[] = "some body";
uint32 body_size = base::HostToNet32(arraysize(body));
char header[sizeof(body_size)];
« no previous file with comments | « extensions/browser/api/cast_channel/cast_socket.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698