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