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.
- checksums.yaml +4 -4
- data/bin/download-logs +14 -16
- data/bin/maze-runner +53 -15
- data/bin/upload-app +6 -6
- data/lib/features/steps/breadcrumb_steps.rb +44 -14
- data/lib/features/steps/error_reporting_steps.rb +16 -0
- data/lib/features/steps/network_steps.rb +66 -6
- data/lib/features/steps/payload_steps.rb +23 -0
- data/lib/features/steps/request_assertion_steps.rb +87 -8
- data/lib/features/steps/runner_steps.rb +22 -0
- data/lib/features/steps/session_tracking_steps.rb +1 -1
- data/lib/features/steps/trace_steps.rb +206 -0
- data/lib/features/support/internal_hooks.rb +31 -84
- data/lib/maze/api/appium/file_manager.rb +29 -0
- data/lib/maze/aws_public_ip.rb +53 -0
- data/lib/maze/checks/assert_check.rb +9 -31
- data/lib/maze/client/appium/base_client.rb +131 -0
- data/lib/maze/client/appium/bb_client.rb +102 -0
- data/lib/maze/client/appium/bb_devices.rb +127 -0
- data/lib/maze/client/appium/bs_client.rb +91 -0
- data/lib/maze/client/appium/bs_devices.rb +141 -0
- data/lib/maze/client/appium/bs_legacy_client.rb +31 -0
- data/lib/maze/client/appium/local_client.rb +67 -0
- data/lib/maze/client/appium.rb +23 -0
- data/lib/maze/client/bb_api_client.rb +102 -0
- data/lib/maze/client/bb_client_utils.rb +181 -0
- data/lib/maze/client/bs_client_utils.rb +168 -0
- data/lib/maze/client/selenium/base_client.rb +15 -0
- data/lib/maze/client/selenium/bb_browsers.yml +188 -0
- data/lib/maze/client/selenium/bb_client.rb +38 -0
- data/lib/maze/client/selenium/bs_browsers.yml +257 -0
- data/lib/maze/client/selenium/bs_client.rb +89 -0
- data/lib/maze/client/selenium/local_client.rb +16 -0
- data/lib/maze/client/selenium.rb +16 -0
- data/lib/maze/configuration.rb +18 -10
- data/lib/maze/docker.rb +40 -1
- data/lib/maze/driver/appium.rb +5 -24
- data/lib/maze/driver/browser.rb +12 -26
- data/lib/maze/errors.rb +32 -0
- data/lib/maze/generator.rb +55 -0
- data/lib/maze/helper.rb +7 -3
- data/lib/maze/hooks/appium_hooks.rb +29 -190
- data/lib/maze/hooks/browser_hooks.rb +2 -55
- data/lib/maze/hooks/error_code_hook.rb +49 -0
- data/lib/maze/hooks/hooks.rb +2 -2
- data/lib/maze/http_request.rb +21 -0
- data/lib/maze/logger.rb +16 -3
- data/lib/maze/maze_output.rb +88 -0
- data/lib/maze/option/parser.rb +17 -22
- data/lib/maze/option/processor.rb +21 -34
- data/lib/maze/option/validator.rb +38 -67
- data/lib/maze/option.rb +16 -18
- data/lib/maze/plugins/cucumber_report_plugin.rb +1 -1
- data/lib/maze/plugins/error_code_plugin.rb +21 -0
- data/lib/maze/request_list.rb +10 -5
- data/lib/maze/request_repeater.rb +49 -0
- data/lib/maze/retry_handler.rb +4 -13
- data/lib/maze/schemas/OtelTraceSchema.json +390 -0
- data/lib/maze/schemas/trace_schema.rb +7 -0
- data/lib/maze/schemas/trace_validator.rb +98 -0
- data/lib/maze/server.rb +74 -30
- data/lib/maze/servlets/base_servlet.rb +10 -5
- data/lib/maze/servlets/command_servlet.rb +10 -7
- data/lib/maze/servlets/log_servlet.rb +2 -2
- data/lib/maze/servlets/reflective_servlet.rb +12 -11
- data/lib/maze/servlets/servlet.rb +47 -8
- data/lib/maze/servlets/temp.rb +0 -0
- data/lib/maze/servlets/trace_servlet.rb +13 -0
- data/lib/maze.rb +2 -2
- data/lib/utils/deep_merge.rb +17 -0
- data/lib/utils/selenium_money_patch.rb +17 -0
- metadata +101 -21
- data/lib/maze/bitbar_devices.rb +0 -84
- data/lib/maze/bitbar_utils.rb +0 -112
- data/lib/maze/browser_stack_devices.rb +0 -160
- data/lib/maze/browser_stack_utils.rb +0 -164
- data/lib/maze/browsers_bs.yml +0 -220
- data/lib/maze/browsers_cbt.yml +0 -100
- data/lib/maze/capabilities.rb +0 -126
- data/lib/maze/driver/resilient_appium.rb +0 -51
- data/lib/maze/sauce_labs_utils.rb +0 -96
- 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[
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
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
|
-
|
20
|
-
if commands.
|
21
|
-
response.body = 'No commands
|
22
|
-
response.status =
|
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
|
-
|
26
|
-
|
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 <
|
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
|
-
|
38
|
-
|
39
|
-
|
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
|
-
|
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
|
-
|
34
|
-
|
35
|
-
|
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
|
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
|
-
|
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 = '
|
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:
|
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-
|
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:
|
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:
|
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:
|
196
|
+
name: json_schemer
|
155
197
|
requirement: !ruby/object:Gem::Requirement
|
156
198
|
requirements:
|
157
199
|
- - "~>"
|
158
200
|
- !ruby/object:Gem::Version
|
159
|
-
version:
|
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:
|
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/
|
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/
|
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/
|
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
|
-
|
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: []
|
data/lib/maze/bitbar_devices.rb
DELETED
@@ -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
|