class Scan::TestCommandGenerator
Responsible for building the fully working xcodebuild command
Public Instance Methods
actions()
click to toggle source
# File scan/lib/scan/test_command_generator.rb, line 84 def actions config = Scan.config actions = [] actions << :clean if config[:clean] if config[:build_for_testing] actions << "build-for-testing" elsif config[:test_without_building] || config[:xctestrun] actions << "test-without-building" else actions << :build unless config[:skip_build] actions << :test end actions end
build_path()
click to toggle source
The path to set the Derived Data to
# File scan/lib/scan/test_command_generator.rb, line 175 def build_path unless Scan.cache[:build_path] day = Time.now.strftime("%F") # e.g. 2015-08-07 Scan.cache[:build_path] = File.expand_path("~/Library/Developer/Xcode/Archives/#{day}/") FileUtils.mkdir_p(Scan.cache[:build_path]) end Scan.cache[:build_path] end
destination()
click to toggle source
Generate destination parameters
# File scan/lib/scan/test_command_generator.rb, line 167 def destination unless Scan.cache[:destination] Scan.cache[:destination] = [*Scan.config[:destination]].map { |dst| "-destination '#{dst}'" }.join(' ') end Scan.cache[:destination] end
generate()
click to toggle source
# File scan/lib/scan/test_command_generator.rb, line 6 def generate parts = prefix parts << Scan.config[:xcodebuild_command] parts += options parts += actions parts += suffix parts += pipe parts end
options()
click to toggle source
# File scan/lib/scan/test_command_generator.rb, line 42 def options # rubocop:disable Metrics/PerceivedComplexity config = Scan.config options = [] options += project_path_array unless config[:xctestrun] options << "-sdk '#{config[:sdk]}'" if config[:sdk] options << destination if destination # generated in `detect_values` options << "-toolchain '#{config[:toolchain]}'" if config[:toolchain] if config[:derived_data_path] && !options.include?("-derivedDataPath #{config[:derived_data_path].shellescape}") options << "-derivedDataPath #{config[:derived_data_path].shellescape}" end if config[:use_system_scm] && !options.include?("-scmProvider system") options << "-scmProvider system" end options << "-resultBundlePath '#{result_bundle_path}'" if config[:result_bundle] if FastlaneCore::Helper.xcode_at_least?(10) options << "-parallel-testing-worker-count #{config[:concurrent_workers]}" if config[:concurrent_workers] options << "-maximum-concurrent-test-simulator-destinations #{config[:max_concurrent_simulators]}" if config[:max_concurrent_simulators] options << "-disable-concurrent-testing" if config[:disable_concurrent_testing] end options << "-enableCodeCoverage #{config[:code_coverage] ? 'YES' : 'NO'}" unless config[:code_coverage].nil? options << "-enableAddressSanitizer #{config[:address_sanitizer] ? 'YES' : 'NO'}" unless config[:address_sanitizer].nil? options << "-enableThreadSanitizer #{config[:thread_sanitizer] ? 'YES' : 'NO'}" unless config[:thread_sanitizer].nil? if FastlaneCore::Helper.xcode_at_least?(11) options << "-testPlan '#{config[:testplan]}'" if config[:testplan] # detect_values will ensure that these values are present as Arrays if # they are present at all options += config[:only_test_configurations].map { |name| "-only-test-configuration '#{name}'" } if config[:only_test_configurations] options += config[:skip_test_configurations].map { |name| "-skip-test-configuration '#{name}'" } if config[:skip_test_configurations] end options << "-xctestrun '#{config[:xctestrun]}'" if config[:xctestrun] options << config[:xcargs] if config[:xcargs] # detect_values will ensure that these values are present as Arrays if # they are present at all options += config[:only_testing].map { |test_id| "-only-testing:#{test_id.shellescape}" } if config[:only_testing] options += config[:skip_testing].map { |test_id| "-skip-testing:#{test_id.shellescape}" } if config[:skip_testing] options end
pipe()
click to toggle source
# File scan/lib/scan/test_command_generator.rb, line 107 def pipe pipe = ["| tee '#{xcodebuild_log_path}'"] if Scan.config[:disable_xcpretty] || Scan.config[:output_style] == 'raw' return pipe end formatter = [] if (custom_formatter = Scan.config[:formatter]) if custom_formatter.end_with?(".rb") formatter << "-f '#{custom_formatter}'" else formatter << "-f `#{custom_formatter}`" end elsif FastlaneCore::Env.truthy?("TRAVIS") formatter << "-f `xcpretty-travis-formatter`" UI.success("Automatically switched to Travis formatter") end if Helper.colors_disabled? formatter << "--no-color" end if Scan.config[:output_style] == 'basic' formatter << "--no-utf" end if Scan.config[:output_style] == 'rspec' formatter << "--test" end @reporter_options_generator = XCPrettyReporterOptionsGenerator.new(Scan.config[:open_report], Scan.config[:output_types], Scan.config[:output_files] || Scan.config[:custom_report_file_name], Scan.config[:output_directory], Scan.config[:use_clang_report_name], Scan.config[:xcpretty_args]) reporter_options = @reporter_options_generator.generate_reporter_options reporter_xcpretty_args = @reporter_options_generator.generate_xcpretty_args_options return pipe << "| xcpretty #{formatter.join(' ')} #{reporter_options.join(' ')} #{reporter_xcpretty_args}" end
prefix()
click to toggle source
# File scan/lib/scan/test_command_generator.rb, line 17 def prefix prefixes = ["set -o pipefail &&"] package_path = Scan.config[:package_path] prefixes << "cd #{package_path} &&" if package_path.to_s != "" prefixes end
project_path_array()
click to toggle source
Path to the project or workspace as parameter This will also include the scheme (if given) @return [Array] The array with all the components to join
# File scan/lib/scan/test_command_generator.rb, line 29 def project_path_array unless Scan.config[:package_path].nil? params = [] params << "-scheme #{Scan.config[:scheme].shellescape}" if Scan.config[:scheme] params << "-workspace #{Scan.config[:workspace].shellescape}" if Scan.config[:workspace] return params end proj = Scan.project.xcodebuild_parameters return proj if proj.count > 0 UI.user_error!("No project/workspace found") end
result_bundle_path()
click to toggle source
The path to the result bundle
# File scan/lib/scan/test_command_generator.rb, line 186 def result_bundle_path retry_count = Scan.cache[:retry_attempt] || 0 attempt = retry_count > 0 ? "-#{retry_count}" : "" ext = FastlaneCore::Helper.xcode_version.to_i >= 11 ? '.xcresult' : '.test_result' path = File.join(Scan.config[:output_directory], Scan.config[:scheme]) + attempt + ext Scan.cache[:result_bundle_path] = path # The result bundle path will be in the package path directory if specified delete_path = path delete_path = File.join(Scan.config[:package_path], path) if Scan.config[:package_path].to_s != "" FileUtils.remove_dir(delete_path) if File.directory?(delete_path) return path end
suffix()
click to toggle source
# File scan/lib/scan/test_command_generator.rb, line 102 def suffix suffix = [] suffix end
xcodebuild_log_path()
click to toggle source
Store the raw file
# File scan/lib/scan/test_command_generator.rb, line 150 def xcodebuild_log_path parts = [] if Scan.config[:app_name] parts << Scan.config[:app_name] elsif Scan.project parts << Scan.project.app_name end parts << Scan.config[:scheme] if Scan.config[:scheme] file_name = "#{parts.join('-')}.log" containing = File.expand_path(Scan.config[:buildlog_path]) FileUtils.mkdir_p(containing) return File.join(containing, file_name) end