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

Side by Side Diff: chrome/test/data/extensions/api_test/media_remoting/test_media_router.js

Issue 2724173002: Media Remoting: Add browser tests. (Closed)
Patch Set: Created 3 years, 9 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 2017 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 'use strict';
6
7 mrTest.Parameters = class {
8 constructor() {
9 this.rendererInitSucceed = true;
10 this.route_terminate_while_remoting = false;
11 }
12 };
13
14 mrTest.MediaRoute = class {
15 constructor(sourceUrn) {
16 this.mediaSource = sourceUrn;
17 this.sinkId = "2";
18 this.presentationId_ = "0";
19 this.id = this.getRouteUrn();
20 this.isLocal = true;
21 this.description = "test route.";
22 this.iconUrl = "";
23 this.allowStop = true;
24 this.forDisplay = true;
25 this.offTheRecord = false;
26 this.customControllerPath = null;
27 this.isOffscreenPresentation = false;
28 }
29
30 getRouteUrn() {
31 return 'urn:x-org.test:media:route:' + this.mediaSource + '-' + this.sinkId;
32 }
33
34 getSourceId() { return this.mediaSource; }
35
36 getID() { return this.id; }
37 };
38
39 mrTest.RouteMessage = class {
40 constructor(routeId, message) {
41 this.routeId = routeId;
42 this.message = message;
43 }
44 };
45
46 mrTest.ProviderManager = class {
47 constructor(mediaRouterService, parameters) {
48 this.routes = [];
49 this.service = mediaRouterService;
50 this.receivers = [];
51 this.testParameters = parameters;
52 }
53
54 sendRouteMessage(routeId, message, opt_extraInfo) {
55 this.receivers.forEach(receiver => {
56 if (receiver.routeId == routeId) {
57 receiver.onReceivedMessageFromSource(message);
58 return Promise.resolve();
59 }
60 });
61 return Promise.resolve();
62 }
63
64 sendRouteBinaryMessage(routeId, data) {
65 this.receivers.forEach(receiver => {
66 if (receiver.routeId == routeId) {
67 receiver.onReceivedBinaryMessageFromSource(data);
68 return Promise.resolve();
69 }
70 });
71 return Promise.resolve();
72 }
73
74 startObservingMediaRoutes(sourceUrn) {
75 this.routes.forEach(route => {
76 if (route.getSourceId() == sourceUrn) {
77 return;
78 }
79 });
80 let newRoute = new mrTest.MediaRoute(sourceUrn);
81 let receiver = new mrTest.Receiver(this, newRoute.id);
82 this.routes.push(newRoute);
83 this.receivers.push(receiver);
84 this.service.onRoutesUpdated(this.routes, sourceUrn, []);
85 }
86
87 stopObservingMediaRoutes(sourceUrn) {
88 let routeToRemove = null;
89 this.routes.forEach(route => {
90 if (route.getSourceId() == sourceUrn) {
91 routeToRemove = route;
92 }
93 });
94 if (routeToRemove == null)
95 return;
96 let receiverToRemove = null;
97 this.receivers.forEach(receiver => {
98 if (receiver.routeId == routeToRemove.id) {
99 receiverToRemove = receiver;
100 }
101 });
102 let index = this.routes.indexOf(routeToRemove);
103 if (index > -1)
104 this.routes.splice(index, 1);
105 index = this.receivers.indexOf(receiverToRemove);
106 if (index > -1)
107 this.receivers.splice(index, 1);
108 }
109
110 sendMessageToSource(message, routeId) {
111 let routeMessage = new mrTest.RouteMessage(routeId, message);
112 this.service.onRouteMessagesReceived(routeId, [routeMessage]);
113 }
114
115 RemoveRoute(routeId) {
116 let routeToRemove = null;
117 this.routes.forEach(route => {
118 if (route.id == routeId) {
119 routeToRemove = route;
120 }
121 });
122 if (routeToRemove == null)
123 return;
124 this.service.onRoutesUpdated([], routeToRemove.getSourceId(), []);
125
126 // Remove the route and corresponding receiver from the list.
127 let receiverToRemove = null;
128 this.receivers.forEach(receiver => {
129 if (receiver.routeId == routeId) {
130 receiverToRemove = receiver;
131 }
132 });
133 let index = this.routes.indexOf(routeToRemove);
134 if (index > -1)
135 this.routes.splice(index, 1);
136 index = this.receivers.indexOf(receiverToRemove);
137 if (index > -1)
138 this.receivers.splice(index, 1);
139 }
140
141 // Below handlers are not used in the tests.
142 onBeforeInvokeHandler() {}
143 createRoute(sourceUrn, sinkId, presentationId, opt_origin,
144 opt_tabId, opt_timeoutMillis, opt_offTheRecord) {}
145 connectRouteByRouteId(sourceUrn, routeId,
146 presentationId, origin, tabId, opt_timeoutMillis) {}
147 joinRoute(sourceUrn, presentationId, origin,
148 tabId, opt_timeoutMillis, opt_offTheRecord) {}
149 terminateRoute(routeId) {}
150 startObservingMediaSinks(sourceUrn) {}
151 stopObservingMediaSinks(sourceUrn) {}
152 searchSinks(sinkId, sourceUrn, searchCriteria) {}
153 updateMediaSinks(sourceUrn) {}
154 startListeningForRouteMessages(routeId) {}
155 stopListeningForRouteMessages(routeId) {}
156 detachRoute(routeId) {}
157 enableMdnsDiscovery() {}
158 };
159
160 // Simulates a media remoting receiver. Currently only implements the
161 // start of remoting and the initialization of renderer.
162 mrTest.Receiver = class {
163 constructor(provideManager, routeId) {
164 this.mrp = provideManager;
165 this.routeId = routeId;
166 this.sessionId = null;
167 // The RPC handle of this receiver.
168 this.handle = 3;
169 // The RPC handle of the renderer on sender side.
170 this.remoteHandle = null;
171 // The number of streams to start remoting with.
172 this.num_start_streams = 0;
173 // The number of stream handles from RPC_R_INITIALIZE message.
174 this.num_stream_handle = 0;
175 // The number of streams that are initialized.
176 this.num_initialized_stream = 0;
177 }
178
179 onReceivedMessageFromSource(message) {
180 // Each control message is a colon-delimited string. The first element is
181 // the command instruction, and all successive ones are arguments. See
182 // src/chrome/browser/media/cast_remoting_connector_messaging.cc in the
183 // Chromium project for further details.
184 const instruction = message.split(':');
185
186 // All control messages include a control session ID.
187 const sessionId =
188 (instruction.find(piece => piece.startsWith('session=')) ||
189 '').substring(8);
190 if (sessionId.length == 0) {
191 return Promise.resolve();
192 }
193
194 switch (instruction[0]) {
195 case 'START_CAST_REMOTING':
196 // There can only be one remoting session started at one time.
197 chrome.test.assertEq(this.sessionId, null);
198 this.sessionId = sessionId;
199 chrome.test.sendMessage('start_remoting');
200 break;
201
202 case 'START_CAST_REMOTING_STREAMS':
203 chrome.test.assertEq(this.sessionId, sessionId);
204 const withAudio = instruction.some(piece => piece == 'audio=Y');
205 const withVideo = instruction.some(piece => piece == 'video=Y');
206 if (withAudio)
207 ++this.num_start_streams;
208 if (withVideo)
209 ++this.num_start_streams;
210 chrome.test.sendMessage('start_remoting_streams');
211 if (this.mrp.testParameters.route_terminate_while_remoting)
212 this.mrp.RemoveRoute(this.routeId);
213 break;
214
215 case 'STOP_CAST_REMOTING':
216 chrome.test.assertEq(this.sessionId, sessionId);
217 this.sessionId = null;
218 chrome.test.sendMessage('stop_remoting');
219 break;
220
221 default:
222 break;
223 }
224
225 return Promise.resolve();
226 }
227
228 onReceivedBinaryMessageFromSource(message) {
229 let rpc = new mrTest.RpcMessage();
230 let reader = new mrTest.reader(message);
231 reader.deserializeBinary(rpc);
232 chrome.test.assertTrue((rpc.getHandle() == this.handle) ||
233 (rpc.getHandle() == 0));
234 switch(rpc.getProc()) {
235 case mrTest.RpcProc.RPC_ACQUIRE_RENDERER:
236 this.remoteHandle = rpc.getIntegerValue();
237 chrome.test.sendMessage("received_acquire_renderer");
238 // Send RPC_ACQUIRE_RENDERER_DONE message.
239 let remoteMessage = new mrTest.RpcMessage();
240 remoteMessage.setHandle(this.remoteHandle);
241 remoteMessage.setProc(mrTest.RpcProc.RPC_ACQUIRE_RENDERER_DONE);
242 remoteMessage.setIntegerValue(this.handle);
243 let writer = new mrTest.Writer();
244 writer.serializeMessage(remoteMessage);
245 this.mrp.sendMessageToSource(writer.getResultBuffer(), this.routeId);
246 break;
247 case mrTest.RpcProc.RPC_R_INITIALIZE:
248 chrome.test.sendMessage("received_renderer_initialize");
249 this.initializeRenderer(rpc.getRendererInitializeRpc());
250 break;
251 case mrTest.RpcProc.RPC_DS_INITIALIZE_CALLBACK:
252 this.onDemuxerStreamInitialized();
253 break;
254 case mrTest.RpcProc.RPC_R_STARTPLAYINGFROM:
255 chrome.test.sendMessage("received_startplayingfrom_rpc");
256 break;
257 default:
258 // Ignore other messages.
259 break;
260 }
261
262 return Promise.resolve();
263 }
264
265 initializeRenderer(rendererInitRpc) {
266 if (rendererInitRpc.getAudioDemuxerHandle()) {
267 ++this.num_stream_handle;
268 // Send RPC_DS_INITIALIZE message for audio.
269 let remoteMessage = new mrTest.RpcMessage();
270 remoteMessage.setHandle(rendererInitRpc.getAudioDemuxerHandle());
271 remoteMessage.setProc(mrTest.RpcProc.RPC_DS_INITIALIZE);
272 remoteMessage.setIntegerValue(this.handle);
273 let writer = new mrTest.Writer();
274 writer.serializeMessage(remoteMessage);
275 this.mrp.sendMessageToSource(writer.getResultBuffer(), this.routeId);
276 }
277 if (rendererInitRpc.getVideoDemuxerHandle()) {
278 ++this.num_stream_handle;
279 // Send RPC_DS_INITIALIZE message for video.
280 let remoteMessage = new mrTest.RpcMessage();
281 remoteMessage.setHandle(rendererInitRpc.getVideoDemuxerHandle());
282 remoteMessage.setProc(mrTest.RpcProc.RPC_DS_INITIALIZE);
283 remoteMessage.setIntegerValue(this.handle);
284 let writer = new mrTest.Writer();
285 writer.serializeMessage(remoteMessage);
286 this.mrp.sendMessageToSource(writer.getResultBuffer(), this.routeId);
287 }
288 chrome.test.assertEq(this.num_stream_handle, this.num_start_streams);
289 }
290
291 onDemuxerStreamInitialized() {
292 ++this.num_initialized_stream;
293 if (this.num_stream_handle == this.num_initialized_stream ) {
294 chrome.test.sendMessage("demuxer_stream_initialized");
295 // Send RPC_R_INITIALIZE_CALLBACK message.
296 let remoteMessage = new mrTest.RpcMessage();
297 remoteMessage.setHandle(this.remoteHandle);
298 remoteMessage.setProc(mrTest.RpcProc.RPC_R_INITIALIZE_CALLBACK);
299 remoteMessage.setBool(this.mrp.testParameters.rendererInitSucceed);
300 let writer = new mrTest.Writer();
301 writer.serializeMessage(remoteMessage);
302 this.mrp.sendMessageToSource(writer.getResultBuffer(), this.routeId);
303 }
304 }
305 };
306
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698