em-synchrony 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -9,7 +9,7 @@ describe EventMachine::Synchrony::ConnectionPool do
9
9
  EventMachine.run do
10
10
 
11
11
  db = EventMachine::Synchrony::ConnectionPool.new(size: 1) do
12
- EventMachine::MySQL.new(host: "localhost")
12
+ Mysql2::EM::Client.new
13
13
  end
14
14
 
15
15
  Fiber.new {
@@ -33,7 +33,7 @@ describe EventMachine::Synchrony::ConnectionPool do
33
33
  EventMachine.run do
34
34
 
35
35
  db = EventMachine::Synchrony::ConnectionPool.new(size: 2) do
36
- EventMachine::MySQL.new(host: "localhost")
36
+ Mysql2::EM::Client.new
37
37
  end
38
38
 
39
39
  Fiber.new {
@@ -57,7 +57,7 @@ describe EventMachine::Synchrony::ConnectionPool do
57
57
  EventMachine.run do
58
58
 
59
59
  db = EventMachine::Synchrony::ConnectionPool.new(size: 2) do
60
- EventMachine::MySQL.new(host: "localhost")
60
+ Mysql2::EM::Client.new
61
61
  end
62
62
 
63
63
  Fiber.new {
@@ -88,7 +88,7 @@ describe EventMachine::Synchrony::ConnectionPool do
88
88
  EventMachine.run do
89
89
 
90
90
  db = EventMachine::Synchrony::ConnectionPool.new(size: 5) do
91
- EventMachine::MySQL.new(host: "localhost")
91
+ Mysql2::EM::Client.new
92
92
  end
93
93
 
94
94
  Fiber.new {
@@ -230,4 +230,30 @@ describe EM::Mongo do
230
230
  EventMachine.stop
231
231
  end
232
232
  end
233
+
234
+ context "authentication" do
235
+ # these specs only get asserted if you run mongod with the --auth flag
236
+ it "successfully authenticates" do
237
+ # For this spec you will need to add this user to the database
238
+ #
239
+ # From the Mongo shell:
240
+ # > use db
241
+ # > db.addUser('test', 'test')
242
+ EventMachine.synchrony do
243
+ database = EM::Mongo::Connection.new.db('db')
244
+ database.authenticate('test', 'test').should == true
245
+ EventMachine.stop
246
+ end
247
+ end
248
+
249
+ it "raises an AuthenticationError if it cannot authenticate" do
250
+ EventMachine.synchrony do
251
+ database = EM::Mongo::Connection.new.db('db')
252
+ proc {
253
+ database.authenticate('test', 'wrong_password')
254
+ }.should raise_error(EventMachine::Mongo::AuthenticationError, "auth fails")
255
+ EventMachine.stop
256
+ end
257
+ end
258
+ end
233
259
  end
data/spec/helper/all.rb CHANGED
@@ -10,19 +10,13 @@ require 'lib/em-synchrony/em-memcache'
10
10
  require 'lib/em-synchrony/em-mongo'
11
11
  require 'lib/em-synchrony/em-redis'
12
12
  require 'lib/em-synchrony/em-hiredis'
13
+ require 'lib/em-synchrony/amqp'
13
14
 
14
15
  require 'helper/tolerance_matcher'
15
16
  require 'helper/stub-http-server'
16
17
 
17
18
  def now(); Time.now.to_f; end
18
19
 
19
- def silence_warnings()
20
- old_verbose, $VERBOSE = $VERBOSE, nil
21
- yield
22
- ensure
23
- $VERBOSE = old_verbose
24
- end
25
-
26
20
  RSpec.configure do |config|
27
21
  config.include(Sander6::CustomMatchers)
28
22
  end
data/spec/hiredis_spec.rb CHANGED
@@ -11,6 +11,29 @@ describe EM::Hiredis do
11
11
  end
12
12
  end
13
13
 
14
+ it "should work with compact connect syntax" do
15
+ EventMachine.synchrony do
16
+ redis = EM::Hiredis.connect
17
+
18
+ redis.set('a', 'bar')
19
+ redis.get('a').should == 'bar'
20
+
21
+ EM.stop
22
+ end
23
+ end
24
+
25
+ it "should work with manual db select" do
26
+ EventMachine.synchrony do
27
+ redis = EM::Hiredis.connect 'redis://127.0.0.1:6379'
28
+ redis.select(0)
29
+
30
+ redis.set('a', 'baz')
31
+ redis.get('a').should == 'baz'
32
+
33
+ EM.stop
34
+ end
35
+ end
36
+
14
37
  it "should get/set records synchronously" do
15
38
  EventMachine.synchrony do
16
39
  redis = EM::Hiredis::Client.connect
@@ -26,7 +49,7 @@ describe EM::Hiredis do
26
49
  it "should incr/decr key synchronously" do
27
50
  EventMachine.synchrony do
28
51
  redis = EM::Hiredis::Client.connect
29
- redis.delete('key')
52
+ redis.del('key')
30
53
 
31
54
  redis.incr('key')
32
55
  redis.get('key').to_i.should == 1
data/spec/http_spec.rb CHANGED
@@ -59,24 +59,24 @@ describe EventMachine::HttpRequest do
59
59
  EventMachine.stop
60
60
  end
61
61
  end
62
-
62
+
63
63
  it "should terminate immediately in case of connection errors" do
64
64
  EventMachine.synchrony do
65
- response = EventMachine::HttpRequest.new(CONNECTION_ERROR_URL).get
65
+ response = EventMachine::HttpRequest.new(CONNECTION_ERROR_URL, :connection_timeout => 0.1).get
66
66
  response.error.should_not be_nil
67
-
67
+
68
68
  EventMachine.stop
69
69
  end
70
70
  end
71
-
71
+
72
72
  it "should process inactivity timeout correctly" do
73
73
  EventMachine.synchrony do
74
74
  s = StubServer.new("HTTP/1.0 200 OK\r\nConnection: close\r\n\r\nFoo", 5)
75
-
75
+
76
76
  start = now
77
- r = EventMachine::HttpRequest.new(URL, :inactivity_timeout => 0.5).get
78
- (now - start.to_f).should be_within(0.2).of(0.5)
79
-
77
+ r = EventMachine::HttpRequest.new(URL, :inactivity_timeout => 0.1).get
78
+ (now - start.to_f).should be_within(0.2).of(0.1)
79
+
80
80
  s.stop
81
81
  EventMachine.stop
82
82
  end
@@ -0,0 +1,13 @@
1
+ require "helper/all"
2
+
3
+ describe EM::Synchrony do
4
+ describe "Multi" do
5
+ it "should require unique keys for each deferrable" do
6
+ lambda do
7
+ m = EM::Synchrony::Multi.new
8
+ m.add :df1, EM::DefaultDeferrable.new
9
+ m.add :df1, EM::DefaultDeferrable.new
10
+ end.should raise_error("Duplicate Multi key")
11
+ end
12
+ end
13
+ end
data/spec/mysql2_spec.rb CHANGED
@@ -107,4 +107,17 @@ describe Mysql2::EM::Client do
107
107
  end
108
108
  end
109
109
 
110
+ it "errback should not catch exception thrown from callback" do
111
+ class ErrbackShouldNotCatchThis < Exception; end
112
+ proc {
113
+ EM.synchrony do
114
+ db = Mysql2::EM::Client.new
115
+ res = db.query QUERY
116
+ raise ErrbackShouldNotCatchThis.new("errback should not catch this")
117
+
118
+ EventMachine.stop
119
+ end
120
+ }.should raise_error(ErrbackShouldNotCatchThis)
121
+ end
122
+
110
123
  end
@@ -1,14 +1,33 @@
1
1
  require "helper/all"
2
2
 
3
- describe EM::Synchrony, "#sync" do
4
- it "returns immediately if the syncee already succeeded" do
5
- args = stub("args")
6
-
7
- Fiber.new {
8
- df = EM::DefaultDeferrable.new
9
- df.succeed args
10
-
11
- EM::Synchrony.sync(df).should == args
12
- }.resume
3
+ describe EM::Synchrony do
4
+ describe "#sync" do
5
+ it "returns immediately if the syncee already succeeded" do
6
+ args = stub("args")
7
+
8
+ Fiber.new {
9
+ df = EM::DefaultDeferrable.new
10
+ df.succeed args
11
+ EM::Synchrony.sync(df).should == args
12
+
13
+ df = EM::DefaultDeferrable.new
14
+ df.succeed nil
15
+ EM::Synchrony.sync(df).should == nil
16
+ }.resume
17
+ end
18
+ end
19
+
20
+ describe "#next_tick" do
21
+ it "should wrap next_tick into a Fiber context" do
22
+ Fiber.new {
23
+ df = EM::DefaultDeferrable.new
24
+
25
+ EM::Synchrony.next_tick do
26
+ df.succeed args
27
+ EM::Synchrony.sync(df).should == args
28
+ end
29
+ }.resume
30
+ end
13
31
  end
32
+
14
33
  end
@@ -17,4 +17,14 @@ describe EventMachine::Synchrony::TCPSocket do
17
17
  EM.stop
18
18
  end
19
19
  end
20
+
21
+ it 'should accept "send" when wrapped in a connection pool' do
22
+ EventMachine.synchrony do
23
+ @socket = EventMachine::Synchrony::ConnectionPool.new(size: 1) do
24
+ EventMachine::Synchrony::TCPSocket.new 'eventmachine.rubyforge.org', 80
25
+ end
26
+ @socket.send("GET / HTTP1.1\r\n\r\n").class.should be(Fixnum)
27
+ EM.stop
28
+ end
29
+ end
20
30
  end
@@ -0,0 +1,191 @@
1
+ require "spec/helper/all"
2
+
3
+ describe EventMachine::Synchrony::Thread::Mutex do
4
+ let(:m) { EM::Synchrony::Thread::Mutex.new }
5
+ it "should synchronize" do
6
+ EM.synchrony do
7
+ i = 0
8
+ f1 = Fiber.new do
9
+ m.synchronize do
10
+ f = Fiber.current
11
+ EM.next_tick { f.resume }
12
+ Fiber.yield
13
+ i += 1
14
+ end
15
+ end.resume
16
+ f1 = Fiber.new do
17
+ m.synchronize do
18
+ i.should eql(1)
19
+ EM.stop
20
+ end
21
+ end.resume
22
+ end
23
+ end
24
+
25
+ describe "lock" do
26
+ describe "when mutex already locked" do
27
+
28
+ it "should raise ThreadError" do
29
+ f = Fiber.new do
30
+ m.lock
31
+ Fiber.yield
32
+ m.lock
33
+ end
34
+ f.resume
35
+ proc { f.resume }.should raise_error(FiberError)
36
+ end
37
+ end
38
+ end
39
+
40
+ describe "sleep" do
41
+ describe "without timeout" do
42
+ it "should sleep until resume" do
43
+ EM.synchrony do
44
+ m.lock
45
+ i = 0
46
+ f = Fiber.current
47
+ EM.next_tick { i += 1; f.resume }
48
+ res = m.sleep
49
+ i.should eql(1)
50
+ EM.stop
51
+ end
52
+ end
53
+
54
+ it "should release lock" do
55
+ EM.synchrony do
56
+ i = 0
57
+ Fiber.new do
58
+ m.lock
59
+ f = Fiber.current
60
+ EM.next_tick { f.resume }
61
+ Fiber.yield
62
+ i += 1
63
+ m.sleep
64
+ end.resume
65
+ Fiber.new do
66
+ m.lock
67
+ i.should eql(1)
68
+ EM.stop
69
+ end.resume
70
+ end
71
+ end
72
+
73
+ it "should wait unlock after resume" do
74
+ EM.synchrony do
75
+ i = 0
76
+ f1 = Fiber.new do
77
+ m.lock
78
+ m.sleep
79
+ i.should eql(1)
80
+ EM.stop
81
+ end
82
+ f2 = Fiber.new do
83
+ m.lock
84
+ f1.resume
85
+ i += 1
86
+ m.unlock
87
+ end
88
+ f1.resume
89
+ f2.resume
90
+ end
91
+ end
92
+
93
+ describe "with timeout" do
94
+ it "should sleep for timeout" do
95
+ EM.synchrony do
96
+ m.lock
97
+ i = 0
98
+ EM.next_tick { i += 1 }
99
+ m.sleep(0.05)
100
+ i.should eql(1)
101
+ EM.stop
102
+ end
103
+ end
104
+ describe "and resume before timeout" do
105
+ it "should not raise any execptions" do
106
+ EM.synchrony do
107
+ m.lock
108
+ f = Fiber.current
109
+ EM.next_tick { f.resume }
110
+ m.sleep(0.05)
111
+ EM.add_timer(0.1) { EM.stop }
112
+ end
113
+ end
114
+ it "should resume in nested Fiber" do
115
+ EM.synchrony do
116
+ f = Fiber.new do
117
+ m.synchronize do
118
+ t = m.sleep(0.05)
119
+ t.should >= 0.05
120
+ end
121
+ EM.stop
122
+ end
123
+ f.resume
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
130
+ describe EventMachine::Synchrony::Thread::ConditionVariable do
131
+ let(:c){ EM::Synchrony::Thread::ConditionVariable.new }
132
+ it "should wakeup waiter" do
133
+ i = ''
134
+ EM.synchrony do
135
+ f1 = Fiber.new do
136
+ m.synchronize do
137
+ i << 'a'
138
+ c.wait(m)
139
+ i << 'c'
140
+ end
141
+ EM.stop
142
+ end.resume
143
+ f2 = Fiber.new do
144
+ i << 'b'
145
+ c.signal
146
+ end.resume
147
+ end
148
+ i.should == 'abc'
149
+ end
150
+ it 'should allow to play ping-pong' do
151
+ i = ''
152
+ EM.synchrony do
153
+ f1 = Fiber.new do
154
+ m.synchronize do
155
+ i << 'pi'
156
+ c.wait(m)
157
+ i << '-po'
158
+ c.signal
159
+ end
160
+ end.resume
161
+ f2 = Fiber.new do
162
+ m.synchronize do
163
+ i << 'ng'
164
+ c.signal
165
+ c.wait(m)
166
+ i << 'ng'
167
+ end
168
+ EM.stop
169
+ end.resume
170
+ end
171
+ i.should == 'ping-pong'
172
+ end
173
+ it 'should not raise, when timer wakes up fiber between `signal` and `next_tick`' do
174
+ proc {
175
+ EM.synchrony do
176
+ f = Fiber.new do
177
+ m.synchronize do
178
+ c.wait(m, 0.0001)
179
+ end
180
+ EM.add_timer(0.001){ EM.stop }
181
+ end
182
+ i = 0
183
+ f.resume
184
+ EM.next_tick{
185
+ c.signal
186
+ }
187
+ end
188
+ }.should_not raise_error
189
+ end
190
+ end
191
+ end