fastlane-plugin-test_center 3.7.0 → 3.8.0.parallelizing.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 +4 -4
- data/README.md +71 -6
- data/lib/fastlane/plugin/test_center/actions/collate_html_reports.rb +2 -0
- data/lib/fastlane/plugin/test_center/actions/collate_json_reports.rb +2 -0
- data/lib/fastlane/plugin/test_center/actions/collate_junit_reports.rb +2 -1
- data/lib/fastlane/plugin/test_center/actions/collate_test_result_bundles.rb +2 -0
- data/lib/fastlane/plugin/test_center/actions/multi_scan.rb +127 -32
- data/lib/fastlane/plugin/test_center/actions/quit_core_simulator_service.rb +40 -0
- data/lib/fastlane/plugin/test_center/actions/suppress_tests.rb +2 -0
- data/lib/fastlane/plugin/test_center/actions/suppress_tests_from_junit.rb +3 -1
- data/lib/fastlane/plugin/test_center/actions/suppressed_tests.rb +2 -0
- data/lib/fastlane/plugin/test_center/actions/tests_from_junit.rb +2 -0
- data/lib/fastlane/plugin/test_center/actions/tests_from_xctestrun.rb +2 -0
- data/lib/fastlane/plugin/test_center/helper/multi_scan_manager/device_manager.rb +30 -0
- data/lib/fastlane/plugin/test_center/helper/multi_scan_manager/parallel_test_batch_worker.rb +73 -0
- data/lib/fastlane/plugin/test_center/helper/multi_scan_manager/report_collator.rb +129 -0
- data/lib/fastlane/plugin/test_center/helper/multi_scan_manager/retrying_scan.rb +77 -0
- data/lib/fastlane/plugin/test_center/helper/multi_scan_manager/retrying_scan_helper.rb +272 -0
- data/lib/fastlane/plugin/test_center/helper/multi_scan_manager/runner.rb +109 -0
- data/lib/fastlane/plugin/test_center/helper/multi_scan_manager/simulator_helper.rb +49 -0
- data/lib/fastlane/plugin/test_center/helper/multi_scan_manager/test_batch_worker.rb +24 -0
- data/lib/fastlane/plugin/test_center/helper/multi_scan_manager/test_batch_worker_pool.rb +133 -0
- data/lib/fastlane/plugin/test_center/helper/multi_scan_manager.rb +3 -0
- data/lib/fastlane/plugin/test_center/helper/reportname_helper.rb +15 -6
- data/lib/fastlane/plugin/test_center/helper/test_collector.rb +55 -14
- data/lib/fastlane/plugin/test_center/helper/xctestrun_info.rb +42 -0
- data/lib/fastlane/plugin/test_center/version.rb +1 -1
- data/lib/fastlane/plugin/test_center.rb +1 -1
- metadata +22 -11
- data/lib/fastlane/plugin/test_center/helper/correcting_scan_helper.rb +0 -315
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e0d83a81d13511c8798b43c1b458e6619d94c786
|
4
|
+
data.tar.gz: '048f7bc9d0465b5fba70b682271b6d5952e88963'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2e7c925081b38580cb7efe949c689963f44368db7f92a73ad5c1eec497aed23c17ec3416afd5e57578277359899989c2cd700a26a79f6c1a14ae455ab4ac2f31
|
7
|
+
data.tar.gz: 4434d5b5502c17a6fe3b3c70fcba0a39a03212479c331b10a0deb6780a243ec1b5fa9c147d5b8d70a7f0bb55c17d1737a34e5d1fcec28d7c89673169b7d9ee69
|
data/README.md
CHANGED
@@ -184,16 +184,41 @@ multi_scan(
|
|
184
184
|
|
185
185
|
```ruby
|
186
186
|
|
187
|
+
UI.important(
|
188
|
+
'example: ' \
|
189
|
+
'multi_scan also works with invocation based tests.'
|
190
|
+
)
|
191
|
+
Dir.chdir('../AtomicBoy') do
|
192
|
+
bundle_install
|
193
|
+
cocoapods(podfile: File.absolute_path('Podfile'))
|
194
|
+
multi_scan(
|
195
|
+
workspace: File.absolute_path('AtomicBoy.xcworkspace'),
|
196
|
+
scheme: 'KiwiBoy',
|
197
|
+
try_count: 3,
|
198
|
+
clean: true,
|
199
|
+
invocation_based_tests: true,
|
200
|
+
fail_build: false
|
201
|
+
)
|
202
|
+
end
|
203
|
+
|
204
|
+
```
|
205
|
+
|
206
|
+
```ruby
|
207
|
+
|
187
208
|
UI.important(
|
188
209
|
'example: ' \
|
189
210
|
'use the :workspace parameter instead of the :project parameter to find, ' \
|
190
211
|
'build, and test the iOS app.'
|
191
212
|
)
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
213
|
+
begin
|
214
|
+
multi_scan(
|
215
|
+
workspace: File.absolute_path('../AtomicBoy/AtomicBoy.xcworkspace'),
|
216
|
+
scheme: 'AtomicBoy',
|
217
|
+
try_count: 3
|
218
|
+
)
|
219
|
+
rescue # anything
|
220
|
+
UI.error('Found real failing tests!')
|
221
|
+
end
|
197
222
|
|
198
223
|
```
|
199
224
|
|
@@ -226,7 +251,7 @@ multi_scan(
|
|
226
251
|
project: File.absolute_path('../AtomicBoy/AtomicBoy.xcodeproj'),
|
227
252
|
scheme: 'Professor',
|
228
253
|
try_count: 3,
|
229
|
-
|
254
|
+
output_files: 'atomic_report.xml',
|
230
255
|
output_types: 'junit',
|
231
256
|
fail_build: false
|
232
257
|
)
|
@@ -244,6 +269,7 @@ multi_scan(
|
|
244
269
|
workspace: File.absolute_path('../AtomicBoy/AtomicBoy.xcworkspace'),
|
245
270
|
scheme: 'AtomicBoy',
|
246
271
|
try_count: 3,
|
272
|
+
code_coverage: true,
|
247
273
|
only_testing: ['AtomicBoyTests'],
|
248
274
|
fail_build: false
|
249
275
|
)
|
@@ -265,6 +291,45 @@ multi_scan(
|
|
265
291
|
fail_build: false
|
266
292
|
)
|
267
293
|
|
294
|
+
```
|
295
|
+
|
296
|
+
```ruby
|
297
|
+
|
298
|
+
UI.important(
|
299
|
+
'example: ' \
|
300
|
+
'multi_scan parallelizes its test runs.'
|
301
|
+
)
|
302
|
+
multi_scan(
|
303
|
+
workspace: File.absolute_path('../AtomicBoy/AtomicBoy.xcworkspace'),
|
304
|
+
scheme: 'AtomicBoy',
|
305
|
+
try_count: 3,
|
306
|
+
parallel_testrun_count: 4,
|
307
|
+
fail_build: false
|
308
|
+
)
|
309
|
+
|
310
|
+
```
|
311
|
+
|
312
|
+
```ruby
|
313
|
+
|
314
|
+
UI.important(
|
315
|
+
'example: ' \
|
316
|
+
'use the :xctestrun parameter instead of the :project parameter to find, ' \
|
317
|
+
'build, and test the iOS app.'
|
318
|
+
)
|
319
|
+
Dir.mktmpdir do |derived_data_path|
|
320
|
+
project_path = File.absolute_path('../AtomicBoy/AtomicBoy.xcodeproj')
|
321
|
+
command = "bundle exec fastlane scan --build_for_testing true --project '#{project_path}' --derived_data_path #{derived_data_path} --scheme AtomicBoy"
|
322
|
+
`#{command}`
|
323
|
+
xctestrun_file = Dir.glob("#{derived_data_path}/Build/Products/AtomicBoy*.xctestrun").first
|
324
|
+
multi_scan(
|
325
|
+
scheme: 'AtomicBoy',
|
326
|
+
try_count: 3,
|
327
|
+
fail_build: false,
|
328
|
+
xctestrun: xctestrun_file,
|
329
|
+
test_without_building: true
|
330
|
+
)
|
331
|
+
end
|
332
|
+
|
268
333
|
```
|
269
334
|
<!-- multi_scan examples: end -->
|
270
335
|
</details>
|
@@ -159,6 +159,7 @@ module Fastlane
|
|
159
159
|
# @!group Documentation
|
160
160
|
#####################################################
|
161
161
|
|
162
|
+
# :nocov:
|
162
163
|
def self.description
|
163
164
|
"Combines and combines tests from multiple html report files"
|
164
165
|
end
|
@@ -227,6 +228,7 @@ module Fastlane
|
|
227
228
|
def self.category
|
228
229
|
:testing
|
229
230
|
end
|
231
|
+
# :nocov:
|
230
232
|
end
|
231
233
|
end
|
232
234
|
end
|
@@ -98,6 +98,7 @@ module Fastlane
|
|
98
98
|
# @!group Documentation
|
99
99
|
#####################################################
|
100
100
|
|
101
|
+
# :nocov:
|
101
102
|
def self.description
|
102
103
|
"Combines and combines tests from multiple json report files"
|
103
104
|
end
|
@@ -167,6 +168,7 @@ module Fastlane
|
|
167
168
|
def self.category
|
168
169
|
:testing
|
169
170
|
end
|
171
|
+
# :nocov:
|
170
172
|
end
|
171
173
|
end
|
172
174
|
end
|
@@ -147,7 +147,7 @@ module Fastlane
|
|
147
147
|
#####################################################
|
148
148
|
# @!group Documentation
|
149
149
|
#####################################################
|
150
|
-
|
150
|
+
# :nocov:
|
151
151
|
def self.description
|
152
152
|
"Combines and combines tests from multiple junit report files"
|
153
153
|
end
|
@@ -217,6 +217,7 @@ module Fastlane
|
|
217
217
|
def self.is_supported?(platform)
|
218
218
|
%i[ios mac].include?(platform)
|
219
219
|
end
|
220
|
+
# :nocov:
|
220
221
|
end
|
221
222
|
end
|
222
223
|
end
|
@@ -111,6 +111,7 @@ module Fastlane
|
|
111
111
|
# @!group Documentation
|
112
112
|
#####################################################
|
113
113
|
|
114
|
+
# :nocov:
|
114
115
|
def self.description
|
115
116
|
"Combines and combines tests from multiple test_result bundles"
|
116
117
|
end
|
@@ -179,6 +180,7 @@ module Fastlane
|
|
179
180
|
def self.is_supported?(platform)
|
180
181
|
%i[ios mac].include?(platform)
|
181
182
|
end
|
183
|
+
# :nocov:
|
182
184
|
end
|
183
185
|
end
|
184
186
|
end
|
@@ -5,29 +5,43 @@ module Fastlane
|
|
5
5
|
require 'shellwords'
|
6
6
|
require 'xctest_list'
|
7
7
|
require 'plist'
|
8
|
+
require_relative '../helper/multi_scan_manager/runner'
|
8
9
|
|
9
10
|
class MultiScanAction < Action
|
10
11
|
def self.run(params)
|
12
|
+
# :nocov:
|
11
13
|
unless Helper.test?
|
14
|
+
scan_keys = Fastlane::Actions::ScanAction.available_options.map(&:key)
|
12
15
|
FastlaneCore::PrintTable.print_values(
|
13
|
-
config: params._values.
|
16
|
+
config: params._values.reject { |k, _| scan_keys.include?(k) },
|
14
17
|
title: "Summary for multi_scan (test_center v#{Fastlane::TestCenter::VERSION})"
|
15
18
|
)
|
16
19
|
end
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
20
|
+
# :nocov:
|
21
|
+
force_quit_simulator_processes if params[:force_quit_simulator]
|
22
|
+
|
23
|
+
prepare_for_testing(params.values)
|
24
|
+
|
25
|
+
platform = :mac
|
26
|
+
platform = :ios if Scan.config[:destination].any? { |d| d.include?('platform=iOS Simulator') }
|
27
|
+
|
28
|
+
runner_options = params.values.merge(platform: platform)
|
29
|
+
runner = ::TestCenter::Helper::MultiScanManager::Runner.new(runner_options)
|
30
|
+
tests_passed = runner.run
|
31
|
+
if params[:fail_build] && !tests_passed
|
32
|
+
raise UI.test_failure!('Tests have failed')
|
21
33
|
end
|
22
|
-
|
23
|
-
|
24
|
-
|
34
|
+
|
35
|
+
summary = run_summary(params, tests_passed, runner.retry_total_count)
|
36
|
+
# :nocov:
|
25
37
|
unless Helper.test?
|
26
38
|
FastlaneCore::PrintTable.print_values(
|
27
39
|
config: summary,
|
28
40
|
title: "multi_scan results"
|
29
41
|
)
|
30
42
|
end
|
43
|
+
# :nocov:
|
44
|
+
|
31
45
|
if params[:fail_build] && !tests_passed
|
32
46
|
raise UI.test_failure!('Tests have failed')
|
33
47
|
end
|
@@ -80,33 +94,69 @@ module Fastlane
|
|
80
94
|
}
|
81
95
|
end
|
82
96
|
|
83
|
-
def self.
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
]
|
94
|
-
config = FastlaneCore::Configuration.create(
|
97
|
+
def self.prepare_for_testing(scan_options)
|
98
|
+
if scan_options[:test_without_building] || scan_options[:skip_build]
|
99
|
+
prepare_scan_config(scan_options)
|
100
|
+
else
|
101
|
+
build_for_testing(scan_options)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def self.prepare_scan_config(scan_options)
|
106
|
+
Scan.config ||= FastlaneCore::Configuration.create(
|
95
107
|
Fastlane::Actions::ScanAction.available_options,
|
96
|
-
scan_options.
|
108
|
+
scan_options.select { |k,v| %i[project workspace scheme device devices].include?(k) }
|
97
109
|
)
|
98
|
-
|
110
|
+
end
|
99
111
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
112
|
+
def self.build_for_testing(scan_options)
|
113
|
+
valid_scan_keys = Fastlane::Actions::ScanAction.available_options.map(&:key)
|
114
|
+
scan_options = scan_options.select { |k,v| %i[project workspace scheme device devices].include?(k) }
|
115
|
+
|
116
|
+
Scan.config = FastlaneCore::Configuration.create(
|
117
|
+
Fastlane::Actions::ScanAction.available_options,
|
118
|
+
scan_options.merge(build_for_testing: true)
|
119
|
+
)
|
120
|
+
values = Scan.config.values(ask: false)
|
121
|
+
values[:xcode_path] = File.expand_path("../..", FastlaneCore::Helper.xcode_path)
|
122
|
+
|
123
|
+
# :nocov:
|
124
|
+
unless Helper.test?
|
125
|
+
FastlaneCore::PrintTable.print_values(
|
126
|
+
config: values,
|
127
|
+
hide_keys: [:destination, :slack_url],
|
128
|
+
title: "Summary for scan #{Fastlane::VERSION}"
|
129
|
+
)
|
130
|
+
end
|
131
|
+
# :nocov:
|
132
|
+
|
133
|
+
Scan::Runner.new.run
|
134
|
+
remove_build_report_files
|
135
|
+
|
136
|
+
Scan.config._values.delete(:build_for_testing)
|
137
|
+
scan_options[:derived_data_path] = Scan.config[:derived_data_path]
|
138
|
+
end
|
139
|
+
|
140
|
+
def self.remove_build_report_files
|
141
|
+
report_options = Scan::XCPrettyReporterOptionsGenerator.generate_from_scan_config
|
142
|
+
output_files = report_options.instance_variable_get(:@output_files)
|
143
|
+
output_directory = report_options.instance_variable_get(:@output_directory)
|
144
|
+
|
145
|
+
output_files.each do |output_file|
|
146
|
+
FileUtils.rm_f(File.join(output_directory, output_file))
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
def self.force_quit_simulator_processes
|
151
|
+
# Silently execute and kill, verbose flags will show this command occurring
|
152
|
+
Fastlane::Actions.sh("killall Simulator &> /dev/null || true", log: false)
|
104
153
|
end
|
105
154
|
|
106
155
|
#####################################################
|
107
156
|
# @!group Documentation
|
108
157
|
#####################################################
|
109
158
|
|
159
|
+
# :nocov:
|
110
160
|
def self.description
|
111
161
|
"Uses scan to run Xcode tests a given number of times, with the option " \
|
112
162
|
"of batching them, only re-testing failing tests."
|
@@ -174,7 +224,7 @@ module Fastlane
|
|
174
224
|
FastlaneCore::ConfigItem.new(
|
175
225
|
key: :quit_simulators,
|
176
226
|
env_name: "FL_MULTI_SCAN_QUIT_SIMULATORS",
|
177
|
-
description: "If the simulators need to be killed before
|
227
|
+
description: "If the simulators need to be killed before running the tests",
|
178
228
|
type: Boolean,
|
179
229
|
is_string: false,
|
180
230
|
default_value: true,
|
@@ -187,6 +237,13 @@ module Fastlane
|
|
187
237
|
description: "Comma separated list of the output types (e.g. html, junit, json, json-compilation-database)",
|
188
238
|
default_value: "html,junit"
|
189
239
|
),
|
240
|
+
FastlaneCore::ConfigItem.new(
|
241
|
+
key: :parallel_testrun_count,
|
242
|
+
description: 'Run simulators each batch of tests and/or each test target in parallel on its own Simulator',
|
243
|
+
optional: true,
|
244
|
+
is_string: false,
|
245
|
+
default_value: 1
|
246
|
+
),
|
190
247
|
FastlaneCore::ConfigItem.new(
|
191
248
|
key: :testrun_completed_block,
|
192
249
|
description: 'A block invoked each time a test run completes',
|
@@ -259,6 +316,24 @@ module Fastlane
|
|
259
316
|
)
|
260
317
|
",
|
261
318
|
"
|
319
|
+
UI.important(
|
320
|
+
'example: ' \\
|
321
|
+
'multi_scan also works with invocation based tests.'
|
322
|
+
)
|
323
|
+
Dir.chdir('../AtomicBoy') do
|
324
|
+
bundle_install
|
325
|
+
cocoapods(podfile: File.absolute_path('Podfile'))
|
326
|
+
multi_scan(
|
327
|
+
workspace: File.absolute_path('AtomicBoy.xcworkspace'),
|
328
|
+
scheme: 'KiwiBoy',
|
329
|
+
try_count: 3,
|
330
|
+
clean: true,
|
331
|
+
invocation_based_tests: true,
|
332
|
+
fail_build: false
|
333
|
+
)
|
334
|
+
end
|
335
|
+
",
|
336
|
+
"
|
262
337
|
UI.important(
|
263
338
|
'example: ' \\
|
264
339
|
'use the :workspace parameter instead of the :project parameter to find, ' \\
|
@@ -336,16 +411,35 @@ module Fastlane
|
|
336
411
|
"
|
337
412
|
UI.important(
|
338
413
|
'example: ' \\
|
339
|
-
'multi_scan
|
414
|
+
'multi_scan parallelizes its test runs.'
|
340
415
|
)
|
341
|
-
cocoapods
|
342
416
|
multi_scan(
|
343
|
-
workspace: File.absolute_path('../
|
344
|
-
scheme: '
|
417
|
+
workspace: File.absolute_path('../AtomicBoy/AtomicBoy.xcworkspace'),
|
418
|
+
scheme: 'AtomicBoy',
|
345
419
|
try_count: 3,
|
346
|
-
|
420
|
+
parallel_testrun_count: 4,
|
347
421
|
fail_build: false
|
348
422
|
)
|
423
|
+
",
|
424
|
+
"
|
425
|
+
UI.important(
|
426
|
+
'example: ' \\
|
427
|
+
'use the :xctestrun parameter instead of the :project parameter to find, ' \\
|
428
|
+
'build, and test the iOS app.'
|
429
|
+
)
|
430
|
+
Dir.mktmpdir do |derived_data_path|
|
431
|
+
project_path = File.absolute_path('../AtomicBoy/AtomicBoy.xcodeproj')
|
432
|
+
command = \"bundle exec fastlane scan --build_for_testing true --project '\#{project_path}' --derived_data_path \#{derived_data_path} --scheme AtomicBoy\"
|
433
|
+
`\#{command}`
|
434
|
+
xctestrun_file = Dir.glob(\"\#{derived_data_path}/Build/Products/AtomicBoy*.xctestrun\").first
|
435
|
+
multi_scan(
|
436
|
+
scheme: 'AtomicBoy',
|
437
|
+
try_count: 3,
|
438
|
+
fail_build: false,
|
439
|
+
xctestrun: xctestrun_file,
|
440
|
+
test_without_building: true
|
441
|
+
)
|
442
|
+
end
|
349
443
|
"
|
350
444
|
]
|
351
445
|
end
|
@@ -361,6 +455,7 @@ module Fastlane
|
|
361
455
|
def self.is_supported?(platform)
|
362
456
|
%i[ios mac].include?(platform)
|
363
457
|
end
|
458
|
+
# :nocov:
|
364
459
|
end
|
365
460
|
end
|
366
461
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Fastlane
|
2
|
+
module Actions
|
3
|
+
class QuitCoreSimulatorServiceAction < Action
|
4
|
+
def self.run(params)
|
5
|
+
launchctl_list_count = 0
|
6
|
+
commands = []
|
7
|
+
while Actions.sh('launchctl list | grep com.apple.CoreSimulator.CoreSimulatorService || true', log: false) != ''
|
8
|
+
UI.crash!('Unable to quit com.apple.CoreSimulator.CoreSimulatorService after 10 tries') if (launchctl_list_count += 1) > 10
|
9
|
+
commands << Actions.sh('launchctl remove com.apple.CoreSimulator.CoreSimulatorService &> /dev/null || true', log: false)
|
10
|
+
UI.verbose('Waiting for com.apple.CoreSimulator.CoreSimulatorService to quit')
|
11
|
+
sleep(0.5)
|
12
|
+
end
|
13
|
+
commands
|
14
|
+
end
|
15
|
+
|
16
|
+
#####################################################
|
17
|
+
# @!group Documentation
|
18
|
+
#####################################################
|
19
|
+
|
20
|
+
# :nocov:
|
21
|
+
def self.description
|
22
|
+
"Force-quits the com.apple.CoreSimulator.CoreSimulatorService."
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.details
|
26
|
+
"Sometimes the com.apple.CoreSimulator.CoreSimulatorService can hang. " \
|
27
|
+
"Use this action to force-quit it."
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.authors
|
31
|
+
["lyndsey-ferguson/@lyndseydf"]
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.is_supported?(platform)
|
35
|
+
platform == :ios
|
36
|
+
end
|
37
|
+
# :nocov:
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -59,6 +59,7 @@ module Fastlane
|
|
59
59
|
# @!group Documentation
|
60
60
|
#####################################################
|
61
61
|
|
62
|
+
# :nocov:
|
62
63
|
def self.description
|
63
64
|
"Suppresses specific tests in a specific or all Xcode Schemes in a given project"
|
64
65
|
end
|
@@ -171,6 +172,7 @@ module Fastlane
|
|
171
172
|
def self.is_supported?(platform)
|
172
173
|
%i[ios mac].include?(platform)
|
173
174
|
end
|
175
|
+
# :nocov:
|
174
176
|
end
|
175
177
|
end
|
176
178
|
end
|
@@ -45,7 +45,8 @@ module Fastlane
|
|
45
45
|
#####################################################
|
46
46
|
# @!group Documentation
|
47
47
|
#####################################################
|
48
|
-
|
48
|
+
|
49
|
+
# :nocov:
|
49
50
|
def self.description
|
50
51
|
"Uses a junit xml report file to suppress either passing or failing tests in an Xcode Scheme"
|
51
52
|
end
|
@@ -135,6 +136,7 @@ module Fastlane
|
|
135
136
|
def self.is_supported?(platform)
|
136
137
|
%i[ios mac].include?(platform)
|
137
138
|
end
|
139
|
+
# :nocov:
|
138
140
|
end
|
139
141
|
end
|
140
142
|
end
|
@@ -52,6 +52,7 @@ module Fastlane
|
|
52
52
|
# @!group Documentation
|
53
53
|
#####################################################
|
54
54
|
|
55
|
+
# :nocov:
|
55
56
|
def self.description
|
56
57
|
"Retrieves a list of tests that are suppressed in a specific or all Xcode Schemes in a project"
|
57
58
|
end
|
@@ -139,6 +140,7 @@ module Fastlane
|
|
139
140
|
def self.is_supported?(platform)
|
140
141
|
%i[ios mac].include?(platform)
|
141
142
|
end
|
143
|
+
# :nocov:
|
142
144
|
end
|
143
145
|
end
|
144
146
|
end
|
@@ -32,6 +32,7 @@ module Fastlane
|
|
32
32
|
# @!group Documentation
|
33
33
|
#####################################################
|
34
34
|
|
35
|
+
# :nocov:
|
35
36
|
def self.description
|
36
37
|
"Retrieves the failing and passing tests as reported in a junit xml file"
|
37
38
|
end
|
@@ -82,6 +83,7 @@ module Fastlane
|
|
82
83
|
def self.is_supported?(platform)
|
83
84
|
%i[ios mac].include?(platform)
|
84
85
|
end
|
86
|
+
# :nocov:
|
85
87
|
end
|
86
88
|
end
|
87
89
|
end
|
@@ -47,6 +47,7 @@ module Fastlane
|
|
47
47
|
# @!group Documentation
|
48
48
|
#####################################################
|
49
49
|
|
50
|
+
# :nocov:
|
50
51
|
def self.description
|
51
52
|
"Retrieves all of the tests from xctest bundles referenced by the xctestrun file"
|
52
53
|
end
|
@@ -115,6 +116,7 @@ module Fastlane
|
|
115
116
|
def self.is_supported?(platform)
|
116
117
|
%i[ios mac].include?(platform)
|
117
118
|
end
|
119
|
+
# :nocov:
|
118
120
|
end
|
119
121
|
end
|
120
122
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module FastlaneCore
|
2
|
+
class DeviceManager
|
3
|
+
class Device
|
4
|
+
def clone
|
5
|
+
raise 'Can only clone iOS Simulators' unless self.is_simulator
|
6
|
+
Device.new(
|
7
|
+
name: self.name,
|
8
|
+
udid: `xcrun simctl clone #{self.udid} '#{self.name}'`.chomp,
|
9
|
+
os_type: self.os_type,
|
10
|
+
os_version: self.os_version,
|
11
|
+
state: self.state,
|
12
|
+
is_simulator: self.is_simulator
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
def rename(newname)
|
17
|
+
`xcrun simctl rename #{self.udid} '#{newname}'`
|
18
|
+
self.name = newname
|
19
|
+
end
|
20
|
+
|
21
|
+
def boot
|
22
|
+
`xcrun simctl boot #{self.udid}`
|
23
|
+
end
|
24
|
+
|
25
|
+
def shutdown
|
26
|
+
`xcrun simctl shutdown #{self.udid}` unless self.state == "Shutdown"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module TestCenter
|
2
|
+
module Helper
|
3
|
+
module MultiScanManager
|
4
|
+
class ParallelTestBatchWorker < TestBatchWorker
|
5
|
+
|
6
|
+
attr_reader :pid
|
7
|
+
|
8
|
+
def initialize(options)
|
9
|
+
super(options)
|
10
|
+
@pipe_endpoint = nil
|
11
|
+
end
|
12
|
+
|
13
|
+
def state=(new_state)
|
14
|
+
super(new_state)
|
15
|
+
end
|
16
|
+
|
17
|
+
def process_results
|
18
|
+
@pid = nil
|
19
|
+
File.foreach(@log_filepath) do |line|
|
20
|
+
puts "[worker #{@options[:batch_index]}] #{line}"
|
21
|
+
end
|
22
|
+
state = :ready_to_work
|
23
|
+
@options[:test_batch_results] << (@reader.gets == 'true')
|
24
|
+
end
|
25
|
+
|
26
|
+
def run(run_options)
|
27
|
+
self.state = :working
|
28
|
+
|
29
|
+
open_interprocess_communication
|
30
|
+
@pid = Process.fork do
|
31
|
+
tests_passed = false
|
32
|
+
begin
|
33
|
+
reroute_stdout_to_logfile
|
34
|
+
tests_passed = super(run_options)
|
35
|
+
ensure
|
36
|
+
handle_child_process_results(tests_passed)
|
37
|
+
exit!
|
38
|
+
end
|
39
|
+
end
|
40
|
+
close_parent_process_writer
|
41
|
+
end
|
42
|
+
|
43
|
+
def open_interprocess_communication
|
44
|
+
@reader, @writer = IO.pipe
|
45
|
+
@log_filepath = File.join(
|
46
|
+
Dir.mktmpdir,
|
47
|
+
"parallel-test-batch-#{@options[:batch_index]}.txt"
|
48
|
+
)
|
49
|
+
end
|
50
|
+
|
51
|
+
def reroute_stdout_to_logfile
|
52
|
+
@reader.close # we are now in the subprocess
|
53
|
+
@logfile = File.open(@log_filepath, 'w')
|
54
|
+
@logfile.sync = true
|
55
|
+
$stdout.reopen(@logfile)
|
56
|
+
$stderr.reopen(@logfile)
|
57
|
+
end
|
58
|
+
|
59
|
+
def handle_child_process_results(tests_passed)
|
60
|
+
@logfile.close
|
61
|
+
@writer.puts tests_passed.to_s
|
62
|
+
@writer.close
|
63
|
+
end
|
64
|
+
|
65
|
+
def close_parent_process_writer
|
66
|
+
@writer.close
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
|