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,312 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Server::Connection do
4
+
5
+ let(:address) do
6
+ Mongo::Address.new(DEFAULT_ADDRESS)
7
+ end
8
+
9
+ let(:server) do
10
+ Mongo::Server.new(address, Mongo::Event::Listeners.new)
11
+ end
12
+
13
+ describe '#connect!' do
14
+
15
+ context 'when no socket exists' do
16
+
17
+ let(:connection) do
18
+ described_class.new(server)
19
+ end
20
+
21
+ let!(:result) do
22
+ connection.connect!
23
+ end
24
+
25
+ let(:socket) do
26
+ connection.send(:socket)
27
+ end
28
+
29
+ it 'returns true' do
30
+ expect(result).to be true
31
+ end
32
+
33
+ it 'creates a socket' do
34
+ expect(socket).to_not be_nil
35
+ end
36
+
37
+ it 'connects the socket' do
38
+ expect(socket).to be_alive
39
+ end
40
+ end
41
+
42
+ context 'when a socket exists' do
43
+
44
+ let(:connection) do
45
+ described_class.new(server)
46
+ end
47
+
48
+ before do
49
+ connection.connect!
50
+ connection.connect!
51
+ end
52
+
53
+ let(:socket) do
54
+ connection.send(:socket)
55
+ end
56
+
57
+ it 'keeps the socket alive' do
58
+ expect(socket).to be_alive
59
+ end
60
+ end
61
+
62
+ context 'when user credentials exist' do
63
+
64
+ context 'when the user is not authorized' do
65
+
66
+ let(:connection) do
67
+ described_class.new(
68
+ server,
69
+ :user => 'notauser',
70
+ :password => 'password',
71
+ :database => TEST_DB
72
+ )
73
+ end
74
+
75
+ it 'raises an error' do
76
+ expect {
77
+ connection.connect!
78
+ }.to raise_error(Mongo::Auth::Unauthorized)
79
+ end
80
+ end
81
+
82
+ describe 'when the user is authorized' do
83
+
84
+ let(:connection) do
85
+ described_class.new(
86
+ server,
87
+ :user => TEST_USER.name,
88
+ :password => TEST_USER.password,
89
+ :database => TEST_DB
90
+ )
91
+ end
92
+
93
+ before do
94
+ connection.connect!
95
+ end
96
+
97
+ it 'sets the connection as authenticated' do
98
+ expect(connection).to be_authenticated
99
+ end
100
+ end
101
+ end
102
+ end
103
+
104
+ describe '#disconnect!' do
105
+
106
+ context 'when a socket is not connected' do
107
+
108
+ let(:connection) do
109
+ described_class.new(server)
110
+ end
111
+
112
+ it 'does not raise an error' do
113
+ expect(connection.disconnect!).to be true
114
+ end
115
+ end
116
+
117
+ context 'when a socket is connected' do
118
+
119
+ let(:connection) do
120
+ described_class.new(server)
121
+ end
122
+
123
+ before do
124
+ connection.connect!
125
+ connection.disconnect!
126
+ end
127
+
128
+ it 'disconnects the socket' do
129
+ expect(connection.send(:socket)).to be_nil
130
+ end
131
+ end
132
+ end
133
+
134
+ describe '#dispatch' do
135
+
136
+ let!(:connection) do
137
+ described_class.new(
138
+ server,
139
+ :user => TEST_USER.name,
140
+ :password => TEST_USER.password,
141
+ :database => TEST_DB
142
+ )
143
+ end
144
+
145
+ let(:documents) do
146
+ [{ 'name' => 'testing' }]
147
+ end
148
+
149
+ let(:insert) do
150
+ Mongo::Protocol::Insert.new(TEST_DB, TEST_COLL, documents)
151
+ end
152
+
153
+ let(:query) do
154
+ Mongo::Protocol::Query.new(TEST_DB, TEST_COLL, { 'name' => 'testing' })
155
+ end
156
+
157
+ context 'when providing a single message' do
158
+
159
+ let(:reply) do
160
+ connection.dispatch([ insert, query ])
161
+ end
162
+
163
+ after do
164
+ authorized_collection.find.delete_many
165
+ end
166
+
167
+ it 'it dispatchs the message to the socket' do
168
+ expect(reply.documents.first['name']).to eq('testing')
169
+ end
170
+ end
171
+
172
+ context 'when providing multiple messages' do
173
+
174
+ let(:selector) do
175
+ { :getlasterror => 1 }
176
+ end
177
+
178
+ let(:command) do
179
+ Mongo::Protocol::Query.new(TEST_DB, '$cmd', selector, :limit => -1)
180
+ end
181
+
182
+ let(:reply) do
183
+ connection.dispatch([ insert, command ])
184
+ end
185
+
186
+ after do
187
+ authorized_collection.find.delete_many
188
+ end
189
+
190
+ it 'it dispatchs the message to the socket' do
191
+ expect(reply.documents.first['ok']).to eq(1.0)
192
+ end
193
+ end
194
+
195
+ context 'when a network or socket error occurs' do
196
+
197
+ let(:socket) do
198
+ connection.connect!
199
+ connection.instance_variable_get(:@socket)
200
+ end
201
+
202
+ before do
203
+ expect(socket).to receive(:write).and_raise(Mongo::Error::SocketError)
204
+ end
205
+
206
+ it 'disconnects and raises the exception' do
207
+ expect {
208
+ connection.dispatch([ insert ])
209
+ }.to raise_error(Mongo::Error::SocketError)
210
+ expect(connection).to_not be_connected
211
+ end
212
+ end
213
+
214
+ context 'when the process is forked' do
215
+
216
+ let(:insert) do
217
+ Mongo::Protocol::Insert.new(TEST_DB, TEST_COLL, documents)
218
+ end
219
+
220
+ before do
221
+ expect(Process).to receive(:pid).at_least(:once).and_return(1)
222
+ end
223
+
224
+ after do
225
+ authorized_collection.find.delete_many
226
+ end
227
+
228
+ it 'disconnects the connection' do
229
+ expect(connection).to receive(:disconnect!).and_call_original
230
+ connection.dispatch([ insert ])
231
+ end
232
+
233
+ it 'sets a new pid' do
234
+ connection.dispatch([ insert ])
235
+ expect(connection.pid).to eq(1)
236
+ end
237
+ end
238
+ end
239
+
240
+ describe '#initialize' do
241
+
242
+ context 'when host and port are provided' do
243
+
244
+ let(:connection) do
245
+ described_class.new(server)
246
+ end
247
+
248
+ it 'sets the address' do
249
+ expect(connection.address).to eq(server.address)
250
+ end
251
+
252
+ it 'sets the socket to nil' do
253
+ expect(connection.send(:socket)).to be_nil
254
+ end
255
+
256
+ it 'sets the timeout to the default' do
257
+ expect(connection.timeout).to eq(5)
258
+ end
259
+ end
260
+
261
+ context 'when timeout options are provided' do
262
+
263
+ let(:connection) do
264
+ described_class.new(server, socket_timeout: 10)
265
+ end
266
+
267
+ it 'sets the timeout' do
268
+ expect(connection.timeout).to eq(10)
269
+ end
270
+ end
271
+
272
+ context 'when ssl options are provided' do
273
+
274
+ let(:ssl_options) do
275
+ { :ssl => true, :ssl_key => 'file', :ssl_key_pass_phrase => 'iamaphrase' }
276
+ end
277
+
278
+ let(:connection) do
279
+ described_class.new(server, ssl_options)
280
+ end
281
+
282
+ it 'sets the ssl options' do
283
+ expect(connection.send(:ssl_options)).to eq(ssl_options)
284
+ end
285
+ end
286
+
287
+ context 'when authentication options are provided' do
288
+
289
+ let(:connection) do
290
+ described_class.new(
291
+ server,
292
+ :user => TEST_USER.name,
293
+ :password => TEST_USER.password,
294
+ :database => TEST_DB,
295
+ :auth_mech => :mongodb_cr
296
+ )
297
+ end
298
+
299
+ let(:user) do
300
+ Mongo::Auth::User.new(
301
+ database: TEST_DB,
302
+ user: TEST_USER.name,
303
+ password: TEST_USER.password
304
+ )
305
+ end
306
+
307
+ it 'sets the authentication strategy for the connection' do
308
+ expect(connection.authenticator.user).to eq(user)
309
+ end
310
+ end
311
+ end
312
+ end
@@ -0,0 +1,138 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Server::Description::Features do
4
+
5
+ describe '#initialize' do
6
+
7
+ context 'when the server wire version range is the same' do
8
+
9
+ let(:features) do
10
+ described_class.new(0..3)
11
+ end
12
+
13
+ it 'sets the server wire version range' do
14
+ expect(features.server_wire_versions).to eq(0..3)
15
+ end
16
+ end
17
+
18
+ context 'when the server wire version range is higher' do
19
+
20
+ it 'raises an exception' do
21
+ expect {
22
+ described_class.new(0..4)
23
+ }.to raise_error(Mongo::Error::UnsupportedFeatures)
24
+ end
25
+ end
26
+
27
+ context 'when the server wire version range is lower' do
28
+
29
+ let(:features) do
30
+ described_class.new(0..2)
31
+ end
32
+
33
+ it 'sets the server wire version range' do
34
+ expect(features.server_wire_versions).to eq(0..2)
35
+ end
36
+ end
37
+ end
38
+
39
+ describe '#list_collections_enabled?' do
40
+
41
+ context 'when the wire range includes 3' do
42
+
43
+ let(:features) do
44
+ described_class.new(0..3)
45
+ end
46
+
47
+ it 'returns true' do
48
+ expect(features).to be_list_collections_enabled
49
+ end
50
+ end
51
+
52
+ context 'when the wire range does not include 3' do
53
+
54
+ let(:features) do
55
+ described_class.new(0..2)
56
+ end
57
+
58
+ it 'returns false' do
59
+ expect(features).to_not be_list_collections_enabled
60
+ end
61
+ end
62
+ end
63
+
64
+ describe '#list_indexes_enabled?' do
65
+
66
+ context 'when the wire range includes 3' do
67
+
68
+ let(:features) do
69
+ described_class.new(0..3)
70
+ end
71
+
72
+ it 'returns true' do
73
+ expect(features).to be_list_indexes_enabled
74
+ end
75
+ end
76
+
77
+ context 'when the wire range does not include 3' do
78
+
79
+ let(:features) do
80
+ described_class.new(0..2)
81
+ end
82
+
83
+ it 'returns false' do
84
+ expect(features).to_not be_list_indexes_enabled
85
+ end
86
+ end
87
+ end
88
+
89
+ describe '#write_command_enabled?' do
90
+
91
+ context 'when the wire range includes 2' do
92
+
93
+ let(:features) do
94
+ described_class.new(0..3)
95
+ end
96
+
97
+ it 'returns true' do
98
+ expect(features).to be_write_command_enabled
99
+ end
100
+ end
101
+
102
+ context 'when the wire range does not include 2' do
103
+
104
+ let(:features) do
105
+ described_class.new(0..1)
106
+ end
107
+
108
+ it 'returns false' do
109
+ expect(features).to_not be_write_command_enabled
110
+ end
111
+ end
112
+ end
113
+
114
+ describe '#scram_sha_1_enabled?' do
115
+
116
+ context 'when the wire range includes 3' do
117
+
118
+ let(:features) do
119
+ described_class.new(0..3)
120
+ end
121
+
122
+ it 'returns true' do
123
+ expect(features).to be_scram_sha_1_enabled
124
+ end
125
+ end
126
+
127
+ context 'when the wire range does not include 3' do
128
+
129
+ let(:features) do
130
+ described_class.new(0..2)
131
+ end
132
+
133
+ it 'returns false' do
134
+ expect(features).to_not be_scram_sha_1_enabled
135
+ end
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,94 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Server::Description::Inspector::PrimaryElected do
4
+
5
+ let(:listeners) do
6
+ Mongo::Event::Listeners.new
7
+ end
8
+
9
+ let(:inspection) do
10
+ described_class.new(listeners)
11
+ end
12
+
13
+ let(:address) do
14
+ Mongo::Address.new('127.0.0.1:27017')
15
+ end
16
+
17
+ describe '#run' do
18
+
19
+ let(:config) do
20
+ {
21
+ 'ismaster' => false,
22
+ 'secondary' => true,
23
+ 'hosts' => [ '127.0.0.1:27018', '127.0.0.1:27019' ],
24
+ 'setName' => 'test'
25
+ }
26
+ end
27
+
28
+ let(:description) do
29
+ Mongo::Server::Description.new(address, config, listeners)
30
+ end
31
+
32
+ let(:updated) do
33
+ Mongo::Server::Description.new(address, new_config, listeners)
34
+ end
35
+
36
+ let(:listener) do
37
+ double('listener')
38
+ end
39
+
40
+ before do
41
+ listeners.add_listener(Mongo::Event::PRIMARY_ELECTED, listener)
42
+ end
43
+
44
+ context 'when the server becomes primary' do
45
+
46
+ let(:new_config) do
47
+ {
48
+ 'ismaster' => true,
49
+ 'secondary' => false,
50
+ 'hosts' => [ '127.0.0.1:27018', '127.0.0.1:27019' ],
51
+ 'setName' => 'test'
52
+ }
53
+ end
54
+
55
+ it 'fires a primary elected event' do
56
+ expect(listener).to receive(:handle).with(updated)
57
+ inspection.run(description, updated)
58
+ end
59
+ end
60
+
61
+ context 'when the server stays the same' do
62
+
63
+ let(:new_config) do
64
+ {
65
+ 'ismaster' => false,
66
+ 'secondary' => true,
67
+ 'hosts' => [ '127.0.0.1:27018', '127.0.0.1:27019' ],
68
+ 'setName' => 'test'
69
+ }
70
+ end
71
+
72
+ it 'fires no event' do
73
+ expect(listener).to_not receive(:handle)
74
+ inspection.run(description, updated)
75
+ end
76
+ end
77
+
78
+ context 'when the server becomes mongos' do
79
+
80
+ let(:new_config) do
81
+ {
82
+ 'ismaster' => true,
83
+ 'secondary' => false,
84
+ 'msg' => 'isdbgrid'
85
+ }
86
+ end
87
+
88
+ it 'fires a primary elected event' do
89
+ expect(listener).to receive(:handle).with(updated)
90
+ inspection.run(description, updated)
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,92 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Server::Description::Inspector::ServerAdded do
4
+
5
+ let(:listeners) do
6
+ Mongo::Event::Listeners.new
7
+ end
8
+
9
+ let(:inspection) do
10
+ described_class.new(listeners)
11
+ end
12
+
13
+ let(:address) do
14
+ Mongo::Address.new('127.0.0.1:27017')
15
+ end
16
+
17
+ describe '#run' do
18
+
19
+ let(:config) do
20
+ {
21
+ 'ismaster' => true,
22
+ 'secondary' => false,
23
+ 'hosts' => [ '127.0.0.1:27018', '127.0.0.1:27019' ],
24
+ 'setName' => 'test'
25
+ }
26
+ end
27
+
28
+ let(:description) do
29
+ Mongo::Server::Description.new(address, config, listeners)
30
+ end
31
+
32
+ let(:updated) do
33
+ Mongo::Server::Description.new(address, new_config, listeners)
34
+ end
35
+
36
+ let(:listener) do
37
+ double('listener')
38
+ end
39
+
40
+ before do
41
+ listeners.add_listener(Mongo::Event::SERVER_ADDED, listener)
42
+ end
43
+
44
+ context 'when a host is added' do
45
+
46
+ let(:new_config) do
47
+ { 'hosts' => [ '127.0.0.1:27019', '127.0.0.1:27020' ] }
48
+ end
49
+
50
+ it 'fires a server added event' do
51
+ expect(listener).to receive(:handle).with('127.0.0.1:27020')
52
+ inspection.run(description, updated)
53
+ end
54
+ end
55
+
56
+ context 'when an arbiter is added' do
57
+
58
+ let(:new_config) do
59
+ { 'arbiters' => [ '127.0.0.1:27020' ] }
60
+ end
61
+
62
+ it 'fires a server added event' do
63
+ expect(listener).to receive(:handle).with('127.0.0.1:27020')
64
+ inspection.run(description, updated)
65
+ end
66
+ end
67
+
68
+ context 'when a passive is added' do
69
+
70
+ let(:new_config) do
71
+ { 'passives' => [ '127.0.0.1:27020' ] }
72
+ end
73
+
74
+ it 'fires a server added event' do
75
+ expect(listener).to receive(:handle).with('127.0.0.1:27020')
76
+ inspection.run(description, updated)
77
+ end
78
+ end
79
+
80
+ context 'when no server is added' do
81
+
82
+ let(:new_config) do
83
+ { 'hosts' => [ '127.0.0.1:27018', '127.0.0.1:27019' ] }
84
+ end
85
+
86
+ it 'fires no event' do
87
+ expect(listener).to_not receive(:handle)
88
+ inspection.run(description, updated)
89
+ end
90
+ end
91
+ end
92
+ end