blob: ddc351881172f8ab77a48a35e4c42091b91bcf2a [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @fileoverview using private properties isn't a Closure violation in tests.
* @suppress {accessControls}
*/
BindingsTestRunner.addFiles = function(testFileSystem, files) {
for (const filePath in files) {
const file = files[filePath];
testFileSystem.addFile(filePath, file.content, (file.time ? file.time.getTime() : 0));
}
};
let timeOverrides;
let originalRequestMetadata;
BindingsTestRunner.overrideNetworkModificationTime = function(urlToTime) {
if (!timeOverrides) {
timeOverrides = new Map();
originalRequestMetadata =
TestRunner.override(Bindings.ContentProviderBasedProject.prototype, 'requestMetadata', overrideTime, true);
}
for (const url in urlToTime) {
timeOverrides.set(url, urlToTime[url]);
}
function overrideTime(uiSourceCode) {
if (!timeOverrides.has(uiSourceCode.url())) {
return originalRequestMetadata.call(this, uiSourceCode);
}
const override = timeOverrides.get(uiSourceCode.url());
return originalRequestMetadata.call(this, uiSourceCode).then(onOriginalMetadata.bind(null, override));
}
function onOriginalMetadata(timeOverride, metadata) {
if (!timeOverride && !metadata) {
return null;
}
return new Workspace.UISourceCodeMetadata(timeOverride, (metadata ? metadata.contentSize : null));
}
};
BindingsTestRunner.AutomappingTest = function(workspace) {
this._workspace = workspace;
this._networkProject = new Bindings.ContentProviderBasedProject(
this._workspace, 'AUTOMAPPING', Workspace.projectTypes.Network, 'simple website');
if (workspace !== Workspace.workspace) {
new Persistence.FileSystemWorkspaceBinding(Persistence.isolatedFileSystemManager, this._workspace);
}
this._failedBindingsCount = 0;
this._automapping =
new Persistence.Automapping(this._workspace, this._onStatusAdded.bind(this), this._onStatusRemoved.bind(this));
TestRunner.addSniffer(this._automapping, '_onBindingFailedForTest', this._onBindingFailed.bind(this), true);
TestRunner.addSniffer(this._automapping, '_onSweepHappenedForTest', this._onSweepHappened.bind(this), true);
};
BindingsTestRunner.AutomappingTest.prototype = {
removeResources: function(urls) {
for (const url of urls) {
this._networkProject.removeFile(url);
}
},
addNetworkResources: function(assets) {
for (const url in assets) {
const asset = assets[url];
const contentType = asset.contentType || Common.resourceTypes.Script;
const contentProvider = Common.StaticContentProvider.fromString(url, contentType, asset.content);
const metadata =
(typeof asset.content === 'string' || asset.time ?
new Workspace.UISourceCodeMetadata(asset.time, asset.content.length) :
null);
const uiSourceCode = this._networkProject.createUISourceCode(url, contentType);
this._networkProject.addUISourceCodeWithProvider(uiSourceCode, contentProvider, metadata);
}
},
waitUntilMappingIsStabilized: function() {
const promise = new Promise(x => this._stabilizedCallback = x);
this._checkStabilized();
return promise;
},
_onSweepHappened: function() {
this._failedBindingsCount = 0;
this._checkStabilized();
},
_onStatusRemoved: function(status) {
TestRunner.addResult('Binding removed: ' + status);
this._checkStabilized();
},
_onStatusAdded: function(status) {
TestRunner.addResult('Binding created: ' + status);
this._checkStabilized();
},
_onBindingFailed: function() {
++this._failedBindingsCount;
this._checkStabilized();
},
_checkStabilized: function() {
if (!this._stabilizedCallback || this._automapping._sweepThrottler._process) {
return;
}
const networkUISourceCodes = this._workspace.uiSourceCodesForProjectType(Workspace.projectTypes.Network);
const stabilized = this._failedBindingsCount + this._automapping._statuses.size === networkUISourceCodes.length;
if (stabilized) {
TestRunner.addResult('Mapping has stabilized.');
const callback = this._stabilizedCallback;
delete this._stabilizedCallback;
callback.call(null);
}
}
};