class TestCenter::Helper::TestCollector

Attributes

batches[R]
testables[R]
xctestrun_path[R]

Public Class Methods

new(options) click to toggle source
# File lib/fastlane/plugin/test_center/helper/test_collector.rb, line 13
def initialize(options)
  @invocation_based_tests = options[:invocation_based_tests]
  @swift_test_prefix = options[:swift_test_prefix]

  @xctestrun_path = self.class.xctestrun_filepath(options)
  initialize_batches(options)
end

Private Class Methods

default_derived_data_path() click to toggle source
# File lib/fastlane/plugin/test_center/helper/test_collector.rb, line 183
def self.default_derived_data_path
  project_derived_data_path = Scan.project.build_settings(key: "BUILT_PRODUCTS_DIR")
  File.expand_path("../../..", project_derived_data_path)
end
derived_testrun_path(derived_data_path) click to toggle source
# File lib/fastlane/plugin/test_center/helper/test_collector.rb, line 188
def self.derived_testrun_path(derived_data_path)
  xctestrun_files = Dir.glob("#{derived_data_path}/Build/Products/*.xctestrun")
  xctestrun_files.sort { |f1, f2| File.mtime(f1) <=> File.mtime(f2) }.last
end
only_testing_from_testplan(options) click to toggle source
# File lib/fastlane/plugin/test_center/helper/test_collector.rb, line 153
def self.only_testing_from_testplan(options)
  return unless options[:testplan] && options[:scheme]

  config = FastlaneCore::Configuration.create(
    Fastlane::Actions::TestplansFromSchemeAction.available_options,
    {
      workspace: options[:workspace],
      xcodeproj: options[:project],
      scheme: options[:scheme]
    }
  )
  testplans = Fastlane::Actions::TestplansFromSchemeAction.run(config)
  FastlaneCore::UI.verbose("TestCollector found testplans: #{testplans}")
  testplan = testplans.find do |testplan_path|
    %r{(.*/?#{ options[:testplan] })\.xctestplan}.match?(testplan_path)
  end
  FastlaneCore::UI.verbose("  using :testplan option, #{options[:testplan]}, using found one: #{testplan}")

  return if testplan.nil?

  config = FastlaneCore::Configuration.create(
    Fastlane::Actions::TestOptionsFromTestplanAction.available_options,
    {
      testplan: testplan
    }
  )
  test_options = Fastlane::Actions::TestOptionsFromTestplanAction.run(config)
  return test_options[:only_testing]
end
xctestrun_filepath(options) click to toggle source
# File lib/fastlane/plugin/test_center/helper/test_collector.rb, line 193
def self.xctestrun_filepath(options)
  unless options[:xctestrun] || options[:derived_data_path]
    options[:derived_data_path] = default_derived_data_path
  end
  path = (options[:xctestrun] || derived_testrun_path(options[:derived_data_path]))

  unless path && File.exist?(path)
    FastlaneCore::UI.user_error!("Error: cannot find xctestrun file '#{path}'")
  end
  path
end

Private Instance Methods

derive_batch_count(options) click to toggle source
# File lib/fastlane/plugin/test_center/helper/test_collector.rb, line 41
def derive_batch_count(options)
  batch_count = options.fetch(:batch_count, 1)
  if batch_count == 1 && options.fetch(:parallel_testrun_count, 0) > 1
    # if the batch count is 1, and the users wants parallel runs
    # we *must* set the batch count to the same number of parallel
    # runs or else the desired reports will not be written
    batch_count = options[:parallel_testrun_count]
  end
  batch_count
end
derive_batches_from_tests(options) click to toggle source
# File lib/fastlane/plugin/test_center/helper/test_collector.rb, line 82
def derive_batches_from_tests(options)
  @batches = []
  testable_tests_hash = testable_tests_hash_from_options(options)
  @testables = testable_tests_hash.keys
  batch_count = derive_batch_count(options)
  testable_tests_hash.each do |testable, test_identifiers|
    next if test_identifiers.empty?

    if batch_count > 1
      slice_count = [(test_identifiers.length / batch_count.to_f).ceil, 1].max
      test_identifiers.each_slice(slice_count).to_a.each do |batch|
        @batches << batch
      end
    else
      @batches << test_identifiers
    end
  end
end
derive_only_testing(options) click to toggle source
# File lib/fastlane/plugin/test_center/helper/test_collector.rb, line 52
def derive_only_testing(options)
  only_testing = options[:only_testing] || self.class.only_testing_from_testplan(options)
  if only_testing && only_testing.kind_of?(String)
    only_testing = only_testing.split(',').map(&:strip)
  end
  only_testing
end
expand_given_batches_to_full_test_identifiers(options) click to toggle source
# File lib/fastlane/plugin/test_center/helper/test_collector.rb, line 31
def expand_given_batches_to_full_test_identifiers(options)
  @batches = options[:batches]
  testables = Set.new
  @batches.each do |batch|
    expand_test_identifiers(batch)
    batch.each { |t| testables << t.split('/')[0] }
  end
  @testables = testables.to_a
end
expand_test_identifiers(test_identifiers) click to toggle source
# File lib/fastlane/plugin/test_center/helper/test_collector.rb, line 101
def expand_test_identifiers(test_identifiers)
  all_known_tests = nil
  test_identifiers.each_with_index do |test_identifier, index|
    test_components = test_identifier.split('/')
    is_full_test_identifier = (test_components.size == 3)
    next if is_full_test_identifier

    all_known_tests ||= xctestrun_known_tests.clone

    testsuite = ''
    testable = test_components[0]
    expanded_test_identifiers = []
    if test_components.size == 1
      # this is a testable, also known as a test target. Let's expand it out
      # to all of its tests. Note: a test target can have many testSuites, each
      # with their own testCases.
      if all_known_tests[testable].to_a.empty?
        FastlaneCore::UI.verbose("Unable to expand #{testable} to constituent tests")
        expanded_test_identifiers = [testable]
      else
        expanded_test_identifiers = all_known_tests[testable]
      end
    else
      # this is a testable and a test suite, let's expand it out to all of
      # its testCases. Note: if the user put the same test identifier in more than
      # one place in this array, this could lead to multiple repititions of the same
      # set of test identifiers
      testsuite = test_components[1]
      expanded_test_identifiers = all_known_tests[testable].select do |known_test|
        known_test.split('/')[1] == testsuite
      end
    end
    test_identifiers.delete_at(index)
    test_identifiers.insert(index, *expanded_test_identifiers)
  end
end
initialize_batches(options) click to toggle source
# File lib/fastlane/plugin/test_center/helper/test_collector.rb, line 23
def initialize_batches(options)
  if options[:batches]
    expand_given_batches_to_full_test_identifiers(options)
  else
    derive_batches_from_tests(options)
  end
end
testable_tests_hash_from_options(options) click to toggle source
# File lib/fastlane/plugin/test_center/helper/test_collector.rb, line 60
def testable_tests_hash_from_options(options)
  testable_tests_hash = Hash.new { |h, k| h[k] = [] }
  only_testing = derive_only_testing(options)
  if only_testing
    expand_test_identifiers(only_testing)
    only_testing.each do |test_identifier|
      testable = test_identifier.split('/')[0]
      testable_tests_hash[testable] << test_identifier
    end
  else
    testable_tests_hash = xctestrun_known_tests.clone
    if options[:skip_testing]
      expand_test_identifiers(options[:skip_testing])
      testable_tests_hash.each do |testable, test_identifiers|
        test_identifiers.replace(test_identifiers - options[:skip_testing])
        testable_tests_hash.delete(testable) if test_identifiers.empty?
      end
    end
  end
  testable_tests_hash
end
xctestrun_known_tests() click to toggle source
# File lib/fastlane/plugin/test_center/helper/test_collector.rb, line 138
def xctestrun_known_tests
  unless @known_tests
    config = FastlaneCore::Configuration.create(
      ::Fastlane::Actions::TestsFromXctestrunAction.available_options,
      {
        xctestrun: @xctestrun_path,
        invocation_based_tests: @invocation_based_tests,
        swift_test_prefix: @swift_test_prefix
      }
    )
    @known_tests = ::Fastlane::Actions::TestsFromXctestrunAction.run(config)
  end
  @known_tests
end