mongo 2.8.0 → 2.9.0.rc0

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 (276) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/Rakefile +12 -0
  5. data/lib/mongo.rb +15 -1
  6. data/lib/mongo/address/ipv6.rb +0 -2
  7. data/lib/mongo/auth/scram/conversation.rb +0 -3
  8. data/lib/mongo/bulk_write/result_combiner.rb +12 -2
  9. data/lib/mongo/client.rb +59 -6
  10. data/lib/mongo/cluster.rb +19 -8
  11. data/lib/mongo/cluster/reapers/cursor_reaper.rb +0 -2
  12. data/lib/mongo/cluster/reapers/socket_reaper.rb +12 -9
  13. data/lib/mongo/collection.rb +1 -1
  14. data/lib/mongo/collection/view/aggregation.rb +5 -1
  15. data/lib/mongo/collection/view/builder/map_reduce.rb +1 -1
  16. data/lib/mongo/collection/view/change_stream.rb +30 -10
  17. data/lib/mongo/collection/view/iterable.rb +13 -6
  18. data/lib/mongo/collection/view/map_reduce.rb +12 -10
  19. data/lib/mongo/collection/view/readable.rb +19 -14
  20. data/lib/mongo/cursor.rb +12 -8
  21. data/lib/mongo/database.rb +10 -7
  22. data/lib/mongo/database/view.rb +18 -11
  23. data/lib/mongo/error.rb +2 -2
  24. data/lib/mongo/error/connection_check_out_timeout.rb +49 -0
  25. data/lib/mongo/error/operation_failure.rb +9 -9
  26. data/lib/mongo/error/parser.rb +25 -3
  27. data/lib/mongo/error/pool_closed_error.rb +43 -0
  28. data/lib/mongo/error/sdam_error_detection.rb +18 -0
  29. data/lib/mongo/grid/file/chunk.rb +0 -2
  30. data/lib/mongo/grid/fs_bucket.rb +26 -12
  31. data/lib/mongo/grid/stream/read.rb +36 -21
  32. data/lib/mongo/index/view.rb +11 -7
  33. data/lib/mongo/logger.rb +0 -2
  34. data/lib/mongo/monitoring.rb +31 -0
  35. data/lib/mongo/monitoring/cmap_log_subscriber.rb +53 -0
  36. data/lib/mongo/monitoring/event.rb +1 -0
  37. data/lib/mongo/monitoring/event/cmap.rb +25 -0
  38. data/lib/mongo/monitoring/event/cmap/base.rb +28 -0
  39. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +78 -0
  40. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +56 -0
  41. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +63 -0
  42. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +64 -0
  43. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +103 -0
  44. data/lib/mongo/monitoring/event/cmap/connection_created.rb +64 -0
  45. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +64 -0
  46. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +57 -0
  47. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +57 -0
  48. data/lib/mongo/monitoring/event/cmap/pool_created.rb +63 -0
  49. data/lib/mongo/monitoring/event/command_started.rb +12 -3
  50. data/lib/mongo/monitoring/publishable.rb +10 -2
  51. data/lib/mongo/operation.rb +0 -1
  52. data/lib/mongo/operation/find/legacy/result.rb +1 -0
  53. data/lib/mongo/operation/list_collections/result.rb +7 -1
  54. data/lib/mongo/operation/result.rb +10 -1
  55. data/lib/mongo/operation/shared/executable.rb +15 -0
  56. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +29 -0
  57. data/lib/mongo/operation/shared/specifiable.rb +0 -16
  58. data/lib/mongo/operation/update/legacy/result.rb +1 -0
  59. data/lib/mongo/protocol/compressed.rb +0 -2
  60. data/lib/mongo/protocol/msg.rb +25 -2
  61. data/lib/mongo/retryable.rb +171 -33
  62. data/lib/mongo/server.rb +26 -7
  63. data/lib/mongo/server/app_metadata.rb +0 -2
  64. data/lib/mongo/server/connectable.rb +8 -2
  65. data/lib/mongo/server/connection.rb +83 -13
  66. data/lib/mongo/server/connection_base.rb +1 -1
  67. data/lib/mongo/server/connection_pool.rb +439 -43
  68. data/lib/mongo/server/monitor/connection.rb +4 -1
  69. data/lib/mongo/session.rb +37 -5
  70. data/lib/mongo/session/session_pool.rb +2 -2
  71. data/lib/mongo/socket.rb +0 -2
  72. data/lib/mongo/socket/ssl.rb +0 -2
  73. data/lib/mongo/uri.rb +127 -66
  74. data/lib/mongo/uri/srv_protocol.rb +35 -13
  75. data/lib/mongo/version.rb +1 -1
  76. data/spec/README.md +190 -63
  77. data/spec/integration/change_stream_spec.rb +64 -0
  78. data/spec/integration/command_spec.rb +0 -7
  79. data/spec/integration/error_detection_spec.rb +39 -0
  80. data/spec/integration/read_concern.rb +83 -0
  81. data/spec/integration/retryable_writes_spec.rb +6 -50
  82. data/spec/integration/sdam_error_handling_spec.rb +60 -7
  83. data/spec/integration/ssl_uri_options_spec.rb +24 -0
  84. data/spec/integration/step_down_spec.rb +197 -0
  85. data/spec/lite_spec_helper.rb +4 -0
  86. data/spec/mongo/client_construction_spec.rb +42 -17
  87. data/spec/mongo/client_spec.rb +32 -1
  88. data/spec/mongo/cluster/socket_reaper_spec.rb +2 -2
  89. data/spec/mongo/cluster_spec.rb +36 -2
  90. data/spec/mongo/collection/view/aggregation_spec.rb +2 -0
  91. data/spec/mongo/collection/view/change_stream_spec.rb +28 -28
  92. data/spec/mongo/collection/view/readable_spec.rb +1 -1
  93. data/spec/mongo/collection/view_spec.rb +3 -1
  94. data/spec/mongo/cursor_spec.rb +5 -5
  95. data/spec/mongo/error/parser_spec.rb +61 -1
  96. data/spec/mongo/grid/stream/read_spec.rb +2 -2
  97. data/spec/mongo/monitoring/event/cmap/connection_check_out_failed_spec.rb +23 -0
  98. data/spec/mongo/monitoring/event/cmap/connection_check_out_started_spec.rb +19 -0
  99. data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +23 -0
  100. data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +23 -0
  101. data/spec/mongo/monitoring/event/cmap/connection_closed_spec.rb +27 -0
  102. data/spec/mongo/monitoring/event/cmap/connection_created_spec.rb +24 -0
  103. data/spec/mongo/monitoring/event/cmap/connection_ready_spec.rb +24 -0
  104. data/spec/mongo/monitoring/event/cmap/pool_cleared_spec.rb +19 -0
  105. data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +19 -0
  106. data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +26 -0
  107. data/spec/mongo/operation/delete/bulk_spec.rb +1 -6
  108. data/spec/mongo/operation/delete/command_spec.rb +1 -1
  109. data/spec/mongo/operation/delete/op_msg_spec.rb +1 -1
  110. data/spec/mongo/operation/delete_spec.rb +4 -4
  111. data/spec/mongo/operation/insert/bulk_spec.rb +1 -1
  112. data/spec/mongo/operation/insert/command_spec.rb +1 -1
  113. data/spec/mongo/operation/insert/op_msg_spec.rb +1 -1
  114. data/spec/mongo/operation/update/bulk_spec.rb +1 -1
  115. data/spec/mongo/operation/update/command_spec.rb +2 -2
  116. data/spec/mongo/operation/update/op_msg_spec.rb +2 -2
  117. data/spec/mongo/protocol/msg_spec.rb +11 -0
  118. data/spec/mongo/retryable_spec.rb +78 -25
  119. data/spec/mongo/server/connection_pool_spec.rb +661 -126
  120. data/spec/mongo/server/connection_spec.rb +55 -7
  121. data/spec/mongo/server_spec.rb +5 -0
  122. data/spec/mongo/uri/srv_protocol_spec.rb +135 -2
  123. data/spec/mongo/uri_option_parsing_spec.rb +511 -0
  124. data/spec/mongo/uri_spec.rb +42 -6
  125. data/spec/spec_helper.rb +1 -84
  126. data/spec/spec_tests/cmap_spec.rb +50 -0
  127. data/spec/spec_tests/command_monitoring_spec.rb +7 -18
  128. data/spec/spec_tests/crud_spec.rb +3 -49
  129. data/spec/spec_tests/data/cmap/connection-must-have-id.yml +21 -0
  130. data/spec/spec_tests/data/cmap/connection-must-order-ids.yml +21 -0
  131. data/spec/spec_tests/data/cmap/pool-checkin-destroy-closed.yml +24 -0
  132. data/spec/spec_tests/data/cmap/pool-checkin-destroy-stale.yml +24 -0
  133. data/spec/spec_tests/data/cmap/pool-checkin-make-available.yml +21 -0
  134. data/spec/spec_tests/data/cmap/pool-checkin.yml +18 -0
  135. data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +13 -0
  136. data/spec/spec_tests/data/cmap/pool-checkout-error-closed.yml +28 -0
  137. data/spec/spec_tests/data/cmap/pool-checkout-multiple.yml +34 -0
  138. data/spec/spec_tests/data/cmap/pool-checkout-no-idle.yml +31 -0
  139. data/spec/spec_tests/data/cmap/pool-checkout-no-stale.yml +29 -0
  140. data/spec/spec_tests/data/cmap/pool-close-destroy-conns.yml +26 -0
  141. data/spec/spec_tests/data/cmap/pool-close.yml +11 -0
  142. data/spec/spec_tests/data/cmap/pool-create-max-size.yml +56 -0
  143. data/spec/spec_tests/data/cmap/pool-create-min-size.yml +27 -0
  144. data/spec/spec_tests/data/cmap/pool-create-with-options.yml +20 -0
  145. data/spec/spec_tests/data/cmap/pool-create.yml +12 -0
  146. data/spec/spec_tests/data/cmap/wait-queue-fairness.yml +94 -0
  147. data/spec/spec_tests/data/cmap/wait-queue-timeout.yml +41 -0
  148. data/spec/spec_tests/data/retryable_reads/aggregate-serverErrors.yml +157 -0
  149. data/spec/spec_tests/data/retryable_reads/aggregate.yml +87 -0
  150. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +149 -0
  151. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +61 -0
  152. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +149 -0
  153. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +65 -0
  154. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +153 -0
  155. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +61 -0
  156. data/spec/spec_tests/data/retryable_reads/count-serverErrors.yml +150 -0
  157. data/spec/spec_tests/data/retryable_reads/count.yml +64 -0
  158. data/spec/spec_tests/data/retryable_reads/countDocuments-serverErrors.yml +150 -0
  159. data/spec/spec_tests/data/retryable_reads/countDocuments.yml +64 -0
  160. data/spec/spec_tests/data/retryable_reads/distinct-serverErrors.yml +156 -0
  161. data/spec/spec_tests/data/retryable_reads/distinct.yml +71 -0
  162. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors.yml +148 -0
  163. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount.yml +62 -0
  164. data/spec/spec_tests/data/retryable_reads/find-serverErrors.yml +160 -0
  165. data/spec/spec_tests/data/retryable_reads/find.yml +86 -0
  166. data/spec/spec_tests/data/retryable_reads/findOne-serverErrors.yml +154 -0
  167. data/spec/spec_tests/data/retryable_reads/findOne.yml +68 -0
  168. data/spec/spec_tests/data/retryable_reads/gridfs-download-serverErrors.yml +173 -0
  169. data/spec/spec_tests/data/retryable_reads/gridfs-download.yml +79 -0
  170. data/spec/spec_tests/data/retryable_reads/gridfs-downloadByName-serverErrors.yml +174 -0
  171. data/spec/spec_tests/data/retryable_reads/gridfs-downloadByName.yml +79 -0
  172. data/spec/spec_tests/data/retryable_reads/listCollectionNames-serverErrors.yml +143 -0
  173. data/spec/spec_tests/data/retryable_reads/listCollectionNames.yml +59 -0
  174. data/spec/spec_tests/data/retryable_reads/listCollectionObjects-serverErrors.yml +144 -0
  175. data/spec/spec_tests/data/retryable_reads/listCollectionObjects.yml +59 -0
  176. data/spec/spec_tests/data/retryable_reads/listCollections-serverErrors.yml +143 -0
  177. data/spec/spec_tests/data/retryable_reads/listCollections.yml +59 -0
  178. data/spec/spec_tests/data/retryable_reads/listDatabaseNames-serverErrors.yml +143 -0
  179. data/spec/spec_tests/data/retryable_reads/listDatabaseNames.yml +59 -0
  180. data/spec/spec_tests/data/retryable_reads/listDatabaseObjects-serverErrors.yml +144 -0
  181. data/spec/spec_tests/data/retryable_reads/listDatabaseObjects.yml +59 -0
  182. data/spec/spec_tests/data/retryable_reads/listDatabases-serverErrors.yml +144 -0
  183. data/spec/spec_tests/data/retryable_reads/listDatabases.yml +59 -0
  184. data/spec/spec_tests/data/retryable_reads/listIndexNames-serverErrors.yml +144 -0
  185. data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +60 -0
  186. data/spec/spec_tests/data/retryable_reads/listIndexes-serverErrors.yml +145 -0
  187. data/spec/spec_tests/data/retryable_reads/listIndexes.yml +60 -0
  188. data/spec/spec_tests/data/retryable_reads/mapReduce.yml +60 -0
  189. data/spec/spec_tests/data/retryable_writes/bulkWrite-serverErrors.yml +10 -7
  190. data/spec/spec_tests/data/retryable_writes/bulkWrite.yml +15 -22
  191. data/spec/spec_tests/data/retryable_writes/deleteMany.yml +22 -0
  192. data/spec/spec_tests/data/retryable_writes/deleteOne-serverErrors.yml +8 -7
  193. data/spec/spec_tests/data/retryable_writes/deleteOne.yml +5 -8
  194. data/spec/spec_tests/data/retryable_writes/findOneAndDelete-serverErrors.yml +8 -7
  195. data/spec/spec_tests/data/retryable_writes/findOneAndDelete.yml +5 -8
  196. data/spec/spec_tests/data/retryable_writes/findOneAndReplace-serverErrors.yml +8 -7
  197. data/spec/spec_tests/data/retryable_writes/findOneAndReplace.yml +5 -8
  198. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-serverErrors.yml +8 -7
  199. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate.yml +5 -8
  200. data/spec/spec_tests/data/retryable_writes/insertMany-serverErrors.yml +8 -7
  201. data/spec/spec_tests/data/retryable_writes/insertMany.yml +5 -8
  202. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +10 -45
  203. data/spec/spec_tests/data/retryable_writes/insertOne.yml +5 -8
  204. data/spec/spec_tests/data/retryable_writes/replaceOne-serverErrors.yml +8 -7
  205. data/spec/spec_tests/data/retryable_writes/replaceOne.yml +5 -8
  206. data/spec/spec_tests/data/retryable_writes/updateMany.yml +27 -0
  207. data/spec/spec_tests/data/retryable_writes/updateOne-serverErrors.yml +8 -7
  208. data/spec/spec_tests/data/retryable_writes/updateOne.yml +5 -14
  209. data/spec/spec_tests/data/transactions/abort.yml +7 -2
  210. data/spec/spec_tests/data/transactions/bulk.yml +7 -2
  211. data/spec/spec_tests/data/transactions/causal-consistency.yml +11 -4
  212. data/spec/spec_tests/data/transactions/commit.yml +11 -4
  213. data/spec/spec_tests/data/transactions/count.yml +64 -0
  214. data/spec/spec_tests/data/transactions/delete.yml +7 -2
  215. data/spec/spec_tests/data/transactions/error-labels.yml +8 -2
  216. data/spec/spec_tests/data/transactions/errors.yml +7 -2
  217. data/spec/spec_tests/data/transactions/findOneAndDelete.yml +7 -2
  218. data/spec/spec_tests/data/transactions/findOneAndReplace.yml +7 -2
  219. data/spec/spec_tests/data/transactions/findOneAndUpdate.yml +7 -2
  220. data/spec/spec_tests/data/transactions/insert.yml +9 -2
  221. data/spec/spec_tests/data/transactions/isolation.yml +7 -2
  222. data/spec/spec_tests/data/transactions/read-concern.yml +15 -6
  223. data/spec/spec_tests/data/transactions/read-pref.yml +7 -2
  224. data/spec/spec_tests/data/transactions/reads.yml +8 -48
  225. data/spec/spec_tests/data/transactions/retryable-abort.yml +7 -2
  226. data/spec/spec_tests/data/transactions/retryable-commit.yml +7 -2
  227. data/spec/spec_tests/data/transactions/retryable-writes.yml +7 -2
  228. data/spec/spec_tests/data/transactions/run-command.yml +7 -2
  229. data/spec/spec_tests/data/transactions/transaction-options.yml +7 -2
  230. data/spec/spec_tests/data/transactions/update.yml +7 -2
  231. data/spec/spec_tests/data/transactions/write-concern.yml +7 -2
  232. data/spec/spec_tests/data/transactions_api/callback-aborts.yml +6 -1
  233. data/spec/spec_tests/data/transactions_api/callback-commits.yml +6 -1
  234. data/spec/spec_tests/data/transactions_api/callback-retry.yml +6 -1
  235. data/spec/spec_tests/data/transactions_api/commit-retry.yml +6 -1
  236. data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror-4.2.yml +6 -3
  237. data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror.yml +6 -1
  238. data/spec/spec_tests/data/transactions_api/commit-writeconcernerror.yml +6 -1
  239. data/spec/spec_tests/data/transactions_api/commit.yml +6 -1
  240. data/spec/spec_tests/data/transactions_api/transaction-options.yml +6 -1
  241. data/spec/spec_tests/retryable_reads_spec.rb +11 -0
  242. data/spec/spec_tests/retryable_writes_spec.rb +4 -69
  243. data/spec/spec_tests/transactions_api_spec.rb +42 -37
  244. data/spec/spec_tests/transactions_spec.rb +42 -33
  245. data/spec/support/authorization.rb +12 -0
  246. data/spec/support/change_streams/operation.rb +1 -1
  247. data/spec/support/client_registry.rb +20 -0
  248. data/spec/support/cluster_config.rb +16 -15
  249. data/spec/support/cluster_tools.rb +346 -0
  250. data/spec/support/cmap.rb +367 -0
  251. data/spec/support/cmap/verifier.rb +46 -0
  252. data/spec/support/command_monitoring.rb +4 -6
  253. data/spec/support/common_shortcuts.rb +6 -0
  254. data/spec/support/connection_string.rb +2 -2
  255. data/spec/support/crud.rb +171 -184
  256. data/spec/support/crud/operation.rb +43 -0
  257. data/spec/support/crud/outcome.rb +53 -0
  258. data/spec/support/crud/read.rb +102 -12
  259. data/spec/support/crud/requirement.rb +69 -0
  260. data/spec/support/crud/spec.rb +68 -0
  261. data/spec/support/crud/test.rb +141 -0
  262. data/spec/support/crud/verifier.rb +96 -18
  263. data/spec/support/crud/write.rb +18 -3
  264. data/spec/support/event_subscriber.rb +15 -0
  265. data/spec/support/primary_socket.rb +2 -2
  266. data/spec/support/spec_config.rb +89 -20
  267. data/spec/support/transactions.rb +2 -306
  268. data/spec/support/transactions/operation.rb +7 -7
  269. data/spec/support/transactions/spec.rb +28 -0
  270. data/spec/support/transactions/test.rb +191 -0
  271. data/spec/support/utils.rb +123 -0
  272. metadata +202 -9
  273. metadata.gz.sig +0 -0
  274. data/lib/mongo/server/connection_pool/queue.rb +0 -359
  275. data/spec/mongo/server/connection_pool/queue_spec.rb +0 -353
  276. data/spec/support/transactions/verifier.rb +0 -97
@@ -208,12 +208,12 @@ describe Mongo::URI do
208
208
  end
209
209
  end
210
210
 
211
- context 'mongodb://example.com?w=1' do
211
+ context 'no slash after hosts, and options' do
212
212
 
213
- let(:string) { 'mongodb://example.com?w=1' }
213
+ let(:string) { 'mongodb://example.com?tls=true' }
214
214
 
215
215
  it 'raises an error' do
216
- expect { uri }.to raise_error(Mongo::Error::InvalidURI)
216
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI, %r,MongoDB URI must have a slash \(/\) after the hosts if options are given,)
217
217
  end
218
218
  end
219
219
 
@@ -222,7 +222,43 @@ describe Mongo::URI do
222
222
  let(:string) { 'mongodb://example.com/?w' }
223
223
 
224
224
  it 'raises an error' do
225
- expect { uri }.to raise_error(Mongo::Error::InvalidURI)
225
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI, /Option w has no value/)
226
+ end
227
+ end
228
+
229
+ context 'equal sign in option value' do
230
+
231
+ let(:string) { 'mongodb://example.com/?w=a=b' }
232
+
233
+ it 'raises an error' do
234
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI, %r,Value for option w contains the key/value delimiter \(=\): a=b,)
235
+ end
236
+ end
237
+
238
+ context 'slash in option value' do
239
+
240
+ let(:string) { 'mongodb://example.com/?tlsCAFile=a/b' }
241
+
242
+ it 'returns a Mongo::URI object' do
243
+ expect(uri).to be_a(Mongo::URI)
244
+ end
245
+
246
+ it 'parses correctly' do
247
+ expect(uri.servers).to eq(['example.com'])
248
+ expect(uri.uri_options[:ssl_ca_cert]).to eq('a/b')
249
+ end
250
+ end
251
+
252
+ context 'numeric value in a string option' do
253
+
254
+ let(:string) { 'mongodb://example.com/?appName=1' }
255
+
256
+ it 'returns a Mongo::URI object' do
257
+ expect(uri).to be_a(Mongo::URI)
258
+ end
259
+
260
+ it 'sets option to the string value' do
261
+ expect(uri.uri_options[:app_name]).to eq('1')
226
262
  end
227
263
  end
228
264
 
@@ -462,7 +498,7 @@ describe Mongo::URI do
462
498
  context 'wtimeoutMS' do
463
499
  let(:timeout) { 1234 }
464
500
  let(:options) { "w=2&wtimeoutMS=#{timeout}" }
465
- let(:concern) { Mongo::Options::Redacted.new(:w => 2, :timeout => timeout) }
501
+ let(:concern) { Mongo::Options::Redacted.new(:w => 2, :wtimeout => timeout) }
466
502
 
467
503
  it 'sets the write concern options' do
468
504
  expect(uri.uri_options[:write]).to eq(concern)
@@ -1000,7 +1036,7 @@ describe Mongo::URI do
1000
1036
 
1001
1037
  it 'sets the app name on the client' do
1002
1038
  client = new_local_client_nmio(string)
1003
- expect(client.options[:app_name]).to eq(:uri_test)
1039
+ expect(client.options[:app_name]).to eq('uri_test')
1004
1040
  end
1005
1041
  end
1006
1042
 
@@ -9,6 +9,7 @@ require 'support/authorization'
9
9
  require 'support/primary_socket'
10
10
  require 'support/constraints'
11
11
  require 'support/cluster_config'
12
+ require 'support/cluster_tools'
12
13
  require 'rspec/retry'
13
14
  require 'support/monitoring_ext'
14
15
 
@@ -23,89 +24,5 @@ RSpec.configure do |config|
23
24
  end
24
25
  end
25
26
 
26
- # Determine whether the test clients are connecting to a sharded cluster
27
- # or a single mongos.
28
- #
29
- # @since 2.0.0
30
- def sharded?
31
- $mongo_client ||= initialize_scanned_client!
32
- $sharded ||= ($mongo_client.cluster.sharded? || single_mongos?)
33
- end
34
-
35
- # Determine whether the single address provided is a replica set member.
36
- # @note To run the specs relying on this to return true,
37
- # start a replica set and set the environment variable
38
- # MONGODB_ADDRESSES to the address of a single member.
39
- #
40
- # @since 2.0.0
41
- def single_rs_member?
42
- ClusterConfig.instance.single_server? && ClusterConfig.instance.replica_set_name
43
- end
44
-
45
- # Determine whether the single address provided is a mongos.
46
- # @note To run the specs relying on this to return true,
47
- # start a sharded cluster and set the environment variable
48
- # MONGODB_ADDRESSES to the address of a single mongos.
49
- #
50
- # @since 2.0.0
51
- def single_mongos?
52
- ClusterConfig.instance.single_server? && ClusterConfig.instance.mongos?
53
- end
54
-
55
- # For instances where behavior is different on different versions, we need to
56
- # determine in the specs if we are 3.2 or higher.
57
- #
58
- # @since 2.0.0
59
- def find_command_enabled?
60
- $find_command_enabled ||= scanned_client_server!.features.find_command_enabled?
61
- end
62
-
63
- # For instances where behavior is different on different versions, we need to
64
- # determine in the specs if we are 4.0 or higher.
65
- #
66
- # @since 2.6.0
67
- def scram_sha_256_enabled?
68
- $scram_sha_256_enabled ||= scanned_client_server!.features.scram_sha_256_enabled?
69
- end
70
-
71
- # Initializes a basic scanned client to do an ismaster check.
72
- #
73
- # @since 2.0.0
74
- def initialize_scanned_client!
75
- ClientRegistry.instance.global_client('basic')
76
- end
77
-
78
- class ScannedClientHasNoServers < StandardError; end
79
-
80
- def scanned_client_server!
81
- $mongo_client ||= initialize_scanned_client!
82
- server = $mongo_client.cluster.servers.first
83
- if server.nil?
84
- raise ScannedClientHasNoServers
85
- end
86
- server
87
- end
88
-
89
- # Converts a 'camelCase' string or symbol to a :snake_case symbol.
90
- def camel_to_snake(ident)
91
- ident = ident.is_a?(String) ? ident.dup : ident.to_s
92
- ident[0] = ident[0].downcase
93
- ident.chars.reduce('') { |s, c| s + (/[A-Z]/ =~ c ? "_#{c.downcase}" : c) }.to_sym
94
- end
95
-
96
- # Creates a copy of a hash where all keys and string values are converted to snake-case symbols.
97
- # For example, `{ 'fooBar' => { 'baz' => 'bingBing', :x => 1 } }` converts to
98
- # `{ :foo_bar => { :baz => :bing_bing, :x => 1 } }`.
99
- def snakeize_hash(value)
100
- return camel_to_snake(value) if value.is_a?(String)
101
- return value unless value.is_a?(Hash)
102
-
103
- value.reduce({}) do |hash, kv|
104
- hash.tap do |h|
105
- h[camel_to_snake(kv.first)] = snakeize_hash(kv.last)
106
- end
107
- end
108
- end
109
-
110
27
  # require all shared examples
111
28
  Dir['./spec/support/shared/*.rb'].sort.each { |file| require file }
@@ -0,0 +1,50 @@
1
+ require 'lite_spec_helper'
2
+
3
+ describe 'Cmap' do
4
+
5
+ declare_topology_double
6
+
7
+ let(:cluster) do
8
+ double('cluster').tap do |cl|
9
+ allow(cl).to receive(:topology).and_return(topology)
10
+ allow(cl).to receive(:options).and_return({})
11
+ end
12
+ end
13
+
14
+ CMAP_TESTS.sort.each do |file|
15
+ spec = Mongo::Cmap::Spec.new(file)
16
+
17
+ context("#{spec.description} (#{file.sub(%r'.*/data/cmap/', '')})") do
18
+ before do
19
+ spec.setup(cluster)
20
+ end
21
+
22
+ let!(:result) do
23
+ mock_socket = double('socket')
24
+ allow(mock_socket).to receive(:close)
25
+ allow_any_instance_of(Mongo::Server::Connection).to receive(:do_connect).and_return(mock_socket)
26
+ spec.run
27
+ end
28
+
29
+ let(:verifier) do
30
+ Mongo::Cmap::Verifier.new(spec)
31
+ end
32
+
33
+ it 'raises the correct error' do
34
+ expect(result['error']).to eq(spec.expected_error)
35
+ end
36
+
37
+ let(:actual_events) { result['events'].freeze }
38
+
39
+ it 'emits the correct number of events' do
40
+ expect(actual_events.length).to eq(spec.expected_events.length)
41
+ end
42
+
43
+ spec.expected_events.each_with_index do |expected_event, index|
44
+ it "emits correct event #{index+1}" do
45
+ verifier.verify_hashes(actual_events[index], expected_event)
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -1,26 +1,21 @@
1
1
  require 'spec_helper'
2
2
 
3
- def ignore?(test)
4
- if version = test.ignore_if_server_version_greater_than
5
- return true if version == "3.0" && find_command_enabled?
6
- end
7
- if version = test.ignore_if_server_version_less_than
8
- return true if version == "3.1" && !find_command_enabled?
9
- end
10
- false
11
- end
12
-
13
3
  describe 'Command Monitoring Events' do
14
4
 
15
5
  COMMAND_MONITORING_TESTS.each do |file|
16
6
 
17
-
18
7
  spec = Mongo::CommandMonitoring::Spec.new(file)
19
8
 
20
9
  spec.tests.each do |test|
21
-
22
10
  context(test.description) do
23
11
 
12
+ if test.min_server_fcv
13
+ min_server_fcv test.min_server_fcv
14
+ end
15
+ if test.max_server_version
16
+ max_server_version test.max_server_version
17
+ end
18
+
24
19
  let(:subscriber) do
25
20
  Mongo::CommandMonitoring::TestSubscriber.new
26
21
  end
@@ -41,12 +36,6 @@ describe 'Command Monitoring Events' do
41
36
 
42
37
  test.expectations.each do |expectation|
43
38
 
44
- before do
45
- if ignore?(test)
46
- skip 'Preconditions not met'
47
- end
48
- end
49
-
50
39
  it "generates a #{expectation.event_name} for #{expectation.command_name}" do
51
40
  begin
52
41
  test.run(authorized_collection)
@@ -1,53 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'CRUD' do
4
-
5
- CRUD_TESTS.each do |file|
6
-
7
- spec = Mongo::CRUD::Spec.new(file)
8
-
9
- context(spec.description) do
10
-
11
- spec.tests.each do |test|
12
-
13
- context(test.description) do
14
-
15
- before(:each) do
16
- unless spec.server_version_satisfied?(authorized_client)
17
- skip 'Version requirement not satisfied'
18
- end
19
-
20
- test.setup_test(authorized_collection)
21
- end
22
-
23
- after(:each) do
24
- authorized_collection.delete_many
25
- end
26
-
27
- let!(:results) do
28
- test.run(authorized_collection)
29
- end
30
-
31
- let(:verifier) { Mongo::CRUD::Verifier.new(test) }
32
-
33
- let(:actual_collection) do
34
- if test.outcome['collection'] && test.outcome['collection']['name']
35
- authorized_client[test.outcome['collection']['name']]
36
- else
37
- authorized_collection
38
- end
39
- end
40
-
41
- it 'returns the correct result' do
42
- verifier.verify_operation_result(results)
43
- end
44
-
45
- it 'has the correct data in the collection', if: test.outcome_collection_data do
46
- results
47
- verifier.verify_collection_data(actual_collection.find.to_a)
48
- end
49
- end
50
- end
51
- end
3
+ describe do
4
+ define_crud_spec_tests('CRUD spec tests', CRUD_TESTS.sort) do |spec, req, test|
5
+ let(:client) { authorized_client }
52
6
  end
53
7
  end
@@ -0,0 +1,21 @@
1
+ version: 1
2
+ style: unit
3
+ description: must have an ID number associated with it
4
+ operations:
5
+ - name: checkOut
6
+ - name: checkOut
7
+ events:
8
+ - type: ConnectionCheckOutStarted
9
+ - type: ConnectionCreated
10
+ connectionId: 42
11
+ - type: ConnectionCheckedOut
12
+ connectionId: 42
13
+ - type: ConnectionCheckOutStarted
14
+ - type: ConnectionCreated
15
+ connectionId: 42
16
+ - type: ConnectionCheckedOut
17
+ connectionId: 42
18
+ ignore:
19
+ - ConnectionPoolCreated
20
+ - ConnectionPoolClosed
21
+ - ConnectionReady
@@ -0,0 +1,21 @@
1
+ version: 1
2
+ style: unit
3
+ description: must have IDs assigned in order of creation
4
+ operations:
5
+ - name: checkOut
6
+ - name: checkOut
7
+ events:
8
+ - type: ConnectionCheckOutStarted
9
+ - type: ConnectionCreated
10
+ connectionId: 1
11
+ - type: ConnectionCheckedOut
12
+ connectionId: 1
13
+ - type: ConnectionCheckOutStarted
14
+ - type: ConnectionCreated
15
+ connectionId: 2
16
+ - type: ConnectionCheckedOut
17
+ connectionId: 2
18
+ ignore:
19
+ - ConnectionPoolCreated
20
+ - ConnectionPoolClosed
21
+ - ConnectionReady
@@ -0,0 +1,24 @@
1
+ version: 1
2
+ style: unit
3
+ description: must destroy checked in connection if pool has been closed
4
+ operations:
5
+ - name: checkOut
6
+ label: conn
7
+ - name: close
8
+ - name: checkIn
9
+ connection: conn
10
+ events:
11
+ - type: ConnectionCheckedOut
12
+ connectionId: 1
13
+ - type: ConnectionPoolClosed
14
+ address: 42
15
+ - type: ConnectionCheckedIn
16
+ connectionId: 1
17
+ - type: ConnectionClosed
18
+ connectionId: 1
19
+ reason: poolClosed
20
+ ignore:
21
+ - ConnectionPoolCreated
22
+ - ConnectionCreated
23
+ - ConnectionReady
24
+ - ConnectionCheckOutStarted
@@ -0,0 +1,24 @@
1
+ version: 1
2
+ style: unit
3
+ description: must destroy checked in connection if it is stale
4
+ operations:
5
+ - name: checkOut
6
+ label: conn
7
+ - name: clear
8
+ - name: checkIn
9
+ connection: conn
10
+ events:
11
+ - type: ConnectionCheckedOut
12
+ connectionId: 1
13
+ - type: ConnectionPoolCleared
14
+ address: 42
15
+ - type: ConnectionCheckedIn
16
+ connectionId: 1
17
+ - type: ConnectionClosed
18
+ connectionId: 1
19
+ reason: stale
20
+ ignore:
21
+ - ConnectionPoolCreated
22
+ - ConnectionCreated
23
+ - ConnectionReady
24
+ - ConnectionCheckOutStarted
@@ -0,0 +1,21 @@
1
+ version: 1
2
+ style: unit
3
+ description: must make valid checked in connection available
4
+ operations:
5
+ - name: checkOut
6
+ label: conn
7
+ - name: checkIn
8
+ connection: conn
9
+ - name: checkOut
10
+ events:
11
+ - type: ConnectionCheckedOut
12
+ connectionId: 1
13
+ - type: ConnectionCheckedIn
14
+ connectionId: 1
15
+ - type: ConnectionCheckedOut
16
+ connectionId: 1
17
+ ignore:
18
+ - ConnectionPoolCreated
19
+ - ConnectionCreated
20
+ - ConnectionReady
21
+ - ConnectionCheckOutStarted