mongo 1.12.5 → 2.0.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 (475) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CONTRIBUTING.md +64 -0
  4. data/LICENSE +1 -1
  5. data/README.md +21 -126
  6. data/Rakefile +39 -21
  7. data/bin/mongo_console +6 -38
  8. data/lib/mongo/address/ipv4.rb +85 -0
  9. data/lib/mongo/address/ipv6.rb +85 -0
  10. data/lib/mongo/address/unix.rb +76 -0
  11. data/lib/mongo/address.rb +111 -0
  12. data/lib/mongo/auth/cr/conversation.rb +119 -0
  13. data/lib/mongo/auth/cr.rb +44 -0
  14. data/lib/mongo/auth/executable.rb +52 -0
  15. data/lib/mongo/auth/ldap/conversation.rb +92 -0
  16. data/lib/mongo/auth/ldap.rb +48 -0
  17. data/lib/mongo/auth/roles.rb +104 -0
  18. data/lib/mongo/auth/scram/conversation.rb +450 -0
  19. data/lib/mongo/auth/scram.rb +53 -0
  20. data/lib/mongo/auth/user/view.rb +102 -0
  21. data/lib/mongo/auth/user.rb +159 -0
  22. data/lib/mongo/auth/x509/conversation.rb +92 -0
  23. data/lib/mongo/auth/x509.rb +48 -0
  24. data/lib/mongo/auth.rb +108 -0
  25. data/lib/mongo/bulk_write/bulk_writable.rb +191 -0
  26. data/lib/mongo/bulk_write/deletable.rb +60 -0
  27. data/lib/mongo/bulk_write/insertable.rb +52 -0
  28. data/lib/mongo/bulk_write/ordered_bulk_write.rb +48 -0
  29. data/lib/mongo/bulk_write/replacable.rb +57 -0
  30. data/lib/mongo/bulk_write/unordered_bulk_write.rb +46 -0
  31. data/lib/mongo/bulk_write/updatable.rb +68 -0
  32. data/lib/mongo/bulk_write.rb +52 -0
  33. data/lib/mongo/client.rb +246 -0
  34. data/lib/mongo/cluster/topology/replica_set.rb +160 -0
  35. data/lib/mongo/cluster/topology/sharded.rb +132 -0
  36. data/lib/mongo/cluster/topology/standalone.rb +132 -0
  37. data/lib/mongo/cluster/topology/unknown.rb +155 -0
  38. data/lib/mongo/cluster/topology.rb +60 -0
  39. data/lib/mongo/cluster.rb +203 -0
  40. data/lib/mongo/collection/view/aggregation.rb +108 -0
  41. data/lib/mongo/collection/view/explainable.rb +49 -0
  42. data/lib/mongo/collection/view/immutable.rb +43 -0
  43. data/lib/mongo/collection/view/iterable.rb +48 -0
  44. data/lib/mongo/collection/view/map_reduce.rb +191 -0
  45. data/lib/mongo/collection/view/readable.rb +363 -0
  46. data/lib/mongo/collection/view/writable.rb +185 -0
  47. data/lib/mongo/collection/view.rb +169 -0
  48. data/lib/mongo/collection.rb +130 -1101
  49. data/lib/mongo/cursor.rb +78 -681
  50. data/lib/mongo/database/view.rb +101 -0
  51. data/lib/mongo/database.rb +224 -0
  52. data/lib/mongo/error/bulk_write_error.rb +41 -0
  53. data/lib/mongo/error/invalid_bulk_operation.rb +36 -0
  54. data/lib/mongo/error/invalid_bulk_operation_type.rb +36 -0
  55. data/lib/mongo/error/invalid_collection_name.rb +39 -0
  56. data/lib/mongo/error/invalid_database_name.rb +39 -0
  57. data/{test/replica_set/ssl_test.rb → lib/mongo/error/invalid_document.rb} +21 -14
  58. data/lib/mongo/error/invalid_file.rb +38 -0
  59. data/lib/mongo/error/invalid_nonce.rb +46 -0
  60. data/lib/mongo/error/invalid_replacement_document.rb +39 -0
  61. data/lib/mongo/error/invalid_signature.rb +47 -0
  62. data/{test/functional/ssl_test.rb → lib/mongo/error/invalid_update_document.rb} +22 -12
  63. data/lib/mongo/error/max_bson_size.rb +40 -0
  64. data/lib/mongo/error/max_message_size.rb +42 -0
  65. data/{test/functional/db_connection_test.rb → lib/mongo/error/multi_index_drop.rb} +17 -8
  66. data/lib/mongo/{utils.rb → error/need_primary_server.rb} +10 -6
  67. data/lib/mongo/{connection.rb → error/operation_failure.rb} +10 -6
  68. data/lib/mongo/error/parser.rb +77 -0
  69. data/lib/mongo/{connection/socket.rb → error/socket_error.rb} +10 -5
  70. data/lib/mongo/error/socket_timeout_error.rb +23 -0
  71. data/lib/mongo/error/unsupported_features.rb +43 -0
  72. data/lib/mongo/error.rb +82 -0
  73. data/lib/mongo/event/listeners.rb +63 -0
  74. data/lib/mongo/event/primary_elected.rb +53 -0
  75. data/lib/mongo/event/publisher.rb +42 -0
  76. data/lib/mongo/event/server_added.rb +53 -0
  77. data/lib/mongo/event/server_removed.rb +53 -0
  78. data/lib/mongo/event/subscriber.rb +41 -0
  79. data/lib/mongo/event.rb +40 -0
  80. data/lib/mongo/grid/file/chunk.rb +184 -0
  81. data/lib/mongo/grid/file/metadata.rb +229 -0
  82. data/lib/mongo/grid/file.rb +106 -0
  83. data/lib/mongo/grid/fs.rb +149 -0
  84. data/lib/mongo/{gridfs.rb → grid.rb} +3 -5
  85. data/lib/mongo/index/view.rb +261 -0
  86. data/lib/mongo/index.rb +64 -0
  87. data/lib/mongo/loggable.rb +126 -0
  88. data/lib/mongo/logger.rb +132 -0
  89. data/lib/mongo/operation/aggregate/result.rb +88 -0
  90. data/lib/mongo/operation/aggregate.rb +100 -0
  91. data/lib/mongo/operation/command.rb +62 -0
  92. data/lib/mongo/operation/executable.rb +105 -0
  93. data/lib/mongo/operation/kill_cursors.rb +39 -0
  94. data/lib/mongo/operation/limited.rb +37 -0
  95. data/lib/mongo/operation/list_collections/result.rb +114 -0
  96. data/lib/mongo/operation/list_indexes/result.rb +118 -0
  97. data/lib/mongo/operation/map_reduce/result.rb +122 -0
  98. data/lib/mongo/operation/map_reduce.rb +96 -0
  99. data/lib/mongo/operation/read/collections_info.rb +67 -0
  100. data/lib/mongo/operation/read/get_more.rb +71 -0
  101. data/lib/mongo/operation/read/indexes.rb +68 -0
  102. data/lib/mongo/operation/read/list_collections.rb +75 -0
  103. data/lib/mongo/operation/read/list_indexes.rb +77 -0
  104. data/lib/mongo/operation/read/query.rb +71 -0
  105. data/lib/mongo/{functional.rb → operation/read.rb} +7 -7
  106. data/lib/mongo/operation/read_preferrable.rb +34 -0
  107. data/lib/mongo/operation/result.rb +259 -0
  108. data/lib/mongo/operation/specifiable.rb +397 -0
  109. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +75 -0
  110. data/lib/mongo/operation/write/bulk/bulk_delete.rb +144 -0
  111. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +68 -0
  112. data/lib/mongo/operation/write/bulk/bulk_insert.rb +129 -0
  113. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +67 -0
  114. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +162 -0
  115. data/lib/mongo/operation/write/bulk/bulk_update.rb +153 -0
  116. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +83 -0
  117. data/lib/mongo/operation/write/bulk.rb +17 -0
  118. data/lib/mongo/operation/write/command/create_index.rb +50 -0
  119. data/lib/mongo/operation/write/command/create_user.rb +43 -0
  120. data/lib/mongo/operation/write/command/delete.rb +56 -0
  121. data/lib/mongo/operation/write/command/drop_index.rb +51 -0
  122. data/lib/mongo/operation/write/command/insert.rb +55 -0
  123. data/lib/mongo/operation/write/command/remove_user.rb +42 -0
  124. data/lib/mongo/operation/write/command/update.rb +60 -0
  125. data/lib/mongo/operation/write/command/writable.rb +61 -0
  126. data/lib/mongo/operation/write/command.rb +22 -0
  127. data/lib/mongo/operation/write/create_index.rb +89 -0
  128. data/lib/mongo/operation/write/create_user.rb +75 -0
  129. data/lib/mongo/operation/write/delete/result.rb +40 -0
  130. data/lib/mongo/operation/write/delete.rb +93 -0
  131. data/lib/mongo/operation/write/drop_index.rb +62 -0
  132. data/lib/mongo/{utils/thread_local_variable_manager.rb → operation/write/insert/result.rb} +15 -8
  133. data/lib/mongo/operation/write/insert.rb +90 -0
  134. data/lib/mongo/operation/write/remove_user.rb +70 -0
  135. data/lib/mongo/operation/write/update/result.rb +160 -0
  136. data/lib/mongo/operation/write/update.rb +103 -0
  137. data/lib/mongo/{connection/socket/socket_util.rb → operation/write.rb} +10 -24
  138. data/lib/mongo/operation.rb +25 -0
  139. data/lib/mongo/options/mapper.rb +78 -0
  140. data/lib/mongo/options.rb +15 -0
  141. data/lib/mongo/protocol/bit_vector.rb +61 -0
  142. data/lib/mongo/protocol/delete.rb +94 -0
  143. data/lib/mongo/protocol/get_more.rb +99 -0
  144. data/lib/mongo/protocol/insert.rb +99 -0
  145. data/lib/mongo/protocol/kill_cursors.rb +74 -0
  146. data/lib/mongo/protocol/message.rb +252 -0
  147. data/lib/mongo/protocol/query.rb +147 -0
  148. data/lib/mongo/protocol/reply.rb +72 -0
  149. data/lib/mongo/protocol/serializers.rb +180 -0
  150. data/lib/mongo/protocol/update.rb +111 -0
  151. data/lib/mongo/protocol.rb +15 -0
  152. data/lib/mongo/server/connectable.rb +110 -0
  153. data/lib/mongo/server/connection.rb +134 -0
  154. data/lib/mongo/server/connection_pool/queue.rb +182 -0
  155. data/lib/mongo/server/connection_pool.rb +141 -0
  156. data/lib/mongo/server/context.rb +66 -0
  157. data/lib/mongo/server/description/features.rb +85 -0
  158. data/lib/mongo/server/description/inspector/primary_elected.rb +58 -0
  159. data/lib/mongo/server/description/inspector/server_added.rb +59 -0
  160. data/lib/mongo/server/description/inspector/server_removed.rb +59 -0
  161. data/lib/mongo/server/description/inspector.rb +79 -0
  162. data/lib/mongo/server/description.rb +450 -0
  163. data/lib/mongo/server/monitor/connection.rb +89 -0
  164. data/lib/mongo/server/monitor.rb +176 -0
  165. data/lib/mongo/server.rb +163 -0
  166. data/lib/mongo/server_selector/nearest.rb +94 -0
  167. data/lib/mongo/server_selector/primary.rb +88 -0
  168. data/lib/mongo/server_selector/primary_preferred.rb +94 -0
  169. data/lib/mongo/server_selector/secondary.rb +91 -0
  170. data/lib/mongo/server_selector/secondary_preferred.rb +96 -0
  171. data/lib/mongo/server_selector/selectable.rb +209 -0
  172. data/lib/mongo/server_selector.rb +81 -0
  173. data/lib/mongo/socket/ssl.rb +130 -0
  174. data/lib/mongo/socket/tcp.rb +69 -0
  175. data/lib/mongo/socket/unix.rb +64 -0
  176. data/lib/mongo/socket.rb +179 -0
  177. data/lib/mongo/uri.rb +504 -0
  178. data/lib/mongo/version.rb +21 -0
  179. data/lib/mongo/write_concern/acknowledged.rb +52 -0
  180. data/lib/mongo/write_concern/normalizable.rb +51 -0
  181. data/lib/mongo/write_concern/unacknowledged.rb +55 -0
  182. data/lib/mongo/write_concern.rb +99 -0
  183. data/lib/mongo.rb +24 -82
  184. data/mongo.gemspec +17 -14
  185. data/spec/certificates/ca.pem +17 -0
  186. data/spec/certificates/client.pem +101 -0
  187. data/spec/certificates/crl.pem +10 -0
  188. data/spec/certificates/crl_client_revoked.pem +12 -0
  189. data/spec/certificates/password_protected.pem +51 -0
  190. data/spec/certificates/server.pem +34 -0
  191. data/spec/mongo/address/ipv4_spec.rb +74 -0
  192. data/spec/mongo/address/ipv6_spec.rb +74 -0
  193. data/spec/mongo/address/unix_spec.rb +30 -0
  194. data/spec/mongo/address_spec.rb +206 -0
  195. data/spec/mongo/auth/cr_spec.rb +59 -0
  196. data/spec/mongo/auth/ldap_spec.rb +40 -0
  197. data/spec/mongo/auth/scram/conversation_spec.rb +197 -0
  198. data/spec/mongo/auth/scram_spec.rb +55 -0
  199. data/spec/mongo/auth/user/view_spec.rb +76 -0
  200. data/spec/mongo/auth/user_spec.rb +190 -0
  201. data/spec/mongo/auth/x509_spec.rb +40 -0
  202. data/spec/mongo/auth_spec.rb +65 -0
  203. data/spec/mongo/bulk/bulk_write_spec.rb +262 -0
  204. data/spec/mongo/client_spec.rb +564 -0
  205. data/spec/mongo/cluster/topology/replica_set_spec.rb +101 -0
  206. data/spec/mongo/cluster/topology/sharded_spec.rb +74 -0
  207. data/spec/mongo/cluster/topology/standalone_spec.rb +79 -0
  208. data/spec/mongo/cluster/topology_spec.rb +65 -0
  209. data/spec/mongo/cluster_spec.rb +129 -0
  210. data/spec/mongo/collection/view/aggregation_spec.rb +148 -0
  211. data/spec/mongo/collection/view/explainable_spec.rb +32 -0
  212. data/spec/mongo/collection/view/map_reduce_spec.rb +242 -0
  213. data/spec/mongo/collection/view/readable_spec.rb +603 -0
  214. data/spec/mongo/collection/view/writable_spec.rb +679 -0
  215. data/spec/mongo/collection/view_spec.rb +530 -0
  216. data/spec/mongo/collection_spec.rb +362 -0
  217. data/spec/mongo/crud_spec.rb +42 -0
  218. data/spec/mongo/cursor_spec.rb +295 -0
  219. data/spec/mongo/database_spec.rb +302 -0
  220. data/spec/mongo/error/parser_spec.rb +119 -0
  221. data/spec/mongo/event/publisher_spec.rb +50 -0
  222. data/spec/mongo/event/subscriber_spec.rb +34 -0
  223. data/spec/mongo/grid/file/chunk_spec.rb +226 -0
  224. data/spec/mongo/grid/file/metadata_spec.rb +92 -0
  225. data/spec/mongo/grid/file_spec.rb +172 -0
  226. data/spec/mongo/grid/fs_spec.rb +129 -0
  227. data/spec/mongo/index/view_spec.rb +330 -0
  228. data/spec/mongo/loggable_spec.rb +62 -0
  229. data/spec/mongo/logger_spec.rb +97 -0
  230. data/spec/mongo/operation/aggregate/result_spec.rb +80 -0
  231. data/spec/mongo/operation/aggregate_spec.rb +127 -0
  232. data/spec/mongo/operation/command_spec.rb +98 -0
  233. data/spec/mongo/operation/kill_cursors_spec.rb +66 -0
  234. data/spec/mongo/operation/limited_spec.rb +50 -0
  235. data/spec/mongo/operation/map_reduce_spec.rb +143 -0
  236. data/spec/mongo/operation/read/collections_info_spec.rb +40 -0
  237. data/spec/mongo/operation/read/get_more_spec.rb +81 -0
  238. data/spec/mongo/operation/read/indexes_spec.rb +31 -0
  239. data/spec/mongo/operation/read/query_spec.rb +84 -0
  240. data/spec/mongo/operation/result_spec.rb +275 -0
  241. data/spec/mongo/operation/specifiable_spec.rb +53 -0
  242. data/spec/mongo/operation/write/bulk_delete_spec.rb +235 -0
  243. data/spec/mongo/operation/write/bulk_insert_spec.rb +235 -0
  244. data/spec/mongo/operation/write/bulk_update_spec.rb +236 -0
  245. data/spec/mongo/operation/write/command/delete_spec.rb +103 -0
  246. data/spec/mongo/operation/write/command/insert_spec.rb +103 -0
  247. data/spec/mongo/operation/write/command/update_spec.rb +109 -0
  248. data/spec/mongo/operation/write/create_index_spec.rb +63 -0
  249. data/spec/mongo/operation/write/create_user_spec.rb +44 -0
  250. data/spec/mongo/operation/write/delete_spec.rb +186 -0
  251. data/spec/mongo/operation/write/drop_index_spec.rb +51 -0
  252. data/spec/mongo/operation/write/insert_spec.rb +244 -0
  253. data/spec/mongo/operation/write/remove_user_spec.rb +46 -0
  254. data/spec/mongo/operation/write/response_spec.rb +85 -0
  255. data/spec/mongo/operation/write/update_spec.rb +228 -0
  256. data/spec/mongo/protocol/delete_spec.rb +167 -0
  257. data/spec/mongo/protocol/get_more_spec.rb +146 -0
  258. data/spec/mongo/protocol/insert_spec.rb +161 -0
  259. data/spec/mongo/protocol/kill_cursors_spec.rb +101 -0
  260. data/spec/mongo/protocol/query_spec.rb +285 -0
  261. data/spec/mongo/protocol/reply_spec.rb +157 -0
  262. data/spec/mongo/protocol/update_spec.rb +186 -0
  263. data/spec/mongo/server/connection_pool/queue_spec.rb +170 -0
  264. data/spec/mongo/server/connection_pool_spec.rb +120 -0
  265. data/spec/mongo/server/connection_spec.rb +312 -0
  266. data/spec/mongo/server/description/features_spec.rb +138 -0
  267. data/spec/mongo/server/description/inspector/primary_elected_spec.rb +94 -0
  268. data/spec/mongo/server/description/inspector/server_added_spec.rb +92 -0
  269. data/spec/mongo/server/description/inspector/server_removed_spec.rb +95 -0
  270. data/spec/mongo/server/description_spec.rb +510 -0
  271. data/spec/mongo/server/monitor_spec.rb +144 -0
  272. data/spec/mongo/server_discovery_and_monitoring_spec.rb +103 -0
  273. data/spec/mongo/server_selection_rtt_spec.rb +104 -0
  274. data/spec/mongo/server_selection_spec.rb +89 -0
  275. data/spec/mongo/server_selector/nearest_spec.rb +250 -0
  276. data/spec/mongo/server_selector/primary_preferred_spec.rb +290 -0
  277. data/spec/mongo/server_selector/primary_spec.rb +114 -0
  278. data/spec/mongo/server_selector/secondary_preferred_spec.rb +252 -0
  279. data/spec/mongo/server_selector/secondary_spec.rb +196 -0
  280. data/spec/mongo/server_selector_spec.rb +101 -0
  281. data/spec/mongo/server_spec.rb +131 -0
  282. data/spec/mongo/uri_spec.rb +517 -0
  283. data/spec/mongo/write_concern/acknowledged_spec.rb +44 -0
  284. data/spec/mongo/write_concern/unacknowledged_spec.rb +15 -0
  285. data/spec/spec_helper.rb +133 -0
  286. data/spec/support/authorization.rb +247 -0
  287. data/spec/support/crud/read.rb +144 -0
  288. data/spec/support/crud/write.rb +214 -0
  289. data/spec/support/crud.rb +203 -0
  290. data/spec/support/crud_tests/read/aggregate.yml +43 -0
  291. data/spec/support/crud_tests/read/count.yml +37 -0
  292. data/spec/support/crud_tests/read/distinct.yml +33 -0
  293. data/spec/support/crud_tests/read/find.yml +50 -0
  294. data/spec/support/crud_tests/write/deleteMany.yml +36 -0
  295. data/spec/support/crud_tests/write/deleteOne.yml +49 -0
  296. data/spec/support/crud_tests/write/findOneAndDelete.yml +54 -0
  297. data/spec/support/crud_tests/write/findOneAndReplace.yml +153 -0
  298. data/spec/support/crud_tests/write/findOneAndUpdate.yml +161 -0
  299. data/spec/support/crud_tests/write/insertMany.yml +24 -0
  300. data/spec/support/crud_tests/write/insertOne.yml +19 -0
  301. data/spec/support/crud_tests/write/replaceOne.yml +96 -0
  302. data/spec/support/crud_tests/write/updateMany.yml +83 -0
  303. data/spec/support/crud_tests/write/updateOne.yml +80 -0
  304. data/spec/support/helpers.rb +140 -0
  305. data/spec/support/matchers.rb +37 -0
  306. data/spec/support/sdam/rs/discover_arbiters.yml +41 -0
  307. data/spec/support/sdam/rs/discover_passives.yml +41 -0
  308. data/spec/support/sdam/rs/discover_primary.yml +40 -0
  309. data/spec/support/sdam/rs/discover_secondary.yml +41 -0
  310. data/spec/support/sdam/rs/discovery.yml +195 -0
  311. data/spec/support/sdam/rs/ghost_discovered.yml +39 -0
  312. data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +34 -0
  313. data/spec/support/sdam/rs/member_reconfig.yml +68 -0
  314. data/spec/support/sdam/rs/member_standalone.yml +60 -0
  315. data/spec/support/sdam/rs/new_primary.yml +74 -0
  316. data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +71 -0
  317. data/spec/support/sdam/rs/non_rs_member.yml +31 -0
  318. data/spec/support/sdam/rs/normalize_case.yml +49 -0
  319. data/spec/support/sdam/rs/primary_becomes_standalone.yml +52 -0
  320. data/spec/support/sdam/rs/primary_changes_set_name.yml +57 -0
  321. data/spec/support/sdam/rs/primary_disconnect.yml +56 -0
  322. data/spec/support/sdam/rs/primary_wrong_set_name.yml +27 -0
  323. data/spec/support/sdam/rs/response_from_removed.yml +63 -0
  324. data/spec/support/sdam/rs/rsother_discovered.yml +41 -0
  325. data/spec/support/sdam/rs/sec_not_auth.yml +49 -0
  326. data/spec/support/sdam/rs/secondary_wrong_set_name.yml +28 -0
  327. data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +69 -0
  328. data/spec/support/sdam/rs/unexpected_mongos.yml +26 -0
  329. data/spec/support/sdam/rs/wrong_set_name.yml +35 -0
  330. data/spec/support/sdam/sharded/multiple_mongoses.yml +46 -0
  331. data/spec/support/sdam/sharded/non_mongos_removed.yml +41 -0
  332. data/spec/support/sdam/sharded/normalize_uri_case.yml +32 -0
  333. data/spec/support/sdam/single/direct_connection_external_ip.yml +34 -0
  334. data/spec/support/sdam/single/direct_connection_mongos.yml +33 -0
  335. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +35 -0
  336. data/spec/support/sdam/single/direct_connection_rsprimary.yml +34 -0
  337. data/spec/support/sdam/single/direct_connection_rssecondary.yml +35 -0
  338. data/spec/support/sdam/single/direct_connection_slave.yml +32 -0
  339. data/spec/support/sdam/single/direct_connection_standalone.yml +32 -0
  340. data/spec/support/sdam/single/not_ok_response.yml +39 -0
  341. data/spec/support/sdam/single/standalone_removed.yml +32 -0
  342. data/spec/support/sdam/single/unavailable_seed.yml +28 -0
  343. data/spec/support/server_discovery_and_monitoring.rb +167 -0
  344. data/spec/support/server_selection/rtt/first_value.yml +4 -0
  345. data/spec/support/server_selection/rtt/first_value_zero.yml +4 -0
  346. data/spec/support/server_selection/rtt/value_test_1.yml +4 -0
  347. data/spec/support/server_selection/rtt/value_test_2.yml +4 -0
  348. data/spec/support/server_selection/rtt/value_test_3.yml +4 -0
  349. data/spec/support/server_selection/rtt/value_test_4.yml +4 -0
  350. data/spec/support/server_selection/rtt/value_test_5.yml +4 -0
  351. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +26 -0
  352. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +21 -0
  353. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +21 -0
  354. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +26 -0
  355. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +21 -0
  356. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +26 -0
  357. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +26 -0
  358. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +21 -0
  359. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +21 -0
  360. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +33 -0
  361. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +26 -0
  362. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +29 -0
  363. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +29 -0
  364. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +29 -0
  365. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary.yml +31 -0
  366. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred.yml +31 -0
  367. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml +29 -0
  368. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary_non_matching.yml +26 -0
  369. data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +26 -0
  370. data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +19 -0
  371. data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +11 -0
  372. data/spec/support/server_selection.rb +157 -0
  373. data/spec/support/server_selection_rtt.rb +41 -0
  374. data/spec/support/shared/bulk_write.rb +535 -0
  375. data/spec/support/shared/cursor.rb +38 -0
  376. data/spec/support/shared/operation.rb +77 -0
  377. data/spec/support/shared/protocol.rb +31 -0
  378. data/spec/support/shared/server_selector.rb +111 -0
  379. data/spec/support/shared/socket.rb +82 -0
  380. data/spec/support/travis.rb +14 -0
  381. data.tar.gz.sig +2 -3
  382. metadata +583 -186
  383. metadata.gz.sig +0 -0
  384. data/VERSION +0 -1
  385. data/lib/mongo/bulk_write_collection_view.rb +0 -387
  386. data/lib/mongo/collection_writer.rb +0 -364
  387. data/lib/mongo/connection/node.rb +0 -249
  388. data/lib/mongo/connection/pool.rb +0 -340
  389. data/lib/mongo/connection/pool_manager.rb +0 -320
  390. data/lib/mongo/connection/sharding_pool_manager.rb +0 -67
  391. data/lib/mongo/connection/socket/ssl_socket.rb +0 -95
  392. data/lib/mongo/connection/socket/tcp_socket.rb +0 -87
  393. data/lib/mongo/connection/socket/unix_socket.rb +0 -39
  394. data/lib/mongo/db.rb +0 -808
  395. data/lib/mongo/exception.rb +0 -145
  396. data/lib/mongo/functional/authentication.rb +0 -455
  397. data/lib/mongo/functional/logging.rb +0 -85
  398. data/lib/mongo/functional/read_preference.rb +0 -183
  399. data/lib/mongo/functional/scram.rb +0 -556
  400. data/lib/mongo/functional/uri_parser.rb +0 -409
  401. data/lib/mongo/functional/write_concern.rb +0 -66
  402. data/lib/mongo/gridfs/grid.rb +0 -112
  403. data/lib/mongo/gridfs/grid_ext.rb +0 -53
  404. data/lib/mongo/gridfs/grid_file_system.rb +0 -163
  405. data/lib/mongo/gridfs/grid_io.rb +0 -484
  406. data/lib/mongo/legacy.rb +0 -140
  407. data/lib/mongo/mongo_client.rb +0 -697
  408. data/lib/mongo/mongo_replica_set_client.rb +0 -535
  409. data/lib/mongo/mongo_sharded_client.rb +0 -159
  410. data/lib/mongo/networking.rb +0 -372
  411. data/lib/mongo/utils/conversions.rb +0 -110
  412. data/lib/mongo/utils/core_ext.rb +0 -70
  413. data/lib/mongo/utils/server_version.rb +0 -69
  414. data/lib/mongo/utils/support.rb +0 -80
  415. data/test/functional/authentication_test.rb +0 -39
  416. data/test/functional/bulk_api_stress_test.rb +0 -133
  417. data/test/functional/bulk_write_collection_view_test.rb +0 -1198
  418. data/test/functional/client_test.rb +0 -627
  419. data/test/functional/collection_test.rb +0 -2175
  420. data/test/functional/collection_writer_test.rb +0 -83
  421. data/test/functional/conversions_test.rb +0 -163
  422. data/test/functional/cursor_fail_test.rb +0 -57
  423. data/test/functional/cursor_message_test.rb +0 -56
  424. data/test/functional/cursor_test.rb +0 -683
  425. data/test/functional/db_api_test.rb +0 -835
  426. data/test/functional/db_test.rb +0 -348
  427. data/test/functional/grid_file_system_test.rb +0 -285
  428. data/test/functional/grid_io_test.rb +0 -252
  429. data/test/functional/grid_test.rb +0 -273
  430. data/test/functional/pool_test.rb +0 -136
  431. data/test/functional/safe_test.rb +0 -98
  432. data/test/functional/support_test.rb +0 -62
  433. data/test/functional/timeout_test.rb +0 -60
  434. data/test/functional/uri_test.rb +0 -446
  435. data/test/functional/write_concern_test.rb +0 -118
  436. data/test/helpers/general.rb +0 -50
  437. data/test/helpers/test_unit.rb +0 -476
  438. data/test/replica_set/authentication_test.rb +0 -37
  439. data/test/replica_set/basic_test.rb +0 -189
  440. data/test/replica_set/client_test.rb +0 -393
  441. data/test/replica_set/connection_test.rb +0 -138
  442. data/test/replica_set/count_test.rb +0 -66
  443. data/test/replica_set/cursor_test.rb +0 -220
  444. data/test/replica_set/insert_test.rb +0 -157
  445. data/test/replica_set/max_values_test.rb +0 -151
  446. data/test/replica_set/pinning_test.rb +0 -105
  447. data/test/replica_set/query_test.rb +0 -73
  448. data/test/replica_set/read_preference_test.rb +0 -219
  449. data/test/replica_set/refresh_test.rb +0 -211
  450. data/test/replica_set/replication_ack_test.rb +0 -95
  451. data/test/sharded_cluster/basic_test.rb +0 -203
  452. data/test/shared/authentication/basic_auth_shared.rb +0 -260
  453. data/test/shared/authentication/bulk_api_auth_shared.rb +0 -249
  454. data/test/shared/authentication/gssapi_shared.rb +0 -176
  455. data/test/shared/authentication/sasl_plain_shared.rb +0 -96
  456. data/test/shared/authentication/scram_shared.rb +0 -92
  457. data/test/shared/ssl_shared.rb +0 -235
  458. data/test/test_helper.rb +0 -61
  459. data/test/threading/basic_test.rb +0 -120
  460. data/test/tools/mongo_config.rb +0 -708
  461. data/test/tools/mongo_config_test.rb +0 -160
  462. data/test/unit/client_test.rb +0 -381
  463. data/test/unit/collection_test.rb +0 -166
  464. data/test/unit/connection_test.rb +0 -335
  465. data/test/unit/cursor_test.rb +0 -307
  466. data/test/unit/db_test.rb +0 -136
  467. data/test/unit/grid_test.rb +0 -76
  468. data/test/unit/mongo_sharded_client_test.rb +0 -48
  469. data/test/unit/node_test.rb +0 -93
  470. data/test/unit/pool_manager_test.rb +0 -111
  471. data/test/unit/read_pref_test.rb +0 -406
  472. data/test/unit/read_test.rb +0 -159
  473. data/test/unit/safe_test.rb +0 -158
  474. data/test/unit/sharding_pool_manager_test.rb +0 -84
  475. data/test/unit/write_concern_test.rb +0 -175
@@ -0,0 +1,535 @@
1
+ shared_examples 'a bulk write object' do
2
+
3
+ context 'when no operations are provided' do
4
+
5
+ let(:operations) do
6
+ []
7
+ end
8
+
9
+ it 'raises an error' do
10
+ expect {
11
+ bulk.execute
12
+ }.to raise_error(ArgumentError)
13
+ end
14
+ end
15
+
16
+ context 'when invalid operations are provided' do
17
+
18
+ let(:operations) do
19
+ [{ :not_an_op => {}}]
20
+ end
21
+
22
+ it 'raises an error' do
23
+ expect {
24
+ bulk.execute
25
+ }.to raise_error(Mongo::Error::InvalidBulkOperationType)
26
+ end
27
+ end
28
+
29
+ context 'when an insert_one operation is provided' do
30
+
31
+ context 'when a document is provided' do
32
+
33
+ let(:operations) do
34
+ [{ insert_one: { name: 'test' }}]
35
+ end
36
+
37
+ it 'returns n_inserted of 1' do
38
+ expect(bulk.execute[:n_inserted]).to eq(1)
39
+ end
40
+
41
+ it 'only inserts that document' do
42
+ bulk.execute
43
+ expect(authorized_collection.find.first['name']).to eq('test')
44
+ end
45
+ end
46
+
47
+ context 'when an invalid object is provided' do
48
+
49
+ let(:operations) do
50
+ [{ insert_one: [] }]
51
+ end
52
+
53
+ it 'raises an exception' do
54
+ expect {
55
+ bulk.execute
56
+ }.to raise_error(Mongo::Error::InvalidBulkOperation)
57
+ end
58
+ end
59
+ end
60
+
61
+ context 'delete_one' do
62
+
63
+ let(:docs) do
64
+ [ { a: 1 }, { a: 1 } ]
65
+ end
66
+
67
+ let(:expected) do
68
+ [{ 'a' => 1 }]
69
+ end
70
+
71
+ before do
72
+ authorized_collection.insert_many(docs)
73
+ end
74
+
75
+ let(:operations) do
76
+ [ { delete_one: { a: 1 }},
77
+ { delete_one: { a: 2 }}
78
+ ]
79
+ end
80
+
81
+ context 'when no selector is specified' do
82
+
83
+ let(:operations) do
84
+ [{ delete_one: nil }]
85
+ end
86
+
87
+ it 'raises an exception' do
88
+ expect {
89
+ bulk.execute
90
+ }.to raise_exception(Mongo::Error::InvalidBulkOperation)
91
+ end
92
+ end
93
+
94
+ context 'when multiple documents match delete selector' do
95
+
96
+ it 'reports n_removed correctly' do
97
+ expect(bulk.execute[:n_removed]).to eq(1)
98
+ end
99
+
100
+ it 'deletes only matching documents' do
101
+ bulk.execute
102
+ expect(authorized_collection.find.projection(_id: 0).to_a).to eq(expected)
103
+ end
104
+ end
105
+ end
106
+
107
+ context 'when a delete_many operation is provided' do
108
+
109
+ let(:docs) do
110
+ [{ a: 1 }, { a: 1 }]
111
+ end
112
+
113
+ before do
114
+ authorized_collection.insert_many(docs)
115
+ end
116
+
117
+ let(:operations) do
118
+ [{ delete_many: { a: 1 }}]
119
+ end
120
+
121
+ context 'when no selector is specified' do
122
+
123
+ let(:operations) do
124
+ [{ delete_many: nil }]
125
+ end
126
+
127
+ it 'raises an exception' do
128
+ expect {
129
+ bulk.execute
130
+ }.to raise_exception(Mongo::Error::InvalidBulkOperation)
131
+ end
132
+ end
133
+
134
+ context 'when a selector is specified' do
135
+
136
+ context 'when multiple documents match delete selector' do
137
+
138
+ it 'reports n_removed correctly' do
139
+ expect(bulk.execute[:n_removed]).to eq(2)
140
+ end
141
+
142
+ it 'deletes all matching documents' do
143
+ bulk.execute
144
+ expect(authorized_collection.find.to_a).to be_empty
145
+ end
146
+ end
147
+
148
+ context 'when only one document matches delete selector' do
149
+
150
+ let(:docs) do
151
+ [{ a: 1 }, { a: 2 }]
152
+ end
153
+
154
+ let(:expected) do
155
+ [{ 'a' => 2 }]
156
+ end
157
+
158
+ it 'reports n_removed correctly' do
159
+ expect(bulk.execute[:n_removed]).to eq(1)
160
+ end
161
+
162
+ it 'deletes all matching documents' do
163
+ bulk.execute
164
+ expect(authorized_collection.find.projection(_id: 0).to_a).to eq(expected)
165
+ end
166
+ end
167
+ end
168
+ end
169
+
170
+ context 'when a replace_one operation is provided' do
171
+
172
+ let(:docs) do
173
+ [{ a: 1 }, { a: 1 }]
174
+ end
175
+
176
+ let(:expected) do
177
+ [{ 'a' => 2 }, { 'a' => 1 }]
178
+ end
179
+
180
+ before do
181
+ authorized_collection.insert_many(docs)
182
+ end
183
+
184
+ let(:replacement) do
185
+ { a: 2 }
186
+ end
187
+
188
+ let(:operations) do
189
+ [{ replace_one: { find: { a: 1 },
190
+ replacement: replacement,
191
+ upsert: false }
192
+ }]
193
+ end
194
+
195
+ context 'when a replace document is not specified' do
196
+
197
+ let(:operations) do
198
+ [{ replace_one: { find: { a: 1 },
199
+ replacement: nil,
200
+ upsert: false }
201
+ }]
202
+ end
203
+
204
+ it 'raises an exception' do
205
+ expect {
206
+ bulk.execute
207
+ }.to raise_exception(Mongo::Error::InvalidBulkOperation)
208
+ end
209
+ end
210
+
211
+ context 'when there are $-operator top-level keys' do
212
+
213
+ let(:operations) do
214
+ [{ replace_one: { find: { a: 1 },
215
+ replacement: { :$set => { a: 3 }},
216
+ upsert: false }
217
+ }]
218
+ end
219
+
220
+ it 'raises an exception' do
221
+ expect {
222
+ bulk.execute
223
+ }.to raise_exception(Mongo::Error::InvalidBulkOperation)
224
+ end
225
+
226
+ end
227
+
228
+ context 'when a replace document is specified' do
229
+
230
+ it 'applies the replacement to only one matching document' do
231
+ bulk.execute
232
+ expect(authorized_collection.find(replacement).count).to eq(1)
233
+ end
234
+
235
+ it 'reports n_matched correctly' do
236
+ expect(bulk.execute[:n_matched]).to eq(1)
237
+ end
238
+
239
+ it 'only applies the replacement to one matching document' do
240
+ bulk.execute
241
+ expect(authorized_collection.find.projection(_id: 0).to_a).to eq(expected)
242
+ end
243
+
244
+ context 'when upsert is true' do
245
+
246
+ let(:operations) do
247
+ [{ replace_one: { find: { a: 4 },
248
+ replacement: replacement,
249
+ upsert: true }
250
+ }]
251
+ end
252
+
253
+ let(:expected) do
254
+ [{ 'a' => 1 }, { 'a' => 1 }, { 'a' => 2 }]
255
+ end
256
+
257
+ it 'upserts the replacement document' do
258
+ bulk.execute
259
+ expect(authorized_collection.find(replacement).count).to eq(1)
260
+ end
261
+
262
+ it 'reports n_matched correctly' do
263
+ expect(bulk.execute[:n_matched]).to eq(0)
264
+ end
265
+
266
+ it 'does not replace any documents' do
267
+ bulk.execute
268
+ expect(authorized_collection.find.projection(_id: 0).to_a).to eq(expected)
269
+ end
270
+ end
271
+ end
272
+ end
273
+
274
+ context 'when an update_one operation is provided' do
275
+
276
+ let(:docs) do
277
+ [{ a: 1 }, { a: 1 }]
278
+ end
279
+
280
+ let(:update) do
281
+ { :$set => { a: 2 }}
282
+ end
283
+
284
+ let(:operations) do
285
+ [{ update_one: { find: { a: 1 },
286
+ update: update,
287
+ upsert: false }
288
+ }]
289
+ end
290
+
291
+ before do
292
+ authorized_collection.insert_many(docs)
293
+ end
294
+
295
+ let(:expected) do
296
+ [{ 'a' => 2 }, { 'a' => 1 }]
297
+ end
298
+
299
+ context 'when an update document is not specified' do
300
+
301
+ let(:operations) do
302
+ [{ update_one: [{ a: 1 }]}]
303
+ end
304
+
305
+ let(:operations) do
306
+ [{ update_one: { find: { a: 1 },
307
+ upsert: false }
308
+ }]
309
+ end
310
+
311
+ it 'raises an exception' do
312
+ expect {
313
+ bulk.execute
314
+ }.to raise_exception(Mongo::Error::InvalidBulkOperation)
315
+ end
316
+ end
317
+
318
+ context 'when an invalid update document is specified' do
319
+
320
+ let(:update) do
321
+ { a: 2 }
322
+ end
323
+
324
+ it 'raises an exception' do
325
+ expect {
326
+ bulk.execute
327
+ }.to raise_exception(Mongo::Error::InvalidBulkOperation)
328
+ end
329
+ end
330
+
331
+ context 'when a valid update document is specified' do
332
+
333
+ it 'reports n_modified correctly', if: write_command_enabled? do
334
+ expect(bulk.execute[:n_modified]).to eq(1)
335
+ end
336
+
337
+ it 'reports n_modified correctly', unless: write_command_enabled? do
338
+ expect(bulk.execute[:n_modified]).to eq(nil)
339
+ end
340
+
341
+ it 'reports n_upserted correctly' do
342
+ expect(bulk.execute[:n_upserted]).to eq(0)
343
+ end
344
+
345
+ it 'reports n_matched correctly' do
346
+ expect(bulk.execute[:n_matched]).to eq(1)
347
+ end
348
+
349
+ it 'applies the correct writes' do
350
+ bulk.execute
351
+ expect(authorized_collection.find.projection(_id: 0).to_a).to eq(expected)
352
+ end
353
+
354
+ context 'when upsert is true' do
355
+
356
+ let(:operations) do
357
+ [{ update_one: { find: { a: 3 },
358
+ update: update,
359
+ upsert: true }
360
+ }]
361
+ end
362
+
363
+ let(:expected) do
364
+ [{ 'a' => 1 }, { 'a' => 1 }, { 'a' => 2 }]
365
+ end
366
+
367
+ it 'reports n_modified correctly', if: write_command_enabled? do
368
+ expect(bulk.execute[:n_modified]).to eq(0)
369
+ end
370
+
371
+ it 'reports n_modified correctly', unless: write_command_enabled? do
372
+ expect(bulk.execute[:n_modified]).to eq(nil)
373
+ end
374
+
375
+ it 'reports n_upserted correctly' do
376
+ expect(bulk.execute[:n_upserted]).to eq(1)
377
+ end
378
+
379
+ it 'reports n_matched correctly' do
380
+ expect(bulk.execute[:n_matched]).to eq(0)
381
+ end
382
+
383
+ it 'applies the correct writes' do
384
+ bulk.execute
385
+ expect(authorized_collection.find.projection(_id: 0).to_a).to eq(expected)
386
+ end
387
+ end
388
+ end
389
+ end
390
+
391
+ context 'when an update_many operation is provided' do
392
+
393
+ let(:docs) do
394
+ [{ a: 1 }, { a: 1 }]
395
+ end
396
+
397
+ let(:update) do
398
+ { :$set => { a: 2 }}
399
+ end
400
+
401
+ let(:operations) do
402
+ [{ update_many: { find: { a: 1 },
403
+ update: update,
404
+ upsert: false }
405
+ }]
406
+ end
407
+
408
+ let(:expected) do
409
+ [{ 'a' => 2 }, { 'a' => 2 }]
410
+ end
411
+
412
+ before do
413
+ authorized_collection.insert_many(docs)
414
+ end
415
+
416
+ context 'when an update document is not specified' do
417
+
418
+ let(:operations) do
419
+ [{ update_many: { find: { a: 1 },
420
+ upsert: false }
421
+ }]
422
+ end
423
+
424
+ it 'raises an exception' do
425
+ expect do
426
+ bulk.execute
427
+ end.to raise_exception(Mongo::Error::InvalidBulkOperation)
428
+ end
429
+ end
430
+
431
+ context 'when an invalid update document is specified' do
432
+
433
+ let(:update) do
434
+ { a: 2 }
435
+ end
436
+
437
+ it 'raises an exception' do
438
+ expect do
439
+ bulk.execute
440
+ end.to raise_exception(Mongo::Error::InvalidBulkOperation)
441
+ end
442
+ end
443
+
444
+ context 'when a valid update document is specified' do
445
+
446
+ it 'reports n_modified correctly', if: write_command_enabled? do
447
+ expect(bulk.execute[:n_modified]).to eq(2)
448
+ end
449
+
450
+ it 'reports n_modified correctly', unless: write_command_enabled? do
451
+ expect(bulk.execute[:n_modified]).to eq(nil)
452
+ end
453
+
454
+ it 'reports n_upserted correctly' do
455
+ expect(bulk.execute[:n_upserted]).to eq(0)
456
+ end
457
+
458
+ it 'reports n_matched correctly' do
459
+ expect(bulk.execute[:n_matched]).to eq(2)
460
+ end
461
+
462
+ it 'applies the correct writes' do
463
+ bulk.execute
464
+ expect(authorized_collection.find.projection(_id: 0).to_a).to eq(expected)
465
+ end
466
+
467
+ context 'when upsert is true' do
468
+
469
+ let(:operations) do
470
+ [{ update_many: { find: { a: 3 },
471
+ update: update,
472
+ upsert: true }
473
+ }]
474
+ end
475
+
476
+ let(:expected) do
477
+ [ { 'a' => 1 }, { 'a' => 1 }, { 'a' => 2 } ]
478
+ end
479
+
480
+ it 'reports n_modified correctly', if: write_command_enabled? do
481
+ expect(bulk.execute[:n_modified]).to eq(0)
482
+ end
483
+
484
+ it 'reports n_modified correctly', unless: write_command_enabled? do
485
+ expect(bulk.execute[:n_modified]).to eq(nil)
486
+ end
487
+
488
+ it 'reports n_upserted correctly' do
489
+ expect(bulk.execute[:n_upserted]).to eq(1)
490
+ end
491
+
492
+ it 'reports n_matched correctly' do
493
+ expect(bulk.execute[:n_matched]).to eq(0)
494
+ end
495
+
496
+ it 'applies the correct writes' do
497
+ bulk.execute
498
+ expect(authorized_collection.find.projection(_id: 0).to_a).to eq(expected)
499
+ end
500
+ end
501
+ end
502
+ end
503
+
504
+ context 'when the operations need to be split' do
505
+
506
+ before do
507
+ 6000.times do |i|
508
+ authorized_collection.insert_one(x: i)
509
+ end
510
+ end
511
+
512
+ let(:operations) do
513
+ [].tap do |ops|
514
+ 3000.times do |i|
515
+ ops << { update_one: { find: { x: i },
516
+ update: { '$set' => { x: 6000-i } },
517
+ upsert: false }
518
+ }
519
+ end
520
+ ops << { :insert_one => { test: 'emily' } }
521
+ 3000.times do |i|
522
+ ops << { update_one: { find: { x: 3000+i },
523
+ update: { '$set' => { x: 3000-i } },
524
+ upsert: false }
525
+ }
526
+ end
527
+ end
528
+ end
529
+
530
+ it 'completes all operations' do
531
+ bulk.execute
532
+ expect(authorized_collection.find(x: { '$lte' => 3000 }).to_a.size).to eq(3000)
533
+ end
534
+ end
535
+ end
@@ -0,0 +1,38 @@
1
+ shared_context 'shared cursor' do
2
+
3
+ let(:client) do
4
+ double('client').tap do |client|
5
+ allow(client).to receive(:mongos?).and_return(false)
6
+ allow(client).to receive(:execute).and_return(*get_mores)
7
+ end
8
+ end
9
+
10
+ let(:db) { Mongo::Database.new(client, TEST_DB) }
11
+ let(:collection) do
12
+ db[TEST_COLL].tap do |collection|
13
+ allow(collection).to receive(:full_namespace) do
14
+ "#{db.name}.#{collection.name}"
15
+ end
16
+ allow(collection).to receive(:client) { client }
17
+ end
18
+ end
19
+
20
+ let(:view_options) { {} }
21
+ let(:view) { Mongo::View::Collection.new(collection, {}, view_options) }
22
+
23
+ let(:nonzero) { 1 }
24
+ let(:b) { proc { |d| d } }
25
+
26
+ let(:response) { make_response(1, 3) }
27
+
28
+ def make_response(cursor_id = 0, nreturned = 5)
29
+ double('response').tap do |response|
30
+ allow(response).to receive(:documents) { (0...nreturned).to_a }
31
+ allow(response).to receive(:cursor_id) { cursor_id }
32
+ end
33
+ end
34
+
35
+ def get_mores
36
+ [ make_response ]
37
+ end
38
+ end
@@ -0,0 +1,77 @@
1
+ shared_context 'operation' do
2
+
3
+ let(:db_name) { TEST_DB }
4
+ let(:coll_name) { TEST_COLL }
5
+ let(:write_concern) { Mongo::WriteConcern.get(:w => 1) }
6
+ let(:options) { {} }
7
+
8
+ # Server doubles
9
+ let(:secondary_server) do
10
+ double('secondary_server').tap do |s|
11
+ allow(s).to receive(:secondary?) { true }
12
+ allow(s).to receive(:primary?) { false }
13
+ allow(s).to receive(:standalone?) { false }
14
+ end
15
+ end
16
+ let(:primary_server) do
17
+ double('primary_server').tap do |s|
18
+ allow(s).to receive(:primary?) { true }
19
+ allow(s).to receive(:secondary?) { false }
20
+ allow(s).to receive(:standalone?) { false }
21
+ end
22
+ end
23
+
24
+ let(:features_2_4) do
25
+ double('features').tap do |cxt|
26
+ allow(cxt).to receive(:write_command_enabled?) { false }
27
+ end
28
+ end
29
+
30
+ let(:features_2_6) do
31
+ double('features').tap do |cxt|
32
+ allow(cxt).to receive(:write_command_enabled?) { true }
33
+ end
34
+ end
35
+
36
+ # Context doubles
37
+ let(:primary_context) do
38
+ double('primary_context').tap do |cxt|
39
+ allow(cxt).to receive(:with_connection).and_yield(connection)
40
+ allow(cxt).to receive(:server) { primary_server }
41
+ allow(cxt).to receive(:features) { features_2_6 }
42
+ allow(cxt).to receive(:mongos?) { false }
43
+ allow(cxt).to receive(:primary?) { true }
44
+ allow(cxt).to receive(:secondary?) { false }
45
+ allow(cxt).to receive(:standalone?) { false }
46
+ end
47
+ end
48
+ let(:secondary_context) do
49
+ double('secondary_context').tap do |cxt|
50
+ allow(cxt).to receive(:with_connection).and_yield(connection)
51
+ allow(cxt).to receive(:server) { secondary_server }
52
+ allow(cxt).to receive(:mongos?) { false }
53
+ allow(cxt).to receive(:features) { features_2_6 }
54
+ allow(cxt).to receive(:secondary?) { true }
55
+ allow(cxt).to receive(:primary?) { false }
56
+ allow(cxt).to receive(:standalone?) { false }
57
+ end
58
+ end
59
+ let(:primary_context_2_4_version) do
60
+ double('primary_context').tap do |cxt|
61
+ allow(cxt).to receive(:with_connection).and_yield(connection)
62
+ allow(cxt).to receive(:server) { primary_server }
63
+ allow(cxt).to receive(:mongos?) { false }
64
+ allow(cxt).to receive(:primary?) { true }
65
+ allow(cxt).to receive(:secondary?) { false }
66
+ allow(cxt).to receive(:standalone?) { false }
67
+ allow(cxt).to receive(:features) { features_2_4 }
68
+ end
69
+ end
70
+
71
+ let(:connection) do
72
+ double('connection').tap do |conn|
73
+ allow(conn).to receive(:dispatch) { [] }
74
+ end
75
+ end
76
+ end
77
+
@@ -0,0 +1,31 @@
1
+ shared_examples 'message with a header' do
2
+ describe 'header' do
3
+ describe 'length' do
4
+ let(:field) { bytes[0..3] }
5
+ it 'serializes the length' do
6
+ expect(field).to be_int32(bytes.size)
7
+ end
8
+ end
9
+
10
+ describe 'request id' do
11
+ let(:field) { bytes[4..7] }
12
+ it 'serializes the request id' do
13
+ expect(field).to be_int32(message.request_id)
14
+ end
15
+ end
16
+
17
+ describe 'response to' do
18
+ let(:field) { bytes[8..11] }
19
+ it 'serializes the response to' do
20
+ expect(field).to be_int32(0)
21
+ end
22
+ end
23
+
24
+ describe 'op code' do
25
+ let(:field) { bytes[12..15] }
26
+ it 'serializes the op code' do
27
+ expect(field).to be_int32(opcode)
28
+ end
29
+ end
30
+ end
31
+ end