bugsnag-maze-runner 7.32.0 → 8.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/maze-runner +9 -1
- data/bin/purge-projects +66 -0
- data/lib/features/steps/app_automator_steps.rb +9 -3
- data/lib/features/steps/header_steps.rb +13 -9
- data/lib/features/steps/multipart_request_steps.rb +10 -10
- data/lib/features/steps/network_steps.rb +7 -24
- data/lib/features/steps/payload_steps.rb +21 -21
- data/lib/features/steps/query_parameter_steps.rb +3 -3
- data/lib/features/steps/request_assertion_steps.rb +11 -18
- data/lib/features/steps/trace_steps.rb +0 -8
- data/lib/features/steps/value_steps.rb +9 -9
- data/lib/features/support/cucumber_types.rb +20 -0
- data/lib/features/support/internal_hooks.rb +1 -2
- data/lib/maze/api/appium/file_manager.rb +1 -1
- data/lib/maze/appium_server.rb +2 -2
- data/lib/maze/client/appium/bb_devices.rb +1 -1
- data/lib/maze/client/appium/bs_devices.rb +7 -9
- data/lib/maze/client/bb_api_client.rb +46 -9
- data/lib/maze/client/bb_client_utils.rb +1 -61
- data/lib/maze/client/selenium/bb_client.rb +1 -6
- data/lib/maze/client/selenium/bs_browsers.yml +23 -9
- data/lib/maze/configuration.rb +0 -6
- data/lib/maze/logger.rb +29 -1
- data/lib/maze/option/parser.rb +39 -14
- data/lib/maze/option/processor.rb +2 -5
- data/lib/maze/option/validator.rb +3 -7
- data/lib/maze/option.rb +2 -6
- data/lib/maze/repeaters/request_repeater.rb +1 -1
- data/lib/maze/schemas/trace_validator.rb +0 -2
- data/lib/maze/server.rb +13 -3
- data/lib/maze/servlets/servlet.rb +13 -10
- data/lib/maze/servlets/trace_servlet.rb +15 -0
- data/lib/maze/terminating_server.rb +1 -1
- data/lib/maze.rb +1 -1
- metadata +5 -3
- data/lib/maze/plugins/cucumber_report_plugin.rb +0 -101
@@ -7,14 +7,6 @@ When('I wait for {int} span(s)') do |span_count|
|
|
7
7
|
assert_received_spans span_count, Maze::Server.list_for('traces')
|
8
8
|
end
|
9
9
|
|
10
|
-
When('I receive and discard the initial p-value request') do
|
11
|
-
steps %Q{
|
12
|
-
And I wait to receive at least 1 trace
|
13
|
-
And the trace payload field "resourceSpans" is an array with 0 elements
|
14
|
-
And I discard the oldest trace
|
15
|
-
}
|
16
|
-
end
|
17
|
-
|
18
10
|
Then('I should have received no spans') do
|
19
11
|
sleep Maze.config.receive_no_requests_wait
|
20
12
|
Maze.check.equal spans_from_request_list(Maze::Server.list_for('traces')).size, 0
|
@@ -7,7 +7,7 @@ require 'date'
|
|
7
7
|
# @step_input request_type [String] The type of request (error, session, build, etc)
|
8
8
|
# @step_input field [String] The payload field to store
|
9
9
|
# @step_input key [String] The key to store the value against
|
10
|
-
Then('the {
|
10
|
+
Then('the {request_type} payload field {string} is stored as the value {string}') do |request_type, field, key|
|
11
11
|
list = Maze::Server.list_for request_type
|
12
12
|
value = Maze::Helper.read_key_path(list.current[:body], field)
|
13
13
|
Maze::Store.values[key] = value.dup
|
@@ -18,7 +18,7 @@ end
|
|
18
18
|
# @step_input request_type [String] The type of request (error, session, build, etc)
|
19
19
|
# @step_input field [String] The payload field to test
|
20
20
|
# @step_input key [String] The key indicating a previously stored value
|
21
|
-
Then('the {
|
21
|
+
Then('the {request_type} payload field {string} equals the stored value {string}') do |request_type, field, key|
|
22
22
|
list = Maze::Server.list_for request_type
|
23
23
|
payload_value = Maze::Helper.read_key_path(list.current[:body], field)
|
24
24
|
stored_value = Maze::Store.values[key]
|
@@ -31,7 +31,7 @@ end
|
|
31
31
|
# @step_input request_type [String] The type of request (error, session, build, etc)
|
32
32
|
# @step_input field [String] The payload field to test
|
33
33
|
# @step_input key [String] The key indicating a previously stored value
|
34
|
-
Then('the {
|
34
|
+
Then('the {request_type} payload field {string} does not equal the stored value {string}') do |request_type, field, key|
|
35
35
|
list = Maze::Server.list_for request_type
|
36
36
|
payload_value = Maze::Helper.read_key_path(list.current[:body], field)
|
37
37
|
stored_value = Maze::Store.values[key]
|
@@ -44,7 +44,7 @@ end
|
|
44
44
|
# @step_input request_type [String] The type of request (error, session, build, etc)
|
45
45
|
# @step_input field [String] The payload field to test
|
46
46
|
# @step_input key [String] The key indicating a previously stored value
|
47
|
-
Then('the {
|
47
|
+
Then('the {request_type} payload field {string} equals the stored value {string} ignoring case') do |request_type, field, key|
|
48
48
|
list = Maze::Server.list_for request_type
|
49
49
|
payload_value = Maze::Helper.read_key_path(list.current[:body], field)
|
50
50
|
stored_value = Maze::Store.values[key]
|
@@ -59,7 +59,7 @@ end
|
|
59
59
|
# @step_input request_type [String] The type of request (error, session, build, etc)
|
60
60
|
# @step_input field [String] The payload field to test
|
61
61
|
# @step_input key [String] The key indicating a previously stored value
|
62
|
-
Then('the {
|
62
|
+
Then('the {request_type} payload field {string} does not equal the stored value {string} ignoring case') do |request_type, field, key|
|
63
63
|
list = Maze::Server.list_for request_type
|
64
64
|
payload_value = Maze::Helper.read_key_path(list.current[:body], field)
|
65
65
|
stored_value = Maze::Store.values[key]
|
@@ -73,7 +73,7 @@ end
|
|
73
73
|
#
|
74
74
|
# @step_input request_type [String] The type of request (error, session, build, etc)
|
75
75
|
# @step_input field [String] The payload field to test
|
76
|
-
Then('the {
|
76
|
+
Then('the {request_type} payload field {string} is a number') do |request_type, field|
|
77
77
|
list = Maze::Server.list_for request_type
|
78
78
|
value = Maze::Helper.read_key_path(list.current[:body], field)
|
79
79
|
Maze.check.kind_of Numeric, value
|
@@ -83,7 +83,7 @@ end
|
|
83
83
|
#
|
84
84
|
# @step_input request_type [String] The type of request (error, session, build, etc)
|
85
85
|
# @step_input field [String] The payload field to test
|
86
|
-
Then('the {
|
86
|
+
Then('the {request_type} payload field {string} is an integer') do |request_type, field|
|
87
87
|
list = Maze::Server.list_for request_type
|
88
88
|
value = Maze::Helper.read_key_path(list.current[:body], field)
|
89
89
|
Maze.check.kind_of Integer, value
|
@@ -93,7 +93,7 @@ end
|
|
93
93
|
#
|
94
94
|
# @step_input request_type [String] The type of request (error, session, build, etc)
|
95
95
|
# @step_input field [String] The payload field to test
|
96
|
-
Then('the {
|
96
|
+
Then('the {request_type} payload field {string} is a date') do |request_type, field|
|
97
97
|
list = Maze::Server.list_for request_type
|
98
98
|
value = Maze::Helper.read_key_path(list.current[:body], field)
|
99
99
|
date = begin
|
@@ -108,7 +108,7 @@ end
|
|
108
108
|
#
|
109
109
|
# @step_input request_type [String] The type of request (error, session, build, etc)
|
110
110
|
# @step_input field [String] The payload field to test
|
111
|
-
Then('the {
|
111
|
+
Then('the {request_type} payload field {string} is a UUID') do |request_type, field|
|
112
112
|
list = Maze::Server.list_for request_type
|
113
113
|
value = Maze::Helper.read_key_path(list.current[:body], field)
|
114
114
|
Maze.check.not_nil(value, "Expected UUID, got nil for #{field}")
|
@@ -0,0 +1,20 @@
|
|
1
|
+
ParameterType(
|
2
|
+
name: 'request_type',
|
3
|
+
regexp: /errors?|sessions?|builds?|logs?|metrics?|sampling requests?|traces?|uploads?|sourcemaps?|invalid requests?/,
|
4
|
+
type: String,
|
5
|
+
transformer: ->(s) { s }
|
6
|
+
)
|
7
|
+
|
8
|
+
ParameterType(
|
9
|
+
name: 'orientation',
|
10
|
+
regexp: /portrait|landscape/,
|
11
|
+
type: String,
|
12
|
+
transformer: ->(s) { s.to_sym }
|
13
|
+
)
|
14
|
+
|
15
|
+
ParameterType(
|
16
|
+
name: 'int_array',
|
17
|
+
regexp: /\d+(?:, ?\d+)*/,
|
18
|
+
type: String,
|
19
|
+
transformer: ->(s) { s.split(',').map(&:strip).map(&:to_i) }
|
20
|
+
)
|
@@ -90,8 +90,6 @@ InstallPlugin do |config|
|
|
90
90
|
# Only add the retry plugin if --retry is not used on the command line
|
91
91
|
config.filters << Maze::Plugins::GlobalRetryPlugin.new(config) if config.options[:retry].zero?
|
92
92
|
config.filters << Maze::Plugins::BugsnagReportingPlugin.new(config)
|
93
|
-
cucumber_report_plugin = Maze::Plugins::CucumberReportPlugin.new
|
94
|
-
cucumber_report_plugin.install_plugin(config)
|
95
93
|
end
|
96
94
|
|
97
95
|
# Before each scenario
|
@@ -145,6 +143,7 @@ After do |scenario|
|
|
145
143
|
$stdout.puts '^^^ +++'
|
146
144
|
output_received_requests('errors')
|
147
145
|
output_received_requests('sessions')
|
146
|
+
output_received_requests('traces')
|
148
147
|
output_received_requests('builds')
|
149
148
|
output_received_requests('logs')
|
150
149
|
output_received_requests('invalid requests')
|
@@ -20,7 +20,7 @@ module Maze
|
|
20
20
|
"/sdcard/Android/data/#{@driver.app_id}/files/#{filename}"
|
21
21
|
end
|
22
22
|
|
23
|
-
$logger.
|
23
|
+
$logger.trace "Pushing file to '#{path}' with contents: #{contents}"
|
24
24
|
@driver.push_file(path, contents)
|
25
25
|
end
|
26
26
|
end
|
data/lib/maze/appium_server.rb
CHANGED
@@ -44,7 +44,7 @@ module Maze
|
|
44
44
|
@appium_thread = Thread.new do
|
45
45
|
PTY.spawn(command) do |stdout, _stdin, pid|
|
46
46
|
@pid = pid
|
47
|
-
$logger.
|
47
|
+
$logger.trace("Appium:#{@pid}") { 'Appium server started' }
|
48
48
|
stdout.each do |line|
|
49
49
|
log_line(line)
|
50
50
|
end
|
@@ -66,7 +66,7 @@ module Maze
|
|
66
66
|
def stop
|
67
67
|
return unless running
|
68
68
|
|
69
|
-
$logger.
|
69
|
+
$logger.trace("Appium:#{@pid}") { 'Stopping appium server' }
|
70
70
|
Process.kill('INT', @pid)
|
71
71
|
@pid = nil
|
72
72
|
@appium_thread.join
|
@@ -17,7 +17,7 @@ module Maze
|
|
17
17
|
device_group_ids = api_client.get_device_group_ids(device_or_group_names)
|
18
18
|
if device_group_ids
|
19
19
|
# Device group found - find a free device in it
|
20
|
-
$logger.
|
20
|
+
$logger.trace "Got group ids #{device_group_ids} for #{device_or_group_names}"
|
21
21
|
group_count, device = api_client.find_device_in_groups(device_group_ids)
|
22
22
|
if device.nil?
|
23
23
|
# TODO: Retry rather than fail, see PLAT-7377
|
@@ -70,15 +70,13 @@ module Maze
|
|
70
70
|
def create_hash
|
71
71
|
hash = {
|
72
72
|
# Classic, non-specific devices for each Android version
|
73
|
-
'
|
74
|
-
'
|
75
|
-
'
|
76
|
-
'
|
77
|
-
'
|
78
|
-
'
|
79
|
-
'
|
80
|
-
'ANDROID_8_0' => make_android_hash('Google Pixel 2', '8.0'),
|
81
|
-
'ANDROID_7_1' => make_android_hash('Google Pixel', '7.1'),
|
73
|
+
'ANDROID_13' => make_android_hash('Google Pixel 6 Pro', '13.0'),
|
74
|
+
'ANDROID_12' => make_android_hash('Google Pixel 5', '12.0'),
|
75
|
+
'ANDROID_11' => make_android_hash('Google Pixel 4', '11.0'),
|
76
|
+
'ANDROID_10' => make_android_hash('Google Pixel 4', '10.0'),
|
77
|
+
'ANDROID_9' => make_android_hash('Google Pixel 3', '9.0'),
|
78
|
+
'ANDROID_8' => make_android_hash('Samsung Galaxy Note 9', '8.1'),
|
79
|
+
'ANDROID_7' => make_android_hash('Google Pixel', '7.1'),
|
82
80
|
|
83
81
|
# iOS devices
|
84
82
|
'IOS_16' => make_ios_hash('iPhone 14', '16'),
|
@@ -44,7 +44,7 @@ module Maze
|
|
44
44
|
all_devices += query_api(path, query)['data']
|
45
45
|
end
|
46
46
|
|
47
|
-
$logger.
|
47
|
+
$logger.trace "All available devices in group(s) #{device_group_ids}: #{JSON.pretty_generate(all_devices)}"
|
48
48
|
filtered_devices = all_devices.reject { |device| device['locked'] }
|
49
49
|
|
50
50
|
# Only send gauges to DataDog for single device groups
|
@@ -64,7 +64,7 @@ module Maze
|
|
64
64
|
if all_devices.size == 0
|
65
65
|
Maze::Helper.error_exit "No devices found with name '#{device_name}'"
|
66
66
|
else
|
67
|
-
$logger.
|
67
|
+
$logger.trace "All available devices with name #{device_name}: #{JSON.pretty_generate(all_devices)}"
|
68
68
|
filtered_devices = all_devices.reject { |device| device['locked'] }
|
69
69
|
if filtered_devices.size == 0
|
70
70
|
Maze::Helper.error_exit "None of the #{all_devices.size} devices with name '#{device_name}' are currently available"
|
@@ -88,23 +88,60 @@ module Maze
|
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
91
|
+
def get_projects(pattern)
|
92
|
+
query = {
|
93
|
+
'limit': "1000"
|
94
|
+
}
|
95
|
+
|
96
|
+
project_data = query_api('projects', query)
|
97
|
+
|
98
|
+
begin
|
99
|
+
projects = Hash.new
|
100
|
+
project_data['data'].each do |child|
|
101
|
+
if child['name'].match(pattern)
|
102
|
+
projects[child['name']] = child['id']
|
103
|
+
end
|
104
|
+
end
|
105
|
+
rescue StandardError => e
|
106
|
+
$logger.error "Error getting projects from BitBar"
|
107
|
+
$logger.error e
|
108
|
+
raise
|
109
|
+
end
|
110
|
+
projects
|
111
|
+
end
|
112
|
+
|
113
|
+
def delete_project (id)
|
114
|
+
response = query_api "projects/#{id}"
|
115
|
+
end
|
116
|
+
|
91
117
|
private
|
92
118
|
|
93
119
|
# Queries the BitBar REST API
|
94
|
-
def query_api(path, query=nil, uri=USER_SPECIFIC_URI)
|
120
|
+
def query_api(path, query=nil, uri=USER_SPECIFIC_URI, method="get")
|
95
121
|
if query
|
96
122
|
encoded_query = URI.encode_www_form(query)
|
97
123
|
uri = URI("#{uri}/#{path}?#{encoded_query}")
|
98
124
|
else
|
99
125
|
uri = URI("#{uri}/#{path}")
|
100
126
|
end
|
101
|
-
request = Net::HTTP::Get.new(uri)
|
102
|
-
request.basic_auth(@access_key, '')
|
103
|
-
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
|
104
|
-
http.request(request)
|
105
|
-
end
|
106
127
|
|
107
|
-
|
128
|
+
if method == "get"
|
129
|
+
request = Net::HTTP::Get.new(uri)
|
130
|
+
request.basic_auth(@access_key, '')
|
131
|
+
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
|
132
|
+
http.request(request)
|
133
|
+
end
|
134
|
+
|
135
|
+
return JSON.parse(res.body)
|
136
|
+
elsif method == "delete"
|
137
|
+
request = Net::HTTP::Delete.new(uri)
|
138
|
+
request.basic_auth(@access_key, '')
|
139
|
+
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
|
140
|
+
http.request(request)
|
141
|
+
end
|
142
|
+
|
143
|
+
return res
|
144
|
+
end
|
108
145
|
end
|
109
146
|
end
|
110
147
|
end
|
@@ -63,66 +63,6 @@ module Maze
|
|
63
63
|
app_uuid
|
64
64
|
end
|
65
65
|
|
66
|
-
# Requests an unused account id from the test-management-service
|
67
|
-
# @param tms_uri [String] The URI of the test-management-service
|
68
|
-
#
|
69
|
-
# @returns
|
70
|
-
def account_credentials(tms_uri)
|
71
|
-
interval_seconds = 10
|
72
|
-
|
73
|
-
credentials = Maze::Wait.new(interval: interval_seconds, timeout: 1800).until do
|
74
|
-
output = request_account_index(tms_uri)
|
75
|
-
case output.code
|
76
|
-
when '200'
|
77
|
-
body = JSON.parse(output.body, {symbolize_names: true})
|
78
|
-
@account_id = account_id = body[:id]
|
79
|
-
$logger.info "Using account #{account_id}, expiring at #{body[:expiry]}"
|
80
|
-
{
|
81
|
-
username: ENV["#{BB_USER_PREFIX}#{account_id}"],
|
82
|
-
access_key: ENV["#{BB_KEY_PREFIX}#{account_id}"]
|
83
|
-
}
|
84
|
-
when '409'
|
85
|
-
# All accounts are in use, wait for one to become available
|
86
|
-
$logger.info("All accounts are currently in use, retrying in #{interval_seconds}s")
|
87
|
-
false
|
88
|
-
else
|
89
|
-
# Something has gone wrong, throw an error
|
90
|
-
$logger.error "Unexpected status code (#{output.code}) received from test-management server: #{output.body}"
|
91
|
-
raise
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
return credentials if credentials
|
96
|
-
|
97
|
-
raise "Could not fetch BitBar credentials in time"
|
98
|
-
end
|
99
|
-
|
100
|
-
# Makes the HTTP call to acquire an account id
|
101
|
-
# @param tms_uri [String] The URI of the test-management-service
|
102
|
-
#
|
103
|
-
# @returns
|
104
|
-
def request_account_index(tms_uri)
|
105
|
-
uri = URI("#{tms_uri}/account/request")
|
106
|
-
request = Net::HTTP::Get.new(uri)
|
107
|
-
request['Authorization'] = Maze.config.tms_token
|
108
|
-
res = Net::HTTP.start(uri.hostname, uri.port) do |http|
|
109
|
-
http.request(request)
|
110
|
-
end
|
111
|
-
res
|
112
|
-
end
|
113
|
-
|
114
|
-
# Informs the test-management-service that in-use account id is no longer in use
|
115
|
-
# @param tms_uri [String] The URI of the test-management-service
|
116
|
-
def release_account(tms_uri)
|
117
|
-
$logger.info "Release account #{@account_id}"
|
118
|
-
uri = URI("#{tms_uri}/account/release?account_id=#{@account_id}")
|
119
|
-
request = Net::HTTP::Get.new(uri)
|
120
|
-
request['Authorization'] = Maze.config.tms_token
|
121
|
-
res = Net::HTTP.start(uri.hostname, uri.port) do |http|
|
122
|
-
http.request(request)
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
66
|
def use_local_tunnel?
|
127
67
|
Maze.config.start_tunnel && !Maze.config.aws_public_ip
|
128
68
|
end
|
@@ -225,7 +165,7 @@ module Maze
|
|
225
165
|
end
|
226
166
|
|
227
167
|
exit_status = wait_thr.value.to_i
|
228
|
-
$logger.
|
168
|
+
$logger.trace "Exit status: #{exit_status}"
|
229
169
|
|
230
170
|
output.each { |line| $logger.warn('SBSecureTunnel') {line.chomp} } unless exit_status == 0
|
231
171
|
|
@@ -13,11 +13,7 @@ module Maze
|
|
13
13
|
config.capabilities = capabilities
|
14
14
|
|
15
15
|
if Maze::Client::BitBarClientUtils.use_local_tunnel?
|
16
|
-
|
17
|
-
credentials = Maze::Client::BitBarClientUtils.account_credentials config.tms_uri
|
18
|
-
capabilities['bitbar_apiKey'] = credentials[:access_key]
|
19
|
-
end
|
20
|
-
|
16
|
+
capabilities['bitbar_apiKey'] = config.access_key
|
21
17
|
Maze::Client::BitBarClientUtils.start_local_tunnel config.sb_local,
|
22
18
|
config.username,
|
23
19
|
config.access_key
|
@@ -41,7 +37,6 @@ module Maze
|
|
41
37
|
super
|
42
38
|
if Maze::Client::BitBarClientUtils.use_local_tunnel?
|
43
39
|
Maze::Client::BitBarClientUtils.stop_local_tunnel
|
44
|
-
Maze::Client::BitBarClientUtils.release_account(Maze.config.tms_uri) if ENV['BUILDKITE']
|
45
40
|
end
|
46
41
|
end
|
47
42
|
end
|
@@ -96,69 +96,83 @@ safari_16:
|
|
96
96
|
os: "OS X"
|
97
97
|
osVersion: "Ventura"
|
98
98
|
|
99
|
-
|
99
|
+
ios_9:
|
100
100
|
browserName: "iphone"
|
101
101
|
device: "iPhone 6S"
|
102
102
|
os: "ios"
|
103
103
|
osVersion: "9.0"
|
104
104
|
realMobile: true
|
105
105
|
|
106
|
-
|
106
|
+
ios_10:
|
107
107
|
browserName: "iphone"
|
108
108
|
device: "iPhone 7"
|
109
109
|
os: "ios"
|
110
110
|
osVersion: "10.3"
|
111
111
|
realMobile: true
|
112
112
|
|
113
|
-
|
113
|
+
ios_11:
|
114
114
|
browserName: "iphone"
|
115
115
|
device: "iPhone X"
|
116
116
|
os: "ios"
|
117
117
|
osVersion: "11"
|
118
118
|
realMobile: true
|
119
119
|
|
120
|
-
|
120
|
+
ios_12:
|
121
121
|
browserName: "iphone"
|
122
122
|
device: "iPhone XS"
|
123
123
|
os: "ios"
|
124
124
|
osVersion: "12"
|
125
125
|
realMobile: true
|
126
126
|
|
127
|
-
|
127
|
+
ios_15:
|
128
128
|
browserName: "iphone"
|
129
129
|
device: "iPhone 13"
|
130
130
|
os: "ios"
|
131
131
|
osVersion: "15.4"
|
132
132
|
realMobile: true
|
133
133
|
|
134
|
-
|
134
|
+
ios_16:
|
135
|
+
browserName: "iphone"
|
136
|
+
device: "iPhone 14"
|
137
|
+
os: "ios"
|
138
|
+
osVersion: "16"
|
139
|
+
realMobile: true
|
140
|
+
|
141
|
+
android_4:
|
135
142
|
browserName: "Android Browser"
|
136
143
|
device: "Google Nexus 5"
|
137
144
|
os: "android"
|
138
145
|
osVersion: "4.4"
|
139
146
|
realMobile: true
|
140
147
|
|
141
|
-
|
148
|
+
android_5:
|
142
149
|
browserName: "Android Browser"
|
143
150
|
device: "Samsung Galaxy S6"
|
144
151
|
os: "android"
|
145
152
|
osVersion: "5.0"
|
146
153
|
realMobile: true
|
147
154
|
|
148
|
-
|
155
|
+
android_6:
|
149
156
|
browserName: "Android Browser"
|
150
157
|
device: "Samsung Galaxy S7"
|
151
158
|
os: "android"
|
152
159
|
osVersion: "6.0"
|
153
160
|
realMobile: true
|
154
161
|
|
155
|
-
|
162
|
+
android_7:
|
156
163
|
browserName: "Android Browser"
|
157
164
|
device: "Samsung Galaxy S8 Plus"
|
158
165
|
os: "android"
|
159
166
|
osVersion: "7.0"
|
160
167
|
realMobile: true
|
161
168
|
|
169
|
+
android_13:
|
170
|
+
browserName: "Android Browser"
|
171
|
+
device: "Google Pixel 7"
|
172
|
+
os: "android"
|
173
|
+
osVersion: "13.0"
|
174
|
+
realMobile: true
|
175
|
+
|
162
176
|
firefox_30:
|
163
177
|
browserName: "firefox"
|
164
178
|
browserVersion: "30"
|
data/lib/maze/configuration.rb
CHANGED
@@ -133,12 +133,6 @@ module Maze
|
|
133
133
|
# Appium version to use
|
134
134
|
attr_accessor :appium_version
|
135
135
|
|
136
|
-
# URI of the test-management service
|
137
|
-
attr_accessor :tms_uri
|
138
|
-
|
139
|
-
# Access token for the test-management service
|
140
|
-
attr_accessor :tms_token
|
141
|
-
|
142
136
|
# URL of the Appium server
|
143
137
|
attr_accessor :appium_server_url
|
144
138
|
|
data/lib/maze/logger.rb
CHANGED
@@ -3,6 +3,32 @@
|
|
3
3
|
require 'logger'
|
4
4
|
require 'singleton'
|
5
5
|
|
6
|
+
# Monkey patch a 'trace' log level into the standard Logger
|
7
|
+
class Logger
|
8
|
+
remove_const(:SEV_LABEL)
|
9
|
+
SEV_LABEL = {
|
10
|
+
-1 => 'TRACE',
|
11
|
+
0 => 'DEBUG',
|
12
|
+
1 => 'INFO',
|
13
|
+
2 => 'WARN',
|
14
|
+
3 => 'ERROR',
|
15
|
+
4 => 'FATAL',
|
16
|
+
5 => 'ANY'
|
17
|
+
}
|
18
|
+
|
19
|
+
module Severity
|
20
|
+
TRACE=-1
|
21
|
+
end
|
22
|
+
|
23
|
+
def trace(name = nil, &block)
|
24
|
+
add(TRACE, nil, name, &block)
|
25
|
+
end
|
26
|
+
|
27
|
+
def trace?
|
28
|
+
@level <= TRACE
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
6
32
|
# Logger classes
|
7
33
|
module Maze
|
8
34
|
# A logger, with level configured according to the environment
|
@@ -12,7 +38,9 @@ module Maze
|
|
12
38
|
attr_accessor :datetime_format
|
13
39
|
|
14
40
|
def initialize
|
15
|
-
if ENV['
|
41
|
+
if ENV['TRACE']
|
42
|
+
super(STDOUT, level: Logger::TRACE)
|
43
|
+
elsif ENV['DEBUG']
|
16
44
|
super(STDOUT, level: Logger::DEBUG)
|
17
45
|
elsif ENV['QUIET']
|
18
46
|
super(STDOUT, level: Logger::ERROR)
|