mongo 1.12.5 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (475) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CONTRIBUTING.md +64 -0
  4. data/LICENSE +1 -1
  5. data/README.md +21 -126
  6. data/Rakefile +39 -21
  7. data/bin/mongo_console +6 -38
  8. data/lib/mongo/address/ipv4.rb +85 -0
  9. data/lib/mongo/address/ipv6.rb +85 -0
  10. data/lib/mongo/address/unix.rb +76 -0
  11. data/lib/mongo/address.rb +111 -0
  12. data/lib/mongo/auth/cr/conversation.rb +119 -0
  13. data/lib/mongo/auth/cr.rb +44 -0
  14. data/lib/mongo/auth/executable.rb +52 -0
  15. data/lib/mongo/auth/ldap/conversation.rb +92 -0
  16. data/lib/mongo/auth/ldap.rb +48 -0
  17. data/lib/mongo/auth/roles.rb +104 -0
  18. data/lib/mongo/auth/scram/conversation.rb +450 -0
  19. data/lib/mongo/auth/scram.rb +53 -0
  20. data/lib/mongo/auth/user/view.rb +102 -0
  21. data/lib/mongo/auth/user.rb +159 -0
  22. data/lib/mongo/auth/x509/conversation.rb +92 -0
  23. data/lib/mongo/auth/x509.rb +48 -0
  24. data/lib/mongo/auth.rb +108 -0
  25. data/lib/mongo/bulk_write/bulk_writable.rb +191 -0
  26. data/lib/mongo/bulk_write/deletable.rb +60 -0
  27. data/lib/mongo/bulk_write/insertable.rb +52 -0
  28. data/lib/mongo/bulk_write/ordered_bulk_write.rb +48 -0
  29. data/lib/mongo/bulk_write/replacable.rb +57 -0
  30. data/lib/mongo/bulk_write/unordered_bulk_write.rb +46 -0
  31. data/lib/mongo/bulk_write/updatable.rb +68 -0
  32. data/lib/mongo/bulk_write.rb +52 -0
  33. data/lib/mongo/client.rb +246 -0
  34. data/lib/mongo/cluster/topology/replica_set.rb +160 -0
  35. data/lib/mongo/cluster/topology/sharded.rb +132 -0
  36. data/lib/mongo/cluster/topology/standalone.rb +132 -0
  37. data/lib/mongo/cluster/topology/unknown.rb +155 -0
  38. data/lib/mongo/cluster/topology.rb +60 -0
  39. data/lib/mongo/cluster.rb +203 -0
  40. data/lib/mongo/collection/view/aggregation.rb +108 -0
  41. data/lib/mongo/collection/view/explainable.rb +49 -0
  42. data/lib/mongo/collection/view/immutable.rb +43 -0
  43. data/lib/mongo/collection/view/iterable.rb +48 -0
  44. data/lib/mongo/collection/view/map_reduce.rb +191 -0
  45. data/lib/mongo/collection/view/readable.rb +363 -0
  46. data/lib/mongo/collection/view/writable.rb +185 -0
  47. data/lib/mongo/collection/view.rb +169 -0
  48. data/lib/mongo/collection.rb +130 -1101
  49. data/lib/mongo/cursor.rb +78 -681
  50. data/lib/mongo/database/view.rb +101 -0
  51. data/lib/mongo/database.rb +224 -0
  52. data/lib/mongo/error/bulk_write_error.rb +41 -0
  53. data/lib/mongo/error/invalid_bulk_operation.rb +36 -0
  54. data/lib/mongo/error/invalid_bulk_operation_type.rb +36 -0
  55. data/lib/mongo/error/invalid_collection_name.rb +39 -0
  56. data/lib/mongo/error/invalid_database_name.rb +39 -0
  57. data/{test/replica_set/ssl_test.rb → lib/mongo/error/invalid_document.rb} +21 -14
  58. data/lib/mongo/error/invalid_file.rb +38 -0
  59. data/lib/mongo/error/invalid_nonce.rb +46 -0
  60. data/lib/mongo/error/invalid_replacement_document.rb +39 -0
  61. data/lib/mongo/error/invalid_signature.rb +47 -0
  62. data/{test/functional/ssl_test.rb → lib/mongo/error/invalid_update_document.rb} +22 -12
  63. data/lib/mongo/error/max_bson_size.rb +40 -0
  64. data/lib/mongo/error/max_message_size.rb +42 -0
  65. data/{test/functional/db_connection_test.rb → lib/mongo/error/multi_index_drop.rb} +17 -8
  66. data/lib/mongo/{utils.rb → error/need_primary_server.rb} +10 -6
  67. data/lib/mongo/{connection.rb → error/operation_failure.rb} +10 -6
  68. data/lib/mongo/error/parser.rb +77 -0
  69. data/lib/mongo/{connection/socket.rb → error/socket_error.rb} +10 -5
  70. data/lib/mongo/error/socket_timeout_error.rb +23 -0
  71. data/lib/mongo/error/unsupported_features.rb +43 -0
  72. data/lib/mongo/error.rb +82 -0
  73. data/lib/mongo/event/listeners.rb +63 -0
  74. data/lib/mongo/event/primary_elected.rb +53 -0
  75. data/lib/mongo/event/publisher.rb +42 -0
  76. data/lib/mongo/event/server_added.rb +53 -0
  77. data/lib/mongo/event/server_removed.rb +53 -0
  78. data/lib/mongo/event/subscriber.rb +41 -0
  79. data/lib/mongo/event.rb +40 -0
  80. data/lib/mongo/grid/file/chunk.rb +184 -0
  81. data/lib/mongo/grid/file/metadata.rb +229 -0
  82. data/lib/mongo/grid/file.rb +106 -0
  83. data/lib/mongo/grid/fs.rb +149 -0
  84. data/lib/mongo/{gridfs.rb → grid.rb} +3 -5
  85. data/lib/mongo/index/view.rb +261 -0
  86. data/lib/mongo/index.rb +64 -0
  87. data/lib/mongo/loggable.rb +126 -0
  88. data/lib/mongo/logger.rb +132 -0
  89. data/lib/mongo/operation/aggregate/result.rb +88 -0
  90. data/lib/mongo/operation/aggregate.rb +100 -0
  91. data/lib/mongo/operation/command.rb +62 -0
  92. data/lib/mongo/operation/executable.rb +105 -0
  93. data/lib/mongo/operation/kill_cursors.rb +39 -0
  94. data/lib/mongo/operation/limited.rb +37 -0
  95. data/lib/mongo/operation/list_collections/result.rb +114 -0
  96. data/lib/mongo/operation/list_indexes/result.rb +118 -0
  97. data/lib/mongo/operation/map_reduce/result.rb +122 -0
  98. data/lib/mongo/operation/map_reduce.rb +96 -0
  99. data/lib/mongo/operation/read/collections_info.rb +67 -0
  100. data/lib/mongo/operation/read/get_more.rb +71 -0
  101. data/lib/mongo/operation/read/indexes.rb +68 -0
  102. data/lib/mongo/operation/read/list_collections.rb +75 -0
  103. data/lib/mongo/operation/read/list_indexes.rb +77 -0
  104. data/lib/mongo/operation/read/query.rb +71 -0
  105. data/lib/mongo/{functional.rb → operation/read.rb} +7 -7
  106. data/lib/mongo/operation/read_preferrable.rb +34 -0
  107. data/lib/mongo/operation/result.rb +259 -0
  108. data/lib/mongo/operation/specifiable.rb +397 -0
  109. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +75 -0
  110. data/lib/mongo/operation/write/bulk/bulk_delete.rb +144 -0
  111. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +68 -0
  112. data/lib/mongo/operation/write/bulk/bulk_insert.rb +129 -0
  113. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +67 -0
  114. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +162 -0
  115. data/lib/mongo/operation/write/bulk/bulk_update.rb +153 -0
  116. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +83 -0
  117. data/lib/mongo/operation/write/bulk.rb +17 -0
  118. data/lib/mongo/operation/write/command/create_index.rb +50 -0
  119. data/lib/mongo/operation/write/command/create_user.rb +43 -0
  120. data/lib/mongo/operation/write/command/delete.rb +56 -0
  121. data/lib/mongo/operation/write/command/drop_index.rb +51 -0
  122. data/lib/mongo/operation/write/command/insert.rb +55 -0
  123. data/lib/mongo/operation/write/command/remove_user.rb +42 -0
  124. data/lib/mongo/operation/write/command/update.rb +60 -0
  125. data/lib/mongo/operation/write/command/writable.rb +61 -0
  126. data/lib/mongo/operation/write/command.rb +22 -0
  127. data/lib/mongo/operation/write/create_index.rb +89 -0
  128. data/lib/mongo/operation/write/create_user.rb +75 -0
  129. data/lib/mongo/operation/write/delete/result.rb +40 -0
  130. data/lib/mongo/operation/write/delete.rb +93 -0
  131. data/lib/mongo/operation/write/drop_index.rb +62 -0
  132. data/lib/mongo/{utils/thread_local_variable_manager.rb → operation/write/insert/result.rb} +15 -8
  133. data/lib/mongo/operation/write/insert.rb +90 -0
  134. data/lib/mongo/operation/write/remove_user.rb +70 -0
  135. data/lib/mongo/operation/write/update/result.rb +160 -0
  136. data/lib/mongo/operation/write/update.rb +103 -0
  137. data/lib/mongo/{connection/socket/socket_util.rb → operation/write.rb} +10 -24
  138. data/lib/mongo/operation.rb +25 -0
  139. data/lib/mongo/options/mapper.rb +78 -0
  140. data/lib/mongo/options.rb +15 -0
  141. data/lib/mongo/protocol/bit_vector.rb +61 -0
  142. data/lib/mongo/protocol/delete.rb +94 -0
  143. data/lib/mongo/protocol/get_more.rb +99 -0
  144. data/lib/mongo/protocol/insert.rb +99 -0
  145. data/lib/mongo/protocol/kill_cursors.rb +74 -0
  146. data/lib/mongo/protocol/message.rb +252 -0
  147. data/lib/mongo/protocol/query.rb +147 -0
  148. data/lib/mongo/protocol/reply.rb +72 -0
  149. data/lib/mongo/protocol/serializers.rb +180 -0
  150. data/lib/mongo/protocol/update.rb +111 -0
  151. data/lib/mongo/protocol.rb +15 -0
  152. data/lib/mongo/server/connectable.rb +110 -0
  153. data/lib/mongo/server/connection.rb +134 -0
  154. data/lib/mongo/server/connection_pool/queue.rb +182 -0
  155. data/lib/mongo/server/connection_pool.rb +141 -0
  156. data/lib/mongo/server/context.rb +66 -0
  157. data/lib/mongo/server/description/features.rb +85 -0
  158. data/lib/mongo/server/description/inspector/primary_elected.rb +58 -0
  159. data/lib/mongo/server/description/inspector/server_added.rb +59 -0
  160. data/lib/mongo/server/description/inspector/server_removed.rb +59 -0
  161. data/lib/mongo/server/description/inspector.rb +79 -0
  162. data/lib/mongo/server/description.rb +450 -0
  163. data/lib/mongo/server/monitor/connection.rb +89 -0
  164. data/lib/mongo/server/monitor.rb +176 -0
  165. data/lib/mongo/server.rb +163 -0
  166. data/lib/mongo/server_selector/nearest.rb +94 -0
  167. data/lib/mongo/server_selector/primary.rb +88 -0
  168. data/lib/mongo/server_selector/primary_preferred.rb +94 -0
  169. data/lib/mongo/server_selector/secondary.rb +91 -0
  170. data/lib/mongo/server_selector/secondary_preferred.rb +96 -0
  171. data/lib/mongo/server_selector/selectable.rb +209 -0
  172. data/lib/mongo/server_selector.rb +81 -0
  173. data/lib/mongo/socket/ssl.rb +130 -0
  174. data/lib/mongo/socket/tcp.rb +69 -0
  175. data/lib/mongo/socket/unix.rb +64 -0
  176. data/lib/mongo/socket.rb +179 -0
  177. data/lib/mongo/uri.rb +504 -0
  178. data/lib/mongo/version.rb +21 -0
  179. data/lib/mongo/write_concern/acknowledged.rb +52 -0
  180. data/lib/mongo/write_concern/normalizable.rb +51 -0
  181. data/lib/mongo/write_concern/unacknowledged.rb +55 -0
  182. data/lib/mongo/write_concern.rb +99 -0
  183. data/lib/mongo.rb +24 -82
  184. data/mongo.gemspec +17 -14
  185. data/spec/certificates/ca.pem +17 -0
  186. data/spec/certificates/client.pem +101 -0
  187. data/spec/certificates/crl.pem +10 -0
  188. data/spec/certificates/crl_client_revoked.pem +12 -0
  189. data/spec/certificates/password_protected.pem +51 -0
  190. data/spec/certificates/server.pem +34 -0
  191. data/spec/mongo/address/ipv4_spec.rb +74 -0
  192. data/spec/mongo/address/ipv6_spec.rb +74 -0
  193. data/spec/mongo/address/unix_spec.rb +30 -0
  194. data/spec/mongo/address_spec.rb +206 -0
  195. data/spec/mongo/auth/cr_spec.rb +59 -0
  196. data/spec/mongo/auth/ldap_spec.rb +40 -0
  197. data/spec/mongo/auth/scram/conversation_spec.rb +197 -0
  198. data/spec/mongo/auth/scram_spec.rb +55 -0
  199. data/spec/mongo/auth/user/view_spec.rb +76 -0
  200. data/spec/mongo/auth/user_spec.rb +190 -0
  201. data/spec/mongo/auth/x509_spec.rb +40 -0
  202. data/spec/mongo/auth_spec.rb +65 -0
  203. data/spec/mongo/bulk/bulk_write_spec.rb +262 -0
  204. data/spec/mongo/client_spec.rb +564 -0
  205. data/spec/mongo/cluster/topology/replica_set_spec.rb +101 -0
  206. data/spec/mongo/cluster/topology/sharded_spec.rb +74 -0
  207. data/spec/mongo/cluster/topology/standalone_spec.rb +79 -0
  208. data/spec/mongo/cluster/topology_spec.rb +65 -0
  209. data/spec/mongo/cluster_spec.rb +129 -0
  210. data/spec/mongo/collection/view/aggregation_spec.rb +148 -0
  211. data/spec/mongo/collection/view/explainable_spec.rb +32 -0
  212. data/spec/mongo/collection/view/map_reduce_spec.rb +242 -0
  213. data/spec/mongo/collection/view/readable_spec.rb +603 -0
  214. data/spec/mongo/collection/view/writable_spec.rb +679 -0
  215. data/spec/mongo/collection/view_spec.rb +530 -0
  216. data/spec/mongo/collection_spec.rb +362 -0
  217. data/spec/mongo/crud_spec.rb +42 -0
  218. data/spec/mongo/cursor_spec.rb +295 -0
  219. data/spec/mongo/database_spec.rb +302 -0
  220. data/spec/mongo/error/parser_spec.rb +119 -0
  221. data/spec/mongo/event/publisher_spec.rb +50 -0
  222. data/spec/mongo/event/subscriber_spec.rb +34 -0
  223. data/spec/mongo/grid/file/chunk_spec.rb +226 -0
  224. data/spec/mongo/grid/file/metadata_spec.rb +92 -0
  225. data/spec/mongo/grid/file_spec.rb +172 -0
  226. data/spec/mongo/grid/fs_spec.rb +129 -0
  227. data/spec/mongo/index/view_spec.rb +330 -0
  228. data/spec/mongo/loggable_spec.rb +62 -0
  229. data/spec/mongo/logger_spec.rb +97 -0
  230. data/spec/mongo/operation/aggregate/result_spec.rb +80 -0
  231. data/spec/mongo/operation/aggregate_spec.rb +127 -0
  232. data/spec/mongo/operation/command_spec.rb +98 -0
  233. data/spec/mongo/operation/kill_cursors_spec.rb +66 -0
  234. data/spec/mongo/operation/limited_spec.rb +50 -0
  235. data/spec/mongo/operation/map_reduce_spec.rb +143 -0
  236. data/spec/mongo/operation/read/collections_info_spec.rb +40 -0
  237. data/spec/mongo/operation/read/get_more_spec.rb +81 -0
  238. data/spec/mongo/operation/read/indexes_spec.rb +31 -0
  239. data/spec/mongo/operation/read/query_spec.rb +84 -0
  240. data/spec/mongo/operation/result_spec.rb +275 -0
  241. data/spec/mongo/operation/specifiable_spec.rb +53 -0
  242. data/spec/mongo/operation/write/bulk_delete_spec.rb +235 -0
  243. data/spec/mongo/operation/write/bulk_insert_spec.rb +235 -0
  244. data/spec/mongo/operation/write/bulk_update_spec.rb +236 -0
  245. data/spec/mongo/operation/write/command/delete_spec.rb +103 -0
  246. data/spec/mongo/operation/write/command/insert_spec.rb +103 -0
  247. data/spec/mongo/operation/write/command/update_spec.rb +109 -0
  248. data/spec/mongo/operation/write/create_index_spec.rb +63 -0
  249. data/spec/mongo/operation/write/create_user_spec.rb +44 -0
  250. data/spec/mongo/operation/write/delete_spec.rb +186 -0
  251. data/spec/mongo/operation/write/drop_index_spec.rb +51 -0
  252. data/spec/mongo/operation/write/insert_spec.rb +244 -0
  253. data/spec/mongo/operation/write/remove_user_spec.rb +46 -0
  254. data/spec/mongo/operation/write/response_spec.rb +85 -0
  255. data/spec/mongo/operation/write/update_spec.rb +228 -0
  256. data/spec/mongo/protocol/delete_spec.rb +167 -0
  257. data/spec/mongo/protocol/get_more_spec.rb +146 -0
  258. data/spec/mongo/protocol/insert_spec.rb +161 -0
  259. data/spec/mongo/protocol/kill_cursors_spec.rb +101 -0
  260. data/spec/mongo/protocol/query_spec.rb +285 -0
  261. data/spec/mongo/protocol/reply_spec.rb +157 -0
  262. data/spec/mongo/protocol/update_spec.rb +186 -0
  263. data/spec/mongo/server/connection_pool/queue_spec.rb +170 -0
  264. data/spec/mongo/server/connection_pool_spec.rb +120 -0
  265. data/spec/mongo/server/connection_spec.rb +312 -0
  266. data/spec/mongo/server/description/features_spec.rb +138 -0
  267. data/spec/mongo/server/description/inspector/primary_elected_spec.rb +94 -0
  268. data/spec/mongo/server/description/inspector/server_added_spec.rb +92 -0
  269. data/spec/mongo/server/description/inspector/server_removed_spec.rb +95 -0
  270. data/spec/mongo/server/description_spec.rb +510 -0
  271. data/spec/mongo/server/monitor_spec.rb +144 -0
  272. data/spec/mongo/server_discovery_and_monitoring_spec.rb +103 -0
  273. data/spec/mongo/server_selection_rtt_spec.rb +104 -0
  274. data/spec/mongo/server_selection_spec.rb +89 -0
  275. data/spec/mongo/server_selector/nearest_spec.rb +250 -0
  276. data/spec/mongo/server_selector/primary_preferred_spec.rb +290 -0
  277. data/spec/mongo/server_selector/primary_spec.rb +114 -0
  278. data/spec/mongo/server_selector/secondary_preferred_spec.rb +252 -0
  279. data/spec/mongo/server_selector/secondary_spec.rb +196 -0
  280. data/spec/mongo/server_selector_spec.rb +101 -0
  281. data/spec/mongo/server_spec.rb +131 -0
  282. data/spec/mongo/uri_spec.rb +517 -0
  283. data/spec/mongo/write_concern/acknowledged_spec.rb +44 -0
  284. data/spec/mongo/write_concern/unacknowledged_spec.rb +15 -0
  285. data/spec/spec_helper.rb +133 -0
  286. data/spec/support/authorization.rb +247 -0
  287. data/spec/support/crud/read.rb +144 -0
  288. data/spec/support/crud/write.rb +214 -0
  289. data/spec/support/crud.rb +203 -0
  290. data/spec/support/crud_tests/read/aggregate.yml +43 -0
  291. data/spec/support/crud_tests/read/count.yml +37 -0
  292. data/spec/support/crud_tests/read/distinct.yml +33 -0
  293. data/spec/support/crud_tests/read/find.yml +50 -0
  294. data/spec/support/crud_tests/write/deleteMany.yml +36 -0
  295. data/spec/support/crud_tests/write/deleteOne.yml +49 -0
  296. data/spec/support/crud_tests/write/findOneAndDelete.yml +54 -0
  297. data/spec/support/crud_tests/write/findOneAndReplace.yml +153 -0
  298. data/spec/support/crud_tests/write/findOneAndUpdate.yml +161 -0
  299. data/spec/support/crud_tests/write/insertMany.yml +24 -0
  300. data/spec/support/crud_tests/write/insertOne.yml +19 -0
  301. data/spec/support/crud_tests/write/replaceOne.yml +96 -0
  302. data/spec/support/crud_tests/write/updateMany.yml +83 -0
  303. data/spec/support/crud_tests/write/updateOne.yml +80 -0
  304. data/spec/support/helpers.rb +140 -0
  305. data/spec/support/matchers.rb +37 -0
  306. data/spec/support/sdam/rs/discover_arbiters.yml +41 -0
  307. data/spec/support/sdam/rs/discover_passives.yml +41 -0
  308. data/spec/support/sdam/rs/discover_primary.yml +40 -0
  309. data/spec/support/sdam/rs/discover_secondary.yml +41 -0
  310. data/spec/support/sdam/rs/discovery.yml +195 -0
  311. data/spec/support/sdam/rs/ghost_discovered.yml +39 -0
  312. data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +34 -0
  313. data/spec/support/sdam/rs/member_reconfig.yml +68 -0
  314. data/spec/support/sdam/rs/member_standalone.yml +60 -0
  315. data/spec/support/sdam/rs/new_primary.yml +74 -0
  316. data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +71 -0
  317. data/spec/support/sdam/rs/non_rs_member.yml +31 -0
  318. data/spec/support/sdam/rs/normalize_case.yml +49 -0
  319. data/spec/support/sdam/rs/primary_becomes_standalone.yml +52 -0
  320. data/spec/support/sdam/rs/primary_changes_set_name.yml +57 -0
  321. data/spec/support/sdam/rs/primary_disconnect.yml +56 -0
  322. data/spec/support/sdam/rs/primary_wrong_set_name.yml +27 -0
  323. data/spec/support/sdam/rs/response_from_removed.yml +63 -0
  324. data/spec/support/sdam/rs/rsother_discovered.yml +41 -0
  325. data/spec/support/sdam/rs/sec_not_auth.yml +49 -0
  326. data/spec/support/sdam/rs/secondary_wrong_set_name.yml +28 -0
  327. data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +69 -0
  328. data/spec/support/sdam/rs/unexpected_mongos.yml +26 -0
  329. data/spec/support/sdam/rs/wrong_set_name.yml +35 -0
  330. data/spec/support/sdam/sharded/multiple_mongoses.yml +46 -0
  331. data/spec/support/sdam/sharded/non_mongos_removed.yml +41 -0
  332. data/spec/support/sdam/sharded/normalize_uri_case.yml +32 -0
  333. data/spec/support/sdam/single/direct_connection_external_ip.yml +34 -0
  334. data/spec/support/sdam/single/direct_connection_mongos.yml +33 -0
  335. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +35 -0
  336. data/spec/support/sdam/single/direct_connection_rsprimary.yml +34 -0
  337. data/spec/support/sdam/single/direct_connection_rssecondary.yml +35 -0
  338. data/spec/support/sdam/single/direct_connection_slave.yml +32 -0
  339. data/spec/support/sdam/single/direct_connection_standalone.yml +32 -0
  340. data/spec/support/sdam/single/not_ok_response.yml +39 -0
  341. data/spec/support/sdam/single/standalone_removed.yml +32 -0
  342. data/spec/support/sdam/single/unavailable_seed.yml +28 -0
  343. data/spec/support/server_discovery_and_monitoring.rb +167 -0
  344. data/spec/support/server_selection/rtt/first_value.yml +4 -0
  345. data/spec/support/server_selection/rtt/first_value_zero.yml +4 -0
  346. data/spec/support/server_selection/rtt/value_test_1.yml +4 -0
  347. data/spec/support/server_selection/rtt/value_test_2.yml +4 -0
  348. data/spec/support/server_selection/rtt/value_test_3.yml +4 -0
  349. data/spec/support/server_selection/rtt/value_test_4.yml +4 -0
  350. data/spec/support/server_selection/rtt/value_test_5.yml +4 -0
  351. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +26 -0
  352. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +21 -0
  353. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +21 -0
  354. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +26 -0
  355. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +21 -0
  356. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +26 -0
  357. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +26 -0
  358. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +21 -0
  359. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +21 -0
  360. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +33 -0
  361. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +26 -0
  362. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +29 -0
  363. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +29 -0
  364. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +29 -0
  365. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary.yml +31 -0
  366. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred.yml +31 -0
  367. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml +29 -0
  368. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary_non_matching.yml +26 -0
  369. data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +26 -0
  370. data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +19 -0
  371. data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +11 -0
  372. data/spec/support/server_selection.rb +157 -0
  373. data/spec/support/server_selection_rtt.rb +41 -0
  374. data/spec/support/shared/bulk_write.rb +535 -0
  375. data/spec/support/shared/cursor.rb +38 -0
  376. data/spec/support/shared/operation.rb +77 -0
  377. data/spec/support/shared/protocol.rb +31 -0
  378. data/spec/support/shared/server_selector.rb +111 -0
  379. data/spec/support/shared/socket.rb +82 -0
  380. data/spec/support/travis.rb +14 -0
  381. data.tar.gz.sig +2 -3
  382. metadata +583 -186
  383. metadata.gz.sig +0 -0
  384. data/VERSION +0 -1
  385. data/lib/mongo/bulk_write_collection_view.rb +0 -387
  386. data/lib/mongo/collection_writer.rb +0 -364
  387. data/lib/mongo/connection/node.rb +0 -249
  388. data/lib/mongo/connection/pool.rb +0 -340
  389. data/lib/mongo/connection/pool_manager.rb +0 -320
  390. data/lib/mongo/connection/sharding_pool_manager.rb +0 -67
  391. data/lib/mongo/connection/socket/ssl_socket.rb +0 -95
  392. data/lib/mongo/connection/socket/tcp_socket.rb +0 -87
  393. data/lib/mongo/connection/socket/unix_socket.rb +0 -39
  394. data/lib/mongo/db.rb +0 -808
  395. data/lib/mongo/exception.rb +0 -145
  396. data/lib/mongo/functional/authentication.rb +0 -455
  397. data/lib/mongo/functional/logging.rb +0 -85
  398. data/lib/mongo/functional/read_preference.rb +0 -183
  399. data/lib/mongo/functional/scram.rb +0 -556
  400. data/lib/mongo/functional/uri_parser.rb +0 -409
  401. data/lib/mongo/functional/write_concern.rb +0 -66
  402. data/lib/mongo/gridfs/grid.rb +0 -112
  403. data/lib/mongo/gridfs/grid_ext.rb +0 -53
  404. data/lib/mongo/gridfs/grid_file_system.rb +0 -163
  405. data/lib/mongo/gridfs/grid_io.rb +0 -484
  406. data/lib/mongo/legacy.rb +0 -140
  407. data/lib/mongo/mongo_client.rb +0 -697
  408. data/lib/mongo/mongo_replica_set_client.rb +0 -535
  409. data/lib/mongo/mongo_sharded_client.rb +0 -159
  410. data/lib/mongo/networking.rb +0 -372
  411. data/lib/mongo/utils/conversions.rb +0 -110
  412. data/lib/mongo/utils/core_ext.rb +0 -70
  413. data/lib/mongo/utils/server_version.rb +0 -69
  414. data/lib/mongo/utils/support.rb +0 -80
  415. data/test/functional/authentication_test.rb +0 -39
  416. data/test/functional/bulk_api_stress_test.rb +0 -133
  417. data/test/functional/bulk_write_collection_view_test.rb +0 -1198
  418. data/test/functional/client_test.rb +0 -627
  419. data/test/functional/collection_test.rb +0 -2175
  420. data/test/functional/collection_writer_test.rb +0 -83
  421. data/test/functional/conversions_test.rb +0 -163
  422. data/test/functional/cursor_fail_test.rb +0 -57
  423. data/test/functional/cursor_message_test.rb +0 -56
  424. data/test/functional/cursor_test.rb +0 -683
  425. data/test/functional/db_api_test.rb +0 -835
  426. data/test/functional/db_test.rb +0 -348
  427. data/test/functional/grid_file_system_test.rb +0 -285
  428. data/test/functional/grid_io_test.rb +0 -252
  429. data/test/functional/grid_test.rb +0 -273
  430. data/test/functional/pool_test.rb +0 -136
  431. data/test/functional/safe_test.rb +0 -98
  432. data/test/functional/support_test.rb +0 -62
  433. data/test/functional/timeout_test.rb +0 -60
  434. data/test/functional/uri_test.rb +0 -446
  435. data/test/functional/write_concern_test.rb +0 -118
  436. data/test/helpers/general.rb +0 -50
  437. data/test/helpers/test_unit.rb +0 -476
  438. data/test/replica_set/authentication_test.rb +0 -37
  439. data/test/replica_set/basic_test.rb +0 -189
  440. data/test/replica_set/client_test.rb +0 -393
  441. data/test/replica_set/connection_test.rb +0 -138
  442. data/test/replica_set/count_test.rb +0 -66
  443. data/test/replica_set/cursor_test.rb +0 -220
  444. data/test/replica_set/insert_test.rb +0 -157
  445. data/test/replica_set/max_values_test.rb +0 -151
  446. data/test/replica_set/pinning_test.rb +0 -105
  447. data/test/replica_set/query_test.rb +0 -73
  448. data/test/replica_set/read_preference_test.rb +0 -219
  449. data/test/replica_set/refresh_test.rb +0 -211
  450. data/test/replica_set/replication_ack_test.rb +0 -95
  451. data/test/sharded_cluster/basic_test.rb +0 -203
  452. data/test/shared/authentication/basic_auth_shared.rb +0 -260
  453. data/test/shared/authentication/bulk_api_auth_shared.rb +0 -249
  454. data/test/shared/authentication/gssapi_shared.rb +0 -176
  455. data/test/shared/authentication/sasl_plain_shared.rb +0 -96
  456. data/test/shared/authentication/scram_shared.rb +0 -92
  457. data/test/shared/ssl_shared.rb +0 -235
  458. data/test/test_helper.rb +0 -61
  459. data/test/threading/basic_test.rb +0 -120
  460. data/test/tools/mongo_config.rb +0 -708
  461. data/test/tools/mongo_config_test.rb +0 -160
  462. data/test/unit/client_test.rb +0 -381
  463. data/test/unit/collection_test.rb +0 -166
  464. data/test/unit/connection_test.rb +0 -335
  465. data/test/unit/cursor_test.rb +0 -307
  466. data/test/unit/db_test.rb +0 -136
  467. data/test/unit/grid_test.rb +0 -76
  468. data/test/unit/mongo_sharded_client_test.rb +0 -48
  469. data/test/unit/node_test.rb +0 -93
  470. data/test/unit/pool_manager_test.rb +0 -111
  471. data/test/unit/read_pref_test.rb +0 -406
  472. data/test/unit/read_test.rb +0 -159
  473. data/test/unit/safe_test.rb +0 -158
  474. data/test/unit/sharding_pool_manager_test.rb +0 -84
  475. data/test/unit/write_concern_test.rb +0 -175
@@ -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
@@ -1,159 +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 ReadUnitTest < Test::Unit::TestCase
18
-
19
- context "Read mode on standard connection: " do
20
- setup do
21
- @read = :secondary
22
- @client = MongoClient.new('localhost', 27017, :read => @read, :connect => false)
23
- end
24
-
25
- end
26
-
27
- context "Read preferences on replica set connection: " do
28
- setup do
29
- @read = :secondary_preferred
30
- @acceptable_latency = 100
31
- @tags = {"dc" => "Tyler", "rack" => "Brock"}
32
- @bad_tags = {"wow" => "cool"}
33
- @client = MongoReplicaSetClient.new(
34
- ['localhost:27017'],
35
- :read => @read,
36
- :tag_sets => @tags,
37
- :secondary_acceptable_latency_ms => @acceptable_latency,
38
- :connect => false
39
- )
40
- end
41
-
42
- should "store read preference on MongoClient" do
43
- assert_equal @read, @client.read
44
- assert_equal @tags, @client.tag_sets
45
- assert_equal @acceptable_latency, @client.acceptable_latency
46
- end
47
-
48
- should "propogate to DB" do
49
- db = @client[TEST_DB]
50
- assert_equal @read, db.read
51
- assert_equal @tags, db.tag_sets
52
- assert_equal @acceptable_latency, db.acceptable_latency
53
-
54
- db = @client.db(TEST_DB)
55
- assert_equal @read, db.read
56
- assert_equal @tags, db.tag_sets
57
- assert_equal @acceptable_latency, db.acceptable_latency
58
-
59
- db = DB.new(TEST_DB, @client)
60
- assert_equal @read, db.read
61
- assert_equal @tags, db.tag_sets
62
- assert_equal @acceptable_latency, db.acceptable_latency
63
- end
64
-
65
- should "allow db override" do
66
- db = DB.new(TEST_DB, @client, :read => :primary, :tag_sets => @bad_tags, :acceptable_latency => 25)
67
- assert_equal :primary, db.read
68
- assert_equal @bad_tags, db.tag_sets
69
- assert_equal 25, db.acceptable_latency
70
-
71
- db = @client.db(TEST_DB, :read => :primary, :tag_sets => @bad_tags, :acceptable_latency => 25)
72
- assert_equal :primary, db.read
73
- assert_equal @bad_tags, db.tag_sets
74
- assert_equal 25, db.acceptable_latency
75
- end
76
-
77
- context "on DB: " do
78
- setup do
79
- @db = @client[TEST_DB]
80
- end
81
-
82
- should "propogate to collection" do
83
- col = @db.collection('read-unit-test')
84
- assert_equal @read, col.read
85
- assert_equal @tags, col.tag_sets
86
- assert_equal @acceptable_latency, col.acceptable_latency
87
-
88
- col = @db['read-unit-test']
89
- assert_equal @read, col.read
90
- assert_equal @tags, col.tag_sets
91
- assert_equal @acceptable_latency, col.acceptable_latency
92
-
93
- col = Collection.new('read-unit-test', @db)
94
- assert_equal @read, col.read
95
- assert_equal @tags, col.tag_sets
96
- assert_equal @acceptable_latency, col.acceptable_latency
97
- end
98
-
99
- should "allow override on collection" do
100
- col = @db.collection('read-unit-test', :read => :primary, :tag_sets => @bad_tags, :acceptable_latency => 25)
101
- assert_equal :primary, col.read
102
- assert_equal @bad_tags, col.tag_sets
103
- assert_equal 25, col.acceptable_latency
104
-
105
- col = Collection.new('read-unit-test', @db, :read => :primary, :tag_sets => @bad_tags, :acceptable_latency => 25)
106
- assert_equal :primary, col.read
107
- assert_equal @bad_tags, col.tag_sets
108
- assert_equal 25, col.acceptable_latency
109
- end
110
- end
111
-
112
- context "on read mode ops" do
113
- setup do
114
- @col = @client[TEST_DB]['read-unit-test']
115
- @mock_socket = new_mock_socket
116
- end
117
-
118
- should "use default value on query" do
119
- @cursor = @col.find({:a => 1})
120
- sock = new_mock_socket
121
- read_pool = stub(:checkin => true)
122
- @client.stubs(:read_pool).returns(read_pool)
123
- local_manager = PoolManager.new(@client, @client.seeds)
124
- @client.stubs(:local_manager).returns(local_manager)
125
- primary_pool = stub(:checkin => true)
126
- sock.stubs(:pool).returns(primary_pool)
127
- @client.stubs(:primary_pool).returns(primary_pool)
128
- @client.expects(:checkout_reader).returns(sock)
129
- @client.expects(:receive_message).with do |o, m, l, s, c, r|
130
- r == nil
131
- end.returns([[], 0, 0])
132
-
133
- @cursor.next
134
- end
135
-
136
- should "allow override default value on query" do
137
- @cursor = @col.find({:a => 1}, :read => :primary)
138
- sock = new_mock_socket
139
- local_manager = PoolManager.new(@client, @client.seeds)
140
- @client.stubs(:local_manager).returns(local_manager)
141
- primary_pool = stub(:checkin => true)
142
- sock.stubs(:pool).returns(primary_pool)
143
- @client.stubs(:primary_pool).returns(primary_pool)
144
- @client.expects(:checkout_reader).returns(sock)
145
- @client.expects(:receive_message).with do |o, m, l, s, c, r|
146
- r == nil
147
- end.returns([[], 0, 0])
148
-
149
- @cursor.next
150
- end
151
-
152
- should "allow override alternate value on query" do
153
- assert_raise MongoArgumentError do
154
- @col.find_one({:a => 1}, :read => {:dc => "ny"})
155
- end
156
- end
157
- end
158
- end
159
- end