mongo 2.1.1 → 2.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d8c7fcad401a8586ae8ba1c0b864238fce8039a2
4
- data.tar.gz: 9499b901d192abf1910f71a47fa0316633c32c31
3
+ metadata.gz: 5848eb885418bc7cba6b6a44761b1b47f4bbcb7d
4
+ data.tar.gz: fa960cc01b750a11b49a30a64cc602a6b665898e
5
5
  SHA512:
6
- metadata.gz: 5b4532f3365fda5b9351e334a882e92ccaa7fb0c006fa84b3e5e0bb922f9a8b3a5a7366f00ad1b505d0d7d4298c5438b5e57a5ce0f397105c8f49835618681b3
7
- data.tar.gz: 262cb8675d073741690971aa9e141fb53324de2a3835f6e0e024b8faa654fba1aa3c451b4711793ef1e7df0d039e765675c5cb4bf1d1229a214ab70389dac379
6
+ metadata.gz: 5b6809a0802bba0bc3bd58d45dff14a15f6bddf4194deaa4063fadebf27bcb1a3af451c28f1076d5094ab18a65522b5571ca62bd5e2ff3baaf3d583e3962ec1c
7
+ data.tar.gz: da274d6b705a440c81d7fb9f09a413ef3a200ca1af858c1eb0b82db1a4ffd95edba29d07872e031440c5822bcac4114cabf40b3b3b32d1af349e4d80452fdb28
@@ -0,0 +1,2 @@
1
+ ��ī���!����a�oP�L������&jNt�gs�m�q�:�5�bǗ���5$�냄�Ư���~�YC[�� �wė�_=���7��dj星.�v��p��&n�Z��SG-5�X|�U�O�2vtޯ�X9Z!Q��iйI�������e��N�������z�M[5�CO GB�U4i�;��
2
+ L]a���f��?3{�tn�Fp�Poo3 �I��[�MXȆz
Binary file
@@ -20,6 +20,7 @@ module Mongo
20
20
  # @since 2.0.0
21
21
  class Client
22
22
  extend Forwardable
23
+ include Loggable
23
24
 
24
25
  # The options that do not affect the behaviour of a cluster and its
25
26
  # subcomponents.
@@ -27,6 +28,40 @@ module Mongo
27
28
  # @since 2.1.0
28
29
  CRUD_OPTIONS = [ :database, :read, :write ].freeze
29
30
 
31
+ # Valid client options.
32
+ #
33
+ # @since 2.1.2
34
+ VALID_OPTIONS = [
35
+ :auth_mech,
36
+ :auth_source,
37
+ :connect,
38
+ :database,
39
+ :auth_mech_properties,
40
+ :heartbeat_frequency,
41
+ :local_threshold,
42
+ :server_selection_timeout,
43
+ :password,
44
+ :max_pool_size,
45
+ :min_pool_size,
46
+ :wait_queue_timeout,
47
+ :connect_timeout,
48
+ :read,
49
+ :roles,
50
+ :replica_set,
51
+ :ssl,
52
+ :ssl_cert,
53
+ :ssl_key,
54
+ :ssl_key_pass_phrase,
55
+ :ssl_verify,
56
+ :ssl_ca_cert,
57
+ :socket_timeout,
58
+ :user,
59
+ :write,
60
+ :monitoring,
61
+ :logger,
62
+ :truncate_logs
63
+ ].freeze
64
+
30
65
  # @return [ Mongo::Cluster ] cluster The cluster of servers for the client.
31
66
  attr_reader :cluster
32
67
 
@@ -160,9 +195,9 @@ module Mongo
160
195
  def initialize(addresses_or_uri, options = Options::Redacted.new)
161
196
  @monitoring = Monitoring.new(options)
162
197
  if addresses_or_uri.is_a?(::String)
163
- create_from_uri(addresses_or_uri, options)
198
+ create_from_uri(addresses_or_uri, validate_options(options))
164
199
  else
165
- create_from_addresses(addresses_or_uri, options)
200
+ create_from_addresses(addresses_or_uri, validate_options(options))
166
201
  end
167
202
  yield(self) if block_given?
168
203
  end
@@ -221,7 +256,7 @@ module Mongo
221
256
  # @since 2.0.0
222
257
  def with(new_options = Options::Redacted.new)
223
258
  clone.tap do |client|
224
- opts = Options::Redacted.new(new_options) || Options::Redacted.new
259
+ opts = validate_options(new_options)
225
260
  client.options.update(opts)
226
261
  Database.create(client)
227
262
  # We can't use the same cluster if some options that would affect it
@@ -296,14 +331,14 @@ module Mongo
296
331
  private
297
332
 
298
333
  def create_from_addresses(addresses, opts = Options::Redacted.new)
299
- @options = Options::Redacted.new(Database::DEFAULT_OPTIONS.merge(opts)).freeze
334
+ @options = Database::DEFAULT_OPTIONS.merge(opts).freeze
300
335
  @cluster = Cluster.new(addresses, @monitoring, options)
301
336
  @database = Database.new(self, options[:database], options)
302
337
  end
303
338
 
304
339
  def create_from_uri(connection_string, opts = Options::Redacted.new)
305
340
  uri = URI.new(connection_string, opts)
306
- @options = Options::Redacted.new(Database::DEFAULT_OPTIONS.merge(uri.client_options.merge(opts))).freeze
341
+ @options = Database::DEFAULT_OPTIONS.merge(uri.client_options.merge(opts)).freeze
307
342
  @cluster = Cluster.new(uri.servers, @monitoring, options)
308
343
  @database = Database.new(self, options[:database], options)
309
344
  end
@@ -324,5 +359,17 @@ module Mongo
324
359
  options[name] != value
325
360
  end
326
361
  end
362
+
363
+ def validate_options(opts = Options::Redacted.new)
364
+ return Options::Redacted.new unless opts
365
+ Options::Redacted.new(opts.select do |o|
366
+ if VALID_OPTIONS.include?(o)
367
+ true
368
+ else
369
+ log_warn("Unsupported client option '#{o}'. It will be ignored.")
370
+ false
371
+ end
372
+ end)
373
+ end
327
374
  end
328
375
  end
@@ -148,8 +148,8 @@ module Mongo
148
148
  #
149
149
  # @return [ Hash ] The result of the command execution.
150
150
  def command(operation, opts = {})
151
- preference = opts[:read] ? ServerSelector.get(client.options.merge(opts[:read])) : read_preference
152
- server = preference.select_server(cluster)
151
+ preference = ServerSelector.get(client.options.merge(opts[:read])) if opts[:read]
152
+ server = preference ? preference.select_server(cluster) : cluster.next_primary
153
153
  Operation::Command.new({
154
154
  :selector => operation,
155
155
  :db_name => name,
@@ -438,7 +438,7 @@ module Mongo
438
438
  end
439
439
 
440
440
  def ensure_indexes!
441
- if files_collection.find({}, projection: { _id: 1 }).to_a.empty?
441
+ if files_collection.find({}, limit: 1, projection: { _id: 1 }).first.nil?
442
442
  chunks_collection.indexes.create_one(FSBucket::CHUNKS_INDEX, :unique => true)
443
443
  files_collection.indexes.create_one(FSBucket::FILES_INDEX)
444
444
  end
@@ -93,7 +93,7 @@ module Mongo
93
93
  #
94
94
  # @since 2.1.0
95
95
  def logger
96
- (options[:logger] || Logger.logger)
96
+ ((options && options[:logger]) || Logger.logger)
97
97
  end
98
98
 
99
99
  private
@@ -32,7 +32,7 @@ module Mongo
32
32
  # @since 2.0.0
33
33
  def execute(context)
34
34
  context.with_connection do |connection|
35
- result_class = defined?(self.class::Result) ? self.class::Result : Result
35
+ result_class = self.class.const_defined?(:Result, false) ? self.class::Result : Result
36
36
  result_class.new(connection.dispatch([ message(context) ], operation_id)).validate!
37
37
  end
38
38
  end
@@ -26,8 +26,8 @@ module Mongo
26
26
 
27
27
  def execute_message(context)
28
28
  context.with_connection do |connection|
29
- result_class = defined?(self.class::LegacyResult) ? self.class::LegacyResult :
30
- defined?(self.class::Result) ? self.class::Result : Result
29
+ result_class = self.class.const_defined?(:LegacyResult, false) ? self.class::LegacyResult :
30
+ self.class.const_defined?(:Result, false) ? self.class::Result : Result
31
31
  result_class.new(connection.dispatch([ message, gle ].compact)).validate!
32
32
  end
33
33
  end
@@ -44,7 +44,7 @@ module Mongo
44
44
  private
45
45
 
46
46
  def execute_write_command(context)
47
- result_class = defined?(self.class::Result) ? self.class::Result : Result
47
+ result_class = self.class.const_defined?(:Result, false) ? self.class::Result : Result
48
48
  result_class.new(write_command_op.execute(context)).validate!
49
49
  end
50
50
  end
@@ -52,7 +52,9 @@ module Mongo
52
52
  # We don't scan the cluster in this case as Mongos always returns
53
53
  # ready after a ping no matter what the state behind it is.
54
54
  sleep(cluster.read_retry_interval)
55
- read_with_retry(attempt - 1, &block)
55
+ read_with_retry(attempt + 1, &block)
56
+ else
57
+ raise e
56
58
  end
57
59
  else
58
60
  raise e
@@ -25,7 +25,7 @@ module Mongo
25
25
  # @since 2.1.0
26
26
  SSL = 'ssl'.freeze
27
27
 
28
- # The default time in seconds to timeout a connection attempt.
28
+ # The default time in seconds to timeout an operation executed on a socket.
29
29
  #
30
30
  # @since 2.0.0
31
31
  TIMEOUT = 5.freeze
@@ -64,12 +64,12 @@ module Mongo
64
64
  !!@socket && @socket.alive?
65
65
  end
66
66
 
67
- # Get the connection timeout.
67
+ # Get the timeout to execute an operation on a socket.
68
68
  #
69
- # @example Get the connection timeout.
69
+ # @example Get the timeout to execute an operation on a socket.
70
70
  # connection.timeout
71
71
  #
72
- # @return [ Float ] The connection timeout in seconds.
72
+ # @return [ Float ] The operation timeout in seconds.
73
73
  #
74
74
  # @since 2.0.0
75
75
  def timeout
@@ -22,6 +22,23 @@ module Mongo
22
22
  class Connection
23
23
  include Connectable
24
24
 
25
+ # The default time in seconds to timeout a connection attempt.
26
+ #
27
+ # @since 2.1.2
28
+ CONNECT_TIMEOUT = 10.freeze
29
+
30
+ # Get the connection timeout.
31
+ #
32
+ # @example Get the connection timeout.
33
+ # connection.timeout
34
+ #
35
+ # @return [ Float ] The connection timeout in seconds.
36
+ #
37
+ # @since 2.0.0
38
+ def timeout
39
+ @timeout ||= options[:connect_timeout] || CONNECT_TIMEOUT
40
+ end
41
+
25
42
  # Tell the underlying socket to establish a connection to the host.
26
43
  #
27
44
  # @example Connect to the host.
@@ -93,7 +93,10 @@ module Mongo
93
93
  #
94
94
  # @since 2.0.0
95
95
  def readbyte
96
- handle_errors { socket.read(1) }
96
+ handle_errors do
97
+ byte = socket.read(1).bytes.to_a[0]
98
+ byte.nil? ? raise(EOFError) : byte
99
+ end
97
100
  end
98
101
 
99
102
  private
@@ -17,5 +17,5 @@ module Mongo
17
17
  # The current version of the driver.
18
18
  #
19
19
  # @since 2.0.0
20
- VERSION = '2.1.1'.freeze
20
+ VERSION = '2.1.2'.freeze
21
21
  end
@@ -166,7 +166,7 @@ describe Mongo::Client do
166
166
  described_class.new(
167
167
  ['127.0.0.1:27017'],
168
168
  :read => { :mode => :primary },
169
- :local_threshold_ms => 10,
169
+ :local_threshold => 10,
170
170
  :server_selection_timeout => 10000,
171
171
  :database => TEST_DB
172
172
  )
@@ -174,7 +174,7 @@ describe Mongo::Client do
174
174
 
175
175
  let(:options) do
176
176
  Mongo::Options::Redacted.new(:read => { :mode => :primary },
177
- :local_threshold_ms => 10,
177
+ :local_threshold => 10,
178
178
  :server_selection_timeout => 10000,
179
179
  :database => TEST_DB)
180
180
  end
@@ -373,6 +373,26 @@ describe Mongo::Client do
373
373
  expect(client.cluster.topology).to be_a(Mongo::Cluster::Topology::ReplicaSet)
374
374
  end
375
375
  end
376
+
377
+ context 'when an invalid option is provided' do
378
+
379
+ let(:client) do
380
+ described_class.new(['127.0.0.1:27017'], :ssl => false, :invalid => :test)
381
+ end
382
+
383
+ it 'does not set the option' do
384
+ expect(client.options.keys).not_to include('invalid')
385
+ end
386
+
387
+ it 'sets the valid options' do
388
+ expect(client.options.keys).to include('ssl')
389
+ end
390
+
391
+ it 'warns that an invalid option has been specified' do
392
+ expect(Mongo::Logger.logger).to receive(:warn)
393
+ expect(client.options.keys).not_to include('invalid')
394
+ end
395
+ end
376
396
  end
377
397
  end
378
398
 
@@ -624,6 +644,26 @@ describe Mongo::Client do
624
644
  end
625
645
  end
626
646
  end
647
+
648
+ context 'when an invalid option is provided' do
649
+
650
+ let(:new_client) do
651
+ client.with(invalid: :option, ssl: false)
652
+ end
653
+
654
+ it 'does not set the invalid option' do
655
+ expect(new_client.options.keys).not_to include('invalid')
656
+ end
657
+
658
+ it 'sets the valid options' do
659
+ expect(new_client.options.keys).to include('ssl')
660
+ end
661
+
662
+ it 'warns that an invalid option has been specified' do
663
+ expect(Mongo::Logger.logger).to receive(:warn)
664
+ expect(new_client.options.keys).not_to include('invalid')
665
+ end
666
+ end
627
667
  end
628
668
 
629
669
  describe '#write_concern' do
@@ -322,7 +322,7 @@ describe Mongo::Collection::View::Readable do
322
322
  end
323
323
 
324
324
  it 'returns the distinct values' do
325
- expect(distinct).to eq([ 'test1', 'test2', 'test3' ])
325
+ expect(distinct.sort).to eq([ 'test1', 'test2', 'test3' ])
326
326
  end
327
327
  end
328
328
 
@@ -333,7 +333,7 @@ describe Mongo::Collection::View::Readable do
333
333
  end
334
334
 
335
335
  it 'returns the distinct values' do
336
- expect(distinct).to eq([ 'test1', 'test2', 'test3' ])
336
+ expect(distinct.sort).to eq([ 'test1', 'test2', 'test3' ])
337
337
  end
338
338
  end
339
339
 
@@ -364,7 +364,7 @@ describe Mongo::Collection::View::Readable do
364
364
  end
365
365
 
366
366
  it 'returns the distinct values' do
367
- expect(distinct).to eq([ 'test1', 'test2', 'test3' ])
367
+ expect(distinct.sort).to eq([ 'test1', 'test2', 'test3' ])
368
368
  end
369
369
  end
370
370
 
@@ -822,7 +822,7 @@ describe Mongo::Collection do
822
822
  end
823
823
 
824
824
  it 'returns the distinct values' do
825
- expect(authorized_collection.distinct(:field)).to eq([ 'test1', 'test2', 'test3' ])
825
+ expect(authorized_collection.distinct(:field).sort).to eq([ 'test1', 'test2', 'test3' ])
826
826
  end
827
827
 
828
828
  context 'when a selector is provided' do
@@ -835,7 +835,7 @@ describe Mongo::Collection do
835
835
  context 'when options are provided' do
836
836
 
837
837
  it 'passes the options to the distinct command' do
838
- expect(authorized_collection.distinct(:field, {}, max_time_ms: 100)).to eq([ 'test1', 'test2', 'test3' ])
838
+ expect(authorized_collection.distinct(:field, {}, max_time_ms: 100).sort).to eq([ 'test1', 'test2', 'test3' ])
839
839
  end
840
840
  end
841
841
  end
@@ -228,6 +228,18 @@ describe Mongo::Database do
228
228
  end.to raise_error(Mongo::Error::NoServerAvailable)
229
229
  end
230
230
  end
231
+
232
+ context 'when there is a read preference set on the client' do
233
+
234
+ let(:database) do
235
+ described_class.new(authorized_client.with(read: { mode: :secondary }), TEST_DB)
236
+ end
237
+
238
+ it 'does not use the read preference' do
239
+ expect(database.client.cluster).to receive(:next_primary).and_call_original
240
+ database.command(ping: 1)
241
+ end
242
+ end
231
243
  end
232
244
 
233
245
  describe '#drop' do
@@ -272,4 +272,23 @@ describe Mongo::Operation::Result do
272
272
  end
273
273
  end
274
274
  end
275
+
276
+ context 'when there is a top-level Result class defined' do
277
+
278
+ before do
279
+ class Result
280
+ def get_result
281
+ Mongo::Client.new([DEFAULT_ADDRESS], TEST_OPTIONS).database.command(:ping => 1)
282
+ end
283
+ end
284
+ end
285
+
286
+ let(:result) do
287
+ Result.new.get_result
288
+ end
289
+
290
+ it 'uses the Result class of the operation' do
291
+ expect(result).to be_a(Mongo::Operation::Result)
292
+ end
293
+ end
275
294
  end
@@ -149,11 +149,11 @@ describe Mongo::Retryable do
149
149
  before do
150
150
  expect(operation).to receive(:execute).and_raise(error).ordered
151
151
  expect(cluster).to receive(:sharded?).and_return(true)
152
- expect(cluster).to receive(:max_read_retries).and_return(1).ordered
152
+ expect(cluster).to receive(:max_read_retries).and_return(2).ordered
153
153
  expect(cluster).to receive(:read_retry_interval).and_return(0.1).ordered
154
154
  expect(operation).to receive(:execute).and_raise(error).ordered
155
155
  expect(cluster).to receive(:sharded?).and_return(true)
156
- expect(cluster).to receive(:max_read_retries).and_return(1).ordered
156
+ expect(cluster).to receive(:max_read_retries).and_return(2).ordered
157
157
  expect(cluster).to receive(:read_retry_interval).and_return(0.1).ordered
158
158
  expect(operation).to receive(:execute).and_return(true).ordered
159
159
  end
@@ -192,4 +192,27 @@ describe Mongo::Server::Monitor do
192
192
  expect(thread.stop?).to be(true)
193
193
  end
194
194
  end
195
+
196
+ describe '#connection' do
197
+
198
+ context 'when there is a connect_timeout option set' do
199
+
200
+ let(:connect_timeout) do
201
+ 1
202
+ end
203
+
204
+ let(:monitor) do
205
+ described_class.new(address, listeners, TEST_OPTIONS.merge(connect_timeout: connect_timeout))
206
+ end
207
+
208
+ it 'sets the value as the timeout on the connection' do
209
+ expect(monitor.connection.timeout).to eq(connect_timeout)
210
+ end
211
+
212
+ it 'set the value as the timeout on the socket' do
213
+ monitor.connection.connect!
214
+ expect(monitor.connection.send(:socket).timeout).to eq(connect_timeout)
215
+ end
216
+ end
217
+ end
195
218
  end
@@ -1,24 +1,23 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Mongo::Socket::SSL do
3
+ describe Mongo::Socket::SSL, if: running_ssl? do
4
4
 
5
- describe '#connect!', if: running_ssl? do
6
-
7
- let(:socket) do
8
- described_class.new(*DEFAULT_ADDRESS.split(":"), DEFAULT_ADDRESS.split(":")[0], 5, Socket::PF_INET, options)
9
- end
5
+ let(:socket) do
6
+ described_class.new(*DEFAULT_ADDRESS.split(":"), DEFAULT_ADDRESS.split(":")[0], 5, Socket::PF_INET, options)
7
+ end
10
8
 
11
- context 'when a certificate is provided' do
9
+ let(:options) do
10
+ {
11
+ :ssl => true,
12
+ :ssl_cert => CLIENT_PEM,
13
+ :ssl_key => CLIENT_PEM,
14
+ :ssl_verify => false
15
+ }
16
+ end
12
17
 
13
- let(:options) do
14
- {
15
- :ssl => true,
16
- :ssl_cert => CLIENT_PEM,
17
- :ssl_key => CLIENT_PEM,
18
- :ssl_verify => false
19
- }
20
- end
18
+ describe '#connect!' do
21
19
 
20
+ context 'when a certificate is provided' do
22
21
 
23
22
  context 'when connecting the tcp socket is successful' do
24
23
 
@@ -55,12 +54,9 @@ describe Mongo::Socket::SSL do
55
54
  context 'when a bad certificate is provided' do
56
55
 
57
56
  let(:options) do
58
- {
59
- :ssl => true,
60
- :ssl_cert => CLIENT_PEM,
61
- :ssl_key => CRL_PEM,
62
- :ssl_verify => false
63
- }
57
+ super().merge({
58
+ :ssl_key => CRL_PEM
59
+ })
64
60
  end
65
61
 
66
62
  it 'raises an exception' do
@@ -73,13 +69,10 @@ describe Mongo::Socket::SSL do
73
69
  context 'when a CA certificate is provided', if: testing_ssl_locally? do
74
70
 
75
71
  let(:options) do
76
- {
77
- :ssl => true,
78
- :ssl_cert => CLIENT_PEM,
79
- :ssl_key => CLIENT_PEM,
80
- :ssl_ca_cert => CA_PEM,
81
- :ssl_verify => true
82
- }
72
+ super().merge({
73
+ :ssl_ca_cert => CA_PEM,
74
+ :ssl_verify => true
75
+ })
83
76
  end
84
77
 
85
78
  before do
@@ -94,12 +87,9 @@ describe Mongo::Socket::SSL do
94
87
  context 'when a CA certificate is not provided', if: testing_ssl_locally? do
95
88
 
96
89
  let(:options) do
97
- {
98
- :ssl => true,
99
- :ssl_cert => CLIENT_PEM,
100
- :ssl_key => CLIENT_PEM,
101
- :ssl_verify => true
102
- }
90
+ super().merge({
91
+ :ssl_verify => true
92
+ })
103
93
  end
104
94
 
105
95
  before do
@@ -115,12 +105,9 @@ describe Mongo::Socket::SSL do
115
105
  context 'when ssl_verify is not specified', if: testing_ssl_locally? do
116
106
 
117
107
  let(:options) do
118
- {
119
- :ssl => true,
120
- :ssl_cert => CLIENT_PEM,
121
- :ssl_key => CLIENT_PEM,
122
- :ssl_ca_cert => CA_PEM
123
- }
108
+ super().merge({
109
+ :ssl_ca_cert => CA_PEM
110
+ }).tap { |options| options.delete(:ssl_verify) }
124
111
  end
125
112
 
126
113
  before do
@@ -135,13 +122,10 @@ describe Mongo::Socket::SSL do
135
122
  context 'when ssl_verify is true', if: testing_ssl_locally? do
136
123
 
137
124
  let(:options) do
138
- {
139
- :ssl => true,
140
- :ssl_cert => CLIENT_PEM,
141
- :ssl_key => CLIENT_PEM,
142
- :ssl_ca_cert => CA_PEM,
143
- :ssl_verify => true
144
- }
125
+ super().merge({
126
+ :ssl_ca_cert => CA_PEM,
127
+ :ssl_verify => true
128
+ })
145
129
  end
146
130
 
147
131
  before do
@@ -156,13 +140,10 @@ describe Mongo::Socket::SSL do
156
140
  context 'when ssl_verify is false' do
157
141
 
158
142
  let(:options) do
159
- {
160
- :ssl => true,
161
- :ssl_cert => CLIENT_PEM,
162
- :ssl_key => CLIENT_PEM,
163
- :ssl_ca_cert => 'invalid',
164
- :ssl_verify => false
165
- }
143
+ super().merge({
144
+ :ssl_ca_cert => 'invalid',
145
+ :ssl_verify => false
146
+ })
166
147
  end
167
148
 
168
149
  before do
@@ -174,4 +155,43 @@ describe Mongo::Socket::SSL do
174
155
  end
175
156
  end
176
157
  end
158
+
159
+ describe '#readbyte' do
160
+
161
+ before do
162
+ allow_message_expectations_on_nil
163
+
164
+ allow(socket.socket).to receive(:read) do |length|
165
+ socket_content[0, length]
166
+ end
167
+ end
168
+
169
+ context 'with the socket providing "abc"' do
170
+
171
+ let(:socket_content) { "abc" }
172
+
173
+ it 'should return 97 (the byte for "a")' do
174
+ expect(socket.readbyte).to eq(97)
175
+ end
176
+ end
177
+
178
+ context 'with the socket providing "\x00" (NULL_BYTE)' do
179
+
180
+ let(:socket_content) { "\x00" }
181
+
182
+ it 'should return 0' do
183
+ expect(socket.readbyte).to eq(0)
184
+ end
185
+ end
186
+
187
+ context 'with the socket providing no data' do
188
+
189
+ let(:socket_content) { "" }
190
+
191
+ it 'should raise EOFError' do
192
+ expect { socket.readbyte }
193
+ .to raise_error(Mongo::Error::SocketError).with_message("EOFError")
194
+ end
195
+ end
196
+ end
177
197
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongo
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.1
4
+ version: 2.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tyler Brock
@@ -9,8 +9,30 @@ authors:
9
9
  - Durran Jordan
10
10
  autorequire:
11
11
  bindir: bin
12
- cert_chain: []
13
- date: 2015-09-30 00:00:00.000000000 Z
12
+ cert_chain:
13
+ - |
14
+ -----BEGIN CERTIFICATE-----
15
+ MIIDfDCCAmSgAwIBAgIBATANBgkqhkiG9w0BAQUFADBCMRQwEgYDVQQDDAtkcml2
16
+ ZXItcnVieTEVMBMGCgmSJomT8ixkARkWBTEwZ2VuMRMwEQYKCZImiZPyLGQBGRYD
17
+ Y29tMB4XDTE0MTEyMDE1NTYxOVoXDTE1MTEyMDE1NTYxOVowQjEUMBIGA1UEAwwL
18
+ ZHJpdmVyLXJ1YnkxFTATBgoJkiaJk/IsZAEZFgUxMGdlbjETMBEGCgmSJomT8ixk
19
+ ARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANFdSAa8fRm1
20
+ bAM9za6Z0fAH4g02bqM1NGnw8zJQrE/PFrFfY6IFCT2AsLfOwr1maVm7iU1+kdVI
21
+ IQ+iI/9+E+ArJ+rbGV3dDPQ+SLl3mLT+vXjfjcxMqI2IW6UuVtt2U3Rxd4QU0kdT
22
+ JxmcPYs5fDN6BgYc6XXgUjy3m+Kwha2pGctdciUOwEfOZ4RmNRlEZKCMLRHdFP8j
23
+ 4WTnJSGfXDiuoXICJb5yOPOZPuaapPSNXp93QkUdsqdKC32I+KMpKKYGBQ6yisfA
24
+ 5MyVPPCzLR1lP5qXVGJPnOqUAkvEUfCahg7EP9tI20qxiXrR6TSEraYhIFXL0EGY
25
+ u8KAcPHm5KkCAwEAAaN9MHswCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0O
26
+ BBYEFFt3WbF+9JpUjAoj62cQBgNb8HzXMCAGA1UdEQQZMBeBFWRyaXZlci1ydWJ5
27
+ QDEwZ2VuLmNvbTAgBgNVHRIEGTAXgRVkcml2ZXItcnVieUAxMGdlbi5jb20wDQYJ
28
+ KoZIhvcNAQEFBQADggEBAKjvumG2Fy9zAoSc1OEcmAqqOfzx1U+isGyEsz1rs5eT
29
+ HAIHsxaEdZTjSwDuqyelLDWJHWspeWU5pV5lepfI4cop29wwoPJIJ9Az2RMMbtdv
30
+ gFApVb6QX61OMenFeOdJ/QZ3n9xcrxJZFdvrXQ5GjEU2anq3dJhFeESwIMlfVJC7
31
+ 7XrlMxizzH712DPfy65dMj0Y39qHdoWYKeCkEoj5UWNcHRK9xgaHJR6prlXrIhgb
32
+ o2UXDbWtz5PqoFd8EgNJAn3+BG1pwC9S9pVFG3WPucfAx/bE8iq/vvchHei5Y/Vo
33
+ aAz5f/hY4zFeYWvGDBHYEXE1rTN2hhMSyJscPcFbmz0=
34
+ -----END CERTIFICATE-----
35
+ date: 2015-10-16 00:00:00.000000000 Z
14
36
  dependencies:
15
37
  - !ruby/object:Gem::Dependency
16
38
  name: bson
@@ -37,7 +59,6 @@ files:
37
59
  - README.md
38
60
  - Rakefile
39
61
  - bin/mongo_console
40
- - lib/csasl/csasl.bundle
41
62
  - lib/mongo.rb
42
63
  - lib/mongo/address.rb
43
64
  - lib/mongo/address/ipv4.rb
@@ -521,7 +542,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
521
542
  version: '0'
522
543
  requirements: []
523
544
  rubyforge_project: mongo
524
- rubygems_version: 2.4.5.1
545
+ rubygems_version: 2.4.8
525
546
  signing_key:
526
547
  specification_version: 4
527
548
  summary: Ruby driver for MongoDB
Binary file
Binary file