| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 <string> | 5 #include <string> |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
| 11 #include "base/synchronization/waitable_event.h" | 11 #include "base/synchronization/waitable_event.h" |
| 12 #include "chrome/browser/media/router/media_route.h" | 12 #include "chrome/browser/media/router/media_route.h" |
| 13 #include "chrome/browser/media/router/media_router_mojo_test.h" | 13 #include "chrome/browser/media/router/media_router_mojo_test.h" |
| 14 #include "chrome/browser/media/router/mock_media_router.h" | 14 #include "chrome/browser/media/router/mock_media_router.h" |
| 15 #include "chrome/browser/media/router/presentation_session_messages_observer.h" |
| 15 #include "chrome/browser/media/router/test_helper.h" | 16 #include "chrome/browser/media/router/test_helper.h" |
| 16 #include "chrome/test/base/chrome_render_view_host_test_harness.h" | 17 #include "chrome/test/base/chrome_render_view_host_test_harness.h" |
| 17 #include "chrome/test/base/testing_profile.h" | 18 #include "chrome/test/base/testing_profile.h" |
| 18 #include "extensions/browser/extension_registry.h" | 19 #include "extensions/browser/extension_registry.h" |
| 19 #include "extensions/browser/process_manager.h" | 20 #include "extensions/browser/process_manager.h" |
| 20 #include "extensions/browser/process_manager_factory.h" | 21 #include "extensions/browser/process_manager_factory.h" |
| 21 #include "media/base/gmock_callback_support.h" | 22 #include "media/base/gmock_callback_support.h" |
| 22 #include "testing/gmock/include/gmock/gmock.h" | 23 #include "testing/gmock/include/gmock/gmock.h" |
| 23 #include "testing/gtest/include/gtest/gtest.h" | 24 #include "testing/gtest/include/gtest/gtest.h" |
| 24 | 25 |
| 25 using testing::_; | 26 using testing::_; |
| 26 using testing::Eq; | 27 using testing::Eq; |
| 27 using testing::Invoke; | 28 using testing::Invoke; |
| 29 using testing::Not; |
| 28 using testing::Pointee; | 30 using testing::Pointee; |
| 29 using testing::Return; | 31 using testing::Return; |
| 30 using testing::ReturnRef; | 32 using testing::ReturnRef; |
| 31 using testing::SaveArg; | 33 using testing::SaveArg; |
| 32 | 34 |
| 33 namespace media_router { | 35 namespace media_router { |
| 34 | 36 |
| 35 namespace { | 37 namespace { |
| 36 | 38 |
| 37 const char kDescription[] = "description"; | 39 const char kDescription[] = "description"; |
| 38 const char kError[] = "error"; | 40 const char kError[] = "error"; |
| 39 const char kExtensionId[] = "extension1234"; | 41 const char kExtensionId[] = "extension1234"; |
| 40 const char kMessage[] = "message"; | 42 const char kMessage[] = "message"; |
| 41 const char kSource[] = "source1"; | 43 const char kSource[] = "source1"; |
| 42 const char kSource2[] = "source2"; | 44 const char kSource2[] = "source2"; |
| 43 const char kRouteId[] = "routeId"; | 45 const char kRouteId[] = "routeId"; |
| 44 const char kRouteId2[] = "routeId2"; | 46 const char kRouteId2[] = "routeId2"; |
| 45 const char kSink[] = "sink"; | 47 const char kSink[] = "sink"; |
| 46 const char kSink2[] = "sink2"; | 48 const char kSink2[] = "sink2"; |
| 47 const char kSinkName[] = "sinkName"; | 49 const char kSinkName[] = "sinkName"; |
| 48 const char kPresentationId[] = "presentationId"; | 50 const char kPresentationId[] = "presentationId"; |
| 49 const char kOrigin[] = "http://origin/"; | 51 const char kOrigin[] = "http://origin/"; |
| 50 const int kTabId = 123; | 52 const int kTabId = 123; |
| 51 | 53 |
| 52 bool ArePresentationSessionMessagesEqual( | 54 bool ArePresentationSessionMessagesEqual( |
| 53 const content::PresentationSessionMessage* expected, | 55 const content::PresentationSessionMessage* expected, |
| 54 const content::PresentationSessionMessage* actual) { | 56 const content::PresentationSessionMessage* actual) { |
| 55 if (expected->presentation_url != actual->presentation_url || | 57 if (expected->type != actual->type) |
| 56 expected->presentation_id != actual->presentation_id || | |
| 57 expected->type != actual->type) { | |
| 58 return false; | 58 return false; |
| 59 } | 59 |
| 60 return expected->is_binary() ? *(expected->data) == *(actual->data) | 60 return expected->is_binary() ? expected->data == actual->data |
| 61 : *(expected->message) == *(actual->message); | 61 : expected->message == actual->message; |
| 62 } | 62 } |
| 63 | 63 |
| 64 } // namespace | 64 } // namespace |
| 65 | 65 |
| 66 class RouteResponseCallbackHandler { | 66 class RouteResponseCallbackHandler { |
| 67 public: | 67 public: |
| 68 MOCK_METHOD2(Invoke, | 68 MOCK_METHOD3(Invoke, |
| 69 void(const MediaRoute* route, const std::string& error_text)); | 69 void(const MediaRoute* route, |
| 70 const std::string& presentation_id, |
| 71 const std::string& error_text)); |
| 70 }; | 72 }; |
| 71 | 73 |
| 72 class SendMessageCallbackHandler { | 74 class SendMessageCallbackHandler { |
| 73 public: | 75 public: |
| 74 MOCK_METHOD1(Invoke, void(bool)); | 76 MOCK_METHOD1(Invoke, void(bool)); |
| 75 }; | 77 }; |
| 76 | 78 |
| 77 class ListenForMessagesCallbackHandler { | 79 class ListenForMessagesCallbackHandler { |
| 78 public: | 80 public: |
| 79 ListenForMessagesCallbackHandler(scoped_ptr< | 81 ListenForMessagesCallbackHandler( |
| 80 ScopedVector<content::PresentationSessionMessage>> expected_messages) | 82 ScopedVector<content::PresentationSessionMessage> expected_messages) |
| 81 : expected_messages_(expected_messages.Pass()) {} | 83 : expected_messages_(expected_messages.Pass()) {} |
| 82 void Invoke( | 84 void Invoke( |
| 83 scoped_ptr<ScopedVector<content::PresentationSessionMessage>> messages) { | 85 const ScopedVector<content::PresentationSessionMessage>& messages) { |
| 84 InvokeObserver(); | 86 InvokeObserver(); |
| 85 EXPECT_EQ(messages->size(), expected_messages_->size()); | 87 EXPECT_EQ(messages.size(), expected_messages_.size()); |
| 86 const auto& expected = expected_messages_->get(); | 88 for (size_t i = 0; i < expected_messages_.size(); ++i) { |
| 87 const auto& actual = messages->get(); | 89 EXPECT_TRUE(ArePresentationSessionMessagesEqual(expected_messages_[i], |
| 88 for (size_t i = 0; i < expected_messages_->size(); ++i) { | 90 messages[i])); |
| 89 EXPECT_TRUE(ArePresentationSessionMessagesEqual(expected[i], actual[i])); | |
| 90 } | 91 } |
| 91 } | 92 } |
| 92 | 93 |
| 93 MOCK_METHOD0(InvokeObserver, void()); | 94 MOCK_METHOD0(InvokeObserver, void()); |
| 94 | 95 |
| 95 private: | 96 private: |
| 96 scoped_ptr<ScopedVector<content::PresentationSessionMessage>> | 97 ScopedVector<content::PresentationSessionMessage> expected_messages_; |
| 97 expected_messages_; | |
| 98 }; | 98 }; |
| 99 | 99 |
| 100 template <typename T> | 100 template <typename T> |
| 101 void StoreAndRun(T* result, const base::Closure& closure, const T& result_val) { | 101 void StoreAndRun(T* result, const base::Closure& closure, const T& result_val) { |
| 102 *result = result_val; | 102 *result = result_val; |
| 103 closure.Run(); | 103 closure.Run(); |
| 104 } | 104 } |
| 105 | 105 |
| 106 class MediaRouterMojoImplTest : public MediaRouterMojoTest { | 106 class MediaRouterMojoImplTest : public MediaRouterMojoTest { |
| 107 public: | 107 public: |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 mojo::String(kOrigin), kTabId, _)) | 159 mojo::String(kOrigin), kTabId, _)) |
| 160 .WillOnce(Invoke([&route]( | 160 .WillOnce(Invoke([&route]( |
| 161 const mojo::String& source, const mojo::String& sink, | 161 const mojo::String& source, const mojo::String& sink, |
| 162 const mojo::String& presentation_id, const mojo::String& origin, | 162 const mojo::String& presentation_id, const mojo::String& origin, |
| 163 int tab_id, | 163 int tab_id, |
| 164 const interfaces::MediaRouteProvider::CreateRouteCallback& cb) { | 164 const interfaces::MediaRouteProvider::CreateRouteCallback& cb) { |
| 165 cb.Run(route.Pass(), mojo::String()); | 165 cb.Run(route.Pass(), mojo::String()); |
| 166 })); | 166 })); |
| 167 | 167 |
| 168 RouteResponseCallbackHandler handler; | 168 RouteResponseCallbackHandler handler; |
| 169 EXPECT_CALL(handler, Invoke(Pointee(Equals(expected_route)), "")); | 169 EXPECT_CALL(handler, Invoke(Pointee(Equals(expected_route)), Not(""), "")); |
| 170 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 170 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 171 route_response_callbacks.push_back(base::Bind( | 171 route_response_callbacks.push_back(base::Bind( |
| 172 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 172 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 173 router()->CreateRoute(kSource, kSink, GURL(kOrigin), kTabId, | 173 router()->CreateRoute(kSource, kSink, GURL(kOrigin), kTabId, |
| 174 route_response_callbacks); | 174 route_response_callbacks); |
| 175 ProcessEventLoop(); | 175 ProcessEventLoop(); |
| 176 } | 176 } |
| 177 | 177 |
| 178 TEST_F(MediaRouterMojoImplTest, CreateRouteFails) { | 178 TEST_F(MediaRouterMojoImplTest, CreateRouteFails) { |
| 179 EXPECT_CALL(mock_media_route_provider_, | 179 EXPECT_CALL(mock_media_route_provider_, |
| 180 CreateRoute(mojo::String(kSource), mojo::String(kSink), _, | 180 CreateRoute(mojo::String(kSource), mojo::String(kSink), _, |
| 181 mojo::String(kOrigin), kTabId, _)) | 181 mojo::String(kOrigin), kTabId, _)) |
| 182 .WillOnce(Invoke( | 182 .WillOnce(Invoke( |
| 183 [](const mojo::String& source, const mojo::String& sink, | 183 [](const mojo::String& source, const mojo::String& sink, |
| 184 const mojo::String& presentation_id, const mojo::String& origin, | 184 const mojo::String& presentation_id, const mojo::String& origin, |
| 185 int tab_id, | 185 int tab_id, |
| 186 const interfaces::MediaRouteProvider::CreateRouteCallback& cb) { | 186 const interfaces::MediaRouteProvider::CreateRouteCallback& cb) { |
| 187 cb.Run(interfaces::MediaRoutePtr(), mojo::String(kError)); | 187 cb.Run(interfaces::MediaRoutePtr(), mojo::String(kError)); |
| 188 })); | 188 })); |
| 189 | 189 |
| 190 RouteResponseCallbackHandler handler; | 190 RouteResponseCallbackHandler handler; |
| 191 EXPECT_CALL(handler, Invoke(nullptr, kError)); | 191 EXPECT_CALL(handler, Invoke(nullptr, "", kError)); |
| 192 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 192 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 193 route_response_callbacks.push_back(base::Bind( | 193 route_response_callbacks.push_back(base::Bind( |
| 194 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 194 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 195 router()->CreateRoute(kSource, kSink, GURL(kOrigin), kTabId, | 195 router()->CreateRoute(kSource, kSink, GURL(kOrigin), kTabId, |
| 196 route_response_callbacks); | 196 route_response_callbacks); |
| 197 ProcessEventLoop(); | 197 ProcessEventLoop(); |
| 198 } | 198 } |
| 199 | 199 |
| 200 TEST_F(MediaRouterMojoImplTest, JoinRoute) { | 200 TEST_F(MediaRouterMojoImplTest, JoinRoute) { |
| 201 MediaRoute expected_route(kRouteId, MediaSource(std::string(kSource)), | 201 MediaRoute expected_route(kRouteId, MediaSource(std::string(kSource)), |
| (...skipping 13 matching lines...) Expand all Loading... |
| 215 JoinRoute(mojo::String(kSource), mojo::String(kPresentationId), | 215 JoinRoute(mojo::String(kSource), mojo::String(kPresentationId), |
| 216 mojo::String(kOrigin), kTabId, _)) | 216 mojo::String(kOrigin), kTabId, _)) |
| 217 .WillOnce(Invoke([&route]( | 217 .WillOnce(Invoke([&route]( |
| 218 const mojo::String& source, const mojo::String& presentation_id, | 218 const mojo::String& source, const mojo::String& presentation_id, |
| 219 const mojo::String& origin, int tab_id, | 219 const mojo::String& origin, int tab_id, |
| 220 const interfaces::MediaRouteProvider::JoinRouteCallback& cb) { | 220 const interfaces::MediaRouteProvider::JoinRouteCallback& cb) { |
| 221 cb.Run(route.Pass(), mojo::String()); | 221 cb.Run(route.Pass(), mojo::String()); |
| 222 })); | 222 })); |
| 223 | 223 |
| 224 RouteResponseCallbackHandler handler; | 224 RouteResponseCallbackHandler handler; |
| 225 EXPECT_CALL(handler, Invoke(Pointee(Equals(expected_route)), "")); | 225 EXPECT_CALL(handler, Invoke(Pointee(Equals(expected_route)), Not(""), "")); |
| 226 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 226 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 227 route_response_callbacks.push_back(base::Bind( | 227 route_response_callbacks.push_back(base::Bind( |
| 228 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 228 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 229 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), kTabId, | 229 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), kTabId, |
| 230 route_response_callbacks); | 230 route_response_callbacks); |
| 231 ProcessEventLoop(); | 231 ProcessEventLoop(); |
| 232 } | 232 } |
| 233 | 233 |
| 234 TEST_F(MediaRouterMojoImplTest, JoinRouteFails) { | 234 TEST_F(MediaRouterMojoImplTest, JoinRouteFails) { |
| 235 EXPECT_CALL(mock_media_route_provider_, | 235 EXPECT_CALL(mock_media_route_provider_, |
| 236 JoinRoute(mojo::String(kSource), mojo::String(kPresentationId), | 236 JoinRoute(mojo::String(kSource), mojo::String(kPresentationId), |
| 237 mojo::String(kOrigin), kTabId, _)) | 237 mojo::String(kOrigin), kTabId, _)) |
| 238 .WillOnce(Invoke( | 238 .WillOnce(Invoke( |
| 239 [](const mojo::String& source, const mojo::String& presentation_id, | 239 [](const mojo::String& source, const mojo::String& presentation_id, |
| 240 const mojo::String& origin, int tab_id, | 240 const mojo::String& origin, int tab_id, |
| 241 const interfaces::MediaRouteProvider::JoinRouteCallback& cb) { | 241 const interfaces::MediaRouteProvider::JoinRouteCallback& cb) { |
| 242 cb.Run(interfaces::MediaRoutePtr(), mojo::String(kError)); | 242 cb.Run(interfaces::MediaRoutePtr(), mojo::String(kError)); |
| 243 })); | 243 })); |
| 244 | 244 |
| 245 RouteResponseCallbackHandler handler; | 245 RouteResponseCallbackHandler handler; |
| 246 EXPECT_CALL(handler, Invoke(nullptr, kError)); | 246 EXPECT_CALL(handler, Invoke(nullptr, "", kError)); |
| 247 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 247 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 248 route_response_callbacks.push_back(base::Bind( | 248 route_response_callbacks.push_back(base::Bind( |
| 249 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 249 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
| 250 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), kTabId, | 250 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), kTabId, |
| 251 route_response_callbacks); | 251 route_response_callbacks); |
| 252 ProcessEventLoop(); | 252 ProcessEventLoop(); |
| 253 } | 253 } |
| 254 | 254 |
| 255 TEST_F(MediaRouterMojoImplTest, CloseRoute) { | 255 TEST_F(MediaRouterMojoImplTest, CloseRoute) { |
| 256 EXPECT_CALL(mock_media_route_provider_, CloseRoute(mojo::String(kRouteId))); | 256 EXPECT_CALL(mock_media_route_provider_, CloseRoute(mojo::String(kRouteId))); |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 })); | 383 })); |
| 384 | 384 |
| 385 SendMessageCallbackHandler handler; | 385 SendMessageCallbackHandler handler; |
| 386 EXPECT_CALL(handler, Invoke(true)); | 386 EXPECT_CALL(handler, Invoke(true)); |
| 387 router()->SendRouteMessage(kRouteId, kMessage, | 387 router()->SendRouteMessage(kRouteId, kMessage, |
| 388 base::Bind(&SendMessageCallbackHandler::Invoke, | 388 base::Bind(&SendMessageCallbackHandler::Invoke, |
| 389 base::Unretained(&handler))); | 389 base::Unretained(&handler))); |
| 390 ProcessEventLoop(); | 390 ProcessEventLoop(); |
| 391 } | 391 } |
| 392 | 392 |
| 393 TEST_F(MediaRouterMojoImplTest, ListenForRouteMessages) { | 393 TEST_F(MediaRouterMojoImplTest, PresentationSessionMessagesObserver) { |
| 394 mojo::Array<interfaces::RouteMessagePtr> mojo_messages(2); | 394 mojo::Array<interfaces::RouteMessagePtr> mojo_messages(2); |
| 395 mojo_messages[0] = interfaces::RouteMessage::New(); | 395 mojo_messages[0] = interfaces::RouteMessage::New(); |
| 396 mojo_messages[0]->route_id = "r1"; | |
| 397 mojo_messages[0]->type = interfaces::RouteMessage::Type::TYPE_TEXT; | 396 mojo_messages[0]->type = interfaces::RouteMessage::Type::TYPE_TEXT; |
| 398 mojo_messages[0]->message = "text"; | 397 mojo_messages[0]->message = "text"; |
| 399 mojo_messages[1] = interfaces::RouteMessage::New(); | 398 mojo_messages[1] = interfaces::RouteMessage::New(); |
| 400 mojo_messages[1]->route_id = "r2"; | |
| 401 mojo_messages[1]->type = interfaces::RouteMessage::Type::TYPE_BINARY; | 399 mojo_messages[1]->type = interfaces::RouteMessage::Type::TYPE_BINARY; |
| 402 mojo_messages[1]->data.push_back(1); | 400 mojo_messages[1]->data.push_back(1); |
| 403 | 401 |
| 404 scoped_ptr<ScopedVector<content::PresentationSessionMessage>> | 402 ScopedVector<content::PresentationSessionMessage> expected_messages; |
| 405 expected_messages( | 403 scoped_ptr<content::PresentationSessionMessage> message; |
| 406 new ScopedVector<content::PresentationSessionMessage>()); | 404 message.reset(new content::PresentationSessionMessage( |
| 407 expected_messages->push_back( | 405 content::PresentationMessageType::TEXT)); |
| 408 content::PresentationSessionMessage::CreateStringMessage( | 406 message->message = "text"; |
| 409 "", "", make_scoped_ptr(new std::string("text")))); | 407 expected_messages.push_back(message.Pass()); |
| 410 scoped_ptr<std::vector<uint8_t>> expected_binary_data( | |
| 411 new std::vector<uint8_t>(1, 1)); | |
| 412 expected_messages->push_back( | |
| 413 content::PresentationSessionMessage::CreateArrayBufferMessage( | |
| 414 "", "", expected_binary_data.Pass())); | |
| 415 | 408 |
| 416 EXPECT_CALL(mock_media_route_provider_, ListenForRouteMessagesInteral(_, _)) | 409 message.reset(new content::PresentationSessionMessage( |
| 417 .WillOnce(Invoke([&mojo_messages]( | 410 content::PresentationMessageType::ARRAY_BUFFER)); |
| 418 const std::vector<mojo::String>& route_ids, | 411 message->data = std::vector<uint8_t>(1, 1); |
| 419 const interfaces::MediaRouteProvider::ListenForRouteMessagesCallback& | 412 expected_messages.push_back(message.Pass()); |
| 420 cb) { cb.Run(mojo_messages.Pass()); })); | 413 |
| 414 MediaRoute::Id expected_route_id("foo"); |
| 415 interfaces::MediaRouteProvider::ListenForRouteMessagesCallback mojo_callback; |
| 416 EXPECT_CALL(mock_media_route_provider_, |
| 417 ListenForRouteMessages(Eq(expected_route_id), _)) |
| 418 .WillOnce(SaveArg<1>(&mojo_callback)); |
| 421 | 419 |
| 422 ListenForMessagesCallbackHandler handler(expected_messages.Pass()); | 420 ListenForMessagesCallbackHandler handler(expected_messages.Pass()); |
| 423 EXPECT_CALL(handler, InvokeObserver()); | 421 EXPECT_CALL(handler, InvokeObserver()); |
| 424 std::vector<MediaRoute::Id> route_ids; | 422 // Creating PresentationSessionMessagesObserver will register itself to the |
| 425 router()->ListenForRouteMessages( | 423 // MediaRouter, which in turn will start listening for route messages. |
| 426 route_ids, base::Bind(&ListenForMessagesCallbackHandler::Invoke, | 424 scoped_ptr<PresentationSessionMessagesObserver> observer( |
| 427 base::Unretained(&handler))); | 425 new PresentationSessionMessagesObserver( |
| 426 base::Bind(&ListenForMessagesCallbackHandler::Invoke, |
| 427 base::Unretained(&handler)), |
| 428 expected_route_id, router())); |
| 429 ProcessEventLoop(); |
| 430 |
| 431 // Simulate messages by invoking the saved mojo callback. |
| 432 // We expect one more ListenForRouteMessages call since |observer| was |
| 433 // still registered when the first set of messages arrived. |
| 434 mojo_callback.Run(mojo_messages.Pass()); |
| 435 interfaces::MediaRouteProvider::ListenForRouteMessagesCallback |
| 436 mojo_callback_2; |
| 437 EXPECT_CALL(mock_media_route_provider_, ListenForRouteMessages(_, _)) |
| 438 .WillOnce(SaveArg<1>(&mojo_callback_2)); |
| 439 ProcessEventLoop(); |
| 440 |
| 441 // Stop listening for messages. In particular, MediaRouterMojoImpl will not |
| 442 // call ListenForRouteMessages again when it sees there are no more observers. |
| 443 mojo::Array<interfaces::RouteMessagePtr> mojo_messages_2(1); |
| 444 mojo_messages_2[0] = interfaces::RouteMessage::New(); |
| 445 mojo_messages_2[0]->type = interfaces::RouteMessage::Type::TYPE_TEXT; |
| 446 mojo_messages_2[0]->message = "foo"; |
| 447 observer.reset(); |
| 448 mojo_callback_2.Run(mojo_messages_2.Pass()); |
| 428 ProcessEventLoop(); | 449 ProcessEventLoop(); |
| 429 } | 450 } |
| 430 | 451 |
| 431 TEST_F(MediaRouterMojoImplTest, QueuedWhileAsleep) { | 452 TEST_F(MediaRouterMojoImplTest, QueuedWhileAsleep) { |
| 432 EXPECT_CALL(mock_event_page_tracker_, IsEventPageSuspended(extension_id())) | 453 EXPECT_CALL(mock_event_page_tracker_, IsEventPageSuspended(extension_id())) |
| 433 .Times(2) | 454 .Times(2) |
| 434 .WillRepeatedly(Return(true)); | 455 .WillRepeatedly(Return(true)); |
| 435 EXPECT_CALL(mock_event_page_tracker_, WakeEventPage(extension_id(), _)) | 456 EXPECT_CALL(mock_event_page_tracker_, WakeEventPage(extension_id(), _)) |
| 436 .Times(2) | 457 .Times(2) |
| 437 .WillRepeatedly(Return(true)); | 458 .WillRepeatedly(Return(true)); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 517 binding.reset(new mojo::Binding<interfaces::MediaRouteProvider>( | 538 binding.reset(new mojo::Binding<interfaces::MediaRouteProvider>( |
| 518 &mock_media_route_provider, mojo::GetProxy(&media_route_provider_proxy))); | 539 &mock_media_route_provider, mojo::GetProxy(&media_route_provider_proxy))); |
| 519 media_router_proxy->RegisterMediaRouteProvider( | 540 media_router_proxy->RegisterMediaRouteProvider( |
| 520 media_route_provider_proxy.Pass(), | 541 media_route_provider_proxy.Pass(), |
| 521 base::Bind(&RegisterMediaRouteProviderHandler::Invoke, | 542 base::Bind(&RegisterMediaRouteProviderHandler::Invoke, |
| 522 base::Unretained(&provide_handler))); | 543 base::Unretained(&provide_handler))); |
| 523 message_loop.RunUntilIdle(); | 544 message_loop.RunUntilIdle(); |
| 524 } | 545 } |
| 525 | 546 |
| 526 } // namespace media_router | 547 } // namespace media_router |
| OLD | NEW |