mongo 2.8.0 → 2.9.0.rc0

Sign up to get free protection for your applications and to get access to all the features.
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