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]});
+});