@opstarts/chimp
Version:
Develop acceptance tests & end-to-end tests with realtime feedback.
133 lines (112 loc) • 4.38 kB
JavaScript
;
var request = require('request'),
log = require('./log');
/**
* SessionManager Constructor
*
* @param {Object} options
* @api public
*/
function BrowserStackSessionManager(options) {
log.debug('[chimp][browserstack-session-manager] options are', options);
var host = options.host.replace(/hub\.|hub-cloud\./, 'www.');
var browserStackBaseUrl = 'https://' + options.user + ':' + options.key + '@' + host;
options.browserStackUrl = browserStackBaseUrl;
this.options = options;
this.maxRetries = 30;
this.retryDelay = 3000;
this.retry = 0;
log.debug('[chimp][browserstack-session-manager] created a new SessionManager', options);
}
BrowserStackSessionManager.prototype.webdriver = require('xolvio-sync-webdriverio');
/**
* Wraps the webdriver remote method and allows reuse options
*
* @api public
*/
BrowserStackSessionManager.prototype.remote = function (webdriverOptions, callback) {
var self = this;
log.debug('[chimp][browserstack-session-manager] creating webdriver remote ');
var browser = this.webdriver.remote(webdriverOptions);
callback(null, browser);
return;
};
/**
* Gets a list of builds from the BrowserStack API as sessions must be queried based on Builds
*
* @api private
*/
BrowserStackSessionManager.prototype._getBuilds = function (callback) {
var hub = this.options.browserStackUrl + '/automate/builds.json?status=running';
log.debug('[chimp][browserstack-session-manager]', 'requesting builds from', hub);
request(hub, function (error, response, body) {
if (!error && response.statusCode === 200) {
log.debug('[chimp][browserstack-session-manager]', 'received data', body);
callback(null, JSON.parse(body));
} else {
log.error('[chimp][browserstack-session-manager]', 'received error', error);
callback(error);
}
});
};
/**
* Gets a list of sessions from the BrowserStack API based on Build ID
*
* @api private
*/
BrowserStackSessionManager.prototype._getSessions = function (buildId, callback) {
var hub = this.options.browserStackUrl + '/automate/builds/' + buildId + '/sessions.json?status=running';
log.debug('[chimp][browserstack-session-manager]', 'requesting sessions from', hub);
request(hub, function (error, response, body) {
if (!error && response.statusCode === 200) {
log.debug('[chimp][browserstack-session-manager]', 'received data', body);
callback(null, JSON.parse(body));
} else {
log.error('[chimp][browserstack-session-manager]', 'received error', error);
callback(error);
}
});
};
/**
* Kills the 1st session found running on BrowserStack
*
* @api public
*/
BrowserStackSessionManager.prototype.killCurrentSession = function (callback) {
this._getBuilds(function (err, builds) {
if (builds && builds.length) {
log.debug('[chimp][browserstack-session-manager]', builds, builds[0]);
var buildId = builds[0].automation_build.hashed_id;
}
if (buildId !== '') {
this._getSessions(buildId, function (err, sessions) {
if (sessions && sessions.length) {
var wdHubSession = 'http://' + this.options.host + ':' + this.options.port + '/wd/hub/session';
request.del(wdHubSession + '/' + sessions[0].automation_session.hashed_id, function (wdError, wdResponse) {
if (!wdError && wdResponse.statusCode === 200) {
var options = {
url: this.options.browserStackUrl + '/automate/sessions/' + sessions[0].automation_session.hashed_id + '.json',
method: 'PUT',
json: true,
body: { status: 'completed' }
};
request(options, function (error, response) {
if (!error && response.statusCode === 200) {
log.debug('[chimp][browserstack-session-manager]', 'stopped session');
callback();
} else {
log.error('[chimp][browserstack-session-manager]', 'received error', error);
callback(error);
}
});
} else {
log.error('[chimp][browserstack-session-manager]', 'received error', error);
callback(wdError);
}
}.bind(this));
}
}.bind(this));
}
}.bind(this));
};
module.exports = BrowserStackSessionManager;