intern
Version:
Intern. A next-generation code testing stack for JavaScript.
206 lines • 9.32 kB
JavaScript
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "tslib", "url", "path", "querystring", "@theintern/common", "./Suite", "./common/util", "./Deferred"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var url_1 = require("url");
var path_1 = require("path");
var querystring_1 = require("querystring");
var common_1 = require("@theintern/common");
var Suite_1 = tslib_1.__importDefault(require("./Suite"));
var util_1 = require("./common/util");
var Deferred_1 = tslib_1.__importDefault(require("./Deferred"));
var RemoteSuite = (function (_super) {
tslib_1.__extends(RemoteSuite, _super);
function RemoteSuite(options) {
var _this = this;
options = options || {};
if (options.name == null) {
options.name = 'remote unit tests';
}
_this = _super.call(this, options) || this;
if (_this.timeout == null) {
_this.timeout = Infinity;
}
return _this;
}
Object.defineProperty(RemoteSuite.prototype, "id", {
get: function () {
var name = [];
var suite = this.parent;
do {
suite.name != null && name.unshift(suite.name);
} while ((suite = suite.parent));
return name.join(' - ');
},
enumerable: false,
configurable: true
});
RemoteSuite.prototype.run = function () {
var _this = this;
var remote = this.remote;
var sessionId = remote.session.sessionId;
var server = this.executor.server;
var listenerHandle;
var connectTimer;
return new common_1.Task(function (resolve, reject) {
var _a;
var handleError = function (error) {
_this.error = error;
reject(error);
};
var config = _this.executor.config;
var pendingConnection = new Deferred_1.default();
var connectTimeout = config.connectTimeout;
connectTimer = global.setTimeout(function () {
var error = new Error('Timed out waiting for remote to connect');
error.name = 'TimeoutError';
pendingConnection.reject(error);
}, connectTimeout);
listenerHandle = server.subscribe(sessionId, function (eventName, data) {
var _a;
var name = eventName;
var suite;
switch (name) {
case 'remoteStatus':
if (data === 'initialized') {
clearTimeout(connectTimer);
pendingConnection.resolve();
}
break;
case 'suiteStart':
suite = data;
if (!suite.hasParent) {
(_a = _this.tests).push.apply(_a, suite.tests);
return _this.executor.emit('suiteStart', _this);
}
else {
return _this.executor.emit(name, data);
}
case 'suiteEnd':
suite = data;
_this.skipped = suite.skipped;
if (!suite.hasParent) {
suite.tests.forEach(function (test, index) {
_this.tests[index] = test;
});
if (suite.error) {
handleError(suite.error);
}
}
else {
return _this.executor.emit(name, data);
}
break;
case 'beforeRun':
case 'afterRun':
case 'runStart':
break;
case 'runEnd':
var promise = remote.setHeartbeatInterval(0);
if (_this.executor.hasCoveredFiles) {
promise = promise.get('about:blank');
}
return promise.then(resolve, reject);
case 'error':
if (!/One or more suite errors/.test(data.message)) {
handleError(data);
}
break;
default:
return _this.executor.emit(name, data);
}
});
var serverUrl = url_1.parse(config.serverUrl);
var timeout = config.heartbeatInterval;
if (timeout >= 1 && timeout < Infinity) {
remote.setHeartbeatInterval((timeout - 1) * 1000);
}
var queryOptions = {
basePath: (_a = serverUrl.pathname) !== null && _a !== void 0 ? _a : undefined,
runInSync: config.runInSync || false,
serverUrl: serverUrl.href,
sessionId: sessionId,
socketPort: server.socketPort,
socketTimeout: config.socketTimeout,
};
var queryParams = {};
Object.keys(queryOptions)
.filter(function (option) {
var key = option;
return queryOptions[key] != null;
})
.forEach(function (option) {
var key = option;
var value = queryOptions[key];
if (typeof value === 'object') {
value = JSON.stringify(value);
}
queryParams[key] = value;
});
var query = querystring_1.stringify(queryParams);
var harness = config.serverUrl + "__intern/browser/remote.html";
var internPath = path_1.relative(config.basePath, config.internPath);
var disableDomUpdates = config.remoteOptions && config.remoteOptions.disableDomUpdates;
var remoteReporters = disableDomUpdates ? [] : [{ name: 'dom' }];
var remoteConfig = {
debug: config.debug,
internPath: "" + serverUrl.pathname + internPath,
name: _this.id,
reporters: remoteReporters,
};
var excludeKeys = {
basePath: true,
internPath: true,
name: true,
reporters: true,
serverUrl: true,
sessionId: true,
socketPort: true,
socketTimeout: true,
};
Object.keys(config)
.filter(function (key) { return !excludeKeys[key]; })
.forEach(function (property) {
var key = property;
remoteConfig[key] = config[key];
});
_this.executor.log('Configuring remote "', _this.name, '" with', remoteConfig);
remote
.get(harness + "?" + query)
.then(function () { return pendingConnection.promise; })
.execute(function (configString) {
var options = JSON.parse(configString);
intern.configure(options);
intern.run().catch(function (_error) { });
}, [util_1.stringify(remoteConfig)])
.catch(function (error) {
return remote.setHeartbeatInterval(0).finally(function () { return handleError(error); });
});
}, function () { return remote.setHeartbeatInterval(0); })
.catch(function (error) {
if (!_this.error) {
_this.error = error;
}
throw error;
})
.finally(function () {
if (connectTimer) {
clearTimeout(connectTimer);
}
listenerHandle.destroy();
})
.finally(function () { return _this.executor.emit('suiteEnd', _this); });
};
return RemoteSuite;
}(Suite_1.default));
exports.default = RemoteSuite;
});
//# sourceMappingURL=RemoteSuite.js.map