From 0f3041138e6eea7021b49cfdf5c87a0039cf49c8 Mon Sep 17 00:00:00 2001 From: Rahul Jaisinghani Date: Mon, 18 Nov 2019 23:46:47 +0530 Subject: [PATCH 1/3] configured for staging --- src/backends/automate.js | 24 +++++++++++++----------- src/connector.js | 1 + 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/backends/automate.js b/src/backends/automate.js index 0b7b248..25fb292 100644 --- a/src/backends/automate.js +++ b/src/backends/automate.js @@ -10,52 +10,52 @@ const API_POLLING_INTERVAL = 80000; const BROWSERSTACK_API_PATHS = { browserList: { - url: 'https://api.browserstack.com/automate/browsers.json' + url: 'https://apici.bsstag.com/automate/browsers.json' }, newSession: { - url: 'http://hub-cloud.browserstack.com/wd/hub/session', + url: 'http://cihub.bsstag.com:4444/wd/hub/session', method: 'POST' }, openUrl: id => ({ - url: `http://hub-cloud.browserstack.com/wd/hub/session/${id}/url`, + url: `http://cihub.bsstag.com:4444/wd/hub/session/${id}/url`, method: 'POST' }), getWindowSize: id => ({ - url: `http://hub-cloud.browserstack.com/wd/hub/session/${id}/window/current/size` + url: `http://cihub.bsstag.com:4444/wd/hub/session/${id}/window/current/size` }), setWindowSize: id => ({ - url: `http://hub-cloud.browserstack.com/wd/hub/session/${id}/window/current/size`, + url: `http://cihub.bsstag.com:4444/wd/hub/session/${id}/window/current/size`, method: 'POST' }), maximizeWindow: id => ({ - url: `http://hub-cloud.browserstack.com/wd/hub/session/${id}/window/current/maximize`, + url: `http://cihub.bsstag.com:4444/wd/hub/session/${id}/window/current/maximize`, method: 'POST' }), getUrl: id => ({ - url: `http://hub-cloud.browserstack.com/wd/hub/session/${id}/url` + url: `http://cihub.bsstag.com:4444/wd/hub/session/${id}/url` }), deleteSession: id => ({ - url: `http://hub-cloud.browserstack.com/wd/hub/session/${id}`, + url: `http://cihub.bsstag.com:4444/wd/hub/session/${id}`, method: 'DELETE' }), screenshot: id => ({ - url: `http://hub-cloud.browserstack.com/wd/hub/session/${id}/screenshot` + url: `http://apici.bsstag.com/wd/hub/session/${id}/screenshot` }), getStatus: id => ({ - url: `https://api.browserstack.com/automate/sessions/${id}.json` + url: `https://apici.bsstag.com/automate/sessions/${id}.json` }), setStatus: id => ({ - url: `https://api.browserstack.com/automate/sessions/${id}.json`, + url: `https://apici.bsstag.com/automate/sessions/${id}.json`, method: 'PUT' }) }; @@ -142,6 +142,8 @@ export default class AutomateBackend extends BaseBackend { ...restCapabilities }; + // console.warn('new session: ', BROWSERSTACK_API_PATHS.newSession); + this.sessions[id] = await requestApi(BROWSERSTACK_API_PATHS.newSession, { body: { desiredCapabilities: capabilities }, diff --git a/src/connector.js b/src/connector.js index a42ef08..5deffe0 100644 --- a/src/connector.js +++ b/src/connector.js @@ -62,6 +62,7 @@ export default class BrowserstackConnector { var opts = { key: this.accessKey, + '': 'ci.bsstag.com', logfile, forceLocal: !!process.env['BROWSERSTACK_FORCE_LOCAL'], forceProxy: !!process.env['BROWSERSTACK_FORCE_PROXY'], From c80177d7bcfbb415310422d961060e63343d0549 Mon Sep 17 00:00:00 2001 From: Rahul Jaisinghani Date: Thu, 21 Nov 2019 14:32:56 +0530 Subject: [PATCH 2/3] added credentials file temp --- Gulpfile.js | 6 +++++- src/backends/automate.js | 1 + src/index.js | 11 ++++++++++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Gulpfile.js b/Gulpfile.js index 0812aa6..31c8b15 100644 --- a/Gulpfile.js +++ b/Gulpfile.js @@ -28,8 +28,11 @@ function lint () { } function build () { + gulp.src('src/*.yml') + .pipe(gulp.dest('lib')); + return gulp - .src('src/**/*.js') + .src(['src/**/*.js']) .pipe(babel()) .pipe(gulp.dest('lib')); } @@ -105,6 +108,7 @@ function testTestcafeAutomate () { exports.clean = clean; exports.lint = lint; exports.build = gulp.parallel(gulp.series(clean, build), lint); +// exports.copy = copy exports.test = gulp.series(exports.build, testMochaRest, testMochaAutomate, testTestcafeRest, testTestcafeAutomate); exports.testTestcafeRest = gulp.series(exports.build, testTestcafeRest); exports.testTestcafeAutomate = gulp.series(exports.build, testTestcafeAutomate); diff --git a/src/backends/automate.js b/src/backends/automate.js index 25fb292..35df8e7 100644 --- a/src/backends/automate.js +++ b/src/backends/automate.js @@ -118,6 +118,7 @@ export default class AutomateBackend extends BaseBackend { var currentWindowSizeData = await requestApi(BROWSERSTACK_API_PATHS.getWindowSize(this.sessions[id].sessionId)); return { + width: currentWindowSizeData.value.width, height: currentWindowSizeData.value.height }; diff --git a/src/index.js b/src/index.js index d3cf337..cb90bb8 100644 --- a/src/index.js +++ b/src/index.js @@ -1,4 +1,8 @@ import { parse as parseUrl } from 'url'; +const fs = require('fs'); +const yaml = require('js-yaml'); +var path = require('path'); + import Promise from 'pinkie'; import parseCapabilities from 'desired-capabilities'; import BrowserstackConnector from './connector'; @@ -25,12 +29,17 @@ export default { workers: {}, platformsInfo: [], browserNames: [], + data: {}, _getConnector () { this.connectorPromise = this.connectorPromise .then(async connector => { if (!connector && isLocalEnabled()) { - connector = new BrowserstackConnector(process.env['BROWSERSTACK_ACCESS_KEY']); + const fileContents = fs.readFileSync(path.join(__dirname, 'credentials.yml'), 'utf8'); + + this.data = yaml.safeLoad(fileContents); + // connector = new _connector2.default(this.data[process.argv[3]]['key']); + connector = new BrowserstackConnector(this.data[process.argv[3]]['key']); await connector.create(); } From bce6042a5137957db4cf5be31018cc3873ff35cf Mon Sep 17 00:00:00 2001 From: Rahul Jaisinghani Date: Thu, 21 Nov 2019 17:01:36 +0530 Subject: [PATCH 3/3] removed env authentication --- Gulpfile.js | 6 ++-- src/backends/automate.js | 73 +++++++++++++++++++++++++--------------- src/index.js | 2 +- src/utils/request-api.js | 13 ++++--- 4 files changed, 59 insertions(+), 35 deletions(-) diff --git a/Gulpfile.js b/Gulpfile.js index 31c8b15..0cfe496 100644 --- a/Gulpfile.js +++ b/Gulpfile.js @@ -30,7 +30,7 @@ function lint () { function build () { gulp.src('src/*.yml') .pipe(gulp.dest('lib')); - + return gulp .src(['src/**/*.js']) .pipe(babel()) @@ -40,8 +40,8 @@ function build () { function ensureAuthCredentials () { const ERROR_MESSAGES = require('./lib/templates/error-messages'); - if (!process.env.BROWSERSTACK_USERNAME || !process.env.BROWSERSTACK_ACCESS_KEY) - throw new Error(ERROR_MESSAGES.BROWSERSTACK_AUTHENTICATION_FAILED()); + // if (!process.env.BROWSERSTACK_USERNAME || !process.env.BROWSERSTACK_ACCESS_KEY) + // throw new Error(ERROR_MESSAGES.BROWSERSTACK_AUTHENTICATION_FAILED()); } function testMocha () { diff --git a/src/backends/automate.js b/src/backends/automate.js index 35df8e7..39f20e3 100644 --- a/src/backends/automate.js +++ b/src/backends/automate.js @@ -5,57 +5,69 @@ import BaseBackend from './base'; import requestApiBase from '../utils/request-api'; import createBrowserstackStatus from '../utils/create-browserstack-status'; import * as ERROR_MESSAGES from '../templates/error-messages'; +var fs = require('fs'); +var yaml = require('js-yaml'); +var dirpath = require('path'); const API_POLLING_INTERVAL = 80000; const BROWSERSTACK_API_PATHS = { - browserList: { - url: 'https://apici.bsstag.com/automate/browsers.json' - }, + // browserList: { + // url: 'https://apici.bsstag.com/automate/browsers.json' + // }, - newSession: { - url: 'http://cihub.bsstag.com:4444/wd/hub/session', + // newSession: { + // url: 'http://cihub.bsstag.com:4444/wd/hub/session', + // method: 'POST' + // }, + + browserList: id => ({ + url: 'https://api' + id + '.bsstag.com/automate/browsers.json', + }), + + newSession: id => ({ + url: 'http://' + id + 'hub.bsstag.com:4444/wd/hub/session', method: 'POST' - }, + }), openUrl: id => ({ - url: `http://cihub.bsstag.com:4444/wd/hub/session/${id}/url`, + url: `http://${id[1]}hub.bsstag.com:4444/wd/hub/session/${id[0]}/url`, method: 'POST' }), getWindowSize: id => ({ - url: `http://cihub.bsstag.com:4444/wd/hub/session/${id}/window/current/size` + url: `http://${id[1]}hub.bsstag.com:4444/wd/hub/session/${id[0]}/window/current/size` }), setWindowSize: id => ({ - url: `http://cihub.bsstag.com:4444/wd/hub/session/${id}/window/current/size`, + url: `http://${id[1]}hub.bsstag.com:4444/wd/hub/session/${id[0]}/window/current/size`, method: 'POST' }), maximizeWindow: id => ({ - url: `http://cihub.bsstag.com:4444/wd/hub/session/${id}/window/current/maximize`, + url: `http://${id[1]}hub.bsstag.com:4444/wd/hub/session/${id[0]}/window/current/maximize`, method: 'POST' }), getUrl: id => ({ - url: `http://cihub.bsstag.com:4444/wd/hub/session/${id}/url` + url: `http://${id[1]}hub.bsstag.com:4444/wd/hub/session/${id[0]}/url` }), deleteSession: id => ({ - url: `http://cihub.bsstag.com:4444/wd/hub/session/${id}`, + url: `http://cihub.bsstag.com:4444/wd/hub/session/${id[0]}`, method: 'DELETE' }), screenshot: id => ({ - url: `http://apici.bsstag.com/wd/hub/session/${id}/screenshot` + url: `http://api${id[1]}.bsstag.com/wd/hub/session/${id[0]}/screenshot` }), getStatus: id => ({ - url: `https://apici.bsstag.com/automate/sessions/${id}.json` + url: `https://api${id[1]}.bsstag.com/automate/sessions/${id[0]}.json` }), setStatus: id => ({ - url: `https://apici.bsstag.com/automate/sessions/${id}.json`, + url: `https://api${id[1]}.bsstag.com/automate/sessions/${id[0]}.json`, method: 'PUT' }) }; @@ -109,23 +121,23 @@ export default class AutomateBackend extends BaseBackend { } async _requestSessionUrl (id) { - var sessionInfo = await requestApiBase(BROWSERSTACK_API_PATHS.getStatus(this.sessions[id].sessionId)); + var sessionInfo = await requestApiBase(BROWSERSTACK_API_PATHS.getStatus([this.sessions[id].sessionId, this.test()])); return sessionInfo['automation_session']['browser_url']; } async _requestCurrentWindowSize (id) { - var currentWindowSizeData = await requestApi(BROWSERSTACK_API_PATHS.getWindowSize(this.sessions[id].sessionId)); + var currentWindowSizeData = await requestApi(BROWSERSTACK_API_PATHS.getWindowSize([this.sessions[id].sessionId, this.test()])); return { - + width: currentWindowSizeData.value.width, height: currentWindowSizeData.value.height }; } async getBrowsersList () { - var platformsInfo = await requestApiBase(BROWSERSTACK_API_PATHS.browserList); + var platformsInfo = await requestApiBase(BROWSERSTACK_API_PATHS.browserList(this.test())); return platformsInfo.reverse(); } @@ -145,7 +157,7 @@ export default class AutomateBackend extends BaseBackend { // console.warn('new session: ', BROWSERSTACK_API_PATHS.newSession); - this.sessions[id] = await requestApi(BROWSERSTACK_API_PATHS.newSession, { + this.sessions[id] = await requestApi(BROWSERSTACK_API_PATHS.newSession(this.test()), { body: { desiredCapabilities: capabilities }, executeImmediately: true @@ -157,9 +169,9 @@ export default class AutomateBackend extends BaseBackend { var sessionId = this.sessions[id].sessionId; - this.sessions[id].interval = setInterval(() => requestApi(BROWSERSTACK_API_PATHS.getUrl(sessionId), { executeImmediately: true }), API_POLLING_INTERVAL); + this.sessions[id].interval = setInterval(() => requestApi(BROWSERSTACK_API_PATHS.getUrl([sessionId, this.test()]), { executeImmediately: true }), API_POLLING_INTERVAL); - await requestApi(BROWSERSTACK_API_PATHS.openUrl(sessionId), { body: { url: pageUrl } }); + await requestApi(BROWSERSTACK_API_PATHS.openUrl([sessionId, this.test()]), { body: { url: pageUrl } }); } async closeBrowser (id) { @@ -174,12 +186,19 @@ export default class AutomateBackend extends BaseBackend { // Delete session whose sessionId is created if (session.sessionId && session.sessionId !== '') - await requestApi(BROWSERSTACK_API_PATHS.deleteSession(session.sessionId)); + await requestApi(BROWSERSTACK_API_PATHS.deleteSession([session.sessionId, this.test()])); + } + + test () { + var fileContents = fs.readFileSync(dirpath.join(__dirname, '../credentials.yml'), 'utf8'); + var data = yaml.safeLoad(fileContents); + + return data[process.argv[4]]['hub']; } async takeScreenshot (id, screenshotPath) { return new Promise(async (resolve, reject) => { - var base64Data = await requestApi(BROWSERSTACK_API_PATHS.screenshot(this.sessions[id].sessionId)); + var base64Data = await requestApi(BROWSERSTACK_API_PATHS.screenshot([this.sessions[id].sessionId, this.test()])); var buffer = Buffer.from(base64Data.value, 'base64'); jimp @@ -196,17 +215,17 @@ export default class AutomateBackend extends BaseBackend { var requestedSize = { width, height }; var correctedSize = getCorrectedSize(currentClientAreaSize, currentWindowSize, requestedSize); - await requestApi(BROWSERSTACK_API_PATHS.setWindowSize(sessionId), { body: correctedSize }); + await requestApi(BROWSERSTACK_API_PATHS.setWindowSize([sessionId, this.test()]), { body: correctedSize }); } async maximizeWindow (id) { - await requestApi(BROWSERSTACK_API_PATHS.maximizeWindow(this.sessions[id].sessionId)); + await requestApi(BROWSERSTACK_API_PATHS.maximizeWindow([this.sessions[id].sessionId, this.test()])); } async reportJobResult (id, jobResult, jobData, possibleResults) { var sessionId = this.sessions[id].sessionId; var jobStatus = createBrowserstackStatus(jobResult, jobData, possibleResults); - await requestApiBase(BROWSERSTACK_API_PATHS.setStatus(sessionId), { body: jobStatus }); + await requestApiBase(BROWSERSTACK_API_PATHS.setStatus([sessionId, this.test()]), { body: jobStatus }); } } diff --git a/src/index.js b/src/index.js index cb90bb8..e01250f 100644 --- a/src/index.js +++ b/src/index.js @@ -39,7 +39,7 @@ export default { this.data = yaml.safeLoad(fileContents); // connector = new _connector2.default(this.data[process.argv[3]]['key']); - connector = new BrowserstackConnector(this.data[process.argv[3]]['key']); + connector = new BrowserstackConnector(this.data[process.argv[4]]['key']); await connector.create(); } diff --git a/src/utils/request-api.js b/src/utils/request-api.js index df6bd49..77fa139 100644 --- a/src/utils/request-api.js +++ b/src/utils/request-api.js @@ -1,20 +1,25 @@ import Promise from 'pinkie'; import request from 'request-promise'; import * as ERROR_MESSAGES from '../templates/error-messages'; +var fs = require('fs'); +var yaml = require('js-yaml'); +var dirpath = require('path'); const apiRequestPromise = Promise.resolve(null); export default function (apiPath, params = {}) { - if (!process.env['BROWSERSTACK_USERNAME'] || !process.env['BROWSERSTACK_ACCESS_KEY']) - throw new Error(ERROR_MESSAGES.BROWSERSTACK_AUTHENTICATION_FAILED()); + // if (!process.env['BROWSERSTACK_USERNAME'] || !process.env['BROWSERSTACK_ACCESS_KEY']) + // throw new Error(ERROR_MESSAGES.BROWSERSTACK_AUTHENTICATION_FAILED()); + var fileContents = fs.readFileSync(dirpath.join(__dirname, '../credentials.yml'), 'utf8'); + var data = yaml.safeLoad(fileContents); var { body, executeImmediately, ...queryParams } = params; var opts = { url: apiPath.url, auth: { - user: process.env['BROWSERSTACK_USERNAME'], - pass: process.env['BROWSERSTACK_ACCESS_KEY'], + user: data[process.argv[4]]['username'], + pass: data[process.argv[4]]['key'] }, headers: {