WebKit Bugzilla
Attachment 338979 Details for
Bug 184419
: Write a script that detects chart changes by using v3 API.
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-184419-20180426235107.patch (text/plain), 33.62 KB, created by
dewei_zhu
on 2018-04-26 23:51:08 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
dewei_zhu
Created:
2018-04-26 23:51:08 PDT
Size:
33.62 KB
patch
obsolete
>Subversion Revision: 231087 >diff --git a/Websites/perf.webkit.org/ChangeLog b/Websites/perf.webkit.org/ChangeLog >index b399bcb18c52f1bd37319eabc85e853c23806c78..74ccadef9335c36d046f76b5539b40413c42f9d3 100644 >--- a/Websites/perf.webkit.org/ChangeLog >+++ b/Websites/perf.webkit.org/ChangeLog >@@ -1,3 +1,32 @@ >+2018-04-25 Dewei Zhu <dewei_zhu@apple.com> >+ >+ Write a script that detects chart changes by using v3 API. >+ https://bugs.webkit.org/show_bug.cgi?id=184419 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Added a script that detedts chart changes and schedule confirming analysis task. >+ >+ * public/v3/async-task.js: >+ (AsyncTask.isAvailable): Helper function to determine whether AsyncTask is available or not as 'Worker' is not >+ available in nodejs. >+ (AsyncTask): >+ * public/v3/models/bug.js: Export as a module. >+ * public/v3/models/measurement-set.js: >+ (MeasurementSet.prototype._constructUrl): Updated the API url by using absolute url. >+ (MeasurementSet.prototype._invokeSegmentationAlgorithm): Added a check to avoid using AsyncTask when running in Nodejs. >+ (MeasurementSet): >+ * tools/js/v3-models.js: Added import for 'Bug' object. >+ * tools/run-analysis.js: Added script to detect chart changes. >+ (main): >+ (async.analysisLoop): >+ (prototype.async.analyzeOnce): >+ (configurationsForTesting): Create testing configurations based on manifest. >+ (prototype.async.analyzeTestConfiguration): Analyzes a configurations in given dates and creates confirming A/B >+ task when there is no existing analysis task for the same range. >+ * unit-tests/measurement-set-tests.js: Updated unit tests. >+ (const.set MeasurementSet): >+ > 2018-04-26 Dewei Zhu <dewei_zhu@apple.com> > > Extend create-analysis-test API to be able to create with confirming test group. >diff --git a/Websites/perf.webkit.org/public/v3/async-task.js b/Websites/perf.webkit.org/public/v3/async-task.js >index 11b54ffe34fe590d5b03718ba4da7263b84dea75..dfef0654d5b3636c43027aae0764e9676bd0f831 100644 >--- a/Websites/perf.webkit.org/public/v3/async-task.js >+++ b/Websites/perf.webkit.org/public/v3/async-task.js >@@ -29,6 +29,10 @@ class AsyncTask { > }); > } > >+ static isAvailable() >+ { >+ return typeof module == 'undefined' && typeof window == 'undefined'; >+ } > } > > AsyncTask._asyncMessageId = 0; >@@ -149,3 +153,6 @@ if (typeof module == 'undefined' && typeof window == 'undefined' && typeof impor > importScripts('/shared/statistics.js'); > onmessage = AsyncTaskWorker.workerDidRecieveMessage.bind(AsyncTaskWorker); > } >+ >+if (typeof module != 'undefined') >+ module.exports.AsyncTask = AsyncTask; >\ No newline at end of file >diff --git a/Websites/perf.webkit.org/public/v3/models/bug.js b/Websites/perf.webkit.org/public/v3/models/bug.js >index 0329b7e142c69d17abe3f9e028f34a713ccdbea4..49a214ea7a68999ce1e2c7bd4389a707ece5cc21 100644 >--- a/Websites/perf.webkit.org/public/v3/models/bug.js >+++ b/Websites/perf.webkit.org/public/v3/models/bug.js >@@ -29,3 +29,7 @@ class Bug extends DataModelObject { > label() { return this.bugNumber(); } > title() { return `${this._bugTracker.label()}: ${this.bugNumber()}`; } > } >+ >+ >+if (typeof module != 'undefined') >+ module.exports.Bug = Bug; >\ No newline at end of file >diff --git a/Websites/perf.webkit.org/public/v3/models/measurement-set.js b/Websites/perf.webkit.org/public/v3/models/measurement-set.js >index ac4b24590bcf1ef8c13299ca1f2b30f9a752db19..e4a8a076ad10081d0e1c9def7d7c506c472b36f5 100644 >--- a/Websites/perf.webkit.org/public/v3/models/measurement-set.js >+++ b/Websites/perf.webkit.org/public/v3/models/measurement-set.js >@@ -94,10 +94,10 @@ class MeasurementSet { > _constructUrl(useCache, clusterEndTime) > { > if (!useCache) { >- return `../api/measurement-set?platform=${this._platformId}&metric=${this._metricId}`; >+ return `/api/measurement-set?platform=${this._platformId}&metric=${this._metricId}`; > } > var url; >- url = `../data/measurement-set-${this._platformId}-${this._metricId}`; >+ url = `/data/measurement-set-${this._platformId}-${this._metricId}`; > if (clusterEndTime) > url += '-' + +clusterEndTime; > url += '.json'; >@@ -290,7 +290,7 @@ class MeasurementSet { > var args = [timeSeriesValues].concat(parameters || []); > > var timeSeriesIsShortEnoughForSyncComputation = timeSeriesValues.length < 100; >- if (timeSeriesIsShortEnoughForSyncComputation) { >+ if (timeSeriesIsShortEnoughForSyncComputation || !AsyncTask.isAvailable()) { > Instrumentation.startMeasuringTime('_invokeSegmentationAlgorithm', 'syncSegmentation'); > var segmentation = Statistics[segmentationName].apply(timeSeriesValues, args); > Instrumentation.endMeasuringTime('_invokeSegmentationAlgorithm', 'syncSegmentation'); >diff --git a/Websites/perf.webkit.org/tools/js/v3-models.js b/Websites/perf.webkit.org/tools/js/v3-models.js >index 6cfd83b66dc71482c398f1be737cf6097c4a970a..e1b249c4f174549ad0689be60e9f79b79f7ebe84 100644 >--- a/Websites/perf.webkit.org/tools/js/v3-models.js >+++ b/Websites/perf.webkit.org/tools/js/v3-models.js >@@ -11,6 +11,7 @@ importFromV3('models/data-model.js', 'DataModelObject'); > importFromV3('models/data-model.js', 'LabeledObject'); > > importFromV3('models/analysis-task.js', 'AnalysisTask'); >+importFromV3('models/bug.js', 'Bug'); > importFromV3('models/bug-tracker.js', 'BugTracker'); > importFromV3('models/build-request.js', 'BuildRequest'); > importFromV3('models/builder.js', 'Build'); >@@ -37,5 +38,6 @@ importFromV3('models/uploaded-file.js', 'UploadedFile'); > importFromV3('instrumentation.js', 'Instrumentation'); > importFromV3('lazily-evaluated-function.js', 'LazilyEvaluatedFunction'); > importFromV3('commit-set-range-bisector.js', 'CommitSetRangeBisector'); >+importFromV3('async-task.js', 'AsyncTask'); > > global.Statistics = require('../../public/shared/statistics.js'); >\ No newline at end of file >diff --git a/Websites/perf.webkit.org/tools/run-analysis.js b/Websites/perf.webkit.org/tools/run-analysis.js >new file mode 100644 >index 0000000000000000000000000000000000000000..1a46139c7c716b84953fa21423657afe4a85ff49 >--- /dev/null >+++ b/Websites/perf.webkit.org/tools/run-analysis.js >@@ -0,0 +1,166 @@ >+#!/usr/local/bin/node >+ >+const fs = require('fs'); >+const Statistics = require('../public/shared/statistics'); >+const parseArguments = require('./js/parse-arguments.js').parseArguments; >+const RemoteAPI = require('./js/remote.js').RemoteAPI; >+require('./js/v3-models.js'); >+global.PrivilegedAPI = require('./js/privileged-api.js').PrivilegedAPI; >+ >+function main(argv) >+{ >+ const options = parseArguments(argv, [ >+ {name: '--server-config-json', required: true}, >+ {name: '--change-detection-config-json', required: true}, >+ {name: '--seconds-to-sleep', type: parseFloat, default: 1200}, >+ ]); >+ >+ if (!options) >+ return; >+ >+ analysisLoop(options); >+} >+ >+async function analysisLoop(options) >+{ >+ const changeDetectionConfigs = JSON.parse(fs.readFileSync(options['--change-detection-config-json'], 'utf-8')); >+ const serverConfig = JSON.parse(fs.readFileSync(options['--server-config-json'], 'utf-8')); >+ const secondsToSleep = options['--seconds-to-sleep']; >+ global.RemoteAPI = new RemoteAPI(serverConfig.server); >+ PrivilegedAPI.configure(serverConfig.slave.name, serverConfig.slave.password); >+ >+ const manifest = await Manifest.fetch(); >+ const analyzer = new Analyzer(changeDetectionConfigs, manifest, global.RemoteAPI, console); >+ await analyzer.analyzeOnce(); >+ >+ console.log(`Sleeping for ${secondsToSleep} seconds.`); >+ setTimeout(() => analysisLoop(options), secondsToSleep * 1000); >+} >+ >+ >+class Analyzer { >+ constructor(changeDetectionConfigs, manifest, remoteAPI, logger) >+ { >+ this._changeDetectionConfigs = changeDetectionConfigs; >+ this._testingConfigurations = Analyzer.configurationsForTesting(manifest); >+ this._remoteAPI = remoteAPI; >+ this._logger = logger; >+ } >+ >+ async analyzeOnce() >+ { >+ this._logger.info("Start detecting."); >+ for (const [platform, metric] of this._testingConfigurations) >+ await this.analyzeTestConfiguration(platform, metric); >+ } >+ >+ static configurationsForTesting(manifest) >+ { >+ const configurations = []; >+ for (const dashboard of Object.values(manifest.dashboards)) { >+ for (const row of dashboard) { >+ for (const cell of row) { >+ if (cell instanceof Array) { >+ if (cell.length < 2) >+ continue; >+ const platformId = parseInt(cell[0]); >+ const metricId = parseInt(cell[1]); >+ if (isNaN(platformId) || isNaN(metricId)) >+ continue; >+ const platform = Platform.findById(platformId); >+ const metric = Metric.findById(metricId); >+ console.assert(platform); >+ console.assert(metric); >+ configurations.push([platform, metric]); >+ } >+ } >+ } >+ } >+ return configurations; >+ } >+ >+ async analyzeTestConfiguration(platform, metric) >+ { >+ const measurementSet = MeasurementSet.findSet(platform.id(), metric.id(), platform.lastModified(metric)); >+ this._logger.info(`\n==== Analyzing the last ${this._changeDetectionConfigs.maxDays} days: "${metric.fullName()}" on "${platform.name()}" ====\n`); >+ const endTime = Date.now(); >+ const startTime = endTime - this._changeDetectionConfigs.maxDays * 24 * 3600 * 1000; >+ >+ await measurementSet.fetchBetween(startTime, endTime); >+ const currentTimeSeries = measurementSet.fetchedTimeSeries('current', false, false); >+ const rawValues = currentTimeSeries.values(); >+ >+ let segmentedValues = await measurementSet.fetchSegmentation('segmentTimeSeriesByMaximizingSchwarzCriterion', [], 'current', false); >+ >+ if (!segmentedValues || !segmentedValues.length) { >+ this._logger.warn(`Failed fetching segmentations for ${metric.fullName()}" on "${platform.name()}"`); >+ return; >+ } >+ >+ const ranges = Statistics.findRangesForChangeDetectionsWithWelchsTTest(rawValues, segmentedValues, 0.99).map((range) =>({ >+ startPoint: currentTimeSeries.findPointByIndex(range.startIndex), >+ endPoint: currentTimeSeries.findPointByIndex(range.endIndex), >+ segmentationStartValue: range.segmentationStartValue, >+ segmentationEndValue: range.segmentationEndValue, >+ overlappingAnalysisTasks: [], >+ description: `series index range: [${range.startIndex} - ${range.endIndex}]` >+ })); >+ >+ const analysisTasks = await AnalysisTask.fetchByPlatformAndMetric(platform.id(), metric.id()); >+ >+ for (const task of analysisTasks) { >+ const taskStartPoint = currentTimeSeries.findById(task.startMeasurementId()); >+ const taskEndPoint = currentTimeSeries.findById(task.endMeasurementId()); >+ if (!taskStartPoint || !taskEndPoint) >+ continue; >+ >+ for (const range of ranges) { >+ const disjoint = range.endPoint.seriesIndex < taskStartPoint.seriesIndex >+ || taskEndPoint.seriesIndex < range.startPoint.seriesIndex; >+ >+ if (!disjoint) >+ range.overlappingAnalysisTasks.push(task); >+ } >+ >+ } >+ >+ const filteredRanges = ranges.filter((range) => range.endPoint.time >= startTime && !range.overlappingAnalysisTasks.length) >+ .sort((a, b) => a.endPoint.time - b.endPoint.time); >+ >+ let summary, rangeWithMostSignificantChange = null, valueChangeSummaryForRangeWithMostSignificantChange = null; >+ const progressionString = 'progression'; >+ const regressionString = 'regression'; >+ for (const range of filteredRanges) { >+ const valueChangeSummary = metric.labelForDifference(range.segmentationStartValue, range.segmentationEndValue, >+ progressionString, regressionString); >+ const startCommitSet = range.startPoint.commitSet(); >+ const endCommitSet = range.endPoint.commitSet(); >+ >+ const currentChangeIsMoreSignificant = !rangeWithMostSignificantChange >+ || (valueChangeSummaryForRangeWithMostSignificantChange.changeType === valueChangeSummary.changeType >+ && Math.abs(valueChangeSummaryForRangeWithMostSignificantChange.relativeChange) < Math.abs(valueChangeSummary.relativeChange)) >+ || (valueChangeSummaryForRangeWithMostSignificantChange.changeType === progressionString >+ && valueChangeSummary.changeType === regressionString); >+ >+ const currentSummary = `Potential ${valueChangeSummary.changeLabel} on ${platform.name()} between ${CommitSet.diff(startCommitSet, endCommitSet)}`; >+ >+ if (currentChangeIsMoreSignificant) { >+ rangeWithMostSignificantChange = range; >+ valueChangeSummaryForRangeWithMostSignificantChange = valueChangeSummary; >+ summary = currentSummary; >+ } >+ this._logger.log('Detected:', currentSummary); >+ } >+ >+ if (!rangeWithMostSignificantChange) { >+ this._logger.log('Nothing to analyze'); >+ return; >+ } >+ >+ this._logger.log(`Creating analysis task and confirming: "${summary}".`); >+ await AnalysisTask.create(summary, rangeWithMostSignificantChange.startPoint, rangeWithMostSignificantChange.endPoint, >+ 'Confirm', this._changeDetectionConfigs.confirmTaskRepeatCount); >+ } >+} >+ >+main(process.argv); >\ No newline at end of file >diff --git a/Websites/perf.webkit.org/unit-tests/measurement-set-tests.js b/Websites/perf.webkit.org/unit-tests/measurement-set-tests.js >index 47393e087bc4e9b4cb2abfe2467dbc7710aab384..cf05e0802c015afc93d93a9a486a0d965027efff 100644 >--- a/Websites/perf.webkit.org/unit-tests/measurement-set-tests.js >+++ b/Websites/perf.webkit.org/unit-tests/measurement-set-tests.js >@@ -41,7 +41,7 @@ describe('MeasurementSet', () => { > callCount++; > }); > assert.equal(requests.length, 1); >- assert.equal(requests[0].url, '../data/measurement-set-1-1.json'); >+ assert.equal(requests[0].url, '/data/measurement-set-1-1.json'); > > requests[0].resolve({ > 'clusterStart': 946684800000, >@@ -67,7 +67,7 @@ describe('MeasurementSet', () => { > let callCount = 0; > set.fetchBetween(1000, 2000, () => callCount++); > assert.equal(requests.length, 1); >- assert.equal(requests[0].url, '../data/measurement-set-1-1.json'); >+ assert.equal(requests[0].url, '/data/measurement-set-1-1.json'); > assert.equal(callCount, 0); > }); > >@@ -77,7 +77,7 @@ describe('MeasurementSet', () => { > set.fetchBetween(1000, 2000, () => callCount++); > assert.equal(requests.length, 1); > assert.equal(callCount, 0); >- assert.equal(requests[0].url, '../data/measurement-set-1-1.json'); >+ assert.equal(requests[0].url, '/data/measurement-set-1-1.json'); > set.fetchBetween(2000, 3000, () => callCount++); > assert.equal(requests.length, 1); > assert.equal(callCount, 0); >@@ -88,7 +88,7 @@ describe('MeasurementSet', () => { > let callCount = 0; > const promise = set.fetchBetween(2000, 3000, () => callCount++); > assert.equal(requests.length, 1); >- assert.equal(requests[0].url, '../data/measurement-set-1-1.json'); >+ assert.equal(requests[0].url, '/data/measurement-set-1-1.json'); > > requests[0].resolve({ > 'clusterStart': 1000, >@@ -112,7 +112,7 @@ describe('MeasurementSet', () => { > let callCount = 0; > const promise = set.fetchBetween(1000, 3000, () => callCount++); > assert.equal(requests.length, 1); >- assert.equal(requests[0].url, '../data/measurement-set-1-1.json'); >+ assert.equal(requests[0].url, '/data/measurement-set-1-1.json'); > > requests[0].resolve({ > 'clusterStart': 1000, >@@ -128,7 +128,7 @@ describe('MeasurementSet', () => { > return waitForMeasurementSet().then(() => { > assert.equal(callCount, 1); > assert.equal(requests.length, 2); >- assert.equal(requests[1].url, '../data/measurement-set-1-1-2000.json'); >+ assert.equal(requests[1].url, '/data/measurement-set-1-1-2000.json'); > }); > }); > >@@ -137,7 +137,7 @@ describe('MeasurementSet', () => { > let callCountForWaitingCallback = 0; > set.fetchBetween(2000, 3000, () => callCountForWaitingCallback++); > assert.equal(requests.length, 1); >- assert.equal(requests[0].url, '../data/measurement-set-1-1.json'); >+ assert.equal(requests[0].url, '/data/measurement-set-1-1.json'); > > requests[0].resolve({ > 'clusterStart': 1000, >@@ -153,7 +153,7 @@ describe('MeasurementSet', () => { > let callCount = 0; > return waitForMeasurementSet().then(() => { > assert.equal(requests.length, 2); >- assert.equal(requests[1].url, '../data/measurement-set-1-1-3000.json'); >+ assert.equal(requests[1].url, '/data/measurement-set-1-1-3000.json'); > > set.fetchBetween(0, 7000, () => callCount++); > >@@ -162,8 +162,8 @@ describe('MeasurementSet', () => { > assert.equal(callCountForWaitingCallback, 0); > assert.equal(callCount, 1); > assert.equal(requests.length, 4); >- assert.equal(requests[2].url, '../data/measurement-set-1-1-2000.json'); >- assert.equal(requests[3].url, '../data/measurement-set-1-1-4000.json'); >+ assert.equal(requests[2].url, '/data/measurement-set-1-1-2000.json'); >+ assert.equal(requests[3].url, '/data/measurement-set-1-1-4000.json'); > }); > }); > >@@ -172,7 +172,7 @@ describe('MeasurementSet', () => { > let callCount = 0; > const promise = set.fetchBetween(2707, 4207, () => callCount++); > assert.equal(requests.length, 1); >- assert.equal(requests[0].url, '../data/measurement-set-1-1.json'); >+ assert.equal(requests[0].url, '/data/measurement-set-1-1.json'); > > requests[0].resolve({ > 'clusterStart': 1000, >@@ -187,8 +187,8 @@ describe('MeasurementSet', () => { > > return waitForMeasurementSet().then(() => { > assert.equal(requests.length, 3); >- assert.equal(requests[1].url, '../data/measurement-set-1-1-3000.json'); >- assert.equal(requests[2].url, '../data/measurement-set-1-1-4000.json'); >+ assert.equal(requests[1].url, '/data/measurement-set-1-1-3000.json'); >+ assert.equal(requests[2].url, '/data/measurement-set-1-1-4000.json'); > assert.equal(callCount, 1); // 4000-4207 > }); > }); >@@ -198,7 +198,7 @@ describe('MeasurementSet', () => { > let callCountForWaitingCallback = 0; > set.fetchBetween(3200, 3700, () => callCountForWaitingCallback++); > assert.equal(requests.length, 1); >- assert.equal(requests[0].url, '../data/measurement-set-1-1.json'); >+ assert.equal(requests[0].url, '/data/measurement-set-1-1.json'); > > requests[0].resolve({ > 'clusterStart': 1000, >@@ -214,21 +214,21 @@ describe('MeasurementSet', () => { > let callCount = 0; > return waitForMeasurementSet().then(() => { > assert.equal(requests.length, 2); >- assert.equal(requests[1].url, '../data/measurement-set-1-1-4000.json'); >+ assert.equal(requests[1].url, '/data/measurement-set-1-1-4000.json'); > set.fetchBetween(1207, 1293, () => callCount++); > return waitForMeasurementSet(); > }).then(() => { > assert.equal(callCountForWaitingCallback, 0); > assert.equal(callCount, 0); > assert.equal(requests.length, 3); >- assert.equal(requests[2].url, '../data/measurement-set-1-1-2000.json'); >+ assert.equal(requests[2].url, '/data/measurement-set-1-1-2000.json'); > set.fetchBetween(1964, 3401, () => callCount++); > return waitForMeasurementSet(); > }).then(() => { > assert.equal(callCountForWaitingCallback, 0); > assert.equal(callCount, 0); > assert.equal(requests.length, 4); >- assert.equal(requests[3].url, '../data/measurement-set-1-1-3000.json'); >+ assert.equal(requests[3].url, '/data/measurement-set-1-1-3000.json'); > }); > }); > >@@ -237,7 +237,7 @@ describe('MeasurementSet', () => { > let callCount = 0; > set.fetchBetween(0, 3000, () => callCount++); > assert.equal(requests.length, 1); >- assert.equal(requests[0].url, '../data/measurement-set-1-1.json'); >+ assert.equal(requests[0].url, '/data/measurement-set-1-1.json'); > > requests[0].resolve({ > 'clusterStart': 2000, >@@ -262,7 +262,7 @@ describe('MeasurementSet', () => { > let rejected = false; > set.fetchBetween(1000, 3000, () => callCount++).catch(() => rejected = true); > assert.equal(requests.length, 1); >- assert.equal(requests[0].url, '../data/measurement-set-1-1.json'); >+ assert.equal(requests[0].url, '/data/measurement-set-1-1.json'); > > requests[0].reject(500); > >@@ -278,7 +278,7 @@ describe('MeasurementSet', () => { > let callCount = 0; > set.fetchBetween(1000, 2000, () => callCount++); > assert.equal(requests.length, 1); >- assert.equal(requests[0].url, '../data/measurement-set-1-1.json'); >+ assert.equal(requests[0].url, '/data/measurement-set-1-1.json'); > > requests[0].resolve({ > 'clusterStart': 1000, >@@ -294,7 +294,7 @@ describe('MeasurementSet', () => { > return waitForMeasurementSet().then(() => { > assert.equal(callCount, 0); > assert.equal(requests.length, 2); >- assert.equal(requests[1].url, '../api/measurement-set?platform=1&metric=1'); >+ assert.equal(requests[1].url, '/api/measurement-set?platform=1&metric=1'); > }); > }); > >@@ -303,14 +303,14 @@ describe('MeasurementSet', () => { > let callCount = 0; > set.fetchBetween(1000, 2000, () => callCount++); > assert.equal(requests.length, 1); >- assert.equal(requests[0].url, '../data/measurement-set-1-1.json'); >+ assert.equal(requests[0].url, '/data/measurement-set-1-1.json'); > > requests[0].reject(404); > > return waitForMeasurementSet().then(() => { > assert.equal(callCount, 0); > assert.equal(requests.length, 2); >- assert.equal(requests[1].url, '../api/measurement-set?platform=1&metric=1'); >+ assert.equal(requests[1].url, '/api/measurement-set?platform=1&metric=1'); > }); > }); > >@@ -319,7 +319,7 @@ describe('MeasurementSet', () => { > let callCount = 0; > set.fetchBetween(1000, 3000, () => callCount++); > assert.equal(requests.length, 1); >- assert.equal(requests[0].url, '../data/measurement-set-1-1.json'); >+ assert.equal(requests[0].url, '/data/measurement-set-1-1.json'); > > requests[0].resolve({ > 'clusterStart': 1000, >@@ -338,7 +338,7 @@ describe('MeasurementSet', () => { > assert.equal(noCacheFetchCount, 0); > assert.equal(set._sortedClusters.length, 1); > assert.equal(requests.length, 2); >- assert.equal(requests[1].url, '../data/measurement-set-1-1-2000.json'); >+ assert.equal(requests[1].url, '/data/measurement-set-1-1-2000.json'); > > requests[1].resolve({ > 'clusterStart': 1000, >@@ -359,7 +359,7 @@ describe('MeasurementSet', () => { > assert.equal(noCacheFetchCount, 0); > assert.equal(set._sortedClusters.length, 2); > assert.equal(requests.length, 3); >- assert.equal(requests[2].url, '../api/measurement-set?platform=1&metric=1'); >+ assert.equal(requests[2].url, '/api/measurement-set?platform=1&metric=1'); > > requests[2].resolve({ > 'clusterStart': 1000, >@@ -378,7 +378,7 @@ describe('MeasurementSet', () => { > assert.equal(noCacheFetchCount, 1); > assert.equal(set._sortedClusters.length, 2); > assert.equal(requests.length, 4); >- assert.equal(requests[3].url, '../data/measurement-set-1-1-2000.json'); >+ assert.equal(requests[3].url, '/data/measurement-set-1-1-2000.json'); > > requests[3].resolve({ > 'clusterStart': 1000, >@@ -405,7 +405,7 @@ describe('MeasurementSet', () => { > let callCount = 0; > set.fetchBetween(2000, 3000, () => callCount++); > assert.equal(requests.length, 1); >- assert.equal(requests[0].url, '../data/measurement-set-1-1.json'); >+ assert.equal(requests[0].url, '/data/measurement-set-1-1.json'); > > let alternativeCallCount = 0; > set.fetchBetween(2000, 3000, () => alternativeCallCount++); >@@ -433,7 +433,7 @@ describe('MeasurementSet', () => { > let callCountFor4000 = 0; > set.fetchBetween(3200, 3700, () => callCountFor4000++); > assert.equal(requests.length, 1); >- assert.equal(requests[0].url, '../data/measurement-set-1-1.json'); >+ assert.equal(requests[0].url, '/data/measurement-set-1-1.json'); > > requests[0].resolve({ > 'clusterStart': 1000, >@@ -452,7 +452,7 @@ describe('MeasurementSet', () => { > return waitForMeasurementSet().then(() => { > assert.equal(callCountFor4000, 0); > assert.equal(requests.length, 2); >- assert.equal(requests[1].url, '../data/measurement-set-1-1-4000.json'); >+ assert.equal(requests[1].url, '/data/measurement-set-1-1-4000.json'); > > set.fetchBetween(3708, 4800, () => callCountFor4000To5000++); > return waitForMeasurementSet(); >@@ -465,7 +465,7 @@ describe('MeasurementSet', () => { > }).then(() => { > assert.equal(callCountFor2000, 0); > assert.equal(requests.length, 3); >- assert.equal(requests[2].url, '../data/measurement-set-1-1-2000.json'); >+ assert.equal(requests[2].url, '/data/measurement-set-1-1-2000.json'); > > requests[2].resolve({ > 'formatMap': [], >@@ -486,7 +486,7 @@ describe('MeasurementSet', () => { > }).then(() => { > assert.equal(callCountFor2000To4000, 1); > assert.equal(requests.length, 4); >- assert.equal(requests[3].url, '../data/measurement-set-1-1-3000.json'); >+ assert.equal(requests[3].url, '/data/measurement-set-1-1-3000.json'); > > requests[3].resolve({ > 'formatMap': [], >@@ -533,7 +533,7 @@ describe('MeasurementSet', () => { > const set = MeasurementSet.findSet(1, 1, 3000); > const promise = set.fetchBetween(2000, 3000); > assert.equal(requests.length, 1); >- assert.equal(requests[0].url, '../data/measurement-set-1-1.json'); >+ assert.equal(requests[0].url, '/data/measurement-set-1-1.json'); > > requests[0].resolve({ > 'clusterStart': 1000, >@@ -556,7 +556,7 @@ describe('MeasurementSet', () => { > const set = MeasurementSet.findSet(1, 1, 3000); > const promise = set.fetchBetween(2000, 3000); > assert.equal(requests.length, 1); >- assert.equal(requests[0].url, '../data/measurement-set-1-1.json'); >+ assert.equal(requests[0].url, '/data/measurement-set-1-1.json'); > > requests[0].resolve({ > 'clusterStart': 1000, >@@ -578,7 +578,7 @@ describe('MeasurementSet', () => { > const set = MeasurementSet.findSet(1, 1, 5000); > const promise = set.fetchBetween(2000, 3000); > assert.equal(requests.length, 1); >- assert.equal(requests[0].url, '../data/measurement-set-1-1.json'); >+ assert.equal(requests[0].url, '/data/measurement-set-1-1.json'); > > requests[0].resolve({ > 'clusterStart': 1000, >@@ -593,7 +593,7 @@ describe('MeasurementSet', () => { > > return waitForMeasurementSet().then(() => { > assert.equal(requests.length, 2); >- assert.equal(requests[1].url, '../data/measurement-set-1-1-3000.json'); >+ assert.equal(requests[1].url, '/data/measurement-set-1-1-3000.json'); > requests[1].resolve({ > 'clusterStart': 1000, > 'clusterSize': 1000, >@@ -613,7 +613,7 @@ describe('MeasurementSet', () => { > const set = MeasurementSet.findSet(1, 1, 5000); > set.fetchBetween(2000, 3000); > assert.equal(requests.length, 1); >- assert.equal(requests[0].url, '../data/measurement-set-1-1.json'); >+ assert.equal(requests[0].url, '/data/measurement-set-1-1.json'); > > requests[0].resolve({ > 'clusterStart': 1000, >@@ -628,7 +628,7 @@ describe('MeasurementSet', () => { > > return waitForMeasurementSet().then(() => { > assert.equal(requests.length, 2); >- assert.equal(requests[1].url, '../data/measurement-set-1-1-3000.json'); >+ assert.equal(requests[1].url, '/data/measurement-set-1-1-3000.json'); > requests[1].resolve({ > 'clusterStart': 1000, > 'clusterSize': 1000, >@@ -648,7 +648,7 @@ describe('MeasurementSet', () => { > const set = MeasurementSet.findSet(1, 1, 5000); > set.fetchBetween(2000, 5000); > assert.equal(requests.length, 1); >- assert.equal(requests[0].url, '../data/measurement-set-1-1.json'); >+ assert.equal(requests[0].url, '/data/measurement-set-1-1.json'); > > requests[0].resolve({ > 'clusterStart': 1000, >@@ -663,8 +663,8 @@ describe('MeasurementSet', () => { > > return waitForMeasurementSet().then(() => { > assert.equal(requests.length, 3); >- assert.equal(requests[1].url, '../data/measurement-set-1-1-3000.json'); >- assert.equal(requests[2].url, '../data/measurement-set-1-1-4000.json'); >+ assert.equal(requests[1].url, '/data/measurement-set-1-1-3000.json'); >+ assert.equal(requests[2].url, '/data/measurement-set-1-1-4000.json'); > requests[1].resolve({ > 'clusterStart': 1000, > 'clusterSize': 1000, >@@ -686,7 +686,7 @@ describe('MeasurementSet', () => { > const set = MeasurementSet.findSet(1, 1, 3000); > const promise = set.fetchBetween(2000, 3000); > assert.equal(requests.length, 1); >- assert.equal(requests[0].url, '../data/measurement-set-1-1.json'); >+ assert.equal(requests[0].url, '/data/measurement-set-1-1.json'); > > requests[0].resolve({ > 'clusterStart': 1000, >@@ -775,7 +775,7 @@ describe('MeasurementSet', () => { > const set = MeasurementSet.findSet(15, 769, 1484105738736); > const promise = set.fetchBetween(1476426488465, 1484203801573); > assert.equal(requests.length, 1); >- assert.equal(requests[0].url, '../data/measurement-set-15-769.json'); >+ assert.equal(requests[0].url, '/data/measurement-set-15-769.json'); > > requests[0].resolve(sampleCluster); > >@@ -975,7 +975,7 @@ describe('MeasurementSet', () => { > const set = MeasurementSet.findSet(1, 1, 5000); > const promise = set.fetchBetween(4000, 5000); > assert.equal(requests.length, 1); >- assert.equal(requests[0].url, '../data/measurement-set-1-1.json'); >+ assert.equal(requests[0].url, '/data/measurement-set-1-1.json'); > > requests[0].resolve({ > 'clusterStart': 1000, >@@ -1015,7 +1015,7 @@ describe('MeasurementSet', () => { > const set = MeasurementSet.findSet(1, 1, 5000); > const promise = set.fetchBetween(3000, 5000); > assert.equal(requests.length, 1); >- assert.equal(requests[0].url, '../data/measurement-set-1-1.json'); >+ assert.equal(requests[0].url, '/data/measurement-set-1-1.json'); > > requests[0].resolve({ > 'clusterStart': 1000, >@@ -1030,7 +1030,7 @@ describe('MeasurementSet', () => { > > return waitForMeasurementSet().then(() => { > assert.equal(requests.length, 2); >- assert.equal(requests[1].url, '../data/measurement-set-1-1-4000.json'); >+ assert.equal(requests[1].url, '/data/measurement-set-1-1-4000.json'); > return set.fetchSegmentation('segmentTimeSeriesByMaximizingSchwarzCriterion', [], 'current', false); > }).then((segmentation) => { > const timeSeries = set.fetchedTimeSeries('current', false, false);
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 184419
:
337503
|
338979
|
339165
|
339255