license: use LGPLv2.1 or later (was LGPL (2.1|3.0)-only)
[raindrops.git] / test / test_aggregate_pmq.rb
blob7748b4f8fce353dd1747330f895d3714276aa12e
1 require "test/unit"
2 require "raindrops"
3 pmq = begin
4   Raindrops::Aggregate::PMQ
5 rescue LoadError => e
6   warn "W: #{e} skipping test"
7   false
8 end
9 if RUBY_VERSION.to_f < 1.9
10   pmq = false
11   warn "W: skipping #{__FILE__}, only Ruby 1.9 supported for now"
12 end
14 Thread.abort_on_exception = true
16 class TestAggregatePMQ < Test::Unit::TestCase
18   def setup
19     @queue = "/test.#{rand}"
20   end
22   def teardown
23     POSIX_MQ.unlink @queue
24   end
26   def test_run
27     pmq = Raindrops::Aggregate::PMQ.new :queue => @queue
28     thr = Thread.new { pmq.master_loop }
29     agg = Aggregate.new
30     (1..10).each { |i| pmq << i; agg << i }
31     pmq.stop_master_loop
32     assert thr.join
33     assert_equal agg.count, pmq.count
34     assert_equal agg.mean, pmq.mean
35     assert_equal agg.std_dev, pmq.std_dev
36     assert_equal agg.min, pmq.min
37     assert_equal agg.max, pmq.max
38     assert_equal agg.to_s, pmq.to_s
39   end
41   def test_multi_process
42     nr_workers = 4
43     nr = 100
44     pmq = Raindrops::Aggregate::PMQ.new :queue => @queue
45     pid = fork { pmq.master_loop }
46     workers = (1..nr_workers).map {
47       fork {
48         (1..nr).each { |i| pmq << i }
49         pmq.flush
50       }
51     }
52     workers.each { |wpid| assert Process.waitpid2(wpid).last.success? }
53     pmq.stop_master_loop
54     assert Process.waitpid2(pid).last.success?
55     assert_equal 400, pmq.count
56     agg = Aggregate.new
57     (1..nr_workers).map { (1..nr).each { |i| agg << i } }
58     assert_equal agg.to_s, pmq.to_s
59     assert_equal agg.mean, pmq.mean
60     assert_equal agg.std_dev, pmq.std_dev
61     assert_equal agg.min, pmq.min
62     assert_equal agg.max, pmq.max
63     assert_equal agg.to_s, pmq.to_s
64   end
65 end if pmq