-
-
Notifications
You must be signed in to change notification settings - Fork 388
/
gc_spec.rb
136 lines (111 loc) · 3.78 KB
/
gc_spec.rb
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
require_relative 'spec_helper'
load_extension("gc")
describe "CApiGCSpecs" do
before :each do
@f = CApiGCSpecs.new
end
describe "rb_gc_register_address" do
it "correctly gets the value from a registered address" do
@f.registered_tagged_address.should == 10
@f.registered_tagged_address.should equal(@f.registered_tagged_address)
@f.registered_reference_address.should == "Globally registered data"
@f.registered_reference_address.should equal(@f.registered_reference_address)
end
it "keeps the value alive even if the value is assigned after rb_gc_register_address() is called" do
GC.start
@f.registered_before_rb_gc_register_address.should == "registered before rb_gc_register_address()"
end
it "can be called outside Init_" do
@f.rb_gc_register_address.should == "rb_gc_register_address() outside Init_"
@f.rb_gc_unregister_address
end
end
describe "rb_global_variable" do
before :all do
GC.start
end
describe "keeps the value alive even if the value is assigned after rb_global_variable() is called" do
it "for a string" do
@f.registered_before_rb_global_variable_string.should == "registered before rb_global_variable()"
end
it "for a bignum" do
@f.registered_before_rb_global_variable_bignum.should == 2**63 - 1
end
it "for a Float" do
@f.registered_before_rb_global_variable_float.should == 3.14
end
end
describe "keeps the value alive when the value is assigned before rb_global_variable() is called" do
it "for a string" do
@f.registered_after_rb_global_variable_string.should == "registered after rb_global_variable()"
end
it "for a bignum" do
@f.registered_after_rb_global_variable_bignum.should == 2**63 - 1
end
it "for a Float" do
@f.registered_after_rb_global_variable_float.should == 6.28
end
end
end
describe "rb_gc_enable" do
after do
GC.enable
end
it "enables GC when disabled" do
GC.disable
@f.rb_gc_enable.should be_true
end
it "GC stays enabled when enabled" do
GC.enable
@f.rb_gc_enable.should be_false
end
it "disables GC when enabled" do
GC.enable
@f.rb_gc_disable.should be_false
end
it "GC stays disabled when disabled" do
GC.disable
@f.rb_gc_disable.should be_true
end
end
describe "rb_gc" do
it "increases gc count" do
gc_count = GC.count
@f.rb_gc
GC.count.should > gc_count
end
end
describe "rb_gc_adjust_memory_usage" do
# Just check that it does not throw, as it seems hard to observe any effect
it "adjusts the amount of registered external memory" do
-> {
@f.rb_gc_adjust_memory_usage(8)
@f.rb_gc_adjust_memory_usage(-8)
}.should_not raise_error
end
end
describe "rb_gc_register_mark_object" do
it "can be called with an object" do
@f.rb_gc_register_mark_object(Object.new).should be_nil
end
it "keeps the value alive even if the value is not referenced by any Ruby object" do
@f.rb_gc_register_mark_object_not_referenced_float.should == 1.61
end
end
describe "rb_gc_latest_gc_info" do
it "raises a TypeError when hash or symbol not given" do
-> { @f.rb_gc_latest_gc_info("foo") }.should raise_error(TypeError)
end
it "raises an ArgumentError when unknown symbol given" do
-> { @f.rb_gc_latest_gc_info(:unknown) }.should raise_error(ArgumentError)
end
it "returns the populated hash when a hash is given" do
h = {}
@f.rb_gc_latest_gc_info(h).should == h
h.size.should_not == 0
end
it "returns a value when symbol is given" do
@f.rb_gc_latest_gc_info(:state).should be_kind_of(Symbol)
end
end
end