parallel_report_portal 3.0.1 → 3.0.2.beta.1
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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e1d5cb1312e5c4b45d5581eea41e02df63266535ee5e3b58412f5d9fde5fd0dd
|
4
|
+
data.tar.gz: a10beda80c2270a68c06ff13a18701cf1cd0734eae91bd0c81c37cf0ecfd0623
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aa2e9ce388cd7de1df78bbcd958c44f6bd329e8ebc7c40c0f550b5e79febd82b2a5913e141fc74f3e80206968f801c9e885539b7df2a4f5c06ae4508b9df11a6
|
7
|
+
data.tar.gz: 02b361da3143afa20ecd5d2111cd74fef9655b848a56174b2624d60193b2f2ee40b996ccd0dbf29abefa165e271836cac7a8c08bcab63a71d08a7c80306be85d
|
@@ -23,11 +23,10 @@ module ParallelReportPortal
|
|
23
23
|
unknown: 'UNKNOWN'
|
24
24
|
}
|
25
25
|
|
26
|
-
|
27
26
|
# Create a new instance of the report
|
28
27
|
def initialize(ast_lookup = nil)
|
29
28
|
@feature = nil
|
30
|
-
@tree = Tree::TreeNode.new(
|
29
|
+
@tree = Tree::TreeNode.new('root')
|
31
30
|
@ast_lookup = ast_lookup
|
32
31
|
check_faraday_compatibility
|
33
32
|
end
|
@@ -38,7 +37,7 @@ module ParallelReportPortal
|
|
38
37
|
end
|
39
38
|
end
|
40
39
|
|
41
|
-
# Issued to start a launch. It is
|
40
|
+
# Issued to start a launch. It is possible that this method could be called
|
42
41
|
# from multiple processes for the same launch if this is being run with
|
43
42
|
# parallel tests enabled. A temporary launch file will be created (using
|
44
43
|
# exclusive locking). The first time this method is called it will write the
|
@@ -48,13 +47,13 @@ module ParallelReportPortal
|
|
48
47
|
# @param start_time [Integer] the millis from the epoch
|
49
48
|
# @return [String] the UUID of this launch
|
50
49
|
def launch_started(start_time)
|
51
|
-
ParallelReportPortal.file_open_exlock_and_block(ParallelReportPortal.launch_id_file, 'a+'
|
50
|
+
ParallelReportPortal.file_open_exlock_and_block(ParallelReportPortal.launch_id_file, 'a+') do |file|
|
52
51
|
if file.size == 0
|
53
52
|
@launch_id = ParallelReportPortal.req_launch_started(start_time)
|
54
53
|
file.write(@launch_id)
|
55
54
|
file.flush
|
56
55
|
else
|
57
|
-
|
56
|
+
@launch_id = file.readline
|
58
57
|
end
|
59
58
|
@launch_id
|
60
59
|
end
|
@@ -65,12 +64,8 @@ module ParallelReportPortal
|
|
65
64
|
# @param clock [Integer] the millis from the epoch
|
66
65
|
def launch_finished(clock)
|
67
66
|
@tree.postordered_each do |node|
|
68
|
-
|
69
|
-
parse_report_link_from_response(response)
|
67
|
+
ParallelReportPortal.http_repeater { ParallelReportPortal.req_feature_finished(node.content, clock) } unless node.is_root?
|
70
68
|
end
|
71
|
-
response = ParallelReportPortal.req_launch_finished(launch_id, clock)
|
72
|
-
parse_report_link_from_response(response)
|
73
|
-
ParallelReportPortal.launch_finished_block.call if ParallelReportPortal.launch_finished_block
|
74
69
|
end
|
75
70
|
|
76
71
|
# Called to indicate that a feature has started.
|
@@ -114,7 +109,7 @@ module ParallelReportPortal
|
|
114
109
|
if (using_cucumber_messages? ? test_step : step_source).multiline_arg.doc_string?
|
115
110
|
detail << %(\n"""\n#{(using_cucumber_messages? ? test_step : step_source).multiline_arg.content}\n""")
|
116
111
|
elsif (using_cucumber_messages? ? test_step : step_source).multiline_arg.data_table?
|
117
|
-
detail << (using_cucumber_messages? ? test_step : step_source).multiline_arg.raw.reduce("\n") {|acc, row| acc << "| #{row.join(' | ')} |\n"}
|
112
|
+
detail << (using_cucumber_messages? ? test_step : step_source).multiline_arg.raw.reduce("\n") { |acc, row| acc << "| #{row.join(' | ')} |\n" }
|
118
113
|
end
|
119
114
|
|
120
115
|
ParallelReportPortal.req_log(@test_case_id, detail, status_to_level(:trace), clock)
|
@@ -155,13 +150,14 @@ module ParallelReportPortal
|
|
155
150
|
else
|
156
151
|
feature.location.file.split(File::SEPARATOR)
|
157
152
|
end
|
158
|
-
|
153
|
+
|
154
|
+
ParallelReportPortal.file_open_exlock_and_block(ParallelReportPortal.hierarchy_file, 'a+b') do |file|
|
159
155
|
@tree = Marshal.load(File.read(file)) if file.size > 0
|
160
156
|
node = @tree.root
|
161
157
|
path_components[0..-2].each do |component|
|
162
158
|
next_node = node[component]
|
163
159
|
unless next_node
|
164
|
-
id = ParallelReportPortal.req_hierarchy(launch_id, "Folder: #{component}", node.content, 'SUITE', [], nil, clock
|
160
|
+
id = ParallelReportPortal.req_hierarchy(launch_id, "Folder: #{component}", node.content, 'SUITE', [], nil, clock)
|
165
161
|
next_node = Tree::TreeNode.new(component, id)
|
166
162
|
node << next_node
|
167
163
|
node = next_node
|
@@ -219,7 +215,7 @@ module ParallelReportPortal
|
|
219
215
|
if using_cucumber_messages?
|
220
216
|
test_step.hook?
|
221
217
|
else
|
222
|
-
!
|
218
|
+
!test_step.source.last.respond_to?(:keyword)
|
223
219
|
end
|
224
220
|
end
|
225
221
|
|
@@ -235,13 +231,6 @@ module ParallelReportPortal
|
|
235
231
|
LOG_LEVELS.fetch(status, LOG_LEVELS[:info])
|
236
232
|
end
|
237
233
|
end
|
238
|
-
|
239
|
-
def parse_report_link_from_response(response)
|
240
|
-
if response
|
241
|
-
json = JSON.parse(response.body)
|
242
|
-
ParallelReportPortal.report_url = json['link'] if json['link']
|
243
|
-
end
|
244
|
-
end
|
245
234
|
end
|
246
235
|
end
|
247
236
|
end
|
@@ -6,6 +6,8 @@ module ParallelReportPortal
|
|
6
6
|
# REST interface.
|
7
7
|
module HTTP
|
8
8
|
|
9
|
+
class HTTPBadGatewayError < StandardError; end
|
10
|
+
|
9
11
|
# Creating class level logger and setting log level
|
10
12
|
@@logger = Logger.new(STDOUT)
|
11
13
|
@@logger.level = Logger::ERROR
|
@@ -93,9 +95,30 @@ module ParallelReportPortal
|
|
93
95
|
# Send a request to Report Portal to finish a launch.
|
94
96
|
# It will bubble up any Faraday connection exceptions.
|
95
97
|
def req_launch_finished(launch_id, time)
|
96
|
-
|
98
|
+
@@logger.debug { "Launch finish with ID: '#{launch_id}'" }
|
99
|
+
|
100
|
+
response = ParallelReportPortal.http_connection.put("launch/#{launch_id}/finish") do |req|
|
97
101
|
req.body = { end_time: time }.to_json
|
98
102
|
end
|
103
|
+
|
104
|
+
@@logger.error { "Launch finish failed with response code #{response.status} -- message #{response.body}" } unless response.success?
|
105
|
+
response
|
106
|
+
end
|
107
|
+
|
108
|
+
def force_stop(launch_id, time)
|
109
|
+
resp = ParallelReportPortal.http_connection.put("launch/#{launch_id}/stop") do |req|
|
110
|
+
req.body = { end_time: time, status: :stopped }.to_json
|
111
|
+
end
|
112
|
+
@@logger.warn { "Failed to force stop: response code #{resp.status} -- message #{resp.body}" } unless resp.success?
|
113
|
+
|
114
|
+
resp
|
115
|
+
end
|
116
|
+
|
117
|
+
def parse_report_link_from_response(response)
|
118
|
+
if response
|
119
|
+
json = JSON.parse(response.body)
|
120
|
+
ParallelReportPortal.report_url = json['link'] if json['link']
|
121
|
+
end
|
99
122
|
end
|
100
123
|
|
101
124
|
# Send a request to ReportPortal to start a feature.
|
@@ -145,9 +168,14 @@ module ParallelReportPortal
|
|
145
168
|
|
146
169
|
# Send a request to Report Portal that a feature has completed.
|
147
170
|
def req_feature_finished(feature_id, time)
|
148
|
-
ParallelReportPortal.http_connection.put("item/#{feature_id}") do |req|
|
171
|
+
response = ParallelReportPortal.http_connection.put("item/#{feature_id}") do |req|
|
149
172
|
req.body = { end_time: time }.to_json
|
150
173
|
end
|
174
|
+
@@logger.debug { "Feature finish with ID: '#{feature_id}'" }
|
175
|
+
|
176
|
+
|
177
|
+
@@logger.error { "Feature finish failed with response code #{response.status} -- message #{response.body}" } unless response.success?
|
178
|
+
response
|
151
179
|
end
|
152
180
|
|
153
181
|
# Send a request to ReportPortal to start a test case.
|
@@ -236,5 +264,23 @@ module ParallelReportPortal
|
|
236
264
|
end
|
237
265
|
end
|
238
266
|
end
|
267
|
+
|
268
|
+
|
269
|
+
|
270
|
+
def http_repeater(&block)
|
271
|
+
tries = 0
|
272
|
+
begin
|
273
|
+
tries += 1
|
274
|
+
response = block.call
|
275
|
+
raise HTTPBadGatewayError if response && !response.success? && response.status == 502
|
276
|
+
rescue HTTPBadGatewayError => _e
|
277
|
+
if tries <= 3
|
278
|
+
sleep(1)
|
279
|
+
@@logger.warn { 'HTTP call failed, retrying...' }
|
280
|
+
retry
|
281
|
+
end
|
282
|
+
end
|
283
|
+
response
|
284
|
+
end
|
239
285
|
end
|
240
286
|
end
|
@@ -33,6 +33,11 @@ module ParallelReportPortal
|
|
33
33
|
if ParallelReportPortal.parallel?
|
34
34
|
if ParallelTests.first_process?
|
35
35
|
ParallelTests.wait_for_other_processes_to_finish
|
36
|
+
|
37
|
+
launch_id = File.read(launch_id_file)
|
38
|
+
response = http_repeater { req_launch_finished(launch_id, clock) }
|
39
|
+
response.success? ? parse_report_link_from_response(response) : force_stop(launch_id, clock)
|
40
|
+
|
36
41
|
delete_file(launch_id_file)
|
37
42
|
delete_file(hierarchy_file)
|
38
43
|
end
|
@@ -41,6 +41,6 @@ Gem::Specification.new do |spec|
|
|
41
41
|
spec.add_runtime_dependency 'faraday-net_http_persistent', '~> 2.1'
|
42
42
|
spec.add_runtime_dependency 'faraday-multipart', '~> 1.0', '>= 1.0.4'
|
43
43
|
spec.add_runtime_dependency 'parallel_tests', '>= 2.29.1'
|
44
|
-
spec.add_runtime_dependency 'rubytree', '~>
|
44
|
+
spec.add_runtime_dependency 'rubytree', '~> 2.0'
|
45
45
|
spec.add_runtime_dependency 'net-http-persistent', '~> 4.0'
|
46
46
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: parallel_report_portal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.1
|
4
|
+
version: 3.0.2.beta.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nigel Brookes-Thomas
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2024-01-
|
12
|
+
date: 2024-01-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: appraisal
|
@@ -177,14 +177,14 @@ dependencies:
|
|
177
177
|
requirements:
|
178
178
|
- - "~>"
|
179
179
|
- !ruby/object:Gem::Version
|
180
|
-
version: '
|
180
|
+
version: '2.0'
|
181
181
|
type: :runtime
|
182
182
|
prerelease: false
|
183
183
|
version_requirements: !ruby/object:Gem::Requirement
|
184
184
|
requirements:
|
185
185
|
- - "~>"
|
186
186
|
- !ruby/object:Gem::Version
|
187
|
-
version: '
|
187
|
+
version: '2.0'
|
188
188
|
- !ruby/object:Gem::Dependency
|
189
189
|
name: net-http-persistent
|
190
190
|
requirement: !ruby/object:Gem::Requirement
|