mongo 1.12.5 → 2.0.0.beta

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 (437) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CONTRIBUTING.md +64 -0
  5. data/LICENSE +1 -1
  6. data/README.md +23 -125
  7. data/Rakefile +26 -21
  8. data/bin/mongo_console +6 -38
  9. data/lib/mongo.rb +23 -82
  10. data/lib/mongo/address.rb +111 -0
  11. data/lib/mongo/address/ipv4.rb +85 -0
  12. data/lib/mongo/address/ipv6.rb +85 -0
  13. data/lib/mongo/address/unix.rb +76 -0
  14. data/lib/mongo/auth.rb +108 -0
  15. data/lib/mongo/auth/cr.rb +44 -0
  16. data/lib/mongo/auth/cr/conversation.rb +119 -0
  17. data/lib/mongo/auth/executable.rb +52 -0
  18. data/lib/mongo/auth/ldap.rb +48 -0
  19. data/lib/mongo/auth/ldap/conversation.rb +92 -0
  20. data/lib/mongo/auth/roles.rb +104 -0
  21. data/lib/mongo/auth/scram.rb +53 -0
  22. data/lib/mongo/auth/scram/conversation.rb +450 -0
  23. data/lib/mongo/auth/user.rb +159 -0
  24. data/lib/mongo/auth/user/view.rb +102 -0
  25. data/lib/mongo/auth/x509.rb +48 -0
  26. data/lib/mongo/auth/x509/conversation.rb +92 -0
  27. data/lib/mongo/{gridfs.rb → bulk.rb} +2 -5
  28. data/lib/mongo/bulk/bulk_write.rb +307 -0
  29. data/lib/mongo/client.rb +233 -0
  30. data/lib/mongo/cluster.rb +203 -0
  31. data/lib/mongo/cluster/topology.rb +60 -0
  32. data/lib/mongo/cluster/topology/replica_set.rb +160 -0
  33. data/lib/mongo/cluster/topology/sharded.rb +132 -0
  34. data/lib/mongo/cluster/topology/standalone.rb +132 -0
  35. data/lib/mongo/cluster/topology/unknown.rb +155 -0
  36. data/lib/mongo/collection.rb +130 -1101
  37. data/lib/mongo/collection/view.rb +169 -0
  38. data/lib/mongo/collection/view/aggregation.rb +108 -0
  39. data/lib/mongo/collection/view/explainable.rb +49 -0
  40. data/lib/mongo/collection/view/immutable.rb +43 -0
  41. data/lib/mongo/collection/view/iterable.rb +48 -0
  42. data/lib/mongo/collection/view/map_reduce.rb +191 -0
  43. data/lib/mongo/collection/view/readable.rb +363 -0
  44. data/lib/mongo/collection/view/writable.rb +169 -0
  45. data/lib/mongo/cursor.rb +79 -680
  46. data/lib/mongo/database.rb +224 -0
  47. data/lib/mongo/database/view.rb +101 -0
  48. data/lib/mongo/error.rb +81 -0
  49. data/lib/mongo/error/bulk_write_failure.rb +41 -0
  50. data/lib/mongo/{utils/thread_local_variable_manager.rb → error/empty_batch.rb} +22 -8
  51. data/{test/functional/db_connection_test.rb → lib/mongo/error/invalid_bulk_operation.rb} +19 -8
  52. data/lib/mongo/error/invalid_collection_name.rb +39 -0
  53. data/lib/mongo/error/invalid_database_name.rb +39 -0
  54. data/{test/replica_set/ssl_test.rb → lib/mongo/error/invalid_document.rb} +21 -14
  55. data/lib/mongo/error/invalid_file.rb +38 -0
  56. data/lib/mongo/error/invalid_nonce.rb +46 -0
  57. data/lib/mongo/error/invalid_replacement_document.rb +39 -0
  58. data/lib/mongo/error/invalid_signature.rb +47 -0
  59. data/{test/functional/ssl_test.rb → lib/mongo/error/invalid_update_document.rb} +22 -12
  60. data/lib/mongo/error/max_bson_size.rb +40 -0
  61. data/lib/mongo/error/max_message_size.rb +42 -0
  62. data/lib/mongo/{utils.rb → error/need_primary_server.rb} +10 -6
  63. data/lib/mongo/{connection.rb → error/operation_failure.rb} +10 -6
  64. data/lib/mongo/error/parser.rb +77 -0
  65. data/lib/mongo/{connection/socket.rb → error/socket_error.rb} +10 -5
  66. data/lib/mongo/error/socket_timeout_error.rb +23 -0
  67. data/lib/mongo/error/unsupported_features.rb +43 -0
  68. data/lib/mongo/event.rb +40 -0
  69. data/lib/mongo/event/listeners.rb +63 -0
  70. data/lib/mongo/event/primary_elected.rb +53 -0
  71. data/lib/mongo/event/publisher.rb +42 -0
  72. data/lib/mongo/event/server_added.rb +53 -0
  73. data/lib/mongo/event/server_removed.rb +53 -0
  74. data/lib/mongo/event/subscriber.rb +41 -0
  75. data/lib/mongo/grid.rb +16 -0
  76. data/lib/mongo/grid/file.rb +94 -0
  77. data/lib/mongo/grid/file/chunk.rb +184 -0
  78. data/lib/mongo/grid/file/metadata.rb +223 -0
  79. data/lib/mongo/grid/fs.rb +149 -0
  80. data/lib/mongo/index.rb +64 -0
  81. data/lib/mongo/index/view.rb +205 -0
  82. data/lib/mongo/loggable.rb +126 -0
  83. data/lib/mongo/logger.rb +132 -0
  84. data/lib/mongo/operation.rb +26 -0
  85. data/lib/mongo/operation/aggregate.rb +100 -0
  86. data/lib/mongo/operation/aggregate/result.rb +84 -0
  87. data/lib/mongo/operation/batchable.rb +103 -0
  88. data/lib/mongo/operation/bulk_delete/result.rb +197 -0
  89. data/lib/mongo/operation/bulk_insert/result.rb +195 -0
  90. data/lib/mongo/operation/bulk_update/result.rb +295 -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 +116 -0
  96. data/lib/mongo/operation/list_indexes/result.rb +118 -0
  97. data/lib/mongo/operation/map_reduce.rb +96 -0
  98. data/lib/mongo/operation/map_reduce/result.rb +122 -0
  99. data/lib/mongo/{functional.rb → operation/read.rb} +7 -7
  100. data/lib/mongo/operation/read/collections_info.rb +67 -0
  101. data/lib/mongo/operation/read/get_more.rb +71 -0
  102. data/lib/mongo/operation/read/indexes.rb +68 -0
  103. data/lib/mongo/operation/read/list_collections.rb +75 -0
  104. data/lib/mongo/operation/read/list_indexes.rb +77 -0
  105. data/lib/mongo/operation/read/query.rb +71 -0
  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 +380 -0
  109. data/lib/mongo/operation/write.rb +25 -0
  110. data/lib/mongo/operation/write/bulk_delete.rb +158 -0
  111. data/lib/mongo/operation/write/bulk_insert.rb +160 -0
  112. data/lib/mongo/operation/write/bulk_update.rb +167 -0
  113. data/lib/mongo/{connection/socket/socket_util.rb → operation/write/command.rb} +9 -24
  114. data/lib/mongo/operation/write/command/create_user.rb +43 -0
  115. data/lib/mongo/operation/write/command/delete.rb +56 -0
  116. data/lib/mongo/operation/write/command/drop_index.rb +51 -0
  117. data/lib/mongo/operation/write/command/ensure_index.rb +55 -0
  118. data/lib/mongo/operation/write/command/insert.rb +55 -0
  119. data/lib/mongo/operation/write/command/remove_user.rb +42 -0
  120. data/lib/mongo/operation/write/command/update.rb +60 -0
  121. data/lib/mongo/operation/write/command/writable.rb +61 -0
  122. data/lib/mongo/operation/write/create_index.rb +84 -0
  123. data/lib/mongo/operation/write/create_user.rb +75 -0
  124. data/lib/mongo/operation/write/delete.rb +91 -0
  125. data/lib/mongo/operation/write/drop_index.rb +62 -0
  126. data/lib/mongo/operation/write/insert.rb +88 -0
  127. data/lib/mongo/operation/write/remove_user.rb +70 -0
  128. data/lib/mongo/operation/write/update.rb +98 -0
  129. data/lib/mongo/protocol.rb +15 -0
  130. data/lib/mongo/protocol/bit_vector.rb +61 -0
  131. data/lib/mongo/protocol/delete.rb +94 -0
  132. data/lib/mongo/protocol/get_more.rb +99 -0
  133. data/lib/mongo/protocol/insert.rb +99 -0
  134. data/lib/mongo/protocol/kill_cursors.rb +74 -0
  135. data/lib/mongo/protocol/message.rb +252 -0
  136. data/lib/mongo/protocol/query.rb +147 -0
  137. data/lib/mongo/protocol/reply.rb +72 -0
  138. data/lib/mongo/protocol/serializers.rb +180 -0
  139. data/lib/mongo/protocol/update.rb +111 -0
  140. data/lib/mongo/server.rb +163 -0
  141. data/lib/mongo/server/connectable.rb +99 -0
  142. data/lib/mongo/server/connection.rb +133 -0
  143. data/lib/mongo/server/connection_pool.rb +141 -0
  144. data/lib/mongo/server/connection_pool/queue.rb +182 -0
  145. data/lib/mongo/server/context.rb +66 -0
  146. data/lib/mongo/server/description.rb +450 -0
  147. data/lib/mongo/server/description/features.rb +85 -0
  148. data/lib/mongo/server/description/inspector.rb +79 -0
  149. data/lib/mongo/server/description/inspector/primary_elected.rb +58 -0
  150. data/lib/mongo/server/description/inspector/server_added.rb +59 -0
  151. data/lib/mongo/server/description/inspector/server_removed.rb +59 -0
  152. data/lib/mongo/server/monitor.rb +160 -0
  153. data/lib/mongo/server/monitor/connection.rb +88 -0
  154. data/lib/mongo/server_selector.rb +81 -0
  155. data/lib/mongo/server_selector/nearest.rb +94 -0
  156. data/lib/mongo/server_selector/primary.rb +88 -0
  157. data/lib/mongo/server_selector/primary_preferred.rb +94 -0
  158. data/lib/mongo/server_selector/secondary.rb +91 -0
  159. data/lib/mongo/server_selector/secondary_preferred.rb +96 -0
  160. data/lib/mongo/server_selector/selectable.rb +209 -0
  161. data/lib/mongo/socket.rb +179 -0
  162. data/lib/mongo/socket/ssl.rb +108 -0
  163. data/lib/mongo/socket/tcp.rb +69 -0
  164. data/lib/mongo/socket/unix.rb +66 -0
  165. data/lib/mongo/uri.rb +504 -0
  166. data/lib/mongo/version.rb +21 -0
  167. data/lib/mongo/write_concern.rb +99 -0
  168. data/lib/mongo/write_concern/acknowledged.rb +38 -0
  169. data/lib/mongo/write_concern/normalizable.rb +73 -0
  170. data/lib/mongo/write_concern/unacknowledged.rb +43 -0
  171. data/mongo.gemspec +17 -14
  172. data/spec/mongo/address/ipv4_spec.rb +74 -0
  173. data/spec/mongo/address/ipv6_spec.rb +74 -0
  174. data/spec/mongo/address/unix_spec.rb +30 -0
  175. data/spec/mongo/address_spec.rb +206 -0
  176. data/spec/mongo/auth/cr_spec.rb +59 -0
  177. data/spec/mongo/auth/ldap_spec.rb +40 -0
  178. data/spec/mongo/auth/scram/conversation_spec.rb +197 -0
  179. data/spec/mongo/auth/scram_spec.rb +55 -0
  180. data/spec/mongo/auth/user/view_spec.rb +76 -0
  181. data/spec/mongo/auth/user_spec.rb +190 -0
  182. data/spec/mongo/auth/x509_spec.rb +40 -0
  183. data/spec/mongo/auth_spec.rb +65 -0
  184. data/spec/mongo/bulk/bulk_write_spec.rb +175 -0
  185. data/spec/mongo/client_spec.rb +564 -0
  186. data/spec/mongo/cluster/topology/replica_set_spec.rb +101 -0
  187. data/spec/mongo/cluster/topology/sharded_spec.rb +74 -0
  188. data/spec/mongo/cluster/topology/standalone_spec.rb +79 -0
  189. data/spec/mongo/cluster/topology_spec.rb +65 -0
  190. data/spec/mongo/cluster_spec.rb +129 -0
  191. data/spec/mongo/collection/view/aggregation_spec.rb +135 -0
  192. data/spec/mongo/collection/view/explainable_spec.rb +32 -0
  193. data/spec/mongo/collection/view/map_reduce_spec.rb +242 -0
  194. data/spec/mongo/collection/view/readable_spec.rb +603 -0
  195. data/spec/mongo/collection/view/writable_spec.rb +504 -0
  196. data/spec/mongo/collection/view_spec.rb +521 -0
  197. data/spec/mongo/collection_spec.rb +362 -0
  198. data/spec/mongo/cursor_spec.rb +295 -0
  199. data/spec/mongo/database_spec.rb +306 -0
  200. data/spec/mongo/error/parser_spec.rb +119 -0
  201. data/spec/mongo/event/publisher_spec.rb +50 -0
  202. data/spec/mongo/event/subscriber_spec.rb +34 -0
  203. data/spec/mongo/grid/file/chunk_spec.rb +226 -0
  204. data/spec/mongo/grid/file/metadata_spec.rb +69 -0
  205. data/spec/mongo/grid/file_spec.rb +138 -0
  206. data/spec/mongo/grid/fs_spec.rb +129 -0
  207. data/spec/mongo/index/view_spec.rb +226 -0
  208. data/spec/mongo/loggable_spec.rb +62 -0
  209. data/spec/mongo/logger_spec.rb +97 -0
  210. data/spec/mongo/operation/aggregate/result_spec.rb +80 -0
  211. data/spec/mongo/operation/aggregate_spec.rb +135 -0
  212. data/spec/mongo/operation/command_spec.rb +106 -0
  213. data/spec/mongo/operation/kill_cursors_spec.rb +66 -0
  214. data/spec/mongo/operation/limited_spec.rb +50 -0
  215. data/spec/mongo/operation/map_reduce_spec.rb +143 -0
  216. data/spec/mongo/operation/read/collections_info_spec.rb +40 -0
  217. data/spec/mongo/operation/read/get_more_spec.rb +81 -0
  218. data/spec/mongo/operation/read/indexes_spec.rb +31 -0
  219. data/spec/mongo/operation/read/query_spec.rb +84 -0
  220. data/spec/mongo/operation/result_spec.rb +275 -0
  221. data/spec/mongo/operation/specifiable_spec.rb +53 -0
  222. data/spec/mongo/operation/write/bulk_delete_spec.rb +473 -0
  223. data/spec/mongo/operation/write/bulk_insert_spec.rb +466 -0
  224. data/spec/mongo/operation/write/bulk_update_spec.rb +524 -0
  225. data/spec/mongo/operation/write/command/delete_spec.rb +116 -0
  226. data/spec/mongo/operation/write/command/insert_spec.rb +117 -0
  227. data/spec/mongo/operation/write/command/update_spec.rb +123 -0
  228. data/spec/mongo/operation/write/create_user_spec.rb +44 -0
  229. data/spec/mongo/operation/write/delete_spec.rb +178 -0
  230. data/spec/mongo/operation/write/drop_index_spec.rb +51 -0
  231. data/spec/mongo/operation/write/ensure_index_spec.rb +81 -0
  232. data/spec/mongo/operation/write/insert_spec.rb +231 -0
  233. data/spec/mongo/operation/write/remove_user_spec.rb +46 -0
  234. data/spec/mongo/operation/write/response_spec.rb +85 -0
  235. data/spec/mongo/operation/write/update_spec.rb +177 -0
  236. data/spec/mongo/protocol/delete_spec.rb +167 -0
  237. data/spec/mongo/protocol/get_more_spec.rb +146 -0
  238. data/spec/mongo/protocol/insert_spec.rb +161 -0
  239. data/spec/mongo/protocol/kill_cursors_spec.rb +101 -0
  240. data/spec/mongo/protocol/query_spec.rb +285 -0
  241. data/spec/mongo/protocol/reply_spec.rb +157 -0
  242. data/spec/mongo/protocol/update_spec.rb +186 -0
  243. data/spec/mongo/server/connection_pool/queue_spec.rb +170 -0
  244. data/spec/mongo/server/connection_pool_spec.rb +120 -0
  245. data/spec/mongo/server/connection_spec.rb +289 -0
  246. data/spec/mongo/server/description/features_spec.rb +138 -0
  247. data/spec/mongo/server/description/inspector/primary_elected_spec.rb +94 -0
  248. data/spec/mongo/server/description/inspector/server_added_spec.rb +92 -0
  249. data/spec/mongo/server/description/inspector/server_removed_spec.rb +95 -0
  250. data/spec/mongo/server/description_spec.rb +510 -0
  251. data/spec/mongo/server/monitor_spec.rb +130 -0
  252. data/spec/mongo/server_discovery_and_monitoring_spec.rb +103 -0
  253. data/spec/mongo/server_selection_rtt_spec.rb +104 -0
  254. data/spec/mongo/server_selection_spec.rb +89 -0
  255. data/spec/mongo/server_selector/nearest_spec.rb +250 -0
  256. data/spec/mongo/server_selector/primary_preferred_spec.rb +290 -0
  257. data/spec/mongo/server_selector/primary_spec.rb +114 -0
  258. data/spec/mongo/server_selector/secondary_preferred_spec.rb +252 -0
  259. data/spec/mongo/server_selector/secondary_spec.rb +196 -0
  260. data/spec/mongo/server_selector_spec.rb +101 -0
  261. data/spec/mongo/server_spec.rb +131 -0
  262. data/spec/mongo/uri_spec.rb +517 -0
  263. data/spec/mongo/write_concern/acknowledged_spec.rb +44 -0
  264. data/spec/mongo/write_concern/unacknowledged_spec.rb +15 -0
  265. data/spec/mongo_orchestration_spec.rb +70 -0
  266. data/spec/spec_helper.rb +148 -0
  267. data/spec/support/authorization.rb +245 -0
  268. data/spec/support/helpers.rb +140 -0
  269. data/spec/support/matchers.rb +37 -0
  270. data/spec/support/mongo_orchestration.rb +61 -0
  271. data/spec/support/mongo_orchestration/requestable.rb +109 -0
  272. data/spec/support/mongo_orchestration/standalone.rb +57 -0
  273. data/spec/support/sdam/rs/discover_arbiters.yml +41 -0
  274. data/spec/support/sdam/rs/discover_passives.yml +41 -0
  275. data/spec/support/sdam/rs/discover_primary.yml +40 -0
  276. data/spec/support/sdam/rs/discover_secondary.yml +41 -0
  277. data/spec/support/sdam/rs/discovery.yml +195 -0
  278. data/spec/support/sdam/rs/ghost_discovered.yml +39 -0
  279. data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +34 -0
  280. data/spec/support/sdam/rs/member_reconfig.yml +68 -0
  281. data/spec/support/sdam/rs/member_standalone.yml +60 -0
  282. data/spec/support/sdam/rs/new_primary.yml +74 -0
  283. data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +71 -0
  284. data/spec/support/sdam/rs/non_rs_member.yml +31 -0
  285. data/spec/support/sdam/rs/normalize_case.yml +49 -0
  286. data/spec/support/sdam/rs/primary_becomes_standalone.yml +52 -0
  287. data/spec/support/sdam/rs/primary_changes_set_name.yml +57 -0
  288. data/spec/support/sdam/rs/primary_disconnect.yml +56 -0
  289. data/spec/support/sdam/rs/primary_wrong_set_name.yml +27 -0
  290. data/spec/support/sdam/rs/response_from_removed.yml +63 -0
  291. data/spec/support/sdam/rs/rsother_discovered.yml +41 -0
  292. data/spec/support/sdam/rs/sec_not_auth.yml +49 -0
  293. data/spec/support/sdam/rs/secondary_wrong_set_name.yml +28 -0
  294. data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +69 -0
  295. data/spec/support/sdam/rs/unexpected_mongos.yml +26 -0
  296. data/spec/support/sdam/rs/wrong_set_name.yml +35 -0
  297. data/spec/support/sdam/sharded/multiple_mongoses.yml +46 -0
  298. data/spec/support/sdam/sharded/non_mongos_removed.yml +41 -0
  299. data/spec/support/sdam/sharded/normalize_uri_case.yml +32 -0
  300. data/spec/support/sdam/single/direct_connection_external_ip.yml +34 -0
  301. data/spec/support/sdam/single/direct_connection_mongos.yml +33 -0
  302. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +35 -0
  303. data/spec/support/sdam/single/direct_connection_rsprimary.yml +34 -0
  304. data/spec/support/sdam/single/direct_connection_rssecondary.yml +35 -0
  305. data/spec/support/sdam/single/direct_connection_slave.yml +32 -0
  306. data/spec/support/sdam/single/direct_connection_standalone.yml +32 -0
  307. data/spec/support/sdam/single/not_ok_response.yml +39 -0
  308. data/spec/support/sdam/single/standalone_removed.yml +32 -0
  309. data/spec/support/sdam/single/unavailable_seed.yml +28 -0
  310. data/spec/support/server_discovery_and_monitoring.rb +167 -0
  311. data/spec/support/server_selection.rb +140 -0
  312. data/spec/support/server_selection/rtt/first_value.yml +4 -0
  313. data/spec/support/server_selection/rtt/first_value_zero.yml +4 -0
  314. data/spec/support/server_selection/rtt/value_test_1.yml +4 -0
  315. data/spec/support/server_selection/rtt/value_test_2.yml +4 -0
  316. data/spec/support/server_selection/rtt/value_test_3.yml +4 -0
  317. data/spec/support/server_selection/rtt/value_test_4.yml +4 -0
  318. data/spec/support/server_selection/rtt/value_test_5.yml +4 -0
  319. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +32 -0
  320. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +27 -0
  321. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +23 -0
  322. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +32 -0
  323. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +27 -0
  324. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +32 -0
  325. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +32 -0
  326. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +27 -0
  327. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +27 -0
  328. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +41 -0
  329. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +34 -0
  330. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +33 -0
  331. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +39 -0
  332. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +36 -0
  333. data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +32 -0
  334. data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +23 -0
  335. data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +13 -0
  336. data/spec/support/server_selection_rtt.rb +41 -0
  337. data/spec/support/shared/bulk_write.rb +498 -0
  338. data/spec/support/shared/cursor.rb +38 -0
  339. data/spec/support/shared/operation.rb +77 -0
  340. data/spec/support/shared/protocol.rb +31 -0
  341. data/spec/support/shared/server_selector.rb +111 -0
  342. data/spec/support/shared/socket.rb +82 -0
  343. data/spec/support/travis.rb +14 -0
  344. metadata +523 -189
  345. metadata.gz.sig +0 -0
  346. data/VERSION +0 -1
  347. data/lib/mongo/bulk_write_collection_view.rb +0 -387
  348. data/lib/mongo/collection_writer.rb +0 -364
  349. data/lib/mongo/connection/node.rb +0 -249
  350. data/lib/mongo/connection/pool.rb +0 -340
  351. data/lib/mongo/connection/pool_manager.rb +0 -320
  352. data/lib/mongo/connection/sharding_pool_manager.rb +0 -67
  353. data/lib/mongo/connection/socket/ssl_socket.rb +0 -95
  354. data/lib/mongo/connection/socket/tcp_socket.rb +0 -87
  355. data/lib/mongo/connection/socket/unix_socket.rb +0 -39
  356. data/lib/mongo/db.rb +0 -808
  357. data/lib/mongo/exception.rb +0 -145
  358. data/lib/mongo/functional/authentication.rb +0 -455
  359. data/lib/mongo/functional/logging.rb +0 -85
  360. data/lib/mongo/functional/read_preference.rb +0 -183
  361. data/lib/mongo/functional/scram.rb +0 -556
  362. data/lib/mongo/functional/uri_parser.rb +0 -409
  363. data/lib/mongo/functional/write_concern.rb +0 -66
  364. data/lib/mongo/gridfs/grid.rb +0 -112
  365. data/lib/mongo/gridfs/grid_ext.rb +0 -53
  366. data/lib/mongo/gridfs/grid_file_system.rb +0 -163
  367. data/lib/mongo/gridfs/grid_io.rb +0 -484
  368. data/lib/mongo/legacy.rb +0 -140
  369. data/lib/mongo/mongo_client.rb +0 -697
  370. data/lib/mongo/mongo_replica_set_client.rb +0 -535
  371. data/lib/mongo/mongo_sharded_client.rb +0 -159
  372. data/lib/mongo/networking.rb +0 -372
  373. data/lib/mongo/utils/conversions.rb +0 -110
  374. data/lib/mongo/utils/core_ext.rb +0 -70
  375. data/lib/mongo/utils/server_version.rb +0 -69
  376. data/lib/mongo/utils/support.rb +0 -80
  377. data/test/functional/authentication_test.rb +0 -39
  378. data/test/functional/bulk_api_stress_test.rb +0 -133
  379. data/test/functional/bulk_write_collection_view_test.rb +0 -1198
  380. data/test/functional/client_test.rb +0 -627
  381. data/test/functional/collection_test.rb +0 -2175
  382. data/test/functional/collection_writer_test.rb +0 -83
  383. data/test/functional/conversions_test.rb +0 -163
  384. data/test/functional/cursor_fail_test.rb +0 -57
  385. data/test/functional/cursor_message_test.rb +0 -56
  386. data/test/functional/cursor_test.rb +0 -683
  387. data/test/functional/db_api_test.rb +0 -835
  388. data/test/functional/db_test.rb +0 -348
  389. data/test/functional/grid_file_system_test.rb +0 -285
  390. data/test/functional/grid_io_test.rb +0 -252
  391. data/test/functional/grid_test.rb +0 -273
  392. data/test/functional/pool_test.rb +0 -136
  393. data/test/functional/safe_test.rb +0 -98
  394. data/test/functional/support_test.rb +0 -62
  395. data/test/functional/timeout_test.rb +0 -60
  396. data/test/functional/uri_test.rb +0 -446
  397. data/test/functional/write_concern_test.rb +0 -118
  398. data/test/helpers/general.rb +0 -50
  399. data/test/helpers/test_unit.rb +0 -476
  400. data/test/replica_set/authentication_test.rb +0 -37
  401. data/test/replica_set/basic_test.rb +0 -189
  402. data/test/replica_set/client_test.rb +0 -393
  403. data/test/replica_set/connection_test.rb +0 -138
  404. data/test/replica_set/count_test.rb +0 -66
  405. data/test/replica_set/cursor_test.rb +0 -220
  406. data/test/replica_set/insert_test.rb +0 -157
  407. data/test/replica_set/max_values_test.rb +0 -151
  408. data/test/replica_set/pinning_test.rb +0 -105
  409. data/test/replica_set/query_test.rb +0 -73
  410. data/test/replica_set/read_preference_test.rb +0 -219
  411. data/test/replica_set/refresh_test.rb +0 -211
  412. data/test/replica_set/replication_ack_test.rb +0 -95
  413. data/test/sharded_cluster/basic_test.rb +0 -203
  414. data/test/shared/authentication/basic_auth_shared.rb +0 -260
  415. data/test/shared/authentication/bulk_api_auth_shared.rb +0 -249
  416. data/test/shared/authentication/gssapi_shared.rb +0 -176
  417. data/test/shared/authentication/sasl_plain_shared.rb +0 -96
  418. data/test/shared/authentication/scram_shared.rb +0 -92
  419. data/test/shared/ssl_shared.rb +0 -235
  420. data/test/test_helper.rb +0 -61
  421. data/test/threading/basic_test.rb +0 -120
  422. data/test/tools/mongo_config.rb +0 -708
  423. data/test/tools/mongo_config_test.rb +0 -160
  424. data/test/unit/client_test.rb +0 -381
  425. data/test/unit/collection_test.rb +0 -166
  426. data/test/unit/connection_test.rb +0 -335
  427. data/test/unit/cursor_test.rb +0 -307
  428. data/test/unit/db_test.rb +0 -136
  429. data/test/unit/grid_test.rb +0 -76
  430. data/test/unit/mongo_sharded_client_test.rb +0 -48
  431. data/test/unit/node_test.rb +0 -93
  432. data/test/unit/pool_manager_test.rb +0 -111
  433. data/test/unit/read_pref_test.rb +0 -406
  434. data/test/unit/read_test.rb +0 -159
  435. data/test/unit/safe_test.rb +0 -158
  436. data/test/unit/sharding_pool_manager_test.rb +0 -84
  437. data/test/unit/write_concern_test.rb +0 -175
@@ -0,0 +1,290 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::ServerSelector::PrimaryPreferred do
4
+
5
+ include_context 'server selector'
6
+
7
+ it_behaves_like 'a read preference mode' do
8
+ let(:name) { :primary_preferred }
9
+ let(:slave_ok) { true }
10
+ end
11
+
12
+ it_behaves_like 'a read preference mode accepting tag sets'
13
+
14
+ describe '#to_mongos' do
15
+
16
+ context 'tag sets not provided' do
17
+
18
+ it 'returns a read preference formatted for mongos' do
19
+ expect(read_pref.to_mongos).to eq({ :mode => 'primaryPreferred' })
20
+ end
21
+ end
22
+
23
+ context 'tag set provided' do
24
+ let(:tag_sets) { [tag_set] }
25
+
26
+ it 'returns a read preference formatted for mongos' do
27
+ expect(read_pref.to_mongos).to eq(
28
+ { :mode => 'primaryPreferred', :tags => tag_sets}
29
+ )
30
+ end
31
+ end
32
+ end
33
+
34
+ describe '#select' do
35
+
36
+ context 'no candidates' do
37
+ let(:candidates) { [] }
38
+
39
+ it 'returns an empty array' do
40
+ expect(read_pref.send(:select, candidates)).to be_empty
41
+ end
42
+ end
43
+
44
+ context 'single primary candidate' do
45
+ let(:candidates) { [primary] }
46
+
47
+ it 'returns an array with the primary' do
48
+ expect(read_pref.send(:select, candidates)).to eq( [primary] )
49
+ end
50
+ end
51
+
52
+ context 'single secondary candidate' do
53
+ let(:candidates) { [secondary] }
54
+
55
+ it 'returns an array with the secondary' do
56
+ expect(read_pref.send(:select, candidates)).to eq( [secondary] )
57
+ end
58
+ end
59
+
60
+ context 'primary and secondary candidates' do
61
+ let(:candidates) { [secondary, primary] }
62
+ let(:expected) { [primary] }
63
+
64
+ it 'returns an array with the primary' do
65
+ expect(read_pref.send(:select, candidates)).to eq(expected)
66
+ end
67
+ end
68
+
69
+ context 'secondary and primary candidates' do
70
+ let(:candidates) { [secondary, primary] }
71
+ let(:expected) { [primary] }
72
+
73
+ it 'returns an array with the primary' do
74
+ expect(read_pref.send(:select, candidates)).to eq(expected)
75
+ end
76
+ end
77
+
78
+ context 'tag sets provided' do
79
+ let(:tag_sets) { [tag_set] }
80
+
81
+ let(:matching_primary) do
82
+ server(:primary, :tags => server_tags )
83
+ end
84
+
85
+ let(:matching_secondary) do
86
+ server(:secondary, :tags => server_tags )
87
+ end
88
+
89
+ context 'single candidate' do
90
+
91
+ context 'primary' do
92
+ let(:candidates) { [primary] }
93
+
94
+ it 'returns array with primary' do
95
+ expect(read_pref.send(:select, candidates)).to eq([primary])
96
+ end
97
+ end
98
+
99
+ context 'matching_primary' do
100
+ let(:candidates) { [matching_primary] }
101
+
102
+ it 'returns array with matching primary' do
103
+ expect(read_pref.send(:select, candidates)).to eq([matching_primary])
104
+ end
105
+ end
106
+
107
+ context 'matching secondary' do
108
+ let(:candidates) { [matching_secondary] }
109
+
110
+ it 'returns array with matching secondary' do
111
+ expect(read_pref.send(:select, candidates)).to eq([matching_secondary])
112
+ end
113
+ end
114
+
115
+ context 'secondary' do
116
+ let(:candidates) { [secondary] }
117
+
118
+ it 'returns an empty array' do
119
+ expect(read_pref.send(:select, candidates)).to be_empty
120
+ end
121
+ end
122
+ end
123
+
124
+ context 'multiple candidates' do
125
+
126
+ context 'no matching secondaries' do
127
+ let(:candidates) { [primary, secondary, secondary] }
128
+
129
+ it 'returns an array with the primary' do
130
+ expect(read_pref.send(:select, candidates)).to eq([primary])
131
+ end
132
+ end
133
+
134
+ context 'one matching primary' do
135
+ let(:candidates) { [matching_primary, secondary, secondary] }
136
+
137
+ it 'returns an array of the primary' do
138
+ expect(read_pref.send(:select, candidates)).to eq([matching_primary])
139
+ end
140
+ end
141
+
142
+ context 'one matching secondary' do
143
+ let(:candidates) { [primary, matching_secondary, secondary] }
144
+ let(:expected) { [primary] }
145
+
146
+ it 'returns an array of the primary' do
147
+ expect(read_pref.send(:select, candidates)).to eq(expected)
148
+ end
149
+ end
150
+
151
+ context 'two matching secondaries' do
152
+ let(:candidates) { [primary, matching_secondary, matching_secondary] }
153
+ let(:expected) { [primary] }
154
+
155
+ it 'returns an array of the primary ' do
156
+ expect(read_pref.send(:select, candidates)).to eq(expected)
157
+ end
158
+ end
159
+
160
+ context 'one matching primary, one matching secondary' do
161
+ let(:candidates) { [primary, matching_secondary, secondary] }
162
+ let(:expected) { [primary] }
163
+
164
+ it 'returns an array of the primary' do
165
+ expect(read_pref.send(:select, candidates)).to eq(expected)
166
+ end
167
+ end
168
+ end
169
+ end
170
+
171
+ context 'high latency servers' do
172
+ let(:far_primary) { server(:primary, :average_round_trip_time => 100) }
173
+ let(:far_secondary) { server(:secondary, :average_round_trip_time => 113) }
174
+
175
+ context 'single candidate' do
176
+
177
+ context 'far primary' do
178
+ let(:candidates) { [far_primary] }
179
+
180
+ it 'returns array with far primary' do
181
+ expect(read_pref.send(:select, candidates)).to eq([far_primary])
182
+ end
183
+ end
184
+
185
+ context 'far secondary' do
186
+ let(:candidates) { [far_secondary] }
187
+
188
+ it 'returns array with far primary' do
189
+ expect(read_pref.send(:select, candidates)).to eq([far_secondary])
190
+ end
191
+
192
+ end
193
+ end
194
+
195
+ context 'multiple candidates' do
196
+
197
+ context 'primary available' do
198
+
199
+ context 'local primary, local secondary' do
200
+ let(:candidates) { [primary, secondary] }
201
+ let(:expected) { [primary] }
202
+
203
+ it 'returns an array of the primary' do
204
+ expect(read_pref.send(:select, candidates)).to eq(expected)
205
+ end
206
+ end
207
+
208
+ context 'local primary, far secondary' do
209
+ let(:candidates) { [primary, far_secondary] }
210
+ let(:expected) { [primary] }
211
+
212
+ it 'returns an array of the primary' do
213
+ expect(read_pref.send(:select, candidates)).to eq(expected)
214
+ end
215
+ end
216
+
217
+ context 'far primary, local secondary' do
218
+ let(:candidates) { [far_primary, secondary] }
219
+ let(:expected) { [far_primary] }
220
+
221
+ it 'returns an array of the far primary' do
222
+ expect(read_pref.send(:select, candidates)).to eq(expected)
223
+ end
224
+ end
225
+
226
+ context 'far primary, far secondary' do
227
+ let(:candidates) { [far_primary, far_secondary] }
228
+ let(:expected) { [far_primary] }
229
+
230
+ it 'returns an array of the far primary' do
231
+ expect(read_pref.send(:select, candidates)).to eq(expected)
232
+ end
233
+ end
234
+
235
+ context 'two local servers, one far server' do
236
+
237
+ context 'local primary, local secondary, far secondary' do
238
+ let(:candidates) { [primary, secondary, far_secondary] }
239
+ let(:expected) { [primary] }
240
+
241
+ it 'returns an array of the primary' do
242
+ expect(read_pref.send(:select, candidates)).to eq(expected)
243
+ end
244
+ end
245
+
246
+ context 'two local secondaries' do
247
+ let(:candidates) { [far_primary, secondary, secondary] }
248
+ let(:expected) { [far_primary] }
249
+
250
+ it 'returns an array with primary' do
251
+ expect(read_pref.send(:select, candidates)).to eq(expected)
252
+ end
253
+ end
254
+ end
255
+ end
256
+
257
+ context 'primary not available' do
258
+
259
+ context 'one secondary' do
260
+ let(:candidates) { [secondary] }
261
+ let(:expected) { [secondary] }
262
+
263
+ it 'returns an array with the secondary' do
264
+ expect(read_pref.send(:select, candidates)).to eq(expected)
265
+ end
266
+ end
267
+
268
+ context 'one local secondary, one far secondary' do
269
+ let(:candidates) { [secondary, far_secondary] }
270
+ let(:expected) { [secondary] }
271
+
272
+ it 'returns an array of the secondary' do
273
+ expect(read_pref.send(:select, candidates)).to eq(expected)
274
+ end
275
+ end
276
+
277
+ context 'two local secondaries, one far secondary' do
278
+ let(:candidates) { [secondary, secondary, far_secondary] }
279
+ let(:expected) { [secondary, secondary] }
280
+
281
+ it 'returns an array of the secondary' do
282
+ expect(read_pref.send(:select, candidates)).to eq(expected)
283
+ end
284
+ end
285
+ end
286
+ end
287
+ end
288
+ end
289
+ end
290
+
@@ -0,0 +1,114 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::ServerSelector::Primary do
4
+
5
+ include_context 'server selector'
6
+
7
+ it_behaves_like 'a read preference mode' do
8
+ let(:name) { :primary }
9
+ let(:slave_ok) { false }
10
+ end
11
+
12
+ describe '#tag_sets' do
13
+
14
+ context 'tags not provided' do
15
+
16
+ it 'returns an empty array' do
17
+ expect(read_pref.tag_sets).to be_empty
18
+ end
19
+ end
20
+
21
+ context 'tag sets provided' do
22
+ let(:tag_sets) { [tag_set] }
23
+
24
+ it 'raises an error' do
25
+ expect{read_pref.tag_sets}.to raise_error
26
+ end
27
+ end
28
+ end
29
+
30
+ describe '#to_mongos' do
31
+
32
+ it 'returns nil' do
33
+ expect(read_pref.to_mongos).to be_nil
34
+ end
35
+ end
36
+
37
+ describe '#select' do
38
+
39
+ context 'no candidates' do
40
+ let(:candidates) { [] }
41
+
42
+ it 'returns an empty array' do
43
+ expect(read_pref.send(:select, candidates)).to be_empty
44
+ end
45
+ end
46
+
47
+ context 'secondary candidates' do
48
+ let(:candidates) { [secondary] }
49
+
50
+ it 'returns an empty array' do
51
+ expect(read_pref.send(:select, candidates)).to be_empty
52
+ end
53
+ end
54
+
55
+ context 'primary candidate' do
56
+ let(:candidates) { [primary] }
57
+
58
+ it 'returns an array with the primary' do
59
+ expect(read_pref.send(:select, candidates)).to eq([primary])
60
+ end
61
+ end
62
+
63
+ context 'primary and secondary candidates' do
64
+ let(:candidates) { [secondary, primary] }
65
+
66
+ it 'returns an array with the primary' do
67
+ expect(read_pref.send(:select, candidates)).to eq([primary])
68
+ end
69
+ end
70
+
71
+ context 'high latency candidates' do
72
+ let(:far_primary) { server(:primary, :average_round_trip_time => 100) }
73
+ let(:far_secondary) { server(:secondary, :average_round_trip_time => 120) }
74
+
75
+ context 'single candidate' do
76
+
77
+ context 'far primary' do
78
+ let(:candidates) { [far_primary] }
79
+
80
+ it 'returns array with the primary' do
81
+ expect(read_pref.send(:select, candidates)).to eq([far_primary])
82
+ end
83
+ end
84
+
85
+ context 'far secondary' do
86
+ let(:candidates) { [far_secondary] }
87
+
88
+ it 'returns empty array' do
89
+ expect(read_pref.send(:select, candidates)).to be_empty
90
+ end
91
+ end
92
+ end
93
+
94
+ context 'multiple candidates' do
95
+
96
+ context 'far primary, far secondary' do
97
+ let(:candidates) { [far_primary, far_secondary] }
98
+
99
+ it 'returns an array with the primary' do
100
+ expect(read_pref.send(:select, candidates)).to eq([far_primary])
101
+ end
102
+ end
103
+
104
+ context 'far primary, local secondary' do
105
+ let(:candidates) { [far_primary, far_secondary] }
106
+
107
+ it 'returns an array with the primary' do
108
+ expect(read_pref.send(:select, candidates)).to eq([far_primary])
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,252 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::ServerSelector::SecondaryPreferred do
4
+
5
+ include_context 'server selector'
6
+
7
+ it_behaves_like 'a read preference mode' do
8
+ let(:name) { :secondary_preferred }
9
+ let(:slave_ok) { true }
10
+ end
11
+
12
+ it_behaves_like 'a read preference mode accepting tag sets'
13
+
14
+ describe '#to_mongos' do
15
+
16
+ context 'tag sets provided' do
17
+
18
+ let(:tag_sets) do
19
+ [ tag_set ]
20
+ end
21
+
22
+ it 'returns a read preference formatted for mongos' do
23
+ expect(read_pref.to_mongos).to eq(
24
+ { :mode => 'secondaryPreferred', :tags => tag_sets }
25
+ )
26
+ end
27
+ end
28
+
29
+ context 'tag sets not provided' do
30
+
31
+ it 'returns nil' do
32
+ expect(read_pref.to_mongos).to be_nil
33
+ end
34
+ end
35
+ end
36
+
37
+ describe '#select' do
38
+
39
+ context 'no candidates' do
40
+ let(:candidates) { [] }
41
+
42
+ it 'returns an empty array' do
43
+ expect(read_pref.send(:select, candidates)).to be_empty
44
+ end
45
+ end
46
+
47
+ context 'single primary candidates' do
48
+ let(:candidates) { [primary] }
49
+
50
+ it 'returns array with primary' do
51
+ expect(read_pref.send(:select, candidates)).to eq([primary])
52
+ end
53
+ end
54
+
55
+ context 'single secondary candidate' do
56
+ let(:candidates) { [secondary] }
57
+
58
+ it 'returns array with secondary' do
59
+ expect(read_pref.send(:select, candidates)).to eq([secondary])
60
+ end
61
+ end
62
+
63
+ context 'primary and secondary candidates' do
64
+ let(:candidates) { [primary, secondary] }
65
+ let(:expected) { [secondary, primary] }
66
+
67
+ it 'returns array with secondary first, then primary' do
68
+ expect(read_pref.send(:select, candidates)).to eq(expected)
69
+ end
70
+ end
71
+
72
+ context 'secondary and primary candidates' do
73
+ let(:candidates) { [secondary, primary] }
74
+ let(:expected) { [secondary, primary] }
75
+
76
+ it 'returns array with secondary and primary' do
77
+ expect(read_pref.send(:select, candidates)).to eq(expected)
78
+ end
79
+ end
80
+
81
+ context 'tag sets provided' do
82
+
83
+ let(:tag_sets) do
84
+ [ tag_set ]
85
+ end
86
+
87
+ let(:matching_primary) do
88
+ server(:primary, :tags => server_tags)
89
+ end
90
+
91
+ let(:matching_secondary) do
92
+ server(:secondary, :tags => server_tags)
93
+ end
94
+
95
+ context 'single candidate' do
96
+
97
+ context 'primary' do
98
+ let(:candidates) { [primary] }
99
+
100
+ it 'returns array with primary' do
101
+ expect(read_pref.send(:select, candidates)).to eq([primary])
102
+ end
103
+ end
104
+
105
+ context 'matching_primary' do
106
+ let(:candidates) { [matching_primary] }
107
+
108
+ it 'returns array with matching primary' do
109
+ expect(read_pref.send(:select, candidates)).to eq([matching_primary])
110
+ end
111
+ end
112
+
113
+ context 'matching secondary' do
114
+ let(:candidates) { [matching_secondary] }
115
+
116
+ it 'returns array with matching secondary' do
117
+ expect(read_pref.send(:select, candidates)).to eq([matching_secondary])
118
+ end
119
+ end
120
+
121
+ context 'secondary' do
122
+ let(:candidates) { [secondary] }
123
+
124
+ it 'returns an empty array' do
125
+ expect(read_pref.send(:select, candidates)).to be_empty
126
+ end
127
+ end
128
+ end
129
+
130
+ context 'multiple candidates' do
131
+
132
+ context 'no matching secondaries' do
133
+ let(:candidates) { [primary, secondary, secondary] }
134
+
135
+ it 'returns an array with the primary' do
136
+ expect(read_pref.send(:select, candidates)).to eq([primary])
137
+ end
138
+ end
139
+
140
+ context 'one matching secondary' do
141
+ let(:candidates) { [primary, matching_secondary] }
142
+
143
+ it 'returns an array of the matching secondary, then primary' do
144
+ expect(read_pref.send(:select, candidates)).to eq(
145
+ [matching_secondary, primary]
146
+ )
147
+ end
148
+ end
149
+
150
+ context 'two matching secondaries' do
151
+ let(:candidates) { [primary, matching_secondary, matching_secondary] }
152
+ let(:expected) { [matching_secondary, matching_secondary, primary] }
153
+
154
+ it 'returns an array of the matching secondaries, then primary' do
155
+ expect(read_pref.send(:select, candidates)).to eq(expected)
156
+ end
157
+ end
158
+
159
+ context 'one matching secondary and one matching primary' do
160
+ let(:candidates) { [matching_primary, matching_secondary] }
161
+ let(:expected) {[matching_secondary, matching_primary] }
162
+
163
+ it 'returns an array of the matching secondary, then the primary' do
164
+ expect(read_pref.send(:select, candidates)).to eq(expected)
165
+ end
166
+ end
167
+ end
168
+ end
169
+
170
+ context 'high latency servers' do
171
+ let(:far_primary) { server(:primary, :average_round_trip_time => 100) }
172
+ let(:far_secondary) { server(:secondary, :average_round_trip_time => 113) }
173
+
174
+ context 'single candidate' do
175
+
176
+ context 'far primary' do
177
+ let(:candidates) { [far_primary] }
178
+
179
+ it 'returns array with primary' do
180
+ expect(read_pref.send(:select, candidates)).to eq([far_primary])
181
+ end
182
+ end
183
+
184
+ context 'far secondary' do
185
+ let(:candidates) { [far_secondary] }
186
+
187
+ it 'returns an array with the secondary' do
188
+ expect(read_pref.send(:select, candidates)).to eq([far_secondary])
189
+ end
190
+ end
191
+ end
192
+
193
+ context 'multiple candidates' do
194
+
195
+ context 'local primary, local secondary' do
196
+ let(:candidates) { [primary, secondary] }
197
+
198
+ it 'returns an array with secondary, then primary' do
199
+ expect(read_pref.send(:select, candidates)).to eq([secondary, primary])
200
+ end
201
+ end
202
+
203
+ context 'local primary, far secondary' do
204
+ let(:candidates) { [primary, far_secondary] }
205
+
206
+ it 'returns an array with the secondary, then primary' do
207
+ expect(read_pref.send(:select, candidates)).to eq([far_secondary, primary])
208
+ end
209
+ end
210
+
211
+ context 'local secondary' do
212
+ let(:candidates) { [far_primary, secondary] }
213
+ let(:expected) { [secondary, far_primary] }
214
+
215
+ it 'returns an array with secondary, then primary' do
216
+ expect(read_pref.send(:select, candidates)).to eq(expected)
217
+ end
218
+ end
219
+
220
+ context 'far primary, far secondary' do
221
+ let(:candidates) { [far_primary, far_secondary] }
222
+ let(:expected) { [far_secondary, far_primary] }
223
+
224
+ it 'returns an array with secondary, then primary' do
225
+ expect(read_pref.send(:select, candidates)).to eq(expected)
226
+ end
227
+ end
228
+
229
+ context 'two near servers, one far secondary' do
230
+
231
+ context 'near primary, near secondary, far secondary' do
232
+ let(:candidates) { [primary, secondary, far_secondary] }
233
+ let(:expected) { [secondary, primary] }
234
+
235
+ it 'returns an array with near secondary, then primary' do
236
+ expect(read_pref.send(:select, candidates)).to eq(expected)
237
+ end
238
+ end
239
+
240
+ context 'two near secondaries, one far primary' do
241
+ let(:candidates) { [far_primary, secondary, secondary] }
242
+ let(:expected) { [secondary, secondary, far_primary] }
243
+
244
+ it 'returns an array with secondaries, then primary' do
245
+ expect(read_pref.send(:select, candidates)).to eq(expected)
246
+ end
247
+ end
248
+ end
249
+ end
250
+ end
251
+ end
252
+ end