mongo 2.1.0.beta → 2.2.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 (342) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +10 -3
  4. data/Rakefile +1 -7
  5. data/lib/mongo/address/ipv4.rb +6 -1
  6. data/lib/mongo/address/unix.rb +2 -2
  7. data/lib/mongo/address.rb +32 -10
  8. data/lib/mongo/auth/cr/conversation.rb +1 -1
  9. data/lib/mongo/auth/ldap/conversation.rb +7 -3
  10. data/lib/mongo/auth/scram/conversation.rb +9 -3
  11. data/lib/mongo/auth/user/view.rb +23 -2
  12. data/lib/mongo/auth/x509/conversation.rb +1 -1
  13. data/lib/mongo/bulk_write/combineable.rb +51 -0
  14. data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
  15. data/lib/mongo/bulk_write/result.rb +61 -8
  16. data/lib/mongo/bulk_write/result_combiner.rb +117 -0
  17. data/lib/mongo/bulk_write/transformable.rb +132 -0
  18. data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
  19. data/lib/mongo/bulk_write/validatable.rb +62 -0
  20. data/lib/mongo/bulk_write.rb +164 -23
  21. data/lib/mongo/client.rb +75 -18
  22. data/lib/mongo/cluster/topology/replica_set.rb +8 -6
  23. data/lib/mongo/cluster/topology/unknown.rb +5 -2
  24. data/lib/mongo/cluster.rb +85 -5
  25. data/lib/mongo/collection/view/aggregation.rb +19 -45
  26. data/lib/mongo/collection/view/builder/aggregation.rb +98 -0
  27. data/lib/mongo/collection/view/builder/find_command.rb +111 -0
  28. data/lib/mongo/collection/view/builder/flags.rb +62 -0
  29. data/lib/mongo/collection/view/builder/map_reduce.rb +134 -0
  30. data/lib/mongo/collection/view/builder/modifiers.rb +80 -0
  31. data/lib/mongo/collection/view/builder/op_query.rb +83 -0
  32. data/lib/mongo/collection/view/builder.rb +20 -0
  33. data/lib/mongo/collection/view/explainable.rb +15 -0
  34. data/lib/mongo/collection/view/immutable.rb +4 -11
  35. data/lib/mongo/collection/view/iterable.rb +40 -5
  36. data/lib/mongo/collection/view/map_reduce.rb +67 -37
  37. data/lib/mongo/collection/view/readable.rb +114 -100
  38. data/lib/mongo/collection/view/writable.rb +46 -22
  39. data/lib/mongo/collection/view.rb +25 -22
  40. data/lib/mongo/collection.rb +130 -12
  41. data/lib/mongo/cursor/builder/get_more_command.rb +71 -0
  42. data/lib/mongo/cursor/builder/kill_cursors_command.rb +62 -0
  43. data/lib/mongo/cursor/builder/op_get_more.rb +61 -0
  44. data/lib/mongo/cursor/builder/op_kill_cursors.rb +56 -0
  45. data/lib/mongo/cursor/builder.rb +18 -0
  46. data/lib/mongo/cursor.rb +76 -21
  47. data/lib/mongo/database/view.rb +11 -6
  48. data/lib/mongo/database.rb +16 -6
  49. data/lib/mongo/dbref.rb +9 -9
  50. data/lib/mongo/{bulk_write/unordered_bulk_write.rb → error/closed_stream.rb} +12 -21
  51. data/lib/mongo/{bulk_write/ordered_bulk_write.rb → error/extra_file_chunk.rb} +13 -27
  52. data/lib/mongo/error/file_not_found.rb +37 -0
  53. data/lib/mongo/error/invalid_file.rb +2 -2
  54. data/lib/mongo/error/invalid_file_revision.rb +37 -0
  55. data/lib/mongo/error/invalid_uri.rb +5 -4
  56. data/lib/mongo/error/invalid_write_concern.rb +35 -0
  57. data/lib/mongo/error/missing_file_chunk.rb +38 -0
  58. data/lib/mongo/error/operation_failure.rb +33 -2
  59. data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
  60. data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
  61. data/lib/mongo/error.rb +8 -0
  62. data/lib/mongo/grid/file/chunk.rb +9 -9
  63. data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
  64. data/lib/mongo/grid/file.rb +12 -9
  65. data/lib/mongo/grid/fs_bucket.rb +448 -0
  66. data/lib/mongo/grid/stream/read.rb +208 -0
  67. data/lib/mongo/grid/stream/write.rb +187 -0
  68. data/lib/mongo/grid/stream.rb +64 -0
  69. data/lib/mongo/grid.rb +2 -1
  70. data/lib/mongo/index/view.rb +7 -4
  71. data/lib/mongo/index.rb +5 -0
  72. data/lib/mongo/loggable.rb +34 -57
  73. data/lib/mongo/logger.rb +16 -78
  74. data/lib/mongo/monitoring/command_log_subscriber.rb +38 -14
  75. data/lib/mongo/monitoring/event/command_started.rb +2 -1
  76. data/lib/mongo/monitoring/event/command_succeeded.rb +24 -2
  77. data/lib/mongo/monitoring/event/secure.rb +58 -0
  78. data/lib/mongo/monitoring/event.rb +1 -0
  79. data/lib/mongo/monitoring/publishable.rb +22 -12
  80. data/lib/mongo/monitoring.rb +1 -5
  81. data/lib/mongo/operation/commands/aggregate/result.rb +89 -0
  82. data/lib/mongo/operation/commands/aggregate.rb +64 -0
  83. data/lib/mongo/operation/commands/collections_info/result.rb +41 -0
  84. data/lib/mongo/operation/{read → commands}/collections_info.rb +5 -3
  85. data/lib/mongo/operation/commands/command.rb +47 -0
  86. data/lib/mongo/operation/commands/find/result.rb +62 -0
  87. data/lib/mongo/operation/commands/find.rb +27 -0
  88. data/lib/mongo/operation/commands/get_more/result.rb +62 -0
  89. data/lib/mongo/operation/commands/get_more.rb +27 -0
  90. data/lib/mongo/operation/{read → commands}/indexes.rb +9 -6
  91. data/lib/mongo/operation/{list_collections → commands/list_collections}/result.rb +1 -21
  92. data/lib/mongo/operation/{read → commands}/list_collections.rb +4 -32
  93. data/lib/mongo/operation/{list_indexes → commands/list_indexes}/result.rb +1 -21
  94. data/lib/mongo/operation/{read → commands}/list_indexes.rb +3 -33
  95. data/lib/mongo/operation/commands/map_reduce/result.rb +119 -0
  96. data/lib/mongo/operation/commands/map_reduce.rb +49 -0
  97. data/lib/mongo/operation/commands/parallel_scan/result.rb +64 -0
  98. data/lib/mongo/operation/commands/parallel_scan.rb +52 -0
  99. data/lib/mongo/operation/commands/user_query.rb +71 -0
  100. data/lib/mongo/operation/commands/users_info/result.rb +38 -0
  101. data/lib/mongo/operation/commands/users_info.rb +48 -0
  102. data/lib/mongo/operation/commands.rb +26 -0
  103. data/lib/mongo/operation/executable.rb +4 -68
  104. data/lib/mongo/operation/kill_cursors.rb +3 -3
  105. data/lib/mongo/operation/object_id_generator.rb +36 -0
  106. data/lib/mongo/operation/read/get_more.rb +2 -22
  107. data/lib/mongo/operation/read/query/result.rb +40 -0
  108. data/lib/mongo/operation/read/query.rb +4 -21
  109. data/lib/mongo/operation/read.rb +0 -4
  110. data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
  111. data/lib/mongo/operation/result.rb +43 -1
  112. data/lib/mongo/operation/specifiable.rb +59 -1
  113. data/lib/mongo/operation/write/bulk/bulkable.rb +83 -0
  114. data/lib/mongo/operation/write/bulk/delete/result.rb +67 -0
  115. data/lib/mongo/operation/write/bulk/delete.rb +71 -0
  116. data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
  117. data/lib/mongo/operation/write/bulk/insert.rb +96 -0
  118. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
  119. data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
  120. data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
  121. data/lib/mongo/operation/write/bulk/update.rb +81 -0
  122. data/lib/mongo/operation/write/bulk.rb +6 -3
  123. data/lib/mongo/operation/write/command/create_index.rb +0 -1
  124. data/lib/mongo/operation/write/command/create_user.rb +0 -1
  125. data/lib/mongo/operation/write/command/delete.rb +3 -3
  126. data/lib/mongo/operation/write/command/drop_index.rb +0 -1
  127. data/lib/mongo/operation/write/command/insert.rb +4 -3
  128. data/lib/mongo/operation/write/command/remove_user.rb +0 -1
  129. data/lib/mongo/operation/write/command/update.rb +6 -4
  130. data/lib/mongo/operation/write/command/update_user.rb +0 -1
  131. data/lib/mongo/operation/write/command/writable.rb +13 -18
  132. data/lib/mongo/operation/write/create_index.rb +4 -27
  133. data/lib/mongo/operation/write/create_user.rb +4 -30
  134. data/lib/mongo/operation/write/delete.rb +6 -29
  135. data/lib/mongo/operation/write/drop_index.rb +3 -3
  136. data/lib/mongo/operation/write/gle.rb +49 -0
  137. data/lib/mongo/operation/write/idable.rb +24 -2
  138. data/lib/mongo/operation/write/insert.rb +2 -24
  139. data/lib/mongo/operation/write/remove_user.rb +4 -27
  140. data/lib/mongo/operation/write/update.rb +13 -36
  141. data/lib/mongo/operation/write/update_user.rb +4 -30
  142. data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
  143. data/lib/mongo/operation/write.rb +2 -0
  144. data/lib/mongo/operation.rb +33 -5
  145. data/lib/mongo/options/mapper.rb +26 -2
  146. data/lib/mongo/options/redacted.rb +156 -0
  147. data/lib/mongo/options.rb +1 -0
  148. data/lib/mongo/protocol/bit_vector.rb +11 -9
  149. data/lib/mongo/protocol/delete.rb +78 -3
  150. data/lib/mongo/protocol/get_more.rb +59 -2
  151. data/lib/mongo/protocol/insert.rb +73 -1
  152. data/lib/mongo/protocol/kill_cursors.rb +66 -4
  153. data/lib/mongo/protocol/message.rb +44 -20
  154. data/lib/mongo/protocol/query.rb +153 -65
  155. data/lib/mongo/protocol/reply.rb +92 -1
  156. data/lib/mongo/protocol/serializers.rb +49 -40
  157. data/lib/mongo/protocol/update.rb +93 -1
  158. data/lib/mongo/retryable.rb +101 -0
  159. data/lib/mongo/server/connectable.rb +28 -8
  160. data/lib/mongo/server/connection.rb +52 -10
  161. data/lib/mongo/server/connection_pool/queue.rb +15 -0
  162. data/lib/mongo/server/connection_pool.rb +12 -15
  163. data/lib/mongo/server/description/features.rb +4 -2
  164. data/lib/mongo/server/description.rb +39 -3
  165. data/lib/mongo/server/monitor/connection.rb +49 -28
  166. data/lib/mongo/server/monitor.rb +3 -14
  167. data/lib/mongo/server.rb +31 -4
  168. data/lib/mongo/server_selector/selectable.rb +58 -32
  169. data/lib/mongo/server_selector.rb +19 -10
  170. data/lib/mongo/socket/ssl.rb +4 -1
  171. data/lib/mongo/socket/tcp.rb +2 -2
  172. data/lib/mongo/socket/unix.rb +5 -8
  173. data/lib/mongo/socket.rb +11 -4
  174. data/lib/mongo/uri.rb +245 -139
  175. data/lib/mongo/version.rb +1 -1
  176. data/lib/mongo/write_concern.rb +21 -6
  177. data/lib/mongo.rb +4 -4
  178. data/mongo.gemspec +1 -2
  179. data/spec/mongo/address/unix_spec.rb +1 -1
  180. data/spec/mongo/address_spec.rb +25 -0
  181. data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
  182. data/spec/mongo/auth/user/view_spec.rb +26 -1
  183. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +284 -0
  184. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
  185. data/spec/mongo/bulk_write_spec.rb +385 -161
  186. data/spec/mongo/client_spec.rb +193 -23
  187. data/spec/mongo/cluster/topology/replica_set_spec.rb +2 -0
  188. data/spec/mongo/collection/view/aggregation_spec.rb +65 -0
  189. data/spec/mongo/collection/view/builder/find_command_spec.rb +167 -0
  190. data/spec/mongo/collection/view/builder/flags_spec.rb +106 -0
  191. data/spec/mongo/collection/view/builder/modifiers_spec.rb +210 -0
  192. data/spec/mongo/collection/view/builder/op_query_spec.rb +154 -0
  193. data/spec/mongo/collection/view/explainable_spec.rb +1 -2
  194. data/spec/mongo/collection/view/immutable_spec.rb +54 -0
  195. data/spec/mongo/collection/view/map_reduce_spec.rb +104 -9
  196. data/spec/mongo/collection/view/readable_spec.rb +109 -112
  197. data/spec/mongo/collection/view_spec.rb +119 -487
  198. data/spec/mongo/collection_spec.rb +1002 -33
  199. data/spec/mongo/command_monitoring_spec.rb +64 -0
  200. data/spec/mongo/connection_string_spec.rb +115 -0
  201. data/spec/mongo/cursor/builder/get_more_command_spec.rb +160 -0
  202. data/spec/mongo/cursor/builder/op_get_more_spec.rb +52 -0
  203. data/spec/mongo/cursor_spec.rb +10 -60
  204. data/spec/mongo/database_spec.rb +81 -12
  205. data/spec/mongo/dbref_spec.rb +4 -4
  206. data/spec/mongo/grid/file/chunk_spec.rb +6 -6
  207. data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
  208. data/spec/mongo/grid/file_spec.rb +8 -8
  209. data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
  210. data/spec/mongo/grid/stream/read_spec.rb +275 -0
  211. data/spec/mongo/grid/stream/write_spec.rb +440 -0
  212. data/spec/mongo/grid/stream_spec.rb +48 -0
  213. data/spec/mongo/gridfs_spec.rb +50 -0
  214. data/spec/mongo/index/view_spec.rb +41 -0
  215. data/spec/mongo/logger_spec.rb +0 -40
  216. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
  217. data/spec/mongo/monitoring/event/command_started_spec.rb +26 -0
  218. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +26 -0
  219. data/spec/mongo/monitoring/event/secure_spec.rb +57 -0
  220. data/spec/mongo/operation/{aggregate → commands/aggregate}/result_spec.rb +1 -1
  221. data/spec/mongo/operation/commands/aggregate_spec.rb +69 -0
  222. data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
  223. data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +1 -19
  224. data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
  225. data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +1 -19
  226. data/spec/mongo/operation/kill_cursors_spec.rb +1 -17
  227. data/spec/mongo/operation/read/get_more_spec.rb +0 -16
  228. data/spec/mongo/operation/read/query_spec.rb +19 -16
  229. data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
  230. data/spec/mongo/operation/result_spec.rb +19 -0
  231. data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +17 -28
  232. data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +1 -12
  233. data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +7 -18
  234. data/spec/mongo/operation/write/command/delete_spec.rb +18 -9
  235. data/spec/mongo/operation/write/command/insert_spec.rb +18 -9
  236. data/spec/mongo/operation/write/command/update_spec.rb +18 -9
  237. data/spec/mongo/operation/write/delete_spec.rb +3 -3
  238. data/spec/mongo/operation/write/insert_spec.rb +0 -11
  239. data/spec/mongo/operation/write/update_spec.rb +6 -6
  240. data/spec/mongo/options/redacted_spec.rb +350 -0
  241. data/spec/mongo/protocol/delete_spec.rb +4 -4
  242. data/spec/mongo/protocol/get_more_spec.rb +4 -4
  243. data/spec/mongo/protocol/insert_spec.rb +3 -3
  244. data/spec/mongo/protocol/kill_cursors_spec.rb +8 -6
  245. data/spec/mongo/protocol/query_spec.rb +21 -7
  246. data/spec/mongo/protocol/update_spec.rb +5 -5
  247. data/spec/mongo/retryable_spec.rb +221 -0
  248. data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
  249. data/spec/mongo/server/connection_pool_spec.rb +42 -6
  250. data/spec/mongo/server/connection_spec.rb +86 -1
  251. data/spec/mongo/server/description/features_spec.rb +25 -0
  252. data/spec/mongo/server/description_spec.rb +42 -0
  253. data/spec/mongo/server/monitor_spec.rb +44 -0
  254. data/spec/mongo/server_discovery_and_monitoring_spec.rb +25 -59
  255. data/spec/mongo/server_selection_rtt_spec.rb +37 -57
  256. data/spec/mongo/server_selection_spec.rb +5 -3
  257. data/spec/mongo/server_selector/nearest_spec.rb +35 -27
  258. data/spec/mongo/server_selector/primary_preferred_spec.rb +32 -30
  259. data/spec/mongo/server_selector/primary_spec.rb +21 -14
  260. data/spec/mongo/server_selector/secondary_preferred_spec.rb +28 -26
  261. data/spec/mongo/server_selector/secondary_spec.rb +24 -22
  262. data/spec/mongo/server_selector_spec.rb +87 -24
  263. data/spec/mongo/server_spec.rb +78 -15
  264. data/spec/mongo/socket/ssl_spec.rb +101 -57
  265. data/spec/mongo/socket/unix_spec.rb +52 -0
  266. data/spec/mongo/uri_spec.rb +271 -59
  267. data/spec/mongo/write_concern_spec.rb +126 -0
  268. data/spec/spec_helper.rb +29 -23
  269. data/spec/support/authorization.rb +4 -5
  270. data/spec/support/command_monitoring/bulkWrite.yml +73 -0
  271. data/spec/support/command_monitoring/command.yml +42 -0
  272. data/spec/support/command_monitoring/deleteMany.yml +55 -0
  273. data/spec/support/command_monitoring/deleteOne.yml +55 -0
  274. data/spec/support/command_monitoring/find.yml +268 -0
  275. data/spec/support/command_monitoring/insertMany.yml +81 -0
  276. data/spec/support/command_monitoring/insertOne.yml +51 -0
  277. data/spec/support/command_monitoring/updateMany.yml +67 -0
  278. data/spec/support/command_monitoring/updateOne.yml +95 -0
  279. data/spec/support/command_monitoring.rb +373 -0
  280. data/spec/support/connection_string.rb +228 -0
  281. data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
  282. data/spec/support/connection_string_tests/valid-auth.yml +256 -0
  283. data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
  284. data/spec/support/connection_string_tests/valid-options.yml +30 -0
  285. data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
  286. data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
  287. data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
  288. data/spec/support/crud/read.rb +14 -10
  289. data/spec/support/crud/write.rb +36 -9
  290. data/spec/support/crud.rb +10 -2
  291. data/spec/support/gridfs.rb +637 -0
  292. data/spec/support/gridfs_tests/delete.yml +157 -0
  293. data/spec/support/gridfs_tests/download.yml +210 -0
  294. data/spec/support/gridfs_tests/download_by_name.yml +113 -0
  295. data/spec/support/gridfs_tests/upload.yml +158 -0
  296. data/spec/support/matchers.rb +2 -2
  297. data/spec/support/sdam/rs/equal_electionids.yml +1 -2
  298. data/spec/support/sdam/rs/new_primary_new_electionid.yml +0 -3
  299. data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
  300. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
  301. data/spec/support/sdam/rs/rsother_discovered.yml +24 -3
  302. data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
  303. data/spec/support/sdam/rs/stepdown_change_set_name.yml +59 -0
  304. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  305. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  306. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  307. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  308. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  309. data/spec/support/sdam/single/not_ok_response.yml +0 -1
  310. data/spec/support/server_discovery_and_monitoring.rb +3 -1
  311. data/spec/support/server_selection.rb +3 -1
  312. data/spec/support/shared/bulk_write.rb +192 -0
  313. data/spec/support/shared/protocol.rb +5 -5
  314. data/spec/support/shared/server_selector.rb +78 -13
  315. data/spec/support/travis.rb +1 -1
  316. data.tar.gz.sig +0 -0
  317. metadata +211 -72
  318. metadata.gz.sig +0 -0
  319. data/lib/mongo/bulk_write/bulk_writable.rb +0 -252
  320. data/lib/mongo/bulk_write/deletable.rb +0 -57
  321. data/lib/mongo/bulk_write/insertable.rb +0 -49
  322. data/lib/mongo/bulk_write/replacable.rb +0 -58
  323. data/lib/mongo/bulk_write/updatable.rb +0 -69
  324. data/lib/mongo/grid/fs.rb +0 -146
  325. data/lib/mongo/operation/aggregate/result.rb +0 -103
  326. data/lib/mongo/operation/aggregate.rb +0 -108
  327. data/lib/mongo/operation/command.rb +0 -61
  328. data/lib/mongo/operation/map_reduce/result.rb +0 -122
  329. data/lib/mongo/operation/map_reduce.rb +0 -95
  330. data/lib/mongo/operation/parallel_scan/result.rb +0 -72
  331. data/lib/mongo/operation/parallel_scan.rb +0 -76
  332. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
  333. data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
  334. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
  335. data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
  336. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
  337. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -174
  338. data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
  339. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
  340. data/spec/mongo/grid/fs_spec.rb +0 -160
  341. data/spec/mongo/loggable_spec.rb +0 -63
  342. data/spec/mongo/operation/aggregate_spec.rb +0 -127
@@ -6,66 +6,125 @@ describe Mongo::ServerSelector do
6
6
 
7
7
  describe '.get' do
8
8
 
9
- let(:read_pref) do
10
- described_class.get({ :mode => name })
9
+ let(:selector) do
10
+ described_class.get(:mode => name, :tag_sets => tag_sets)
11
11
  end
12
12
 
13
- let(:name) { :secondary }
14
- let(:tag_sets) { [{ 'test' => 'tag' }] }
15
-
16
13
  context 'when the mode is primary' do
17
- let(:name) { :primary }
14
+
15
+ let(:name) do
16
+ :primary
17
+ end
18
18
 
19
19
  it 'returns a read preference of class Primary' do
20
- expect(read_pref).to be_a(Mongo::ServerSelector::Primary)
20
+ expect(selector).to be_a(Mongo::ServerSelector::Primary)
21
21
  end
22
22
  end
23
23
 
24
24
  context 'when the mode is primary_preferred' do
25
- let(:name) { :primary_preferred }
25
+ let(:name) do
26
+ :primary_preferred
27
+ end
26
28
 
27
29
  it 'returns a read preference of class PrimaryPreferred' do
28
- expect(read_pref).to be_a(Mongo::ServerSelector::PrimaryPreferred)
30
+ expect(selector).to be_a(Mongo::ServerSelector::PrimaryPreferred)
29
31
  end
30
32
  end
31
33
 
32
34
  context 'when the mode is secondary' do
33
- let(:name) { :secondary }
35
+ let(:name) do
36
+ :secondary
37
+ end
34
38
 
35
39
  it 'returns a read preference of class Secondary' do
36
- expect(read_pref).to be_a(Mongo::ServerSelector::Secondary)
40
+ expect(selector).to be_a(Mongo::ServerSelector::Secondary)
37
41
  end
38
42
  end
39
43
 
40
44
  context 'when the mode is secondary_preferred' do
41
- let(:name) { :secondary_preferred }
45
+ let(:name) do
46
+ :secondary_preferred
47
+ end
42
48
 
43
49
  it 'returns a read preference of class SecondaryPreferred' do
44
- expect(read_pref).to be_a(Mongo::ServerSelector::SecondaryPreferred)
50
+ expect(selector).to be_a(Mongo::ServerSelector::SecondaryPreferred)
45
51
  end
46
52
  end
47
53
 
48
54
  context 'when the mode is nearest' do
49
- let(:name) { :nearest }
55
+ let(:name) do
56
+ :nearest
57
+ end
50
58
 
51
59
  it 'returns a read preference of class Nearest' do
52
- expect(read_pref).to be_a(Mongo::ServerSelector::Nearest)
60
+ expect(selector).to be_a(Mongo::ServerSelector::Nearest)
53
61
  end
54
62
  end
55
63
 
56
64
  context 'when a mode is not provided' do
57
- let(:read_pref) { described_class.get }
65
+ let(:selector) { described_class.get }
58
66
 
59
67
  it 'returns a read preference of class Primary' do
60
- expect(read_pref).to be_a(Mongo::ServerSelector::Primary)
68
+ expect(selector).to be_a(Mongo::ServerSelector::Primary)
61
69
  end
62
70
  end
63
71
 
64
- context 'when tag sets provided' do
65
- let(:read_pref) { described_class.get(:mode => name, :tag_sets => tag_sets) }
72
+ context 'when tag sets are provided' do
73
+
74
+ let(:selector) do
75
+ described_class.get(:mode => :secondary, :tag_sets => tag_sets)
76
+ end
77
+
78
+ let(:tag_sets) do
79
+ [{ 'test' => 'tag' }]
80
+ end
66
81
 
67
82
  it 'sets tag sets on the read preference object' do
68
- expect(read_pref.tag_sets).to eq(tag_sets)
83
+ expect(selector.tag_sets).to eq(tag_sets)
84
+ end
85
+ end
86
+
87
+ context 'when server_selection_timeout is specified' do
88
+
89
+ let(:selector) do
90
+ described_class.get(:mode => :secondary, :server_selection_timeout => 1)
91
+ end
92
+
93
+ it 'sets server selection timeout on the read preference object' do
94
+ expect(selector.server_selection_timeout).to eq(1)
95
+ end
96
+ end
97
+
98
+ context 'when server_selection_timeout is not specified' do
99
+
100
+ let(:selector) do
101
+ described_class.get(:mode => :secondary)
102
+ end
103
+
104
+ it 'sets server selection timeout to the default' do
105
+ expect(selector.server_selection_timeout).to eq(Mongo::ServerSelector::SERVER_SELECTION_TIMEOUT)
106
+ end
107
+ end
108
+
109
+ context 'when local_threshold is specified' do
110
+
111
+ let(:selector) do
112
+ described_class.get(:mode => :secondary, :local_threshold => 0.010)
113
+ end
114
+
115
+ it 'sets local_threshold on the read preference object' do
116
+ expect(selector.local_threshold).to eq(0.010)
117
+ end
118
+ end
119
+
120
+ context 'when local_threshold is not specified' do
121
+
122
+ let(:selector) do
123
+ described_class.get(:mode => :secondary)
124
+ end
125
+
126
+ it 'sets local threshold to the default' do
127
+ expect(selector.local_threshold).to eq(Mongo::ServerSelector::LOCAL_THRESHOLD)
69
128
  end
70
129
  end
71
130
  end
@@ -74,7 +133,9 @@ describe Mongo::ServerSelector do
74
133
 
75
134
  context 'when #select returns a list of nils' do
76
135
 
77
- let(:servers) { [ server(:primary) ] }
136
+ let(:servers) do
137
+ [ server(:primary) ]
138
+ end
78
139
 
79
140
  let(:cluster) do
80
141
  double('cluster').tap do |c|
@@ -86,7 +147,7 @@ describe Mongo::ServerSelector do
86
147
  end
87
148
 
88
149
  let(:read_pref) do
89
- described_class.get({ mode: :primary }, server_selection_timeout: 1).tap do |pref|
150
+ described_class.get(mode: :primary, server_selection_timeout: 0.1).tap do |pref|
90
151
  allow(pref).to receive(:select).and_return([ nil, nil ])
91
152
  end
92
153
  end
@@ -103,7 +164,9 @@ describe Mongo::ServerSelector do
103
164
 
104
165
  context 'when cluster#servers is empty' do
105
166
 
106
- let(:servers) { [] }
167
+ let(:servers) do
168
+ []
169
+ end
107
170
 
108
171
  let(:cluster) do
109
172
  double('cluster').tap do |c|
@@ -115,7 +178,7 @@ describe Mongo::ServerSelector do
115
178
  end
116
179
 
117
180
  let(:read_pref) do
118
- described_class.get({ mode: :primary }, server_selection_timeout: 1)
181
+ described_class.get(mode: :primary, server_selection_timeout: 0.1)
119
182
  end
120
183
 
121
184
  it 'raises a NoServerAvailable error' do
@@ -18,12 +18,21 @@ describe Mongo::Server do
18
18
  Mongo::Address.new('127.0.0.1:27017')
19
19
  end
20
20
 
21
+ let(:pool) do
22
+ Mongo::Server::ConnectionPool.get(server)
23
+ end
24
+
21
25
  describe '#==' do
22
26
 
23
27
  let(:server) do
24
28
  described_class.new(address, cluster, monitoring, listeners, TEST_OPTIONS)
25
29
  end
26
30
 
31
+ after do
32
+ expect(cluster).to receive(:pool).with(server).and_return(pool)
33
+ server.disconnect!
34
+ end
35
+
27
36
  context 'when the other is not a server' do
28
37
 
29
38
  let(:other) do
@@ -65,6 +74,48 @@ describe Mongo::Server do
65
74
  end
66
75
  end
67
76
 
77
+ describe '#connectable?' do
78
+
79
+ context 'when the server is connectable' do
80
+
81
+ let(:server) do
82
+ described_class.new(address, cluster, monitoring, listeners, TEST_OPTIONS)
83
+ end
84
+
85
+ after do
86
+ server.disconnect!
87
+ end
88
+
89
+ before do
90
+ expect(cluster).to receive(:pool).with(server).and_return(pool)
91
+ end
92
+
93
+ it 'returns true' do
94
+ expect(server).to be_connectable
95
+ end
96
+ end
97
+
98
+ context 'when the server is not connectable' do
99
+
100
+ let(:bad_address) do
101
+ Mongo::Address.new('127.0.0.1:666')
102
+ end
103
+
104
+ let(:server) do
105
+ described_class.new(bad_address, cluster, monitoring, listeners, TEST_OPTIONS)
106
+ end
107
+
108
+ before do
109
+ expect(cluster).to receive(:pool).with(server).and_return(pool)
110
+ server.disconnect!
111
+ end
112
+
113
+ it 'returns false' do
114
+ expect(server).to_not be_connectable
115
+ end
116
+ end
117
+ end
118
+
68
119
  describe '#context' do
69
120
 
70
121
  let(:server) do
@@ -75,6 +126,11 @@ describe Mongo::Server do
75
126
  server.context
76
127
  end
77
128
 
129
+ after do
130
+ expect(cluster).to receive(:pool).with(server).and_return(pool)
131
+ server.disconnect!
132
+ end
133
+
78
134
  it 'returns a new server context' do
79
135
  expect(context.server).to eq(server)
80
136
  end
@@ -88,6 +144,7 @@ describe Mongo::Server do
88
144
 
89
145
  it 'stops the monitor instance' do
90
146
  expect(server.instance_variable_get(:@monitor)).to receive(:stop!).and_return(true)
147
+ expect(cluster).to receive(:pool).with(server).and_return(pool)
91
148
  server.disconnect!
92
149
  end
93
150
  end
@@ -95,7 +152,18 @@ describe Mongo::Server do
95
152
  describe '#initialize' do
96
153
 
97
154
  let(:server) do
98
- described_class.new(address, cluster, monitoring, listeners, TEST_OPTIONS.merge(:heartbeat_frequency => 5))
155
+ described_class.new(
156
+ address,
157
+ cluster,
158
+ monitoring,
159
+ listeners,
160
+ TEST_OPTIONS.merge(:heartbeat_frequency => 5)
161
+ )
162
+ end
163
+
164
+ after do
165
+ expect(cluster).to receive(:pool).with(server).and_return(pool)
166
+ server.disconnect!
99
167
  end
100
168
 
101
169
  it 'sets the address host' do
@@ -111,25 +179,15 @@ describe Mongo::Server do
111
179
  end
112
180
  end
113
181
 
114
- describe '#pool' do
182
+ describe '#scan!' do
115
183
 
116
184
  let(:server) do
117
185
  described_class.new(address, cluster, monitoring, listeners, TEST_OPTIONS)
118
186
  end
119
187
 
120
- let(:pool) do
121
- server.pool
122
- end
123
-
124
- it 'returns the connection pool for the server' do
125
- expect(pool).to be_a(Mongo::Server::ConnectionPool)
126
- end
127
- end
128
-
129
- describe '#scan!' do
130
-
131
- let(:server) do
132
- described_class.new(address, cluster, monitoring, listeners, TEST_OPTIONS)
188
+ after do
189
+ expect(cluster).to receive(:pool).with(server).and_return(pool)
190
+ server.disconnect!
133
191
  end
134
192
 
135
193
  it 'forces a scan on the monitor' do
@@ -147,6 +205,11 @@ describe Mongo::Server do
147
205
  expect(server.monitor).to receive(:restart!).and_call_original
148
206
  end
149
207
 
208
+ after do
209
+ expect(cluster).to receive(:pool).with(server).and_return(pool)
210
+ server.disconnect!
211
+ end
212
+
150
213
  it 'restarts the monitor and returns true' do
151
214
  expect(server.reconnect!).to be(true)
152
215
  end
@@ -1,61 +1,78 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Mongo::Socket::SSL do
3
+ describe Mongo::Socket::SSL, if: running_ssl? do
4
4
 
5
- describe '#connect!', if: running_ssl? do
5
+ let(:socket) do
6
+ described_class.new(*DEFAULT_ADDRESS.split(":"), DEFAULT_ADDRESS.split(":")[0], 5, Socket::PF_INET, options)
7
+ end
6
8
 
7
- let(:socket) do
8
- described_class.new(*DEFAULT_ADDRESS.split(":"), DEFAULT_ADDRESS.split(":")[0], 5, Socket::PF_INET, options)
9
- end
9
+ let(:options) do
10
+ {
11
+ :ssl => true,
12
+ :ssl_cert => CLIENT_PEM,
13
+ :ssl_key => CLIENT_PEM,
14
+ :ssl_verify => false
15
+ }
16
+ end
17
+
18
+ describe '#connect!' do
10
19
 
11
20
  context 'when a certificate is provided' do
12
21
 
13
- let(:options) do
14
- {
15
- :ssl => true,
16
- :ssl_cert => CLIENT_PEM,
17
- :ssl_key => CLIENT_PEM,
18
- :ssl_verify => false
19
- }
20
- end
22
+ context 'when connecting the tcp socket is successful' do
21
23
 
22
- before do
23
- socket.connect!
24
+ before do
25
+ socket.connect!
26
+ end
27
+
28
+ it 'connects to the server' do
29
+ expect(socket).to be_alive
30
+ end
24
31
  end
25
32
 
26
- it 'connects to the server' do
27
- expect(socket).to be_alive
33
+ context 'when connecting the tcp socket raises an exception' do
34
+
35
+ before do
36
+ tcp_socket = socket.instance_variable_get(:@tcp_socket)
37
+ allow(tcp_socket).to receive(:connect).and_raise(Mongo::Error::SocketTimeoutError)
38
+ end
39
+
40
+ let!(:result) do
41
+ begin
42
+ socket.connect!
43
+ rescue => e
44
+ e
45
+ end
46
+ end
47
+
48
+ it 'raises an exception' do
49
+ expect(result).to be_a(Mongo::Error::SocketTimeoutError)
50
+ end
28
51
  end
29
52
  end
30
53
 
31
54
  context 'when a bad certificate is provided' do
32
55
 
33
56
  let(:options) do
34
- {
35
- :ssl => true,
36
- :ssl_cert => CLIENT_PEM,
37
- :ssl_key => CRL_PEM,
38
- :ssl_verify => false
39
- }
57
+ super().merge({
58
+ :ssl_key => CRL_PEM
59
+ })
40
60
  end
41
61
 
42
62
  it 'raises an exception' do
43
63
  expect {
44
64
  socket.connect!
45
- }.to raise_error
65
+ }.to raise_exception(OpenSSL::PKey::RSAError)
46
66
  end
47
67
  end
48
68
 
49
69
  context 'when a CA certificate is provided', if: testing_ssl_locally? do
50
70
 
51
71
  let(:options) do
52
- {
53
- :ssl => true,
54
- :ssl_cert => CLIENT_PEM,
55
- :ssl_key => CLIENT_PEM,
56
- :ssl_ca_cert => CA_PEM,
57
- :ssl_verify => true
58
- }
72
+ super().merge({
73
+ :ssl_ca_cert => CA_PEM,
74
+ :ssl_verify => true
75
+ })
59
76
  end
60
77
 
61
78
  before do
@@ -70,12 +87,9 @@ describe Mongo::Socket::SSL do
70
87
  context 'when a CA certificate is not provided', if: testing_ssl_locally? do
71
88
 
72
89
  let(:options) do
73
- {
74
- :ssl => true,
75
- :ssl_cert => CLIENT_PEM,
76
- :ssl_key => CLIENT_PEM,
77
- :ssl_verify => true
78
- }
90
+ super().merge({
91
+ :ssl_verify => true
92
+ })
79
93
  end
80
94
 
81
95
  before do
@@ -91,12 +105,9 @@ describe Mongo::Socket::SSL do
91
105
  context 'when ssl_verify is not specified', if: testing_ssl_locally? do
92
106
 
93
107
  let(:options) do
94
- {
95
- :ssl => true,
96
- :ssl_cert => CLIENT_PEM,
97
- :ssl_key => CLIENT_PEM,
98
- :ssl_ca_cert => CA_PEM
99
- }
108
+ super().merge({
109
+ :ssl_ca_cert => CA_PEM
110
+ }).tap { |options| options.delete(:ssl_verify) }
100
111
  end
101
112
 
102
113
  before do
@@ -111,13 +122,10 @@ describe Mongo::Socket::SSL do
111
122
  context 'when ssl_verify is true', if: testing_ssl_locally? do
112
123
 
113
124
  let(:options) do
114
- {
115
- :ssl => true,
116
- :ssl_cert => CLIENT_PEM,
117
- :ssl_key => CLIENT_PEM,
118
- :ssl_ca_cert => CA_PEM,
119
- :ssl_verify => true
120
- }
125
+ super().merge({
126
+ :ssl_ca_cert => CA_PEM,
127
+ :ssl_verify => true
128
+ })
121
129
  end
122
130
 
123
131
  before do
@@ -132,13 +140,10 @@ describe Mongo::Socket::SSL do
132
140
  context 'when ssl_verify is false' do
133
141
 
134
142
  let(:options) do
135
- {
136
- :ssl => true,
137
- :ssl_cert => CLIENT_PEM,
138
- :ssl_key => CLIENT_PEM,
139
- :ssl_ca_cert => 'invalid',
140
- :ssl_verify => false
141
- }
143
+ super().merge({
144
+ :ssl_ca_cert => 'invalid',
145
+ :ssl_verify => false
146
+ })
142
147
  end
143
148
 
144
149
  before do
@@ -150,4 +155,43 @@ describe Mongo::Socket::SSL do
150
155
  end
151
156
  end
152
157
  end
158
+
159
+ describe '#readbyte' do
160
+
161
+ before do
162
+ allow_message_expectations_on_nil
163
+
164
+ allow(socket.socket).to receive(:read) do |length|
165
+ socket_content[0, length]
166
+ end
167
+ end
168
+
169
+ context 'with the socket providing "abc"' do
170
+
171
+ let(:socket_content) { "abc" }
172
+
173
+ it 'should return 97 (the byte for "a")' do
174
+ expect(socket.readbyte).to eq(97)
175
+ end
176
+ end
177
+
178
+ context 'with the socket providing "\x00" (NULL_BYTE)' do
179
+
180
+ let(:socket_content) { "\x00" }
181
+
182
+ it 'should return 0' do
183
+ expect(socket.readbyte).to eq(0)
184
+ end
185
+ end
186
+
187
+ context 'with the socket providing no data' do
188
+
189
+ let(:socket_content) { "" }
190
+
191
+ it 'should raise EOFError' do
192
+ expect { socket.readbyte }
193
+ .to raise_error(Mongo::Error::SocketError).with_message("EOFError")
194
+ end
195
+ end
196
+ end
153
197
  end
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Socket::Unix do
4
+
5
+ let(:socket) do
6
+ described_class.new("/tmp/mongodb-27017.sock", 5)
7
+ end
8
+
9
+ describe '#connect!' do
10
+
11
+ before do
12
+ socket.connect!
13
+ end
14
+
15
+ after do
16
+ socket.close
17
+ end
18
+
19
+ it 'connects to the server' do
20
+ expect(socket).to be_alive
21
+ end
22
+ end
23
+
24
+ describe '#alive?' do
25
+
26
+ context 'when the socket is connected' do
27
+
28
+ before do
29
+ socket.connect!
30
+ end
31
+
32
+ after do
33
+ socket.close
34
+ end
35
+
36
+ it 'returns true' do
37
+ expect(socket).to be_alive
38
+ end
39
+ end
40
+
41
+ context 'when the socket is not connected' do
42
+
43
+ before do
44
+ socket.close
45
+ end
46
+
47
+ it 'raises error' do
48
+ expect { socket.alive? }.to raise_error(IOError)
49
+ end
50
+ end
51
+ end
52
+ end