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
@@ -1,48 +0,0 @@
1
- # Copyright (C) 2009-2013 MongoDB, Inc.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- require "test_helper"
16
-
17
- class MongoShardedClientUnitTest < Test::Unit::TestCase
18
- include Mongo
19
-
20
- def test_initialize_with_single_mongos_uri
21
- uri = "mongodb://localhost:27017"
22
- with_preserved_env_uri(uri) do
23
- client = MongoShardedClient.new(:connect => false)
24
- assert_equal [[ "localhost", 27017 ]], client.seeds
25
- end
26
- end
27
-
28
- def test_initialize_with_multiple_mongos_uris
29
- uri = "mongodb://localhost:27017,localhost:27018"
30
- with_preserved_env_uri(uri) do
31
- client = MongoShardedClient.new(:connect => false)
32
- assert_equal [[ "localhost", 27017 ], [ "localhost", 27018 ]], client.seeds
33
- end
34
- end
35
-
36
- def test_from_uri_with_string
37
- client = MongoShardedClient.from_uri("mongodb://localhost:27017,localhost:27018", :connect => false)
38
- assert_equal [[ "localhost", 27017 ], [ "localhost", 27018 ]], client.seeds
39
- end
40
-
41
- def test_from_uri_with_env_variable
42
- uri = "mongodb://localhost:27017,localhost:27018"
43
- with_preserved_env_uri(uri) do
44
- client = MongoShardedClient.from_uri(nil, :connect => false)
45
- assert_equal [[ "localhost", 27017 ], [ "localhost", 27018 ]], client.seeds
46
- end
47
- end
48
- end
@@ -1,93 +0,0 @@
1
- # Copyright (C) 2009-2013 MongoDB, Inc.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- require 'test_helper'
16
-
17
- class NodeUnitTest < Test::Unit::TestCase
18
-
19
- def setup
20
- @client = stub()
21
- manager = mock('pool_manager')
22
- manager.stubs(:update_max_sizes)
23
- @client.stubs(:local_manager).returns(manager)
24
- end
25
-
26
- should "refuse to connect to node without 'hosts' key" do
27
- tcp = mock()
28
- node = Node.new(@client, ['localhost', 27017])
29
- tcp.stubs(:new).returns(new_mock_socket)
30
- @client.stubs(:socket_class).returns(tcp)
31
-
32
- admin_db = new_mock_db
33
- admin_db.stubs(:command).returns({'ok' => 1, 'ismaster' => 1})
34
- @client.stubs(:[]).with('admin').returns(admin_db)
35
- @client.stubs(:op_timeout).returns(nil)
36
- @client.stubs(:connect_timeout).returns(nil)
37
- @client.expects(:log)
38
- @client.expects(:mongos?).returns(false)
39
- @client.stubs(:socket_opts)
40
-
41
- assert node.connect
42
- node.config
43
- end
44
-
45
- should "load a node from an array" do
46
- node = Node.new(@client, ['power.level.com', 9001])
47
- assert_equal 'power.level.com', node.host
48
- assert_equal 9001, node.port
49
- assert_equal 'power.level.com:9001', node.address
50
- end
51
-
52
- should "should default the port for an array" do
53
- node = Node.new(@client, ['power.level.com'])
54
- assert_equal 'power.level.com', node.host
55
- assert_equal MongoClient::DEFAULT_PORT, node.port
56
- assert_equal "power.level.com:#{MongoClient::DEFAULT_PORT}", node.address
57
- end
58
-
59
- should "load a node from a string" do
60
- node = Node.new(@client, 'localhost:1234')
61
- assert_equal 'localhost', node.host
62
- assert_equal 1234, node.port
63
- assert_equal 'localhost:1234', node.address
64
- end
65
-
66
- should "should default the port for a string" do
67
- node = Node.new(@client, '192.168.0.1')
68
- assert_equal '192.168.0.1', node.host
69
- assert_equal MongoClient::DEFAULT_PORT, node.port
70
- assert_equal "192.168.0.1:#{MongoClient::DEFAULT_PORT}", node.address
71
- end
72
-
73
- should "two nodes with the same address should be equal" do
74
- assert_equal Node.new(@client, '192.168.0.1'),
75
- Node.new(@client, ['192.168.0.1', MongoClient::DEFAULT_PORT])
76
- end
77
-
78
- should "two nodes with the same address should have the same hash" do
79
- assert_equal Node.new(@client, '192.168.0.1').hash,
80
- Node.new(@client, ['192.168.0.1', MongoClient::DEFAULT_PORT]).hash
81
- end
82
-
83
- should "two nodes with different addresses should not be equal" do
84
- assert_not_equal Node.new(@client, '192.168.0.2'),
85
- Node.new(@client, ['192.168.0.1', MongoClient::DEFAULT_PORT])
86
- end
87
-
88
- should "two nodes with the same address should have the same hash negate" do
89
- assert_not_equal Node.new(@client, '192.168.0.1').hash,
90
- Node.new(@client, '1239.33.4.2393:29949').hash
91
- end
92
-
93
- end
@@ -1,111 +0,0 @@
1
- # Copyright (C) 2009-2013 MongoDB, Inc.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- require 'test_helper'
16
- include Mongo
17
-
18
- class PoolManagerUnitTest < Test::Unit::TestCase
19
-
20
- context "Initialization: " do
21
-
22
- setup do
23
- TCPSocket.stubs(:new).returns(new_mock_socket)
24
- @db = new_mock_db
25
-
26
- @client = stub("MongoClient")
27
- @client.stubs(:connect_timeout).returns(5)
28
- @client.stubs(:op_timeout).returns(5)
29
- @client.stubs(:pool_size).returns(2)
30
- @client.stubs(:pool_timeout).returns(100)
31
- @client.stubs(:seeds).returns(['localhost:30000'])
32
- @client.stubs(:socket_class).returns(TCPSocket)
33
- @client.stubs(:mongos?).returns(false)
34
- @client.stubs(:[]).returns(@db)
35
- @client.stubs(:socket_opts)
36
-
37
- @client.stubs(:replica_set_name).returns(nil)
38
- @client.stubs(:log)
39
- @arbiters = ['localhost:27020']
40
- @hosts = [
41
- 'localhost:27017',
42
- 'localhost:27018',
43
- 'localhost:27019',
44
- 'localhost:27020'
45
- ]
46
-
47
- @ismaster = {
48
- 'hosts' => @hosts,
49
- 'arbiters' => @arbiters,
50
- 'maxBsonObjectSize' => 1024,
51
- 'maxMessageSizeBytes' => 1024 * 2.5,
52
- 'maxWireVersion' => 1,
53
- 'minWireVersion' => 0
54
- }
55
- end
56
-
57
- should "populate pools correctly" do
58
-
59
- @db.stubs(:command).returns(
60
- # First call to get a socket.
61
- @ismaster.merge({'ismaster' => true}),
62
-
63
- # Subsequent calls to configure pools.
64
- @ismaster.merge({'ismaster' => true}),
65
- @ismaster.merge({'secondary' => true, 'maxBsonObjectSize' => 500}),
66
- @ismaster.merge({'secondary' => true, 'maxMessageSizeBytes' => 700}),
67
- @ismaster.merge({'arbiterOnly' => true})
68
- )
69
-
70
- seeds = [['localhost', 27017]]
71
- manager = Mongo::PoolManager.new(@client, seeds)
72
- @client.stubs(:local_manager).returns(manager)
73
- manager.connect
74
-
75
- assert_equal ['localhost', 27017], manager.primary
76
- assert_equal 27017, manager.primary_pool.port
77
- assert_equal 2, manager.secondaries.length
78
- assert_equal [27018, 27019], manager.secondary_pools.map(&:port).sort
79
- assert_equal [['localhost', 27020]], manager.arbiters
80
- assert_equal 500, manager.max_bson_size
81
- assert_equal 700, manager.max_message_size
82
- end
83
-
84
- should "populate pools with single unqueryable seed" do
85
-
86
- @db.stubs(:command).returns(
87
- # First call to recovering node
88
- @ismaster.merge({'ismaster' => false, 'secondary' => false}),
89
-
90
- # Subsequent calls to configure pools.
91
- @ismaster.merge({'ismaster' => false, 'secondary' => false}),
92
- @ismaster.merge({'ismaster' => true}),
93
- @ismaster.merge({'secondary' => true}),
94
- @ismaster.merge({'arbiterOnly' => true})
95
- )
96
-
97
- seeds = [['localhost', 27017]]
98
- manager = PoolManager.new(@client, seeds)
99
- @client.stubs(:local_manager).returns(manager)
100
- manager.connect
101
-
102
- assert_equal ['localhost', 27018], manager.primary
103
- assert_equal 27018, manager.primary_pool.port
104
- assert_equal 1, manager.secondaries.length
105
- assert_equal 27019, manager.secondary_pools[0].port
106
- assert_equal [['localhost', 27020]], manager.arbiters
107
- end
108
-
109
- end
110
-
111
- end
@@ -1,406 +0,0 @@
1
- # Copyright (C) 2009-2013 MongoDB, Inc.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- require 'test_helper'
16
-
17
- class ReadPreferenceUnitTest < Test::Unit::TestCase
18
-
19
- include ReadPreference
20
-
21
- def setup
22
- mock_pool = mock()
23
- mock_pool.stubs(:ping_time).returns(Pool::MAX_PING_TIME)
24
-
25
- stubs(:primary_pool).returns(mock_pool)
26
- stubs(:secondary_pools).returns([mock_pool])
27
- stubs(:pools).returns([mock_pool])
28
- end
29
-
30
- def test_select_pool
31
- ReadPreference::READ_PREFERENCES.map do |rp|
32
- assert select_pool({:mode => rp, :tags => [], :latency => 15})
33
- end
34
- end
35
-
36
- def test_sok_mapreduce_out_string_returns_false
37
- command = BSON::OrderedHash['mapreduce', 'test-collection',
38
- 'out', 'new-test-collection']
39
- assert_equal false, ReadPreference::secondary_ok?(command)
40
- end
41
-
42
- def test_sok_mapreduce_replace_collection_returns_false
43
- command = BSON::OrderedHash['mapreduce', 'test-collection',
44
- 'out', BSON::OrderedHash['replace', 'new-test-collection']]
45
- assert_equal false, ReadPreference::secondary_ok?(command)
46
- end
47
-
48
- def test_sok_mapreduce_inline_collection_returns_false
49
- command = BSON::OrderedHash['mapreduce', 'test-collection',
50
- 'out', 'inline']
51
- assert_equal false, ReadPreference::secondary_ok?(command)
52
- end
53
-
54
- def test_sok_inline_symbol_mapreduce_returns_true
55
- command = BSON::OrderedHash['mapreduce', 'test-collection',
56
- 'out', BSON::OrderedHash[:inline, 'true']]
57
- assert_equal true, ReadPreference::secondary_ok?(command)
58
- end
59
-
60
- def test_sok_inline_string_mapreduce_returns_true
61
- command = BSON::OrderedHash['mapreduce', 'test-collection',
62
- 'out', BSON::OrderedHash['inline', 'true']]
63
- assert_equal true, ReadPreference::secondary_ok?(command)
64
- end
65
-
66
- def test_sok_count_true
67
- command = BSON::OrderedHash['count', 'test-collection',
68
- 'query', BSON::OrderedHash['a', 'b']]
69
- assert_equal true, ReadPreference::secondary_ok?(command)
70
- end
71
-
72
- def test_sok_server_status_returns_false
73
- command = BSON::OrderedHash['serverStatus', 1]
74
- assert_equal false, ReadPreference::secondary_ok?(command)
75
- end
76
-
77
- def test_sok_text_returns_true
78
- command = BSON::OrderedHash['text', BSON::OrderedHash['search', 'coffee']]
79
- assert_equal true, ReadPreference::secondary_ok?(command)
80
- end
81
-
82
- def test_cmd_reroute_with_secondary
83
- ReadPreference::expects(:warn).with(regexp_matches(/rerouted to primary/))
84
- command = BSON::OrderedHash['mapreduce', 'test-collection',
85
- 'out', 'new-test-collection']
86
- assert_equal :primary, ReadPreference::cmd_read_pref(:secondary, command)
87
- end
88
-
89
- def test_find_and_modify_reroute_with_secondary
90
- ReadPreference::expects(:warn).with(regexp_matches(/rerouted to primary/))
91
- command = BSON::OrderedHash['findAndModify', 'test-collection',
92
- 'query', {}]
93
- assert_equal :primary, ReadPreference::cmd_read_pref(:secondary, command)
94
- end
95
-
96
- def test_cmd_no_reroute_with_secondary
97
- command = BSON::OrderedHash['mapreduce', 'test-collection',
98
- 'out', BSON::OrderedHash['inline', 'true']]
99
- assert_equal :secondary, ReadPreference::cmd_read_pref(:secondary, command)
100
- end
101
-
102
- def test_cmd_no_reroute_with_primary
103
- command = BSON::OrderedHash['mapreduce', 'test-collection',
104
- 'out', 'new-test-collection']
105
- assert_equal :primary, ReadPreference::cmd_read_pref(:primary, command)
106
- end
107
-
108
- def test_cmd_no_reroute_with_primary_secondary_ok
109
- command = BSON::OrderedHash['mapreduce', 'test-collection',
110
- 'out', BSON::OrderedHash['inline', 'true']]
111
- assert_equal :primary, ReadPreference::cmd_read_pref(:primary, command)
112
- end
113
-
114
- def test_parallel_scan_secondary_ok
115
- command = BSON::OrderedHash['parallelCollectionScan', 'test-collection',
116
- 'numCursors', 3]
117
- assert_equal true, ReadPreference::secondary_ok?(command)
118
- end
119
-
120
- def test_primary_with_tags_raises_error
121
- # Confirm that an error is raised if you provide tags and read pref is primary
122
- client = MongoReplicaSetClient.new(["#{TEST_HOST}:#{TEST_PORT}"], :connect => false)
123
- client.stubs(:primary_pool).returns(mock_pool)
124
- read_pref_tags = {'dc' => 'nyc'}
125
- read_pref = client.read_preference.merge(:mode => :primary,
126
- :tags => [read_pref_tags],
127
- :latency => 6)
128
- assert_raise Mongo::MongoArgumentError do
129
- client.select_pool(read_pref)
130
- end
131
- end
132
-
133
- def test_secondary_pref
134
- # Confirm that a primary is not selected
135
- primary_pool = mock('pool')
136
-
137
- secondary_nyc = mock_pool({'dc' => 'nyc'}, 5)
138
- secondary_chi = mock_pool({'dc' => 'chicago'}, 5)
139
- secondary_pools = [secondary_nyc, secondary_chi]
140
-
141
- client = MongoReplicaSetClient.new(["#{TEST_HOST}:#{TEST_PORT}"], :connect => false)
142
- client.stubs(:primary_pool).returns(primary_pool)
143
- client.stubs(:secondary_pools).returns(secondary_pools)
144
-
145
- read_pref = client.read_preference.merge(:mode => :secondary)
146
- assert_not_equal Hash.new, client.select_pool(read_pref).tags
147
- end
148
-
149
- def test_secondary_tags_pref
150
- # Confirm that a secondary with matching tags is selected
151
- secondary_nyc = mock_pool({'dc' => 'nyc'}, 5)
152
- secondary_chi = mock_pool({'dc' => 'chicago'}, 5)
153
- secondary_pools = [secondary_nyc, secondary_chi]
154
-
155
- client = MongoReplicaSetClient.new(["#{TEST_HOST}:#{TEST_PORT}"], :connect => false)
156
- client.stubs(:primary_pool).returns(mock_pool)
157
- client.stubs(:secondary_pools).returns(secondary_pools)
158
-
159
- read_pref_tags = {'dc' => 'nyc'}
160
- read_pref = client.read_preference.merge(:mode => :secondary,
161
- :tags => [read_pref_tags])
162
- assert_equal read_pref_tags, client.select_pool(read_pref).tags
163
- end
164
-
165
- def test_secondary_tags_with_latency
166
- # Confirm that between more than 1 secondary matching tags, only the one within
167
- # max acceptable latency is selected
168
- secondary_nyc = mock_pool({'dc' => 'nyc'}, 5)
169
- secondary_nyc2 = mock_pool({'dc' => 'nyc'}, 25)
170
- secondary_pools = [secondary_nyc, secondary_nyc2]
171
-
172
- client = MongoReplicaSetClient.new(["#{TEST_HOST}:#{TEST_PORT}"], :connect => false)
173
- client.stubs(:secondary_pools).returns(secondary_pools)
174
-
175
- read_pref_tags = {'dc' => 'nyc'}
176
- read_pref = client.read_preference.merge(:mode => :secondary,
177
- :tags => [read_pref_tags])
178
- assert_equal 5, client.select_pool(read_pref).ping_time
179
- end
180
-
181
- def test_secondary_latency_pref
182
- # Confirm that only the latency of pools matching tags is considered
183
- secondary_nyc = mock_pool({'dc' => 'nyc'}, 10)
184
- secondary_chi = mock_pool({'dc' => 'chicago'}, 5)
185
- secondary_pools = [secondary_nyc, secondary_chi]
186
-
187
- client = MongoReplicaSetClient.new(["#{TEST_HOST}:#{TEST_PORT}"], :connect => false)
188
- client.stubs(:primary_pool).returns(mock_pool)
189
- client.stubs(:secondary_pools).returns(secondary_pools)
190
-
191
- read_pref_tags = {'dc' => 'nyc'}
192
- read_pref = client.read_preference.merge(:mode => :secondary,
193
- :tags => [read_pref_tags],
194
- :latency => 3)
195
- assert_equal read_pref_tags, client.select_pool(read_pref).tags
196
- end
197
-
198
- def test_primary_preferred_primary_available
199
- # Confirm that the primary is always selected if it's available
200
- secondary_nyc = mock_pool({'dc' => 'nyc'}, 5)
201
- secondary_chi = mock_pool({'dc' => 'chicago'}, 10)
202
- secondary_pools = [secondary_nyc, secondary_chi]
203
- primary_pool = mock_pool
204
-
205
- client = MongoReplicaSetClient.new(["#{TEST_HOST}:#{TEST_PORT}"], :connect => false)
206
- client.stubs(:secondary_pools).returns(secondary_pools)
207
- client.stubs(:primary_pool).returns(primary_pool)
208
-
209
- read_pref_tags = {'dc' => 'chicago'}
210
- read_pref = client.read_preference.merge(:mode => :primary_preferred,
211
- :tags => [read_pref_tags],
212
- :latency => 6)
213
- assert_equal primary_pool, client.select_pool(read_pref)
214
- end
215
-
216
- def test_primary_preferred_primary_not_available
217
- # Confirm that a secondary with matching tags is selected if primary is
218
- # not available
219
- secondary_nyc = mock_pool({'dc' => 'nyc'}, 5)
220
- secondary_chi = mock_pool({'dc' => 'chicago'}, 10)
221
- secondary_pools = [secondary_nyc, secondary_chi]
222
-
223
- client = MongoReplicaSetClient.new(["#{TEST_HOST}:#{TEST_PORT}"], :connect => false)
224
- client.stubs(:secondary_pools).returns(secondary_pools)
225
-
226
- read_pref_tags = {'dc' => 'chicago'}
227
- read_pref = client.read_preference.merge(:mode => :primary_preferred,
228
- :tags => [read_pref_tags],
229
- :latency => 6)
230
- assert_equal read_pref_tags, client.select_pool(read_pref).tags
231
- end
232
-
233
- def test_primary_preferred_primary_not_available_and_no_matching_tags
234
- # Confirm that tags are taken into account if primary is not available and
235
- # secondaries are considered for selection.
236
- secondary_nyc = mock_pool({'dc' => 'nyc'}, 5)
237
- secondary_chi = mock_pool({'dc' => 'chicago'}, 10)
238
- secondary_pools = [secondary_nyc, secondary_chi]
239
-
240
- client = MongoReplicaSetClient.new(["#{TEST_HOST}:#{TEST_PORT}"], :connect => false)
241
- client.stubs(:secondary_pools).returns(secondary_pools)
242
-
243
- read_pref_tags = {'dc' => 'other_city'}
244
- read_pref = client.read_preference.merge(:mode => :primary_preferred,
245
- :tags => [read_pref_tags],
246
- :latency => 6)
247
- assert_equal nil, client.select_pool(read_pref)
248
- end
249
-
250
- def test_secondary_preferred_with_tags
251
- # Confirm that tags are taken into account
252
- secondary_nyc = mock_pool({'dc' => 'nyc'}, 5)
253
- secondary_chi = mock_pool({'dc' => 'chicago'}, 10)
254
- secondary_pools = [secondary_nyc, secondary_chi]
255
-
256
- client = MongoReplicaSetClient.new(["#{TEST_HOST}:#{TEST_PORT}"], :connect => false)
257
- client.stubs(:secondary_pools).returns(secondary_pools)
258
-
259
- read_pref_tags = {'dc' => 'chicago'}
260
- read_pref = client.read_preference.merge(:mode => :secondary_preferred,
261
- :tags => [read_pref_tags],
262
- :latency => 6)
263
- assert_equal read_pref_tags, client.select_pool(read_pref).tags
264
- end
265
-
266
- def test_secondary_preferred_with_no_matching_tags
267
- # Confirm that the primary is selected if no secondaries with matching tags
268
- # are found
269
- secondary_nyc = mock_pool({'dc' => 'nyc'}, 5)
270
- secondary_chi = mock_pool({'dc' => 'chicago'}, 10)
271
- secondary_pools = [secondary_nyc, secondary_chi]
272
-
273
- client = MongoReplicaSetClient.new(["#{TEST_HOST}:#{TEST_PORT}"], :connect => false)
274
- client.stubs(:secondary_pools).returns(secondary_pools)
275
- client.stubs(:primary_pool).returns(mock_pool)
276
-
277
- read_pref_tags = {'dc' => 'other_city'}
278
- read_pref = client.read_preference.merge(:mode => :secondary_preferred,
279
- :tags => [read_pref_tags],
280
- :latency => 6)
281
- assert_equal Hash.new, client.select_pool(read_pref).tags
282
- end
283
-
284
- def test_nearest_with_tags
285
- # Confirm that tags are taken into account when selecting nearest
286
- secondary_nyc = mock_pool({'dc' => 'nyc'}, 5)
287
- secondary_chi = mock_pool({'dc' => 'chicago'}, 10)
288
- primary_pool = mock_pool
289
- pools = [secondary_nyc, secondary_chi, primary_pool]
290
-
291
- client = MongoReplicaSetClient.new(["#{TEST_HOST}:#{TEST_PORT}"], :connect => false)
292
- client.stubs(:pools).returns(pools)
293
-
294
- read_pref_tags = {'dc' => 'nyc'}
295
- read_pref = client.read_preference.merge(:mode => :nearest,
296
- :tags => [read_pref_tags],
297
- :latency => 3)
298
- assert_equal read_pref_tags, client.select_pool(read_pref).tags
299
- end
300
-
301
- def test_nearest
302
- # Confirm that the nearest is selected when tags aren't specified
303
- secondary_nyc = mock_pool({'dc' => 'nyc'}, 5)
304
- secondary_chi = mock_pool({'dc' => 'chicago'}, 10)
305
- primary_pool = mock_pool({}, 1)
306
- pools = [secondary_nyc, secondary_chi, primary_pool]
307
-
308
- client = MongoReplicaSetClient.new(["#{TEST_HOST}:#{TEST_PORT}"], :connect => false)
309
- client.stubs(:pools).returns(pools)
310
-
311
- read_pref = client.read_preference.merge(:mode => :nearest,
312
- :latency => 3)
313
- assert_equal Hash.new, client.select_pool(read_pref).tags
314
- end
315
-
316
- def test_nearest_primary_matching
317
- # Confirm that a primary matching tags is included in nearest candidates
318
- secondary_nyc = mock_pool({'dc' => 'nyc'}, 5)
319
- secondary_chi = mock_pool({'dc' => 'chicago'}, 10)
320
- primary_pool = mock_pool({'dc' => 'boston'}, 1)
321
- secondary_pools = [secondary_nyc, secondary_chi]
322
-
323
- client = MongoReplicaSetClient.new(["#{TEST_HOST}:#{TEST_PORT}"], :connect => false)
324
- client.stubs(:secondary_pools).returns(secondary_pools)
325
- client.stubs(:primary_pool).returns(primary_pool)
326
- client.stubs(:pools).returns(secondary_pools << primary_pool)
327
-
328
- read_pref_tags = {'dc' => 'boston'}
329
- read_pref = client.read_preference.merge(:mode => :nearest,
330
- :tags => [read_pref_tags])
331
- assert_equal primary_pool, client.select_pool(read_pref)
332
- end
333
-
334
- def test_nearest_primary_not_matching
335
- # Confirm that a primary not matching tags is not included in nearest candidates
336
- secondary_nyc = mock_pool({'dc' => 'nyc'}, 25)
337
- secondary_chi = mock_pool({'dc' => 'chicago'}, 25)
338
- primary_pool = mock_pool({'dc' => 'boston'}, 1)
339
- secondary_pools = [secondary_nyc, secondary_chi]
340
-
341
- client = MongoReplicaSetClient.new(["#{TEST_HOST}:#{TEST_PORT}"], :connect => false)
342
- client.stubs(:secondary_pools).returns(secondary_pools)
343
- client.stubs(:primary_pool).returns(mock_pool)
344
- client.stubs(:pools).returns(secondary_pools << primary_pool)
345
-
346
- read_pref_tags = {'dc' => 'SF'}
347
- read_pref = client.read_preference.merge(:mode => :nearest,
348
- :tags => [read_pref_tags])
349
- assert_equal nil, client.select_pool(read_pref)
350
- end
351
-
352
- def test_nearest_primary_not_matching_excluded_from_latency_calculations
353
- # Confirm that a primary not matching tags is not included in the latency calculations
354
- secondary1 = mock_pool({'dc' => 'nyc'}, 10)
355
- secondary2 = mock_pool({'dc' => 'nyc'}, 10)
356
- primary_pool = mock_pool({'dc' => 'boston'}, 1)
357
- secondary_pools = [secondary1, secondary2]
358
-
359
- client = MongoReplicaSetClient.new(["#{TEST_HOST}:#{TEST_PORT}"], :connect => false)
360
- client.stubs(:secondary_pools).returns(secondary_pools)
361
- client.stubs(:primary_pool).returns(mock_pool)
362
- client.stubs(:pools).returns(secondary_pools << primary_pool)
363
-
364
- read_pref_tags = {'dc' => 'nyc'}
365
- read_pref = client.read_preference.merge(:mode => :nearest,
366
- :tags => [read_pref_tags],
367
- :latency => 5)
368
- assert_equal 'nyc', client.select_pool(read_pref).tags['dc']
369
- end
370
-
371
- def test_nearest_matching_tags_but_not_available
372
- # Confirm that even if a server matches a tag, it's not selected if it's down
373
- secondary_nyc = mock_pool({'dc' => 'nyc'}, 5)
374
- secondary_chi = mock_pool({'dc' => 'chicago'}, 10)
375
- primary_pool = mock_pool({'dc' => 'chicago'}, nil)
376
- secondary_pools = [secondary_nyc, secondary_chi]
377
-
378
- client = MongoReplicaSetClient.new(["#{TEST_HOST}:#{TEST_PORT}"], :connect => false)
379
- client.stubs(:secondary_pools).returns(secondary_pools)
380
- client.stubs(:primary_pool).returns(primary_pool)
381
- client.stubs(:pools).returns(secondary_pools << primary_pool)
382
-
383
- tags = [{'dc' => 'nyc'}, {'dc' => 'chicago'}, {}]
384
- read_pref = client.read_preference.merge(:mode => :nearest,
385
- :tags => tags)
386
- assert_equal secondary_nyc, client.select_pool(read_pref)
387
- end
388
-
389
- def test_nearest_multiple_tags
390
- # Confirm that with multiple tags in the read preference, servers are still selected
391
- secondary_nyc = mock_pool({}, 5)
392
- secondary_chi = mock_pool({'dc' => 'chicago'}, 10)
393
- primary_pool = mock_pool({}, 1)
394
- secondary_pools = [secondary_nyc, secondary_chi]
395
-
396
- client = MongoReplicaSetClient.new(["#{TEST_HOST}:#{TEST_PORT}"], :connect => false)
397
- client.stubs(:secondary_pools).returns(secondary_pools)
398
- client.stubs(:primary_pool).returns(mock_pool)
399
- client.stubs(:pools).returns(secondary_pools << primary_pool)
400
-
401
- tags = [{'dc' => 'nyc'}, {'dc' => 'chicago'}, {}]
402
- read_pref = client.read_preference.merge(:mode => :nearest,
403
- :tags => tags)
404
- assert_equal secondary_chi, client.select_pool(read_pref)
405
- end
406
- end