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

Side by Side Diff: chrome/browser/media/router/media_router_mojo_impl_unittest.cc

Issue 1126923002: Add Media Router Mojo impl code. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix the patch contents. Created 5 years, 7 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 unified diff | Download patch
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include <string>
6
7 #include "base/bind.h"
8 #include "base/bind_helpers.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "base/run_loop.h"
11 #include "base/synchronization/waitable_event.h"
12 #include "chrome/browser/media/router/media_route.h"
13 #include "chrome/browser/media/router/media_router_mojo_test.h"
14 #include "chrome/browser/media/router/mock_media_router.h"
15 #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/testing_profile.h"
18 #include "testing/gmock/include/gmock/gmock.h"
19 #include "testing/gtest/include/gtest/gtest.h"
20
21 using testing::_;
22 using testing::Eq;
23 using testing::Invoke;
24 using testing::Pointee;
25 using testing::Return;
26 using testing::ReturnRef;
27 using testing::SaveArg;
28
29 const char kDescription[] = "description";
30 const char kError[] = "error";
31 const char kMessage[] = "message";
32 const char kSource[] = "source1";
33 const char kSource2[] = "source2";
34 const char kRouteId[] = "routeId";
35 const char kRouteId2[] = "routeId2";
36 const char kSink[] = "sink";
37 const char kSink2[] = "sink2";
38 const char kSinkName[] = "sinkName";
39
40 namespace media_router {
41
42 // Adapts Invoke(), which takes a move-only scoped_ptr parameter (not mockable)
43 // to a variant that accepts raw pointers instead (mock friendly).
44 class RouteResponseCallbackHandler {
45 public:
46 void Invoke(scoped_ptr<MediaRoute> route, const std::string& error_text) {
47 InvokeObserver(route.get(), error_text);
48 }
49
50 MOCK_METHOD2(InvokeObserver,
51 void(MediaRoute* route, const std::string& error_text));
52 };
53
54 template <typename T>
55 void StoreAndRun(T* result, const base::Closure& closure, const T& result_val) {
56 *result = result_val;
57 closure.Run();
58 }
59
60 class MediaRouterMojoImplTest : public MediaRouterMojoTest {
61 public:
62 MediaRouterMojoImplTest() {}
63 ~MediaRouterMojoImplTest() override {}
64 };
65
66 TEST_F(MediaRouterMojoImplTest, CreateRoute) {
67 MediaRoute expected_route(kRouteId, MediaSource(std::string(kSource)),
68 MediaSink(kSink, kSinkName), "", false);
69 interfaces::MediaRoutePtr route = interfaces::MediaRoute::New();
70 route->media_source = kSource;
71 route->media_sink = interfaces::MediaSink::New();
72 route->media_sink->sink_id = kSink;
73 route->media_sink->name = kSinkName;
74 route->media_route_id = kRouteId;
75 route->description = kDescription;
76
77 // Use a lambda function as an invocation target here to work around
78 // a limitation with GMock::Invoke that prevents it from using move-only types
79 // in runnable parameter lists.
80 EXPECT_CALL(mock_mrpm_host_,
81 CreateRoute(mojo::String(kSource), mojo::String(kSink), _))
82 .WillOnce(Invoke(
83 [&route](const mojo::String& source, const mojo::String& sink,
84 const interfaces::MediaRouter::CreateRouteCallback& cb) {
85 cb.Run(route.Pass(), mojo::String());
86 }));
87
88 RouteResponseCallbackHandler handler;
89 EXPECT_CALL(handler, InvokeObserver(Pointee(Equals(expected_route)), ""));
90 observer_impl_->CreateRoute(kSource, kSink,
91 base::Bind(&RouteResponseCallbackHandler::Invoke,
92 base::Unretained(&handler)));
93 ProcessEventLoop();
94 }
95
96 TEST_F(MediaRouterMojoImplTest, CreateRouteFails) {
97 EXPECT_CALL(mock_mrpm_host_,
98 CreateRoute(mojo::String(kSource), mojo::String(kSink), _))
99 .WillOnce(
100 Invoke([](const mojo::String& source, const mojo::String& sink,
101 const interfaces::MediaRouter::CreateRouteCallback& cb) {
102 cb.Run(interfaces::MediaRoutePtr(), mojo::String(kError));
103 }));
104
105 RouteResponseCallbackHandler handler;
106 EXPECT_CALL(handler, InvokeObserver(nullptr, kError));
107 observer_impl_->CreateRoute(kSource, kSink,
108 base::Bind(&RouteResponseCallbackHandler::Invoke,
109 base::Unretained(&handler)));
110 ProcessEventLoop();
111 }
112
113 TEST_F(MediaRouterMojoImplTest, CloseRoute) {
114 EXPECT_CALL(mock_mrpm_host_, CloseRoute(mojo::String(kRouteId)));
115 observer_impl_->CloseRoute(kRouteId);
116 ProcessEventLoop();
117 }
118
119 TEST_F(MediaRouterMojoImplTest, RegisterAndUnregisterMediaSinksObserver) {
120 MediaSource media_source(kSource);
121
122 MockMediaRouter mock_router;
123 EXPECT_CALL(mock_mrpm_host_, StartObservingMediaSinks(mojo::String(kSource)));
124 EXPECT_CALL(mock_mrpm_host_,
125 StartObservingMediaSinks(mojo::String(kSource2)));
126
127 MediaSinksObserver* captured_observer;
128 EXPECT_CALL(mock_router, RegisterMediaSinksObserver(_))
129 .Times(3)
130 .WillRepeatedly(DoAll(SaveArg<0>(&captured_observer), Return(true)));
131
132 MockMediaSinksObserver sinks_observer(&mock_router, media_source);
133 EXPECT_EQ(&sinks_observer, captured_observer);
134 observer_impl_->RegisterMediaSinksObserver(&sinks_observer);
135 MockMediaSinksObserver extra_sinks_observer(&mock_router, media_source);
136 EXPECT_EQ(&extra_sinks_observer, captured_observer);
137 observer_impl_->RegisterMediaSinksObserver(&extra_sinks_observer);
138 MockMediaSinksObserver unrelated_sinks_observer(&mock_router,
139 MediaSource(kSource2));
140 EXPECT_EQ(&unrelated_sinks_observer, captured_observer);
141 observer_impl_->RegisterMediaSinksObserver(&unrelated_sinks_observer);
142
143 std::vector<MediaSink> expected_sinks;
144 expected_sinks.push_back(MediaSink(kSink, kSinkName));
145 expected_sinks.push_back(MediaSink(kSink2, kSinkName));
146
147 mojo::Array<interfaces::MediaSinkPtr> mojo_sinks(2);
148 mojo_sinks[0] = interfaces::MediaSink::New();
149 mojo_sinks[0]->sink_id = kSink;
150 mojo_sinks[0]->name = kSink;
151 mojo_sinks[1] = interfaces::MediaSink::New();
152 mojo_sinks[1]->sink_id = kSink2;
153 mojo_sinks[1]->name = kSink2;
154
155 EXPECT_CALL(sinks_observer, OnSinksReceived(SequenceEquals(expected_sinks)));
156 EXPECT_CALL(extra_sinks_observer,
157 OnSinksReceived(SequenceEquals(expected_sinks)));
158 observer_proxy_->OnSinksReceived(media_source.id(), mojo_sinks.Pass());
159 ProcessEventLoop();
160
161 EXPECT_CALL(mock_router, UnregisterMediaSinksObserver(&sinks_observer));
162 EXPECT_CALL(mock_router, UnregisterMediaSinksObserver(&extra_sinks_observer));
163 EXPECT_CALL(mock_router,
164 UnregisterMediaSinksObserver(&unrelated_sinks_observer));
165 EXPECT_CALL(mock_mrpm_host_, StopObservingMediaSinks(mojo::String(kSource)));
166 EXPECT_CALL(mock_mrpm_host_, StopObservingMediaSinks(mojo::String(kSource2)));
167 observer_impl_->UnregisterMediaSinksObserver(&sinks_observer);
168 observer_impl_->UnregisterMediaSinksObserver(&extra_sinks_observer);
169 observer_impl_->UnregisterMediaSinksObserver(&unrelated_sinks_observer);
170 ProcessEventLoop();
171 }
172
173 TEST_F(MediaRouterMojoImplTest, RegisterAndUnregisterMediaRoutesObserver) {
174 MockMediaRouter mock_router;
175 EXPECT_CALL(mock_mrpm_host_, StartObservingMediaRoutes());
176
177 MediaRoutesObserver* observer_captured;
178 EXPECT_CALL(mock_router, RegisterMediaRoutesObserver(_))
179 .Times(2)
180 .WillRepeatedly(DoAll(SaveArg<0>(&observer_captured), Return(true)));
181 MockMediaRoutesObserver routes_observer(&mock_router);
182 EXPECT_EQ(observer_captured, &routes_observer);
183 MockMediaRoutesObserver extra_routes_observer(&mock_router);
184 EXPECT_EQ(observer_captured, &extra_routes_observer);
185 observer_impl_->RegisterMediaRoutesObserver(&routes_observer);
186 observer_impl_->RegisterMediaRoutesObserver(&extra_routes_observer);
187
188 std::vector<MediaRoute> expected_routes;
189 expected_routes.push_back(MediaRoute(kRouteId, MediaSource(kSource),
190 MediaSink(kSink, kSink), kDescription,
191 false));
192 expected_routes.push_back(MediaRoute(kRouteId2, MediaSource(kSource),
193 MediaSink(kSink, kSink), kDescription,
194 false));
195
196 mojo::Array<interfaces::MediaRoutePtr> mojo_routes(2);
197 mojo_routes[0] = interfaces::MediaRoute::New();
198 mojo_routes[0]->media_route_id = kRouteId;
199 mojo_routes[0]->media_source = kSource;
200 mojo_routes[0]->media_sink = interfaces::MediaSink::New();
201 mojo_routes[0]->media_sink->sink_id = kSink;
202 mojo_routes[0]->media_sink->name = kSink;
203 mojo_routes[0]->description = kDescription;
204 mojo_routes[0]->is_local = false;
205 mojo_routes[1] = interfaces::MediaRoute::New();
206 mojo_routes[1]->media_route_id = kRouteId2;
207 mojo_routes[1]->media_source = kSource;
208 mojo_routes[1]->media_sink = interfaces::MediaSink::New();
209 mojo_routes[1]->media_sink->sink_id = kSink;
210 mojo_routes[1]->media_sink->name = kSink;
211 mojo_routes[1]->description = kDescription;
212 mojo_routes[1]->is_local = false;
213
214 EXPECT_CALL(routes_observer,
215 OnRoutesUpdated(SequenceEquals(expected_routes)));
216 EXPECT_CALL(extra_routes_observer,
217 OnRoutesUpdated(SequenceEquals(expected_routes)));
218 observer_proxy_->OnRoutesUpdated(mojo_routes.Pass());
219 ProcessEventLoop();
220
221 EXPECT_CALL(mock_router, UnregisterMediaRoutesObserver(&routes_observer));
222 EXPECT_CALL(mock_router,
223 UnregisterMediaRoutesObserver(&extra_routes_observer));
224 observer_impl_->UnregisterMediaRoutesObserver(&routes_observer);
225 observer_impl_->UnregisterMediaRoutesObserver(&extra_routes_observer);
226 EXPECT_CALL(mock_mrpm_host_, StopObservingMediaRoutes());
227 ProcessEventLoop();
228 }
229
230 TEST_F(MediaRouterMojoImplTest, PostMessage) {
231 EXPECT_CALL(mock_mrpm_host_,
232 PostMessage(mojo::String(kRouteId), mojo::String(kMessage)));
233 observer_impl_->PostMessage(kRouteId, kMessage);
234 ProcessEventLoop();
235 }
236
237 TEST_F(MediaRouterMojoImplTest, QueuedWhileAsleep) {
238 EXPECT_CALL(mock_event_page_tracker_, IsEventPageSuspended(extension_id_))
239 .Times(2)
240 .WillRepeatedly(Return(true));
241 EXPECT_CALL(mock_event_page_tracker_, WakeEventPage(extension_id_, _))
242 .Times(2)
243 .WillRepeatedly(Return(true));
244 observer_impl_->CloseRoute(kRouteId);
245 observer_impl_->CloseRoute(kRouteId2);
246 ProcessEventLoop();
247 EXPECT_CALL(mock_event_page_tracker_, IsEventPageSuspended(extension_id_))
248 .Times(1)
249 .WillRepeatedly(Return(false));
250 EXPECT_CALL(mock_mrpm_host_, CloseRoute(mojo::String(kRouteId)));
251 EXPECT_CALL(mock_mrpm_host_, CloseRoute(mojo::String(kRouteId2)));
252 ConnectProviderManagerService();
253 ProcessEventLoop();
254 }
255
256 } // namespace media_router
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698