browser_collection.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. 'use strict'
  2. const BrowserResult = require('./browser_result')
  3. const helper = require('./helper')
  4. class BrowserCollection {
  5. constructor (emitter, browsers = []) {
  6. this.browsers = browsers
  7. this.emitter = emitter
  8. }
  9. add (browser) {
  10. this.browsers.push(browser)
  11. this.emitter.emit('browsers_change', this)
  12. }
  13. remove (browser) {
  14. if (helper.arrayRemove(this.browsers, browser)) {
  15. this.emitter.emit('browsers_change', this)
  16. return true
  17. }
  18. return false
  19. }
  20. getById (browserId) {
  21. return this.browsers.find((browser) => browser.id === browserId) || null
  22. }
  23. getNonReady () {
  24. return this.browsers.filter((browser) => !browser.isConnected())
  25. }
  26. areAllReady () {
  27. return this.browsers.every((browser) => browser.isConnected())
  28. }
  29. serialize () {
  30. return this.browsers.map((browser) => browser.serialize())
  31. }
  32. calculateExitCode (results, singleRunBrowserNotCaptured, config) {
  33. config = config || {}
  34. if (results.disconnected || singleRunBrowserNotCaptured) {
  35. return 1
  36. }
  37. if (results.skipped && config.failOnSkippedTests) {
  38. return 1
  39. }
  40. if (results.success + results.failed === 0 && !!config.failOnEmptyTestSuite) {
  41. return 1
  42. }
  43. if (results.error) {
  44. return 1
  45. }
  46. if (config.failOnFailingTestSuite === false) {
  47. return 0 // Tests executed without infrastructure error, exit with 0 independent of test status.
  48. }
  49. return results.failed ? 1 : 0
  50. }
  51. getResults (singleRunBrowserNotCaptured, config) {
  52. const results = { success: 0, failed: 0, skipped: 0, error: false, disconnected: false, exitCode: 0 }
  53. this.browsers.forEach((browser) => {
  54. results.success += browser.lastResult.success
  55. results.failed += browser.lastResult.failed
  56. results.skipped += browser.lastResult.skipped
  57. results.error = results.error || browser.lastResult.error
  58. results.disconnected = results.disconnected || browser.lastResult.disconnected
  59. })
  60. results.exitCode = this.calculateExitCode(results, singleRunBrowserNotCaptured, config)
  61. return results
  62. }
  63. clearResults () {
  64. this.browsers.forEach((browser) => {
  65. browser.lastResult = new BrowserResult()
  66. })
  67. }
  68. clone () {
  69. return new BrowserCollection(this.emitter, this.browsers.slice())
  70. }
  71. // Array APIs
  72. map (callback, context) {
  73. return this.browsers.map(callback, context)
  74. }
  75. forEach (callback, context) {
  76. return this.browsers.forEach(callback, context)
  77. }
  78. get length () {
  79. return this.browsers.length
  80. }
  81. }
  82. BrowserCollection.factory = function (emitter) {
  83. return new BrowserCollection(emitter)
  84. }
  85. module.exports = BrowserCollection