bugsnag-maze-runner 6.27.0 → 7.22.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/bin/download-logs +14 -16
  3. data/bin/maze-runner +53 -15
  4. data/bin/upload-app +6 -6
  5. data/lib/features/steps/breadcrumb_steps.rb +44 -14
  6. data/lib/features/steps/error_reporting_steps.rb +16 -0
  7. data/lib/features/steps/network_steps.rb +66 -6
  8. data/lib/features/steps/payload_steps.rb +23 -0
  9. data/lib/features/steps/request_assertion_steps.rb +87 -8
  10. data/lib/features/steps/runner_steps.rb +22 -0
  11. data/lib/features/steps/session_tracking_steps.rb +1 -1
  12. data/lib/features/steps/trace_steps.rb +206 -0
  13. data/lib/features/support/internal_hooks.rb +31 -84
  14. data/lib/maze/api/appium/file_manager.rb +29 -0
  15. data/lib/maze/aws_public_ip.rb +53 -0
  16. data/lib/maze/checks/assert_check.rb +9 -31
  17. data/lib/maze/client/appium/base_client.rb +131 -0
  18. data/lib/maze/client/appium/bb_client.rb +102 -0
  19. data/lib/maze/client/appium/bb_devices.rb +127 -0
  20. data/lib/maze/client/appium/bs_client.rb +91 -0
  21. data/lib/maze/client/appium/bs_devices.rb +141 -0
  22. data/lib/maze/client/appium/bs_legacy_client.rb +31 -0
  23. data/lib/maze/client/appium/local_client.rb +67 -0
  24. data/lib/maze/client/appium.rb +23 -0
  25. data/lib/maze/client/bb_api_client.rb +102 -0
  26. data/lib/maze/client/bb_client_utils.rb +181 -0
  27. data/lib/maze/client/bs_client_utils.rb +168 -0
  28. data/lib/maze/client/selenium/base_client.rb +15 -0
  29. data/lib/maze/client/selenium/bb_browsers.yml +188 -0
  30. data/lib/maze/client/selenium/bb_client.rb +38 -0
  31. data/lib/maze/client/selenium/bs_browsers.yml +257 -0
  32. data/lib/maze/client/selenium/bs_client.rb +89 -0
  33. data/lib/maze/client/selenium/local_client.rb +16 -0
  34. data/lib/maze/client/selenium.rb +16 -0
  35. data/lib/maze/configuration.rb +18 -10
  36. data/lib/maze/docker.rb +40 -1
  37. data/lib/maze/driver/appium.rb +5 -24
  38. data/lib/maze/driver/browser.rb +12 -26
  39. data/lib/maze/errors.rb +32 -0
  40. data/lib/maze/generator.rb +55 -0
  41. data/lib/maze/helper.rb +7 -3
  42. data/lib/maze/hooks/appium_hooks.rb +29 -190
  43. data/lib/maze/hooks/browser_hooks.rb +2 -55
  44. data/lib/maze/hooks/error_code_hook.rb +49 -0
  45. data/lib/maze/hooks/hooks.rb +2 -2
  46. data/lib/maze/http_request.rb +21 -0
  47. data/lib/maze/logger.rb +16 -3
  48. data/lib/maze/maze_output.rb +88 -0
  49. data/lib/maze/option/parser.rb +17 -22
  50. data/lib/maze/option/processor.rb +21 -34
  51. data/lib/maze/option/validator.rb +38 -67
  52. data/lib/maze/option.rb +16 -18
  53. data/lib/maze/plugins/cucumber_report_plugin.rb +1 -1
  54. data/lib/maze/plugins/error_code_plugin.rb +21 -0
  55. data/lib/maze/request_list.rb +10 -5
  56. data/lib/maze/request_repeater.rb +49 -0
  57. data/lib/maze/retry_handler.rb +4 -13
  58. data/lib/maze/schemas/OtelTraceSchema.json +390 -0
  59. data/lib/maze/schemas/trace_schema.rb +7 -0
  60. data/lib/maze/schemas/trace_validator.rb +98 -0
  61. data/lib/maze/server.rb +74 -30
  62. data/lib/maze/servlets/base_servlet.rb +10 -5
  63. data/lib/maze/servlets/command_servlet.rb +10 -7
  64. data/lib/maze/servlets/log_servlet.rb +2 -2
  65. data/lib/maze/servlets/reflective_servlet.rb +12 -11
  66. data/lib/maze/servlets/servlet.rb +47 -8
  67. data/lib/maze/servlets/temp.rb +0 -0
  68. data/lib/maze/servlets/trace_servlet.rb +13 -0
  69. data/lib/maze.rb +2 -2
  70. data/lib/utils/deep_merge.rb +17 -0
  71. data/lib/utils/selenium_money_patch.rb +17 -0
  72. metadata +101 -21
  73. data/lib/maze/bitbar_devices.rb +0 -84
  74. data/lib/maze/bitbar_utils.rb +0 -112
  75. data/lib/maze/browser_stack_devices.rb +0 -160
  76. data/lib/maze/browser_stack_utils.rb +0 -164
  77. data/lib/maze/browsers_bs.yml +0 -220
  78. data/lib/maze/browsers_cbt.yml +0 -100
  79. data/lib/maze/capabilities.rb +0 -126
  80. data/lib/maze/driver/resilient_appium.rb +0 -51
  81. data/lib/maze/sauce_labs_utils.rb +0 -96
  82. data/lib/maze/smart_bear_utils.rb +0 -71
@@ -11,11 +11,16 @@ module Maze
11
11
  # @param response [HTTPResponse] The response to return
12
12
  def do_OPTIONS(request, response)
13
13
  response.header['Access-Control-Allow-Origin'] = '*'
14
- response.header['Access-Control-Allow-Headers'] = %w[Accept
15
- Bugsnag-Api-Key Bugsnag-Integrity
16
- Bugsnag-Payload-Version
17
- Bugsnag-Sent-At Content-Type
18
- Origin].join(',')
14
+ response.header['Access-Control-Allow-Headers'] = %w[
15
+ Accept
16
+ Bugsnag-Api-Key
17
+ Bugsnag-Integrity
18
+ Bugsnag-Payload-Version
19
+ Bugsnag-Sent-At
20
+ Bugsnag-Span-Sampling
21
+ Content-Type
22
+ Origin
23
+ ].join(',')
19
24
  end
20
25
  end
21
26
  end
@@ -16,14 +16,15 @@ module Maze
16
16
  response.header['Access-Control-Allow-Origin'] = '*'
17
17
 
18
18
  commands = Maze::Server.commands
19
- # Note that empty? is not the same as size == 0 (design bug to be corrected in v7)
20
- if commands.size == 0
21
- response.body = 'No commands to provide'
22
- response.status = 400
19
+
20
+ if commands.size_remaining == 0
21
+ response.body = '{"action": "noop", "message": "No commands queued"}'
22
+ response.status = 200
23
23
  else
24
24
  command = commands.current
25
- command[:uuid] = Maze::Server.command_uuid
26
- response.body = JSON.pretty_generate(command)
25
+ command_json = JSON.pretty_generate(command)
26
+ command[:uuid] = Maze.run_uuid
27
+ response.body = command_json
27
28
  response.status = 200
28
29
  commands.next
29
30
  end
@@ -37,8 +38,10 @@ module Maze
37
38
  super
38
39
 
39
40
  response.header['Access-Control-Allow-Methods'] = 'POST, OPTIONS'
40
- response.status = Server.status_code
41
+ response.status = Server.status_code('OPTIONS')
41
42
  end
42
43
  end
43
44
  end
44
45
  end
46
+
47
+
@@ -27,7 +27,7 @@ module Maze
27
27
  @requests.add(hash)
28
28
 
29
29
  response.header['Access-Control-Allow-Origin'] = '*'
30
- response.status = Server.status_code
30
+ response.status = Server.status_code('POST')
31
31
  rescue JSON::ParserError => e
32
32
  msg = "Unable to parse request as JSON: #{e.message}"
33
33
  $logger.error msg
@@ -57,7 +57,7 @@ module Maze
57
57
  super
58
58
 
59
59
  response.header['Access-Control-Allow-Methods'] = 'POST, OPTIONS'
60
- response.status = Server.status_code
60
+ response.status = Server.status_code('OPTIONS')
61
61
  end
62
62
  end
63
63
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ require 'rack'
2
3
 
3
4
  module Maze
4
5
  module Servlets
@@ -7,7 +8,7 @@ module Maze
7
8
  # - status - HTTP response code
8
9
  # For GET requests these are expected to passed as GET parameters,
9
10
  # for POST requests they are expected to be given as JSON fields.
10
- class ReflectiveServlet < WEBrick::HTTPServlet::AbstractServlet
11
+ class ReflectiveServlet < BaseServlet
11
12
 
12
13
  # Accepts a GET request to provide a reflective response to.
13
14
  #
@@ -26,17 +27,17 @@ module Maze
26
27
  def do_POST(request, response)
27
28
 
28
29
  content_type = request['Content-Type']
29
- unless content_type == 'application/json'
30
- msg = "Content-Type '#{content_type}' not supported - only application/json is supported at present"
31
- $logger.error msg
32
- response.status = 415
33
- response.body = msg
34
- return
35
- end
36
30
 
37
- body = JSON.parse(request.body)
38
- delay_ms = body['delay_ms']
39
- status = body['status']
31
+ # For JSON, pull the instructions from the body. Otherwise, take them from the query string.
32
+ if content_type == 'application/json'
33
+ body = JSON.parse(request.body)
34
+ delay_ms = body['delay_ms']
35
+ status = body['status']
36
+ else
37
+ query = Rack::Utils.parse_nested_query(request.query_string)
38
+ delay_ms = query['delay_ms']
39
+ status = query['status']
40
+ end
40
41
 
41
42
  reflect response, delay_ms, status
42
43
  rescue JSON::ParserError => e
@@ -1,18 +1,45 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'zlib'
4
+ require 'stringio'
5
+ require 'json_schemer'
6
+ require 'delegate'
7
+
3
8
  module Maze
9
+ class HttpRequest < SimpleDelegator
10
+ def body
11
+ @body ||= decode_body
12
+ end
13
+
14
+ private
15
+
16
+ def decode_body
17
+ delegate = __getobj__
18
+ if %r{^gzip$}.match(delegate['Content-Encoding'])
19
+ gz_element = Zlib::GzipReader.new(StringIO.new(delegate.body))
20
+ gz_element.read
21
+ else
22
+ delegate.body
23
+ end
24
+ end
25
+ end
26
+
4
27
  module Servlets
5
28
 
6
29
  # Receives and parses the requests and payloads sent from the test fixture
7
30
  class Servlet < BaseServlet
31
+ prepend RequestRepeater
32
+
8
33
  # Constructor
9
34
  #
10
35
  # @param server [HTTPServer] WEBrick HTTPServer
11
36
  # @param request_type [Symbol] Request type that the servlet will receive
12
- def initialize(server, request_type)
37
+ # @param schema [Dictionary] A `json-schema` describing the payload for POST requests
38
+ def initialize(server, request_type, schema=nil)
13
39
  super server
14
40
  @request_type = request_type
15
41
  @requests = Server.list_for request_type
42
+ @schema = JSONSchemer.schema(schema) unless schema.nil?
16
43
  end
17
44
 
18
45
  # Logs an incoming GET WEBrick request.
@@ -30,9 +57,11 @@ module Maze
30
57
  # @param request [HTTPRequest] The incoming GET request
31
58
  # @param response [HTTPResponse] The response to return
32
59
  def do_POST(request, response)
33
- log_request(request)
34
- case request['Content-Type']
35
- when %r{^multipart/form-data; boundary=([^;]+)}
60
+ # Turn the WEBrick HttpRequest into our internal HttpRequest delegate
61
+ request = HttpRequest.new(request)
62
+
63
+ content_type = request['Content-Type']
64
+ if %r{^multipart/form-data; boundary=([^;]+)}.match(content_type)
36
65
  boundary = WEBrick::HTTPUtils::dequote($1)
37
66
  body = WEBrick::HTTPUtils.parse_form_data(request.body, boundary)
38
67
  hash = {
@@ -50,6 +79,10 @@ module Maze
50
79
  digests: digests
51
80
  }
52
81
  end
82
+ if @schema
83
+ schema_errors = @schema.validate(hash[:body])
84
+ hash[:schema_errors] = schema_errors.to_a
85
+ end
53
86
  @requests.add(hash)
54
87
 
55
88
  # For the response, delaying if configured to do so
@@ -58,8 +91,8 @@ module Maze
58
91
  $logger.info "Waiting #{response_delay_ms} milliseconds before responding"
59
92
  sleep response_delay_ms / 1000.0
60
93
  end
61
- response.header['Access-Control-Allow-Origin'] = '*'
62
- response.status = Server.status_code
94
+ set_response_header response.header
95
+ response.status = Server.status_code('POST')
63
96
  rescue JSON::ParserError => e
64
97
  msg = "Unable to parse request as JSON: #{e.message}"
65
98
  if Maze.config.captured_invalid_requests.include? @request_type
@@ -89,6 +122,10 @@ module Maze
89
122
  end
90
123
  end
91
124
 
125
+ def set_response_header(header)
126
+ header['Access-Control-Allow-Origin'] = '*'
127
+ end
128
+
92
129
  # Logs and returns a set of valid headers for this servlet.
93
130
  #
94
131
  # @param request [HTTPRequest] The incoming GET request
@@ -97,7 +134,7 @@ module Maze
97
134
  super
98
135
 
99
136
  response.header['Access-Control-Allow-Methods'] = 'POST, OPTIONS'
100
- response.status = Server.status_code
137
+ response.status = Server.status_code('OPTIONS')
101
138
  end
102
139
 
103
140
  private
@@ -116,8 +153,10 @@ module Maze
116
153
  body = WEBrick::HTTPUtils.parse_form_data(request.body, boundary)
117
154
  $logger.debug 'BODY:'
118
155
  LogUtil.log_hash(Logger::Severity::DEBUG, body)
119
- else
156
+ when %r{^application/json$}
120
157
  $logger.debug "BODY: #{JSON.pretty_generate(JSON.parse(request.body))}"
158
+ else
159
+ $logger.debug "BODY: #{request.body}"
121
160
  end
122
161
  end
123
162
 
File without changes
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Maze
4
+ module Servlets
5
+ class TraceServlet < Servlet
6
+ def set_response_header(header)
7
+ super
8
+ value = Maze::Server.sampling_probability
9
+ header['Bugsnag-Sampling-Probability'] = value unless value == 'null'
10
+ end
11
+ end
12
+ end
13
+ end
data/lib/maze.rb CHANGED
@@ -7,10 +7,10 @@ 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 = '6.27.0'
10
+ VERSION = '7.22.1'
11
11
 
12
12
  class << self
13
- attr_accessor :check, :driver, :internal_hooks, :mode, :start_time, :dynamic_retry
13
+ attr_accessor :check, :driver, :internal_hooks, :mode, :start_time, :dynamic_retry, :public_address, :run_uuid
14
14
 
15
15
  def config
16
16
  @config ||= Maze::Configuration.new
@@ -0,0 +1,17 @@
1
+ class Hash
2
+ def deep_merge!(other_hash, &block)
3
+ merge!(other_hash) do |key, this_val, other_val|
4
+ if this_val.is_a?(Hash) && other_val.is_a?(Hash)
5
+ this_val.deep_merge(other_val, &block)
6
+ elsif block_given?
7
+ block.call(key, this_val, other_val)
8
+ else
9
+ other_val
10
+ end
11
+ end
12
+ end
13
+
14
+ def deep_merge(other_hash, &block)
15
+ dup.deep_merge!(other_hash, &block)
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # Log the full response so we see more than just the error code
2
+ module Selenium
3
+ module WebDriver
4
+ module Error
5
+ class ServerError < StandardError
6
+ def initialize(response)
7
+ if response.is_a? String
8
+ super(response)
9
+ else
10
+ $logger.error "Server response: #{response.inspect}"
11
+ super("status code #{response.code}")
12
+ end
13
+ end
14
+ end # ServerError
15
+ end # Error
16
+ end # WebDriver
17
+ end # Selenium
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: 6.27.0
4
+ version: 7.22.1
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-03-16 00:00:00.000000000 Z
11
+ date: 2023-03-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cucumber
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 3.5.2
55
+ - !ruby/object:Gem::Dependency
56
+ name: rack
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.2'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.2'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: webrick
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -72,14 +86,42 @@ dependencies:
72
86
  requirements:
73
87
  - - "~>"
74
88
  - !ruby/object:Gem::Version
75
- version: 11.2.0
89
+ version: 12.0.0
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 12.0.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: appium_lib_core
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 5.4.0
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 5.4.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: selenium-webdriver
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '4.0'
76
118
  type: :runtime
77
119
  prerelease: false
78
120
  version_requirements: !ruby/object:Gem::Requirement
79
121
  requirements:
80
122
  - - "~>"
81
123
  - !ruby/object:Gem::Version
82
- version: 11.2.0
124
+ version: '4.0'
83
125
  - !ruby/object:Gem::Dependency
84
126
  name: bugsnag
85
127
  requirement: !ruby/object:Gem::Requirement
@@ -151,19 +193,19 @@ dependencies:
151
193
  - !ruby/object:Gem::Version
152
194
  version: 12.3.3
153
195
  - !ruby/object:Gem::Dependency
154
- name: selenium-webdriver
196
+ name: json_schemer
155
197
  requirement: !ruby/object:Gem::Requirement
156
198
  requirements:
157
199
  - - "~>"
158
200
  - !ruby/object:Gem::Version
159
- version: '3.11'
201
+ version: 0.2.24
160
202
  type: :runtime
161
203
  prerelease: false
162
204
  version_requirements: !ruby/object:Gem::Requirement
163
205
  requirements:
164
206
  - - "~>"
165
207
  - !ruby/object:Gem::Version
166
- version: '3.11'
208
+ version: 0.2.24
167
209
  - !ruby/object:Gem::Dependency
168
210
  name: rubyzip
169
211
  requirement: !ruby/object:Gem::Requirement
@@ -248,6 +290,20 @@ dependencies:
248
290
  - - "~>"
249
291
  - !ruby/object:Gem::Version
250
292
  version: 0.9.1
293
+ - !ruby/object:Gem::Dependency
294
+ name: timecop
295
+ requirement: !ruby/object:Gem::Requirement
296
+ requirements:
297
+ - - "~>"
298
+ - !ruby/object:Gem::Version
299
+ version: 0.9.6
300
+ type: :development
301
+ prerelease: false
302
+ version_requirements: !ruby/object:Gem::Requirement
303
+ requirements:
304
+ - - "~>"
305
+ - !ruby/object:Gem::Version
306
+ version: 0.9.6
251
307
  description: Automation steps and mock server to validaterequest payloads response.
252
308
  email:
253
309
  - steve@bugsnag.com
@@ -288,39 +344,56 @@ files:
288
344
  - lib/features/steps/request_assertion_steps.rb
289
345
  - lib/features/steps/runner_steps.rb
290
346
  - lib/features/steps/session_tracking_steps.rb
347
+ - lib/features/steps/trace_steps.rb
291
348
  - lib/features/steps/value_steps.rb
292
349
  - lib/features/support/env.rb
293
350
  - lib/features/support/internal_hooks.rb
294
351
  - lib/maze.rb
352
+ - lib/maze/api/appium/file_manager.rb
295
353
  - lib/maze/appium_server.rb
296
354
  - lib/maze/assertions/request_set_assertions.rb
297
355
  - lib/maze/aws/sam.rb
298
- - lib/maze/bitbar_devices.rb
299
- - lib/maze/bitbar_utils.rb
300
- - lib/maze/browser_stack_devices.rb
301
- - lib/maze/browser_stack_utils.rb
302
- - lib/maze/browsers_bs.yml
303
- - lib/maze/browsers_cbt.yml
356
+ - lib/maze/aws_public_ip.rb
304
357
  - lib/maze/bugsnag_config.rb
305
- - lib/maze/capabilities.rb
306
358
  - lib/maze/checks/assert_check.rb
307
359
  - lib/maze/checks/noop_check.rb
360
+ - lib/maze/client/appium.rb
361
+ - lib/maze/client/appium/base_client.rb
362
+ - lib/maze/client/appium/bb_client.rb
363
+ - lib/maze/client/appium/bb_devices.rb
364
+ - lib/maze/client/appium/bs_client.rb
365
+ - lib/maze/client/appium/bs_devices.rb
366
+ - lib/maze/client/appium/bs_legacy_client.rb
367
+ - lib/maze/client/appium/local_client.rb
368
+ - lib/maze/client/bb_api_client.rb
369
+ - lib/maze/client/bb_client_utils.rb
370
+ - lib/maze/client/bs_client_utils.rb
371
+ - lib/maze/client/selenium.rb
372
+ - lib/maze/client/selenium/base_client.rb
373
+ - lib/maze/client/selenium/bb_browsers.yml
374
+ - lib/maze/client/selenium/bb_client.rb
375
+ - lib/maze/client/selenium/bs_browsers.yml
376
+ - lib/maze/client/selenium/bs_client.rb
377
+ - lib/maze/client/selenium/local_client.rb
308
378
  - lib/maze/compare.rb
309
379
  - lib/maze/configuration.rb
310
380
  - lib/maze/docker.rb
311
381
  - lib/maze/document_server.rb
312
382
  - lib/maze/driver/appium.rb
313
383
  - lib/maze/driver/browser.rb
314
- - lib/maze/driver/resilient_appium.rb
315
384
  - lib/maze/errors.rb
385
+ - lib/maze/generator.rb
316
386
  - lib/maze/helper.rb
317
387
  - lib/maze/hooks/appium_hooks.rb
318
388
  - lib/maze/hooks/browser_hooks.rb
319
389
  - lib/maze/hooks/command_hooks.rb
390
+ - lib/maze/hooks/error_code_hook.rb
320
391
  - lib/maze/hooks/hooks.rb
392
+ - lib/maze/http_request.rb
321
393
  - lib/maze/interactive_cli.rb
322
394
  - lib/maze/logger.rb
323
395
  - lib/maze/macos_utils.rb
396
+ - lib/maze/maze_output.rb
324
397
  - lib/maze/network.rb
325
398
  - lib/maze/option.rb
326
399
  - lib/maze/option/parser.rb
@@ -328,28 +401,35 @@ files:
328
401
  - lib/maze/option/validator.rb
329
402
  - lib/maze/plugins/bugsnag_reporting_plugin.rb
330
403
  - lib/maze/plugins/cucumber_report_plugin.rb
404
+ - lib/maze/plugins/error_code_plugin.rb
331
405
  - lib/maze/plugins/global_retry_plugin.rb
332
406
  - lib/maze/proxy.rb
333
407
  - lib/maze/request_list.rb
408
+ - lib/maze/request_repeater.rb
334
409
  - lib/maze/retry_handler.rb
335
410
  - lib/maze/runner.rb
336
- - lib/maze/sauce_labs_utils.rb
411
+ - lib/maze/schemas/OtelTraceSchema.json
412
+ - lib/maze/schemas/trace_schema.rb
413
+ - lib/maze/schemas/trace_validator.rb
337
414
  - lib/maze/server.rb
338
415
  - lib/maze/servlets/base_servlet.rb
339
416
  - lib/maze/servlets/command_servlet.rb
340
417
  - lib/maze/servlets/log_servlet.rb
341
418
  - lib/maze/servlets/reflective_servlet.rb
342
419
  - lib/maze/servlets/servlet.rb
343
- - lib/maze/smart_bear_utils.rb
420
+ - lib/maze/servlets/temp.rb
421
+ - lib/maze/servlets/trace_servlet.rb
344
422
  - lib/maze/store.rb
345
423
  - lib/maze/terminating_server.rb
346
424
  - lib/maze/timers.rb
347
425
  - lib/maze/wait.rb
348
- homepage:
426
+ - lib/utils/deep_merge.rb
427
+ - lib/utils/selenium_money_patch.rb
428
+ homepage:
349
429
  licenses:
350
430
  - MIT
351
431
  metadata: {}
352
- post_install_message:
432
+ post_install_message:
353
433
  rdoc_options: []
354
434
  require_paths:
355
435
  - lib
@@ -365,7 +445,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
365
445
  version: '0'
366
446
  requirements: []
367
447
  rubygems_version: 3.1.6
368
- signing_key:
448
+ signing_key:
369
449
  specification_version: 4
370
450
  summary: Bugsnag API request validation harness
371
451
  test_files: []
@@ -1,84 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'json'
3
-
4
- module Maze
5
- # Provides a source of capabilities used to run tests against specific BitBar devices
6
- # noinspection RubyStringKeysInHashInspection
7
- class BitBarDevices
8
- APPIUM_1_9_1 = '1.9.1'
9
- APPIUM_1_15_0 = '1.15.0'
10
- APPIUM_1_20_2 = '1.20.2'
11
-
12
- BASE_URI = 'https://cloud.bitbar.com/api/v2/me'
13
- FILTER_PATH = 'devices/filters'
14
-
15
- DEVICE_GROUP_IDS = {
16
- # Classic, non-specific devices for each Android version
17
- 'ANDROID_10_0' => '46024',
18
-
19
- # iOS devices
20
- 'IOS_14' => '46025'
21
- }
22
-
23
- class << self
24
- def call_bitbar_api(path, query, api_key)
25
- encoded_query = URI.encode_www_form(query)
26
- uri = URI("#{BASE_URI}/#{path}?#{encoded_query}")
27
- request = Net::HTTP::Get.new(uri)
28
- request.basic_auth(api_key, '')
29
-
30
- res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
31
- http.request(request)
32
- end
33
-
34
- JSON.parse(res.body)
35
- end
36
-
37
- def get_filtered_device_name(device_group_id, api_key)
38
- path = "device-groups/#{device_group_id}/devices"
39
- query = {
40
- 'filter': "online_eq_true"
41
- }
42
- all_devices = call_bitbar_api(path, query, api_key)
43
- filtered_devices = all_devices['data'].reject { |device| device['locked'] }
44
- filtered_devices.first['displayName']
45
- end
46
-
47
- def get_device(device_group, platform, platform_version, api_key)
48
- device_group_id = DEVICE_GROUP_IDS[device_group]
49
- device_name = get_filtered_device_name(device_group_id, api_key)
50
- case platform.downcase
51
- when 'android'
52
- automation_name = 'UiAutomator1' if platform_version.start_with?('5')
53
- make_android_hash(device_name, nil, automation_name)
54
- when 'ios'
55
- make_ios_hash(device_name)
56
- else
57
- throw "Invalid device platform specified #{platform}"
58
- end
59
- end
60
-
61
- def make_android_hash(device, appium_version = nil, automation_name = nil)
62
- hash = {
63
- 'platformName' => 'Android',
64
- 'bitbar_device' => device,
65
- 'bitbar_target' => 'android',
66
- 'deviceName' => 'Android Phone'
67
- }
68
- hash['bitbar_appiumVersion'] = appium_version if appium_version
69
- hash['automationName'] = automation_name if automation_name
70
- hash.freeze
71
- end
72
-
73
- def make_ios_hash(device)
74
- {
75
- 'platformName' => 'iOS',
76
- 'bitbar_device' => device,
77
- 'bitbar_target' => 'ios',
78
- 'deviceName' => 'iPhone device',
79
- 'automationName' => 'XCUITest'
80
- }.freeze
81
- end
82
- end
83
- end
84
- end