Chromium Code Reviews| Index: chrome/browser/media/router/mojo/media_route_controller_unittest.cc |
| diff --git a/chrome/browser/media/router/mojo/media_route_controller_unittest.cc b/chrome/browser/media/router/mojo/media_route_controller_unittest.cc |
| index 17487a583f9e0f3e1acc5484b33d4bd65d6aa705..f149de8c556a5d69d08902abec817637f2d74cdf 100644 |
| --- a/chrome/browser/media/router/mojo/media_route_controller_unittest.cc |
| +++ b/chrome/browser/media/router/mojo/media_route_controller_unittest.cc |
| @@ -8,31 +8,21 @@ |
| #include <utility> |
| #include "base/run_loop.h" |
| +#include "chrome/browser/media/router/mock_media_router.h" |
| #include "chrome/browser/media/router/mojo/media_router_mojo_test.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| +using ::testing::Mock; |
| using ::testing::StrictMock; |
| namespace media_router { |
| -class MockMediaController : public mojom::MediaController { |
| - public: |
| - MOCK_METHOD0(Play, void()); |
| - MOCK_METHOD0(Pause, void()); |
| - MOCK_METHOD1(SetMute, void(bool mute)); |
| - MOCK_METHOD1(SetVolume, void(float volume)); |
| - MOCK_METHOD1(Seek, void(base::TimeDelta time)); |
| -}; |
| +namespace { |
| -class MockMediaRouteControllerObserver : public MediaRouteController::Observer { |
| - public: |
| - MockMediaRouteControllerObserver( |
| - scoped_refptr<MediaRouteController> controller) |
| - : MediaRouteController::Observer(controller) {} |
| +constexpr char kRouteId[] = "routeId"; |
| - MOCK_METHOD1(OnMediaStatusUpdated, void(const MediaStatus& status)); |
| -}; |
| +} // namespace |
| class MediaRouteControllerTest : public ::testing::Test { |
| public: |
| @@ -43,12 +33,11 @@ class MediaRouteControllerTest : public ::testing::Test { |
| mojom::MediaControllerPtr media_controller_ptr; |
| mojom::MediaControllerRequest media_controller_request = |
| mojo::MakeRequest(&media_controller_ptr); |
| - media_controller_binding_ = |
| - base::MakeUnique<mojo::Binding<mojom::MediaController>>( |
| - &mock_media_controller_, std::move(media_controller_request)); |
| + mock_media_controller_.Bind(std::move(media_controller_request)); |
| observer_ = base::MakeUnique<MockMediaRouteControllerObserver>( |
| - new MediaRouteController("routeId", std::move(media_controller_ptr))); |
| + new MediaRouteController(kRouteId, std::move(media_controller_ptr), |
| + &router_)); |
| } |
| scoped_refptr<MediaRouteController> GetController() const { |
| @@ -63,9 +52,8 @@ class MediaRouteControllerTest : public ::testing::Test { |
| GetController()); |
| } |
| + MockMediaRouter router_; |
| MockMediaController mock_media_controller_; |
| - std::unique_ptr<mojo::Binding<mojom::MediaController>> |
| - media_controller_binding_; |
| std::unique_ptr<MockMediaRouteControllerObserver> observer_; |
| content::TestBrowserThreadBundle test_thread_bundle_; |
| @@ -97,18 +85,56 @@ TEST_F(MediaRouteControllerTest, NotifyMediaRouteControllerObservers) { |
| MediaStatus status; |
| status.title = "test media status"; |
| + // Get a mojo pointer for |controller_|, so that we can notify it of status |
| + // updates via mojo. |
| + mojom::MediaStatusObserverPtr mojo_observer = |
| + GetController()->BindObserverPtr(); |
| + |
| + base::RunLoop run_loop1; |
| EXPECT_CALL(*observer1, OnMediaStatusUpdated(status)); |
| EXPECT_CALL(*observer2, OnMediaStatusUpdated(status)); |
| - // TODO(takumif): Use a mojom::MediaStatusObserverPtr bound to the controller. |
| - GetController()->OnMediaStatusUpdated(status); |
| + mojo_observer->OnMediaStatusUpdated(status); |
| + run_loop1.RunUntilIdle(); |
| observer1.reset(); |
| auto observer3 = CreateObserver(); |
| + base::RunLoop run_loop2; |
|
dcheng
2017/04/14 05:30:07
This should be able to just use the original RunLo
takumif
2017/04/14 18:42:58
How do I do that? I thought Run()/RunUntilIdle() c
dcheng
2017/04/14 19:25:25
It can be called more than once.
dcheng
2017/04/14 19:30:04
Actually you're right.
I'm confused =)
You can e
|
| EXPECT_CALL(*observer2, OnMediaStatusUpdated(status)); |
| EXPECT_CALL(*observer3, OnMediaStatusUpdated(status)); |
| - // TODO(takumif): Use a mojom::MediaStatusObserverPtr bound to the controller. |
| - GetController()->OnMediaStatusUpdated(status); |
| + mojo_observer->OnMediaStatusUpdated(status); |
| + run_loop2.RunUntilIdle(); |
| +} |
| + |
| +TEST_F(MediaRouteControllerTest, DestroyControllerOnDisconnect) { |
| + base::RunLoop run_loop; |
| + |
| + // DetachRouteController() should be called when the connection to |
| + // |mock_media_controller_| is invalidated. |
| + EXPECT_CALL(router_, DetachRouteController(kRouteId, GetController().get())) |
| + .Times(1); |
| + mock_media_controller_.CloseBinding(); |
| + |
| + run_loop.RunUntilIdle(); |
| + EXPECT_TRUE(Mock::VerifyAndClearExpectations(&router_)); |
| +} |
| + |
| +TEST_F(MediaRouteControllerTest, DestroyControllerOnNoObservers) { |
| + auto observer1 = CreateObserver(); |
| + auto observer2 = CreateObserver(); |
| + // Get a pointer to the controller to use in EXPECT_CALL(). |
| + MediaRouteController* controller = GetController().get(); |
| + // Get rid of |observer_| and its reference to the controller. |
| + observer_.reset(); |
| + |
| + EXPECT_CALL(router_, DetachRouteController(kRouteId, controller)).Times(0); |
| + observer1.reset(); |
| + |
| + // DetachRouteController() should be called when the controller no longer |
| + // has any observers. |
| + EXPECT_CALL(router_, DetachRouteController(kRouteId, controller)).Times(1); |
| + observer2.reset(); |
| + EXPECT_TRUE(Mock::VerifyAndClearExpectations(&router_)); |
| } |
| } // namespace media_router |