| // 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); |
| } |
| } |
| }; |