fastlane-plugin-saucectl 0.1.2 → 0.1.3.pre
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
- metadata +8 -32
- data/LICENSE +0 -21
- data/README.md +0 -81
- data/lib/fastlane/plugin/saucectl/actions/delete_from_storage_action.rb +0 -96
- data/lib/fastlane/plugin/saucectl/actions/disabled_tests_action.rb +0 -90
- data/lib/fastlane/plugin/saucectl/actions/install_saucectl_action.rb +0 -44
- data/lib/fastlane/plugin/saucectl/actions/sauce_apps_action.rb +0 -96
- data/lib/fastlane/plugin/saucectl/actions/sauce_config_action.rb +0 -320
- data/lib/fastlane/plugin/saucectl/actions/sauce_devices_action.rb +0 -95
- data/lib/fastlane/plugin/saucectl/actions/sauce_runner_action.rb +0 -56
- data/lib/fastlane/plugin/saucectl/actions/sauce_upload_action.rb +0 -133
- data/lib/fastlane/plugin/saucectl/helper/api.rb +0 -115
- data/lib/fastlane/plugin/saucectl/helper/config.rb +0 -97
- data/lib/fastlane/plugin/saucectl/helper/espresso.rb +0 -93
- data/lib/fastlane/plugin/saucectl/helper/file_utils.rb +0 -27
- data/lib/fastlane/plugin/saucectl/helper/installer.rb +0 -54
- data/lib/fastlane/plugin/saucectl/helper/runner.rb +0 -39
- data/lib/fastlane/plugin/saucectl/helper/storage.rb +0 -46
- data/lib/fastlane/plugin/saucectl/helper/suites.rb +0 -219
- data/lib/fastlane/plugin/saucectl/helper/xctest.rb +0 -168
- data/lib/fastlane/plugin/saucectl/strings/messages.yml +0 -12
- data/lib/fastlane/plugin/saucectl/version.rb +0 -5
- data/lib/fastlane/plugin/saucectl.rb +0 -15
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
require "find"
|
|
2
|
-
require "open3"
|
|
3
|
-
require "json"
|
|
4
|
-
require_relative "file_utils"
|
|
5
|
-
|
|
6
|
-
module Fastlane
|
|
7
|
-
module Saucectl
|
|
8
|
-
# This class is responsible for creating test execution plans for ios applications and will distribute tests
|
|
9
|
-
# that will be be executed via the cloud provider.
|
|
10
|
-
#
|
|
11
|
-
class XCTest
|
|
12
|
-
include FileUtils
|
|
13
|
-
UI = FastlaneCore::UI unless Fastlane.const_defined?(:UI)
|
|
14
|
-
TEST_FUNCTION_REGEX = /(test+[A-Z][a-zA-Z]+)[(][)]/.freeze
|
|
15
|
-
|
|
16
|
-
def initialize(config)
|
|
17
|
-
@config = config
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def test_plan_exists?
|
|
21
|
-
File.exist?(Dir["**/#{@config[:test_plan]}.xctestplan"][0])
|
|
22
|
-
rescue StandardError
|
|
23
|
-
false
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def valid_test_plan?
|
|
27
|
-
File.exist?(Dir["**/#{@config[:test_plan]}.xctestplan"][0])
|
|
28
|
-
rescue StandardError
|
|
29
|
-
UI.user_error!("#{@config[:test_plan]} was not found in workspace")
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def fetch_test_plan
|
|
33
|
-
plan_path = Dir["**/#{@config[:test_plan]}.xctestplan"][0]
|
|
34
|
-
selected = File.read(plan_path)
|
|
35
|
-
JSON.parse(selected)["testTargets"][0]
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def fetch_target_from_test_plan
|
|
39
|
-
fetch_test_plan["target"]["name"]
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def test_data
|
|
43
|
-
if test_plan_exists?
|
|
44
|
-
valid_test_plan?
|
|
45
|
-
if fetch_test_plan.include?("skippedTests")
|
|
46
|
-
strip_skipped(all_tests)
|
|
47
|
-
else
|
|
48
|
-
fetch_selected_tests
|
|
49
|
-
end
|
|
50
|
-
else
|
|
51
|
-
all_tests
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def test_target
|
|
56
|
-
@config[:test_target].nil? ? fetch_target_from_test_plan : @config[:test_target]
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def test_distribution
|
|
60
|
-
test_distribution_check
|
|
61
|
-
tests_arr = []
|
|
62
|
-
|
|
63
|
-
test_distribution = @config[:test_plan].nil? ? @config[:test_distribution] : 'testPlan'
|
|
64
|
-
case test_distribution
|
|
65
|
-
when 'testCase', 'testPlan'
|
|
66
|
-
test_data.each do |type|
|
|
67
|
-
type[:tests].each { |test| tests_arr << "#{test_target}.#{type[:class]}/#{test}" }
|
|
68
|
-
end
|
|
69
|
-
else
|
|
70
|
-
test_data.each do |type|
|
|
71
|
-
tests_arr << "#{test_target}.#{type[:class]}"
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
tests_arr.uniq
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
def test_distribution_check
|
|
78
|
-
return @config[:test_distribution] if @config[:test_distribution].kind_of?(Array)
|
|
79
|
-
|
|
80
|
-
distribution_types = %w[class testCase shard]
|
|
81
|
-
unless distribution_types.include?(@config[:test_distribution]) || @config[:test_distribution].nil?
|
|
82
|
-
UI.user_error!("#{@config[:test_distribution]} is not a valid method of test distribution. \n Supported types for iOS: \n #{distribution_types}")
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
def fetch_selected_tests
|
|
87
|
-
ui_tests = []
|
|
88
|
-
fetch_test_plan["selectedTests"].each do |test|
|
|
89
|
-
test_case = test.gsub('/', ' ').split
|
|
90
|
-
ui_tests << { class: test_case[0], tests: [test_case[1].gsub(/[()]/, "").to_s] }
|
|
91
|
-
end
|
|
92
|
-
ui_tests
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
def strip_skipped(all_tests)
|
|
96
|
-
enabled_ui_tests = []
|
|
97
|
-
skipped_tests = fetch_disabled_tests
|
|
98
|
-
all_tests.each do |tests|
|
|
99
|
-
tests[:tests].each do |test|
|
|
100
|
-
unless skipped_tests.to_s.include?(test)
|
|
101
|
-
enabled_ui_tests << { class: tests[:class].to_s, tests: [test] }
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
enabled_ui_tests
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
def fetch_disabled_tests
|
|
109
|
-
skipped = fetch_test_plan["skippedTests"]
|
|
110
|
-
ui_tests = []
|
|
111
|
-
skipped.each do |item|
|
|
112
|
-
if item.include?('/')
|
|
113
|
-
test_case = item.gsub('/', ' ').split
|
|
114
|
-
ui_tests << sort_ui_tests(test_case[0], test_case[1])
|
|
115
|
-
else
|
|
116
|
-
ui_tests << scan_test_class(item)
|
|
117
|
-
end
|
|
118
|
-
end
|
|
119
|
-
ui_tests
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
def sort_ui_tests(cls, test_case)
|
|
123
|
-
{ class: cls, tests: test_case.gsub(/[()]/, "").to_s }
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
def all_tests
|
|
127
|
-
test_details = []
|
|
128
|
-
test_dir = Dir["**/#{test_target}"][0]
|
|
129
|
-
search_retrieve_test_classes(test_dir).each do |f|
|
|
130
|
-
next unless File.basename(f) =~ CLASS_NAME_REGEX
|
|
131
|
-
|
|
132
|
-
test_details << { class: File.basename(f).gsub(FILE_TYPE_REGEX, ""), tests: tests_from(f) }
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
strip_empty(test_details)
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
def scan_test_class(cls)
|
|
139
|
-
test_details = []
|
|
140
|
-
test_dir = Dir["**/#{test_target}"][0]
|
|
141
|
-
search_retrieve_test_classes(test_dir).each do |f|
|
|
142
|
-
next unless File.basename(f) =~ /#{cls}/
|
|
143
|
-
|
|
144
|
-
test_details << { class: File.basename(f).gsub(FILE_TYPE_REGEX, ""), tests: tests_from(f) }
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
strip_empty(test_details)
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
def tests_from(path)
|
|
151
|
-
stdout, = find(path, "func")
|
|
152
|
-
test_cases = []
|
|
153
|
-
stdout.split.each do |line|
|
|
154
|
-
test_cases << line.match(TEST_FUNCTION_REGEX).to_s.gsub(/[()]/, "") if line =~ TEST_FUNCTION_REGEX
|
|
155
|
-
end
|
|
156
|
-
test_cases
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
def strip_empty(test_details)
|
|
160
|
-
tests = []
|
|
161
|
-
test_details.each do |test|
|
|
162
|
-
tests << test unless test[:tests].size.zero?
|
|
163
|
-
end
|
|
164
|
-
tests
|
|
165
|
-
end
|
|
166
|
-
end
|
|
167
|
-
end
|
|
168
|
-
end
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
platform_error: "No platform specified, set using: platform: 'android'"
|
|
3
|
-
app_path_error: "No App path given, set using: app_path: 'path/to/my/testApp.apk'"
|
|
4
|
-
file_error: "No file path given, set using: app_path: 'path/to/my/testApp.apk'"
|
|
5
|
-
app_name_error: "No App name given, set using: app_name: 'testApp.apk'"
|
|
6
|
-
test_runner_app_error: "No Test runner application given, set using: test_runner_app: 'testRunnerApp.apk'"
|
|
7
|
-
region_error: "$region is an invalid region. Supported regions are 'us' and 'eu'"
|
|
8
|
-
sauce_username_error: "No sauce labs username provided, set using: sauce_username: 'sauce user name', or consider setting your credentials as environment variables."
|
|
9
|
-
sauce_api_key_error: "No sauce labs access key provided, set using: sauce_access_key: '1234' or consider setting your credentials as environment variables."
|
|
10
|
-
supported_regions: ['us', 'eu']
|
|
11
|
-
accepted_file_types: ['.apk', '.aab', '.ipa', '.zip']
|
|
12
|
-
missing_file_name: "Please specify the name of the app that you wish to query on sauce storage"
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
require 'fastlane/plugin/saucectl/version'
|
|
2
|
-
|
|
3
|
-
module Fastlane
|
|
4
|
-
module Saucectl
|
|
5
|
-
def self.all_classes
|
|
6
|
-
Dir[File.expand_path('*/{actions,helper}/*.rb', File.dirname(__FILE__))]
|
|
7
|
-
end
|
|
8
|
-
end
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
# By default we want to import all available actions and helpers
|
|
12
|
-
# A plugin can contain any number of actions and plugins
|
|
13
|
-
Fastlane::Saucectl.all_classes.each do |current|
|
|
14
|
-
require current
|
|
15
|
-
end
|