bugsnag-maze-runner 8.5.0 → 8.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d11bc8e7ebea9cb0ec05467af0e950a4481d248fd1451528f79750c00a41a2af
4
- data.tar.gz: 860bc9eab1e48fa6a0d7bad855206bd064271e585d92b87387864974d3990932
3
+ metadata.gz: 0b7f9aa07e4e22e0ba3a5e1190fc89ec96027c03f68715ff9fc1b12899f8d253
4
+ data.tar.gz: 4ec7ef8d4c1de53f7affa6e0a627265c451ebb89f0379b036faaf4b4af03923b
5
5
  SHA512:
6
- metadata.gz: 5c212301ee67f41a484dd5421f751d4de06c97c5c83e06b75f34abf335a9863150838c4034f71a36b9bb708f1d4c867117da897c07f80fb4ea4a80fb6311e9d2
7
- data.tar.gz: 6f6cc461ca50319e32087f60de3bbaeec5662566f313f64a8f3899b1277c3af333db9c8a6aae2f870735ceb8ffc3ac6737a37203a8aaabeb23948efe33662a34
6
+ metadata.gz: 6e05c8bd71dab45c398f70f95295bf12338a6459e02dc4b296ba69576654753ea9522f1a6213e0b85ba0a47ba0a3e9375d2a4c747e4b23f3ef057c511d9a03bc
7
+ data.tar.gz: b364461de84878a0c9f0e1fca85782fef3d27c08b1f22f91f7cfc72cc15fc7a3ff98451d88a6300cef5bc3af7be61222e56030f87d5ec29162e5093a143eaadb
data/bin/maze-runner CHANGED
@@ -10,6 +10,7 @@ require_relative '../lib/maze'
10
10
  require_relative '../lib/maze/appium_server'
11
11
  require_relative '../lib/maze/api/appium/file_manager'
12
12
  require_relative '../lib/maze/api/cucumber/scenario'
13
+ require_relative '../lib/maze/api/exit_code'
13
14
  require_relative '../lib/maze/bugsnag_config'
14
15
  require_relative '../lib/maze/client/bb_api_client'
15
16
  require_relative '../lib/maze/client/bb_client_utils'
data/bin/purge-projects CHANGED
@@ -14,7 +14,7 @@ class PurgeProjectEntry
14
14
  p = Optimist::Parser.new do
15
15
  text 'Purge anonymous projects from BitBar'
16
16
  text ''
17
- text 'Requires BITBAR_API_KEY'
17
+ text 'Requires BITBAR_ACCESS_KEY'
18
18
  text ''
19
19
  text 'Usage [OPTIONS]'
20
20
  text ''
@@ -29,10 +29,10 @@ class PurgeProjectEntry
29
29
  p.parse ARGV
30
30
  end
31
31
 
32
- api_key = opts[:api_key] || ENV['BITBAR_API_KEY']
32
+ api_key = opts[:api_key] || ENV['BITBAR_ACCESS_KEY']
33
33
 
34
34
  if api_key.nil?
35
- $logger.warn "API KEY has not been provided or BITBAR_API_KEY has not been set"
35
+ $logger.warn "API KEY has not been provided or BITBAR_ACCESS_KEY has not been set"
36
36
  Optimist::with_standard_exception_handling p do
37
37
  raise Optimist::HelpNeeded
38
38
  end
@@ -91,7 +91,9 @@ InstallPlugin do |config|
91
91
 
92
92
  # Only add the retry plugin if --retry is not used on the command line
93
93
  config.filters << Maze::Plugins::GlobalRetryPlugin.new(config) if config.options[:retry].zero?
94
- config.filters << Maze::Plugins::BugsnagReportingPlugin.new(config)
94
+
95
+ # TODO: Reporting of test failures as errors deactivated pending PLAT-10963
96
+ #config.filters << Maze::Plugins::BugsnagReportingPlugin.new(config)
95
97
  end
96
98
 
97
99
  # Before each scenario
@@ -0,0 +1,16 @@
1
+ module Maze
2
+ module Api
3
+ class ExitCode
4
+ # Cucumber itself can use codes 0 to 2
5
+
6
+ AUTOMATION_GENERIC_ERROR = 10
7
+ AUTOMATION_ELEMENT_NOT_FOUND = 11
8
+ AUTOMATION_TIMEOUT = 12
9
+ AUTOMATION_STALE_ELEMENT = 13
10
+
11
+ APP_UPLOAD_FAILURE = 100
12
+ TUNNEL_FAILURE = 101
13
+ SESSION_CREATION_FAILURE = 102
14
+ end
15
+ end
16
+ end
@@ -1,3 +1,5 @@
1
+ require 'bugsnag'
2
+
1
3
  module Maze
2
4
  # Determines the public IP address and port when running on Buildkite with the Elastic CI Stack for AWS
3
5
  class AwsPublicIp
@@ -52,7 +54,8 @@ module Maze
52
54
  json_string = result[0][0].strip
53
55
  json_result = JSON.parse(json_string)
54
56
  port = json_result['NetworkSettings']['Ports']["#{local_port}/tcp"][0]['HostPort']
55
- rescue StandardError
57
+ rescue StandardError => error
58
+ Bugsnag.notify error
56
59
  $logger.error "Unable to parse public port from: #{json_string}"
57
60
  return 0
58
61
  end
@@ -35,7 +35,6 @@ module Maze
35
35
  Bugsnag.notify($!)
36
36
  end
37
37
  end
38
-
39
38
  end
40
39
  end
41
40
  end
@@ -1,3 +1,4 @@
1
+ require 'bugsnag'
1
2
  require 'json'
2
3
 
3
4
  module Maze
@@ -26,8 +27,9 @@ module Maze
26
27
  # Ensure the device is unlocked
27
28
  begin
28
29
  Maze.driver.unlock
29
- rescue => e
30
- $logger.warn "Failed to unlock device: #{e}"
30
+ rescue => error
31
+ Bugsnag.notify error
32
+ $logger.warn "Failed to unlock device: #{error}"
31
33
  end
32
34
 
33
35
  log_run_intro
@@ -41,11 +43,18 @@ module Maze
41
43
  raise 'Method not implemented by this class'
42
44
  end
43
45
 
46
+ def retry_start_driver?
47
+ raise 'Method not implemented by this class'
48
+ end
49
+
44
50
  def start_driver(config)
45
- retry_failure = config.device_list.nil? || config.device_list.empty?
51
+ retry_failure = retry_start_driver?
46
52
  driver = nil
47
53
  until Maze.driver
48
54
  begin
55
+
56
+
57
+ # Proc to start the driver
49
58
  start_driver_closure = Proc.new do
50
59
  begin
51
60
  config.capabilities = device_capabilities
@@ -62,23 +71,25 @@ module Maze
62
71
  $logger.info "Running on device: #{udid}" unless udid.nil?
63
72
  end
64
73
  result
65
- rescue => start_error
66
- $logger.error "Session creation failed: #{start_error}"
67
- raise start_error unless retry_failure
74
+ rescue => error
75
+ Bugsnag.notify error
76
+ $logger.error "Session creation failed: #{error}"
68
77
  false
69
78
  end
70
79
  end
71
80
 
81
+
82
+ # Invoke the proc, with or without retries
72
83
  if retry_failure
73
84
  wait = Maze::Wait.new(interval: 10, timeout: 60)
74
85
  success = wait.until(&start_driver_closure)
75
-
76
- unless success
77
- $logger.error 'Appium driver failed to start after 6 attempts in 60 seconds'
78
- raise RuntimeError.new('Appium driver failed to start in 60 seconds')
79
- end
80
86
  else
81
- start_driver_closure.call
87
+ success = start_driver_closure.call
88
+ end
89
+
90
+ unless success
91
+ $logger.error 'Failed to create Appium driver, exiting'
92
+ exit(::Maze::Api::ExitCode::SESSION_CREATION_FAILURE)
82
93
  end
83
94
 
84
95
  # Infer OS version if necessary when running locally
@@ -13,6 +13,10 @@ module Maze
13
13
  end
14
14
  end
15
15
 
16
+ def retry_start_driver?
17
+ false
18
+ end
19
+
16
20
  def start_scenario
17
21
  unless Maze.config.legacy_driver?
18
22
  # Write Maze's address to file and push to the device
@@ -15,6 +15,10 @@ module Maze
15
15
  end
16
16
  end
17
17
 
18
+ def retry_start_driver?
19
+ Maze.config.device_list.nil? || Maze.config.device_list.empty?
20
+ end
21
+
18
22
  def start_scenario
19
23
  unless Maze.config.legacy_driver?
20
24
  # Write Maze's address to file and push to the device
@@ -103,8 +103,7 @@ module Maze
103
103
  end
104
104
  end
105
105
  rescue StandardError => e
106
- $logger.error "Error getting projects from BitBar"
107
- $logger.error e
106
+ $logger.error "Error getting projects from BitBar: #{e}"
108
107
  raise
109
108
  end
110
109
  projects
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ require 'bugsnag'
2
3
  require 'open3'
3
4
  require 'fileutils'
4
5
  require 'json'
@@ -49,7 +50,8 @@ module Maze
49
50
  $logger.error "Unexpected response body: #{response}"
50
51
  raise 'App upload failed'
51
52
  end
52
- rescue JSON::ParserError
53
+ rescue JSON::ParserError => error
54
+ Bugsnag.notify error
53
55
  $logger.error "Expected JSON response, received: #{res}"
54
56
  raise
55
57
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'bugsnag'
4
+
3
5
  module Maze
4
6
  module Client
5
7
  # Utils supporting the BrowserStack device farm integration
@@ -42,9 +44,11 @@ module Maze
42
44
  # Successful upload
43
45
  break
44
46
  end
45
- rescue Net::ReadTimeout
47
+ rescue Net::ReadTimeout => error
48
+ Bugsnag.notify error
46
49
  $logger.error "Upload failed due to ReadTimeout"
47
- rescue JSON::ParserError
50
+ rescue JSON::ParserError => error
51
+ Bugsnag.notify error
48
52
  $logger.error "Unexpected JSON response, received: #{body}"
49
53
  end
50
54
 
@@ -1,4 +1,5 @@
1
1
  require 'appium_lib'
2
+ require 'bugsnag'
2
3
  require 'json'
3
4
  require 'open3'
4
5
  require 'securerandom'
@@ -56,6 +57,8 @@ module Maze
56
57
  super
57
58
  $logger.info "Appium driver started in #{(Time.now - time).to_i}s"
58
59
  rescue => error
60
+ Bugsnag.notify(error)
61
+
59
62
  $logger.warn "Appium driver failed to start in #{(Time.now - time).to_i}s"
60
63
  $logger.warn "#{error.class} occurred with message: #{error.message}"
61
64
  raise error
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'bugsnag'
3
4
  require 'selenium-webdriver'
4
5
 
5
6
  module Maze
@@ -122,6 +123,7 @@ module Maze
122
123
  $logger.info "Selenium driver started in #{(Time.now - time).to_i}s"
123
124
  @driver = driver
124
125
  rescue => error
126
+ Bugsnag.notify error
125
127
  $logger.warn "Selenium driver failed to start in #{(Time.now - time).to_i}s"
126
128
  raise error
127
129
  end
data/lib/maze/errors.rb CHANGED
@@ -24,29 +24,29 @@ module Maze
24
24
  ERROR_CODES = {
25
25
  ::Selenium::WebDriver::Error::UnknownError => {
26
26
  retry: true,
27
- error_code: 10
27
+ error_code: Maze::Api::ExitCode::AUTOMATION_GENERIC_ERROR
28
28
  },
29
29
  ::Selenium::WebDriver::Error::WebDriverError => {
30
30
  retry: true,
31
- error_code: 10
31
+ error_code: Maze::Api::ExitCode::AUTOMATION_GENERIC_ERROR
32
32
  },
33
33
  Maze::Error::AppiumElementNotFoundError => {
34
34
  retry: true,
35
- error_code: 11
35
+ error_code: Maze::Api::ExitCode::AUTOMATION_ELEMENT_NOT_FOUND
36
36
  },
37
37
  ::Selenium::WebDriver::Error::NoSuchElementError => {
38
38
  retry: true,
39
- error_code: 12
39
+ error_code: Maze::Api::ExitCode::AUTOMATION_ELEMENT_NOT_FOUND
40
40
  },
41
41
  ::Selenium::WebDriver::Error::TimeoutError => {
42
42
  retry: true,
43
- error_code: 13
43
+ error_code: Maze::Api::ExitCode::AUTOMATION_TIMEOUT
44
44
  },
45
45
  ::Selenium::WebDriver::Error::StaleElementReferenceError => {
46
46
  retry: true,
47
- error_code: 14
47
+ error_code: Maze::Api::ExitCode::AUTOMATION_STALE_ELEMENT
48
48
  },
49
49
  }.freeze
50
50
 
51
51
  end
52
- end
52
+ end
@@ -43,7 +43,10 @@ module Maze
43
43
  end
44
44
 
45
45
  def at_exit
46
- @client&.stop_session
46
+ if @client
47
+ $logger.info 'Stopping the Appium session'
48
+ @client.stop_session
49
+ end
47
50
  end
48
51
 
49
52
  private
data/lib/maze/logger.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'bugsnag'
3
4
  require 'logger'
4
5
  require 'singleton'
5
6
 
@@ -78,8 +79,9 @@ module Maze
78
79
  else
79
80
  log_hash_by_field severity, data
80
81
  end
81
- rescue Encoding::UndefinedConversionError
82
+ rescue Encoding::UndefinedConversionError => error
82
83
  # Just give up, we don't want to risk a further error trying to log garbage
84
+ Bugsnag.notify error
83
85
  $logger.error 'Unable to log hash as JSON'
84
86
  end
85
87
  end
@@ -26,8 +26,15 @@ module Maze
26
26
 
27
27
  Bugsnag.notify(event.result.exception) do |bsg_event|
28
28
  unless @last_test_step.nil?
29
- bsg_event.context = @last_test_step.location
30
- bsg_event.grouping_hash = test_case.name + @last_test_step.location
29
+
30
+ repo = ENV['BUILDKITE_PIPELINE_SLUG']
31
+ bsg_event.context = if repo.nil?
32
+ @last_test_step.location
33
+ else
34
+ "#{repo}/#{@last_test_step.location}"
35
+ end
36
+ bsg_event.grouping_hash = @last_test_step.location
37
+
31
38
  bsg_event.add_metadata(:'scenario', {
32
39
  'failing step': @last_test_step.to_s,
33
40
  'failing step location': @last_test_step.location
data/lib/maze/proxy.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'bugsnag'
3
4
  require 'json'
4
5
  require 'singleton'
5
6
  require 'webrick'
@@ -82,10 +83,11 @@ module Maze
82
83
  config[:ProxyAuthProc] = authenticator.method(:authenticate).to_proc
83
84
  end
84
85
 
85
- # Crwate and start the proxy
86
+ # Create and start the proxy
86
87
  proxy = WEBrick::HTTPProxyServer.new config
87
88
  proxy.start
88
89
  rescue StandardError => e
90
+ Bugsnag.notify e
89
91
  $logger.warn "Failed to start proxy server: #{e.message}"
90
92
  ensure
91
93
  proxy&.shutdown
data/lib/maze/server.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'bugsnag'
3
4
  require 'json'
4
5
  require 'securerandom'
5
6
  require 'webrick'
@@ -227,6 +228,7 @@ module Maze
227
228
  server.mount '/reflect', Servlets::ReflectiveServlet
228
229
  server.start
229
230
  rescue StandardError => e
231
+ Bugsnag.notify e
230
232
  $logger.warn "Failed to start mock server: #{e.message}"
231
233
  ensure
232
234
  server&.shutdown
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'bugsnag'
4
+
3
5
  module Maze
4
6
  module Servlets
5
7
 
@@ -30,6 +32,7 @@ module Maze
30
32
  response.header['Access-Control-Allow-Origin'] = '*'
31
33
  response.status = Server.status_code('POST')
32
34
  rescue JSON::ParserError => e
35
+ Bugsnag.notify e
33
36
  msg = "Unable to parse request as JSON: #{e.message}"
34
37
  $logger.error msg
35
38
  Server.invalid_requests.add({
@@ -39,6 +42,7 @@ module Maze
39
42
  body: request.body
40
43
  })
41
44
  rescue StandardError => e
45
+ Bugsnag.notify e
42
46
  $logger.error "Invalid request: #{e.message}"
43
47
  Server.invalid_requests.add({
44
48
  invalid: true,
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ require 'bugsnag'
2
3
  require 'rack'
3
4
 
4
5
  module Maze
@@ -41,10 +42,12 @@ module Maze
41
42
 
42
43
  reflect response, delay_ms, status
43
44
  rescue JSON::ParserError => e
45
+ Bugsnag.notify e
44
46
  msg = "Unable to parse request as JSON: #{e.message}"
45
47
  $logger.error msg
46
48
  response.status = 418
47
49
  rescue StandardError => e
50
+ Bugsnag.notify e
48
51
  $logger.error "Invalid request: #{e.message}"
49
52
  response.status = 500
50
53
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'bugsnag'
3
4
  require 'zlib'
4
5
  require 'stringio'
5
6
  require 'json_schemer'
@@ -101,6 +102,7 @@ module Maze
101
102
  set_response_header response.header
102
103
  response.status = post_status_code
103
104
  rescue JSON::ParserError => e
105
+ Bugsnag.notify e
104
106
  msg = "Unable to parse request as JSON: #{e.message}"
105
107
  if Maze.config.captured_invalid_requests.include? @request_type
106
108
  $logger.error msg
@@ -113,6 +115,7 @@ module Maze
113
115
  $logger.warn msg
114
116
  end
115
117
  rescue StandardError => e
118
+ Bugsnag.notify e
116
119
  if Maze.config.captured_invalid_requests.include? @request_type
117
120
  $logger.error "Invalid request: #{e.message}"
118
121
  Server.invalid_requests.add({
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'bugsnag'
3
4
  require 'socket'
4
5
 
5
6
  module Maze
@@ -33,6 +34,7 @@ module Maze
33
34
  end_connection(socket)
34
35
  }
35
36
  rescue StandardError => e
37
+ Bugsnag.notify e
36
38
  $logger.warn "Terminating server error: #{e.message}"
37
39
  end
38
40
 
data/lib/maze.rb CHANGED
@@ -7,7 +7,7 @@ require_relative 'maze/timers'
7
7
  # Glues the various parts of MazeRunner together that need to be accessed globally,
8
8
  # providing an alternative to the proliferation of global variables or singletons.
9
9
  module Maze
10
- VERSION = '8.5.0'
10
+ VERSION = '8.7.0'
11
11
 
12
12
  class << self
13
13
  attr_accessor :check, :driver, :internal_hooks, :mode, :start_time, :dynamic_retry, :public_address,
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bugsnag-maze-runner
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.5.0
4
+ version: 8.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve Kirkland
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-05 00:00:00.000000000 Z
11
+ date: 2023-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cucumber
@@ -369,6 +369,7 @@ files:
369
369
  - lib/maze.rb
370
370
  - lib/maze/api/appium/file_manager.rb
371
371
  - lib/maze/api/cucumber/scenario.rb
372
+ - lib/maze/api/exit_code.rb
372
373
  - lib/maze/appium_server.rb
373
374
  - lib/maze/assertions/request_set_assertions.rb
374
375
  - lib/maze/aws/sam.rb
@@ -447,11 +448,11 @@ files:
447
448
  - lib/maze/wait.rb
448
449
  - lib/utils/deep_merge.rb
449
450
  - lib/utils/selenium_money_patch.rb
450
- homepage:
451
+ homepage:
451
452
  licenses:
452
453
  - MIT
453
454
  metadata: {}
454
- post_install_message:
455
+ post_install_message:
455
456
  rdoc_options: []
456
457
  require_paths:
457
458
  - lib
@@ -467,7 +468,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
467
468
  version: '0'
468
469
  requirements: []
469
470
  rubygems_version: 3.1.6
470
- signing_key:
471
+ signing_key:
471
472
  specification_version: 4
472
473
  summary: Bugsnag API request validation harness
473
474
  test_files: []