Class: KnapsackPro::BaseAllocatorBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/knapsack_pro/base_allocator_builder.rb

Direct Known Subclasses

AllocatorBuilder, QueueAllocatorBuilder

Constant Summary collapse

TEST_RUNNER_MAP =
{
  KnapsackPro::Adapters::RSpecAdapter => 'rspec',
  KnapsackPro::Adapters::CucumberAdapter => 'cucumber',
  KnapsackPro::Adapters::MinitestAdapter => 'minitest',
  KnapsackPro::Adapters::SpinachAdapter => 'spinach',
  KnapsackPro::Adapters::TestUnitAdapter => 'test-unit',
}

Instance Method Summary collapse

Constructor Details

#initialize(adapter_class) ⇒ BaseAllocatorBuilder

Returns a new instance of BaseAllocatorBuilder.



11
12
13
14
# File 'lib/knapsack_pro/base_allocator_builder.rb', line 11

def initialize(adapter_class)
  @adapter_class = adapter_class
  ENV['KNAPSACK_PRO_TEST_RUNNER'] = TEST_RUNNER_MAP[adapter_class]
end

Instance Method Details

#allocatorObject

Raises:

  • (NotImplementedError)


16
17
18
# File 'lib/knapsack_pro/base_allocator_builder.rb', line 16

def allocator
  raise NotImplementedError
end

#fallback_mode_test_filesObject

in fallback mode we always want to run the whole test files (not split by test cases) to guarantee that each test will be executed at least once across parallel CI nodes



27
28
29
# File 'lib/knapsack_pro/base_allocator_builder.rb', line 27

def fallback_mode_test_files
  all_test_files_to_run
end

#fast_and_slow_test_files_to_runObject

detect test files present on the disk that should be run this may include some fast test files + slow test files split by test cases



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/knapsack_pro/base_allocator_builder.rb', line 33

def fast_and_slow_test_files_to_run
  test_files_to_run = all_test_files_to_run

  if adapter_class == KnapsackPro::Adapters::RSpecAdapter && KnapsackPro::Config::Env.rspec_split_by_test_examples?
    require 'rspec/core/version'
    unless Gem::Version.new(::RSpec::Core::Version::STRING) >= Gem::Version.new('3.3.0')
      raise "RSpec >= 3.3.0 is required to split test files by test examples. Learn more: #{KnapsackPro::Urls::SPLIT_BY_TEST_EXAMPLES}"
    end

    slow_test_files = get_slow_test_files

    KnapsackPro.logger.info("Generating RSpec test examples JSON report for slow test files to prepare it to be split by test examples (by individual 'it's. Thanks to that a single slow test file can be split across parallel CI nodes). Analyzing #{slow_test_files.size} slow test files.")

    # generate RSpec JSON report in separate process to not pollute RSpec state
    cmd = [
      'RACK_ENV=test',
      'RAILS_ENV=test',
      KnapsackPro::Config::Env.rspec_test_example_detector_prefix,
      'rake knapsack_pro:rspec_test_example_detector',
    ].join(' ')
    unless Kernel.system(cmd)
      raise "Could not generate JSON report for RSpec. Rake task failed when running #{cmd}"
    end

    # read JSON report
    detector = KnapsackPro::TestCaseDetectors::RSpecTestExampleDetector.new
    test_file_example_paths = detector.test_file_example_paths

    KnapsackPro::TestFilesWithTestCasesComposer.call(test_files_to_run, slow_test_files, test_file_example_paths)
  else
    test_files_to_run
  end
end

#test_dirObject



20
21
22
# File 'lib/knapsack_pro/base_allocator_builder.rb', line 20

def test_dir
  KnapsackPro::Config::Env.test_dir || TestFilePattern.test_dir(adapter_class)
end