mongo 2.0.6 → 2.1.0

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 (317) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +5 -2
  3. data/lib/mongo/address/ipv4.rb +6 -1
  4. data/lib/mongo/address/unix.rb +2 -2
  5. data/lib/mongo/address.rb +18 -10
  6. data/lib/mongo/auth/cr/conversation.rb +1 -1
  7. data/lib/mongo/auth/ldap/conversation.rb +7 -3
  8. data/lib/mongo/auth/scram/conversation.rb +9 -3
  9. data/lib/mongo/auth/user/view.rb +23 -2
  10. data/lib/mongo/auth/x509/conversation.rb +1 -1
  11. data/lib/mongo/bulk_write/combineable.rb +51 -0
  12. data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
  13. data/lib/mongo/bulk_write/result.rb +191 -0
  14. data/lib/mongo/bulk_write/result_combiner.rb +117 -0
  15. data/lib/mongo/bulk_write/transformable.rb +132 -0
  16. data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
  17. data/lib/mongo/bulk_write/validatable.rb +62 -0
  18. data/lib/mongo/bulk_write.rb +159 -23
  19. data/lib/mongo/client.rb +52 -16
  20. data/lib/mongo/cluster/topology/replica_set.rb +27 -9
  21. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  22. data/lib/mongo/cluster/topology/unknown.rb +5 -2
  23. data/lib/mongo/cluster.rb +42 -7
  24. data/lib/mongo/collection/view/aggregation.rb +48 -9
  25. data/lib/mongo/collection/view/immutable.rb +6 -6
  26. data/lib/mongo/collection/view/iterable.rb +18 -4
  27. data/lib/mongo/collection/view/map_reduce.rb +58 -17
  28. data/lib/mongo/collection/view/readable.rb +173 -42
  29. data/lib/mongo/collection/view/writable.rb +37 -23
  30. data/lib/mongo/collection/view.rb +2 -2
  31. data/lib/mongo/collection.rb +370 -33
  32. data/lib/mongo/cursor.rb +15 -3
  33. data/lib/mongo/database/view.rb +5 -4
  34. data/lib/mongo/database.rb +14 -4
  35. data/lib/mongo/dbref.rb +113 -0
  36. data/lib/mongo/error/closed_stream.rb +34 -0
  37. data/lib/mongo/error/extra_file_chunk.rb +34 -0
  38. data/lib/mongo/error/{invalid_uri_option.rb → file_not_found.rb} +11 -12
  39. data/lib/mongo/error/invalid_file.rb +2 -2
  40. data/lib/mongo/error/invalid_file_revision.rb +37 -0
  41. data/lib/mongo/error/invalid_uri.rb +5 -4
  42. data/lib/mongo/error/missing_file_chunk.rb +38 -0
  43. data/lib/mongo/error/operation_failure.rb +1 -1
  44. data/lib/mongo/error/parser.rb +1 -1
  45. data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
  46. data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
  47. data/lib/mongo/error.rb +13 -2
  48. data/lib/mongo/event/description_changed.rb +1 -1
  49. data/lib/mongo/grid/file/chunk.rb +6 -6
  50. data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
  51. data/lib/mongo/grid/file.rb +13 -10
  52. data/lib/mongo/grid/fs_bucket.rb +448 -0
  53. data/lib/mongo/grid/stream/read.rb +208 -0
  54. data/lib/mongo/grid/stream/write.rb +187 -0
  55. data/lib/mongo/grid/stream.rb +64 -0
  56. data/lib/mongo/grid.rb +2 -1
  57. data/lib/mongo/index/view.rb +3 -3
  58. data/lib/mongo/index.rb +5 -0
  59. data/lib/mongo/loggable.rb +34 -57
  60. data/lib/mongo/logger.rb +16 -78
  61. data/lib/mongo/monitoring/command_log_subscriber.rb +112 -0
  62. data/lib/mongo/monitoring/event/command_failed.rb +96 -0
  63. data/lib/mongo/monitoring/event/command_started.rb +89 -0
  64. data/lib/mongo/monitoring/event/command_succeeded.rb +118 -0
  65. data/lib/mongo/monitoring/event/secure.rb +58 -0
  66. data/lib/mongo/monitoring/event.rb +18 -0
  67. data/lib/mongo/monitoring/publishable.rb +106 -0
  68. data/lib/mongo/monitoring.rb +195 -0
  69. data/lib/mongo/operation/{aggregate.rb → commands/aggregate.rb} +3 -41
  70. data/lib/mongo/operation/commands/collections_info/result.rb +39 -0
  71. data/lib/mongo/operation/commands/collections_info.rb +68 -0
  72. data/lib/mongo/operation/{command.rb → commands/command.rb} +2 -18
  73. data/lib/mongo/operation/commands/indexes.rb +70 -0
  74. data/lib/mongo/operation/commands/list_collections/result.rb +112 -0
  75. data/lib/mongo/operation/commands/list_collections.rb +54 -0
  76. data/lib/mongo/operation/commands/list_indexes/result.rb +116 -0
  77. data/lib/mongo/operation/commands/list_indexes.rb +56 -0
  78. data/lib/mongo/operation/{map_reduce → commands/map_reduce}/result.rb +1 -1
  79. data/lib/mongo/operation/{map_reduce.rb → commands/map_reduce.rb} +3 -41
  80. data/lib/mongo/operation/commands/parallel_scan/result.rb +72 -0
  81. data/lib/mongo/operation/commands/parallel_scan.rb +56 -0
  82. data/lib/mongo/operation/commands/user_query.rb +69 -0
  83. data/lib/mongo/{bulk_write/ordered_bulk_write.rb → operation/commands/users_info/result.rb} +18 -30
  84. data/lib/mongo/operation/commands/users_info.rb +53 -0
  85. data/lib/mongo/operation/commands.rb +24 -0
  86. data/lib/mongo/operation/executable.rb +4 -68
  87. data/lib/mongo/operation/kill_cursors.rb +3 -3
  88. data/lib/mongo/operation/read/get_more.rb +2 -22
  89. data/lib/mongo/{bulk_write/unordered_bulk_write.rb → operation/read/query/result.rb} +20 -26
  90. data/lib/mongo/operation/read/query.rb +4 -21
  91. data/lib/mongo/operation/read.rb +0 -4
  92. data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
  93. data/lib/mongo/operation/result.rb +13 -1
  94. data/lib/mongo/operation/specifiable.rb +42 -0
  95. data/lib/mongo/operation/write/bulk/bulkable.rb +82 -0
  96. data/lib/mongo/operation/write/bulk/delete/result.rb +74 -0
  97. data/lib/mongo/operation/write/bulk/delete.rb +71 -0
  98. data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
  99. data/lib/mongo/operation/write/bulk/insert.rb +96 -0
  100. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
  101. data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
  102. data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
  103. data/lib/mongo/operation/write/bulk/update.rb +81 -0
  104. data/lib/mongo/operation/write/bulk.rb +6 -3
  105. data/lib/mongo/operation/write/command/create_index.rb +0 -1
  106. data/lib/mongo/operation/write/command/create_user.rb +0 -1
  107. data/lib/mongo/operation/write/command/delete.rb +0 -1
  108. data/lib/mongo/operation/write/command/drop_index.rb +0 -1
  109. data/lib/mongo/operation/write/command/insert.rb +0 -1
  110. data/lib/mongo/operation/write/command/remove_user.rb +0 -1
  111. data/lib/mongo/operation/write/command/update.rb +0 -1
  112. data/lib/mongo/operation/write/command/update_user.rb +0 -1
  113. data/lib/mongo/operation/write/command/writable.rb +13 -18
  114. data/lib/mongo/operation/write/create_index.rb +4 -27
  115. data/lib/mongo/operation/write/create_user.rb +4 -30
  116. data/lib/mongo/operation/write/delete.rb +6 -29
  117. data/lib/mongo/operation/write/drop_index.rb +3 -3
  118. data/lib/mongo/operation/write/gle.rb +48 -0
  119. data/lib/mongo/operation/write/idable.rb +5 -0
  120. data/lib/mongo/operation/write/insert.rb +2 -24
  121. data/lib/mongo/operation/write/remove_user.rb +4 -27
  122. data/lib/mongo/operation/write/update.rb +13 -36
  123. data/lib/mongo/operation/write/update_user.rb +4 -30
  124. data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
  125. data/lib/mongo/operation/write.rb +2 -0
  126. data/lib/mongo/operation.rb +32 -4
  127. data/lib/mongo/options/mapper.rb +4 -2
  128. data/lib/mongo/options/redacted.rb +156 -0
  129. data/lib/mongo/options.rb +1 -0
  130. data/lib/mongo/protocol/delete.rb +75 -15
  131. data/lib/mongo/protocol/get_more.rb +65 -13
  132. data/lib/mongo/protocol/insert.rb +85 -13
  133. data/lib/mongo/protocol/kill_cursors.rb +59 -14
  134. data/lib/mongo/protocol/message.rb +12 -12
  135. data/lib/mongo/protocol/query.rb +163 -37
  136. data/lib/mongo/protocol/reply.rb +103 -0
  137. data/lib/mongo/protocol/serializers.rb +1 -1
  138. data/lib/mongo/protocol/update.rb +82 -14
  139. data/lib/mongo/retryable.rb +83 -0
  140. data/lib/mongo/server/connectable.rb +21 -25
  141. data/lib/mongo/server/connection.rb +75 -4
  142. data/lib/mongo/server/connection_pool/queue.rb +15 -0
  143. data/lib/mongo/server/connection_pool.rb +12 -0
  144. data/lib/mongo/server/description/features.rb +2 -1
  145. data/lib/mongo/server/description.rb +52 -1
  146. data/lib/mongo/server/monitor/connection.rb +26 -2
  147. data/lib/mongo/server/monitor.rb +19 -3
  148. data/lib/mongo/server.rb +39 -5
  149. data/lib/mongo/server_selector/selectable.rb +40 -31
  150. data/lib/mongo/server_selector.rb +19 -10
  151. data/lib/mongo/socket/ssl.rb +28 -16
  152. data/lib/mongo/socket/tcp.rb +3 -3
  153. data/lib/mongo/socket/unix.rb +5 -8
  154. data/lib/mongo/socket.rb +11 -4
  155. data/lib/mongo/uri.rb +248 -137
  156. data/lib/mongo/version.rb +1 -1
  157. data/lib/mongo.rb +5 -3
  158. data/spec/mongo/address/unix_spec.rb +1 -1
  159. data/spec/mongo/address_spec.rb +25 -0
  160. data/spec/mongo/auth/cr_spec.rb +9 -1
  161. data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
  162. data/spec/mongo/auth/ldap_spec.rb +9 -1
  163. data/spec/mongo/auth/scram_spec.rb +9 -1
  164. data/spec/mongo/auth/user/view_spec.rb +26 -1
  165. data/spec/mongo/auth/x509_spec.rb +9 -1
  166. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +271 -0
  167. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
  168. data/spec/mongo/bulk_write_spec.rb +428 -0
  169. data/spec/mongo/client_spec.rb +167 -17
  170. data/spec/mongo/cluster/topology/replica_set_spec.rb +18 -9
  171. data/spec/mongo/cluster/topology/sharded_spec.rb +11 -3
  172. data/spec/mongo/cluster/topology/single_spec.rb +12 -4
  173. data/spec/mongo/cluster_spec.rb +55 -10
  174. data/spec/mongo/collection/view/aggregation_spec.rb +188 -1
  175. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  176. data/spec/mongo/collection/view/immutable_spec.rb +103 -0
  177. data/spec/mongo/collection/view/map_reduce_spec.rb +99 -4
  178. data/spec/mongo/collection/view/readable_spec.rb +238 -6
  179. data/spec/mongo/collection/view/writable_spec.rb +4 -4
  180. data/spec/mongo/collection/view_spec.rb +459 -71
  181. data/spec/mongo/collection_spec.rb +1291 -9
  182. data/spec/mongo/command_monitoring_spec.rb +51 -0
  183. data/spec/mongo/connection_string_spec.rb +115 -0
  184. data/spec/mongo/crud_spec.rb +2 -2
  185. data/spec/mongo/cursor_spec.rb +3 -3
  186. data/spec/mongo/database_spec.rb +47 -11
  187. data/spec/mongo/dbref_spec.rb +149 -0
  188. data/spec/mongo/grid/file/chunk_spec.rb +5 -5
  189. data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
  190. data/spec/mongo/grid/file_spec.rb +8 -8
  191. data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
  192. data/spec/mongo/grid/stream/read_spec.rb +275 -0
  193. data/spec/mongo/grid/stream/write_spec.rb +440 -0
  194. data/spec/mongo/grid/stream_spec.rb +48 -0
  195. data/spec/mongo/gridfs_spec.rb +50 -0
  196. data/spec/mongo/logger_spec.rb +0 -40
  197. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
  198. data/spec/mongo/monitoring/event/command_started_spec.rb +26 -0
  199. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +26 -0
  200. data/spec/mongo/monitoring/event/secure_spec.rb +57 -0
  201. data/spec/mongo/monitoring_spec.rb +168 -0
  202. data/spec/mongo/operation/commands/aggregate_spec.rb +69 -0
  203. data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
  204. data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +0 -18
  205. data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
  206. data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +1 -19
  207. data/spec/mongo/operation/kill_cursors_spec.rb +1 -17
  208. data/spec/mongo/operation/read/get_more_spec.rb +0 -16
  209. data/spec/mongo/operation/read/query_spec.rb +19 -16
  210. data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
  211. data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +18 -29
  212. data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +3 -14
  213. data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +8 -19
  214. data/spec/mongo/operation/write/command/delete_spec.rb +0 -16
  215. data/spec/mongo/operation/write/command/insert_spec.rb +0 -16
  216. data/spec/mongo/operation/write/command/update_spec.rb +0 -16
  217. data/spec/mongo/operation/write/delete_spec.rb +4 -4
  218. data/spec/mongo/operation/write/insert_spec.rb +2 -13
  219. data/spec/mongo/operation/write/update_spec.rb +7 -7
  220. data/spec/mongo/options/redacted_spec.rb +350 -0
  221. data/spec/mongo/protocol/kill_cursors_spec.rb +5 -3
  222. data/spec/mongo/protocol/query_spec.rb +15 -30
  223. data/spec/mongo/retryable_spec.rb +147 -0
  224. data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
  225. data/spec/mongo/server/connection_pool_spec.rb +50 -6
  226. data/spec/mongo/server/connection_spec.rb +49 -4
  227. data/spec/mongo/server/description_spec.rb +49 -3
  228. data/spec/mongo/server/monitor_spec.rb +51 -0
  229. data/spec/mongo/server_discovery_and_monitoring_spec.rb +32 -59
  230. data/spec/mongo/server_selection_rtt_spec.rb +37 -57
  231. data/spec/mongo/server_selection_spec.rb +19 -9
  232. data/spec/mongo/server_selector/nearest_spec.rb +35 -27
  233. data/spec/mongo/server_selector/primary_preferred_spec.rb +32 -30
  234. data/spec/mongo/server_selector/primary_spec.rb +21 -14
  235. data/spec/mongo/server_selector/secondary_preferred_spec.rb +28 -26
  236. data/spec/mongo/server_selector/secondary_spec.rb +24 -22
  237. data/spec/mongo/server_selector_spec.rb +87 -24
  238. data/spec/mongo/server_spec.rb +94 -8
  239. data/spec/mongo/socket/ssl_spec.rb +123 -13
  240. data/spec/mongo/socket/unix_spec.rb +52 -0
  241. data/spec/mongo/uri_spec.rb +295 -67
  242. data/spec/spec_helper.rb +40 -24
  243. data/spec/support/authorization.rb +23 -9
  244. data/spec/support/certificates/client.pem +4 -4
  245. data/spec/support/command_monitoring/bulkWrite.yml +73 -0
  246. data/spec/support/command_monitoring/command.yml +42 -0
  247. data/spec/support/command_monitoring/deleteMany.yml +55 -0
  248. data/spec/support/command_monitoring/deleteOne.yml +55 -0
  249. data/spec/support/command_monitoring/find.yml +219 -0
  250. data/spec/support/command_monitoring/insertMany.yml +81 -0
  251. data/spec/support/command_monitoring/insertOne.yml +51 -0
  252. data/spec/support/command_monitoring/updateMany.yml +67 -0
  253. data/spec/support/command_monitoring/updateOne.yml +95 -0
  254. data/spec/support/command_monitoring.rb +365 -0
  255. data/spec/support/connection_string.rb +228 -0
  256. data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
  257. data/spec/support/connection_string_tests/valid-auth.yml +256 -0
  258. data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
  259. data/spec/support/connection_string_tests/valid-options.yml +30 -0
  260. data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
  261. data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
  262. data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
  263. data/spec/support/crud/read.rb +22 -19
  264. data/spec/support/crud/write.rb +58 -27
  265. data/spec/support/crud.rb +10 -2
  266. data/spec/support/gridfs.rb +637 -0
  267. data/spec/support/gridfs_tests/delete.yml +157 -0
  268. data/spec/support/gridfs_tests/download.yml +210 -0
  269. data/spec/support/gridfs_tests/download_by_name.yml +113 -0
  270. data/spec/support/gridfs_tests/upload.yml +158 -0
  271. data/spec/support/matchers.rb +1 -1
  272. data/spec/support/sdam/rs/equal_electionids.yml +44 -0
  273. data/spec/support/sdam/rs/new_primary_new_electionid.yml +95 -0
  274. data/spec/support/sdam/rs/null_election_id.yml +144 -0
  275. data/spec/support/sdam/rs/primary_disconnect_electionid.yml +124 -0
  276. data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
  277. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
  278. data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
  279. data/spec/support/sdam/sharded/mongos_disconnect.yml +104 -0
  280. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  281. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  282. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  283. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  284. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  285. data/spec/support/sdam/single/not_ok_response.yml +0 -1
  286. data/spec/support/server_discovery_and_monitoring.rb +22 -3
  287. data/spec/support/server_selection.rb +3 -1
  288. data/spec/support/shared/bulk_write.rb +218 -22
  289. data/spec/support/shared/server_selector.rb +80 -14
  290. data.tar.gz.sig +0 -0
  291. metadata +188 -59
  292. metadata.gz.sig +0 -0
  293. data/lib/mongo/bulk_write/bulk_writable.rb +0 -196
  294. data/lib/mongo/bulk_write/deletable.rb +0 -56
  295. data/lib/mongo/bulk_write/insertable.rb +0 -48
  296. data/lib/mongo/bulk_write/replacable.rb +0 -57
  297. data/lib/mongo/bulk_write/updatable.rb +0 -68
  298. data/lib/mongo/grid/fs.rb +0 -149
  299. data/lib/mongo/operation/list_collections/result.rb +0 -114
  300. data/lib/mongo/operation/list_indexes/result.rb +0 -118
  301. data/lib/mongo/operation/read/collections_info.rb +0 -68
  302. data/lib/mongo/operation/read/indexes.rb +0 -69
  303. data/lib/mongo/operation/read/list_collections.rb +0 -76
  304. data/lib/mongo/operation/read/list_indexes.rb +0 -78
  305. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
  306. data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
  307. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
  308. data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
  309. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
  310. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -162
  311. data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
  312. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
  313. data/spec/mongo/bulk/bulk_write_spec.rb +0 -262
  314. data/spec/mongo/grid/fs_spec.rb +0 -160
  315. data/spec/mongo/loggable_spec.rb +0 -63
  316. data/spec/mongo/operation/aggregate_spec.rb +0 -127
  317. /data/lib/mongo/operation/{aggregate → commands/aggregate}/result.rb +0 -0
data/spec/spec_helper.rb CHANGED
@@ -17,8 +17,28 @@ if RUBY_VERSION > '1.9' && RUBY_VERSION < '2.2'
17
17
  end
18
18
  end
19
19
 
20
+ TEST_SET = 'ruby-driver-rs'
21
+ COVERAGE_MIN = 90
22
+ CURRENT_PATH = File.expand_path(File.dirname(__FILE__))
23
+ SERVER_DISCOVERY_TESTS = Dir.glob("#{CURRENT_PATH}/support/sdam/**/*.yml")
24
+ SERVER_SELECTION_RTT_TESTS = Dir.glob("#{CURRENT_PATH}/support/server_selection/rtt/*.yml")
25
+ SERVER_SELECTION_TESTS = Dir.glob("#{CURRENT_PATH}/support/server_selection/selection/**/*.yml")
26
+ CRUD_TESTS = Dir.glob("#{CURRENT_PATH}/support/crud_tests/**/*.yml")
27
+ COMMAND_MONITORING_TESTS = Dir.glob("#{CURRENT_PATH}/support/command_monitoring/**/*.yml")
28
+ CONNECTION_STRING_TESTS = Dir.glob("#{CURRENT_PATH}/support/connection_string_tests/*.yml")
29
+ GRIDFS_TESTS = Dir.glob("#{CURRENT_PATH}/support/gridfs_tests/*.yml")
30
+
31
+ SSL_CERTS_DIR = "#{CURRENT_PATH}/support/certificates"
32
+ CLIENT_PEM = "#{SSL_CERTS_DIR}/client.pem"
33
+ CLIENT_PASSWORD_PEM = "#{SSL_CERTS_DIR}/password_protected.pem"
34
+ CA_PEM = "#{SSL_CERTS_DIR}/ca.pem"
35
+ CRL_PEM = "#{SSL_CERTS_DIR}/crl.pem"
36
+
20
37
  require 'mongo'
21
38
 
39
+ Mongo::Logger.logger = Logger.new($stdout)
40
+ Mongo::Logger.logger.level = Logger::INFO
41
+
22
42
  require 'support/travis'
23
43
  require 'support/matchers'
24
44
  require 'support/authorization'
@@ -26,9 +46,9 @@ require 'support/server_discovery_and_monitoring'
26
46
  require 'support/server_selection_rtt'
27
47
  require 'support/server_selection'
28
48
  require 'support/crud'
29
-
30
- Mongo::Logger.logger = Logger.new($stdout)
31
- Mongo::Logger.logger.level = Logger::INFO
49
+ require 'support/command_monitoring'
50
+ require 'support/connection_string'
51
+ require 'support/gridfs'
32
52
 
33
53
  RSpec.configure do |config|
34
54
  config.color = true
@@ -43,6 +63,7 @@ RSpec.configure do |config|
43
63
  # database. This user will need to be authenticated in order to add any
44
64
  # more users to any other databases.
45
65
  ADMIN_UNAUTHORIZED_CLIENT.database.users.create(ROOT_USER)
66
+ ADMIN_UNAUTHORIZED_CLIENT.close
46
67
  rescue Exception => e
47
68
  end
48
69
  begin
@@ -53,7 +74,7 @@ RSpec.configure do |config|
53
74
  unless write_command_enabled?
54
75
  # If we are on versions less than 2.6, we need to create a user for
55
76
  # each database, since the users are not stored in the admin database
56
- # but in the system.users collection on the datbases themselves. Also,
77
+ # but in the system.users collection on the databases themselves. Also,
57
78
  # roles in versions lower than 2.6 can only be strings, not hashes.
58
79
  begin ADMIN_AUTHORIZED_TEST_CLIENT.database.users.create(TEST_READ_WRITE_USER); rescue; end
59
80
  end
@@ -61,20 +82,6 @@ RSpec.configure do |config|
61
82
  end
62
83
  end
63
84
 
64
- TEST_SET = 'ruby-driver-rs'
65
- COVERAGE_MIN = 90
66
- CURRENT_PATH = File.expand_path(File.dirname(__FILE__))
67
- SERVER_DISCOVERY_TESTS = Dir.glob("#{CURRENT_PATH}/support/sdam/**/*.yml")
68
- SERVER_SELECTION_RTT_TESTS = Dir.glob("#{CURRENT_PATH}/support/server_selection/rtt/*.yml")
69
- SERVER_SELECTION_TESTS = Dir.glob("#{CURRENT_PATH}/support/server_selection/selection/**/*.yml")
70
- CRUD_TESTS = Dir.glob("#{CURRENT_PATH}/support/crud_tests/**/*.yml")
71
-
72
- SSL_CERTS_DIR = "#{CURRENT_PATH}/support/certificates"
73
- CLIENT_PEM = "#{SSL_CERTS_DIR}/client.pem"
74
- CLIENT_PASSWORD_PEM = "#{SSL_CERTS_DIR}/password_protected.pem"
75
- CA_PEM = "#{SSL_CERTS_DIR}/ca.pem"
76
- CRL_PEM = "#{SSL_CERTS_DIR}/crl.pem"
77
-
78
85
  # Determine whether the test clients are connecting to a standalone.
79
86
  #
80
87
  # @since 2.0.0
@@ -91,12 +98,13 @@ def replica_set?
91
98
  $replica_set ||= $mongo_client.cluster.replica_set?
92
99
  end
93
100
 
94
- # Determine whether the test clients are connecting to a sharded cluster.
101
+ # Determine whether the test clients are connecting to a sharded cluster
102
+ # or a single mongos.
95
103
  #
96
104
  # @since 2.0.0
97
105
  def sharded?
98
106
  $mongo_client ||= initialize_scanned_client!
99
- $sharded ||= $mongo_client.cluster.sharded?
107
+ $sharded ||= ($mongo_client.cluster.sharded? || single_mongos?)
100
108
  end
101
109
 
102
110
  # Determine whether the single address provided is a replica set member.
@@ -107,7 +115,8 @@ end
107
115
  # @since 2.0.0
108
116
  def single_rs_member?
109
117
  $mongo_client ||= initialize_scanned_client!
110
- single_seed? && $mongo_client.cluster.servers.first.replica_set_name
118
+ $single_rs_member ||= (single_seed? &&
119
+ $mongo_client.cluster.servers.first.replica_set_name)
111
120
  end
112
121
 
113
122
  # Determine whether the single address provided is a mongos.
@@ -118,7 +127,8 @@ end
118
127
  # @since 2.0.0
119
128
  def single_mongos?
120
129
  $mongo_client ||= initialize_scanned_client!
121
- single_seed? && $mongo_client.cluster.servers.first.mongos?
130
+ $single_mongos ||= (single_seed? &&
131
+ $mongo_client.cluster.servers.first.mongos?)
122
132
  end
123
133
 
124
134
  # Determine whether a single address was provided.
@@ -146,10 +156,16 @@ def list_command_enabled?
146
156
  $list_command_enabled ||= $mongo_client.cluster.servers.first.features.list_indexes_enabled?
147
157
  end
148
158
 
149
- def testing_locally?
150
- !(ENV['CI'] || ENV['JENKINS_HOME'])
159
+ # Is the test suite running locally (not on Travis or Jenkins).
160
+ #
161
+ # @since 2.1.0
162
+ def testing_ssl_locally?
163
+ running_ssl? && !(ENV['CI'] || ENV['JENKINS_CI'])
151
164
  end
152
165
 
166
+ # Is the test suite running on SSL.
167
+ #
168
+ # @since 2.0.2
153
169
  def running_ssl?
154
170
  SSL
155
171
  end
@@ -50,13 +50,28 @@ WRITE_CONCERN = CONNECT[:connect] == :replica_set ? { w: ADDRESSES.size } : { w:
50
50
  # @since 2.0.3
51
51
  SSL = ENV['SSL_ENABLED'] == 'true'
52
52
 
53
+ # SSL options.
54
+ #
55
+ # @since 2.1.0
56
+ SSL_OPTIONS = {
57
+ ssl: SSL,
58
+ ssl_verify: false,
59
+ ssl_cert: CLIENT_PEM,
60
+ ssl_key: CLIENT_PEM
61
+ }
62
+
63
+ # Base test options.
64
+ #
65
+ # @since 2.1.0
66
+ BASE_OPTIONS = {
67
+ max_pool_size: 1,
68
+ write: WRITE_CONCERN
69
+ }
70
+
53
71
  # Options for test suite clients.
54
72
  #
55
73
  # @since 2.0.3
56
- TEST_OPTIONS = CONNECT.merge(max_pool_size: 1,
57
- write: WRITE_CONCERN,
58
- ssl: SSL,
59
- server_selection_timeout: 3)
74
+ TEST_OPTIONS = BASE_OPTIONS.merge(CONNECT).merge(SSL_OPTIONS)
60
75
 
61
76
  # The root user name.
62
77
  #
@@ -129,8 +144,7 @@ AUTHORIZED_CLIENT = Mongo::Client.new(
129
144
  # @since 2.0.0
130
145
  UNAUTHORIZED_CLIENT = Mongo::Client.new(
131
146
  ADDRESSES,
132
- TEST_OPTIONS.merge(
133
- database: TEST_DB)
147
+ TEST_OPTIONS.merge(database: TEST_DB, monitoring: false)
134
148
  )
135
149
 
136
150
  # Provides an unauthorized mongo client on the admin database, for use in
@@ -139,8 +153,7 @@ UNAUTHORIZED_CLIENT = Mongo::Client.new(
139
153
  # @since 2.0.0
140
154
  ADMIN_UNAUTHORIZED_CLIENT = Mongo::Client.new(
141
155
  ADDRESSES,
142
- TEST_OPTIONS.merge(
143
- database: Mongo::Database::ADMIN)
156
+ TEST_OPTIONS.merge(database: Mongo::Database::ADMIN, monitoring: false)
144
157
  )
145
158
 
146
159
  # Get an authorized client on the test database logged in as the admin
@@ -151,7 +164,8 @@ ADMIN_AUTHORIZED_TEST_CLIENT = ADMIN_UNAUTHORIZED_CLIENT.with(
151
164
  user: ROOT_USER.name,
152
165
  password: ROOT_USER.password,
153
166
  database: TEST_DB,
154
- auth_source: Mongo::Database::ADMIN
167
+ auth_source: Mongo::Database::ADMIN,
168
+ monitoring: false
155
169
  )
156
170
 
157
171
  module Authorization
@@ -32,13 +32,13 @@ Certificate:
32
32
  6e:a7
33
33
  Exponent: 65537 (0x10001)
34
34
  X509v3 extensions:
35
- X509v3 Basic Constraints:
35
+ X509v3 Basic Constraints:
36
36
  CA:FALSE
37
- Netscape Comment:
37
+ Netscape Comment:
38
38
  OpenSSL Generated Certificate
39
- X509v3 Subject Key Identifier:
39
+ X509v3 Subject Key Identifier:
40
40
  4A:8B:EE:22:42:E6:F8:62:4C:86:38:8D:C5:78:95:98:C1:10:05:7C
41
- X509v3 Authority Key Identifier:
41
+ X509v3 Authority Key Identifier:
42
42
  keyid:07:41:19:3A:9F:7E:C5:B7:22:4E:B7:BC:D5:DF:E4:FC:09:B8:64:16
43
43
 
44
44
  Signature Algorithm: sha1WithRSAEncryption
@@ -0,0 +1,73 @@
1
+ data:
2
+ - { _id: 1, x: 11 }
3
+ - { _id: 2, x: 22 }
4
+ - { _id: 3, x: 33 }
5
+
6
+ collection_name: &collection_name "test"
7
+ database_name: &database_name "ruby-driver"
8
+
9
+ tests:
10
+ -
11
+ description: "A successful mixed bulk write"
12
+ operation:
13
+ name: "bulkWrite"
14
+ arguments:
15
+ requests:
16
+ - insertOne:
17
+ document: { _id: 4, x: 44 }
18
+ - updateOne:
19
+ filter: { _id: 3 }
20
+ update: { $set: { x: 333 } }
21
+ expectations:
22
+ -
23
+ command_started_event:
24
+ command:
25
+ insert: *collection_name
26
+ documents:
27
+ - { _id: 4, x: 44 }
28
+ ordered: true
29
+ command_name: "insert"
30
+ database_name: *database_name
31
+ -
32
+ command_succeeded_event:
33
+ reply: { ok: 1.0, n: 1 }
34
+ command_name: "insert"
35
+ -
36
+ command_started_event:
37
+ command:
38
+ update: *collection_name
39
+ updates:
40
+ - { q: {_id: 3 }, u: { $set: { x: 333 } }, upsert: false, multi: false }
41
+ ordered: true
42
+ command_name: "update"
43
+ database_name: *database_name
44
+ -
45
+ command_succeeded_event:
46
+ reply: { ok: 1.0, n: 1 }
47
+ command_name: "update"
48
+ -
49
+ description: "A successful unordered bulk write with an unacknowledged write concern"
50
+ comment: "On a 2.4 server, no GLE is sent and requires a client-side manufactored reply"
51
+ operation:
52
+ name: "bulkWrite"
53
+ arguments:
54
+ requests:
55
+ - insertOne:
56
+ document: { _id: 4, x: 44 }
57
+ ordered: false
58
+ writeConcern: { w: 0 }
59
+ expectations:
60
+ -
61
+ command_started_event:
62
+ command:
63
+ insert: *collection_name
64
+ documents:
65
+ - { _id: 4, x: 44 }
66
+ ordered: false
67
+ writeConcern: { w: 0 }
68
+ command_name: "insert"
69
+ database_name: *database_name
70
+ -
71
+ command_succeeded_event:
72
+ reply: { ok: 1.0 }
73
+ command_name: "insert"
@@ -0,0 +1,42 @@
1
+ data:
2
+ - { _id: 1, x: 11 }
3
+
4
+ collection_name: &collection_name "test"
5
+ database_name: &database_name "ruby-driver"
6
+
7
+ tests:
8
+ -
9
+ description: "A successful command"
10
+ operation:
11
+ name: "count"
12
+ arguments:
13
+ filter: { _id: 1 }
14
+ expectations:
15
+ -
16
+ command_started_event:
17
+ command:
18
+ count: *collection_name
19
+ query: { _id: 1 }
20
+ command_name: "count"
21
+ database_name: *database_name
22
+ -
23
+ command_succeeded_event:
24
+ reply: { ok: 1.0, n: 1 }
25
+ command_name: "count"
26
+ -
27
+ description: "A failed command event"
28
+ operation:
29
+ name: "count"
30
+ arguments:
31
+ filter: { $or: true }
32
+ expectations:
33
+ -
34
+ command_started_event:
35
+ command:
36
+ count: *collection_name
37
+ query: { $or: true }
38
+ command_name: "count"
39
+ database_name: *database_name
40
+ -
41
+ command_failed_event:
42
+ command_name: "count"
@@ -0,0 +1,55 @@
1
+ data:
2
+ - { _id: 1, x: 11 }
3
+ - { _id: 2, x: 22 }
4
+ - { _id: 3, x: 33 }
5
+
6
+ collection_name: &collection_name "test"
7
+ database_name: &database_name "ruby-driver"
8
+
9
+ tests:
10
+ -
11
+ description: "A successful delete many"
12
+ operation:
13
+ name: "deleteMany"
14
+ arguments:
15
+ filter:
16
+ _id: { $gt: 1 }
17
+ expectations:
18
+ -
19
+ command_started_event:
20
+ command:
21
+ delete: *collection_name
22
+ deletes:
23
+ - { q: { _id: { $gt: 1 }}, limit: 0 }
24
+ ordered: true
25
+ command_name: "delete"
26
+ database_name: *database_name
27
+ -
28
+ command_succeeded_event:
29
+ reply: { ok: 1.0, n: 2 }
30
+ command_name: "delete"
31
+ -
32
+ description: "A successful delete many command with write errors"
33
+ operation:
34
+ name: "deleteMany"
35
+ arguments:
36
+ filter:
37
+ _id: { $nothing: 1 }
38
+ expectations:
39
+ -
40
+ command_started_event:
41
+ command:
42
+ delete: *collection_name
43
+ deletes:
44
+ - { q: { _id: { $nothing: 1 }}, limit: 0 }
45
+ ordered: true
46
+ command_name: "delete"
47
+ database_name: *database_name
48
+ -
49
+ command_succeeded_event:
50
+ reply:
51
+ ok: 1.0
52
+ n: 0
53
+ writeErrors:
54
+ - { index: 0, code: 42, errmsg: "" }
55
+ command_name: "delete"
@@ -0,0 +1,55 @@
1
+ data:
2
+ - { _id: 1, x: 11 }
3
+ - { _id: 2, x: 22 }
4
+ - { _id: 3, x: 33 }
5
+
6
+ collection_name: &collection_name "test"
7
+ database_name: &database_name "ruby-driver"
8
+
9
+ tests:
10
+ -
11
+ description: "A successful delete one"
12
+ operation:
13
+ name: "deleteOne"
14
+ arguments:
15
+ filter:
16
+ _id: { $gt: 1 }
17
+ expectations:
18
+ -
19
+ command_started_event:
20
+ command:
21
+ delete: *collection_name
22
+ deletes:
23
+ - { q: { _id: { $gt: 1 }}, limit: 1 }
24
+ ordered: true
25
+ command_name: "delete"
26
+ database_name: *database_name
27
+ -
28
+ command_succeeded_event:
29
+ reply: { ok: 1.0, n: 1 }
30
+ command_name: "delete"
31
+ -
32
+ description: "A successful delete one command with write errors"
33
+ operation:
34
+ name: "deleteOne"
35
+ arguments:
36
+ filter:
37
+ _id: { $nothing: 1 }
38
+ expectations:
39
+ -
40
+ command_started_event:
41
+ command:
42
+ delete: *collection_name
43
+ deletes:
44
+ - { q: { _id: { $nothing: 1 }}, limit: 1 }
45
+ ordered: true
46
+ command_name: "delete"
47
+ database_name: *database_name
48
+ -
49
+ command_succeeded_event:
50
+ reply:
51
+ ok: 1.0
52
+ n: 0
53
+ writeErrors:
54
+ - { index: 0, code: 42, errmsg: "" }
55
+ command_name: "delete"
@@ -0,0 +1,219 @@
1
+ data:
2
+ - { _id: 1, x: 11 }
3
+ - { _id: 2, x: 22 }
4
+ - { _id: 3, x: 33 }
5
+ - { _id: 4, x: 44 }
6
+ - { _id: 5, x: 55 }
7
+
8
+ collection_name: &collection_name "test"
9
+ database_name: &database_name "ruby-driver"
10
+ namespace: &namespace "ruby-driver.test"
11
+
12
+ tests:
13
+ -
14
+ description: "A successful find event with no options"
15
+ operation:
16
+ name: "find"
17
+ arguments:
18
+ filter: { _id: 1 }
19
+ expectations:
20
+ -
21
+ command_started_event:
22
+ command:
23
+ find: *collection_name
24
+ filter: { _id: 1 }
25
+ command_name: "find"
26
+ database_name: *database_name
27
+ -
28
+ command_succeeded_event:
29
+ reply:
30
+ ok: 1.0
31
+ cursor:
32
+ id: { $numberLong: "0" }
33
+ ns: *namespace
34
+ firstBatch:
35
+ - { _id: 1, x: 11 }
36
+ command_name: "find"
37
+ -
38
+ description: "A successful find event with options"
39
+ operation:
40
+ name: "find"
41
+ arguments:
42
+ filter: { _id: { $gt: 1 } }
43
+ sort: { _id: 1 }
44
+ limit: 2
45
+ skip: 2
46
+ modifiers:
47
+ $comment: "test"
48
+ $hint: { _id: 1 }
49
+ $max: { _id: 6 }
50
+ $maxScan: 5000
51
+ $maxTimeMS: 6000
52
+ $min: { _id: 0 }
53
+ $readPreference: { mode: "secondaryPreferred" }
54
+ $returnKey: false
55
+ $showDiskLoc: false
56
+ $snapshot: false
57
+ expectations:
58
+ -
59
+ command_started_event:
60
+ command:
61
+ find: *collection_name
62
+ filter: { _id: { $gt: 1 } }
63
+ sort: { _id: 1 }
64
+ limit: 2
65
+ skip: 2
66
+ comment: "test"
67
+ hint: { _id: 1 }
68
+ max: { _id: 6 }
69
+ maxScan: 5000
70
+ maxTimeMS: 6000
71
+ min: { _id: 0 }
72
+ readPreference: { mode: "secondaryPreferred" }
73
+ returnKey: false
74
+ showRecordId: false
75
+ snapshot: false
76
+ command_name: "find"
77
+ database_name: *database_name
78
+ -
79
+ command_succeeded_event:
80
+ reply:
81
+ ok: 1.0
82
+ cursor:
83
+ id: { $numberLong: "0" }
84
+ ns: *namespace
85
+ firstBatch:
86
+ - { _id: 4, x: 44 }
87
+ - { _id: 5, x: 55 }
88
+ command_name: "find"
89
+ -
90
+ description: "A successful find event with a getmore"
91
+ operation:
92
+ name: "find"
93
+ arguments:
94
+ filter: { _id: { $gte: 1 }}
95
+ sort: { _id: 1 }
96
+ batchSize: 3
97
+ expectations:
98
+ -
99
+ command_started_event:
100
+ command:
101
+ find: *collection_name
102
+ filter: { _id: { $gte : 1 }}
103
+ sort: { _id: 1 }
104
+ batchSize: 3
105
+ command_name: "find"
106
+ database_name: *database_name
107
+ -
108
+ command_succeeded_event:
109
+ reply:
110
+ ok: 1.0
111
+ cursor:
112
+ id: { $numberLong: "42" }
113
+ ns: *namespace
114
+ firstBatch:
115
+ - { _id: 1, x: 11 }
116
+ - { _id: 2, x: 22 }
117
+ - { _id: 3, x: 33 }
118
+ command_name: "find"
119
+ -
120
+ command_started_event:
121
+ command:
122
+ getMore: { $numberLong: "42" }
123
+ collection: *collection_name
124
+ batchSize: 3
125
+ command_name: "getMore"
126
+ database_name: *database_name
127
+ -
128
+ command_succeeded_event:
129
+ reply:
130
+ ok: 1.0
131
+ cursor:
132
+ id: { $numberLong: "0" }
133
+ ns: *namespace
134
+ nextBatch:
135
+ - { _id: 4, x: 44 }
136
+ - { _id: 5, x: 55 }
137
+ command_name: "getMore"
138
+ -
139
+ description: "A successful find event with a getmore and killcursors"
140
+ operation:
141
+ name: "find"
142
+ arguments:
143
+ filter: { _id: { $gte: 1 }}
144
+ sort: { _id: 1 }
145
+ batchSize: 3
146
+ limit: 4
147
+ expectations:
148
+ -
149
+ command_started_event:
150
+ command:
151
+ find: *collection_name
152
+ filter: { _id: { $gte : 1 }}
153
+ sort: { _id: 1 }
154
+ batchSize: 3
155
+ limit: 4
156
+ command_name: "find"
157
+ database_name: *database_name
158
+ -
159
+ command_succeeded_event:
160
+ reply:
161
+ ok: 1.0
162
+ cursor:
163
+ id: { $numberLong: "42" }
164
+ ns: *namespace
165
+ firstBatch:
166
+ - { _id: 1, x: 11 }
167
+ - { _id: 2, x: 22 }
168
+ - { _id: 3, x: 33 }
169
+ command_name: "find"
170
+ -
171
+ command_started_event:
172
+ command:
173
+ getMore: { $numberLong: "42" }
174
+ collection: *collection_name
175
+ batchSize: 1
176
+ command_name: "getMore"
177
+ database_name: *database_name
178
+ -
179
+ command_succeeded_event:
180
+ reply:
181
+ ok: 1.0
182
+ cursor:
183
+ id: { $numberLong: "42" }
184
+ ns: *namespace
185
+ nextBatch:
186
+ - { _id: 4, x: 44 }
187
+ command_name: "getMore"
188
+ -
189
+ command_started_event:
190
+ command:
191
+ killCursors: *collection_name
192
+ cursors:
193
+ - { $numberLong: "42" }
194
+ command_name: "killCursors"
195
+ database_name: *database_name
196
+ -
197
+ command_succeeded_event:
198
+ reply:
199
+ ok: 1.0
200
+ cursorsUnknown:
201
+ - { $numberLong: "42" }
202
+ command_name: "killCursors"
203
+ -
204
+ description: "A failed find event"
205
+ operation:
206
+ name: "find"
207
+ arguments:
208
+ filter: { $or: true }
209
+ expectations:
210
+ -
211
+ command_started_event:
212
+ command:
213
+ find: *collection_name
214
+ filter: { $or: true }
215
+ command_name: "find"
216
+ database_name: *database_name
217
+ -
218
+ command_failed_event:
219
+ command_name: "find"