fastlane-plugin-test_center 3.6.3.parallelizing.alpha.3 → 3.6.3.parallelizing.pre.alpha.pre.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/fastlane/plugin/test_center/actions/multi_scan.rb +24 -35
- data/lib/fastlane/plugin/test_center/actions/restart_core_simulator_service.rb +6 -7
- data/lib/fastlane/plugin/test_center/helper/multi_scan_manager/report_collator.rb +10 -12
- data/lib/fastlane/plugin/test_center/helper/multi_scan_manager/retrying_scan.rb +48 -11
- data/lib/fastlane/plugin/test_center/helper/multi_scan_manager/retrying_scan_helper.rb +21 -36
- data/lib/fastlane/plugin/test_center/helper/multi_scan_manager/runner.rb +64 -58
- data/lib/fastlane/plugin/test_center/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0b03566f2644f92ffde801c8d83a6bd009e59fd947437cf9b6ea26b737ae0996
|
4
|
+
data.tar.gz: 80d1d785126c154dfda7a2aee7ded8654bd58776746144550e7d37c863e126c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 481326edd2420e6cc1f5347c434b0089b32dc526e0e09a1279fd8131855771711fb8676a3251e5d3003bb7a35dcd6ba2cb1b505d62b482395fe06ec3df4e5f3b
|
7
|
+
data.tar.gz: f4360d6b14dda570832bba2b9c86e127beea79f83a23fd3e4c0730e017b2f51e6216c5b0fa4ccd688fc0acd1d01d5d0376718cae53f13f402477f7aa8054ed8e
|
@@ -15,9 +15,11 @@ module Fastlane
|
|
15
15
|
title: "Summary for multi_scan (test_center v#{Fastlane::TestCenter::VERSION})"
|
16
16
|
)
|
17
17
|
end
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
unless params[:test_without_building] || params[:skip_build]
|
19
|
+
build_for_testing(
|
20
|
+
params._values
|
21
|
+
)
|
22
|
+
end
|
21
23
|
runner = ::TestCenter::Helper::MultiScanManager::Runner.new(params.values)
|
22
24
|
tests_passed = runner.scan
|
23
25
|
if params[:fail_build] && !tests_passed
|
@@ -83,41 +85,28 @@ module Fastlane
|
|
83
85
|
}
|
84
86
|
end
|
85
87
|
|
86
|
-
def self.
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
88
|
+
def self.build_for_testing(scan_options)
|
89
|
+
options_to_remove = %i[
|
90
|
+
try_count
|
91
|
+
batch_count
|
92
|
+
output_files
|
93
|
+
parallelize
|
94
|
+
quit_simulators
|
95
|
+
testrun_completed_block
|
96
|
+
test_without_building
|
97
|
+
output_types
|
98
|
+
]
|
99
|
+
config = FastlaneCore::Configuration.create(
|
96
100
|
Fastlane::Actions::ScanAction.available_options,
|
97
|
-
scan_options.
|
101
|
+
scan_options.merge(build_for_testing: true).reject { |k, _| options_to_remove.include?(k) }
|
98
102
|
)
|
99
|
-
|
100
|
-
|
101
|
-
def self.build_for_testing(scan_options)
|
102
|
-
valid_scan_keys = Fastlane::Actions::ScanAction.available_options.map(&:key)
|
103
|
-
scan_options = scan_options.select { |k,v| valid_scan_keys.include?(k) }
|
104
|
-
|
105
|
-
Scan.config = FastlaneCore::Configuration.create(
|
106
|
-
Fastlane::Actions::ScanAction.available_options,
|
107
|
-
scan_options.merge(build_for_testing: true)
|
108
|
-
)
|
109
|
-
values = Scan.config.values(ask: false)
|
110
|
-
values[:xcode_path] = File.expand_path("../..", FastlaneCore::Helper.xcode_path)
|
111
|
-
FastlaneCore::PrintTable.print_values(
|
112
|
-
config: values,
|
113
|
-
hide_keys: [:destination, :slack_url],
|
114
|
-
title: "Summary for scan #{Fastlane::VERSION}"
|
115
|
-
)
|
116
|
-
Scan::Runner.new.run
|
117
|
-
remove_build_report_files
|
103
|
+
Fastlane::Actions::ScanAction.run(config)
|
104
|
+
remove_build_report_files
|
118
105
|
|
119
|
-
|
120
|
-
|
106
|
+
scan_options.merge!(
|
107
|
+
test_without_building: true,
|
108
|
+
derived_data_path: Scan.config[:derived_data_path]
|
109
|
+
).delete(:build_for_testing)
|
121
110
|
end
|
122
111
|
|
123
112
|
def self.remove_build_report_files
|
@@ -1,16 +1,15 @@
|
|
1
1
|
module Fastlane
|
2
2
|
module Actions
|
3
|
-
class
|
3
|
+
class RestartCoreSimulatorServiceAction < Action
|
4
4
|
def self.run(params)
|
5
5
|
launchctl_list_count = 0
|
6
|
-
commands = []
|
7
6
|
while Actions.sh('launchctl list | grep com.apple.CoreSimulator.CoreSimulatorService || true', log: false) != ''
|
8
7
|
UI.crash!('Unable to quit com.apple.CoreSimulator.CoreSimulatorService after 10 tries') if (launchctl_list_count += 1) > 10
|
9
|
-
commands << Actions.sh('launchctl
|
8
|
+
commands << Actions.sh('launchctl stop com.apple.CoreSimulator.CoreSimulatorService &> /dev/null || true', log: false)
|
10
9
|
UI.verbose('Waiting for com.apple.CoreSimulator.CoreSimulatorService to quit')
|
11
|
-
sleep(0.
|
10
|
+
sleep(0.25)
|
12
11
|
end
|
13
|
-
commands
|
12
|
+
commands << Actions.sh('launchctl start com.apple.CoreSimulator.CoreSimulatorService &> /dev/null || true', log: false)
|
14
13
|
end
|
15
14
|
|
16
15
|
#####################################################
|
@@ -18,12 +17,12 @@ module Fastlane
|
|
18
17
|
#####################################################
|
19
18
|
|
20
19
|
def self.description
|
21
|
-
"
|
20
|
+
"Restarts the com.apple.CoreSimulator.CoreSimulatorService."
|
22
21
|
end
|
23
22
|
|
24
23
|
def self.details
|
25
24
|
"Sometimes the com.apple.CoreSimulator.CoreSimulatorService can hang. " \
|
26
|
-
"Use this action to force-
|
25
|
+
"Use this action to force-restart it."
|
27
26
|
end
|
28
27
|
|
29
28
|
def self.authors
|
@@ -43,16 +43,15 @@ module TestCenter
|
|
43
43
|
glob = "#{@source_reports_directory_glob}/#{@reportnamer.junit_fileglob}"
|
44
44
|
report_files = sort_globbed_files(glob)
|
45
45
|
if report_files.size > 1
|
46
|
-
collated_file = File.absolute_path(File.join(@output_directory, @reportnamer.junit_reportname(@suffix)))
|
47
46
|
config = create_config(
|
48
47
|
CollateJunitReportsAction,
|
49
48
|
{
|
50
49
|
reports: report_files,
|
51
|
-
collated_report:
|
50
|
+
collated_report: File.absolute_path(File.join(@output_directory, @reportnamer.junit_reportname(@suffix)))
|
52
51
|
}
|
53
52
|
)
|
54
53
|
CollateJunitReportsAction.run(config)
|
55
|
-
|
54
|
+
delete_globbed_intermediatefiles("#{@source_reports_directory_glob}/#{@reportnamer.junit_numbered_fileglob}")
|
56
55
|
end
|
57
56
|
end
|
58
57
|
|
@@ -61,16 +60,15 @@ module TestCenter
|
|
61
60
|
|
62
61
|
report_files = sort_globbed_files("#{@source_reports_directory_glob}/#{@reportnamer.html_fileglob}")
|
63
62
|
if report_files.size > 1
|
64
|
-
collated_file = File.absolute_path(File.join(@output_directory, @reportnamer.html_reportname(@suffix)))
|
65
63
|
config = create_config(
|
66
64
|
CollateJunitReportsAction,
|
67
65
|
{
|
68
66
|
reports: report_files,
|
69
|
-
collated_report:
|
67
|
+
collated_report: File.absolute_path(File.join(@output_directory, @reportnamer.html_reportname(@suffix)))
|
70
68
|
}
|
71
69
|
)
|
72
70
|
CollateHtmlReportsAction.run(config)
|
73
|
-
|
71
|
+
delete_globbed_intermediatefiles("#{@source_reports_directory_glob}/#{@reportnamer.html_numbered_fileglob}")
|
74
72
|
end
|
75
73
|
end
|
76
74
|
|
@@ -78,17 +76,17 @@ module TestCenter
|
|
78
76
|
return unless @reportnamer.includes_json?
|
79
77
|
|
80
78
|
report_files = sort_globbed_files("#{@source_reports_directory_glob}/#{@reportnamer.json_fileglob}")
|
79
|
+
|
81
80
|
if report_files.size > 1
|
82
|
-
collated_file = File.absolute_path(File.join(@output_directory, @reportnamer.json_reportname(@suffix)))
|
83
81
|
config = create_config(
|
84
82
|
CollateJsonReportsAction,
|
85
83
|
{
|
86
84
|
reports: report_files,
|
87
|
-
collated_report:
|
85
|
+
collated_report: File.absolute_path(File.join(@output_directory, @reportnamer.json_reportname(@suffix)))
|
88
86
|
}
|
89
87
|
)
|
90
88
|
CollateJsonReportsAction.run(config)
|
91
|
-
|
89
|
+
delete_globbed_intermediatefiles("#{@source_reports_directory_glob}/#{@reportnamer.json_numbered_fileglob}")
|
92
90
|
end
|
93
91
|
end
|
94
92
|
|
@@ -96,17 +94,17 @@ module TestCenter
|
|
96
94
|
return unless @result_bundle
|
97
95
|
|
98
96
|
test_result_bundlepaths = sort_globbed_files("#{@source_reports_directory_glob}/#{@scheme}*.test_result")
|
97
|
+
|
99
98
|
if test_result_bundlepaths.size > 1
|
100
|
-
collated_test_result_bundlepath = File.absolute_path("#{File.join(@output_directory, @scheme)}.test_result'")
|
101
99
|
config = create_config(
|
102
100
|
CollateTestResultBundlesAction,
|
103
101
|
{
|
104
102
|
bundles: test_result_bundlepaths,
|
105
|
-
collated_bundle:
|
103
|
+
collated_bundle: "#{File.join(@output_directory, @scheme)}.test_result'"
|
106
104
|
}
|
107
105
|
)
|
108
106
|
CollateTestResultBundlesAction.run(config)
|
109
|
-
|
107
|
+
delete_globbed_intermediatefiles("#{@source_reports_directory_glob}/#{@scheme}-[1-9]*.test_result")
|
110
108
|
end
|
111
109
|
end
|
112
110
|
end
|
@@ -1,14 +1,26 @@
|
|
1
1
|
module TestCenter
|
2
2
|
module Helper
|
3
3
|
module MultiScanManager
|
4
|
-
|
5
4
|
class RetryingScan
|
6
5
|
def initialize(options = {})
|
7
6
|
@options = options
|
8
7
|
@retrying_scan_helper = RetryingScanHelper.new(options)
|
9
8
|
end
|
10
9
|
|
10
|
+
def delete_xcresults
|
11
|
+
derived_data_path = File.expand_path(scan_config[:derived_data_path])
|
12
|
+
xcresults = Dir.glob("#{derived_data_path}/Logs/Test/*.xcresult")
|
13
|
+
FastlaneCore::UI.message("Deleting xcresults: #{xcresults}")
|
14
|
+
FileUtils.rm_rf(xcresults)
|
15
|
+
end
|
16
|
+
|
11
17
|
def scan_config
|
18
|
+
if Scan.config.nil?
|
19
|
+
Scan.config = FastlaneCore::Configuration.create(
|
20
|
+
Fastlane::Actions::ScanAction.available_options,
|
21
|
+
@options.select { |k,v| %i[project workspace scheme].include?(k) }
|
22
|
+
)
|
23
|
+
end
|
12
24
|
Scan.config
|
13
25
|
end
|
14
26
|
|
@@ -17,26 +29,38 @@ module TestCenter
|
|
17
29
|
scan_options = @options.select { |k,v| valid_scan_keys.include?(k) }
|
18
30
|
.merge(@retrying_scan_helper.scan_options)
|
19
31
|
|
32
|
+
sc = scan_config
|
20
33
|
scan_options.each do |k,v|
|
21
|
-
|
34
|
+
sc.set(k,v) unless v.nil?
|
22
35
|
end
|
23
36
|
end
|
24
37
|
|
25
38
|
def run
|
39
|
+
update_scan_options
|
40
|
+
delete_xcresults
|
41
|
+
|
26
42
|
try_count = @options[:try_count] || 1
|
27
43
|
begin
|
28
|
-
# TODO move delete_xcresults to `before_testrun`
|
29
44
|
@retrying_scan_helper.before_testrun
|
30
|
-
|
45
|
+
|
31
46
|
|
32
|
-
values = scan_config.values(ask: false)
|
33
|
-
values[:xcode_path] = File.expand_path("../..", FastlaneCore::Helper.xcode_path)
|
34
|
-
FastlaneCore::PrintTable.print_values(
|
35
|
-
config: values,
|
36
|
-
hide_keys: [:destination, :slack_url],
|
37
|
-
title: "Summary for scan #{Fastlane::VERSION}"
|
38
|
-
) unless FastlaneCore::Helper.test?
|
39
47
|
|
48
|
+
# TODO: Investigate the following error:
|
49
|
+
"""
|
50
|
+
2019-05-09 13:32:40.707 xcodebuild[78535:1944070] [MT] DVTAssertions: Warning in /Library/Caches/com.apple.xbs/Sources/IDEFrameworks_Fall2018/IDEFrameworks-14460.46/IDEFoundation/ProjectModel/ActionRecords/IDESchemeActionTestAttachment.m:186
|
51
|
+
Details: Error writing attachment data to file /Users/lyndsey.ferguson/Library/Developer/Xcode/DerivedData/AtomicBoy-flqqvvvzbouqymbyffgdbtjoiufr/Logs/Test/Test-Transient Testing-2019.05.09_13-32-08--0400.xcresult/1_Test/Attachments/Screenshot_E0AE7940-E7F4-4CA8-BB2B-8822D730D10F.jpg: Error Domain=NSCocoaErrorDomain Code=4 \"The folder “Screenshot_E0AE7940-E7F4-4CA8-BB2B-8822D730D10F.jpg” doesn’t exist.\" UserInfo={NSFilePath=/Users/lyndsey.ferguson/Library/Developer/Xcode/DerivedData/AtomicBoy-flqqvvvzbouqymbyffgdbtjoiufr/Logs/Test/Test-Transient Testing-2019.05.09_13-32-08--0400.xcresult/1_Test/Attachments/Screenshot_E0AE7940-E7F4-4CA8-BB2B-8822D730D10F.jpg, NSUserStringVariant=Folder, NSUnderlyingError=0x7fa6ef34ef90 {Error Domain=NSPOSIXErrorDomain Code=2 \"No such file or directory\"}}
|
52
|
+
Object: <IDESchemeActionTestAttachment: 0x7fa6ef22d270>
|
53
|
+
Method: -_savePayload:
|
54
|
+
Thread: <NSThread: 0x7fa6ea516110>{number = 1, name = main}
|
55
|
+
Please file a bug at https://bugreport.apple.com with this warning message and any useful information you can provide.
|
56
|
+
|
57
|
+
It may be due to:
|
58
|
+
2019-05-09 14:17:30.933 xcodebuild[86893:2045058] IDETestOperationsObserverDebug: Failed to move logarchive from /Users/lyndsey.ferguson/Library/Developer/CoreSimulator/Devices/0D312041-2D60-4221-94CC-3B0040154D74/data/tmp/test-session-systemlogs-2019.05.09_14-17-04--0400.logarchive to diagnostics location /Users/lyndsey.ferguson/Library/Developer/Xcode/DerivedData/AtomicBoy-flqqvvvzbouqymbyffgdbtjoiufr/Logs/Test/Test-Transient Testing-2019.05.09_14-17-04--0400.xcresult/1_Test/Diagnostics/iPhone 5s_0D312041-2D60-4221-94CC-3B0040154D74/test-session-systemlogs-2019.05.09_14-17-04--0400.logarchive: Error Domain=NSCocoaErrorDomain Code=4 \"“test-session-systemlogs-2019.05.09_14-17-04--0400.logarchive” couldn’t be moved to “iPhone 5s_0D312041-2D60-4221-94CC-3B0040154D74” because either the former doesn’t exist, or the folder containing the latter doesn’t exist.\" UserInfo={NSSourceFilePathErrorKey=/Users/lyndsey.ferguson/Library/Developer/CoreSimulator/Devices/0D312041-2D60-4221-94CC-3B0040154D74/data/tmp/test-session-systemlogs-2019.05.09_14-17-04--0400.logarchive, NSUserStringVariant=(
|
59
|
+
Move
|
60
|
+
), NSDestinationFilePath=/Users/lyndsey.ferguson/Library/Developer/Xcode/DerivedData/AtomicBoy-flqqvvvzbouqymbyffgdbtjoiufr/Logs/Test/Test-Transient Testing-2019.05.09_14-17-04--0400.xcresult/1_Test/Diagnostics/iPhone 5s_0D312041-2D60-4221-94CC-3B0040154D74/test-session-systemlogs-2019.05.09_14-17-04--0400.logarchive, NSFilePath=/Users/lyndsey.ferguson/Library/Developer/CoreSimulator/Devices/0D312041-2D60-4221-94CC-3B0040154D74/data/tmp/test-session-systemlogs-2019.05.09_14-17-04--0400.logarchive, NSUnderlyingError=0x7fdf96c6de90 {Error Domain=NSPOSIXErrorDomain Code=2 \"No such file or directory\"}}
|
61
|
+
|
62
|
+
"""
|
63
|
+
update_scan_options
|
40
64
|
Scan::Runner.new.run
|
41
65
|
@retrying_scan_helper.after_testrun
|
42
66
|
true
|
@@ -54,3 +78,16 @@ module TestCenter
|
|
54
78
|
end
|
55
79
|
end
|
56
80
|
end
|
81
|
+
# Ug. How do I name this class?
|
82
|
+
# I want a class that retries a scan
|
83
|
+
# I want a class that controls or manages the class that retries the scan and the set up for that
|
84
|
+
# etc.
|
85
|
+
# So, the class or the realm could be:
|
86
|
+
# MultiScanManager
|
87
|
+
# MultiScanController
|
88
|
+
# ScanManager
|
89
|
+
# ScanMaster
|
90
|
+
# MultiScanMaster
|
91
|
+
# MasterScanManser
|
92
|
+
# MasterMultiScan
|
93
|
+
# I like MultiScanManager
|
@@ -13,36 +13,20 @@ module TestCenter
|
|
13
13
|
@options = options
|
14
14
|
@testrun_count = 0
|
15
15
|
@xcpretty_json_file_output = ENV['XCPRETTY_JSON_FILE_OUTPUT']
|
16
|
+
|
16
17
|
@reportnamer = ReportNameHelper.new(
|
17
|
-
|
18
|
-
|
19
|
-
|
18
|
+
options[:output_types],
|
19
|
+
options[:output_files],
|
20
|
+
options[:custom_report_file_name]
|
20
21
|
)
|
21
22
|
end
|
22
23
|
|
23
24
|
def before_testrun
|
24
25
|
remove_preexisting_test_result_bundles
|
25
|
-
delete_xcresults # has to be performed _after_ moving a *.test_result
|
26
|
-
|
27
26
|
set_json_env
|
28
27
|
print_starting_scan_message
|
29
28
|
end
|
30
29
|
|
31
|
-
def delete_xcresults
|
32
|
-
derived_data_path = File.expand_path(@options[:derived_data_path] || Scan.config[:derived_data_path])
|
33
|
-
xcresults = Dir.glob("#{derived_data_path}/Logs/Test/*.xcresult")
|
34
|
-
FastlaneCore::UI.message("Deleting xcresults: #{xcresults}")
|
35
|
-
FileUtils.rm_rf(xcresults)
|
36
|
-
end
|
37
|
-
|
38
|
-
def output_directory
|
39
|
-
absolute_output_directory = File.absolute_path(@options[:output_directory])
|
40
|
-
if @options[:batch]
|
41
|
-
absolute_output_directory = File.join(absolute_output_directory, "batch-#{@options[:batch]}")
|
42
|
-
end
|
43
|
-
absolute_output_directory
|
44
|
-
end
|
45
|
-
|
46
30
|
def print_starting_scan_message
|
47
31
|
scan_message = "Starting scan ##{@testrun_count + 1} with #{@options.fetch(:only_testing, []).size} tests"
|
48
32
|
scan_message << " for batch ##{@options[:batch]}" unless @options[:batch].nil?
|
@@ -53,7 +37,7 @@ module TestCenter
|
|
53
37
|
return unless @reportnamer.includes_json?
|
54
38
|
|
55
39
|
ENV['XCPRETTY_JSON_FILE_OUTPUT'] = File.join(
|
56
|
-
output_directory,
|
40
|
+
@options[:output_directory],
|
57
41
|
@reportnamer.json_last_reportname
|
58
42
|
)
|
59
43
|
end
|
@@ -67,7 +51,8 @@ module TestCenter
|
|
67
51
|
def remove_preexisting_test_result_bundles
|
68
52
|
return unless @options[:result_bundle]
|
69
53
|
|
70
|
-
|
54
|
+
absolute_output_directory = File.absolute_path(@options[:output_directory])
|
55
|
+
glob_pattern = "#{absolute_output_directory}/*.test_result"
|
71
56
|
preexisting_test_result_bundles = Dir.glob(glob_pattern)
|
72
57
|
FileUtils.rm_rf(preexisting_test_result_bundles)
|
73
58
|
end
|
@@ -76,7 +61,6 @@ module TestCenter
|
|
76
61
|
valid_scan_keys = Fastlane::Actions::ScanAction.available_options.map(&:key)
|
77
62
|
@options.select { |k,v| valid_scan_keys.include?(k) }
|
78
63
|
.merge(@reportnamer.scan_options)
|
79
|
-
.merge(output_directory: output_directory)
|
80
64
|
end
|
81
65
|
|
82
66
|
# after_testrun methods
|
@@ -90,25 +74,25 @@ module TestCenter
|
|
90
74
|
else
|
91
75
|
handle_success
|
92
76
|
end
|
93
|
-
collate_reports
|
94
77
|
end
|
95
78
|
|
96
79
|
def handle_success
|
97
80
|
send_callback_testrun_info
|
98
81
|
move_test_result_bundle_for_next_run
|
99
82
|
reset_json_env
|
83
|
+
collate_reports
|
100
84
|
end
|
101
85
|
|
102
86
|
def collate_reports
|
87
|
+
absolute_output_directory = File.absolute_path(@options[:output_directory])
|
103
88
|
|
104
|
-
|
105
|
-
source_reports_directory_glob:
|
106
|
-
output_directory:
|
89
|
+
TestCenter::Helper::MultiScanManager::ReportCollator.new(
|
90
|
+
source_reports_directory_glob: absolute_output_directory,
|
91
|
+
output_directory: absolute_output_directory,
|
107
92
|
reportnamer: @reportnamer,
|
108
93
|
scheme: @options[:scheme],
|
109
94
|
result_bundle: @options[:result_bundle]
|
110
|
-
|
111
|
-
TestCenter::Helper::MultiScanManager::ReportCollator.new(report_collator_options).collate
|
95
|
+
).collate
|
112
96
|
end
|
113
97
|
|
114
98
|
def handle_test_failure
|
@@ -125,7 +109,7 @@ module TestCenter
|
|
125
109
|
report_filepath = nil
|
126
110
|
junit_results = {}
|
127
111
|
unless additional_info.key?(:test_operation_failure)
|
128
|
-
report_filepath = File.join(output_directory, @reportnamer.junit_last_reportname)
|
112
|
+
report_filepath = File.absolute_path(File.join(@options[:output_directory], @reportnamer.junit_last_reportname))
|
129
113
|
|
130
114
|
config = FastlaneCore::Configuration.create(
|
131
115
|
Fastlane::Actions::TestsFromJunitAction.available_options,
|
@@ -139,23 +123,23 @@ module TestCenter
|
|
139
123
|
info = {
|
140
124
|
failed: junit_results[:failed],
|
141
125
|
passing: junit_results[:passing],
|
142
|
-
batch:
|
126
|
+
batch: 1,
|
143
127
|
try_count: @testrun_count,
|
144
128
|
report_filepath: report_filepath
|
145
129
|
}.merge(additional_info)
|
146
130
|
|
147
131
|
if @reportnamer.includes_html?
|
148
|
-
html_report_filepath = File.join(output_directory, @reportnamer.html_last_reportname)
|
132
|
+
html_report_filepath = File.join(@options[:output_directory], @reportnamer.html_last_reportname)
|
149
133
|
info[:html_report_filepath] = html_report_filepath
|
150
134
|
end
|
151
135
|
if @reportnamer.includes_json?
|
152
|
-
json_report_filepath = File.join(output_directory, @reportnamer.json_last_reportname)
|
136
|
+
json_report_filepath = File.join(@options[:output_directory], @reportnamer.json_last_reportname)
|
153
137
|
info[:json_report_filepath] = json_report_filepath
|
154
138
|
end
|
155
139
|
if @options[:result_bundle]
|
156
140
|
test_result_suffix = '.test_result'
|
157
141
|
test_result_suffix.prepend("-#{@reportnamer.report_count}") unless @reportnamer.report_count.zero?
|
158
|
-
test_result_bundlepath = File.join(output_directory, @options[:scheme]) + test_result_suffix
|
142
|
+
test_result_bundlepath = File.join(@options[:output_directory], @options[:scheme]) + test_result_suffix
|
159
143
|
info[:test_result_bundlepath] = test_result_bundlepath
|
160
144
|
end
|
161
145
|
@options[:testrun_completed_block].call(info)
|
@@ -173,7 +157,7 @@ module TestCenter
|
|
173
157
|
end
|
174
158
|
|
175
159
|
def update_only_testing
|
176
|
-
report_filepath = File.join(output_directory, @reportnamer.junit_last_reportname)
|
160
|
+
report_filepath = File.join(@options[:output_directory], @reportnamer.junit_last_reportname)
|
177
161
|
config = FastlaneCore::Configuration.create(
|
178
162
|
Fastlane::Actions::TestsFromJunitAction.available_options,
|
179
163
|
{
|
@@ -233,7 +217,8 @@ module TestCenter
|
|
233
217
|
def move_test_result_bundle_for_next_run
|
234
218
|
return unless @options[:result_bundle]
|
235
219
|
|
236
|
-
|
220
|
+
absolute_output_directory = File.absolute_path(@options[:output_directory])
|
221
|
+
glob_pattern = "#{absolute_output_directory}/*.test_result"
|
237
222
|
preexisting_test_result_bundles = Dir.glob(glob_pattern)
|
238
223
|
unnumbered_test_result_bundles = preexisting_test_result_bundles.reject do |test_result|
|
239
224
|
test_result =~ /.*-\d+\.test_result/
|
@@ -24,26 +24,22 @@ module TestCenter
|
|
24
24
|
@given_output_files = multi_scan_options[:output_files]
|
25
25
|
@parallelize = multi_scan_options[:parallelize]
|
26
26
|
@test_collector = TestCenter::Helper::TestCollector.new(multi_scan_options)
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
parallelize
|
44
|
-
quit_simulators
|
45
|
-
].include?(option)
|
46
|
-
end
|
27
|
+
@scan_options = multi_scan_options.reject do |option, _|
|
28
|
+
%i[
|
29
|
+
output_directory
|
30
|
+
only_testing
|
31
|
+
skip_testing
|
32
|
+
clean
|
33
|
+
try_count
|
34
|
+
batch_count
|
35
|
+
custom_report_file_name
|
36
|
+
fail_build
|
37
|
+
testrun_completed_block
|
38
|
+
output_types
|
39
|
+
output_files
|
40
|
+
parallelize
|
41
|
+
quit_simulators
|
42
|
+
].include?(option)
|
47
43
|
end
|
48
44
|
@scan_options[:clean] = false
|
49
45
|
@scan_options[:disable_concurrent_testing] = true
|
@@ -58,10 +54,56 @@ module TestCenter
|
|
58
54
|
def scan
|
59
55
|
all_tests_passed = true
|
60
56
|
@testables_count = @test_collector.testables.size
|
61
|
-
FileUtils.rm_rf(Dir.glob("#{@output_directory}/**/*.{junit,html,xml,json}"))
|
62
57
|
all_tests_passed = each_batch do |test_batch, current_batch_index|
|
63
58
|
if ENV['USE_REFACTORED_PARALLELIZED_MULTI_SCAN']
|
64
|
-
|
59
|
+
# destination = @parallelizer&.destination_for_batch(current_batch_index) || Scan&.config&.fetch(:destination)
|
60
|
+
# if destination.nil?
|
61
|
+
# app_infoplist ||= XCTestrunInfo.new(@scan_options[:xctestrun])
|
62
|
+
|
63
|
+
# batch_deploymentversions = @test_collector.test_batches.map do |test_batch|
|
64
|
+
# testable = test_batch.first.split('/').first.gsub('\\', '')
|
65
|
+
# # TODO: investigate the reason for this call that doesn't seem to do
|
66
|
+
# # anything other than query for and then discard MinimumOSVersion
|
67
|
+
# app_infoplist.app_plist_for_testable(testable)['MinimumOSVersion']
|
68
|
+
# end
|
69
|
+
|
70
|
+
# device_description = @scan_options[:device]
|
71
|
+
# device_name = 'iPhone 5s'
|
72
|
+
# device_version = batch_deploymentversions[current_batch_index]
|
73
|
+
# unless device_description.nil?
|
74
|
+
# /(?<device_name>.*)\s+\((?<device_version>.*)\)/ =~ device_description
|
75
|
+
# end
|
76
|
+
# # TODO: check for an existing simulator that can serve
|
77
|
+
# all_runtimes = ::Snapshot::ResetSimulators.runtimes
|
78
|
+
|
79
|
+
# all_ios_runtimes = all_runtimes.select { |v, id| v[/^iOS/] }
|
80
|
+
# ios_runtimes_greater_than_equal = all_ios_runtimes.select do |versionstr, _|
|
81
|
+
# _, version = versionstr.split(' ')
|
82
|
+
# Gem::Version.new(device_version) <= Gem::Version.new(version)
|
83
|
+
# end
|
84
|
+
# ios_runtimes_greater_than_equal.sort! do |a, b|
|
85
|
+
# version_a = a.first.split(' ').last
|
86
|
+
# version_b = b.first.split(' ').last
|
87
|
+
# Gem::Version.new(version_a) <=> Gem::Version.new(version_b)
|
88
|
+
# end
|
89
|
+
|
90
|
+
# runtime = ios_runtimes_greater_than_equal.first.last
|
91
|
+
# device_type = `xcrun simctl list devicetypes`.scan(/(.*)\s\((.*)\)/)
|
92
|
+
# .find { |name, device_id| name == device_name }
|
93
|
+
|
94
|
+
# command = "xcrun simctl create '#{device_name}' #{device_type.last} #{runtime}"
|
95
|
+
# UI.command(command) if ::FastlaneCore::Globals.verbose?
|
96
|
+
# udid = `#{command}`.chomp
|
97
|
+
# destination = "platform=iOS Simulator,id=#{udid}"
|
98
|
+
# end
|
99
|
+
retrying_scan = TestCenter::Helper::MultiScanManager::RetryingScan.new(
|
100
|
+
@scan_options.merge(
|
101
|
+
# destination: destination,
|
102
|
+
only_testing: test_batch.map(&:shellsafe_testidentifier),
|
103
|
+
output_directory: @output_directory
|
104
|
+
).reject { |key| %i[device devices].include?(key) }
|
105
|
+
)
|
106
|
+
retrying_scan.run
|
65
107
|
else
|
66
108
|
output_directory = testrun_output_directory(@output_directory, test_batch, current_batch_index)
|
67
109
|
reset_for_new_testable(output_directory)
|
@@ -88,45 +130,9 @@ module TestCenter
|
|
88
130
|
end
|
89
131
|
testrun_passed && all_tests_passed
|
90
132
|
end
|
91
|
-
if ENV['USE_REFACTORED_PARALLELIZED_MULTI_SCAN']
|
92
|
-
collate_batched_reports
|
93
|
-
end
|
94
133
|
all_tests_passed
|
95
134
|
end
|
96
135
|
|
97
|
-
def run_test_batch_through_retrying_scan(test_batch, current_batch_index)
|
98
|
-
FastlaneCore::UI.important("Investigate using rbspy for perf problems: https://github.com/rbspy/rbspy")
|
99
|
-
retrying_scan = TestCenter::Helper::MultiScanManager::RetryingScan.new(
|
100
|
-
@scan_options.merge(
|
101
|
-
only_testing: test_batch.map(&:shellsafe_testidentifier),
|
102
|
-
output_directory: @output_directory,
|
103
|
-
try_count: @try_count,
|
104
|
-
batch: current_batch_index + 1
|
105
|
-
).reject { |key| %i[device devices].include?(key) }
|
106
|
-
)
|
107
|
-
retrying_scan.run
|
108
|
-
end
|
109
|
-
|
110
|
-
def collate_batched_reports
|
111
|
-
return unless @batch_count > 1
|
112
|
-
|
113
|
-
absolute_output_directory = File.absolute_path(@output_directory)
|
114
|
-
source_reports_directory_glob = File.join(absolute_output_directory, "batch-*")
|
115
|
-
|
116
|
-
TestCenter::Helper::MultiScanManager::ReportCollator.new(
|
117
|
-
source_reports_directory_glob: source_reports_directory_glob,
|
118
|
-
output_directory: absolute_output_directory,
|
119
|
-
reportnamer: @reportnamer = ReportNameHelper.new(
|
120
|
-
@given_output_types,
|
121
|
-
@given_output_files,
|
122
|
-
@given_custom_report_file_name
|
123
|
-
),
|
124
|
-
scheme: @scan_options[:scheme],
|
125
|
-
result_bundle: @scan_options[:result_bundle]
|
126
|
-
).collate
|
127
|
-
FileUtils.rm_rf(Dir.glob(source_reports_directory_glob))
|
128
|
-
end
|
129
|
-
|
130
136
|
def each_batch
|
131
137
|
tests_passed = true
|
132
138
|
if @parallelize
|
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.6.3.parallelizing.alpha.
|
4
|
+
version: 3.6.3.parallelizing.pre.alpha.pre.1
|
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-05-
|
11
|
+
date: 2019-05-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|