parallel_report_portal 3.0.1 → 3.0.2.beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
|