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
@@ -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.8.0'.freeze
20
+ VERSION = '2.9.0.rc0'.freeze
21
21
  end
@@ -1,85 +1,212 @@
1
- The tests run against a MongoDB cluster which is
2
- configured and started externally to the test suite. This allows
3
- running the entire test suite against, for example, a standalone
4
- mongod as well as a replica set. The flip side to this is the
5
- test suite will not work without a running mongo cluster, and
6
- tests which are not applicable to or cannot be performed on the
7
- running mongo cluster are skipped.
1
+ # Running Ruby Driver Tests
8
2
 
9
- Not only does the test suite require an externally launched cluster,
10
- the test suite must also be told how the cluster is configured
11
- via MONGODB_URI, TOPOLOGY, MONGODB_ADDRESSES, RS_ENABLED, RS_NAME and/or
12
- SHARDED_ENABLED environment variables.
3
+ ## Quick Start
13
4
 
14
- The test suite attempts to provide diagnostics when it is not able to
15
- connect to the cluster it is configured to use.
5
+ To run the test suite against a local MongoDB deployment listening on port
6
+ 27017, run:
16
7
 
17
- Additionally some of the tests assume that the seed list (given in
18
- MONGODB_URI or MONGODB_ADDRESSES) encompasses all servers in the cluster,
19
- and will fail when MONGODB_URI includes only one host of a replica set.
20
- It is best to include all hosts of the cluster in MONGODB_URI and
21
- MONGODB_ADDRESSES.
8
+ rake
22
9
 
23
- It is best to have the test suite configured to connect to exactly
24
- the hostnames configured in the cluster. If, for example, the test suite
25
- is configured to use IP addresses but the cluster is configured with
26
- hostnames, the tests should still work (by using SDAM to discover correct
27
- cluster configuration) but will spend a significant amount of extra time
28
- on server discovery.
10
+ When run without options, the test suite will automatically detect deployment
11
+ topology and configure itself appropriately. Standalone, replica set and
12
+ sharded cluster topologies are supported (though the test suite will presently
13
+ use only the first listed shard in a sharded cluster if given a seed list,
14
+ or the one running on port 27017 if not given a seed list).
29
15
 
30
- In order to run spec tests, the mongo cluster needs to have fail points
31
- enabled. This is accomplished by starting mongod with the following option:
32
- --setParameter enableTestCommands=1
16
+ TLS, authentication and other options can be configured via URI options by
17
+ setting `MONGODB_URI` environment variable appropriately. Examples of such
18
+ configuration are given later in this document.
33
19
 
34
- Use the following environment variables to configure the tests:
20
+ ## MongoDB Server Deployment
35
21
 
36
- CLIENT_DEBUG: Show debug messages from the client.
22
+ The tests require a running MongoDB deployment, configured and started
23
+ externally to the test suite. Tests that are not appropriate for the running
24
+ deployment will be skipped.
37
25
 
38
- CLIENT_DEBUG=1
26
+ ## Starting MongoDB Deployment
39
27
 
40
- MONGODB_URI: Connection string to use. This must be a valid MongoDB URI;
41
- mongodb:// and mongodb+srv:// are both supported.
42
- RS_ENABLED and SHARDED_ENABLED are NOT honored if using MONGODB_URI -
43
- specify replica set name in the URI and to specify a sharded topology
44
- set TOPOLOGY=sharded_cluster environment variable.
28
+ There are many ways in which MongoDB can be started. The instructions below
29
+ are for manually launching `mongod` instances and using
30
+ [mlaunch](http://blog.rueckstiess.com/mtools/mlaunch.html)
31
+ (part of [mtools](https://github.com/rueckstiess/mtools)) for more complex
32
+ deployments, but other tools like
33
+ [mongodb-runner](https://github.com/mongodb-js/runner) and
34
+ [Mongo Orchestration](https://github.com/10gen/mongo-orchestration) can
35
+ in principle also work.
45
36
 
46
- MONGODB_URI=mongodb://127.0.0.1:27001/?replicaSet=test
47
- MONGODB_URI=mongodb://127.0.0.1:27001,127.0.0.1:27002/ TOPOLOGY=sharded_cluster
37
+ ### Standalone
48
38
 
49
- MONGODB_ADDRESSES: Specify addresses to connect to. Use RS_ENABLED,
50
- RS_NAME and SHARDED_ENABLED to configure the topology.
39
+ The simplest possible deployment is a standalone `mongod`, which can be
40
+ launched as follows:
51
41
 
52
- MONGODB_ADDRESSES=127.0.0.1:27017,127.0.0.1:27018
53
- MONGODB_ADDRESSES=127.0.0.1:27017,127.0.0.1:27018 RS_ENABLED=1
54
- MONGODB_ADDRESSES=127.0.0.1:27017,127.0.0.1:27018 RS_ENABLED=1 RS_NAME=test
55
- MONGODB_ADDRESSES=127.0.0.1:27017,127.0.0.1:27018 SHARDED_ENABLED=1
42
+ # Launch mongod in one terminal
43
+ mkdir /tmp/mdb
44
+ mongod --dbpath /tmp/mdb
45
+
46
+ # Run tests in another terminal
47
+ rake
56
48
 
57
- RS_ENABLED: Instruct the test suite to connect to a replica set.
58
- RS_ENABLED is only honored when not using MONGODB_URI; to connect to a
59
- replica set with MONGODB_URI, specify the replica set name in the URI
60
- (despite the Ruby driver performing topology discovery by default, it
61
- doesn't do so in the test suite).
62
- RS_NAME can be given to specify the replica set name; the default is
63
- ruby-driver-rs.
49
+ A standalone deployment is a good starting point, however a great many tests
50
+ require a replica set deployment and will be skipped on a standalone deployment.
64
51
 
65
- RS_ENABLED=1
66
- RS_ENABLED=1 RS_NAME=test
52
+ ### Replica Set
67
53
 
68
- SHARDED_ENABLED: Instruct the test suite to connect to the sharded cluster.
69
- Set MONGODB_URI appropriately as well.
54
+ While a replica set can be started and configured by hand, doing so is
55
+ cumbersome. The examples below use
56
+ [mlaunch](http://blog.rueckstiess.com/mtools/mlaunch.html)
57
+ to start a replica set.
70
58
 
71
- SHARDED_ENABLED=1
59
+ First, install [mtools](https://github.com/rueckstiess/mtools):
72
60
 
73
- SSL_ENABLED: Instruct the test suite to connect to the cluster via SSL.
61
+ pip install mtools --user
62
+ export PATH=~/.local/bin:$PATH
63
+
64
+ Then, launch a replica set:
74
65
 
75
- SSL_ENABLED=1
76
- # Also acceptable:
77
- SSL=ssl
66
+ mlaunch init --replicaset --name ruby-driver-rs \
67
+ --dir /tmp/mdb-rs --setParameter enableTestCommands=1
78
68
 
79
- Note: SSL can also be enabled by giving ssl=true in the MONGODB_URI options.
69
+ The test suite willl automatically detect the topology, no explicit
70
+ configuration is needed:
80
71
 
81
- EXTERNAL_DISABLED: Run the tests without making any external connections
82
- (for example, external connections are required to test DNS seedlists and SRV
83
- URIs).
72
+ rake
73
+
74
+ ### Sharded Cluster
75
+
76
+ A sharded cluster can be configured with mlaunch:
77
+
78
+ mlaunch init --replicaset --name ruby-driver-rs --sharded 1 \
79
+ --dir /tmp/mdb-sc --setParameter enableTestCommands=1
80
+
81
+ As with the replica set, the test suite will automatically detect sharded
82
+ cluster topology.
83
+
84
+ ## TLS With Verification
85
+
86
+ The test suite includes a set of TLS certificates for configuring a server
87
+ and a client to perform full TLS verification. The server can be started as
88
+ follows, if the current directory is the top of the driver source tree:
89
+
90
+ mlaunch init --single --dir /tmp/mdb-ssl --sslMode requireSSL \
91
+ --sslPEMKeyFile `pwd`/spec/support/certificates/server.pem \
92
+ --sslCAFile `pwd`/spec/support/certificates/ca.pem \
93
+ --sslClientCertificate `pwd`/spec/support/certificates/client.pem
94
+
95
+ ## TLS Without Verification
96
+
97
+ It is also possible to enable TLS but omit certificate verification. In this
98
+ case a standalone server can be started as follows:
99
+
100
+ mlaunch init --single --dir /tmp/mdb-ssl --sslMode requireSSL \
101
+ --sslPEMKeyFile `pwd`/spec/support/certificates/server.pem \
102
+ --sslCAFile `pwd`/spec/support/certificates/ca.pem \
103
+ --sslAllowConnectionsWithoutCertificates \
104
+ --sslAllowInvalidCertificates
105
+
106
+ To run the test suite against such a server, also omitting certificate
107
+ verification, run:
108
+
109
+ MONGODB_URI='mongodb://localhost:27017/?tls=true&tlsInsecure=true' rake
110
+
111
+ ## Authentication
112
+
113
+ mlaunch can configure authentication on the server:
114
+
115
+ mlaunch init --single --dir /tmp/mdb-auth --auth --username dev --password dev
116
+
117
+ To run the test suite against such a server, run:
118
+
119
+ MONGODB_URI='mongodb://dev:dev@localhost:27017/' rake
120
+
121
+ ## Compression
122
+
123
+ To be written.
124
+
125
+ ## Other Options
126
+
127
+ Generally, all URI options recognized by the driver may be set for a test run,
128
+ and will cause the clients created by the test suite to have those options
129
+ by default. For example, retryable writes may be turned on and off as follows:
130
+
131
+ MONGODB_URI='mongodb://localhost:27017/?retryWrites=true' rake
132
+
133
+ MONGODB_URI='mongodb://localhost:27017/?retryWrites=false' rake
134
+
135
+ Individual tests may override options that the test suite uses as defaults.
136
+ For example, retryable writes tests may create clients with the retry writes
137
+ option set to true or false as needed regardless of what the default is for
138
+ the entire test run.
139
+
140
+ It is also possible to, for example, reference non-default hosts and replica
141
+ set names:
142
+
143
+ MONGODB_URI='mongodb://test.host:27017,test.host:27018/?replicaSet=fooset' rake
144
+
145
+ However, as noted in the caveats section, changing the database name used by
146
+ the test suite is not supported.
147
+
148
+ Some tests require internet connectivity, for example to test DNS seed lists
149
+ and SRV URIs. These tests can be skipped by setting the following environment
150
+ variable:
84
151
 
85
152
  EXTERNAL_DISABLED=true
153
+
154
+ ## Caveats
155
+
156
+ ### Socket Permission Errors
157
+
158
+ If you get permission errors connecting to `mongod`'s socket, adjust its
159
+ permissions:
160
+
161
+ sudo chmod 0666 /tmp/mongodb-27017.sock
162
+
163
+ ### Non-Identical Hostnames
164
+
165
+ The test suite should be configured to connect to exactly the hostnames
166
+ configured in the cluster. If, for example, the test suite is configured
167
+ to use IP addresses but the cluster is configured with hostnames, most tests
168
+ would still work (by using SDAM to discover correct cluster configuration)
169
+ but will spend a significant amount of extra time on server discovery.
170
+
171
+ Some tests perform address assertions and will fail if hostnames configured
172
+ in the test suite do not match hostnames configured in the cluster.
173
+ For the same reason, each node in server configuration should have its port
174
+ specified.
175
+
176
+ ### Database Name
177
+
178
+ The test suite currently does not allow changing the database name that it
179
+ uses, which is `ruby-driver`. Attempts to specify a different database name
180
+ in the URI for example will lead to some of the tests failing.
181
+
182
+ ### Fail Points
183
+
184
+ In order to run some of the tests, the mongo cluster needs to have fail points
185
+ enabled. This is accomplished by starting `mongod` with the following option:
186
+
187
+ --setParameter enableTestCommands=1
188
+
189
+ ### Log Output
190
+
191
+ The test suite is run with the driver log level set to WARN by default.
192
+ This produces a fair amount of output as many tests trigger various conditions
193
+ resulting in the driver outputting warnings. This is expected behavior.
194
+
195
+ ## Running Individual Examples
196
+
197
+ Individual examples can be run by invoking `rspec` instead of `rake`. Prior
198
+ to running `rspec`, ensure the test suite created users for itself - this
199
+ is done by the `rake` command automatically, or you can manually invoke the
200
+ Rake task which configures the deployment for testing:
201
+
202
+ rake spec:prepare
203
+
204
+ Then, any of the standard RSpec invocations will work:
205
+
206
+ rspec path/to/file_spec.rb
207
+
208
+ ## Configuration Reporting
209
+
210
+ To have the test suite report its current configuration, run:
211
+
212
+ rake spec:config
@@ -366,4 +366,68 @@ describe 'Change stream integration', retry: 4 do
366
366
  end.to raise_error(ArgumentError, 'Time must be a Time or a BSON::Timestamp instance')
367
367
  end
368
368
  end
369
+
370
+ describe ':start_after option' do
371
+ require_topology :replica_set
372
+ min_server_version '4.1'
373
+
374
+ let(:start_after) do
375
+ stream = authorized_collection.watch([])
376
+ authorized_collection.insert_one(x: 1)
377
+ start_after = stream.to_enum.next['_id']
378
+ end
379
+
380
+ let(:stream) do
381
+ authorized_collection.watch([], { start_after: start_after })
382
+ end
383
+
384
+ let(:events) do
385
+ start_after
386
+
387
+ subscriber = EventSubscriber.new
388
+ authorized_client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
389
+ use_stream
390
+
391
+ subscriber.started_events.select { |e| e.command_name == 'aggregate' }
392
+ end
393
+
394
+ context 'when an initial aggregation is run' do
395
+ let(:use_stream) do
396
+ stream
397
+ end
398
+
399
+ it 'sends startAfter' do
400
+ expect(events.size >= 1).to eq(true)
401
+
402
+ command = events.first.command
403
+ expect(command['pipeline'].size == 1).to eq(true)
404
+ expect(command['pipeline'].first.key?('$changeStream')).to eq(true)
405
+ expect(command['pipeline'].first['$changeStream'].key?('startAfter')).to eq(true)
406
+ end
407
+ end
408
+
409
+ context 'when resuming' do
410
+ let(:use_stream) do
411
+ stream
412
+
413
+ authorized_collection.insert_one(x: 1)
414
+ stream.to_enum.next
415
+
416
+ authorized_collection.insert_one(x: 1)
417
+ authorized_collection.client.use(:admin).command(fail_point_base_command.merge(
418
+ :mode => {:times => 1},
419
+ :data => {:failCommands => ['getMore'], errorCode: 100}))
420
+ stream.to_enum.next
421
+ end
422
+
423
+ it 'does not startAfter even when passed in' do
424
+ expect(events.size == 2).to eq(true)
425
+
426
+ command = events.last.command
427
+ expect(command['pipeline'].size == 1).to eq(true)
428
+ expect(command['pipeline'].first.key?('$changeStream')).to eq(true)
429
+ expect(command['pipeline'].first['$changeStream'].key?('startAfter')).to eq(false)
430
+ end
431
+ end
432
+ end
369
433
  end
@@ -62,12 +62,6 @@ describe 'Command' do
62
62
  min_server_fcv '3.6'
63
63
 
64
64
  let(:session) { authorized_client.start_session }
65
- # w will be 2 for a RS topology with 3 nodes
66
- let(:w) do
67
- authorized_client.write_concern.options[:w].tap do |w|
68
- expect(w).to be_a(Integer)
69
- end
70
- end
71
65
 
72
66
  let(:expected_payload) do
73
67
  {
@@ -75,7 +69,6 @@ describe 'Command' do
75
69
  'commitTransaction' => 1,
76
70
  'lsid' => session.session_id,
77
71
  'txnNumber' => BSON::Int64.new(123),
78
- 'writeConcern' => {'w' => w},
79
72
  },
80
73
  'command_name' => 'commitTransaction',
81
74
  'database_name' => 'admin',
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Error detection' do
4
+ context 'document contains a not master/node recovering code' do
5
+ let(:document) { {code: 91} }
6
+
7
+ let(:coll) { authorized_client_without_any_retries['error-detection'] }
8
+
9
+ before do
10
+ coll.delete_many
11
+ end
12
+
13
+ context 'cursors not used' do
14
+
15
+ before do
16
+ coll.insert_one(document)
17
+ end
18
+
19
+ it 'is not treated as an error when retrieved' do
20
+ actual = coll.find.first
21
+ expect(actual['code']).to eq(91)
22
+ end
23
+ end
24
+
25
+ context 'cursors used' do
26
+
27
+ before do
28
+ 10.times do
29
+ coll.insert_one(document)
30
+ end
31
+ end
32
+
33
+ it 'is not treated as an error when retrieved' do
34
+ actual = coll.find({}, batch_size: 2).first
35
+ expect(actual['code']).to eq(91)
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,83 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'read concern' do
4
+ let(:subscriber) do
5
+ EventSubscriber.new
6
+ end
7
+
8
+ let(:specified_read_concern) do
9
+ { 'level' => 'local' }
10
+ end
11
+
12
+ let(:sent_read_concern) do
13
+ subscriber.clear_events!
14
+ collection.count_documents({})
15
+ subscriber.started_events.find { |c| c.command_name == 'aggregate' }.command[:readConcern]
16
+ end
17
+
18
+ shared_examples_for 'a read concern is specified' do
19
+ it 'sends a read concern to the server' do
20
+ expect(sent_read_concern).to eq(specified_read_concern)
21
+ end
22
+ end
23
+
24
+ shared_examples_for 'no read concern is specified' do
25
+ it 'does not send a read concern to the server' do
26
+ expect(sent_read_concern).to be_nil
27
+ end
28
+ end
29
+
30
+ context 'when the client has no read concern specified' do
31
+
32
+ let(:client) do
33
+ authorized_client.tap do |client|
34
+ client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
35
+ end
36
+ end
37
+
38
+ context 'when the collection has no read concern specified' do
39
+
40
+ let(:collection) do
41
+ client[TEST_COLL]
42
+ end
43
+
44
+ it_behaves_like 'no read concern is specified'
45
+ end
46
+
47
+ context 'when the collection has a read concern specified' do
48
+
49
+ let(:collection) do
50
+ client[TEST_COLL].with(read_concern: specified_read_concern)
51
+ end
52
+
53
+ it_behaves_like 'a read concern is specified'
54
+ end
55
+ end
56
+
57
+ context 'when the client has a read concern specified' do
58
+
59
+ let(:client) do
60
+ authorized_client.with(read_concern: specified_read_concern).tap do |client|
61
+ client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
62
+ end
63
+ end
64
+
65
+ context 'when the collection has no read concern specified' do
66
+
67
+ let(:collection) do
68
+ client[TEST_COLL]
69
+ end
70
+
71
+ it_behaves_like 'a read concern is specified'
72
+ end
73
+
74
+ context 'when the collection has a read concern specified' do
75
+
76
+ let(:collection) do
77
+ client[TEST_COLL].with(read_concern: specified_read_concern)
78
+ end
79
+
80
+ it_behaves_like 'a read concern is specified'
81
+ end
82
+ end
83
+ end