fastlane-plugin-test_center 3.8.0.parallelizing.beta.8 → 3.8.0.parallelizing.beta.9
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/lib/fastlane/plugin/test_center/actions/multi_scan.rb +30 -9
- data/lib/fastlane/plugin/test_center/actions/tests_from_xctestrun.rb +26 -3
- data/lib/fastlane/plugin/test_center/helper/multi_scan_manager/parallel_test_batch_worker.rb +7 -1
- data/lib/fastlane/plugin/test_center/helper/multi_scan_manager/retrying_scan_helper.rb +16 -0
- data/lib/fastlane/plugin/test_center/helper/multi_scan_manager/runner.rb +21 -9
- data/lib/fastlane/plugin/test_center/helper/multi_scan_manager/test_batch_worker.rb +3 -1
- data/lib/fastlane/plugin/test_center/helper/scan_helper.rb +37 -1
- data/lib/fastlane/plugin/test_center/helper/test_collector.rb +3 -0
- data/lib/fastlane/plugin/test_center/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f77fa973e751d52ce7fa63397e48ec3a2e9592d5
|
4
|
+
data.tar.gz: a0a0c9ea893833e04ddc526bc52bb7563d007d5d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c1c924695fbd1e9f3f531266171c584c10012d7b5b4979b89383ad02b7ed3d19a7dc2f0e5a6e9cff7572d11608d2a56dcbb0879ce6b0f89ebdc68e7c8c5ff0d0
|
7
|
+
data.tar.gz: 5bfb8bbceee4dd66010437d77292f612efa78a2d2529edccb805faeff4ec4b5c72a12354d0349ad45ee31ab23f645329fb49ececa1bc298f713ea88069dbbdbc
|
@@ -21,13 +21,10 @@ module Fastlane
|
|
21
21
|
runner_options = params.values.merge(platform: platform)
|
22
22
|
runner = ::TestCenter::Helper::MultiScanManager::Runner.new(runner_options)
|
23
23
|
tests_passed = runner.run
|
24
|
-
if params[:fail_build] && !tests_passed
|
25
|
-
raise UI.test_failure!('Tests have failed')
|
26
|
-
end
|
27
24
|
|
28
25
|
summary = run_summary(params, tests_passed, runner.retry_total_count)
|
29
26
|
print_run_summary(summary)
|
30
|
-
|
27
|
+
|
31
28
|
if params[:fail_build] && !tests_passed
|
32
29
|
raise UI.test_failure!('Tests have failed')
|
33
30
|
end
|
@@ -103,6 +100,9 @@ module Fastlane
|
|
103
100
|
end
|
104
101
|
|
105
102
|
def self.prepare_for_testing(scan_options)
|
103
|
+
reset_scan_config_to_defaults
|
104
|
+
use_scanfile_to_override_settings(scan_options)
|
105
|
+
ScanHelper.remove_preexisting_simulator_logs(scan_options)
|
106
106
|
if scan_options[:test_without_building] || scan_options[:skip_build]
|
107
107
|
UI.verbose("Preparing Scan config options for multi_scan testing")
|
108
108
|
prepare_scan_config(scan_options)
|
@@ -112,10 +112,34 @@ module Fastlane
|
|
112
112
|
end
|
113
113
|
end
|
114
114
|
|
115
|
+
def self.reset_scan_config_to_defaults
|
116
|
+
return unless Scan.config
|
117
|
+
|
118
|
+
defaults = Hash[Fastlane::Actions::ScanAction.available_options.map { |i| [i.key, i.default_value] }]
|
119
|
+
FastlaneCore::UI.verbose("MultiScanAction resetting Scan config to defaults")
|
120
|
+
|
121
|
+
Scan.config._values.each do |k,v|
|
122
|
+
Scan.config.set(k, defaults[k]) if defaults.key?(k)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def self.use_scanfile_to_override_settings(scan_options)
|
127
|
+
overridden_options = ScanHelper.options_from_configuration_file(
|
128
|
+
ScanHelper.scan_options_from_multi_scan_options(scan_options)
|
129
|
+
)
|
130
|
+
|
131
|
+
unless overridden_options.empty?
|
132
|
+
FastlaneCore::UI.important("Scanfile found: overriding multi_scan options with it's values.")
|
133
|
+
overridden_options.each do |k,v|
|
134
|
+
scan_options[k] = v
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
115
139
|
def self.prepare_scan_config(scan_options)
|
116
140
|
Scan.config ||= FastlaneCore::Configuration.create(
|
117
141
|
Fastlane::Actions::ScanAction.available_options,
|
118
|
-
|
142
|
+
ScanHelper.scan_options_from_multi_scan_options(scan_options)
|
119
143
|
)
|
120
144
|
end
|
121
145
|
|
@@ -133,12 +157,9 @@ module Fastlane
|
|
133
157
|
end
|
134
158
|
|
135
159
|
def self.prepare_scan_options_for_build_for_testing(scan_options)
|
136
|
-
valid_scan_keys = Fastlane::Actions::ScanAction.available_options.map(&:key)
|
137
|
-
scan_options = scan_options.select { |k,v| %i[project workspace scheme device devices].include?(k) }
|
138
|
-
|
139
160
|
Scan.config = FastlaneCore::Configuration.create(
|
140
161
|
Fastlane::Actions::ScanAction.available_options,
|
141
|
-
scan_options.merge(build_for_testing: true)
|
162
|
+
ScanHelper.scan_options_from_multi_scan_options(scan_options.merge(build_for_testing: true))
|
142
163
|
)
|
143
164
|
values = Scan.config.values(ask: false)
|
144
165
|
values[:xcode_path] = File.expand_path("../..", FastlaneCore::Helper.xcode_path)
|
@@ -18,10 +18,12 @@ module Fastlane
|
|
18
18
|
xctest_path = xctest_bundle_path(xctestrun_rootpath, xctestrun_config)
|
19
19
|
test_identifiers = XCTestList.tests(xctest_path)
|
20
20
|
UI.verbose("Found the following tests: #{test_identifiers.join("\n\t")}")
|
21
|
+
|
21
22
|
if xctestrun_config.key?('SkipTestIdentifiers')
|
22
|
-
|
23
|
-
|
24
|
-
|
23
|
+
test_identifiers = subtract_skipped_tests_from_test_identifiers(
|
24
|
+
test_identifiers,
|
25
|
+
xctestrun_config['SkipTestIdentifiers']
|
26
|
+
)
|
25
27
|
end
|
26
28
|
if test_identifiers.empty? && !invocation_based_tests
|
27
29
|
UI.error("No tests found in '#{xctest_path}'!")
|
@@ -34,6 +36,27 @@ module Fastlane
|
|
34
36
|
tests
|
35
37
|
end
|
36
38
|
|
39
|
+
def self.subtract_skipped_tests_from_test_identifiers(test_identifiers, skipped_test_identifiers)
|
40
|
+
skipped_tests_identifiers = []
|
41
|
+
skipped_testsuites = []
|
42
|
+
skipped_test_identifiers.each do |skipped_test|
|
43
|
+
if skipped_test.split('/').size > 1
|
44
|
+
skipped_tests_identifiers << skipped_test
|
45
|
+
else
|
46
|
+
skipped_testsuites << skipped_test
|
47
|
+
end
|
48
|
+
end
|
49
|
+
skipped_testsuites.each do |skipped_testsuite|
|
50
|
+
derived_skipped_tests = test_identifiers.select do |test_identifier|
|
51
|
+
test_identifier.start_with?(skipped_testsuite)
|
52
|
+
end
|
53
|
+
skipped_tests_identifiers.concat(derived_skipped_tests)
|
54
|
+
end
|
55
|
+
|
56
|
+
UI.verbose("Removing skipped tests: #{skipped_tests_identifiers.join("\n\t")}")
|
57
|
+
test_identifiers.reject { |test_identifier| skipped_tests_identifiers.include?(test_identifier) }
|
58
|
+
end
|
59
|
+
|
37
60
|
def self.xctest_bundle_path(xctestrun_rootpath, xctestrun_config)
|
38
61
|
xctest_host_path = xctestrun_config['TestHostPath'].sub('__TESTROOT__', xctestrun_rootpath)
|
39
62
|
xctestrun_config['TestBundlePath'].sub('__TESTHOST__', xctest_host_path).sub('__TESTROOT__', xctestrun_rootpath)
|
data/lib/fastlane/plugin/test_center/helper/multi_scan_manager/parallel_test_batch_worker.rb
CHANGED
@@ -34,7 +34,8 @@ module TestCenter
|
|
34
34
|
print line
|
35
35
|
end
|
36
36
|
state = :ready_to_work
|
37
|
-
|
37
|
+
|
38
|
+
@options[:test_batch_results] << (@reader.gets.chomp.to_s == 'true')
|
38
39
|
end
|
39
40
|
|
40
41
|
def run(run_options)
|
@@ -50,6 +51,7 @@ module TestCenter
|
|
50
51
|
puts e.message
|
51
52
|
puts e.backtrace.inspect
|
52
53
|
ensure
|
54
|
+
print_final_results(tests_passed)
|
53
55
|
handle_child_process_results(tests_passed)
|
54
56
|
exit!
|
55
57
|
end
|
@@ -57,6 +59,10 @@ module TestCenter
|
|
57
59
|
close_parent_process_writer
|
58
60
|
end
|
59
61
|
|
62
|
+
def print_final_results(tests_passed)
|
63
|
+
FastlaneCore::UI.verbose("All tests passed for batch #{@options[:batch_index] + 1}? #{tests_passed}")
|
64
|
+
end
|
65
|
+
|
60
66
|
def open_interprocess_communication
|
61
67
|
# This is performed in the Parent process in preparation to setup
|
62
68
|
# the STDOUT and STDOUT for printing messages from the Child process
|
@@ -94,6 +94,8 @@ module TestCenter
|
|
94
94
|
# after_testrun methods
|
95
95
|
|
96
96
|
def after_testrun(exception = nil)
|
97
|
+
move_simulator_logs_for_next_run
|
98
|
+
|
97
99
|
@testrun_count = @testrun_count + 1
|
98
100
|
if exception.kind_of?(FastlaneCore::Interface::FastlaneTestFailure)
|
99
101
|
after_testrun_message = "Scan found failing tests"
|
@@ -267,6 +269,19 @@ module TestCenter
|
|
267
269
|
test_session_last_messages = test_session.read
|
268
270
|
end
|
269
271
|
|
272
|
+
def move_simulator_logs_for_next_run
|
273
|
+
return unless @options[:include_simulator_logs]
|
274
|
+
|
275
|
+
glob_pattern = "#{output_directory}/system_logs-*.{log,logarchive}"
|
276
|
+
logs = Dir.glob(glob_pattern)
|
277
|
+
logs.each do |log_filepath|
|
278
|
+
new_logname = "try-#{testrun_count}-#{File.basename(log_filepath)}"
|
279
|
+
new_log_filepath = "#{File.dirname(log_filepath)}/#{new_logname}"
|
280
|
+
FastlaneCore::UI.verbose("Moving simulator log '#{log_filepath}' to '#{new_log_filepath}'")
|
281
|
+
File.rename(log_filepath, new_log_filepath)
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
270
285
|
def move_test_result_bundle_for_next_run
|
271
286
|
return unless @options[:result_bundle]
|
272
287
|
|
@@ -279,6 +294,7 @@ module TestCenter
|
|
279
294
|
dst_test_bundle_parent_dir = File.dirname(src_test_bundle)
|
280
295
|
dst_test_bundle_basename = File.basename(src_test_bundle, '.test_result')
|
281
296
|
dst_test_bundle = "#{dst_test_bundle_parent_dir}/#{dst_test_bundle_basename}-#{@testrun_count}.test_result"
|
297
|
+
FastlaneCore::UI.verbose("Moving test_result '#{src_test_bundle}' to '#{dst_test_bundle}'")
|
282
298
|
File.rename(src_test_bundle, dst_test_bundle)
|
283
299
|
end
|
284
300
|
end
|
@@ -40,19 +40,28 @@ module TestCenter
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def run
|
43
|
+
ScanHelper.remove_preexisting_simulator_logs(@options)
|
43
44
|
remove_preexisting_test_result_bundles
|
44
45
|
|
45
46
|
tests_passed = false
|
46
|
-
if
|
47
|
-
tests_passed =
|
47
|
+
if should_run_tests_through_single_try?
|
48
|
+
tests_passed = run_tests_through_single_try
|
48
49
|
end
|
49
50
|
|
50
51
|
unless tests_passed || @options[:try_count] < 1
|
51
52
|
setup_testcollector
|
52
|
-
run_test_batches
|
53
|
+
tests_passed = run_test_batches
|
53
54
|
end
|
55
|
+
tests_passed
|
54
56
|
end
|
55
57
|
|
58
|
+
def should_run_tests_through_single_try?
|
59
|
+
should_run_for_invocation_tests = @options[:invocation_based_tests] && @options[:only_testing].nil?
|
60
|
+
should_run_for_skip_build = @options[:skip_build]
|
61
|
+
(should_run_for_invocation_tests || should_run_for_skip_build)
|
62
|
+
end
|
63
|
+
|
64
|
+
|
56
65
|
def remove_preexisting_test_result_bundles
|
57
66
|
return unless @options[:result_bundle]
|
58
67
|
|
@@ -67,9 +76,11 @@ module TestCenter
|
|
67
76
|
end
|
68
77
|
end
|
69
78
|
|
70
|
-
def
|
79
|
+
def run_tests_through_single_try
|
71
80
|
FastlaneCore::UI.verbose("Running invocation tests")
|
72
|
-
|
81
|
+
if @options[:invocation_based_tests]
|
82
|
+
@options[:skip_testing] = @options[:skip_testing]&.map(&:strip_testcase)&.uniq
|
83
|
+
end
|
73
84
|
@options[:output_directory] = output_directory
|
74
85
|
@options[:destination] = Scan.config[:destination]
|
75
86
|
|
@@ -94,13 +105,13 @@ module TestCenter
|
|
94
105
|
junit: File.absolute_path(report_filepath)
|
95
106
|
}
|
96
107
|
)
|
97
|
-
@options[:only_testing] =
|
108
|
+
@options[:only_testing] = retrieve_failed_single_try_tests
|
98
109
|
@options[:only_testing] = @options[:only_testing].map(&:strip_testcase).uniq
|
99
110
|
|
100
111
|
tests_passed
|
101
112
|
end
|
102
113
|
|
103
|
-
def
|
114
|
+
def retrieve_failed_single_try_tests
|
104
115
|
reportnamer = ReportNameHelper.new(
|
105
116
|
@options[:output_types],
|
106
117
|
@options[:output_files],
|
@@ -113,7 +124,7 @@ module TestCenter
|
|
113
124
|
junit: File.absolute_path(report_filepath)
|
114
125
|
}
|
115
126
|
)
|
116
|
-
Fastlane::Actions::TestsFromJunitAction.run(config)
|
127
|
+
Fastlane::Actions::TestsFromJunitAction.run(config)[:failed]
|
117
128
|
end
|
118
129
|
|
119
130
|
def run_test_batches
|
@@ -133,7 +144,8 @@ module TestCenter
|
|
133
144
|
end
|
134
145
|
pool.wait_for_all_workers
|
135
146
|
collate_batched_reports
|
136
|
-
|
147
|
+
FastlaneCore::UI.verbose("Results for each test run: #{test_batch_results}")
|
148
|
+
test_batch_results.all?
|
137
149
|
end
|
138
150
|
|
139
151
|
def scan_options_for_worker(test_batch, batch_index)
|
@@ -15,8 +15,10 @@ module TestCenter
|
|
15
15
|
|
16
16
|
def run(run_options)
|
17
17
|
self.state = :working
|
18
|
-
|
18
|
+
test_batch_worker_final_result = RetryingScan.run(@options.merge(run_options))
|
19
|
+
@options[:test_batch_results] << test_batch_worker_final_result
|
19
20
|
self.state = :ready_to_work
|
21
|
+
test_batch_worker_final_result
|
20
22
|
end
|
21
23
|
end
|
22
24
|
end
|
@@ -10,4 +10,40 @@ module ScanHelper
|
|
10
10
|
)
|
11
11
|
# :nocov:
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
|
+
def self.remove_preexisting_simulator_logs(params)
|
15
|
+
return unless params[:include_simulator_logs]
|
16
|
+
|
17
|
+
output_directory = File.absolute_path(params.fetch(:output_directory, 'test_results'))
|
18
|
+
|
19
|
+
glob_pattern = "#{output_directory}/**/system_logs-*.{log,logarchive}"
|
20
|
+
logs = Dir.glob(glob_pattern)
|
21
|
+
FileUtils.rm_rf(logs)
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.scan_options_from_multi_scan_options(params)
|
25
|
+
valid_scan_keys = Fastlane::Actions::ScanAction.available_options.map(&:key)
|
26
|
+
params.select { |k,v| valid_scan_keys.include?(k) }
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.options_from_configuration_file(params)
|
30
|
+
config = FastlaneCore::Configuration.create(
|
31
|
+
Fastlane::Actions::ScanAction.available_options,
|
32
|
+
params
|
33
|
+
)
|
34
|
+
config_file = config.load_configuration_file(Scan.scanfile_name, nil, true)
|
35
|
+
|
36
|
+
overridden_options = config_file ? config_file.options : {}
|
37
|
+
|
38
|
+
FastlaneCore::Project.detect_projects(config)
|
39
|
+
project = FastlaneCore::Project.new(config)
|
40
|
+
|
41
|
+
imported_path = File.expand_path(Scan.scanfile_name)
|
42
|
+
Dir.chdir(File.expand_path("..", project.path)) do
|
43
|
+
config_file = config.load_configuration_file(Scan.scanfile_name, nil, true) unless File.expand_path(Scan.scanfile_name) == imported_path
|
44
|
+
overridden_options.merge!(config_file.options) if config_file
|
45
|
+
end
|
46
|
+
overridden_options
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
@@ -16,6 +16,9 @@ module TestCenter
|
|
16
16
|
FastlaneCore::UI.user_error!("Error: cannot find xctestrun file '#{@xctestrun_path}'")
|
17
17
|
end
|
18
18
|
@only_testing = options[:only_testing]
|
19
|
+
if @only_testing.kind_of?(String)
|
20
|
+
@only_testing = @only_testing.split(',')
|
21
|
+
end
|
19
22
|
@skip_testing = options[:skip_testing]
|
20
23
|
@invocation_based_tests = options[:invocation_based_tests]
|
21
24
|
@batch_count = options[:batch_count]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane-plugin-test_center
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.8.0.parallelizing.beta.
|
4
|
+
version: 3.8.0.parallelizing.beta.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lyndsey Ferguson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-08-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 1.1.
|
61
|
+
version: 1.1.8
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 1.1.
|
68
|
+
version: 1.1.8
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: colorize
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|