Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions nightwatch/globals.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ module.exports = {
done();
} catch (error) {
CrashReporter.uploadCrashReport(error.message, error.stack);
Logger.error(`Something went wrong in processing report file for test observability - ${error.message} with stacktrace ${error.stack}`);
Logger.error(`Something went wrong in processing report file for test reporting and analytics - ${error.message} with stacktrace ${error.stack}`);
}
done(results);
},
Expand Down Expand Up @@ -128,7 +128,7 @@ module.exports = {
await testObservability.sendTestRunEventForCucumber(reportData, gherkinDocument, pickleData, 'TestRunStarted', testMetaData, args);
} catch (error) {
CrashReporter.uploadCrashReport(error.message, error.stack);
Logger.error(`Something went wrong in processing report file for test observability - ${error.message} with stacktrace ${error.stack}`);
Logger.error(`Something went wrong in processing report file for test reporting and analytics - ${error.message} with stacktrace ${error.stack}`);
}
});

Expand All @@ -151,7 +151,7 @@ module.exports = {
}
} catch (error) {
CrashReporter.uploadCrashReport(error.message, error.stack);
Logger.error(`Something went wrong in processing report file for test observability - ${error.message} with stacktrace ${error.stack}`);
Logger.error(`Something went wrong in processing report file for test reporting and analytics - ${error.message} with stacktrace ${error.stack}`);
}
});

Expand Down Expand Up @@ -184,7 +184,7 @@ module.exports = {
}
} catch (error) {
CrashReporter.uploadCrashReport(error.message, error.stack);
Logger.error(`Something went wrong in processing report file for test observability - ${error.message} with stacktrace ${error.stack}`);
Logger.error(`Something went wrong in processing report file for test reporting and analytics - ${error.message} with stacktrace ${error.stack}`);
}
});

Expand Down Expand Up @@ -246,7 +246,7 @@ module.exports = {
}
} catch (error) {
CrashReporter.uploadCrashReport(error.message, error.stack);
Logger.error(`Something went wrong in processing report file for test observability - ${error.message} with stacktrace ${error.stack}`);
Logger.error(`Something went wrong in processing report file for test reporting and analytics - ${error.message} with stacktrace ${error.stack}`);
}
});

Expand Down Expand Up @@ -320,7 +320,7 @@ module.exports = {
}
}
} catch (error) {
Logger.error(`Could not configure or launch test observability - ${error}`);
Logger.error(`Could not configure or launch test reporting and analytics - ${error}`);
}

try {
Expand Down Expand Up @@ -353,10 +353,10 @@ module.exports = {
try {
await testObservability.stopBuildUpstream();
if (process.env.BS_TESTOPS_BUILD_HASHED_ID) {
Logger.info(`\nVisit https://observability.browserstack.com/builds/${process.env.BS_TESTOPS_BUILD_HASHED_ID} to view build report, insights, and many more debugging information all at one place!\n`);
Logger.info(`\nVisit https://automation.browserstack.com/builds/${process.env.BS_TESTOPS_BUILD_HASHED_ID} to view build report, insights, and many more debugging information all at one place!\n`);
}
} catch (error) {
Logger.error(`Something went wrong in stopping build session for test observability - ${error}`);
Logger.error(`Something went wrong in stopping build session for test reporting and analytics - ${error}`);
}
process.exit();
}
Expand Down
72 changes: 58 additions & 14 deletions src/testObservability.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,35 @@ const hooksMap = {};
class TestObservability {
configure(settings = {}) {
this._settings = settings['@nightwatch/browserstack'] || {};
this._parentSettings = settings; // Store full settings to access top-level options

process.env.BROWSERSTACK_TEST_OBSERVABILITY = true;
// Initialize environment variables only if they're not already set
if (!process.env.BROWSERSTACK_TEST_OBSERVABILITY && !process.env.BROWSERSTACK_TEST_REPORTING) {
process.env.BROWSERSTACK_TEST_OBSERVABILITY = 'true';
process.env.BROWSERSTACK_TEST_REPORTING = 'true';
}

if (!helper.isUndefined(this._settings.test_observability) && !helper.isUndefined(this._settings.test_observability.enabled)) {
process.env.BROWSERSTACK_TEST_OBSERVABILITY = this._settings.test_observability.enabled;
// Check for top-level testObservability or testReporting flags
if (settings.testObservability === true || settings.testReporting === true) {
process.env.BROWSERSTACK_TEST_OBSERVABILITY = 'true';
process.env.BROWSERSTACK_TEST_REPORTING = 'true';
} else if (settings.testObservability === false || settings.testReporting === false) {
process.env.BROWSERSTACK_TEST_OBSERVABILITY = 'false';
process.env.BROWSERSTACK_TEST_REPORTING = 'false';
}
if (process.argv.includes('--disable-test-observability')) {
process.env.BROWSERSTACK_TEST_OBSERVABILITY = false;

// Check for test_observability or test_reporting configuration
const observabilityConfig = this._settings.test_observability || this._settings.test_reporting;
const testReportingOptions = this._settings.testReportingOptions || this._settings.testObservabilityOptions;

if (!helper.isUndefined(observabilityConfig) && !helper.isUndefined(observabilityConfig.enabled)) {
process.env.BROWSERSTACK_TEST_OBSERVABILITY = observabilityConfig.enabled;
process.env.BROWSERSTACK_TEST_REPORTING = observabilityConfig.enabled;
}

if (process.argv.includes('--disable-test-observability') || process.argv.includes('--disable-test-reporting')) {
process.env.BROWSERSTACK_TEST_OBSERVABILITY = 'false';
process.env.BROWSERSTACK_TEST_REPORTING = 'false';

return;
}
Expand All @@ -31,25 +52,47 @@ class TestObservability {
this._bstackOptions = settings.desiredCapabilities['bstack:options'];
}

if (this._settings.test_observability || this._bstackOptions) {
this._user = helper.getObservabilityUser(this._settings.test_observability, this._bstackOptions);
this._key = helper.getObservabilityKey(this._settings.test_observability, this._bstackOptions);
if (observabilityConfig || testReportingOptions || this._bstackOptions) {
this._user = helper.getObservabilityUser(observabilityConfig || testReportingOptions, this._bstackOptions);
this._key = helper.getObservabilityKey(observabilityConfig || testReportingOptions, this._bstackOptions);
if (!this._user || !this._key) {
Logger.error('Could not start Test Observability : Missing authentication token');
Logger.error('Could not start Test Reporting and Analytics : Missing authentication token');
process.env.BROWSERSTACK_TEST_OBSERVABILITY = 'false';
process.env.BROWSERSTACK_TEST_REPORTING = 'false';

return;
}
CrashReporter.setCredentialsForCrashReportUpload(this._user, this._key);
CrashReporter.setConfigDetails(settings);
}

// Also check for top-level testReportingOptions or testObservabilityOptions
if (settings.testReportingOptions || settings.testObservabilityOptions) {
const topLevelOptions = settings.testReportingOptions || settings.testObservabilityOptions;
if (!this._user || !this._key) {
this._user = helper.getObservabilityUser(topLevelOptions, this._bstackOptions);
this._key = helper.getObservabilityKey(topLevelOptions, this._bstackOptions);
if (this._user && this._key) {
CrashReporter.setCredentialsForCrashReportUpload(this._user, this._key);
CrashReporter.setConfigDetails(settings);
}
}
}
}

async launchTestSession() {
const options = this._settings.test_observability || {};
// Support both old and new configuration options at different levels
const options = this._settings.test_observability ||
this._settings.test_reporting ||
this._settings.testReportingOptions ||
this._settings.testObservabilityOptions ||
this._parentSettings?.testReportingOptions ||
this._parentSettings?.testObservabilityOptions ||
{};
this._gitMetadata = await helper.getGitMetaData();
const fromProduct = {
test_observability: true
test_observability: true,
test_reporting: true
};
const data = {
format: 'json',
Expand Down Expand Up @@ -105,6 +148,7 @@ class TestObservability {
}
process.env.BS_TESTOPS_BUILD_COMPLETED = false;
process.env.BROWSERSTACK_TEST_OBSERVABILITY = false;
process.env.BROWSERSTACK_TEST_REPORTING = false;
}
}

Expand Down Expand Up @@ -144,9 +188,9 @@ class TestObservability {
}
} catch (error) {
if (error.response) {
Logger.error(`EXCEPTION IN stopBuildUpstream REQUEST TO TEST OBSERVABILITY : ${error.response.status} ${error.response.statusText} ${JSON.stringify(error.response.data)}`);
Logger.error(`EXCEPTION IN stopBuildUpstream REQUEST TO TEST REPORTING AND ANALYTICS : ${error.response.status} ${error.response.statusText} ${JSON.stringify(error.response.data)}`);
} else {
Logger.error(`EXCEPTION IN stopBuildUpstream REQUEST TO TEST OBSERVABILITY : ${error.message || error}`);
Logger.error(`EXCEPTION IN stopBuildUpstream REQUEST TO TEST REPORTING AND ANALYTICS : ${error.message || error}`);
}

return {
Expand Down Expand Up @@ -655,7 +699,7 @@ class TestObservability {
await helper.uploadEventData({event_type: 'LogCreated', logs: [log]});
}
} catch (error) {
Logger.error(`Exception in uploading log data to Observability with error : ${error}`);
Logger.error(`Exception in uploading log data to Test Reporting and Analytics with error : ${error}`);
}
}
}
Expand Down
36 changes: 24 additions & 12 deletions src/utils/helper.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,9 @@ Object.keys(consoleHolder).forEach(method => {
});

exports.debug = (text) => {
if (process.env.BROWSERSTACK_OBSERVABILITY_DEBUG === 'true' || process.env.BROWSERSTACK_OBSERVABILITY_DEBUG === '1') {
consoleHolder.log(`\n[${(new Date()).toISOString()}][ OBSERVABILITY ] ${text}\n`);
if (process.env.BROWSERSTACK_OBSERVABILITY_DEBUG === 'true' || process.env.BROWSERSTACK_OBSERVABILITY_DEBUG === '1' ||
process.env.BROWSERSTACK_TEST_REPORTING_DEBUG === 'true' || process.env.BROWSERSTACK_TEST_REPORTING_DEBUG === '1') {
consoleHolder.log(`\n[${(new Date()).toISOString()}][ TEST REPORTING AND ANALYTICS ] ${text}\n`);
}
};

Expand All @@ -58,7 +59,8 @@ exports.isUndefined = value => (value === undefined || value === null);
exports.isObject = value => (!this.isUndefined(value) && value.constructor === Object);

exports.isTestObservabilitySession = () => {
return process.env.BROWSERSTACK_TEST_OBSERVABILITY === 'true';
return process.env.BROWSERSTACK_TEST_OBSERVABILITY === 'true' ||
process.env.BROWSERSTACK_TEST_REPORTING === 'true';
};

exports.getObservabilityUser = (config, bstackOptions={}) => {
Expand All @@ -74,8 +76,10 @@ exports.isAccessibilitySession = () => {
};

exports.getProjectName = (options, bstackOptions={}, fromProduct={}) => {
if (fromProduct.test_observability && options.test_observability && options.test_observability.projectName) {
return options.test_observability.projectName;
if ((fromProduct.test_observability || fromProduct.test_reporting) &&
((options.test_observability && options.test_observability.projectName) ||
(options.test_reporting && options.test_reporting.projectName))) {
return options.test_observability?.projectName || options.test_reporting?.projectName;
} else if (fromProduct.accessibility && options.accessibility && options.accessibility.projectName) {
return options.accessibility.projectName;
} else if (bstackOptions.projectName) {
Expand All @@ -87,8 +91,10 @@ exports.getProjectName = (options, bstackOptions={}, fromProduct={}) => {
};

exports.getBuildName = (options, bstackOptions={}, fromProduct={}) => {
if (fromProduct.test_observability && options.test_observability && options.test_observability.buildName) {
return options.test_observability.buildName;
if ((fromProduct.test_observability || fromProduct.test_reporting) &&
((options.test_observability && options.test_observability.buildName) ||
(options.test_reporting && options.test_reporting.buildName))) {
return options.test_observability?.buildName || options.test_reporting?.buildName;
} else if (fromProduct.accessibility && options.accessibility && options.accessibility.buildName) {
return options.accessibility.buildName;
} else if (bstackOptions.buildName) {
Expand All @@ -99,11 +105,17 @@ exports.getBuildName = (options, bstackOptions={}, fromProduct={}) => {
};

exports.getObservabilityBuildTags = (options, bstackOptions={}) => {
if (options.test_observability && options.test_observability.buildTag) {
return options.test_observability.buildTag;
if ((options.test_observability && options.test_observability.buildTag) ||
(options.test_reporting && options.test_reporting.buildTag)) {
return options.test_observability?.buildTag || options.test_reporting?.buildTag;
} else if (bstackOptions.buildTag) {
return bstackOptions.buildTag;
}

// Support new environment variable
if (process.env.TEST_REPORTING_BUILD_TAG) {
return process.env.TEST_REPORTING_BUILD_TAG.split(',').map(tag => tag.trim());
}

return [];
};
Expand Down Expand Up @@ -498,7 +510,7 @@ exports.uploadEventData = async (eventData) => {

if (process.env.BS_TESTOPS_BUILD_COMPLETED === 'true') {
if (process.env.BS_TESTOPS_JWT === 'null') {
Logger.info(`EXCEPTION IN ${log_tag} REQUEST TO TEST OBSERVABILITY : missing authentication token`);
Logger.info(`EXCEPTION IN ${log_tag} REQUEST TO TEST REPORTING AND ANALYTICS : missing authentication token`);
requestQueueHandler.pending_test_uploads = Math.max(0, requestQueueHandler.pending_test_uploads-1);

return {
Expand Down Expand Up @@ -544,9 +556,9 @@ exports.uploadEventData = async (eventData) => {
}
} catch (error) {
if (error.response) {
Logger.error(`EXCEPTION IN ${event_api_url !== requestQueueHandler.eventUrl ? log_tag : 'Batch_Queue'} REQUEST TO TEST OBSERVABILITY : ${error.response.status} ${error.response.statusText} ${JSON.stringify(error.response.data)}`);
Logger.error(`EXCEPTION IN ${event_api_url !== requestQueueHandler.eventUrl ? log_tag : 'Batch_Queue'} REQUEST TO TEST REPORTING AND ANALYTICS : ${error.response.status} ${error.response.statusText} ${JSON.stringify(error.response.data)}`);
} else {
Logger.error(`EXCEPTION IN ${event_api_url !== requestQueueHandler.eventUrl ? log_tag : 'Batch_Queue'} REQUEST TO TEST OBSERVABILITY : ${error.message || error}`);
Logger.error(`EXCEPTION IN ${event_api_url !== requestQueueHandler.eventUrl ? log_tag : 'Batch_Queue'} REQUEST TO TEST REPORTING AND ANALYTICS : ${error.message || error}`);
}
requestQueueHandler.pending_test_uploads = Math.max(0, requestQueueHandler.pending_test_uploads - (event_api_url === 'api/v1/event' ? 1 : data.length));

Expand Down
4 changes: 2 additions & 2 deletions src/utils/requestQueueHandler.js
Original file line number Diff line number Diff line change
Expand Up @@ -108,9 +108,9 @@ class RequestQueueHandler {
}
} catch (error) {
if (error.response) {
Logger.error(`EXCEPTION IN ${kind} REQUEST TO TEST OBSERVABILITY : ${error.response.status} ${error.response.statusText} ${JSON.stringify(error.response.data)}`);
Logger.error(`EXCEPTION IN ${kind} REQUEST TO TEST REPORTING AND ANALYTICS : ${error.response.status} ${error.response.statusText} ${JSON.stringify(error.response.data)}`);
} else {
Logger.error(`EXCEPTION IN ${kind} REQUEST TO TEST OBSERVABILITY : ${error.message || error}`);
Logger.error(`EXCEPTION IN ${kind} REQUEST TO TEST REPORTING AND ANALYTICS : ${error.message || error}`);
}
this.pending_test_uploads = Math.max(0, this.pending_test_uploads - data.length);
}
Expand Down
Loading