browser_collection.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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, failOnEmptyTestSuite, failOnFailingTestSuite) {
  33. if (results.disconnected || singleRunBrowserNotCaptured) {
  34. return 1
  35. } else if (results.success + results.failed === 0 && !failOnEmptyTestSuite) {
  36. return 0
  37. } else if (results.error) {
  38. return 1
  39. } else if (failOnFailingTestSuite === false) {
  40. return 0 // Tests executed without infrastructure error, exit with 0 independent of test status.
  41. } else {
  42. return results.failed ? 1 : 0
  43. }
  44. }
  45. getResults (singleRunBrowserNotCaptured, failOnEmptyTestSuite, failOnFailingTestSuite) {
  46. const results = { success: 0, failed: 0, error: false, disconnected: false, exitCode: 0 }
  47. this.browsers.forEach((browser) => {
  48. results.success += browser.lastResult.success
  49. results.failed += browser.lastResult.failed
  50. results.error = results.error || browser.lastResult.error
  51. results.disconnected = results.disconnected || browser.lastResult.disconnected
  52. })
  53. results.exitCode = this.calculateExitCode(results, singleRunBrowserNotCaptured, failOnEmptyTestSuite, failOnFailingTestSuite)
  54. return results
  55. }
  56. clearResults () {
  57. this.browsers.forEach((browser) => {
  58. browser.lastResult = new BrowserResult()
  59. })
  60. }
  61. clone () {
  62. return new BrowserCollection(this.emitter, this.browsers.slice())
  63. }
  64. // Array APIs
  65. map (callback, context) {
  66. return this.browsers.map(callback, context)
  67. }
  68. forEach (callback, context) {
  69. return this.browsers.forEach(callback, context)
  70. }
  71. get length () {
  72. return this.browsers.length
  73. }
  74. }
  75. BrowserCollection.factory = function (emitter) {
  76. return new BrowserCollection(emitter)
  77. }
  78. module.exports = BrowserCollection