Title: [198826] trunk/Websites/perf.webkit.org
Revision
198826
Author
rn...@webkit.org
Date
2016-03-29 21:16:48 -0700 (Tue, 29 Mar 2016)

Log Message

Make dependency injection in unit tests more explicit
https://bugs.webkit.org/show_bug.cgi?id=156006

Reviewed by Joseph Pecoraro.

Make the dependency injection of model objects in unit tests explicit so that server tests that create
"real" model objects won't create these mock objects. Now each test that uses mock model objects would call
MockModels.inject() to inject before / beforeEach and access each object using a property on MockModels
instead of them being implicitly defined on the global object.

Similarly, MockRemoteAPI now only replaces global.RemoteAPI during each test so that server tests can use
real RemoteAPI to access the test Apache server.

* unit-tests/analysis-task-tests.js:
* unit-tests/buildbot-syncer-tests.js:
(createSampleBuildRequest):
* unit-tests/measurement-adaptor-tests.js:
* unit-tests/measurement-set-tests.js:
* unit-tests/resources/mock-remote-api.js:
(MockRemoteAPI.getJSONWithStatus):
(MockRemoteAPI.inject): Added. Override RemoteAPI on the global object during each test.
* unit-tests/resources/mock-v3-models.js:
(MockModels.inject): Added. Create mock model objects before each test, and clear all static maps of
various v3 model classes (to remove all singleton objects for those model classes).
* unit-tests/test-groups-tests.js:

Modified Paths

Diff

Modified: trunk/Websites/perf.webkit.org/ChangeLog (198825 => 198826)


--- trunk/Websites/perf.webkit.org/ChangeLog	2016-03-30 03:34:15 UTC (rev 198825)
+++ trunk/Websites/perf.webkit.org/ChangeLog	2016-03-30 04:16:48 UTC (rev 198826)
@@ -1,5 +1,33 @@
 2016-03-29  Ryosuke Niwa  <rn...@webkit.org>
 
+        Make dependency injection in unit tests more explicit
+        https://bugs.webkit.org/show_bug.cgi?id=156006
+
+        Reviewed by Joseph Pecoraro.
+
+        Make the dependency injection of model objects in unit tests explicit so that server tests that create
+        "real" model objects won't create these mock objects. Now each test that uses mock model objects would call
+        MockModels.inject() to inject before / beforeEach and access each object using a property on MockModels
+        instead of them being implicitly defined on the global object.
+
+        Similarly, MockRemoteAPI now only replaces global.RemoteAPI during each test so that server tests can use
+        real RemoteAPI to access the test Apache server.
+
+        * unit-tests/analysis-task-tests.js:
+        * unit-tests/buildbot-syncer-tests.js:
+        (createSampleBuildRequest):
+        * unit-tests/measurement-adaptor-tests.js:
+        * unit-tests/measurement-set-tests.js:
+        * unit-tests/resources/mock-remote-api.js:
+        (MockRemoteAPI.getJSONWithStatus):
+        (MockRemoteAPI.inject): Added. Override RemoteAPI on the global object during each test.
+        * unit-tests/resources/mock-v3-models.js:
+        (MockModels.inject): Added. Create mock model objects before each test, and clear all static maps of
+        various v3 model classes (to remove all singleton objects for those model classes).
+        * unit-tests/test-groups-tests.js:
+
+2016-03-29  Ryosuke Niwa  <rn...@webkit.org>
+
         BuildbotSyncer should be able to fetch JSON from buildbot
         https://bugs.webkit.org/show_bug.cgi?id=155921
 

Modified: trunk/Websites/perf.webkit.org/unit-tests/analysis-task-tests.js (198825 => 198826)


--- trunk/Websites/perf.webkit.org/unit-tests/analysis-task-tests.js	2016-03-30 03:34:15 UTC (rev 198825)
+++ trunk/Websites/perf.webkit.org/unit-tests/analysis-task-tests.js	2016-03-30 04:16:48 UTC (rev 198826)
@@ -3,8 +3,8 @@
 var assert = require('assert');
 
 require('../tools/js/v3-models.js');
-require('./resources/mock-v3-models.js');
-require('./resources/mock-remote-api.js');
+let MockModels = require('./resources/mock-v3-models.js').MockModels;
+let MockRemoteAPI = require('./resources/mock-remote-api.js').MockRemoteAPI;
 
 function sampleAnalysisTask()
 {
@@ -117,6 +117,9 @@
 }
 
 describe('AnalysisTask', function () {
+    MockModels.inject();
+    let requests = MockRemoteAPI.inject();
+
     describe('fetchAll', function () {
         it('should request all analysis tasks', function () {
             var callCount = 0;
@@ -167,8 +170,8 @@
                 assert.equal(AnalysisTask.all().length, 1);
                 var task = AnalysisTask.all()[0];
                 assert.equal(task.id(), 1082);
-                assert.equal(task.metric(), someMetric);
-                assert.equal(task.platform(), somePlatform);
+                assert.equal(task.metric(), MockModels.someMetric);
+                assert.equal(task.platform(), MockModels.somePlatform);
                 assert.ok(task.hasResults());
                 assert.ok(task.hasPendingRequests());
                 assert.equal(task.requestLabel(), '6 of 14');
@@ -194,7 +197,7 @@
                 var commit = task.causes()[0];
 
                 assert.equal(commit.revision(), '196051');
-                assert.equal(commit.repository(), webkit);
+                assert.equal(commit.repository(), MockModels.webkit);
                 assert.equal(+commit.time(), 1454481246108);
                 done();
             }).catch(function (error) { done(error); });
@@ -204,7 +207,7 @@
             var adoptor = new MeasurementAdaptor(measurementCluster().formatMap);
             var adoptedMeasurement = adoptor.applyTo(measurementCluster().configurations.current[0]);
             assert.equal(adoptedMeasurement.id, 37188161);
-            assert.equal(adoptedMeasurement.rootSet().commitForRepository(webkit).revision(), '196051');
+            assert.equal(adoptedMeasurement.rootSet().commitForRepository(MockModels.webkit).revision(), '196051');
 
             var promise = AnalysisTask.fetchAll();
             requests[0].resolve(sampleAnalysisTask());
@@ -216,7 +219,7 @@
                 assert.equal(task.causes().length, 1);
                 var commit = task.causes()[0];
                 assert.equal(commit.revision(), '196051');
-                assert.equal(commit.repository(), webkit);
+                assert.equal(commit.repository(), MockModels.webkit);
                 assert.equal(+commit.time(), 1454481246108);
                 done();
             }).catch(function (error) { done(error); });

Modified: trunk/Websites/perf.webkit.org/unit-tests/buildbot-syncer-tests.js (198825 => 198826)


--- trunk/Websites/perf.webkit.org/unit-tests/buildbot-syncer-tests.js	2016-03-30 03:34:15 UTC (rev 198825)
+++ trunk/Websites/perf.webkit.org/unit-tests/buildbot-syncer-tests.js	2016-03-30 04:16:48 UTC (rev 198826)
@@ -3,8 +3,8 @@
 let assert = require('assert');
 
 require('../tools/js/v3-models.js');
-require('./resources/mock-remote-api.js');
-require('./resources/mock-v3-models.js');
+let MockRemoteAPI = require('./resources/mock-remote-api.js').MockRemoteAPI;
+let MockModels = require('./resources/mock-v3-models.js').MockModels;
 
 let BuildbotBuildEntry = require('../tools/js/buildbot-syncer.js').BuildbotBuildEntry;
 let BuildbotSyncer = require('../tools/js/buildbot-syncer.js').BuildbotSyncer;
@@ -74,9 +74,9 @@
 function createSampleBuildRequest()
 {
     let rootSet = RootSet.ensureSingleton('4197', {roots: [
-        {'id': '111127', 'time': 1456955807334, 'repository': webkit, 'revision': '197463'},
-        {'id': '111237', 'time': 1456931874000, 'repository': sharedRepository, 'revision': '80229'},
-        {'id': '88930', 'time': 0, 'repository': ios, 'revision': '13A452'},
+        {'id': '111127', 'time': 1456955807334, 'repository': MockModels.webkit, 'revision': '197463'},
+        {'id': '111237', 'time': 1456931874000, 'repository': MockModels.sharedRepository, 'revision': '80229'},
+        {'id': '88930', 'time': 0, 'repository': MockModels.ios, 'revision': '13A452'},
     ]});
 
     let request = BuildRequest.ensureSingleton('16733', {'rootSet': rootSet, 'status': 'pending'});
@@ -281,6 +281,9 @@
 }
 
 describe('BuildbotSyncer', function () {
+    MockModels.inject();
+    let requests = MockRemoteAPI.inject();
+
     describe('_loadConfig', function () {
 
         function smallConfiguration()

Modified: trunk/Websites/perf.webkit.org/unit-tests/measurement-adaptor-tests.js (198825 => 198826)


--- trunk/Websites/perf.webkit.org/unit-tests/measurement-adaptor-tests.js	2016-03-30 03:34:15 UTC (rev 198825)
+++ trunk/Websites/perf.webkit.org/unit-tests/measurement-adaptor-tests.js	2016-03-30 04:16:48 UTC (rev 198826)
@@ -3,7 +3,7 @@
 var assert = require('assert');
 
 require('../tools/js/v3-models.js');
-require('./resources/mock-v3-models.js');
+let MockModels = require('./resources/mock-v3-models.js').MockModels;
 
 var sampleCluster = {
     'clusterStart': 946684800000,
@@ -26,6 +26,8 @@
 var sampleData = sampleCluster.configurations.current[0];
 
 describe('MeasurementAdaptor', function () {
+    MockModels.inject();
+
     describe('applyTo', function () {
         it('should adapt id', function () {
             var adoptor = new MeasurementAdaptor(sampleCluster.formatMap);
@@ -50,7 +52,7 @@
             assert.ok(adoptor.applyTo(sampleData).build() instanceof Build);
             assert.equal(adoptor.applyTo(sampleData).build().id(), 184629);
             assert.equal(adoptor.applyTo(sampleData).build().buildNumber(), '178');
-            assert.equal(adoptor.applyTo(sampleData).build().builder(), builder);
+            assert.equal(adoptor.applyTo(sampleData).build().builder(), MockModels.builder);
             assert.equal(adoptor.applyTo(sampleData).build().label(), 'Build 178 on WebKit Perf Builder');
             assert.equal(adoptor.applyTo(sampleData).build().url(), 'http://build.webkit.org/builders/WebKit Perf Builder/178');
         });
@@ -68,12 +70,12 @@
             assert.ok(rootSet instanceof RootSet);
             assert.equal(rootSet.latestCommitTime(), 1447707055576);
 
-            assert.ok(rootSet.repositories().indexOf(osx) >= 0);
-            assert.equal(rootSet.revisionForRepository(osx), '10.11 15D21');
+            assert.ok(rootSet.repositories().indexOf(MockModels.osx) >= 0);
+            assert.equal(rootSet.revisionForRepository(MockModels.osx), '10.11 15D21');
 
-            var commit = rootSet.commitForRepository(osx);
+            var commit = rootSet.commitForRepository(MockModels.osx);
             assert.ok(commit instanceof CommitLog);
-            assert.equal(commit.repository(), osx);
+            assert.equal(commit.repository(), MockModels.osx);
             assert.ok(commit.time() instanceof Date);
             assert.equal(commit.id(), 111);
             assert.equal(commit.revision(), '10.11 15D21');
@@ -86,12 +88,12 @@
             var adoptor = new MeasurementAdaptor(sampleCluster.formatMap);
             var rootSet = adoptor.applyTo(sampleData).rootSet();
 
-            assert.ok(rootSet.repositories().indexOf(webkit) >= 0);
-            assert.equal(rootSet.revisionForRepository(webkit), '192483');
+            assert.ok(rootSet.repositories().indexOf(MockModels.webkit) >= 0);
+            assert.equal(rootSet.revisionForRepository(MockModels.webkit), '192483');
 
-            var commit = rootSet.commitForRepository(webkit);
+            var commit = rootSet.commitForRepository(MockModels.webkit);
             assert.ok(commit instanceof CommitLog);
-            assert.equal(commit.repository(), webkit);
+            assert.equal(commit.repository(), MockModels.webkit);
             assert.ok(commit.time() instanceof Date);
             assert.equal(commit.id(), 222);
             assert.equal(+commit.time(), 1447707055576);
@@ -103,11 +105,11 @@
 
         it('should not create separate CommitLog object for the same revision', function () {
             var adoptor = new MeasurementAdaptor(sampleCluster.formatMap);
-            assert.equal(adoptor.applyTo(sampleData).rootSet().commitForRepository(webkit),
-                adoptor.applyTo(sampleData).rootSet().commitForRepository(webkit));
+            assert.equal(adoptor.applyTo(sampleData).rootSet().commitForRepository(MockModels.webkit),
+                adoptor.applyTo(sampleData).rootSet().commitForRepository(MockModels.webkit));
 
-            assert.equal(adoptor.applyTo(sampleData).rootSet().commitForRepository(osx),
-                adoptor.applyTo(sampleData).rootSet().commitForRepository(osx));
+            assert.equal(adoptor.applyTo(sampleData).rootSet().commitForRepository(MockModels.osx),
+                adoptor.applyTo(sampleData).rootSet().commitForRepository(MockModels.osx));
         });
 
     });

Modified: trunk/Websites/perf.webkit.org/unit-tests/measurement-set-tests.js (198825 => 198826)


--- trunk/Websites/perf.webkit.org/unit-tests/measurement-set-tests.js	2016-03-30 03:34:15 UTC (rev 198825)
+++ trunk/Websites/perf.webkit.org/unit-tests/measurement-set-tests.js	2016-03-30 04:16:48 UTC (rev 198826)
@@ -2,11 +2,14 @@
 
 var assert = require('assert');
 
-require('./resources/mock-remote-api.js');
+let MockRemoteAPI = require('./resources/mock-remote-api.js').MockRemoteAPI;
 require('../tools/js/v3-models.js');
-require('./resources/mock-v3-models.js');
+let MockModels = require('./resources/mock-v3-models.js').MockModels;
 
 describe('MeasurementSet', function () {
+    MockModels.inject();
+    let requests = MockRemoteAPI.inject();
+
     beforeEach(function () {
         MeasurementSet._set = null;
     });

Modified: trunk/Websites/perf.webkit.org/unit-tests/resources/mock-remote-api.js (198825 => 198826)


--- trunk/Websites/perf.webkit.org/unit-tests/resources/mock-remote-api.js	2016-03-30 03:34:15 UTC (rev 198825)
+++ trunk/Websites/perf.webkit.org/unit-tests/resources/mock-remote-api.js	2016-03-30 04:16:48 UTC (rev 198826)
@@ -3,8 +3,7 @@
 if (!assert.notReached)
     assert.notReached = function () { assert(false, 'This code path should not be reached'); }
 
-global.requests = [];
-global.RemoteAPI = {
+var MockRemoteAPI = {
     getJSON: function (url)
     {
         return this.getJSONWithStatus(url);
@@ -23,11 +22,27 @@
             request.reject = reject;
         });
 
-        requests.push(request);
+        MockRemoteAPI.requests.push(request);
         return request.promise;
     },
+    inject: function ()
+    {
+        var originalRemoteAPI = global.RemoteAPI;
+
+        beforeEach(function () {
+            MockRemoteAPI.requests.length = 0;
+            originalRemoteAPI = global.RemoteAPI;
+            global.RemoteAPI = MockRemoteAPI;
+        });
+
+        afterEach(function () {        
+            global.RemoteAPI = originalRemoteAPI;
+        });
+
+        return MockRemoteAPI.requests;
+    }
 };
+MockRemoteAPI.requests = [];
 
-beforeEach(function () {
-    requests = [];
-});
+if (typeof module != 'undefined')
+    module.exports.MockRemoteAPI = MockRemoteAPI;

Modified: trunk/Websites/perf.webkit.org/unit-tests/resources/mock-v3-models.js (198825 => 198826)


--- trunk/Websites/perf.webkit.org/unit-tests/resources/mock-v3-models.js	2016-03-30 03:34:15 UTC (rev 198825)
+++ trunk/Websites/perf.webkit.org/unit-tests/resources/mock-v3-models.js	2016-03-30 04:16:48 UTC (rev 198826)
@@ -1,20 +1,41 @@
 'use strict';
 
-beforeEach(function () {
-    AnalysisTask._fetchAllPromise = null;
-    AnalysisTask.clearStaticMap();
-    CommitLog.clearStaticMap();
-    RootSet.clearStaticMap();
-    TestGroup.clearStaticMap();
-    BuildRequest.clearStaticMap();
+var MockModels = {
+    inject: function () {
+        beforeEach(function () {
+            AnalysisTask._fetchAllPromise = null;
+            AnalysisTask.clearStaticMap();
+            CommitLog.clearStaticMap();
+            Metric.clearStaticMap();
+            RootSet.clearStaticMap();
+            Test.clearStaticMap();
+            TestGroup.clearStaticMap();
+            BuildRequest.clearStaticMap();
 
-    global.osx = Repository.ensureSingleton(9, {name: 'OS X'});
-    global.ios = Repository.ensureSingleton(22, {name: 'iOS'});
-    global.webkit = Repository.ensureSingleton(11, {name: 'WebKit', url: 'http://trac.webkit.org/changeset/$1'});
-    global.sharedRepository = Repository.ensureSingleton(16, {name: 'Shared'});
-    global.builder = new Builder(176, {name: 'WebKit Perf Builder', buildUrl: 'http://build.webkit.org/builders/$builderName/$buildNumber'});
+            MockModels.osx = Repository.ensureSingleton(9, {name: 'OS X'});
+            MockModels.ios = Repository.ensureSingleton(22, {name: 'iOS'});
+            MockModels.webkit = Repository.ensureSingleton(11, {name: 'WebKit', url: 'http://trac.webkit.org/changeset/$1'});
+            MockModels.sharedRepository = Repository.ensureSingleton(16, {name: 'Shared'});
+            MockModels.builder = new Builder(176, {name: 'WebKit Perf Builder', buildUrl: 'http://build.webkit.org/builders/$builderName/$buildNumber'});
 
-    global.someTest = Test.ensureSingleton(1928, {name: 'Some test'});
-    global.someMetric = Metric.ensureSingleton(2884, {name: 'Some metric', test: someTest});
-    global.somePlatform = Platform.ensureSingleton(65, {name: 'Some platform', metrics: [someMetric]});
-});
+            MockModels.someTest = Test.ensureSingleton(1, {name: 'Some test'});
+            MockModels.someMetric = Metric.ensureSingleton(2884, {name: 'Some metric', test: MockModels.someTest});
+            MockModels.somePlatform = Platform.ensureSingleton(65, {name: 'Some platform', metrics: [MockModels.someMetric]});
+
+            MockModels.speedometer = Test.ensureSingleton(1928, {name: 'Speedometer'});
+            MockModels.jetstream = Test.ensureSingleton(1886, {name: 'JetStream'});
+            MockModels.dromaeo = Test.ensureSingleton(2022, {name: 'Dromaeo'});
+            MockModels.domcore = Test.ensureSingleton(2023, {name: 'DOM Core Tests', parentId: 2022});
+
+            MockModels.iphone = Platform.ensureSingleton(12, {name: 'iPhone', metrics: []});
+            MockModels.ipad = Platform.ensureSingleton(13, {name: 'iPad', metrics: []});
+
+            MockModels.plt = Test.ensureSingleton(844, {name: 'Page Load Test'});
+            MockModels.pltMean = Metric.ensureSingleton(1158, {name: 'Time', aggregator: 'Arithmetic', test: MockModels.plt});
+            MockModels.elCapitan = Platform.ensureSingleton(31, {name: 'El Capitan', metrics: [MockModels.pltMean]});
+        });
+    }
+}
+
+if (typeof module != 'undefined')
+    module.exports.MockModels = MockModels;

Modified: trunk/Websites/perf.webkit.org/unit-tests/test-groups-tests.js (198825 => 198826)


--- trunk/Websites/perf.webkit.org/unit-tests/test-groups-tests.js	2016-03-30 03:34:15 UTC (rev 198825)
+++ trunk/Websites/perf.webkit.org/unit-tests/test-groups-tests.js	2016-03-30 04:16:48 UTC (rev 198826)
@@ -3,7 +3,7 @@
 var assert = require('assert');
 
 require('../tools/js/v3-models.js');
-require('./resources/mock-v3-models.js');
+let MockModels = require('./resources/mock-v3-models.js').MockModels;
 
 function sampleTestGroup() {
     return {
@@ -104,6 +104,7 @@
 }
 
 describe('TestGroup', function () {
+    MockModels.inject();
 
     describe('_createModelsFromFetchedTestGroups', function () {
         it('should create test groups', function () {
@@ -164,31 +165,31 @@
             assert.ok(secondSet instanceof RootSet);
             assert.equal(secondSet, buildRequests[3].rootSet());
 
-            assert.equal(firstSet.revisionForRepository(webkit), '191622');
-            var firstWebKitCommit = firstSet.commitForRepository(webkit);
+            assert.equal(firstSet.revisionForRepository(MockModels.webkit), '191622');
+            var firstWebKitCommit = firstSet.commitForRepository(MockModels.webkit);
             assert.ok(firstWebKitCommit instanceof CommitLog);
-            assert.ok(firstWebKitCommit, buildRequests[2].rootSet().commitForRepository(webkit));
-            assert.ok(firstWebKitCommit.repository(), webkit);
+            assert.ok(firstWebKitCommit, buildRequests[2].rootSet().commitForRepository(MockModels.webkit));
+            assert.ok(firstWebKitCommit.repository(), MockModels.webkit);
             assert.ok(firstWebKitCommit.revision(), '191622');
             assert.ok(firstWebKitCommit.time() instanceof Date);
             assert.ok(+firstWebKitCommit.time(), 1445945816878);
 
-            assert.equal(secondSet.revisionForRepository(webkit), '192736');
-            var secondWebKitCommit = secondSet.commitForRepository(webkit);
+            assert.equal(secondSet.revisionForRepository(MockModels.webkit), '192736');
+            var secondWebKitCommit = secondSet.commitForRepository(MockModels.webkit);
             assert.ok(secondWebKitCommit instanceof CommitLog);
-            assert.ok(secondWebKitCommit, buildRequests[3].rootSet().commitForRepository(webkit));
-            assert.ok(secondWebKitCommit.repository(), webkit);
+            assert.ok(secondWebKitCommit, buildRequests[3].rootSet().commitForRepository(MockModels.webkit));
+            assert.ok(secondWebKitCommit.repository(), MockModels.webkit);
             assert.ok(secondWebKitCommit.revision(), '192736');
             assert.ok(secondWebKitCommit.time() instanceof Date);
             assert.ok(+secondWebKitCommit.time(), 1445945816878);
 
-            assert.equal(firstSet.revisionForRepository(osx), '10.11 15A284');
-            var osxCommit = firstSet.commitForRepository(osx);
+            assert.equal(firstSet.revisionForRepository(MockModels.osx), '10.11 15A284');
+            var osxCommit = firstSet.commitForRepository(MockModels.osx);
             assert.ok(osxCommit instanceof CommitLog);
-            assert.equal(osxCommit, buildRequests[1].rootSet().commitForRepository(osx));
-            assert.equal(osxCommit, buildRequests[2].rootSet().commitForRepository(osx));
-            assert.equal(osxCommit, buildRequests[3].rootSet().commitForRepository(osx));
-            assert.ok(osxCommit.repository(), osx);
+            assert.equal(osxCommit, buildRequests[1].rootSet().commitForRepository(MockModels.osx));
+            assert.equal(osxCommit, buildRequests[2].rootSet().commitForRepository(MockModels.osx));
+            assert.equal(osxCommit, buildRequests[3].rootSet().commitForRepository(MockModels.osx));
+            assert.ok(osxCommit.repository(), MockModels.osx);
             assert.ok(osxCommit.revision(), '10.11 15A284');
         });
     });
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to