[rubygems/rubygems] Use a constant empty tar header to avoid extra allocations
[ruby.git] / test / -ext- / thread / helper.rb
blob3ea2057d15f946ca3596d27bd42f1dbc683a459d
1 module ThreadInstrumentation
2   module TestHelper
3     private
5     def record
6       Bug::ThreadInstrumentation.register_callback(!ENV["GVL_DEBUG"])
7       yield
8     ensure
9       timeline = Bug::ThreadInstrumentation.unregister_callback
10       if $!
11         raise
12       else
13         return timeline
14       end
15     end
17     def timeline_for(thread, timeline)
18       timeline.select { |t, _| t == thread }.map(&:last)
19     end
21     def assert_consistent_timeline(events)
22       refute_predicate events, :empty?
24       previous_event = nil
25       events.each do |event|
26         refute_equal :exited, previous_event, "`exited` must be the final event: #{events.inspect}"
27         case event
28         when :started
29           assert_nil previous_event, "`started` must be the first event: #{events.inspect}"
30         when :ready
31           unless previous_event.nil?
32             assert %i(started suspended).include?(previous_event), "`ready` must be preceded by `started` or `suspended`: #{events.inspect}"
33           end
34         when :resumed
35           unless previous_event.nil?
36             assert_equal :ready, previous_event, "`resumed` must be preceded by `ready`: #{events.inspect}"
37           end
38         when :suspended
39           unless previous_event.nil?
40             assert_equal :resumed, previous_event, "`suspended` must be preceded by `resumed`: #{events.inspect}"
41           end
42         when :exited
43           unless previous_event.nil?
44             assert %i(resumed suspended).include?(previous_event), "`exited` must be preceded by `resumed` or `suspended`: #{events.inspect}"
45           end
46         end
47         previous_event = event
48       end
49     end
50   end
51 end