Skip to content

Commit d032d59

Browse files
committed
Fix crash from property 'browser_version' undefined
When no match is found, the process would just crash. Instead, recognise this as a normal end-user scenario and point them to the list of available workers. In my experience the most common way to encounter this issue is when additional decimal places are required by the API, e.g. "safari" "9" results in a crash, because the available workers are described as "9.1" instead. Given that most browers are described without a decimal place, this is an easy mistake to make. Another way to get this is when there is a misspelled browser name. Before: ``` TypeError: Cannot read property 'browser_version' of undefined at browserstack-runner/bin/cli.js ``` After: ``` Error: No desktop match found for {"browser":"safari","browser_version":"9"} Check https://www.browserstack.com/list-of-browsers-and-platforms/js_testing at populateOsAndOsVersion (browserstack-runner/lib/configParser.js) ``` Fixes #243.
1 parent 76e7e96 commit d032d59

File tree

1 file changed

+16
-10
lines changed

1 file changed

+16
-10
lines changed

lib/configParser.js

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
var Log = require('./logger'),
44
logger = new Log(global.logLevel || 'info');
55

6+
var BROWSER_LIST_URL = 'https://www.browserstack.com/list-of-browsers-and-platforms/js_testing';
7+
68
var ConfigParser = {
79
finalBrowsers: [],
810

@@ -54,10 +56,12 @@ var ConfigParser = {
5456
var mobileFiltered = ConfigParser.bsBrowsers.filter(function(currentValue) {
5557
return currentValue.browser.toLowerCase() === browserObject.browser && parseFloat(currentValue.os_version).toPrecision(4) === parseFloat(browserObject.os_version).toPrecision(4);
5658
});
59+
if (!mobileFiltered.length) {
60+
throw new Error('No mobile match found for ' + JSON.stringify(browserObject) + '\nCheck ' + BROWSER_LIST_URL);
61+
}
5762

5863
browserObject = mobileFiltered[Math.floor(Math.random() * mobileFiltered.length)];
59-
}
60-
else {
64+
} else {
6165

6266
var windowsFiltered = ConfigParser.bsBrowsers.filter(function(currentValue) {
6367
return currentValue.os === 'Windows' && currentValue.browser_version.match(/metro/i) == null && currentValue.browser === browserObject.browser && ((browserObject.browser_version && browserObject.browser_version.indexOf('latest') > -1) || parseFloat(currentValue.browser_version).toPrecision(4) === parseFloat(browserObject.browser_version).toPrecision(4));
@@ -66,8 +70,13 @@ var ConfigParser = {
6670
var osxFiltered = ConfigParser.bsBrowsers.filter(function(currentValue) {
6771
return currentValue.os === 'OS X' && currentValue.browser === browserObject.browser && ((browserObject.browser_version && browserObject.browser_version.indexOf('latest')) > -1 || parseFloat(currentValue.browser_version).toPrecision(4) === parseFloat(browserObject.browser_version).toPrecision(4));
6872
});
73+
// Use Windows VMs if no OS specified
74+
var desktopFiltered = windowsFiltered.length > 0 ? windowsFiltered : osxFiltered;
6975

70-
let filteredObject = windowsFiltered.length > 0 ? windowsFiltered[Math.floor(Math.random() * windowsFiltered.length)] : osxFiltered[Math.floor(Math.random() * osxFiltered.length)];
76+
if (!desktopFiltered.length) {
77+
throw new Error('No desktop match found for ' + JSON.stringify(browserObject) + '\nCheck ' + BROWSER_LIST_URL);
78+
}
79+
var filteredObject = desktopFiltered[Math.floor(Math.random() * desktopFiltered.length)];
7180
if (browserObject.browser_version.indexOf('latest') > -1) {
7281
filteredObject.browser_version = browserObject.browser_version;
7382
}
@@ -82,15 +91,14 @@ var ConfigParser = {
8291
var browserObject = {};
8392
var version = null;
8493
var sliceStart = 1;
85-
if (typeof(entry) === 'string') {
94+
if (typeof entry === 'string') {
8695
var browserData = entry.split('_');
8796
var lindex = browserData.length - 1;
8897
if (browserData[0] === 'mobile' || browserData[0] === 'android' || (browserData[0] === 'opera' && browserData[1] === 'browser')) {
8998
browserObject.browser = browserData[0] + ' ' + browserData[1];
9099
browserObject.mobile = true;
91100
sliceStart = 2;
92-
}
93-
else {
101+
} else {
94102
browserObject.browser = browserData[0];
95103
}
96104
if (browserData[lindex] && browserData[lindex].indexOf('+') === -1) {
@@ -100,15 +108,13 @@ var ConfigParser = {
100108
else {
101109
version = browserData.slice(sliceStart, lindex + 1).join('.');
102110
}
103-
}
104-
else {
111+
} else {
105112
version = browserData.slice(sliceStart, lindex + 1).join('.');
106113
}
107114
if (browserObject.mobile) {
108115
browserObject.os_version = version;
109116
browserObject.browser_version = null;
110-
}
111-
else {
117+
} else {
112118
browserObject.browser_version = version;
113119
}
114120
} else {

0 commit comments

Comments
 (0)