em-synchrony-moped 1.0.0.beta.1 → 1.0.0.beta.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MWM1ZDFhNzU0ZWE3ZjM2MWQ2YTAwODlmOWMzOTliZTU5OTMwZTc2Yg==
4
+ YzlmYzgxNjFkMDA3MjZmY2RkYjQwMjU5NjBkMTQ4Nzc1Yzk0ZjY2NQ==
5
5
  data.tar.gz: !binary |-
6
- MDIxYTY0M2Q1Zjg4NGRjNzBjYjMyZTlmOTEyN2FhOTlhNTk5MTQwOQ==
6
+ ZjM4ZmMxNTJlZTU1MWQ1YTJhNDU3YjY3OTE3MzVhMGM2YjMzYTA5Mg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZGJhNzU3NmZlM2I3YTcxNWM5NmUzMDk4OWRiNTQwNDExMTA3M2U0NjVlYjFh
10
- MDhkMjE5YmViNTZkNDIxY2MwMGFhNDhkZGJkMDBiNjc0ZjgwZmIyNTIzNDZi
11
- MDY4Y2ZhZWIwNmE2YmRjZjUzMzE4MjcyMDczYzE2ZmI4MTE5MmI=
9
+ MTgyMzg5YTI5NmE0ZTI0MWU5NTA0Y2UzYjc0ZTc0M2ZlZDA1OGE1NzQ1MTlj
10
+ YTEyY2IwM2UxMjIxYmFmYzRjNzQ0NDQzYmYwN2ZlYjUzYTJmODNmZTZkM2Ex
11
+ ZmIyOTAzY2IyODMxZjlmZjljMmVhOTUxZDNhZTRhYjE5ZDc4NTU=
12
12
  data.tar.gz: !binary |-
13
- MTM0OTE2NTk1MzI4NGZhYmFiMGRmNzM2ZGQ3MjlmMzI0MjlkNWJhZmRlMmI1
14
- MTU2YmE3ZDViOTA0MTVkYmIzMDk1M2U1NWJkNzYyNWQyZWIyMDBkNTI3OGU4
15
- ZDEzMTBlNGJmNTMyY2RkYjI0MGY5MGNiODBlNjI4ODMyNjU0Yjc=
13
+ YmVkZTRhOTYwNjBmMjc1MjdlZDM4MTIxNzAxNzhmMThjZDdmYjJkYjdjNTFj
14
+ NGFmMGUxNWMwNGQ0YjcwNmM5YjhmMjZiMjJhMGZjZjdhMzc4ZGFjNmJjZmU0
15
+ MGRmZGQ0ZDRmYzhhNGJiNWVkOTdlNWExODk4NWJkOGExZWFkOWI=
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ env: TIMEOUT_HOST=www.google.com
2
+ language: ruby
3
+ rvm:
4
+ - 1.9.3
5
+ - 2.0.0
data/Gemfile CHANGED
@@ -2,4 +2,4 @@ source 'http://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
-
5
+ gem 'coveralls', require: false
data/Guardfile CHANGED
@@ -8,7 +8,7 @@ end
8
8
 
9
9
  guard 'rubocop' do
10
10
  watch(%r{.+\.rb$})
11
- watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
11
+ #watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
12
12
  end
13
13
 
14
14
  guard 'bundler' do
data/README.md CHANGED
@@ -1,8 +1,14 @@
1
- # EM-Synchrony-Moped
1
+ EM-Synchrony-Moped
2
+ =====
3
+ [![Gem Version](https://badge.fury.io/rb/em-synchrony-moped.png)](http://badge.fury.io/rb/em-synchrony-moped) [![Dependency Status](https://gemnasium.com/alebsack/em-synchrony-moped.png)](https://gemnasium.com/alebsack/em-synchrony-moped) [![Build Status](https://travis-ci.org/alebsack/em-synchrony-moped.png?branch=master)](https://travis-ci.org/alebsack/em-synchrony-moped) [![Coverage Status](https://coveralls.io/repos/alebsack/em-synchrony-moped/badge.png?branch=master)](https://coveralls.io/r/alebsack/em-synchrony-moped?branch=master) [![Code Climate](https://codeclimate.com/github/alebsack/em-synchrony-moped.png)](https://codeclimate.com/github/alebsack/em-synchrony-moped)
2
4
 
3
- EM-Synchrony-Moped is a [Moped](https://github.com/mongoid/mongoid) driver patch for [EM-Synchrony](http://github.com/igrigorik/em-synchrony). Moped is the MongoDB driver for the [Mongoid](http://github.com/mongoid/mongoid) ORM.
5
+ EM-Synchrony-Moped is a [Moped](https://github.com/mongoid/moped) driver patch for [EM-Synchrony](http://github.com/igrigorik/em-synchrony). Moped is the MongoDB driver for the [Mongoid](http://github.com/mongoid/mongoid) ORM.
4
6
 
5
- * Supports SSL connections
7
+ ## Features
8
+ * Supports SSL connections and server certificate checking
9
+ * Uses an EventMachine-aware DNS lookup
10
+ * Can be included in threaded applications
11
+ * Unit tested against the threaded (original driver) behavior
6
12
 
7
13
  ## Usage
8
14
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'em-synchrony-moped'
5
- s.version = "1.0.0.beta.1"
5
+ s.version = "1.0.0.beta.2"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Adam Lebsack"]
@@ -19,11 +19,12 @@ Gem::Specification.new do |s|
19
19
  s.require_paths = ["lib"]
20
20
 
21
21
  s.add_runtime_dependency 'eventmachine', '~> 1.0'
22
- s.add_runtime_dependency 'em-synchrony', '~> 1.0'
22
+ s.add_runtime_dependency 'em-synchrony', '~> 1.0.3'
23
23
  s.add_runtime_dependency 'moped', '~> 1.5.1'
24
- s.add_runtime_dependency 'em-resolv-replace', '~> 1.1.3'
24
+ s.add_runtime_dependency 'em-resolv-replace'
25
25
 
26
- s.add_development_dependency 'rspec', '~> 2.12.0'
26
+ s.add_development_dependency 'rake'
27
+ s.add_development_dependency 'rspec'
27
28
  s.add_development_dependency 'guard'
28
29
  s.add_development_dependency 'guard-rspec'
29
30
  s.add_development_dependency 'guard-bundler'
@@ -4,7 +4,7 @@ require 'moped/cluster'
4
4
 
5
5
  module Moped
6
6
  # Our patches to Moped::Cluster
7
- module EventedCluster
7
+ class Cluster
8
8
  def sleep(seconds)
9
9
  if EventMachine.reactor_thread?
10
10
  EM::Synchrony.sleep(seconds)
@@ -13,8 +13,4 @@ module Moped
13
13
  end
14
14
  end
15
15
  end
16
-
17
- class Cluster
18
- include EventedCluster
19
- end
20
16
  end
@@ -1,26 +1,24 @@
1
1
  # encoding: utf-8
2
2
 
3
+ require 'moped/connection'
4
+
3
5
  module Moped
6
+ # Em-Synchrony overrides for Moped::Connection
4
7
  class Connection
8
+ alias_method :super_connect, :connect
5
9
  def connect
6
- if EventMachine.reactor_thread?
7
- if !!options[:ssl]
8
- @sock = Sockets::EmSSL.em_connect(host, port, timeout, options)
9
- else
10
- @sock = Sockets::EmTCP.em_connect(host, port, timeout, options)
11
- end
12
- else # use old driver
13
- if !!options[:ssl]
14
- @sock = Sockets::SSL.connect(host, port, timeout)
15
- else
16
- @sock = Sockets::TCP.connect(host, port, timeout)
17
- end
10
+ return super_connect unless EventMachine.reactor_thread?
11
+ if !!options[:ssl]
12
+ @sock = Sockets::EmSSL.em_connect(host, port, timeout, options)
13
+ else
14
+ @sock = Sockets::EmTCP.em_connect(host, port, timeout, options)
18
15
  end
19
16
  end
20
- end # class Cnnection
17
+ end
21
18
 
22
19
  module Sockets
23
20
  module Connectable
21
+ # Class methods to extend the Connectable Class
24
22
  module ClassMethods
25
23
  def em_connect(host, port, timeout, options)
26
24
  socket = EventMachine.connect(host, port, self) do |c|
@@ -36,10 +34,9 @@ module Moped
36
34
  fail SocketError, socket.unbind_reason
37
35
  end
38
36
  socket
39
-
40
37
  rescue Errno::ETIMEDOUT
41
- fail Errors::ConnectionFailure,
42
- "Timed out connection to Mongo on #{host}:#{port}"
38
+ raise Errors::ConnectionFailure,
39
+ "Timed out connection to Mongo on #{host}:#{port}"
43
40
  rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::EPIPE,
44
41
  Errno::ECONNRESET, IOError => error
45
42
  fail Errors::ConnectionFailure,
@@ -48,10 +45,6 @@ module Moped
48
45
  rescue SocketError => error
49
46
  fail Errors::ConnectionFailure,
50
47
  "#{host}:#{port}: #{error.class.name}: #{error.message}"
51
- rescue OpenSSL::SSL::SSLError => error
52
- fail Errors::ConnectionFailure,
53
- "#{host}:#{port}: #{error.class.name} (#{error.errno}): " +
54
- "#{error.message}"
55
48
  end
56
49
  end
57
50
  end
@@ -59,11 +52,7 @@ module Moped
59
52
  # The EM-Synchrony flavor of Moped::Sockets::TCP
60
53
  class EmTCP < EventMachine::Synchrony::TCPSocket
61
54
  include Connectable
62
-
63
- # TODO: re-evaluate the options call. Can't we pass the caller
64
- # up to the connection or something?
65
55
  attr_accessor :options
66
-
67
56
  def alive?
68
57
  !closed?
69
58
  end
@@ -73,50 +62,49 @@ module Moped
73
62
  class EmSSL < EmTCP
74
63
  def connection_completed
75
64
  @verified = false
76
- if @options[:ssl].is_a?(Hash)
77
- start_tls(@options[:ssl])
78
- else
79
- start_tls
65
+ @cert_store = ssl_options.delete(:cert_store)
66
+ @cert_store ||= OpenSSL::X509::Store.new
67
+ if (cert_file = ssl_options.delete(:verify_cert))
68
+ @cert_store.add_file(cert_file)
80
69
  end
70
+ start_tls(ssl_options)
81
71
  end
82
72
 
83
73
  def ssl_verify_peer(pem)
84
- unless (cert_store = @options[:ssl][:cert_store])
85
- cert_store = OpenSSL::X509::Store.new
86
- cert_store.add_file(@options[:ssl][:verify_cert])
87
- end
88
-
89
- if (cert = OpenSSL::X509::Certificate.new(pem) rescue nil)
90
- if cert_store.verify(cert)
91
-
92
- cert.extensions.each do |e|
93
- if e.oid == 'basicConstraints' && e.value == 'CA:TRUE'
94
- return true
95
- end
96
- end
97
-
98
- host = @options[:ssl][:verify_host]
99
- if OpenSSL::SSL.verify_certificate_identity(cert, host)
100
- @verified = true
101
- return true
102
- end
74
+ return true unless ssl_options[:verify_peer]
75
+ if (cert = certificate(pem)) && @cert_store.verify(cert)
76
+ # bypass hostname checking for this cert if it's a CA
77
+ return true if cert.extensions.find do |e|
78
+ e.oid == 'basicConstraints' && e.value == 'CA:TRUE'
103
79
  end
80
+
81
+ @verified = true if (host = ssl_options[:verify_host]) &&
82
+ OpenSSL::SSL.verify_certificate_identity(cert, host)
104
83
  end
105
84
 
85
+ # Always return true. We will evaluate the certificate chain in
86
+ # ssl_handshake_completed.
106
87
  true
107
- rescue
108
- unbind 'Failed to verify SSL certificate of peer'
109
- false
110
88
  end
111
89
 
112
90
  def ssl_handshake_completed
113
- if @options[:ssl][:verify_peer] && !@verified
91
+ if ssl_options[:verify_peer] && !@verified
114
92
  unbind 'Failed to verify SSL certificate of peer'
115
93
  else
116
94
  @opening = false
117
95
  @in_req.succeed self
118
96
  end
119
97
  end
120
- end
98
+
99
+ private
100
+
101
+ def ssl_options
102
+ @ssl_options ||= @options[:ssl] == true ? {} : @options[:ssl] || {}
103
+ end
104
+
105
+ def certificate(pem)
106
+ OpenSSL::X509::Certificate.new(pem)
107
+ end
108
+ end # EmSSL
121
109
  end
122
110
  end
@@ -5,15 +5,16 @@ require 'em-dns-resolver'
5
5
  require 'fiber'
6
6
 
7
7
  module Moped
8
- # Our monkey patches to Moped::Node
9
- module EventedNode
8
+ # # Our monkey patches to Moped::Node
9
+ class Node
10
+ alias_method :super_parse_address, :parse_address
10
11
  # Override to support non-blocking DNS requests
11
12
  def parse_address
12
- return super if EM.reactor_thread?
13
+ return super_parse_address unless EventMachine.reactor_thread?
13
14
  host, port = address.split(':')
14
15
  @port = (port || 27_017).to_i
15
16
 
16
- @ip_address = em_lookup_address(host)
17
+ @ip_address = em_lookup_address(host).grep(/(::){0}/).first
17
18
  fail SocketError unless @ip_address
18
19
  @resolved_address = "#{@ip_address}:#{@port}"
19
20
  rescue Resolv::ResolvError
@@ -24,7 +25,7 @@ module Moped
24
25
  # Lookup in /etc/hosts
25
26
  result = []
26
27
  @hosts ||= Resolv::Hosts.new
27
- @hosts.send(:each_address, value) { |x| result << x.to_s }
28
+ @hosts.send(:each_address, value) { |x| result << x.to_s if x !~ /::/ }
28
29
  return result unless result.empty?
29
30
 
30
31
  # Nothing, hit DNS
@@ -34,15 +35,11 @@ module Moped
34
35
  fiber.resume(a)
35
36
  end
36
37
  df.errback do |*a|
37
- fiber.resume(ResolvError.new(a.inspect))
38
+ fiber.resume(Resolv::ResolvError.new(a.inspect))
38
39
  end
39
40
  result = Fiber.yield
40
- raise result if result.is_a?(StandardError)
41
+ fail result if result.is_a?(StandardError)
41
42
  result
42
43
  end
43
44
  end
44
-
45
- class Node
46
- include EventedNode
47
- end
48
45
  end
@@ -4,12 +4,9 @@ require 'spec_helper'
4
4
  require 'moped'
5
5
  require 'em-synchrony/moped'
6
6
 
7
- # TODO: clean up a bit. we're basically testing Connection through Node.
8
- # we should be able to test Connection by itself.
9
-
10
7
  describe Moped::Connection do
11
8
  it 'should have patches included' do
12
- expect { Moped::Sockets::EmTCP }.not_to raise_error(NameError)
9
+ expect { Moped::Sockets::EmTCP }.not_to raise_error
13
10
  end
14
11
 
15
12
  let(:mongod_options) { {} }
@@ -17,56 +14,48 @@ describe Moped::Connection do
17
14
  let(:server_port) { server.port }
18
15
  after { server.stop }
19
16
 
20
- let(:node_options) { {} }
21
- let(:node) do
22
- options = node_options.merge(timeout: 1)
23
- host = options.delete(:host) || 'localhost'
24
- Moped::Node.new("#{host}:#{server_port}", options)
17
+ let(:options) { {} }
18
+ let(:conn) do
19
+ timeout = 1
20
+ host = options.delete(:host) || '127.0.0.1'
21
+ port = options.delete(:port) || server_port
22
+ Moped::Connection.new(host, port, timeout, options)
25
23
  end
26
24
 
27
25
  shared_context 'common connection' do
28
26
  context 'with a running server' do
29
27
  it 'should connect' do
30
- node.refresh
31
- node.should be_primary
32
- node.should be_connected
28
+ expect(conn.connect).to be_a(connection_class)
33
29
  end
30
+ end
34
31
 
35
- it 'should detect a disconnect' do
36
- node.refresh
37
- node.should be_primary
38
- node.should be_connected
39
- server.stop
40
- expect do
41
- node.command('admin', ismaster: 1)
42
- end.to raise_error(
43
- Moped::Errors::ConnectionFailure # TODO: check the message
44
- )
45
- node.should_not be_connected
46
- end
47
- end
48
-
49
- context 'with an unpresponsive host' do
32
+ context 'with an unresponsive host' do
50
33
  # 127.0.0.2 seems to timeout for my tests...
51
- let(:node_options) { { host: '127.0.0.2' } }
34
+ let(:options) { { host: ENV['TIMEOUT_HOST'] } }
52
35
  it 'should raise a timeout error' do
53
- expect { node.refresh }.to raise_error(
36
+ expect { conn.connect }.to raise_error(
54
37
  Moped::Errors::ConnectionFailure,
55
38
  /^Timed out connection to Mongo on/)
56
39
  end
57
40
  end
58
41
 
59
42
  context 'without a server' do
43
+ let(:options) { { port: 2 } }
60
44
  it 'should raise a connection error on connection refused' do
61
45
  server.stop
62
- expect { node.refresh }.to raise_error(
46
+ expect { conn.connect }.to raise_error(
63
47
  Moped::Errors::ConnectionFailure, /ECONNREFUSED/)
64
48
  end
65
49
  end
66
50
  end
67
51
 
68
- shared_context 'common connection ssl' do
69
- context 'with ssl server' do
52
+ context 'evented' do
53
+ include_context 'with em-synchrony'
54
+ let(:connection_class) { Moped::Sockets::EmTCP }
55
+ include_context 'common connection'
56
+ context 'with ssl' do
57
+ let(:ssl_options) { nil }
58
+ let(:options) { { ssl: ssl_options } }
70
59
  let(:mongod_options) do
71
60
  {
72
61
  ssl: {
@@ -77,60 +66,196 @@ describe Moped::Connection do
77
66
  }
78
67
  end
79
68
 
80
- context 'without verifying peer' do
81
- let(:node_options) { { ssl: { verify_peer: false } } }
82
- it 'should connect' do
83
- node.refresh
84
- node.should be_primary
69
+ context 'without specifying ssl' do
70
+ let(:ssl_options) { nil }
71
+ let(:options) { {} }
72
+ it 'should connect (though comms will fail later)' do
73
+ expect(conn.connect).to be_a(Moped::Sockets::EmTCP)
85
74
  end
86
75
  end
87
76
 
88
- context 'when verifying peer' do
89
- let(:node_options) do
90
- { ssl: {
91
- verify_peer: true,
92
- verify_cert: "#{SSL_DIR}/ca_cert.pem",
93
- verify_host: 'localhost'
77
+ context 'and a server with a trusted certificate' do
78
+ context 'when specifying ssl: true' do
79
+ let(:ssl_options) { true }
80
+ it 'should connect' do
81
+ expect(conn.connect).to be_a(Moped::Sockets::EmSSL)
82
+ end
83
+ end
84
+
85
+ context 'when specifying ssl: {}' do
86
+ let(:ssl_options) { {} }
87
+ it 'should connect' do
88
+ expect(conn.connect).to be_a(Moped::Sockets::EmSSL)
89
+ end
90
+ end
91
+
92
+ context 'when not verifying peer' do
93
+ let(:ssl_options) { { verify_peer: false } }
94
+ it 'should connect' do
95
+ expect(conn.connect).to be_a(Moped::Sockets::EmSSL)
96
+ end
97
+ end
98
+
99
+ context 'when verifying peer' do
100
+ context 'and no certificate provided' do
101
+ let(:ssl_options) { { verify_peer: true } }
102
+ it 'should raise an error' do
103
+ expect { conn.connect }
104
+ .to raise_error(
105
+ Moped::Errors::ConnectionFailure,
106
+ /Failed to verify SSL certificate of peer/
107
+ )
108
+ end
109
+ end
110
+
111
+ context 'and a certificate is provided' do
112
+ context 'and verify_host is not provided' do
113
+ let(:ssl_options) do
114
+ {
115
+ verify_peer: true,
116
+ verify_cert: "#{SSL_DIR}/ca_cert.pem"
117
+ }
118
+ end
119
+ it 'should raise an error' do
120
+ expect { conn.connect }
121
+ .to raise_error(
122
+ Moped::Errors::ConnectionFailure,
123
+ /Failed to verify SSL certificate of peer/
124
+ )
125
+ end
126
+ end
127
+ context 'and verify_host does not match the server cert' do
128
+ let(:ssl_options) do
129
+ {
130
+ verify_peer: true,
131
+ verify_cert: "#{SSL_DIR}/ca_cert.pem",
132
+ verify_host: 'remotehost'
133
+ }
134
+ end
135
+ it 'should raise an error' do
136
+ expect { conn.connect }
137
+ .to raise_error(
138
+ Moped::Errors::ConnectionFailure,
139
+ /Failed to verify SSL certificate of peer/
140
+ )
141
+ end
142
+ end
143
+ context 'and verify_host matches the server cert' do
144
+ let(:ssl_options) do
145
+ {
146
+ verify_peer: true,
147
+ verify_cert: "#{SSL_DIR}/ca_cert.pem",
148
+ verify_host: 'localhost'
149
+ }
150
+ end
151
+ it 'should connect' do
152
+ expect(conn.connect).to be_a(Moped::Sockets::EmSSL)
153
+ end
154
+ end
155
+ end # 'and a certificate is provided'
156
+ end # 'when verifying peer'
157
+ end # server with a trusted certificate
158
+ context 'and a server with an untrusted certificate' do
159
+ let(:mongod_options) do
160
+ {
161
+ ssl: {
162
+ private_key_file: "#{SSL_DIR}/untrusted.key",
163
+ cert_chain_file: "#{SSL_DIR}/untrusted.crt",
164
+ verify_peer: false
94
165
  }
95
166
  }
96
167
  end
97
- it 'should connect' do
98
- node.refresh
99
- node.should be_primary
168
+
169
+ context 'when specifying ssl: true' do
170
+ let(:ssl_options) { true }
171
+ it 'should connect' do
172
+ expect(conn.connect).to be_a(Moped::Sockets::EmSSL)
173
+ end
100
174
  end
101
175
 
102
- context 'with untrusted key on server' do
103
- let(:mongod_options) do
104
- {
105
- ssl: {
106
- private_key_file: "#{SSL_DIR}/untrusted.key",
107
- cert_chain_file: "#{SSL_DIR}/untrusted.crt",
108
- verify_peer: false
109
- }
110
- }
176
+ context 'when specifying ssl: {}' do
177
+ let(:ssl_options) { {} }
178
+ it 'should connect' do
179
+ expect(conn.connect).to be_a(Moped::Sockets::EmSSL)
111
180
  end
181
+ end
112
182
 
113
- it 'should connect and fail to verify peer' do
114
- expect do
115
- node.refresh
116
- node.should be_primary
117
- end.to raise_error(
118
- Moped::Errors::ConnectionFailure,
119
- /Failed to verify SSL certificate of peer/
120
- )
183
+ context 'when not verifying peer' do
184
+ let(:ssl_options) { { verify_peer: false } }
185
+ it 'should connect' do
186
+ expect(conn.connect).to be_a(Moped::Sockets::EmSSL)
121
187
  end
122
188
  end
123
- end
124
- end
125
- end
126
189
 
127
- context 'evented' do
128
- include_context 'with em-synchrony'
129
- include_context 'common connection'
130
- include_context 'common connection ssl'
131
- end
190
+ context 'when verifying peer' do
191
+ context 'and no certificate provided' do
192
+ let(:ssl_options) { { verify_peer: true } }
193
+ it 'should raise an error' do
194
+ expect { conn.connect }
195
+ .to raise_error(
196
+ Moped::Errors::ConnectionFailure,
197
+ /Failed to verify SSL certificate of peer/
198
+ )
199
+ end
200
+ end
201
+
202
+ context 'and a certificate is provided' do
203
+ context 'and verify_host is not provided' do
204
+ let(:ssl_options) do
205
+ {
206
+ verify_peer: true,
207
+ verify_cert: "#{SSL_DIR}/ca_cert.pem"
208
+ }
209
+ end
210
+ it 'should raise an error' do
211
+ expect { conn.connect }
212
+ .to raise_error(
213
+ Moped::Errors::ConnectionFailure,
214
+ /Failed to verify SSL certificate of peer/
215
+ )
216
+ end
217
+ end
218
+ context 'and verify_host does not match the server cert' do
219
+ let(:ssl_options) do
220
+ {
221
+ verify_peer: true,
222
+ verify_cert: "#{SSL_DIR}/ca_cert.pem",
223
+ verify_host: 'remotehost'
224
+ }
225
+ end
226
+ it 'should raise an error' do
227
+ expect { conn.connect }
228
+ .to raise_error(
229
+ Moped::Errors::ConnectionFailure,
230
+ /Failed to verify SSL certificate of peer/
231
+ )
232
+ end
233
+ end
234
+ context 'and verify_host matches the server cert' do
235
+ let(:ssl_options) do
236
+ {
237
+ verify_peer: true,
238
+ verify_cert: "#{SSL_DIR}/ca_cert.pem",
239
+ verify_host: 'localhost'
240
+ }
241
+ end
242
+ it 'should raise an error' do
243
+ expect { conn.connect }
244
+ .to raise_error(
245
+ Moped::Errors::ConnectionFailure,
246
+ /Failed to verify SSL certificate of peer/
247
+ )
248
+ end
249
+ end
250
+ end # 'and a certificate is provided'
251
+ end # 'when verifying peer'
252
+ end # 'and a server with an untrusted certificate'
253
+ end # 'with ssl'
254
+ end # 'evented'
255
+
132
256
  context 'threaded' do
133
257
  include_context 'without em-synchrony'
258
+ let(:connection_class) { Moped::Sockets::TCP }
134
259
  include_context 'common connection'
135
260
  end
136
261
 
@@ -14,7 +14,8 @@ describe Moped::Node do
14
14
  let(:node) do
15
15
  options = node_options.merge(timeout: 1)
16
16
  host = options.delete(:host) || 'localhost'
17
- Moped::Node.new("#{host}:#{server_port}", options)
17
+ port = options.delete(:port) || server_port
18
+ Moped::Node.new("#{host}:#{port}", options)
18
19
  end
19
20
 
20
21
  shared_context 'common node' do
@@ -39,9 +40,9 @@ describe Moped::Node do
39
40
  end
40
41
  end
41
42
 
42
- context 'with an unpresponsive host' do
43
+ context 'with an unresponsive host' do
43
44
  # 127.0.0.2 seems to timeout for my tests...
44
- let(:node_options) { { host: '127.0.0.2' } }
45
+ let(:node_options) { { host: ENV['TIMEOUT_HOST'] } }
45
46
  it 'should raise a timeout error' do
46
47
  expect { node.refresh }.to raise_error(
47
48
  Moped::Errors::ConnectionFailure,
@@ -58,6 +59,7 @@ describe Moped::Node do
58
59
  end
59
60
 
60
61
  context 'without a server' do
62
+ let(:node_options) { { port: 2 } }
61
63
  it 'should raise a connection error on connection refused' do
62
64
  server.stop
63
65
  expect { node.refresh }.to raise_error(
data/spec/spec_helper.rb CHANGED
@@ -10,8 +10,16 @@ Spork.prefork do
10
10
  # if you change any configuration or code from libraries loaded here, you'll
11
11
  # need to restart spork for it take effect.
12
12
 
13
+ ENV['TIMEOUT_HOST'] ||= 'www.google.com'
14
+
13
15
  require 'rspec'
14
16
  require 'simplecov'
17
+ require 'coveralls'
18
+
19
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
20
+ SimpleCov::Formatter::HTMLFormatter,
21
+ Coveralls::SimpleCov::Formatter
22
+ ]
15
23
  SimpleCov.start do
16
24
  add_group 'Lib', 'lib'
17
25
  add_filter '/spec/'
@@ -5,11 +5,12 @@ shared_context 'with em-synchrony' do
5
5
  require 'em-synchrony'
6
6
  EventMachine.error_handler do |e|
7
7
  puts "Error in Eventmachine: #{e.inspect}"
8
- EM.stop
8
+ puts e.backtrace.join("\n")
9
+ EventMachine.stop
9
10
  end
10
11
  EventMachine.synchrony do
11
12
  example.run
12
- EM.stop if EM.reactor_running?
13
+ EventMachine.stop if EventMachine.reactor_running?
13
14
  end
14
15
  end
15
16
  end
@@ -18,7 +19,8 @@ shared_context 'without em-synchrony' do
18
19
  before(:each) do
19
20
  EventMachine.error_handler do |e|
20
21
  puts "Error in Eventmachine: #{e.inspect}"
21
- EM.stop
22
+ puts e.backtrace.join("\n")
23
+ EventMachine.stop
22
24
  end
23
25
  queue = Queue.new
24
26
  @em_thread = Thread.new { EventMachine.run { queue << true } }
@@ -26,7 +28,7 @@ shared_context 'without em-synchrony' do
26
28
  end
27
29
 
28
30
  after(:each) do
29
- EM.stop
31
+ EventMachine.stop
30
32
  @em_thread.join
31
33
  end
32
34
  end
@@ -134,7 +134,7 @@ class FakeMongodServer
134
134
  ensure_reactor do
135
135
  @server = EventMachine.start_server(
136
136
  @host, 0, FakeMongod, @options, self)
137
- @port = Socket.unpack_sockaddr_in(EM.get_sockname(@server))[0]
137
+ @port = Socket.unpack_sockaddr_in(EventMachine.get_sockname(@server))[0]
138
138
  end
139
139
  end
140
140
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: em-synchrony-moped
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.beta.1
4
+ version: 1.0.0.beta.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Lebsack
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-12 00:00:00.000000000 Z
11
+ date: 2013-11-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: eventmachine
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - ~>
32
32
  - !ruby/object:Gem::Version
33
- version: '1.0'
33
+ version: 1.0.3
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ~>
39
39
  - !ruby/object:Gem::Version
40
- version: '1.0'
40
+ version: 1.0.3
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: moped
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -56,30 +56,44 @@ dependencies:
56
56
  name: em-resolv-replace
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ~>
59
+ - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
- version: 1.1.3
61
+ version: '0'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ~>
66
+ - - ! '>='
67
67
  - !ruby/object:Gem::Version
68
- version: 1.1.3
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: rspec
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - ~>
87
+ - - ! '>='
74
88
  - !ruby/object:Gem::Version
75
- version: 2.12.0
89
+ version: '0'
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - ~>
94
+ - - ! '>='
81
95
  - !ruby/object:Gem::Version
82
- version: 2.12.0
96
+ version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: guard
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -187,6 +201,7 @@ extensions: []
187
201
  extra_rdoc_files: []
188
202
  files:
189
203
  - .gitignore
204
+ - .travis.yml
190
205
  - Gemfile
191
206
  - Guardfile
192
207
  - README.md