@@ -34,6 +34,8 @@ filterDescribe('CastReceiver', castReceiverIntegrationSupport, () => {
3434
3535 /** @type {shaka.util.PublicPromise } */
3636 let messageWaitPromise ;
37+ /** @type {Array.<string> } */
38+ let pendingMessages = null ;
3739
3840 /** @type {!Array.<function()> } */
3941 let toRestore ;
@@ -91,6 +93,9 @@ filterDescribe('CastReceiver', castReceiverIntegrationSupport, () => {
9193 toRestore = [ ] ;
9294 pendingWaitWrapperCalls = 0 ;
9395
96+ messageWaitPromise = null ;
97+ pendingMessages = null ;
98+
9499 fakeInitState = {
95100 player : {
96101 configure : { } ,
@@ -118,6 +123,12 @@ filterDescribe('CastReceiver', castReceiverIntegrationSupport, () => {
118123 player = null ;
119124 video = null ;
120125 receiver = null ;
126+
127+ if ( messageWaitPromise ) {
128+ messageWaitPromise . resolve ( [ ] ) ;
129+ }
130+ messageWaitPromise = null ;
131+ pendingMessages = null ;
121132 } ) ;
122133
123134 afterAll ( ( ) => {
@@ -128,6 +139,66 @@ filterDescribe('CastReceiver', castReceiverIntegrationSupport, () => {
128139 }
129140 } ) ;
130141
142+ describe ( 'without drm' , ( ) => {
143+ it ( 'sends reasonably-sized updates' , async ( ) => {
144+ // Use an unencrypted asset.
145+ fakeInitState . manifest = 'test:sintel' ;
146+
147+ const p = waitForLoadedData ( ) ;
148+
149+ // Start the process of loading by sending a fake init message.
150+ fakeConnectedSenders ( 1 ) ;
151+ fakeIncomingMessage ( {
152+ type : 'init' ,
153+ initState : fakeInitState ,
154+ appData : { } ,
155+ } , mockShakaMessageBus ) ;
156+
157+ await p ;
158+ // Wait for an update message.
159+ const messages = await waitForUpdateMessages ( ) ;
160+ for ( const message of messages ) {
161+ // Check that the update message is of a reasonable size. From previous
162+ // testing we found that the socket would silently reject data that got
163+ // too big. 6KB is safely below the limit.
164+ expect ( message . length ) . toBeLessThan ( 6000 ) ;
165+ }
166+ } ) ;
167+
168+ it ( 'has reasonable average message size' , async ( ) => {
169+ // Use an unencrypted asset.
170+ fakeInitState . manifest = 'test:sintel' ;
171+
172+ const p = waitForLoadedData ( ) ;
173+
174+ // Start the process of loading by sending a fake init message.
175+ fakeConnectedSenders ( 1 ) ;
176+ fakeIncomingMessage ( {
177+ type : 'init' ,
178+ initState : fakeInitState ,
179+ appData : { } ,
180+ } , mockShakaMessageBus ) ;
181+
182+ await p ;
183+
184+ // Collect messages over 50 update cycles, and average their length.
185+ // Not all properties are passed along on every update message, so
186+ // the average length is expected to be lower than the length of the first
187+ // update message.
188+ let totalLength = 0 ;
189+ let totalMessages = 0 ;
190+ for ( let i = 0 ; i < 50 ; i ++ ) {
191+ // eslint-disable-next-line no-await-in-loop
192+ const messages = await waitForUpdateMessages ( ) ;
193+ for ( const message of messages ) {
194+ totalLength += message . length ;
195+ totalMessages += 1 ;
196+ }
197+ }
198+ expect ( totalLength / totalMessages ) . toBeLessThan ( 2000 ) ;
199+ } ) ;
200+ } ) ;
201+
131202 filterDescribe ( 'with drm' , ( ) => support [ 'com.widevine.alpha' ] , ( ) => {
132203 drmIt ( 'sends reasonably-sized updates' , async ( ) => {
133204 // Use an encrypted asset, to make sure DRM info doesn't balloon the size.
@@ -150,11 +221,13 @@ filterDescribe('CastReceiver', castReceiverIntegrationSupport, () => {
150221
151222 await p ;
152223 // Wait for an update message.
153- const message = await waitForUpdateMessage ( ) ;
154- // Check that the update message is of a reasonable size. From previous
155- // testing we found that the socket would silently reject data that got
156- // too big. 6KB is safely below the limit.
157- expect ( message . length ) . toBeLessThan ( 7 * 1024 ) ;
224+ const messages = await waitForUpdateMessages ( ) ;
225+ for ( const message of messages ) {
226+ // Check that the update message is of a reasonable size. From previous
227+ // testing we found that the socket would silently reject data that got
228+ // too big. 6KB is safely below the limit.
229+ expect ( message . length ) . toBeLessThan ( 6000 ) ;
230+ }
158231 } ) ;
159232
160233 drmIt ( 'has reasonable average message size' , async ( ) => {
@@ -177,17 +250,22 @@ filterDescribe('CastReceiver', castReceiverIntegrationSupport, () => {
177250 } , mockShakaMessageBus ) ;
178251
179252 await p ;
180- // Collect 50 update messages, and average their length.
253+
254+ // Collect messages over 50 update cycles, and average their length.
181255 // Not all properties are passed along on every update message, so
182256 // the average length is expected to be lower than the length of the first
183257 // update message.
184258 let totalLength = 0 ;
259+ let totalMessages = 0 ;
185260 for ( let i = 0 ; i < 50 ; i ++ ) {
186261 // eslint-disable-next-line no-await-in-loop
187- const message = await waitForUpdateMessage ( ) ;
188- totalLength += message . length ;
262+ const messages = await waitForUpdateMessages ( ) ;
263+ for ( const message of messages ) {
264+ totalLength += message . length ;
265+ totalMessages += 1 ;
266+ }
189267 }
190- expect ( totalLength / 50 ) . toBeLessThan ( 3000 ) ;
268+ expect ( totalLength / totalMessages ) . toBeLessThan ( 2000 ) ;
191269 } ) ;
192270 } ) ;
193271
@@ -227,12 +305,12 @@ filterDescribe('CastReceiver', castReceiverIntegrationSupport, () => {
227305 expect ( pendingWaitWrapperCalls ) . toBe ( 0 ) ;
228306
229307 // Wait for a final update message before proceeding.
230- await waitForUpdateMessage ( ) ;
308+ await waitForUpdateMessages ( ) ;
231309 } ) ;
232310
233311 /**
234312 * Creates a wrapper around a method on a given prototype, which makes it
235- * wait on waitForUpdateMessage before returning, and registers that wrapper
313+ * wait on waitForUpdateMessages before returning, and registers that wrapper
236314 * to be uninstalled afterwards.
237315 * The replaced method is expected to be a method that returns a promise.
238316 * @param {!Object } prototype
@@ -249,7 +327,7 @@ filterDescribe('CastReceiver', castReceiverIntegrationSupport, () => {
249327 'Waiting for update message before calling ' +
250328 name + '.' + methodName + '...' ) ;
251329 const originalArguments = Array . from ( arguments ) ;
252- await waitForUpdateMessage ( ) ;
330+ await waitForUpdateMessages ( ) ;
253331 // eslint-disable-next-line no-restricted-syntax
254332 return original . apply ( this , originalArguments ) ;
255333 } ;
@@ -265,7 +343,8 @@ filterDescribe('CastReceiver', castReceiverIntegrationSupport, () => {
265343 } ) ;
266344 }
267345
268- function waitForUpdateMessage ( ) {
346+ function waitForUpdateMessages ( ) {
347+ pendingMessages = [ ] ;
269348 messageWaitPromise = new shaka . util . PublicPromise ( ) ;
270349 return messageWaitPromise ;
271350 }
@@ -316,10 +395,12 @@ filterDescribe('CastReceiver', castReceiverIntegrationSupport, () => {
316395 bus . messages . push ( CastUtils . deserialize ( message ) ) ;
317396 // Check to see if it's an update message.
318397 const parsed = CastUtils . deserialize ( message ) ;
319- if ( parsed . type == 'update' && messageWaitPromise ) {
398+ if ( parsed . type == 'update' && pendingMessages ) {
320399 shaka . log . debug ( 'Received update message. Proceeding...' ) ;
321- messageWaitPromise . resolve ( message ) ;
322- messageWaitPromise = null ;
400+ // The code waiting on this Promise will get an array of all of the
401+ // messages processed within this tick.
402+ pendingMessages . push ( message ) ;
403+ messageWaitPromise . resolve ( pendingMessages ) ;
323404 }
324405 } ) ;
325406 const channel = {
0 commit comments