mongo 2.14.0 → 2.15.0.alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/README.md +4 -1
  5. data/Rakefile +8 -15
  6. data/lib/mongo.rb +23 -0
  7. data/lib/mongo/auth/aws/conversation.rb +1 -4
  8. data/lib/mongo/auth/base.rb +13 -7
  9. data/lib/mongo/auth/conversation_base.rb +32 -0
  10. data/lib/mongo/auth/cr/conversation.rb +6 -29
  11. data/lib/mongo/auth/gssapi/conversation.rb +4 -15
  12. data/lib/mongo/auth/ldap/conversation.rb +3 -14
  13. data/lib/mongo/auth/sasl_conversation_base.rb +1 -13
  14. data/lib/mongo/auth/scram_conversation_base.rb +7 -34
  15. data/lib/mongo/auth/user/view.rb +16 -9
  16. data/lib/mongo/auth/x509/conversation.rb +4 -25
  17. data/lib/mongo/background_thread.rb +11 -0
  18. data/lib/mongo/bulk_write.rb +21 -18
  19. data/lib/mongo/client.rb +82 -6
  20. data/lib/mongo/cluster.rb +19 -28
  21. data/lib/mongo/cluster/reapers/cursor_reaper.rb +6 -2
  22. data/lib/mongo/cluster/sdam_flow.rb +14 -0
  23. data/lib/mongo/collection.rb +8 -6
  24. data/lib/mongo/collection/view/aggregation.rb +1 -1
  25. data/lib/mongo/collection/view/change_stream.rb +1 -1
  26. data/lib/mongo/collection/view/iterable.rb +1 -1
  27. data/lib/mongo/collection/view/map_reduce.rb +2 -2
  28. data/lib/mongo/collection/view/readable.rb +42 -20
  29. data/lib/mongo/collection/view/writable.rb +14 -14
  30. data/lib/mongo/cursor.rb +2 -2
  31. data/lib/mongo/database.rb +22 -5
  32. data/lib/mongo/database/view.rb +1 -1
  33. data/lib/mongo/error.rb +9 -1
  34. data/lib/mongo/error/bulk_write_error.rb +17 -3
  35. data/lib/mongo/error/internal_driver_error.rb +22 -0
  36. data/lib/mongo/error/operation_failure.rb +21 -2
  37. data/lib/mongo/error/parser.rb +65 -12
  38. data/lib/mongo/error/server_api_conflict.rb +23 -0
  39. data/lib/mongo/error/server_api_not_supported.rb +24 -0
  40. data/lib/mongo/error/unmet_dependency.rb +21 -0
  41. data/lib/mongo/grid/fs_bucket.rb +37 -37
  42. data/lib/mongo/index/view.rb +21 -11
  43. data/lib/mongo/monitoring.rb +13 -4
  44. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +27 -16
  45. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +26 -15
  46. data/lib/mongo/operation.rb +2 -2
  47. data/lib/mongo/operation/collections_info.rb +18 -1
  48. data/lib/mongo/operation/collections_info/command.rb +2 -2
  49. data/lib/mongo/operation/context.rb +99 -0
  50. data/lib/mongo/operation/indexes.rb +15 -1
  51. data/lib/mongo/operation/insert/command.rb +2 -2
  52. data/lib/mongo/operation/insert/legacy.rb +2 -2
  53. data/lib/mongo/operation/insert/op_msg.rb +2 -2
  54. data/lib/mongo/operation/list_collections/result.rb +4 -1
  55. data/lib/mongo/operation/result.rb +2 -0
  56. data/lib/mongo/operation/shared/executable.rb +24 -14
  57. data/lib/mongo/operation/shared/executable_no_validate.rb +2 -2
  58. data/lib/mongo/operation/shared/op_msg_or_command.rb +1 -7
  59. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +1 -7
  60. data/lib/mongo/operation/shared/polymorphic_operation.rb +39 -0
  61. data/lib/mongo/operation/shared/response_handling.rb +23 -23
  62. data/lib/mongo/operation/shared/sessions_supported.rb +13 -2
  63. data/lib/mongo/operation/shared/write.rb +8 -18
  64. data/lib/mongo/protocol/compressed.rb +51 -5
  65. data/lib/mongo/protocol/message.rb +20 -2
  66. data/lib/mongo/protocol/msg.rb +36 -11
  67. data/lib/mongo/query_cache.rb +30 -0
  68. data/lib/mongo/retryable.rb +1 -1
  69. data/lib/mongo/server.rb +7 -15
  70. data/lib/mongo/server/app_metadata.rb +52 -18
  71. data/lib/mongo/server/connection.rb +5 -0
  72. data/lib/mongo/server/connection_base.rb +13 -10
  73. data/lib/mongo/server/connection_pool.rb +6 -4
  74. data/lib/mongo/server/description.rb +4 -0
  75. data/lib/mongo/server/description/features.rb +9 -8
  76. data/lib/mongo/server/monitor.rb +20 -1
  77. data/lib/mongo/server/monitor/app_metadata.rb +1 -1
  78. data/lib/mongo/server/monitor/connection.rb +9 -10
  79. data/lib/mongo/server/pending_connection.rb +24 -6
  80. data/lib/mongo/server/push_monitor.rb +11 -1
  81. data/lib/mongo/session.rb +2 -2
  82. data/lib/mongo/session/session_pool.rb +4 -2
  83. data/lib/mongo/socket.rb +29 -4
  84. data/lib/mongo/socket/ssl.rb +8 -0
  85. data/lib/mongo/srv/monitor.rb +0 -11
  86. data/lib/mongo/uri/options_mapper.rb +38 -0
  87. data/lib/mongo/utils.rb +15 -0
  88. data/lib/mongo/version.rb +1 -1
  89. data/spec/README.md +24 -1
  90. data/spec/integration/auth_spec.rb +25 -15
  91. data/spec/integration/bulk_write_error_message_spec.rb +41 -0
  92. data/spec/integration/change_stream_spec.rb +4 -4
  93. data/spec/integration/command_monitoring_spec.rb +2 -2
  94. data/spec/integration/connection_spec.rb +2 -0
  95. data/spec/integration/docs_examples_spec.rb +8 -1
  96. data/spec/integration/fork_reconnect_spec.rb +4 -1
  97. data/spec/integration/ocsp_verifier_spec.rb +13 -7
  98. data/spec/integration/operation_failure_code_spec.rb +1 -1
  99. data/spec/integration/operation_failure_message_spec.rb +90 -0
  100. data/spec/integration/reconnect_spec.rb +1 -1
  101. data/spec/integration/sdam_error_handling_spec.rb +1 -1
  102. data/spec/integration/sdam_events_spec.rb +3 -5
  103. data/spec/integration/snappy_compression_spec.rb +25 -0
  104. data/spec/integration/srv_monitoring_spec.rb +1 -1
  105. data/spec/integration/transactions_examples_spec.rb +6 -0
  106. data/spec/integration/zlib_compression_spec.rb +1 -1
  107. data/spec/integration/zstd_compression_spec.rb +26 -0
  108. data/spec/lite_spec_helper.rb +7 -1
  109. data/spec/mongo/address_spec.rb +15 -11
  110. data/spec/mongo/auth/ldap/conversation_spec.rb +1 -1
  111. data/spec/mongo/auth/ldap_spec.rb +5 -1
  112. data/spec/mongo/auth/scram_negotiation_spec.rb +1 -1
  113. data/spec/mongo/auth/scram_spec.rb +1 -1
  114. data/spec/mongo/auth/x509/conversation_spec.rb +3 -3
  115. data/spec/mongo/client_construction_spec.rb +207 -33
  116. data/spec/mongo/client_spec.rb +17 -0
  117. data/spec/mongo/cluster_spec.rb +3 -18
  118. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  119. data/spec/mongo/collection/view/readable_spec.rb +33 -19
  120. data/spec/mongo/collection_crud_spec.rb +4357 -0
  121. data/spec/mongo/collection_ddl_spec.rb +534 -0
  122. data/spec/mongo/collection_spec.rb +5 -4859
  123. data/spec/mongo/database_spec.rb +66 -4
  124. data/spec/mongo/error/bulk_write_error_spec.rb +3 -3
  125. data/spec/mongo/error/parser_spec.rb +37 -6
  126. data/spec/mongo/index/view_spec.rb +8 -2
  127. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +1 -1
  128. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +1 -1
  129. data/spec/mongo/operation/aggregate_spec.rb +2 -1
  130. data/spec/mongo/operation/collections_info_spec.rb +4 -1
  131. data/spec/mongo/operation/command_spec.rb +6 -3
  132. data/spec/mongo/operation/create_index_spec.rb +6 -3
  133. data/spec/mongo/operation/create_user_spec.rb +6 -3
  134. data/spec/mongo/operation/delete/bulk_spec.rb +9 -6
  135. data/spec/mongo/operation/delete_spec.rb +11 -7
  136. data/spec/mongo/operation/drop_index_spec.rb +6 -2
  137. data/spec/mongo/operation/find/legacy_spec.rb +3 -1
  138. data/spec/mongo/operation/get_more_spec.rb +3 -1
  139. data/spec/mongo/operation/indexes_spec.rb +5 -1
  140. data/spec/mongo/operation/insert/bulk_spec.rb +10 -7
  141. data/spec/mongo/operation/insert_spec.rb +15 -12
  142. data/spec/mongo/operation/map_reduce_spec.rb +5 -2
  143. data/spec/mongo/operation/remove_user_spec.rb +6 -3
  144. data/spec/mongo/operation/result_spec.rb +1 -1
  145. data/spec/mongo/operation/update/bulk_spec.rb +9 -6
  146. data/spec/mongo/operation/update_spec.rb +10 -7
  147. data/spec/mongo/operation/update_user_spec.rb +4 -1
  148. data/spec/mongo/protocol/compressed_spec.rb +26 -12
  149. data/spec/mongo/query_cache_middleware_spec.rb +55 -0
  150. data/spec/mongo/retryable_spec.rb +3 -2
  151. data/spec/mongo/server/app_metadata_spec.rb +2 -0
  152. data/spec/mongo/server/connection_pool/populator_spec.rb +3 -1
  153. data/spec/mongo/server/connection_pool_spec.rb +1 -1
  154. data/spec/mongo/server/connection_spec.rb +24 -17
  155. data/spec/mongo/server/monitor/connection_spec.rb +17 -7
  156. data/spec/mongo/server/monitor_spec.rb +9 -1
  157. data/spec/mongo/server_spec.rb +15 -2
  158. data/spec/mongo/socket/ssl_spec.rb +40 -0
  159. data/spec/mongo/socket_spec.rb +2 -2
  160. data/spec/mongo/tls_context_hooks_spec.rb +37 -0
  161. data/spec/runners/connection_string.rb +0 -4
  162. data/spec/runners/crud/requirement.rb +40 -3
  163. data/spec/runners/crud/verifier.rb +8 -0
  164. data/spec/runners/transactions/operation.rb +13 -2
  165. data/spec/runners/transactions/test.rb +1 -0
  166. data/spec/runners/unified.rb +96 -0
  167. data/spec/runners/unified/assertions.rb +249 -0
  168. data/spec/runners/unified/change_stream_operations.rb +26 -0
  169. data/spec/runners/unified/crud_operations.rb +199 -0
  170. data/spec/runners/unified/ddl_operations.rb +96 -0
  171. data/spec/runners/unified/entity_map.rb +39 -0
  172. data/spec/runners/unified/error.rb +25 -0
  173. data/spec/runners/unified/event_subscriber.rb +91 -0
  174. data/spec/runners/unified/exceptions.rb +21 -0
  175. data/spec/runners/unified/grid_fs_operations.rb +55 -0
  176. data/spec/runners/unified/support_operations.rb +250 -0
  177. data/spec/runners/unified/test.rb +393 -0
  178. data/spec/runners/unified/test_group.rb +28 -0
  179. data/spec/runners/unified/using_hash.rb +31 -0
  180. data/spec/shared/bin/get-mongodb-download-url +17 -0
  181. data/spec/shared/lib/mrss/cluster_config.rb +218 -0
  182. data/spec/shared/lib/mrss/constraints.rb +43 -0
  183. data/spec/shared/lib/mrss/docker_runner.rb +262 -0
  184. data/spec/shared/lib/mrss/server_version_registry.rb +112 -0
  185. data/spec/shared/lib/mrss/utils.rb +15 -0
  186. data/spec/shared/share/Dockerfile.erb +231 -0
  187. data/spec/shared/shlib/distro.sh +73 -0
  188. data/spec/shared/shlib/server.sh +290 -0
  189. data/spec/shared/shlib/set_env.sh +128 -0
  190. data/spec/solo/clean_exit_spec.rb +21 -0
  191. data/spec/spec_helper.rb +4 -1
  192. data/spec/spec_tests/crud_unified_spec.rb +10 -0
  193. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -1
  194. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +267 -0
  195. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +60 -0
  196. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount.yml → estimatedDocumentCount-pre4.9.yml} +2 -0
  197. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +146 -0
  198. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors.yml → estimatedDocumentCount-serverErrors-pre4.9.yml} +2 -0
  199. data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +1 -1
  200. data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
  201. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +220 -0
  202. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
  203. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +184 -0
  204. data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
  205. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
  206. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
  207. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
  208. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
  209. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
  210. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +170 -0
  211. data/spec/spec_tests/data/uri_options/compression-options.yml +1 -1
  212. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +416 -0
  213. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +409 -0
  214. data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +67 -0
  215. data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
  216. data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +44 -0
  217. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +180 -0
  218. data/spec/spec_tests/unified_spec.rb +15 -0
  219. data/spec/spec_tests/uri_options_spec.rb +16 -0
  220. data/spec/spec_tests/versioned_api_spec.rb +10 -0
  221. data/spec/support/common_shortcuts.rb +15 -1
  222. data/spec/support/shared/session.rb +2 -2
  223. data/spec/support/spec_config.rb +46 -3
  224. data/spec/support/spec_setup.rb +48 -38
  225. data/spec/support/utils.rb +64 -3
  226. metadata +1104 -992
  227. metadata.gz.sig +0 -0
  228. data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +0 -58
  229. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +0 -47
  230. data/spec/support/cluster_config.rb +0 -207
@@ -1,6 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mongo::Operation::Update do
4
+ require_no_required_api_version
5
+
6
+ let(:context) { Mongo::Operation::Context.new }
4
7
 
5
8
  let(:document) do
6
9
  { :q => { :foo => 1 },
@@ -100,7 +103,7 @@ describe Mongo::Operation::Update do
100
103
  end
101
104
 
102
105
  let(:result) do
103
- update.execute(authorized_primary, client: nil)
106
+ update.execute(authorized_primary, context: context)
104
107
  end
105
108
 
106
109
  it 'updates the document' do
@@ -128,7 +131,7 @@ describe Mongo::Operation::Update do
128
131
 
129
132
  it 'raises an exception' do
130
133
  expect {
131
- update.execute(authorized_primary, client: nil)
134
+ update.execute(authorized_primary, context: context)
132
135
  }.to raise_error(Mongo::Error::OperationFailure)
133
136
  end
134
137
  end
@@ -152,7 +155,7 @@ describe Mongo::Operation::Update do
152
155
  end
153
156
 
154
157
  let(:result) do
155
- update.execute(authorized_primary, client: nil)
158
+ update.execute(authorized_primary, context: context)
156
159
  end
157
160
 
158
161
  it 'updates the documents' do
@@ -180,7 +183,7 @@ describe Mongo::Operation::Update do
180
183
 
181
184
  it 'raises an exception' do
182
185
  expect {
183
- update.execute(authorized_primary, client: nil)
186
+ update.execute(authorized_primary, context: context)
184
187
  }.to raise_error(Mongo::Error::OperationFailure)
185
188
  end
186
189
  end
@@ -193,7 +196,7 @@ describe Mongo::Operation::Update do
193
196
 
194
197
  it 'raises an error' do
195
198
  expect {
196
- update.execute(authorized_primary, client: nil)
199
+ update.execute(authorized_primary, context: context)
197
200
  }.to raise_error(Mongo::Error::MaxBSONSize)
198
201
  end
199
202
  end
@@ -205,7 +208,7 @@ describe Mongo::Operation::Update do
205
208
  end
206
209
 
207
210
  let(:result) do
208
- update.execute(authorized_primary, client: nil)
211
+ update.execute(authorized_primary, context: context)
209
212
  end
210
213
 
211
214
  it 'inserts the document' do
@@ -243,7 +246,7 @@ describe Mongo::Operation::Update do
243
246
  end
244
247
 
245
248
  let(:result) do
246
- update.execute(authorized_primary, client: nil)
249
+ update.execute(authorized_primary, context: context)
247
250
  end
248
251
 
249
252
  before do
@@ -1,6 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mongo::Operation::UpdateUser do
4
+ require_no_required_api_version
5
+
6
+ let(:context) { Mongo::Operation::Context.new }
4
7
 
5
8
  describe '#execute' do
6
9
 
@@ -35,7 +38,7 @@ describe Mongo::Operation::UpdateUser do
35
38
  context 'when user update was successful' do
36
39
 
37
40
  let!(:response) do
38
- operation.execute(root_authorized_primary, client: nil)
41
+ operation.execute(root_authorized_primary, context: context)
39
42
  end
40
43
 
41
44
  it 'updates the user in the database' do
@@ -1,4 +1,4 @@
1
- require 'lite_spec_helper'
1
+ require 'spec_helper'
2
2
 
3
3
  describe Mongo::Protocol::Compressed do
4
4
 
@@ -10,15 +10,35 @@ describe Mongo::Protocol::Compressed do
10
10
  described_class.new(original_message, compressor, level)
11
11
  end
12
12
 
13
+ let(:original_message_bytes) do
14
+ buf = BSON::ByteBuffer.new
15
+ original_message.send(:serialize_fields, buf)
16
+ buf.to_s
17
+ end
18
+
13
19
  describe '#serialize' do
14
20
 
15
- context 'when zlib compression level is not provided' do
21
+ context "when using the snappy compressor" do
22
+ require_snappy_compression
23
+ let(:compressor) { 'snappy' }
24
+
25
+ it "uses snappy" do
26
+ expect(Snappy).to receive(:deflate).with(original_message_bytes).and_call_original
27
+ message.serialize
28
+ end
29
+ end
16
30
 
17
- let(:original_message_bytes) do
18
- buf = BSON::ByteBuffer.new
19
- original_message.send(:serialize_fields, buf)
20
- buf.to_s
31
+ context "when using the zstd compressor" do
32
+ require_zstd_compression
33
+ let(:compressor) { 'zstd' }
34
+
35
+ it "uses zstd with default compression level" do
36
+ expect(Zstd).to receive(:compress).with(original_message_bytes).and_call_original
37
+ message.serialize
21
38
  end
39
+ end
40
+
41
+ context 'when zlib compression level is not provided' do
22
42
 
23
43
  it 'does not set a compression level' do
24
44
  expect(Zlib::Deflate).to receive(:deflate).with(original_message_bytes, nil).and_call_original
@@ -30,12 +50,6 @@ describe Mongo::Protocol::Compressed do
30
50
 
31
51
  let(:level) { 1 }
32
52
 
33
- let(:original_message_bytes) do
34
- buf = BSON::ByteBuffer.new
35
- original_message.send(:serialize_fields, buf)
36
- buf.to_s
37
- end
38
-
39
53
  it 'uses the compression level' do
40
54
  expect(Zlib::Deflate).to receive(:deflate).with(original_message_bytes, 1).and_call_original
41
55
  message.serialize
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require "spec_helper"
5
+
6
+ describe Mongo::QueryCache::Middleware do
7
+
8
+ let :middleware do
9
+ described_class.new(app)
10
+ end
11
+
12
+ context "when not touching query cache in the app" do
13
+
14
+ let(:app) do
15
+ lambda do |env|
16
+ @enabled = Mongo::QueryCache.enabled?
17
+ [200, env, "app"]
18
+ end
19
+ end
20
+
21
+ it "returns success" do
22
+ code, _ = middleware.call({})
23
+ expect(code).to eq(200)
24
+ end
25
+
26
+ it "enables the query cache" do
27
+ middleware.call({})
28
+ expect(@enabled).to be true
29
+ end
30
+ end
31
+
32
+ context "when querying in the app" do
33
+
34
+ before do
35
+ authorized_client['test'].insert_one(test: 1)
36
+ end
37
+
38
+ let(:app) do
39
+ lambda do |env|
40
+ authorized_client['test'].find
41
+ [200, env, "app"]
42
+ end
43
+ end
44
+
45
+ it "returns success" do
46
+ code, _ = middleware.call({})
47
+ expect(code).to eq(200)
48
+ end
49
+
50
+ it "cleans the query cache after it responds" do
51
+ middleware.call({})
52
+ expect(Mongo::QueryCache.send(:cache_table)).to be_empty
53
+ end
54
+ end
55
+ end
@@ -574,8 +574,9 @@ describe Mongo::Retryable do
574
574
  context 'when an error due to using an unsupported storage engine occurs' do
575
575
  before do
576
576
  expect(operation).to receive(:execute).and_raise(
577
- Mongo::Error::OperationFailure.new('Transaction numbers are only allowed on...',
578
- nil, :code=>20)).ordered
577
+ Mongo::Error::OperationFailure.new('message which is not checked',
578
+ nil, code: 20, server_message: 'Transaction numbers are only allowed on...',
579
+ )).ordered
579
580
  end
580
581
 
581
582
  it 'raises an exception with the correct error message' do
@@ -53,6 +53,8 @@ describe Mongo::Server::AppMetadata do
53
53
  end
54
54
 
55
55
  context 'when the client document exceeds the max of 512 bytes' do
56
+ # Server api parameters change metadata length
57
+ require_no_required_api_version
56
58
 
57
59
  context 'when the os.type length is too long' do
58
60
 
@@ -61,7 +61,9 @@ describe Mongo::Server::Populator do
61
61
 
62
62
  it 'populates the pool up to min_size' do
63
63
  populator.run!
64
- sleep 1
64
+ ::Utils.wait_for_condition(3) do
65
+ pool.size >= 2
66
+ end
65
67
  expect(pool.size).to eq 2
66
68
  expect(populator.running?).to be true
67
69
  end
@@ -531,7 +531,7 @@ describe Mongo::Server::ConnectionPool do
531
531
  authorized_client
532
532
  end
533
533
 
534
- let(:pool) do
534
+ let(:pool) do
535
535
  client.cluster.next_primary.pool
536
536
  end
537
537
 
@@ -589,6 +589,8 @@ describe Mongo::Server::Connection do
589
589
 
590
590
  let(:server) { monitored_server }
591
591
 
592
+ let(:context) { Mongo::Operation::Context.new }
593
+
592
594
  let!(:connection) do
593
595
  described_class.new(
594
596
  server,
@@ -620,12 +622,12 @@ describe Mongo::Server::Connection do
620
622
  context 'when providing a single message' do
621
623
 
622
624
  let(:reply) do
623
- connection.dispatch([ query ])
625
+ connection.dispatch([ query ], context)
624
626
  end
625
627
 
626
628
  before do
627
629
  authorized_collection.delete_many
628
- connection.dispatch([ insert ])
630
+ authorized_collection.insert_one(name: 'testing')
629
631
  end
630
632
 
631
633
  it 'it dispatches the message to the socket' do
@@ -644,7 +646,7 @@ describe Mongo::Server::Connection do
644
646
  end
645
647
 
646
648
  let(:reply) do
647
- connection.dispatch([ insert, command ])
649
+ connection.dispatch([ insert, command ], context)
648
650
  end
649
651
 
650
652
  before do
@@ -681,22 +683,22 @@ describe Mongo::Server::Connection do
681
683
  end
682
684
 
683
685
  before do
684
- connection.dispatch([ insert ])
686
+ connection.dispatch([ insert ], context)
685
687
  # Fake a query for which we did not read the response. See RUBY-1117
686
688
  allow(query_bob).to receive(:replyable?) { false }
687
- connection.dispatch([ query_bob ])
689
+ connection.dispatch([ query_bob ], context)
688
690
  end
689
691
 
690
692
  it 'raises an UnexpectedResponse error' do
691
693
  expect {
692
- connection.dispatch([ query_alice ])
694
+ connection.dispatch([ query_alice ], context)
693
695
  }.to raise_error(Mongo::Error::UnexpectedResponse,
694
696
  /Got response for request ID \d+ but expected response for request ID \d+/)
695
697
  end
696
698
 
697
699
  it 'marks connection perished' do
698
700
  expect {
699
- connection.dispatch([ query_alice ])
701
+ connection.dispatch([ query_alice ], context)
700
702
  }.to raise_error(Mongo::Error::UnexpectedResponse)
701
703
 
702
704
  connection.should be_error
@@ -704,16 +706,17 @@ describe Mongo::Server::Connection do
704
706
 
705
707
  it 'makes the connection no longer usable' do
706
708
  expect {
707
- connection.dispatch([ query_alice ])
709
+ connection.dispatch([ query_alice ], context)
708
710
  }.to raise_error(Mongo::Error::UnexpectedResponse)
709
711
 
710
712
  expect {
711
- connection.dispatch([ query_alice ])
713
+ connection.dispatch([ query_alice ], context)
712
714
  }.to raise_error(Mongo::Error::ConnectionPerished)
713
715
  end
714
716
  end
715
717
 
716
718
  context 'when a request is interrupted (Thread.kill)' do
719
+ require_no_required_api_version
717
720
 
718
721
  let(:documents) do
719
722
  [{ 'name' => 'bob' }, { 'name' => 'alice' }]
@@ -733,18 +736,19 @@ describe Mongo::Server::Connection do
733
736
 
734
737
  before do
735
738
  authorized_collection.delete_many
736
- connection.dispatch([ insert ])
739
+ connection.dispatch([ insert ], context)
737
740
  end
738
741
 
739
742
  it 'closes the socket and does not use it for subsequent requests' do
740
743
  t = Thread.new {
741
744
  # Kill the thread just before the reply is read
742
745
  allow(Mongo::Protocol::Reply).to receive(:deserialize_header) { t.kill && !t.alive? }
743
- connection.dispatch([ query_bob ])
746
+ connection.dispatch([ query_bob ], context)
744
747
  }
745
748
  t.join
746
749
  allow(Mongo::Protocol::Message).to receive(:deserialize_header).and_call_original
747
- expect(connection.dispatch([ query_alice ]).documents.first['name']).to eq('alice')
750
+ resp = connection.dispatch([ query_alice ], context)
751
+ expect(resp.documents.first['name']).to eq('alice')
748
752
  end
749
753
  end
750
754
 
@@ -761,7 +765,7 @@ describe Mongo::Server::Connection do
761
765
  end
762
766
 
763
767
  let(:reply) do
764
- connection.dispatch([ insert ])
768
+ connection.dispatch([ insert ], context)
765
769
  end
766
770
 
767
771
  it 'checks the size against the max message size' do
@@ -788,7 +792,7 @@ describe Mongo::Server::Connection do
788
792
  end
789
793
 
790
794
  let(:reply) do
791
- connection.dispatch([ command ])
795
+ connection.dispatch([ command ], context)
792
796
  end
793
797
 
794
798
  it 'checks the size against the max bson size' do
@@ -828,7 +832,7 @@ describe Mongo::Server::Connection do
828
832
 
829
833
  let(:result) do
830
834
  expect do
831
- connection.dispatch([ insert ])
835
+ connection.dispatch([ insert ], context)
832
836
  end.to raise_error(Mongo::Error::SocketError)
833
837
  end
834
838
 
@@ -862,7 +866,7 @@ describe Mongo::Server::Connection do
862
866
 
863
867
  let(:result) do
864
868
  expect do
865
- connection.dispatch([ insert ])
869
+ connection.dispatch([ insert ], context)
866
870
  end.to raise_error(Mongo::Error::SocketTimeoutError)
867
871
  end
868
872
 
@@ -906,6 +910,7 @@ describe Mongo::Server::Connection do
906
910
  end
907
911
 
908
912
  before do
913
+ authorized_collection.insert_one(test: 1)
909
914
  client.cluster.next_primary
910
915
  end
911
916
 
@@ -919,6 +924,8 @@ describe Mongo::Server::Connection do
919
924
  end_time = Time.now
920
925
  expect(ex).to be_a(Mongo::Error::SocketTimeoutError)
921
926
  expect(ex.message).to match(/Took more than 1.5 seconds to receive data/)
927
+ else
928
+ fail 'Expected a timeout'
922
929
  end
923
930
  # allow 1.5 seconds +- 0.5 seconds
924
931
  expect(end_time - start).to be_within(1).of(2)
@@ -938,7 +945,7 @@ describe Mongo::Server::Connection do
938
945
 
939
946
  before do
940
947
  expect(message).to receive(:replyable?) { false }
941
- connection.send(:deliver, message, nil)
948
+ connection.send(:deliver, message, context)
942
949
 
943
950
  connection.send(:socket).instance_variable_set(:@timeout, -(Time.now.to_i))
944
951
  end
@@ -9,13 +9,21 @@ describe Mongo::Server::Monitor::Connection do
9
9
 
10
10
  declare_topology_double
11
11
 
12
+ let(:monitor_app_metadata) do
13
+ Mongo::Server::Monitor::AppMetadata.new(
14
+ server_api: SpecConfig.instance.ruby_options[:server_api],
15
+ )
16
+ end
17
+
12
18
  let(:cluster) do
13
- double('cluster').tap do |cl|
14
- allow(cl).to receive(:topology).and_return(topology)
15
- allow(cl).to receive(:app_metadata).and_return(Mongo::Server::Monitor::AppMetadata.new({}))
16
- allow(cl).to receive(:options).and_return({})
17
- allow(cl).to receive(:heartbeat_interval).and_return(1000)
18
- allow(cl).to receive(:run_sdam_flow)
19
+ double('cluster').tap do |cluster|
20
+ allow(cluster).to receive(:topology).and_return(topology)
21
+ allow(cluster).to receive(:app_metadata).and_return(Mongo::Server::Monitor::AppMetadata.new({}))
22
+ allow(cluster).to receive(:options).and_return({})
23
+ allow(cluster).to receive(:monitor_app_metadata).and_return(monitor_app_metadata)
24
+ allow(cluster).to receive(:push_monitor_app_metadata).and_return(monitor_app_metadata)
25
+ allow(cluster).to receive(:heartbeat_interval).and_return(1000)
26
+ allow(cluster).to receive(:run_sdam_flow)
19
27
  end
20
28
  end
21
29
 
@@ -27,10 +35,12 @@ describe Mongo::Server::Monitor::Connection do
27
35
  end
28
36
 
29
37
  let(:monitor) do
38
+ metadata = Mongo::Server::Monitor::AppMetadata.new(options)
30
39
  register_background_thread_object(
31
40
  Mongo::Server::Monitor.new(server, server.event_listeners, server.monitoring,
32
41
  {
33
- app_metadata: Mongo::Server::Monitor::AppMetadata.new(options),
42
+ app_metadata: metadata,
43
+ push_monitor_app_metadata: metadata,
34
44
  }.update(options))
35
45
  ).tap do |monitor|
36
46
  monitor.scan!