summaryrefslogtreecommitdiff
path: root/test/mmtk/test_configuration.rb
blob: 427cd9a07941c93fd026f1865600ae035261707b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# frozen_string_literal: true

require_relative "helper"

module MMTk
  class TestConfiguration < TestCase
    def test_MMTK_THREADS
      assert_separately([{ "MMTK_THREADS" => "5" }], <<~RUBY)
        assert_equal(5, GC.config[:mmtk_worker_count])
      RUBY

      assert_separately([{ "MMTK_THREADS" => "1" }], <<~RUBY)
        assert_equal(1, GC.config[:mmtk_worker_count])
      RUBY
    end

    %w(NoGC MarkSweep Immix).each do |plan|
      define_method(:"test_MMTK_PLAN_#{plan}") do
        assert_separately([{ "MMTK_PLAN" => plan }], <<~RUBY)
          assert_equal("#{plan}", GC.config[:mmtk_plan])
        RUBY
      end
    end

    %w(fixed dynamic).each do |heap|
      define_method(:"test_MMTK_HEAP_MODE_#{heap}") do
        assert_separately([{ "MMTK_HEAP_MODE" => heap }], <<~RUBY)
          assert_equal("#{heap}", GC.config[:mmtk_heap_mode])
        RUBY
      end
    end

    def test_MMTK_HEAP_MIN
      # Defaults to 1MiB
      assert_separately([], <<~RUBY)
        assert_equal(1 * 1024 * 1024, GC.config[:mmtk_heap_min])
      RUBY

      assert_separately([{ "MMTK_HEAP_MODE" => "dynamic", "MMTK_HEAP_MIN" => "1" }], <<~RUBY)
        assert_equal(1, GC.config[:mmtk_heap_min])
      RUBY

      assert_separately([{ "MMTK_HEAP_MODE" => "dynamic", "MMTK_HEAP_MIN" => "10MiB", "MMTK_HEAP_MAX" => "1GiB" }], <<~RUBY)
        assert_equal(10 * 1024 * 1024, GC.config[:mmtk_heap_min])
      RUBY
    end

    def test_MMTK_HEAP_MIN_is_ignored_for_fixed_heaps
      assert_separately([{ "MMTK_HEAP_MODE" => "fixed", "MMTK_HEAP_MIN" => "1" }], <<~RUBY)
        assert_nil(GC.config[:mmtk_heap_min])
      RUBY
    end

    def test_MMTK_HEAP_MAX
      assert_separately([{ "MMTK_HEAP_MODE" => "fixed", "MMTK_HEAP_MAX" => "100MiB" }], <<~RUBY)
        assert_equal(100 * 1024 * 1024, GC.config[:mmtk_heap_max])
      RUBY
    end

    %w(MMTK_THREADS MMTK_HEAP_MIN MMTK_HEAP_MAX MMTK_HEAP_MODE MMTK_PLAN).each do |var|
      define_method(:"test_invalid_#{var}") do
        exit_code = assert_in_out_err(
          [{ var => "foobar" }, "--"],
          "",
          [],
          ["[FATAL] Invalid #{var} foobar"]
        )

        assert_equal(1, exit_code.exitstatus)
      end
    end

    def test_MMTK_HEAP_MIN_greater_than_or_equal_to_MMTK_HEAP_MAX
      exit_code = assert_in_out_err(
        [{ "MMTK_HEAP_MIN" => "100MiB", "MMTK_HEAP_MAX" => "10MiB" }, "--"],
        "",
        [],
        ["[FATAL] MMTK_HEAP_MIN(104857600) >= MMTK_HEAP_MAX(10485760)"]
      )

      assert_equal(1, exit_code.exitstatus)

      exit_code = assert_in_out_err(
        [{ "MMTK_HEAP_MIN" => "10MiB", "MMTK_HEAP_MAX" => "10MiB" }, "--"],
        "",
        [],
        ["[FATAL] MMTK_HEAP_MIN(10485760) >= MMTK_HEAP_MAX(10485760)"]
      )

      assert_equal(1, exit_code.exitstatus)
    end
  end
end