evented-spec 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. data/HISTORY +8 -1
  2. data/README.textile +51 -9
  3. data/Rakefile +3 -4
  4. data/VERSION +1 -1
  5. data/lib/evented-spec.rb +22 -1
  6. data/lib/evented-spec/amqp_spec.rb +27 -0
  7. data/lib/evented-spec/coolio_spec.rb +26 -0
  8. data/lib/evented-spec/em_spec.rb +26 -0
  9. data/lib/evented-spec/evented_example.rb +13 -5
  10. data/lib/evented-spec/evented_example/amqp_example.rb +8 -7
  11. data/lib/evented-spec/evented_example/coolio_example.rb +4 -18
  12. data/lib/evented-spec/evented_example/em_example.rb +6 -12
  13. data/lib/evented-spec/{amqp.rb → ext/amqp.rb} +31 -2
  14. data/lib/evented-spec/ext/coolio.rb +14 -0
  15. data/lib/evented-spec/spec_helper.rb +141 -0
  16. data/lib/evented-spec/spec_helper/amqp_helpers.rb +55 -0
  17. data/lib/evented-spec/spec_helper/coolio_helpers.rb +49 -0
  18. data/lib/evented-spec/spec_helper/event_machine_helpers.rb +52 -0
  19. data/spec/em_hooks_spec.rb +3 -3
  20. data/spec/evented-spec/adapters/adapter_seg.rb +156 -0
  21. data/spec/evented-spec/adapters/amqp_spec.rb +58 -0
  22. data/spec/evented-spec/adapters/cool_io_spec.rb +30 -0
  23. data/spec/evented-spec/adapters/em_spec.rb +29 -0
  24. data/spec/{em_defaults_spec.rb → evented-spec/defaults_options_spec.rb} +0 -0
  25. data/spec/{em_metadata_spec.rb → evented-spec/evented_spec_metadata_spec.rb} +0 -0
  26. data/spec/{util_spec.rb → evented-spec/util_spec.rb} +0 -0
  27. data/spec/{failing_rspec_spec.rb → integration/failing_rspec_spec.rb} +1 -1
  28. data/spec/spec_helper.rb +18 -9
  29. data/tasks/spec.rake +7 -2
  30. metadata +44 -24
  31. data/lib/evented-spec/rspec.rb +0 -267
  32. data/spec/cool_io_spec.rb +0 -72
  33. data/spec/rspec_amqp_spec.rb +0 -116
  34. data/spec/rspec_em_spec.rb +0 -53
  35. data/spec/shared_examples.rb +0 -194
@@ -1,72 +0,0 @@
1
- require 'spec_helper'
2
-
3
-
4
- describe EventedSpec::SpecHelper, "Cool.io bindings" do
5
- include EventedSpec::SpecHelper
6
- default_timeout 0.1
7
- let(:event_loop) { Coolio::Loop.default }
8
-
9
- after(:each) {
10
- event_loop.instance_variable_get(:@running).should be_false
11
- }
12
-
13
- describe "#coolio" do
14
- it "should execute given block in the right scope" do
15
- coolio do
16
- @variable = true
17
- done
18
- end
19
- @variable.should be_true
20
- end
21
-
22
- it "should start default cool.io loop and give control" do
23
- coolio do
24
- event_loop.instance_variable_get(:@running).should be_true
25
- done
26
- end
27
- end
28
-
29
- it "should stop the event loop afterwards" do
30
- coolio do
31
- @do_something_useful = true
32
- done
33
- end
34
- event_loop.instance_variable_get(:@running).should be_false
35
- end
36
-
37
- it "should raise SpecTimeoutExceededError when #done is not issued" do
38
- expect {
39
- coolio do
40
- end
41
- }.to raise_error(EventedSpec::SpecHelper::SpecTimeoutExceededError)
42
- end
43
-
44
- it "should propagate mismatched rspec expectations" do
45
- expect {
46
- coolio do
47
- :fail.should == :win
48
- end
49
- }.to raise_error(RSPEC::Expectations::ExpectationNotMetError)
50
- end
51
- end
52
-
53
-
54
- describe "#done" do
55
- it "should execute given block" do
56
- coolio do
57
- done(0.05) do
58
- @variable = true
59
- end
60
- end
61
- @variable.should be_true
62
- end
63
-
64
- it "should cancel timeout" do
65
- expect {
66
- coolio do
67
- done(0.2)
68
- end
69
- }.to_not raise_error
70
- end
71
- end
72
- end
@@ -1,116 +0,0 @@
1
- require 'spec_helper'
2
-
3
- def publish_and_consume_once(queue_name="test_sink", data="data")
4
- amqp(:spec_timeout => 0.5) do
5
- AMQP::Channel.new do |channel, _|
6
- exchange = channel.direct(queue_name)
7
- queue = channel.queue(queue_name).bind(exchange)
8
- queue.subscribe do |hdr, msg|
9
- hdr.should be_an AMQP::Header
10
- msg.should == data
11
- done { queue.unsubscribe; queue.delete }
12
- end
13
- EM.add_timer(0.2) do
14
- exchange.publish data
15
- end
16
- end
17
- end
18
- end
19
-
20
- describe RSPEC do
21
- it 'should work as normal without AMQP-Spec' do
22
- 1.should == 1
23
- end
24
- end
25
-
26
- describe 'Evented AMQP specs' do
27
- describe AMQP, " when testing with EventedSpec::SpecHelper" do
28
- include EventedSpec::SpecHelper
29
-
30
- default_options AMQP_OPTS if defined? AMQP_OPTS
31
- default_timeout 1
32
-
33
- puts "Default timeout: #{default_timeout}"
34
- puts "Default options :#{default_options}"
35
-
36
- it_should_behave_like 'SpecHelper examples'
37
-
38
- context 'inside embedded context / example group' do
39
- it_should_behave_like 'SpecHelper examples'
40
- end
41
- end
42
-
43
- describe AMQP, " when testing with EventedSpec::AMQPSpec" do
44
- include EventedSpec::AMQPSpec
45
-
46
- default_options AMQP_OPTS if defined? AMQP_OPTS
47
- default_timeout 1
48
-
49
- it_should_behave_like 'Spec examples'
50
-
51
- context 'inside embedded context / example group' do
52
- it 'should inherit default_options/metadata from enclosing example group' do
53
- # This is a guard against regression on dev box without notice
54
- AMQP.connection.instance_variable_get(:@settings)[:host].should == AMQP_OPTS[:host]
55
- self.class.default_options[:host].should == AMQP_OPTS[:host]
56
- self.class.default_timeout.should == 1
57
- done
58
- end
59
-
60
- it_should_behave_like 'Spec examples'
61
- end
62
- end
63
-
64
- describe AMQP, " tested with EventedSpec::SpecHelper when Rspec failures occur" do
65
- include EventedSpec::SpecHelper
66
-
67
- default_options AMQP_OPTS if defined? AMQP_OPTS
68
-
69
- it "bubbles failing expectations up to Rspec" do
70
- expect {
71
- amqp do
72
- :this.should == :fail
73
- end
74
- }.to raise_error RSPEC::Expectations::ExpectationNotMetError
75
- AMQP.connection.should == nil
76
- end
77
-
78
- it "should NOT ignore failing expectations after 'done'" do
79
- expect {
80
- amqp do
81
- done
82
- :this.should == :fail
83
- end
84
- }.to raise_error RSPEC::Expectations::ExpectationNotMetError
85
- AMQP.connection.should == nil
86
- end
87
-
88
- it "should properly close AMQP connection after Rspec failures" do
89
- AMQP.connection.should == nil
90
- end
91
- end
92
-
93
- describe 'MQ', " when AMQP.queue/fanout/topic tries to access Thread.current[:mq] across examples" do
94
- include EventedSpec::SpecHelper
95
-
96
- default_options AMQP_OPTS if defined? AMQP_OPTS
97
-
98
- it 'sends data to the queue' do
99
- publish_and_consume_once
100
- end
101
-
102
- it 'does not hang sending data to the same queue, again' do
103
- publish_and_consume_once
104
- end
105
-
106
- it 'cleans Thread.current[:mq] after pubsub examples' do
107
- Thread.current[:mq].should be_nil
108
- end
109
- end
110
- end
111
-
112
- describe RSPEC, " when running an example group after another group that uses AMQP-Spec " do
113
- it "should work normally" do
114
- :does_not_hang.should_not be_false
115
- end
116
- end
@@ -1,53 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'Plain EM, no AMQP' do
4
- describe EventMachine, " when testing with EventedSpec::SpecHelper" do
5
- include EventedSpec::SpecHelper
6
-
7
- it "should not require a call to done when #em is not used" do
8
- 1.should == 1
9
- end
10
-
11
- it "should have timers" do
12
- start = Time.now
13
- em do
14
- EM.add_timer(0.5) {
15
- (Time.now-start).should be_within(0.1).of(0.5)
16
- done
17
- }
18
- end
19
- end
20
-
21
- it "should be possible to set spec timeouts as a number of seconds" do
22
- start = Time.now
23
- expect {
24
- em(0.5) do
25
- EM.add_timer(1) { done }
26
- end
27
- }.to raise_error EventedSpec::SpecHelper::SpecTimeoutExceededError
28
- (Time.now-start).should be_within(0.1).of(0.5)
29
- end
30
-
31
- it "should be possible to set spec timeout as an option (amqp interface compatibility)" do
32
- start = Time.now
33
- expect {
34
- em(0.5) do
35
- EM.add_timer(1) { done }
36
- end
37
- }.to raise_error EventedSpec::SpecHelper::SpecTimeoutExceededError
38
- (Time.now-start).should be_within(0.1).of(0.5)
39
- end
40
- end
41
-
42
- describe EventMachine, " when testing with EventedSpec::EMSpec" do
43
- include EventedSpec::EMSpec
44
-
45
- it_should_behave_like 'Spec examples'
46
- end
47
- end
48
-
49
- describe RSPEC, " when running an example group after groups that uses EM specs " do
50
- it "should work normally" do
51
- :does_not_hang.should_not be_false
52
- end
53
- end
@@ -1,194 +0,0 @@
1
- shared_examples_for 'SpecHelper examples' do
2
- after do
3
- EM.reactor_running?.should == false
4
- AMQP.connection.should be_nil
5
- end
6
-
7
- it "should not require a call to done when #em/#amqp is not used" do
8
- 1.should == 1
9
- end
10
-
11
- it "should properly work" do
12
- amqp { done }
13
- end
14
-
15
- it "should have timers" do
16
- start = Time.now
17
- amqp do
18
- EM.add_timer(0.5) {
19
- (Time.now-start).should be_within(0.1).of(0.5)
20
- done
21
- }
22
- end
23
- end
24
-
25
- it 'should have deferrables' do
26
- amqp do
27
- defr = EM::DefaultDeferrable.new
28
- defr.timeout(0.5)
29
- defr.errback {
30
- done
31
- }
32
- end
33
- end
34
-
35
- it "should run AMQP.start loop with options given to #amqp" do
36
- amqp(:vhost => '/', :user => 'guest') do
37
- AMQP.connection.should be_connected
38
- done
39
- end
40
- end
41
-
42
- it "should properly close AMQP connection if block completes normally" do
43
- amqp do
44
- AMQP.connection.should be_connected
45
- done
46
- end
47
- AMQP.connection.should be_nil
48
- end
49
-
50
- # TODO: remove dependency on (possibly long) DNS lookup
51
- it "should gracefully exit if no AMQP connection was made" do
52
- expect {
53
- amqp(:host => '192.168.0.256') do
54
- AMQP.connection.should be_nil
55
- done
56
- end
57
- }.to raise_error EventMachine::ConnectionError
58
- AMQP.connection.should be_nil
59
- end
60
-
61
- it_should_behave_like 'done examples'
62
-
63
- it_should_behave_like 'timeout examples'
64
- end
65
-
66
- shared_examples_for 'done examples' do
67
-
68
- it 'should yield to block given to done (when amqp is used)' do
69
- amqp do
70
- done { @block_called = true; EM.reactor_running?.should == true }
71
- end
72
- @block_called.should == true
73
- end
74
-
75
- it 'should yield to block given to done (when em is used)' do
76
- em do
77
- done { @block_called = true; EM.reactor_running?.should == true }
78
- end
79
- @block_called.should == true
80
- end
81
-
82
- it 'should have delayed done (when amqp is used)' do
83
- start = Time.now
84
- amqp do
85
- done(0.2) { @block_called = true; EM.reactor_running?.should == true }
86
- end
87
- @block_called.should == true
88
- (Time.now-start).should be_within(0.1).of(0.2)
89
- end
90
-
91
- it 'should have delayed done (when em is used)' do
92
- start = Time.now
93
- em do
94
- done(0.2) { @block_called = true; EM.reactor_running?.should == true }
95
- end
96
- @block_called.should == true
97
- (Time.now-start).should be_within(0.1).of(0.2)
98
- end
99
- end
100
-
101
- shared_examples_for 'timeout examples' do
102
- before { @start = Time.now }
103
-
104
- it 'should timeout before reaching done because of default spec timeout' do
105
- expect { amqp { EM.add_timer(2) { done } } }.
106
- to raise_error EventedSpec::SpecHelper::SpecTimeoutExceededError
107
- (Time.now-@start).should be_within(0.1).of(1.0)
108
- end
109
-
110
- it 'should timeout before reaching done because of explicit in-loop timeout' do
111
- expect {
112
- amqp do
113
- timeout(0.2)
114
- EM.add_timer(0.5) { done }
115
- end
116
- }.to raise_error EventedSpec::SpecHelper::SpecTimeoutExceededError
117
- (Time.now-@start).should be_within(0.1).of(0.2)
118
- end
119
-
120
- specify "spec timeout given in amqp options has higher priority than default" do
121
- expect { amqp(:spec_timeout => 0.2) {} }.
122
- to raise_error EventedSpec::SpecHelper::SpecTimeoutExceededError
123
- (Time.now-@start).should be_within(0.1).of(0.2)
124
- end
125
-
126
- specify "but timeout call inside amqp loop has even higher priority" do
127
- expect { amqp(:spec_timeout => 0.5) { timeout(0.2) } }.
128
- to raise_error EventedSpec::SpecHelper::SpecTimeoutExceededError
129
- (Time.now-@start).should be_within(0.1).of(0.2)
130
- end
131
-
132
- specify "AMQP connection should not leak between examples" do
133
- AMQP.connection.should be_nil
134
- end
135
-
136
- context 'embedded context can set up separate defaults' do
137
- default_timeout 0.2 # Can be used to set default :spec_timeout for all evented specs
138
-
139
- specify 'default timeout should be 0.2' do
140
- expect { em { EM.add_timer(2) { done } } }.to raise_error EventedSpec::SpecHelper::SpecTimeoutExceededError
141
- (Time.now-@start).should be_within(0.1).of(0.2)
142
- end
143
-
144
- context 'deeply embedded context can set up separate defaults' do
145
- default_timeout 0.5
146
-
147
- specify 'default timeout should be 0.5' do
148
- expect { amqp { EM.add_timer(2) { done } } }.to raise_error EventedSpec::SpecHelper::SpecTimeoutExceededError
149
- (Time.now-@start).should be_within(0.1).of(0.5)
150
- end
151
- end
152
- end
153
- end
154
-
155
- shared_examples_for 'Spec examples' do
156
- after(:each) do
157
- # By this time, EM loop is stopped, either by timeout, or by exception
158
- EM.reactor_running?.should == false
159
- end
160
-
161
- it 'should work' do
162
- done
163
- end
164
-
165
- it 'should have timers' do
166
- start = Time.now
167
-
168
- EM.add_timer(0.2) {
169
- (Time.now-start).should be_within(0.1).of(0.2)
170
- done
171
- }
172
- end
173
-
174
- it 'should have periodic timers' do
175
- num = 0
176
- start = Time.now
177
-
178
- timer = EM.add_periodic_timer(0.2) {
179
- if (num += 1) == 2
180
- (Time.now-start).should be_within(0.1).of(0.5)
181
- EM.cancel_timer timer
182
- done
183
- end
184
- }
185
- end
186
-
187
- it 'should have deferrables' do
188
- defr = EM::DefaultDeferrable.new
189
- defr.timeout(0.2)
190
- defr.errback {
191
- done
192
- }
193
- end
194
- end