| OLD | NEW |
| (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 |
| OLD | NEW |