Jforrester has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/353890 )
Change subject: Fix mmv.logging.PerformanceLogger qunit tests ...................................................................... Fix mmv.logging.PerformanceLogger qunit tests Bug: T164473 Change-Id: I6ae5c0170bf12fb076ddc505299ceeb7b9c292e8 --- M resources/mmv/logging/mmv.logging.PerformanceLogger.js M tests/qunit/mmv/logging/mmv.logging.PerformanceLogger.test.js 2 files changed, 79 insertions(+), 61 deletions(-) Approvals: Jforrester: Verified; Looks good to me, approved diff --git a/resources/mmv/logging/mmv.logging.PerformanceLogger.js b/resources/mmv/logging/mmv.logging.PerformanceLogger.js index fdbfd65..639e907 100644 --- a/resources/mmv/logging/mmv.logging.PerformanceLogger.js +++ b/resources/mmv/logging/mmv.logging.PerformanceLogger.js @@ -116,6 +116,7 @@ * @param {string} url URL of that was measured * @param {XMLHttpRequest} request HTTP request that just completed * @param {jQuery.Deferred.<string>} [extraStatsDeferred] A promise which resolves to extra stats to be included. + * @return {jQuery.Promise} */ PL.recordEntry = function ( type, total, url, request, extraStatsDeferred ) { var matches, @@ -133,7 +134,7 @@ if ( url && url.length ) { // There is no need to measure the same url more than once if ( url in this.performanceChecked ) { - return; + return $.Deferred().reject(); } this.performanceChecked[ url ] = true; @@ -166,7 +167,7 @@ } } - ( extraStatsDeferred || $.Deferred().reject() ).done( function ( extraStats ) { + return ( extraStatsDeferred || $.Deferred().reject() ).done( function ( extraStats ) { stats = $.extend( stats, extraStats ); } ).always( function () { logger.log( stats ); diff --git a/tests/qunit/mmv/logging/mmv.logging.PerformanceLogger.test.js b/tests/qunit/mmv/logging/mmv.logging.PerformanceLogger.test.js index 006f392..777f129 100644 --- a/tests/qunit/mmv/logging/mmv.logging.PerformanceLogger.test.js +++ b/tests/qunit/mmv/logging/mmv.logging.PerformanceLogger.test.js @@ -40,7 +40,9 @@ var performance = new mw.mmv.logging.PerformanceLogger(), fakeEventLog = { logEvent: this.sandbox.stub() }, type = 'gender', - total = 100; + total = 100, + // we'll be waiting for 4 promises to complete + asyncs = [ assert.async(), assert.async(), assert.async(), assert.async() ]; this.sandbox.stub( performance, 'loadDependencies' ).returns( $.Deferred().resolve() ); this.sandbox.stub( performance, 'isInSample' ); @@ -48,27 +50,30 @@ performance.isInSample.returns( false ); - performance.recordEntry( type, total ); - - assert.strictEqual( fakeEventLog.logEvent.callCount, 0, 'No stats should be logged if not in sample' ); + performance.recordEntry( type, total ).then( null, function () { + assert.strictEqual( fakeEventLog.logEvent.callCount, 0, 'No stats should be logged if not in sample' ); + asyncs.pop()(); + } ); performance.isInSample.returns( true ); - performance.recordEntry( type, total ); + performance.recordEntry( type, total ).then( null, function () { + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 0 ], 'MultimediaViewerNetworkPerformance', 'EventLogging schema is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].type, type, 'type is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].total, total, 'total is correct' ); + assert.strictEqual( fakeEventLog.logEvent.callCount, 1, 'Stats should be logged' ); + asyncs.pop()(); + } ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 0 ], 'MultimediaViewerNetworkPerformance', 'EventLogging schema is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].type, type, 'type is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].total, total, 'total is correct' ); + performance.recordEntry( type, total, 'URL' ).then( null, function () { + assert.strictEqual( fakeEventLog.logEvent.callCount, 2, 'Stats should be logged' ); + asyncs.pop()(); + } ); - assert.strictEqual( fakeEventLog.logEvent.callCount, 1, 'Stats should be logged' ); - - performance.recordEntry( type, total, 'URL' ); - - assert.strictEqual( fakeEventLog.logEvent.callCount, 2, 'Stats should be logged' ); - - performance.recordEntry( type, total, 'URL' ); - - assert.strictEqual( fakeEventLog.logEvent.callCount, 2, 'Stats should not be logged a second time for the same URL' ); + performance.recordEntry( type, total, 'URL' ).then( null, function () { + assert.strictEqual( fakeEventLog.logEvent.callCount, 2, 'Stats should not be logged a second time for the same URL' ); + asyncs.pop()(); + } ); } ); QUnit.test( 'recordEntry: with Navigation Timing data', 29, function ( assert ) { @@ -114,7 +119,8 @@ status = 200, metered = true, bandwidth = 45.67, - fakeEventLog = { logEvent: this.sandbox.stub() }; + fakeEventLog = { logEvent: this.sandbox.stub() }, + done = assert.async(); this.sandbox.stub( performance, 'loadDependencies' ).returns( $.Deferred().resolve() ); performance.setEventLog( fakeEventLog ); @@ -153,37 +159,38 @@ performance.setGeo( { country: country } ); - performance.recordEntry( type, 100, url, fakeRequest ); - - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 0 ], 'MultimediaViewerNetworkPerformance', 'EventLogging schema is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].type, type, 'type is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].varnish1, varnish1, 'varnish1 is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].varnish2, varnish2, 'varnish2 is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].varnish3, varnish3, 'varnish3 is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].varnish4, undefined, 'varnish4 is undefined' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].varnish1hits, varnish1hits, 'varnish1hits is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].varnish2hits, varnish2hits, 'varnish2hits is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].varnish3hits, varnish3hits, 'varnish3hits is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].varnish4hits, undefined, 'varnish4hits is undefined' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].XVarnish, xvarnish, 'XVarnish is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].XCache, xcache, 'XCache is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].age, parseInt( age, 10 ), 'age is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].contentLength, parseInt( contentLength, 10 ), 'contentLength is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].contentHost, window.location.host, 'contentHost is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].urlHost, urlHost, 'urlHost is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].timestamp, timestamp, 'timestamp is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].total, perfData.duration, 'total is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].redirect, redirect, 'redirect is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].dns, dns, 'dns is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].tcp, tcp, 'tcp is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].request, request, 'request is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].response, response, 'response is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].cache, cache, 'cache is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].country, country, 'country is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].isHttps, true, 'isHttps is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].status, status, 'status is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].metered, metered, 'metered is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].bandwidth, Math.round( bandwidth ), 'bandwidth is correct' ); + performance.recordEntry( type, 100, url, fakeRequest ).then( null, function () { + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 0 ], 'MultimediaViewerNetworkPerformance', 'EventLogging schema is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].type, type, 'type is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].varnish1, varnish1, 'varnish1 is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].varnish2, varnish2, 'varnish2 is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].varnish3, varnish3, 'varnish3 is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].varnish4, undefined, 'varnish4 is undefined' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].varnish1hits, varnish1hits, 'varnish1hits is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].varnish2hits, varnish2hits, 'varnish2hits is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].varnish3hits, varnish3hits, 'varnish3hits is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].varnish4hits, undefined, 'varnish4hits is undefined' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].XVarnish, xvarnish, 'XVarnish is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].XCache, xcache, 'XCache is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].age, parseInt( age, 10 ), 'age is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].contentLength, parseInt( contentLength, 10 ), 'contentLength is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].contentHost, window.location.host, 'contentHost is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].urlHost, urlHost, 'urlHost is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].timestamp, timestamp, 'timestamp is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].total, perfData.duration, 'total is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].redirect, redirect, 'redirect is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].dns, dns, 'dns is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].tcp, tcp, 'tcp is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].request, request, 'request is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].response, response, 'response is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].cache, cache, 'cache is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].country, country, 'country is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].isHttps, true, 'isHttps is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].status, status, 'status is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].metered, metered, 'metered is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].bandwidth, Math.round( bandwidth ), 'bandwidth is correct' ); + done(); + } ); } ); QUnit.test( 'recordEntry: with async extra stats', 11, function ( assert ) { @@ -193,7 +200,8 @@ total = 100, overriddenType = 'image', foo = 'bar', - extraStatsPromise = $.Deferred(); + extraStatsPromise = $.Deferred(), + clock = this.sandbox.useFakeTimers(); this.sandbox.stub( performance, 'loadDependencies' ).returns( $.Deferred().resolve() ); this.sandbox.stub( performance, 'isInSample' ); @@ -207,11 +215,18 @@ extraStatsPromise.reject(); - assert.strictEqual( fakeEventLog.logEvent.callCount, 1, 'Stats should be logged' ); + extraStatsPromise.then( null, function () { + assert.strictEqual( fakeEventLog.logEvent.callCount, 1, 'Stats should be logged' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 0 ], 'MultimediaViewerNetworkPerformance', 'EventLogging schema is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].type, type, 'type is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].total, total, 'total is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 0 ], 'MultimediaViewerNetworkPerformance', 'EventLogging schema is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].type, type, 'type is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 0 ).args[ 1 ].total, total, 'total is correct' ); + } ); + + // make sure first promise is completed before recording another entry, + // to make sure data in fakeEventLog doesn't suffer race conditions + clock.tick( 10 ); + clock.restore(); extraStatsPromise = $.Deferred(); @@ -221,12 +236,14 @@ extraStatsPromise.resolve( { type: overriddenType, foo: foo } ); - assert.strictEqual( fakeEventLog.logEvent.callCount, 2, 'Stats should be logged' ); + return extraStatsPromise.then( function () { + assert.strictEqual( fakeEventLog.logEvent.callCount, 2, 'Stats should be logged' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 1 ).args[ 0 ], 'MultimediaViewerNetworkPerformance', 'EventLogging schema is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 1 ).args[ 1 ].type, overriddenType, 'type is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 1 ).args[ 1 ].total, total, 'total is correct' ); - assert.strictEqual( fakeEventLog.logEvent.getCall( 1 ).args[ 1 ].foo, foo, 'extra stat is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 1 ).args[ 0 ], 'MultimediaViewerNetworkPerformance', 'EventLogging schema is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 1 ).args[ 1 ].type, overriddenType, 'type is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 1 ).args[ 1 ].total, total, 'total is correct' ); + assert.strictEqual( fakeEventLog.logEvent.getCall( 1 ).args[ 1 ].foo, foo, 'extra stat is correct' ); + } ); } ); QUnit.test( 'parseVarnishXCacheHeader', 15, function ( assert ) { -- To view, visit https://gerrit.wikimedia.org/r/353890 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I6ae5c0170bf12fb076ddc505299ceeb7b9c292e8 Gerrit-PatchSet: 3 Gerrit-Project: mediawiki/extensions/MultimediaViewer Gerrit-Branch: master Gerrit-Owner: Matthias Mullie <mmul...@wikimedia.org> Gerrit-Reviewer: Jforrester <jforres...@wikimedia.org> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits