browser-providers.ts 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. type ContextConfigurationInfo = { target: string, required: boolean };
  2. export interface ConfigurationInfo {
  3. unitTest: ContextConfigurationInfo;
  4. e2e: ContextConfigurationInfo;
  5. };
  6. export interface BrowserLauncherInfo {
  7. base: string;
  8. flags?: string[];
  9. version?: string;
  10. platform?: string;
  11. device?: string;
  12. browser?: string;
  13. browser_version?: string;
  14. os?: string;
  15. os_version?: string;
  16. };
  17. export type AliasMap = { [name: string]: string[] };
  18. // Unique place to configure the browsers which are used in the different CI jobs in Sauce Labs (SL)
  19. // and BrowserStack (BS).
  20. // If the target is set to null, then the browser is not run anywhere during CI.
  21. // If a category becomes empty (e.g. BS and required), then the corresponding job must be commented
  22. // out in Travis configuration.
  23. const configuration: { [name: string]: ConfigurationInfo } = {
  24. 'Chrome': { unitTest: {target: 'SL', required: true}, e2e: {target: null, required: true}},
  25. 'Firefox': { unitTest: {target: 'SL', required: true}, e2e: {target: null, required: true}},
  26. 'ChromeBeta': { unitTest: {target: 'SL', required: false}, e2e: {target: null, required: true}},
  27. 'FirefoxBeta': { unitTest: {target: null, required: false}, e2e: {target: null, required: true}},
  28. 'ChromeDev': { unitTest: {target: null, required: true}, e2e: {target: null, required: true}},
  29. 'FirefoxDev': { unitTest: {target: null, required: true}, e2e: {target: null, required: true}},
  30. 'IE9': { unitTest: {target: null, required: false}, e2e: {target: null, required: true}},
  31. 'IE10': { unitTest: {target: null, required: true}, e2e: {target: null, required: true}},
  32. 'IE11': { unitTest: {target: 'SL', required: true}, e2e: {target: null, required: true}},
  33. 'Edge': { unitTest: {target: 'SL', required: true}, e2e: {target: null, required: true}},
  34. 'Android4.1': { unitTest: {target: 'SL', required: false}, e2e: {target: null, required: true}},
  35. 'Android4.2': { unitTest: {target: 'SL', required: false}, e2e: {target: null, required: true}},
  36. 'Android4.3': { unitTest: {target: 'SL', required: false}, e2e: {target: null, required: true}},
  37. 'Android4.4': { unitTest: {target: 'SL', required: false}, e2e: {target: null, required: true}},
  38. 'Android5': { unitTest: {target: 'SL', required: false}, e2e: {target: null, required: true}},
  39. 'Safari7': { unitTest: {target: null, required: false}, e2e: {target: null, required: true}},
  40. 'Safari8': { unitTest: {target: 'BS', required: false}, e2e: {target: null, required: true}},
  41. 'Safari9': { unitTest: {target: 'BS', required: false}, e2e: {target: null, required: true}},
  42. 'iOS7': { unitTest: {target: 'BS', required: false}, e2e: {target: null, required: true}},
  43. 'iOS8': { unitTest: {target: 'BS', required: true}, e2e: {target: null, required: true}},
  44. // TODO(mlaval): iOS9 deactivated as not reliable, reactivate after
  45. // https://github.com/angular/angular/issues/5408
  46. 'iOS9': { unitTest: {target: 'BS', required: false}, e2e: {target: null, required: true}},
  47. 'WindowsPhone': { unitTest: {target: 'BS', required: false}, e2e: {target: null, required: true}}
  48. };
  49. export const customLaunchers: { [name: string]: BrowserLauncherInfo } = {
  50. 'ChromeNoSandbox': {
  51. base: 'Chrome',
  52. flags: ['--no-sandbox']
  53. },
  54. // Chrome set to 1024x768 resolution for *local testing only*.
  55. // On CI, both SauceLabs and Browserstack already default all browser window sizes to 1024x768.
  56. 'Chrome_1024x768': {
  57. base : 'Chrome',
  58. flags: ['--window-size=1024,768']
  59. },
  60. 'SL_CHROME': {
  61. base: 'SauceLabs',
  62. browserName: 'chrome',
  63. version: '46'
  64. },
  65. 'SL_CHROMEBETA': {
  66. base: 'SauceLabs',
  67. browserName: 'chrome',
  68. version: 'beta'
  69. },
  70. 'SL_CHROMEDEV': {
  71. base: 'SauceLabs',
  72. browserName: 'chrome',
  73. version: 'dev'
  74. },
  75. 'SL_FIREFOX': {
  76. base: 'SauceLabs',
  77. browserName: 'firefox',
  78. version: '42'
  79. },
  80. 'SL_FIREFOXBETA': {
  81. base: 'SauceLabs',
  82. browserName: 'firefox',
  83. version: 'beta'
  84. },
  85. 'SL_FIREFOXDEV': {
  86. base: 'SauceLabs',
  87. browserName: 'firefox',
  88. version: 'dev'
  89. },
  90. 'SL_SAFARI7': {
  91. base: 'SauceLabs',
  92. browserName: 'safari',
  93. platform: 'OS X 10.9',
  94. version: '7'
  95. },
  96. 'SL_SAFARI8': {
  97. base: 'SauceLabs',
  98. browserName: 'safari',
  99. platform: 'OS X 10.10',
  100. version: '8'
  101. },
  102. 'SL_SAFARI9': {
  103. base: 'SauceLabs',
  104. browserName: 'safari',
  105. platform: 'OS X 10.11',
  106. version: '9.0'
  107. },
  108. 'SL_IOS7': {
  109. base: 'SauceLabs',
  110. browserName: 'iphone',
  111. platform: 'OS X 10.10',
  112. version: '7.1'
  113. },
  114. 'SL_IOS8': {
  115. base: 'SauceLabs',
  116. browserName: 'iphone',
  117. platform: 'OS X 10.10',
  118. version: '8.4'
  119. },
  120. 'SL_IOS9': {
  121. base: 'SauceLabs',
  122. browserName: 'iphone',
  123. platform: 'OS X 10.10',
  124. version: '9.1'
  125. },
  126. 'SL_IE9': {
  127. base: 'SauceLabs',
  128. browserName: 'internet explorer',
  129. platform: 'Windows 2008',
  130. version: '9'
  131. },
  132. 'SL_IE10': {
  133. base: 'SauceLabs',
  134. browserName: 'internet explorer',
  135. platform: 'Windows 2012',
  136. version: '10'
  137. },
  138. 'SL_IE11': {
  139. base: 'SauceLabs',
  140. browserName: 'internet explorer',
  141. platform: 'Windows 8.1',
  142. version: '11'
  143. },
  144. 'SL_EDGE': {
  145. base: 'SauceLabs',
  146. browserName: 'microsoftedge',
  147. platform: 'Windows 10',
  148. version: '20.10240'
  149. },
  150. 'SL_ANDROID4.1': {
  151. base: 'SauceLabs',
  152. browserName: 'android',
  153. platform: 'Linux',
  154. version: '4.1'
  155. },
  156. 'SL_ANDROID4.2': {
  157. base: 'SauceLabs',
  158. browserName: 'android',
  159. platform: 'Linux',
  160. version: '4.2'
  161. },
  162. 'SL_ANDROID4.3': {
  163. base: 'SauceLabs',
  164. browserName: 'android',
  165. platform: 'Linux',
  166. version: '4.3'
  167. },
  168. 'SL_ANDROID4.4': {
  169. base: 'SauceLabs',
  170. browserName: 'android',
  171. platform: 'Linux',
  172. version: '4.4'
  173. },
  174. 'SL_ANDROID5': {
  175. base: 'SauceLabs',
  176. browserName: 'android',
  177. platform: 'Linux',
  178. version: '5.1'
  179. },
  180. 'BS_CHROME': {
  181. base: 'BrowserStack',
  182. browser: 'chrome',
  183. os: 'OS X',
  184. os_version: 'Yosemite'
  185. },
  186. 'BS_FIREFOX': {
  187. base: 'BrowserStack',
  188. browser: 'firefox',
  189. os: 'Windows',
  190. os_version: '10'
  191. },
  192. 'BS_SAFARI7': {
  193. base: 'BrowserStack',
  194. browser: 'safari',
  195. os: 'OS X',
  196. os_version: 'Mavericks'
  197. },
  198. 'BS_SAFARI8': {
  199. base: 'BrowserStack',
  200. browser: 'safari',
  201. os: 'OS X',
  202. os_version: 'Yosemite'
  203. },
  204. 'BS_SAFARI9': {
  205. base: 'BrowserStack',
  206. browser: 'safari',
  207. os: 'OS X',
  208. os_version: 'El Capitan'
  209. },
  210. 'BS_IOS7': {
  211. base: 'BrowserStack',
  212. device: 'iPhone 5S',
  213. os: 'ios',
  214. os_version: '7.0',
  215. resolution: '1024x768'
  216. },
  217. 'BS_IOS8': {
  218. base: 'BrowserStack',
  219. device: 'iPhone 6',
  220. os: 'ios',
  221. os_version: '8.3',
  222. resolution: '1024x768'
  223. },
  224. 'BS_IOS9': {
  225. base: 'BrowserStack',
  226. device: 'iPhone 6S',
  227. os: 'ios',
  228. os_version: '9.0',
  229. resolution: '1024x768'
  230. },
  231. 'BS_IE9': {
  232. base: 'BrowserStack',
  233. browser: 'ie',
  234. browser_version: '9.0',
  235. os: 'Windows',
  236. os_version: '7'
  237. },
  238. 'BS_IE10': {
  239. base: 'BrowserStack',
  240. browser: 'ie',
  241. browser_version: '10.0',
  242. os: 'Windows',
  243. os_version: '8'
  244. },
  245. 'BS_IE11': {
  246. base: 'BrowserStack',
  247. browser: 'ie',
  248. browser_version: '11.0',
  249. os: 'Windows',
  250. os_version: '10'
  251. },
  252. 'BS_EDGE': {
  253. base: 'BrowserStack',
  254. browser: 'edge',
  255. os: 'Windows',
  256. os_version: '10'
  257. },
  258. 'BS_WINDOWSPHONE' : {
  259. base: 'BrowserStack',
  260. device: 'Nokia Lumia 930',
  261. os: 'winphone',
  262. os_version: '8.1'
  263. },
  264. 'BS_ANDROID5': {
  265. base: 'BrowserStack',
  266. device: 'Google Nexus 5',
  267. os: 'android',
  268. os_version: '5.0'
  269. },
  270. 'BS_ANDROID4.4': {
  271. base: 'BrowserStack',
  272. device: 'HTC One M8',
  273. os: 'android',
  274. os_version: '4.4'
  275. },
  276. 'BS_ANDROID4.3': {
  277. base: 'BrowserStack',
  278. device: 'Samsung Galaxy S4',
  279. os: 'android',
  280. os_version: '4.3'
  281. },
  282. 'BS_ANDROID4.2': {
  283. base: 'BrowserStack',
  284. device: 'Google Nexus 4',
  285. os: 'android',
  286. os_version: '4.2'
  287. },
  288. 'BS_ANDROID4.1': {
  289. base: 'BrowserStack',
  290. device: 'Google Nexus 7',
  291. os: 'android',
  292. os_version: '4.1'
  293. }
  294. };
  295. const sauceAliases: AliasMap = {
  296. 'ALL': Object.keys(customLaunchers).filter(function(item) {
  297. return customLaunchers[item].base == 'SauceLabs';
  298. }),
  299. 'DESKTOP': ['SL_CHROME', 'SL_FIREFOX', 'SL_IE9', 'SL_IE10', 'SL_IE11', 'SL_EDGE', 'SL_SAFARI7',
  300. 'SL_SAFARI8', 'SL_SAFARI9'],
  301. 'MOBILE': ['SL_ANDROID4.1', 'SL_ANDROID4.2', 'SL_ANDROID4.3', 'SL_ANDROID4.4', 'SL_ANDROID5',
  302. 'SL_IOS7', 'SL_IOS8', 'SL_IOS9'],
  303. 'ANDROID': ['SL_ANDROID4.1', 'SL_ANDROID4.2', 'SL_ANDROID4.3', 'SL_ANDROID4.4', 'SL_ANDROID5'],
  304. 'IE': ['SL_IE9', 'SL_IE10', 'SL_IE11'],
  305. 'IOS': ['SL_IOS7', 'SL_IOS8', 'SL_IOS9'],
  306. 'SAFARI': ['SL_SAFARI7', 'SL_SAFARI8', 'SL_SAFARI9'],
  307. 'BETA': ['SL_CHROMEBETA', 'SL_FIREFOXBETA'],
  308. 'DEV': ['SL_CHROMEDEV', 'SL_FIREFOXDEV'],
  309. 'REQUIRED': buildConfiguration('unitTest', 'SL', true),
  310. 'OPTIONAL': buildConfiguration('unitTest', 'SL', false)
  311. };
  312. const browserstackAliases: AliasMap = {
  313. 'ALL': Object.keys(customLaunchers).filter(function(item) {
  314. return customLaunchers[item].base == 'BrowserStack';
  315. }),
  316. 'DESKTOP': ['BS_CHROME', 'BS_FIREFOX', 'BS_IE9', 'BS_IE10', 'BS_IE11', 'BS_EDGE', 'BS_SAFARI7',
  317. 'BS_SAFARI8', 'BS_SAFARI9'],
  318. 'MOBILE': ['BS_ANDROID4.3', 'BS_ANDROID4.4', 'BS_IOS7', 'BS_IOS8', 'BS_IOS9', 'BS_WINDOWSPHONE'],
  319. 'ANDROID': ['BS_ANDROID4.3', 'BS_ANDROID4.4'],
  320. 'IE': ['BS_IE9', 'BS_IE10', 'BS_IE11'],
  321. 'IOS': ['BS_IOS7', 'BS_IOS8', 'BS_IOS9'],
  322. 'SAFARI': ['BS_SAFARI7', 'BS_SAFARI8', 'BS_SAFARI9'],
  323. 'REQUIRED': buildConfiguration('unitTest', 'BS', true),
  324. 'OPTIONAL': buildConfiguration('unitTest', 'BS', false)
  325. };
  326. export const platformMap: { [name: string]: AliasMap } = {
  327. 'saucelabs': sauceAliases,
  328. 'browserstack': browserstackAliases,
  329. };
  330. /** Decode the token for Travis to use. */
  331. function decode(str: string): string {
  332. return (str || '').split('').reverse().join('');
  333. }
  334. /** Setup the access keys */
  335. if (process.env.TRAVIS) {
  336. process.env.SAUCE_ACCESS_KEY = decode(process.env.SAUCE_ACCESS_KEY);
  337. process.env.BROWSER_STACK_ACCESS_KEY = decode(process.env.BROWSER_STACK_ACCESS_KEY);
  338. }
  339. /** Build a list of configuration (custom launcher names). */
  340. function buildConfiguration(type: string, target: string, required: boolean): string[] {
  341. return Object.keys(configuration)
  342. .map(item => [item, configuration[item][type]])
  343. .filter(([item, conf]) => conf.required == required && conf.target == target)
  344. .map(([item, conf]) => `${target}_${item.toUpperCase()}`);
  345. }