Title: [198479] trunk/Websites/perf.webkit.org
Revision
198479
Author
[email protected]
Date
2016-03-20 17:57:01 -0700 (Sun, 20 Mar 2016)

Log Message

Associated commits don't immediately show up on an analysis task page
https://bugs.webkit.org/show_bug.cgi?id=155692

Reviewed by Darin Adler.

The bug was caused by resolveCommits in AnalysisTask._constructAnalysisTasksFromRawData not being
able to find the matching commit log if the commit log had been created by the charts which don't
set the remote identifiers on each CommitLog objects.

Fixed the bug by modifying /api/measurement-set to include the commit ID, and making CommitLog
use the real database ID as its ID instead of a fake ID we create from repository and revision.

Also added a bunch of Mocha unit tests for AnalysisTask.fetchAll.

* public/api/measurement-set.php:
(MeasurementSetFetcher::execute_query): Fetch commit_id.
(MeasurementSetFetcher::format_run): Use pass-by-reference to avoid making a copy of the row.
(MeasurementSetFetcher::parse_revisions_array): Include commit_id as the first item in the result.
* public/v3/instrumentation.js:
* public/v3/models/analysis-task.js:
(AnalysisTask): Fixed a bug that _buildRequestCount and _finishedBuildRequestCount could be kept
as strings and hasPendingRequests() could return a wrong result because it would perform string
inequality instead of numerical inequality.
(AnalysisTask.prototype.updateSingleton): Ditto.
(AnalysisTask.prototype.dissociateCommit):
(AnalysisTask._constructAnalysisTasksFromRawData):
(AnalysisTask._constructAnalysisTasksFromRawData.resolveCommits): Use findById now that CommitLog
objects all use the same id as the database id.
* public/v3/models/commit-log.js:
(CommitLog):
(CommitLog.prototype.remoteId): Deleted since we no longer create a fake id for commit logs for
measurement sets.
(CommitLog.findByRemoteId): Deleted.
(CommitLog.ensureSingleton): Deleted.
(CommitLog.fetchBetweenRevisions):

* public/v3/models/data-model.js:
(DataModelObject.clearStaticMap): Added to aid unit testing.
(DataModelObject.ensureNamedStaticMap): Fixed a typo. Each map is a dictionary, not an array.
* public/v3/models/metric.js:
* public/v3/models/platform.js:
* public/v3/models/root-set.js:
(RootSet): Updated per the interface change in CommitLog.ensureSingleton.
(MeasurementRootSet): Updated per /api/measurement-set change. Use the first value as the id.
* public/v3/models/test.js:
* unit-tests/analysis-task-tests.js: Added.
(sampleAnalysisTask):
(measurementCluster):
* unit-tests/checkconfig.js: Added some assertion message to help aid diagnosing the failure.
* unit-tests/measurement-adaptor-tests.js: Updated the sample data per the API change in
/api/measurement-set and also added assertions for commit log ids.
* unit-tests/measurement-set-tests.js:
(beforeEach):
* unit-tests/resources: Added.
* unit-tests/resources/mock-remote-api.js: Added. Extracted from measurement-set-tests.js to be
used in analysis-task-tests.js.
(assert.notReached.assert.notReached):
(global.RemoteAPI.getJSON):
(global.RemoteAPI.getJSONWithStatus):
(beforeEach):
* unit-tests/resources/v3-models.js: Added. Extracted from measurement-set-tests.js to be used in
analysis-task-tests.js and added more imports as needed.
(importFromV3):
(beforeEach):

Modified Paths

Added Paths

Diff

Modified: trunk/Websites/perf.webkit.org/ChangeLog (198478 => 198479)


--- trunk/Websites/perf.webkit.org/ChangeLog	2016-03-20 23:08:51 UTC (rev 198478)
+++ trunk/Websites/perf.webkit.org/ChangeLog	2016-03-21 00:57:01 UTC (rev 198479)
@@ -1,3 +1,70 @@
+2016-03-19  Ryosuke Niwa  <[email protected]>
+
+        Associated commits don't immediately show up on an analysis task page
+        https://bugs.webkit.org/show_bug.cgi?id=155692
+
+        Reviewed by Darin Adler.
+
+        The bug was caused by resolveCommits in AnalysisTask._constructAnalysisTasksFromRawData not being
+        able to find the matching commit log if the commit log had been created by the charts which don't
+        set the remote identifiers on each CommitLog objects.
+
+        Fixed the bug by modifying /api/measurement-set to include the commit ID, and making CommitLog
+        use the real database ID as its ID instead of a fake ID we create from repository and revision.
+
+        Also added a bunch of Mocha unit tests for AnalysisTask.fetchAll.
+
+        * public/api/measurement-set.php:
+        (MeasurementSetFetcher::execute_query): Fetch commit_id.
+        (MeasurementSetFetcher::format_run): Use pass-by-reference to avoid making a copy of the row.
+        (MeasurementSetFetcher::parse_revisions_array): Include commit_id as the first item in the result.
+        * public/v3/instrumentation.js:
+        * public/v3/models/analysis-task.js:
+        (AnalysisTask): Fixed a bug that _buildRequestCount and _finishedBuildRequestCount could be kept
+        as strings and hasPendingRequests() could return a wrong result because it would perform string
+        inequality instead of numerical inequality.
+        (AnalysisTask.prototype.updateSingleton): Ditto.
+        (AnalysisTask.prototype.dissociateCommit):
+        (AnalysisTask._constructAnalysisTasksFromRawData):
+        (AnalysisTask._constructAnalysisTasksFromRawData.resolveCommits): Use findById now that CommitLog
+        objects all use the same id as the database id.
+        * public/v3/models/commit-log.js:
+        (CommitLog):
+        (CommitLog.prototype.remoteId): Deleted since we no longer create a fake id for commit logs for
+        measurement sets.
+        (CommitLog.findByRemoteId): Deleted.
+        (CommitLog.ensureSingleton): Deleted.
+        (CommitLog.fetchBetweenRevisions):
+
+        * public/v3/models/data-model.js:
+        (DataModelObject.clearStaticMap): Added to aid unit testing.
+        (DataModelObject.ensureNamedStaticMap): Fixed a typo. Each map is a dictionary, not an array.
+        * public/v3/models/metric.js:
+        * public/v3/models/platform.js:
+        * public/v3/models/root-set.js:
+        (RootSet): Updated per the interface change in CommitLog.ensureSingleton.
+        (MeasurementRootSet): Updated per /api/measurement-set change. Use the first value as the id.
+        * public/v3/models/test.js:
+        * unit-tests/analysis-task-tests.js: Added.
+        (sampleAnalysisTask):
+        (measurementCluster):
+        * unit-tests/checkconfig.js: Added some assertion message to help aid diagnosing the failure.
+        * unit-tests/measurement-adaptor-tests.js: Updated the sample data per the API change in
+        /api/measurement-set and also added assertions for commit log ids.
+        * unit-tests/measurement-set-tests.js:
+        (beforeEach):
+        * unit-tests/resources: Added.
+        * unit-tests/resources/mock-remote-api.js: Added. Extracted from measurement-set-tests.js to be
+        used in analysis-task-tests.js.
+        (assert.notReached.assert.notReached):
+        (global.RemoteAPI.getJSON):
+        (global.RemoteAPI.getJSONWithStatus):
+        (beforeEach):
+        * unit-tests/resources/v3-models.js: Added. Extracted from measurement-set-tests.js to be used in
+        analysis-task-tests.js and added more imports as needed.
+        (importFromV3):
+        (beforeEach):
+
 2016-03-18  Ryosuke Niwa  <[email protected]>
 
         Build fix after r198464.

Modified: trunk/Websites/perf.webkit.org/public/api/measurement-set.php (198478 => 198479)


--- trunk/Websites/perf.webkit.org/public/api/measurement-set.php	2016-03-20 23:08:51 UTC (rev 198478)
+++ trunk/Websites/perf.webkit.org/public/api/measurement-set.php	2016-03-21 00:57:01 UTC (rev 198479)
@@ -165,7 +165,7 @@
     function execute_query($config_id) {
         return $this->db->query('
             SELECT test_runs.*, builds.*,
-            array_agg((commit_repository, commit_revision, commit_time)) AS revisions,
+            array_agg((commit_id, commit_repository, commit_revision, commit_time)) AS revisions,
             max(commit_time) AS revision_time, max(commit_order) AS revision_order
                 FROM builds
                     LEFT OUTER JOIN build_commits ON commit_build = build_id
@@ -180,7 +180,7 @@
             'commitTime', 'build', 'buildTime', 'buildNumber', 'builder');
     }
 
-    private static function format_run($run, &$commit_time) {
+    private static function format_run(&$run, &$commit_time) {
         $commit_time = Database::to_js_time($run['revision_time']);
         $build_time = Database::to_js_time($run['build_time']);
         if (!$commit_time)
@@ -200,16 +200,19 @@
             intval($run['build_builder']));
     }
 
-    private static function parse_revisions_array($postgres_array) {
-        // e.g. {"(WebKit,131456,\"2012-10-16 14:53:00\")","(Chromium,162004,)"}
+    private static function parse_revisions_array(&$postgres_array) {
+        // e.g. {"(<commit-id>,<repository-id>,<revision>,\"2012-10-16 14:53:00\")","(<commit-id>,<repository-id>,<revision>,)"}
         $outer_array = json_decode('[' . trim($postgres_array, '{}') . ']');
         $revisions = array();
         foreach ($outer_array as $item) {
             $name_and_revision = explode(',', trim($item, '()'));
             if (!$name_and_revision[0])
                 continue;
-            $time = Database::to_js_time(trim($name_and_revision[2], '"'));
-            array_push($revisions, array(intval(trim($name_and_revision[0], '"')), trim($name_and_revision[1], '"'), $time));
+            $commit_id = intval(trim($name_and_revision[0], '"'));
+            $repository_id = intval(trim($name_and_revision[1], '"'));
+            $revision = trim($name_and_revision[2], '"');
+            $time = Database::to_js_time(trim($name_and_revision[3], '"'));
+            array_push($revisions, array($commit_id, $repository_id, $revision, $time));
         }
         return $revisions;
     }

Modified: trunk/Websites/perf.webkit.org/public/v3/instrumentation.js (198478 => 198479)


--- trunk/Websites/perf.webkit.org/public/v3/instrumentation.js	2016-03-20 23:08:51 UTC (rev 198478)
+++ trunk/Websites/perf.webkit.org/public/v3/instrumentation.js	2016-03-21 00:57:01 UTC (rev 198479)
@@ -1,3 +1,5 @@
+'use strict';
+
 class Instrumentation {
 
     static startMeasuringTime(domain, label)
@@ -53,3 +55,6 @@
     }
 
 }
+
+if (typeof module != 'undefined')
+    module.exports.Instrumentation = Instrumentation;

Modified: trunk/Websites/perf.webkit.org/public/v3/models/analysis-task.js (198478 => 198479)


--- trunk/Websites/perf.webkit.org/public/v3/models/analysis-task.js	2016-03-20 23:08:51 UTC (rev 198478)
+++ trunk/Websites/perf.webkit.org/public/v3/models/analysis-task.js	2016-03-21 00:57:01 UTC (rev 198479)
@@ -1,3 +1,4 @@
+'use strict';
 
 class AnalysisTask extends LabeledObject {
     constructor(id, object)
@@ -22,8 +23,8 @@
         this._bugs = object.bugs || [];
         this._causes = object.causes || [];
         this._fixes = object.fixes || [];
-        this._buildRequestCount = object.buildRequestCount;
-        this._finishedBuildRequestCount = object.finishedBuildRequestCount;
+        this._buildRequestCount = +object.buildRequestCount;
+        this._finishedBuildRequestCount = +object.finishedBuildRequestCount;
     }
 
     static findByPlatformAndMetric(platformId, metricId)
@@ -50,8 +51,8 @@
         this._bugs = object.bugs || [];
         this._causes = object.causes || [];
         this._fixes = object.fixes || [];
-        this._buildRequestCount = object.buildRequestCount;
-        this._finishedBuildRequestCount = object.finishedBuildRequestCount;
+        this._buildRequestCount = +object.buildRequestCount;
+        this._finishedBuildRequestCount = +object.finishedBuildRequestCount;
     }
 
     hasResults() { return this._finishedBuildRequestCount; }
@@ -138,7 +139,7 @@
         var id = this.id();
         return PrivilegedAPI.sendRequest('associate-commit', {
             task: id,
-            commit: commit.remoteId(),
+            commit: commit.id(),
         }).then(function (data) {
             return AnalysisTask.cachedFetch('../api/analysis-tasks', {id: id}, true)
                 .then(AnalysisTask._constructAnalysisTasksFromRawData.bind(AnalysisTask));
@@ -232,11 +233,11 @@
             rawData.repository = Repository.findById(rawData.repository);
             if (!rawData.repository)
                 continue;
-            CommitLog.ensureSingleton(rawData.repository, rawData);
+            CommitLog.ensureSingleton(rawData.id, rawData);
         }
 
         function resolveCommits(commits) {
-            return commits.map(function (id) { return CommitLog.findByRemoteId(id); }).filter(function (commit) { return !!commit; });
+            return commits.map(function (id) { return CommitLog.findById(id); }).filter(function (commit) { return !!commit; });
         }
 
         var results = [];
@@ -266,3 +267,6 @@
         });
     }
 }
+
+if (typeof module != 'undefined')
+    module.exports.AnalysisTask = AnalysisTask;

Modified: trunk/Websites/perf.webkit.org/public/v3/models/commit-log.js (198478 => 198479)


--- trunk/Websites/perf.webkit.org/public/v3/models/commit-log.js	2016-03-20 23:08:51 UTC (rev 198478)
+++ trunk/Websites/perf.webkit.org/public/v3/models/commit-log.js	2016-03-21 00:57:01 UTC (rev 198479)
@@ -5,27 +5,13 @@
     {
         super(id);
         this._repository = rawData.repository;
+        console.assert(this._repository instanceof Repository);
         this._rawData = rawData;
         this._remoteId = rawData.id;
         if (this._remoteId)
             this.ensureNamedStaticMap('remoteId')[this._remoteId] = this;
     }
 
-    // FIXME: All this non-sense should go away once measurement-set start returning real commit id.
-    remoteId() { return this._remoteId; }
-    static findByRemoteId(id)
-    {
-        var remoteIdMap = super.namedStaticMap('remoteId');
-        return remoteIdMap ? remoteIdMap[id] : null;
-    }
-
-    static ensureSingleton(repository, rawData)
-    {
-        var id = repository.id() + '-' + rawData['revision'];
-        rawData.repository = repository;
-        return super.ensureSingleton(id, rawData);
-    }
-
     updateSingleton(rawData)
     {
         super.updateSingleton(rawData);
@@ -99,7 +85,10 @@
 
         var self = this;
         return RemoteAPI.getJSONWithStatus(url).then(function (data) {
-            var commits = data['commits'].map(function (rawData) { return CommitLog.ensureSingleton(repository, rawData); });
+            var commits = data['commits'].map(function (rawData) {
+                rawData.repository = repository;
+                return CommitLog.ensureSingleton(rawData.id, rawData);
+            });
             self._cacheCommitLogs(repository, from, to, commits);
             return commits;
         });

Modified: trunk/Websites/perf.webkit.org/public/v3/models/data-model.js (198478 => 198479)


--- trunk/Websites/perf.webkit.org/public/v3/models/data-model.js	2016-03-20 23:08:51 UTC (rev 198478)
+++ trunk/Websites/perf.webkit.org/public/v3/models/data-model.js	2016-03-21 00:57:01 UTC (rev 198479)
@@ -20,6 +20,8 @@
 
     updateSingleton(object) { }
 
+    static clearStaticMap() { this[DataModelObject.StaticMapSymbol] = null; }
+
     static namedStaticMap(name)
     {
         var staticMap = this[DataModelObject.StaticMapSymbol];
@@ -32,7 +34,7 @@
             this[DataModelObject.StaticMapSymbol] = {};
         var staticMap = this[DataModelObject.StaticMapSymbol];
         if (!staticMap[name])
-            staticMap[name] = [];
+            staticMap[name] = {};
         return staticMap[name];
     }
 

Modified: trunk/Websites/perf.webkit.org/public/v3/models/metric.js (198478 => 198479)


--- trunk/Websites/perf.webkit.org/public/v3/models/metric.js	2016-03-20 23:08:51 UTC (rev 198478)
+++ trunk/Websites/perf.webkit.org/public/v3/models/metric.js	2016-03-21 00:57:01 UTC (rev 198479)
@@ -1,3 +1,4 @@
+'use strict';
 
 class Metric extends LabeledObject {
     constructor(id, object)
@@ -86,3 +87,6 @@
         }
     };
 }
+
+if (typeof module != 'undefined')
+    module.exports.Metric = Metric;

Modified: trunk/Websites/perf.webkit.org/public/v3/models/platform.js (198478 => 198479)


--- trunk/Websites/perf.webkit.org/public/v3/models/platform.js	2016-03-20 23:08:51 UTC (rev 198478)
+++ trunk/Websites/perf.webkit.org/public/v3/models/platform.js	2016-03-21 00:57:01 UTC (rev 198479)
@@ -1,3 +1,4 @@
+'use strict';
 
 class Platform extends LabeledObject {
     constructor(id, object)
@@ -34,3 +35,6 @@
         return this._lastModifiedByMetric[metric.id()];
     }
 }
+
+if (typeof module != 'undefined')
+    module.exports.Platform = Platform;

Modified: trunk/Websites/perf.webkit.org/public/v3/models/root-set.js (198478 => 198479)


--- trunk/Websites/perf.webkit.org/public/v3/models/root-set.js	2016-03-20 23:08:51 UTC (rev 198478)
+++ trunk/Websites/perf.webkit.org/public/v3/models/root-set.js	2016-03-21 00:57:01 UTC (rev 198479)
@@ -14,11 +14,11 @@
 
         for (var row of object.roots) {
             var repositoryId = row.repository;
-            var repository = Repository.findById(repositoryId);
+            row.repository = Repository.findById(repositoryId);
 
             console.assert(!this._repositoryToCommitMap[repositoryId]);
-            this._repositoryToCommitMap[repositoryId] = CommitLog.ensureSingleton(repository, row);
-            this._repositories.push(repository);
+            this._repositoryToCommitMap[repositoryId] = CommitLog.ensureSingleton(row.id, row);
+            this._repositories.push(row.repository);
         }
     }
 
@@ -74,12 +74,16 @@
     {
         super(id, null);
         for (var values of revisionList) {
-            var repositoryId = values[0];
+            // [<commit-id>, <repository-id>, <revision>, <time>]
+            var commitId = values[0];
+            var repositoryId = values[1];
+            var revision = values[2];
+            var time = values[3];
             var repository = Repository.findById(repositoryId);
             if (!repository)
                 continue;
 
-            this._repositoryToCommitMap[repositoryId] = CommitLog.ensureSingleton(repository, {revision: values[1], time: values[2]});
+            this._repositoryToCommitMap[repositoryId] = CommitLog.ensureSingleton(commitId, {repository: repository, revision: revision, time: time});
             this._repositories.push(repository);
         }
     }

Modified: trunk/Websites/perf.webkit.org/public/v3/models/test.js (198478 => 198479)


--- trunk/Websites/perf.webkit.org/public/v3/models/test.js	2016-03-20 23:08:51 UTC (rev 198478)
+++ trunk/Websites/perf.webkit.org/public/v3/models/test.js	2016-03-21 00:57:01 UTC (rev 198479)
@@ -1,3 +1,4 @@
+'use strict';
 
 class Test extends LabeledObject {
     constructor(id, object, isTopLevel)
@@ -42,3 +43,6 @@
     addChildTest(test) { this._childTests.push(test); }
     addMetric(metric) { this._metrics.push(metric); }
 }
+
+if (typeof module != 'undefined')
+    module.exports.Test = Test;

Added: trunk/Websites/perf.webkit.org/unit-tests/analysis-task-tests.js (0 => 198479)


--- trunk/Websites/perf.webkit.org/unit-tests/analysis-task-tests.js	                        (rev 0)
+++ trunk/Websites/perf.webkit.org/unit-tests/analysis-task-tests.js	2016-03-21 00:57:01 UTC (rev 198479)
@@ -0,0 +1,224 @@
+'use strict';
+
+var assert = require('assert');
+
+require('./resources/v3-models.js');
+require('./resources/mock-remote-api.js');
+
+function sampleAnalysisTask()
+{
+    return {
+        'analysisTasks': [
+            {
+                'author': null,
+                'bugs': [],
+                'buildRequestCount': '14',
+                'finishedBuildRequestCount': '6',
+                'category': 'identified',
+                'causes': [
+                    '105975'
+                ],
+                'createdAt': 1454594330000,
+                'endRun': '37253448',
+                'endRunTime': 1454515020303,
+                'fixes': [],
+                'id': '1082',
+                'metric': '2884',
+                'name': 'Potential 1.2% regression between 2016-02-02 20:20 and 02-03 15:57',
+                'needed': null,
+                'platform': '65',
+                'result': 'regression',
+                'segmentationStrategy': '1',
+                'startRun': '37117949',
+                'startRunTime': 1454444458791,
+                'testRangeStragegy': '2'
+            }
+        ],
+        'bugs': [],
+        'commits': [
+            {
+                'authorEmail': '[email protected]',
+                'authorName': 'Commit Queue',
+                'id': '105975',
+                'message': 'Commit message',
+                'order': null,
+                'parent': null,
+                'repository': '11',
+                'revision': '196051',
+                'time': 1454481246108
+            }
+        ],
+        'status': 'OK'
+    };
+}
+
+function measurementCluster()
+{
+    return {
+        'clusterSize': 5184000000,
+        'clusterStart': 946684800000,
+        'configurations': {
+            'current': [
+                [
+                    37188161,
+                    124.15015662116,
+                    25,
+                    3103.7539155291,
+                    385398.06003414,
+                    false,
+                    [
+                        [
+                            105978,
+                            10,
+                            '791451',
+                            1454481204649
+                        ],
+                        [
+                            105975,
+                            11,
+                            '196051',
+                            1454481246108
+                        ],
+                        [
+                            105502,
+                            9,
+                            '10.11 15D21',
+                            0
+                        ]
+                    ],
+                    1454481246108,
+                    227020,
+                    1454492139496,
+                    '3151',
+                    179
+                ],
+            ],
+        },
+        'endTime': 1454716800000,
+        'formatMap': [
+            'id',
+            'mean',
+            'iterationCount',
+            'sum',
+            'squareSum',
+            'markedOutlier',
+            'revisions',
+            'commitTime',
+            'build',
+            'buildTime',
+            'buildNumber',
+            'builder'
+        ],
+        'lastModified': 1455236216153,
+        'startTime': 1449532800000,
+        'status': 'OK'
+    };
+}
+
+describe('AnalysisTask', function () {
+    describe('fetchAll', function () {
+        it('should request all analysis tasks', function () {
+            var callCount = 0;
+            AnalysisTask.fetchAll().then(function () { callCount++; });
+            assert.equal(callCount, 0);
+            assert.equal(requests.length, 1);
+            assert.equal(requests[0].url, '../api/analysis-tasks');
+        });
+
+        it('should not request all analysis tasks multiple times', function () {
+            var callCount = 0;
+            AnalysisTask.fetchAll().then(function () { callCount++; });
+            assert.equal(callCount, 0);
+            assert.equal(requests.length, 1);
+            assert.equal(requests[0].url, '../api/analysis-tasks');
+
+            AnalysisTask.fetchAll().then(function () { callCount++; });
+            assert.equal(callCount, 0);
+            assert.equal(requests.length, 1);
+        });
+
+        it('should resolve the promise when the request is fullfilled', function (done) {
+            var callCount = 0;
+            var promise = AnalysisTask.fetchAll().then(function () { callCount++; });
+            assert.equal(callCount, 0);
+            assert.equal(requests.length, 1);
+            assert.equal(requests[0].url, '../api/analysis-tasks');
+
+            requests[0].resolve(sampleAnalysisTask());
+
+            var anotherCallCount = 0;
+            return promise.then(function () {
+                assert.equal(callCount, 1);
+                AnalysisTask.fetchAll().then(function () { anotherCallCount++; });
+            }).then(function () {
+                assert.equal(callCount, 1);
+                assert.equal(anotherCallCount, 1);
+                assert.equal(requests.length, 1);
+                done();
+            }).catch(function (error) { done(error); });
+        });
+
+        it('should create AnalysisTask objects', function (done) {
+            var promise = AnalysisTask.fetchAll();
+            requests[0].resolve(sampleAnalysisTask());
+
+            return promise.then(function () {
+                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.ok(task.hasResults());
+                assert.ok(task.hasPendingRequests());
+                assert.equal(task.requestLabel(), '6 of 14');
+                assert.equal(task.category(), 'identified');
+                assert.equal(task.changeType(), 'regression');
+                assert.equal(task.startMeasurementId(), 37117949);
+                assert.equal(task.startTime(), 1454444458791);
+                assert.equal(task.endMeasurementId(), 37253448);
+                assert.equal(task.endTime(), 1454515020303);
+                done();
+            }).catch(function (error) { done(error); });
+        });
+
+        it('should create CommitLog objects for `causes`', function (done) {
+            var promise = AnalysisTask.fetchAll();
+            requests[0].resolve(sampleAnalysisTask());
+
+            return promise.then(function () {
+                assert.equal(AnalysisTask.all().length, 1);
+                var task = AnalysisTask.all()[0];
+
+                assert.equal(task.causes().length, 1);
+                var commit = task.causes()[0];
+
+                assert.equal(commit.revision(), '196051');
+                assert.equal(commit.repository(), webkit);
+                assert.equal(+commit.time(), 1454481246108);
+                done();
+            }).catch(function (error) { done(error); });
+        });
+
+        it('should find CommitLog objects for `causes` when MeasurementAdaptor created matching objects', function (done) {
+            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');
+
+            var promise = AnalysisTask.fetchAll();
+            requests[0].resolve(sampleAnalysisTask());
+
+            return promise.then(function () {
+                assert.equal(AnalysisTask.all().length, 1);
+                var task = AnalysisTask.all()[0];
+
+                assert.equal(task.causes().length, 1);
+                var commit = task.causes()[0];
+                assert.equal(commit.revision(), '196051');
+                assert.equal(commit.repository(), webkit);
+                assert.equal(+commit.time(), 1454481246108);
+                done();
+            }).catch(function (error) { done(error); });
+        });
+    });
+});

Modified: trunk/Websites/perf.webkit.org/unit-tests/checkconfig.js (198478 => 198479)


--- trunk/Websites/perf.webkit.org/unit-tests/checkconfig.js	2016-03-20 23:08:51 UTC (rev 198478)
+++ trunk/Websites/perf.webkit.org/unit-tests/checkconfig.js	2016-03-21 00:57:01 UTC (rev 198479)
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
 
 var assert = require('assert');
 var fs = require('fs');
@@ -26,8 +26,8 @@
 
     it('should define `dataDirectory`', function () {
         assert.ok(Config.value('dataDirectory'));
-        assert.ok(fs.existsSync(Config.path('dataDirectory')));
-        assert.ok(fs.statSync(Config.path('dataDirectory')).isDirectory());
+        assert.ok(fs.existsSync(Config.path('dataDirectory')), 'dataDirectory should exist');
+        assert.ok(fs.statSync(Config.path('dataDirectory')).isDirectory(), 'dataDirectory should be a dictionary');
     });
 
     it('should define `jsonCacheMaxAge`', function () {

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


--- trunk/Websites/perf.webkit.org/unit-tests/measurement-adaptor-tests.js	2016-03-20 23:08:51 UTC (rev 198478)
+++ trunk/Websites/perf.webkit.org/unit-tests/measurement-adaptor-tests.js	2016-03-21 00:57:01 UTC (rev 198479)
@@ -2,24 +2,15 @@
 
 var assert = require('assert');
 
-global.DataModelObject = require('../public/v3/models/data-model.js').DataModelObject;
-global.LabeledObject = require('../public/v3/models/data-model.js').LabeledObject;
-global.CommitLog = require('../public/v3/models/commit-log.js').CommitLog;
-global.Build = require('../public/v3/models/builder.js').Build;
-global.Builder = require('../public/v3/models/builder.js').Builder;
-global.MeasurementRootSet = require('../public/v3/models/root-set.js').MeasurementRootSet;
-global.MeasurementAdaptor = require('../public/v3/models/measurement-adaptor.js').MeasurementAdaptor;
-global.Repository = require('../public/v3/models/repository.js').Repository;
-global.RootSet = require('../public/v3/models/root-set.js').RootSet;
-global.Statistics = require('../public/shared/statistics.js');
+require('./resources/v3-models');
 
 var sampleCluster = {
     'clusterStart': 946684800000,
     'clusterSize': 5184000000,
     'configurations': {
         'current': [
-            [28954983, 217.94607142857, 20, 4358.9214285714, 950303.02365434, false, [[9, '10.11 15D21', 0], [11, '192483', 1447707055576], [999, 'some unknown revision', 0]], 1447707055576, 184629, 1447762266153, '178', 176],
-            [28952257, 220.11455357143, 20, 4402.2910714286, 969099.67509885, false, [[9, '10.11 15D21', 0], [11, '192486', 1447713500460]], 1447713500460, 184614, 1447760255683, '177', 176]
+            [28954983, 217.94607142857, 20, 4358.9214285714, 950303.02365434, false, [[111, 9, '10.11 15D21', 0], [222, 11, '192483', 1447707055576], [333, 999, 'some unknown revision', 0]], 1447707055576, 184629, 1447762266153, '178', 176],
+            [28952257, 220.11455357143, 20, 4402.2910714286, 969099.67509885, false, [[111, 9, '10.11 15D21', 0], [444, 11, '192486', 1447713500460]], 1447713500460, 184614, 1447760255683, '177', 176]
         ]
     },
     'formatMap': ['id', 'mean', 'iterationCount', 'sum', 'squareSum', 'markedOutlier', 'revisions',
@@ -33,10 +24,6 @@
 };
 var sampleData = sampleCluster.configurations.current[0];
 
-var osx = new Repository(9, {name: 'OS X'});
-var webkit = new Repository(11, {name: 'WebKit', url: 'http://trac.webkit.org/changeset/$1'});
-var builder = new Builder(176, {name: 'WebKit Perf Builder', buildUrl: 'http://build.webkit.org/builders/$builderName/$buildNumber'});
-
 describe('MeasurementAdaptor', function () {
     describe('applyTo', function () {
         it('should adapt id', function () {
@@ -87,6 +74,7 @@
             assert.ok(commit instanceof CommitLog);
             assert.equal(commit.repository(), osx);
             assert.ok(commit.time() instanceof Date);
+            assert.equal(commit.id(), 111);
             assert.equal(commit.revision(), '10.11 15D21');
             assert.equal(commit.label(), '10.11 15D21');
             assert.equal(commit.title(), 'OS X at 10.11 15D21');
@@ -104,6 +92,7 @@
             assert.ok(commit instanceof CommitLog);
             assert.equal(commit.repository(), webkit);
             assert.ok(commit.time() instanceof Date);
+            assert.equal(commit.id(), 222);
             assert.equal(+commit.time(), 1447707055576);
             assert.equal(commit.revision(), '192483');
             assert.equal(commit.label(), 'r192483');

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


--- trunk/Websites/perf.webkit.org/unit-tests/measurement-set-tests.js	2016-03-20 23:08:51 UTC (rev 198478)
+++ trunk/Websites/perf.webkit.org/unit-tests/measurement-set-tests.js	2016-03-21 00:57:01 UTC (rev 198479)
@@ -2,6 +2,8 @@
 
 var assert = require('assert');
 
+require('./resources/mock-remote-api.js');
+
 global.DataModelObject = require('../public/v3/models/data-model.js').DataModelObject;
 global.LabeledObject = require('../public/v3/models/data-model.js').LabeledObject;
 global.CommitLog = require('../public/v3/models/commit-log.js').CommitLog;
@@ -15,36 +17,11 @@
 global.RootSet = require('../public/v3/models/root-set.js').RootSet;
 global.Statistics = require('../public/shared/statistics.js');
 
-if (!assert.notReached)
-    assert.notReached = function () { assert(false, 'This code path should not be reached'); }
-
-var requests = [];
-
-global.RemoteAPI = {
-    getJSON: function ()
-    {
-        assert.notReached();
-    },
-    getJSONWithStatus: function (url)
-    {
-        var request = {
-            url: url,
-            promise: null,
-            resolve: null,
-            reject: null,
-        };
-
-        request.promise = new Promise(function (resolve, reject) {
-            request.resolve = resolve;
-            request.reject = reject;
-        });
-
-        requests.push(request);
-        return request.promise;
-    },
-};
-
 describe('MeasurementSet', function () {
+    beforeEach(function () {
+        MeasurementSet._set = null;
+    });
+
     describe('findSet', function () {
         it('should create a new MeasurementSet for a new pair of platform and matric', function () {
             assert.notEqual(MeasurementSet.findSet(1, 1, 3000), MeasurementSet.findSet(1, 2, 3000));
@@ -57,11 +34,6 @@
     });
 
     describe('fetchBetween', function () {
-        beforeEach(function () {
-            requests = [];
-            MeasurementSet._set = null;
-        });
-
         it('should always request the cached primary cluster first', function () {
             var set = MeasurementSet.findSet(1, 1, 3000);
             set.fetchBetween(1000, 2000, function () { assert.notReached(); });

Added: trunk/Websites/perf.webkit.org/unit-tests/resources/mock-remote-api.js (0 => 198479)


--- trunk/Websites/perf.webkit.org/unit-tests/resources/mock-remote-api.js	                        (rev 0)
+++ trunk/Websites/perf.webkit.org/unit-tests/resources/mock-remote-api.js	2016-03-21 00:57:01 UTC (rev 198479)
@@ -0,0 +1,33 @@
+var assert = require('assert');
+
+if (!assert.notReached)
+    assert.notReached = function () { assert(false, 'This code path should not be reached'); }
+
+global.requests = [];
+global.RemoteAPI = {
+    getJSON: function ()
+    {
+        assert.notReached();
+    },
+    getJSONWithStatus: function (url)
+    {
+        var request = {
+            url: url,
+            promise: null,
+            resolve: null,
+            reject: null,
+        };
+
+        request.promise = new Promise(function (resolve, reject) {
+            request.resolve = resolve;
+            request.reject = reject;
+        });
+
+        requests.push(request);
+        return request.promise;
+    },
+};
+
+beforeEach(function () {
+    requests = [];
+});

Added: trunk/Websites/perf.webkit.org/unit-tests/resources/v3-models.js (0 => 198479)


--- trunk/Websites/perf.webkit.org/unit-tests/resources/v3-models.js	                        (rev 0)
+++ trunk/Websites/perf.webkit.org/unit-tests/resources/v3-models.js	2016-03-21 00:57:01 UTC (rev 198479)
@@ -0,0 +1,41 @@
+'use strict';
+
+function importFromV3(file, name) {
+    const modelsDirectory = '../../public/v3/';
+
+    global[name] = require(modelsDirectory + file)[name];
+}
+
+importFromV3('models/data-model.js', 'DataModelObject');
+importFromV3('models/data-model.js', 'LabeledObject');
+
+importFromV3('models/analysis-task.js', 'AnalysisTask');
+importFromV3('models/builder.js', 'Build');
+importFromV3('models/builder.js', 'Builder');
+importFromV3('models/commit-log.js', 'CommitLog');
+importFromV3('models/measurement-adaptor.js', 'MeasurementAdaptor');
+importFromV3('models/metric.js', 'Metric');
+importFromV3('models/platform.js', 'Platform');
+importFromV3('models/repository.js', 'Repository');
+importFromV3('models/root-set.js', 'MeasurementRootSet');
+importFromV3('models/root-set.js', 'RootSet');
+importFromV3('models/test.js', 'Test');
+
+importFromV3('instrumentation.js', 'Instrumentation');
+
+global.Statistics = require('../../public/shared/statistics.js');
+
+beforeEach(function () {
+    AnalysisTask._fetchAllPromise = null;
+    AnalysisTask.clearStaticMap();
+    CommitLog.clearStaticMap();
+    RootSet.clearStaticMap();
+
+    global.osx = Repository.ensureSingleton(9, {name: 'OS X'});
+    global.webkit = Repository.ensureSingleton(11, {name: 'WebKit', url: 'http://trac.webkit.org/changeset/$1'});
+    global.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]});
+});
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to