| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 #include "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/command_line.h" | 6 #include "base/command_line.h" |
| 7 #include "base/files/file_path.h" | 7 #include "base/files/file_path.h" |
| 8 #include "chrome/browser/extensions/api/cast_channel/cast_channel_api.h" | 8 #include "chrome/browser/extensions/api/cast_channel/cast_channel_api.h" |
| 9 #include "chrome/browser/extensions/api/cast_channel/cast_socket.h" | 9 #include "chrome/browser/extensions/api/cast_channel/cast_socket.h" |
| 10 #include "chrome/browser/extensions/extension_apitest.h" | 10 #include "chrome/browser/extensions/extension_apitest.h" |
| 11 #include "chrome/browser/extensions/extension_service.h" | 11 #include "chrome/browser/extensions/extension_service.h" |
| 12 #include "chrome/common/extensions/api/cast_channel.h" | 12 #include "chrome/common/extensions/api/cast_channel.h" |
| 13 #include "content/public/browser/browser_thread.h" | 13 #include "content/public/browser/browser_thread.h" |
| 14 #include "extensions/common/switches.h" | 14 #include "extensions/common/switches.h" |
| 15 #include "net/base/capturing_net_log.h" | 15 #include "net/base/capturing_net_log.h" |
| 16 #include "net/base/completion_callback.h" | 16 #include "net/base/completion_callback.h" |
| 17 #include "net/base/net_errors.h" | 17 #include "net/base/net_errors.h" |
| 18 #include "testing/gmock/include/gmock/gmock.h" | 18 #include "testing/gmock/include/gmock/gmock.h" |
| 19 #include "testing/gmock_mutant.h" |
| 19 | 20 |
| 20 namespace cast_channel = extensions::api::cast_channel; | 21 namespace cast_channel = extensions::api::cast_channel; |
| 21 using cast_channel::CastSocket; | 22 using cast_channel::CastSocket; |
| 22 using cast_channel::ChannelError; | 23 using cast_channel::ChannelError; |
| 23 using cast_channel::MessageInfo; | 24 using cast_channel::MessageInfo; |
| 24 using cast_channel::ReadyState; | 25 using cast_channel::ReadyState; |
| 25 | 26 |
| 27 using ::testing::_; |
| 26 using ::testing::A; | 28 using ::testing::A; |
| 27 using ::testing::_; | 29 using ::testing::DoAll; |
| 28 using ::testing::Invoke; | 30 using ::testing::Invoke; |
| 29 using ::testing::InSequence; | 31 using ::testing::InSequence; |
| 30 using ::testing::Return; | 32 using ::testing::Return; |
| 31 | 33 |
| 32 namespace { | 34 namespace { |
| 33 | 35 |
| 34 const char kTestExtensionId[] = "ddchlicdkolnonkihahngkmmmjnjlkkf"; | 36 const char kTestExtensionId[] = "ddchlicdkolnonkihahngkmmmjnjlkkf"; |
| 35 | 37 |
| 36 static void FillMessageInfo(MessageInfo* message_info, | 38 static void FillMessageInfo(MessageInfo* message_info, |
| 37 const std::string& message) { | 39 const std::string& message) { |
| 38 message_info->namespace_ = "foo"; | 40 message_info->namespace_ = "foo"; |
| 39 message_info->source_id = "src"; | 41 message_info->source_id = "src"; |
| 40 message_info->destination_id = "dest"; | 42 message_info->destination_id = "dest"; |
| 41 message_info->data.reset(new base::StringValue(message)); | 43 message_info->data.reset(new base::StringValue(message)); |
| 42 } | 44 } |
| 43 | 45 |
| 44 ACTION_TEMPLATE(InvokeCompletionCallback, | 46 ACTION_TEMPLATE(InvokeCompletionCallback, |
| 45 HAS_1_TEMPLATE_PARAMS(int, k), | 47 HAS_1_TEMPLATE_PARAMS(int, k), |
| 46 AND_1_VALUE_PARAMS(result)) { | 48 AND_1_VALUE_PARAMS(result)) { |
| 47 ::std::tr1::get<k>(args).Run(result); | 49 ::std::tr1::get<k>(args).Run(result); |
| 48 } | 50 } |
| 49 | 51 |
| 52 ACTION_P2(InvokeDelegateOnError, api_test, api) { |
| 53 api_test->CallOnError(api); |
| 54 } |
| 55 |
| 50 class MockCastSocket : public CastSocket { | 56 class MockCastSocket : public CastSocket { |
| 51 public: | 57 public: |
| 52 explicit MockCastSocket(CastSocket::Delegate* delegate, | 58 explicit MockCastSocket(CastSocket::Delegate* delegate, |
| 53 net::IPEndPoint ip_endpoint, | 59 net::IPEndPoint ip_endpoint, |
| 54 net::NetLog* net_log) | 60 net::NetLog* net_log) |
| 55 : CastSocket(kTestExtensionId, ip_endpoint, | 61 : CastSocket(kTestExtensionId, ip_endpoint, |
| 56 cast_channel::CHANNEL_AUTH_TYPE_SSL, delegate, net_log) {} | 62 cast_channel::CHANNEL_AUTH_TYPE_SSL, delegate, net_log) {} |
| 57 virtual ~MockCastSocket() {} | 63 virtual ~MockCastSocket() {} |
| 58 | 64 |
| 59 virtual bool CalledOnValidThread() const OVERRIDE { | 65 virtual bool CalledOnValidThread() const OVERRIDE { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 | 101 |
| 96 // Set expectations on error_state(). | 102 // Set expectations on error_state(). |
| 97 EXPECT_CALL(*mock_cast_socket_, error_state()) | 103 EXPECT_CALL(*mock_cast_socket_, error_state()) |
| 98 .WillRepeatedly(Return(cast_channel::CHANNEL_ERROR_NONE)); | 104 .WillRepeatedly(Return(cast_channel::CHANNEL_ERROR_NONE)); |
| 99 } | 105 } |
| 100 | 106 |
| 101 extensions::CastChannelAPI* GetApi() { | 107 extensions::CastChannelAPI* GetApi() { |
| 102 return extensions::CastChannelAPI::Get(profile()); | 108 return extensions::CastChannelAPI::Get(profile()); |
| 103 } | 109 } |
| 104 | 110 |
| 111 void CallOnError(extensions::CastChannelAPI* api) { |
| 112 api->OnError(mock_cast_socket_, |
| 113 cast_channel::CHANNEL_ERROR_CONNECT_ERROR); |
| 114 } |
| 115 |
| 105 protected: | 116 protected: |
| 106 void CallOnMessage(const std::string& message) { | 117 void CallOnMessage(const std::string& message) { |
| 107 content::BrowserThread::PostTask( | 118 content::BrowserThread::PostTask( |
| 108 content::BrowserThread::IO, | 119 content::BrowserThread::IO, |
| 109 FROM_HERE, | 120 FROM_HERE, |
| 110 base::Bind(&CastChannelAPITest::DoCallOnMessage, this, | 121 base::Bind(&CastChannelAPITest::DoCallOnMessage, this, |
| 111 GetApi(), mock_cast_socket_, message)); | 122 GetApi(), mock_cast_socket_, message)); |
| 112 } | 123 } |
| 113 | 124 |
| 114 void DoCallOnMessage(extensions::CastChannelAPI* api, | 125 void DoCallOnMessage(extensions::CastChannelAPI* api, |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 213 } | 224 } |
| 214 | 225 |
| 215 EXPECT_TRUE(RunExtensionSubtest("cast_channel/api", | 226 EXPECT_TRUE(RunExtensionSubtest("cast_channel/api", |
| 216 "test_open_receive_close.html")); | 227 "test_open_receive_close.html")); |
| 217 | 228 |
| 218 ResultCatcher catcher; | 229 ResultCatcher catcher; |
| 219 CallOnMessage("some-message"); | 230 CallOnMessage("some-message"); |
| 220 CallOnMessage("some-message"); | 231 CallOnMessage("some-message"); |
| 221 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); | 232 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); |
| 222 } | 233 } |
| 234 |
| 235 // TODO(munjal): Win Dbg has a workaround that makes RunExtensionSubtest |
| 236 // always return true without actually running the test. Remove when fixed. |
| 237 #if defined(OS_WIN) && !defined(NDEBUG) |
| 238 #define MAYBE_TestOpenError DISABLED_TestOpenError |
| 239 #else |
| 240 #define MAYBE_TestOpenError TestOpenError |
| 241 #endif |
| 242 // Test the case when socket open results in an error. |
| 243 IN_PROC_BROWSER_TEST_F(CastChannelAPITest, MAYBE_TestOpenError) { |
| 244 SetUpMockCastSocket(); |
| 245 |
| 246 EXPECT_CALL(*mock_cast_socket_, Connect(_)) |
| 247 .WillOnce(DoAll( |
| 248 InvokeDelegateOnError(this, GetApi()), |
| 249 InvokeCompletionCallback<0>(net::ERR_FAILED))); |
| 250 EXPECT_CALL(*mock_cast_socket_, ready_state()) |
| 251 .WillRepeatedly(Return(cast_channel::READY_STATE_CLOSED)); |
| 252 EXPECT_CALL(*mock_cast_socket_, Close(_)); |
| 253 |
| 254 EXPECT_TRUE(RunExtensionSubtest("cast_channel/api", |
| 255 "test_open_error.html")); |
| 256 |
| 257 ResultCatcher catcher; |
| 258 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); |
| 259 } |
| 260 |
| OLD | NEW |