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

Unified Diff: chrome/browser/extensions/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: Misc. 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
Index: chrome/browser/extensions/api/cast_channel/cast_socket_unittest.cc
diff --git a/chrome/browser/extensions/api/cast_channel/cast_socket_unittest.cc b/chrome/browser/extensions/api/cast_channel/cast_socket_unittest.cc
index d9e4aee5f49dbc0b3e828c00602002a071065b54..807e0c6db2ecb00e0189990e9172ce52e1d8ad4a 100644
--- a/chrome/browser/extensions/api/cast_channel/cast_socket_unittest.cc
+++ b/chrome/browser/extensions/api/cast_channel/cast_socket_unittest.cc
@@ -148,7 +148,8 @@ class TestCastSocket : public CastSocket {
ip_(ip_endpoint),
connect_index_(0),
extract_cert_result_(true),
- verify_challenge_result_(true) {
+ verify_challenge_result_(true),
+ verify_challenge_disallow_(false) {
}
static net::IPEndPoint CreateIPEndPoint() {
@@ -235,6 +236,10 @@ class TestCastSocket : public CastSocket {
verify_challenge_result_ = value;
}
+ void DisallowVerifyChallengeResult() {
+ verify_challenge_disallow_ = true;
+ }
+
private:
virtual scoped_ptr<net::TCPClientSocket> CreateTcpSocket() OVERRIDE {
net::MockConnect* connect_data = tcp_connect_data_[connect_index_].get();
@@ -264,6 +269,7 @@ class TestCastSocket : public CastSocket {
}
virtual bool VerifyChallengeReply() OVERRIDE {
+ EXPECT_EQ(false, verify_challenge_disallow_);
return verify_challenge_result_;
}
@@ -282,6 +288,7 @@ class TestCastSocket : public CastSocket {
bool extract_cert_result_;
// Simulated result of verifying challenge reply.
bool verify_challenge_result_;
+ bool verify_challenge_disallow_;
};
class CastSocketTest : public testing::Test {
@@ -298,7 +305,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);
@@ -306,7 +324,7 @@ class CastSocketTest : public testing::Test {
// Create a test auth reply.
MessageInfo reply;
- CreateBinaryMessage("urn:x-cast:com.google.cast.tp.deviceauth",
+ CreateBinaryMessage(auth_namespace,
"sender-0",
"receiver-0",
"abcd",
@@ -316,12 +334,6 @@ class CastSocketTest : public testing::Test {
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_);
}
@@ -366,6 +378,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());
@@ -381,6 +394,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);
@@ -402,6 +416,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);
@@ -426,6 +441,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);
@@ -451,6 +467,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);
@@ -472,6 +489,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);
@@ -490,9 +508,36 @@ 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);
@@ -508,6 +553,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);
@@ -523,6 +569,7 @@ TEST_F(CastSocketTest, TestConnectTcpConnectErrorSync) {
// 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);
@@ -539,6 +586,7 @@ TEST_F(CastSocketTest, TestConnectSslConnectErrorAsync) {
// Test connection error - SSL connect fails (async)
TEST_F(CastSocketTest, TestConnectSslConnectErrorSync) {
CreateCastSocketSecure();
+ SetupAuthMessage();
socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
socket_->SetupSsl1Connect(net::ASYNC, net::ERR_FAILED);
@@ -555,6 +603,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
@@ -572,6 +621,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
@@ -589,6 +639,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);
@@ -606,6 +657,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);
@@ -624,6 +676,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);
@@ -646,6 +699,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],
@@ -662,6 +716,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],
@@ -678,6 +733,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],
@@ -694,6 +750,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],
@@ -714,6 +771,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],
@@ -735,6 +793,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],
@@ -750,6 +809,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],
@@ -764,6 +824,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;
@@ -783,6 +844,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_,
@@ -801,6 +863,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_,
@@ -819,6 +882,7 @@ TEST_F(CastSocketTest, TestWriteErrorZeroBytesWritten) {
CreateCastSocket();
socket_->AddWriteResult(net::SYNCHRONOUS, 0);
ConnectHelper();
+ SetupAuthMessage();
EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED));
EXPECT_CALL(mock_delegate_,
@@ -838,6 +902,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))
@@ -862,6 +927,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());
@@ -870,6 +936,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&>()));
@@ -882,6 +949,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&>()));
@@ -894,6 +962,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&>()));
@@ -906,6 +975,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]);
@@ -921,6 +991,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]);
@@ -936,6 +1007,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(),
@@ -949,6 +1021,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(),
@@ -962,6 +1035,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
@@ -981,6 +1055,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)];

Powered by Google App Engine
This is Rietveld 408576698