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,136 +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 PoolTest < Test::Unit::TestCase
18
- include Mongo
19
-
20
- def setup
21
- @client ||= standard_connection({:pool_size => 15, :pool_timeout => 5})
22
- @db = @client.db(TEST_DB)
23
- @collection = @db.collection("pool_test")
24
- end
25
-
26
- def test_pool_affinity
27
- pool = Pool.new(@client, TEST_HOST, TEST_PORT, :size => 5)
28
-
29
- threads = []
30
- 10.times do
31
- threads << Thread.new do
32
- original_socket = pool.checkout
33
- pool.checkin(original_socket)
34
- 500.times do
35
- socket = pool.checkout
36
- assert_equal original_socket, socket
37
- pool.checkin(socket)
38
- end
39
- end
40
- end
41
-
42
- threads.each { |t| t.join }
43
- end
44
-
45
- def test_pool_affinity_max_size
46
- client = standard_connection({:pool_size => 15, :pool_timeout => 5,
47
- :op_timeout => nil})
48
- coll = client[TEST_DB]['pool_test']
49
- docs = []
50
- 8000.times {|x| docs << {:value => x}}
51
- coll.insert(docs)
52
-
53
- threads = []
54
- threads << Thread.new do
55
- coll.find({"value" => {"$lt" => 100}}).each {|e| e}
56
- Thread.pass
57
- sleep(0.125)
58
- coll.find({"value" => {"$gt" => 100}}).each {|e| e}
59
- end
60
- threads << Thread.new do
61
- coll.find({'$where' => "function() {for(i=0;i<500;i++) {this.value};}"}).each {|e| e}
62
- end
63
- threads.each(&:join)
64
- end
65
-
66
- def test_auth_network_error
67
- # Make sure there's no semaphore leak if we get a network error
68
- # when authenticating a new socket with cached credentials.
69
-
70
- # Get a client with one socket so we detect if it's leaked.
71
- client = MongoClient.new(TEST_HOST, TEST_PORT, :pool_size => 1, :pool_timeout => 1)
72
- assert_equal 1, client.pool_size
73
-
74
- # Set up the client with a pool
75
- client[TEST_DB].command(:ping => 1)
76
-
77
- # Close the one socket in the pool
78
- pool = client.primary_pool
79
- socket = pool.instance_variable_get(:@sockets).first
80
- socket.close
81
-
82
- # Simulate an authenticate() call on a different socket.
83
- # Cache the creds on the client.
84
- creds = {
85
- :db_name => TEST_DB,
86
- :username => TEST_USER,
87
- :password => TEST_USER_PWD,
88
- :source => TEST_DB,
89
- :extra => {}
90
- }
91
- client.auths << creds
92
-
93
- # The client authenticates its socket with the
94
- # new credential, but gets a socket.error.
95
- client[TEST_DB]['ruby-test'].find_one
96
-
97
- # # No semaphore leak, the pool is allowed to make a new socket.
98
- assert_equal 1, pool.instance_variable_get(:@sockets).size
99
- end
100
-
101
- def test_socket_cleanup
102
- # Get a client with one socket so we detect if it's leaked.
103
- client = MongoClient.new(TEST_HOST, TEST_PORT, :pool_size => 1, :pool_timeout => 1)
104
- assert_equal 1, client.pool_size
105
-
106
- # Set up the client with a pool
107
- client[TEST_DB].command(:ping => 1)
108
-
109
- # Simulate an authenticate() call on a different socket.
110
- # Cache the creds on the client.
111
- creds = {
112
- :db_name => TEST_DB,
113
- :username => TEST_USER,
114
- :password => TEST_USER_PWD,
115
- :source => TEST_DB,
116
- :extra => {}
117
- }
118
- client.auths << creds
119
-
120
- # Mock the socket to raise a ConnectionFailure when applying auths
121
- pool = client.primary_pool
122
- socket = pool.instance_variable_get(:@sockets).first
123
- socket.expects(:send).raises(ConnectionFailure)
124
-
125
- # Checkout a socket from the pool to force it to get a new socket
126
- pool.checkout
127
- new_socket = pool.instance_variable_get(:@sockets).first
128
-
129
- # Make sure the pool is cleaned up properly
130
- assert_not_equal socket, new_socket
131
- assert_equal 1, pool.instance_variable_get(:@sockets).size
132
- assert_equal 1, pool.instance_variable_get(:@thread_ids_to_sockets).size
133
- assert !pool.instance_variable_get(:@checked_out).include?(socket)
134
- assert !pool.instance_variable_get(:@sockets).include?(socket)
135
- end
136
- end
@@ -1,98 +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 SafeTest < Test::Unit::TestCase
19
- context "Safe mode propogation: " do
20
- setup do
21
- @connection = standard_connection({:safe => true}, true) # Legacy
22
- @db = @connection[TEST_DB]
23
- @collection = @db['test-safe']
24
- @collection.create_index([[:a, 1]], :unique => true)
25
- @collection.remove
26
- end
27
-
28
- should "propogate safe option on insert" do
29
- @collection.insert({:a => 1})
30
-
31
- assert_raise_error(OperationFailure, "duplicate key") do
32
- @collection.insert({:a => 1})
33
- end
34
- end
35
-
36
- should "allow safe override on insert" do
37
- @collection.insert({:a => 1})
38
- @collection.insert({:a => 1}, :safe => false)
39
- end
40
-
41
- should "allow safe override on save" do
42
- @collection.insert({:a => 1})
43
- id = @collection.insert({:a => 2})
44
- assert_nothing_raised do
45
- @collection.save({:_id => id.to_s, :a => 1}, :safe => false)
46
- end
47
- end
48
-
49
- should "propogate safe option on save" do
50
- @collection.insert({:a => 1})
51
- id = @collection.insert({:a => 2})
52
- assert_raise(OperationFailure) do
53
- @collection.save({:_id => id.to_s, :a => 1})
54
- end
55
- end
56
-
57
- should "propogate safe option on update" do
58
- @collection.insert({:a => 1})
59
- @collection.insert({:a => 2})
60
-
61
- assert_raise_error(OperationFailure, "duplicate key") do
62
- @collection.update({:a => 2}, {:a => 1})
63
- end
64
- end
65
-
66
- should "allow safe override on update" do
67
- @collection.insert({:a => 1})
68
- @collection.insert({:a => 2})
69
- @collection.update({:a => 2}, {:a => 1}, :safe => false)
70
- end
71
- end
72
-
73
- context "Safe error objects" do
74
- setup do
75
- @connection = standard_connection({:safe => true}, true) # Legacy
76
- @db = @connection[TEST_DB]
77
- @collection = @db['test']
78
- @collection.remove
79
- @collection.insert({:a => 1})
80
- @collection.insert({:a => 1})
81
- @collection.insert({:a => 1})
82
- end
83
-
84
- should "return object on update" do
85
- response = @collection.update({:a => 1}, {"$set" => {:a => 2}},
86
- :multi => true)
87
-
88
- assert(response['updatedExisting'] || @db.connection.wire_version_feature?(Mongo::MongoClient::BATCH_COMMANDS)) # TODO - review new write command return values
89
- assert(response['n'] == 3 || @db.connection.wire_version_feature?(Mongo::MongoClient::BATCH_COMMANDS)) # TODO - update command top pending
90
- end
91
-
92
- should "return object on remove" do
93
- response = @collection.remove({})
94
- assert_equal 3, response['n']
95
- end
96
- end
97
-
98
- end
@@ -1,62 +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 SupportTest < Test::Unit::TestCase
18
-
19
- def test_command_response_succeeds
20
- assert Support.ok?('ok' => 1)
21
- assert Support.ok?('ok' => 1.0)
22
- assert Support.ok?('ok' => true)
23
- end
24
-
25
- def test_command_response_fails
26
- assert !Support.ok?('ok' => 0)
27
- assert !Support.ok?('ok' => 0.0)
28
- assert !Support.ok?('ok' => 0.0)
29
- assert !Support.ok?('ok' => 'str')
30
- assert !Support.ok?('ok' => false)
31
- end
32
-
33
- def test_array_of_pairs
34
- hps = [["localhost", 27017], ["localhost", 27018], ["localhost", 27019]]
35
- assert_equal [["localhost", 27017], ["localhost", 27018], ["localhost", 27019]], Support.normalize_seeds(hps)
36
- end
37
-
38
- def test_array_of_strings
39
- hps = ["localhost:27017", "localhost:27018", "localhost:27019"]
40
- assert_equal [["localhost", 27017], ["localhost", 27018], ["localhost", 27019]], Support.normalize_seeds(hps)
41
- end
42
-
43
- def test_single_string_with_host_port
44
- hps = "localhost:27017"
45
- assert_equal ["localhost", 27017], Support.normalize_seeds(hps)
46
- end
47
-
48
- def test_single_string_missing_port
49
- hps = "localhost"
50
- assert_equal ["localhost", 27017], Support.normalize_seeds(hps)
51
- end
52
-
53
- def test_single_element_array_missing_port
54
- hps = ["localhost"]
55
- assert_equal ["localhost", 27017], Support.normalize_seeds(hps)
56
- end
57
-
58
- def test_pair_doesnt_get_converted
59
- hps = ["localhost", 27017]
60
- assert_equal ["localhost", 27017], Support.normalize_seeds(hps)
61
- end
62
- end
@@ -1,60 +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 TimeoutTest < Test::Unit::TestCase
18
-
19
- def test_op_timeout
20
- grant_admin_user_eval_role(standard_connection)
21
- connection = standard_connection(:op_timeout => 0.5)
22
-
23
- admin = connection.db('admin')
24
-
25
- command = {:eval => "sleep(100)"}
26
- # Should not timeout
27
- assert admin.command(command)
28
-
29
- # Should timeout
30
- command = {:eval => "sleep(1000)"}
31
- assert_raise Mongo::OperationTimeout do
32
- admin.command(command)
33
- end
34
- end
35
-
36
- def test_external_timeout_does_not_leave_socket_in_bad_state
37
- client = standard_connection
38
- db = client[TEST_DB]
39
- coll = db['timeout-tests']
40
- grant_admin_user_eval_role(client)
41
-
42
- # prepare the database
43
- coll.drop
44
- coll.insert({:a => 1})
45
-
46
- # use external timeout to mangle socket
47
- begin
48
- Timeout::timeout(0.5) do
49
- db.command({:eval => "sleep(1000)"})
50
- end
51
- rescue Timeout::Error
52
- #puts "Thread timed out and has now mangled the socket"
53
- end
54
-
55
- assert_nothing_raised do
56
- coll.find_one
57
- end
58
- end
59
-
60
- end
@@ -1,446 +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 URITest < Test::Unit::TestCase
18
- include Mongo
19
-
20
- def test_uri_without_port
21
- parser = Mongo::URIParser.new('mongodb://localhost')
22
- assert_equal 1, parser.nodes.length
23
- assert_equal 'localhost', parser.nodes[0][0]
24
- assert_equal 27017, parser.nodes[0][1]
25
- end
26
-
27
- def test_basic_uri
28
- parser = Mongo::URIParser.new('mongodb://localhost:27018')
29
- assert_equal 1, parser.nodes.length
30
- assert_equal 'localhost', parser.nodes[0][0]
31
- assert_equal 27018, parser.nodes[0][1]
32
- end
33
-
34
- def test_unix_socket
35
- parser = Mongo::URIParser.new('mongodb:///tmp/mongod.sock')
36
- assert_equal 1, parser.nodes.length
37
- assert_equal '/tmp/mongod.sock', parser.nodes[0][0]
38
- end
39
-
40
- def test_unix_socket_with_user
41
- parser = Mongo::URIParser.new('mongodb://bob:secret.word@/tmp/mongod.sock')
42
- assert_equal 1, parser.nodes.length
43
- assert_equal '/tmp/mongod.sock', parser.nodes[0][0]
44
- assert_equal "bob", parser.auths.first[:username]
45
- assert_equal "secret.word", parser.auths.first[:password]
46
- assert_equal 'admin', parser.auths.first[:source]
47
- end
48
-
49
- def test_unix_socket_with_db
50
- parser = Mongo::URIParser.new('mongodb://bob:secret.word@/tmp/mongod.sock/some_db')
51
- assert_equal 1, parser.nodes.length
52
- assert_equal '/tmp/mongod.sock', parser.nodes[0][0]
53
- assert_equal 'bob', parser.auths.first[:username]
54
- assert_equal 'secret.word', parser.auths.first[:password]
55
- assert_equal 'some_db', parser.auths.first[:source]
56
- end
57
-
58
- def test_ipv6_format
59
- parser = Mongo::URIParser.new('mongodb://[::1]:27018')
60
- assert_equal 1, parser.nodes.length
61
- assert_equal '::1', parser.nodes[0][0]
62
- assert_equal 27018, parser.nodes[0][1]
63
-
64
- parser = Mongo::URIParser.new('mongodb://[::1]')
65
- assert_equal 1, parser.nodes.length
66
- assert_equal '::1', parser.nodes[0][0]
67
- end
68
-
69
- def test_ipv6_format_multi
70
- parser = Mongo::URIParser.new('mongodb://[::1]:27017,[::1]:27018')
71
- assert_equal 2, parser.nodes.length
72
- assert_equal '::1', parser.nodes[0][0]
73
- assert_equal 27017, parser.nodes[0][1]
74
- assert_equal '::1', parser.nodes[1][0]
75
- assert_equal 27018, parser.nodes[1][1]
76
-
77
- parser = Mongo::URIParser.new('mongodb://[::1]:27017,localhost:27018')
78
- assert_equal 2, parser.nodes.length
79
- assert_equal '::1', parser.nodes[0][0]
80
- assert_equal 27017, parser.nodes[0][1]
81
- assert_equal 'localhost', parser.nodes[1][0]
82
- assert_equal 27018, parser.nodes[1][1]
83
-
84
- parser = Mongo::URIParser.new('mongodb://localhost:27017,[::1]:27018')
85
- assert_equal 2, parser.nodes.length
86
- assert_equal 'localhost', parser.nodes[0][0]
87
- assert_equal 27017, parser.nodes[0][1]
88
- assert_equal '::1', parser.nodes[1][0]
89
- assert_equal 27018, parser.nodes[1][1]
90
- end
91
-
92
- def test_multiple_uris
93
- parser = Mongo::URIParser.new('mongodb://a.example.com:27018,b.example.com')
94
- assert_equal 2, parser.nodes.length
95
- assert_equal ['a.example.com', 27018], parser.nodes[0]
96
- assert_equal ['b.example.com', 27017], parser.nodes[1]
97
- end
98
-
99
- def test_username_without_password
100
- parser = Mongo::URIParser.new('mongodb://bob:@localhost?authMechanism=GSSAPI')
101
- assert_equal "bob", parser.auths.first[:username]
102
- assert_equal nil, parser.auths.first[:password]
103
-
104
- parser = Mongo::URIParser.new('mongodb://bob@localhost?authMechanism=GSSAPI')
105
- assert_equal nil, parser.auths.first[:password]
106
-
107
- assert_raise_error MongoArgumentError do
108
- Mongo::URIParser.new('mongodb://bob:@localhost')
109
- end
110
-
111
- assert_raise_error MongoArgumentError do
112
- Mongo::URIParser.new('mongodb://bob@localhost')
113
- end
114
- end
115
-
116
- def test_username_without_password_unix_socket
117
- parser = Mongo::URIParser.new('mongodb://bob:@/tmp/mongod.sock?authMechanism=GSSAPI')
118
- assert_equal "bob", parser.auths.first[:username]
119
- assert_equal nil, parser.auths.first[:password]
120
-
121
- parser = Mongo::URIParser.new('mongodb://bob@/tmp/mongod.sock?authMechanism=GSSAPI')
122
- assert_equal nil, parser.auths.first[:password]
123
-
124
- assert_raise_error MongoArgumentError do
125
- Mongo::URIParser.new('mongodb://bob:@/tmp/mongod.sock')
126
- end
127
-
128
- assert_raise_error MongoArgumentError do
129
- Mongo::URIParser.new('mongodb://bob@/tmp/mongod.sock')
130
- end
131
- end
132
-
133
- def test_complex_passwords
134
- parser = Mongo::URIParser.new('mongodb://bob:secret.word@a.example.com:27018/test')
135
- assert_equal "bob", parser.auths.first[:username]
136
- assert_equal "secret.word", parser.auths.first[:password]
137
-
138
- parser = Mongo::URIParser.new('mongodb://bob:s-_3#%R.t@a.example.com:27018/test')
139
- assert_equal "bob", parser.auths.first[:username]
140
- assert_equal "s-_3#%R.t", parser.auths.first[:password]
141
-
142
- assert_raise_error MongoArgumentError do
143
- Mongo::URIParser.new('mongodb://doctor:bad:wolf@gallifrey.com:27018/test')
144
- end
145
-
146
- assert_raise_error MongoArgumentError do
147
- Mongo::URIParser.new('mongodb://doctor:bow@tie@gallifrey.com:27018/test')
148
- end
149
- end
150
-
151
- def test_complex_usernames
152
- parser = Mongo::URIParser.new('mongodb://s-_3#%R.t:secret.word@a.example.com:27018/test')
153
- assert_equal "s-_3#%R.t", parser.auths.first[:username]
154
-
155
- assert_raise_error MongoArgumentError do
156
- Mongo::URIParser.new('mongodb://doc:tor:badwolf@gallifrey.com:27018/test')
157
- end
158
-
159
- assert_raise_error MongoArgumentError do
160
- Mongo::URIParser.new('mongodb://d@ctor:bowtie@gallifrey.com:27018/test')
161
- end
162
- end
163
-
164
- def test_username_with_encoded_symbol
165
- parser = Mongo::URIParser.new('mongodb://f%40o:bar@localhost/admin')
166
- username = parser.auths.first[:username]
167
- assert_equal 'f@o', username
168
-
169
- parser = Mongo::URIParser.new('mongodb://f%3Ao:bar@localhost/admin')
170
- username = parser.auths.first[:username]
171
- assert_equal 'f:o', username
172
- end
173
-
174
- def test_password_with_encoded_symbol
175
- parser = Mongo::URIParser.new('mongodb://foo:b%40r@localhost/admin')
176
- password = parser.auths.first[:password]
177
- assert_equal 'b@r', password
178
-
179
- parser = Mongo::URIParser.new('mongodb://foo:b%3Ar@localhost/admin')
180
- password = parser.auths.first[:password]
181
- assert_equal 'b:r', password
182
- end
183
-
184
- def test_opts_with_semincolon_separator
185
- parser = Mongo::URIParser.new('mongodb://localhost:27018?connect=direct;slaveok=true;safe=true')
186
- assert_equal 'direct', parser.connect
187
- assert parser.direct?
188
- assert parser.slaveok
189
- assert parser.safe
190
- end
191
-
192
- def test_opts_with_amp_separator
193
- parser = Mongo::URIParser.new('mongodb://localhost:27018?connect=direct&slaveok=true&safe=true')
194
- assert_equal 'direct', parser.connect
195
- assert parser.direct?
196
- assert parser.slaveok
197
- assert parser.safe
198
- end
199
-
200
- def test_opts_with_uri_encoded_stuff
201
- parser = Mongo::URIParser.new('mongodb://localhost:27018?connect=%64%69%72%65%63%74&slaveok=%74%72%75%65&safe=true')
202
- assert_equal 'direct', parser.connect
203
- assert parser.direct?
204
- assert parser.slaveok
205
- assert parser.safe
206
- end
207
-
208
- def test_opts_made_invalid_by_mixed_separators
209
- assert_raise_error MongoArgumentError, "must not mix URL separators ; and &" do
210
- Mongo::URIParser.new('mongodb://localhost:27018?replicaset=foo;bar&slaveok=true&safe=true')
211
- end
212
- end
213
-
214
- def test_opts_safe
215
- parser = Mongo::URIParser.new('mongodb://localhost:27018?safe=true;w=2;journal=true;fsync=true;wtimeoutMS=200')
216
- assert parser.safe
217
- assert_equal 2, parser.w
218
- assert parser.fsync
219
- assert parser.journal
220
- assert_equal 200, parser.wtimeoutms
221
- end
222
-
223
- def test_opts_ssl
224
- parser = Mongo::URIParser.new('mongodb://localhost:27018?ssl=true;w=2;journal=true;fsync=true;wtimeoutMS=200')
225
- assert parser.ssl
226
- end
227
-
228
- def test_opts_nonsafe_timeout
229
- parser = Mongo::URIParser.new('mongodb://localhost:27018?connectTimeoutMS=5500&socketTimeoutMS=500')
230
- assert_equal 5.5, parser.connecttimeoutms
231
- assert_equal 0.5, parser.sockettimeoutms
232
- end
233
-
234
- def test_opts_replica_set
235
- parser = Mongo::URIParser.new('mongodb://localhost:27018?connect=replicaset;replicaset=foo')
236
- assert_equal 'foo', parser.replicaset
237
- assert_equal 'replicaset', parser.connect
238
- assert parser.replicaset?
239
- end
240
-
241
- def test_opts_conflicting_replica_set
242
- assert_raise_error MongoArgumentError, "connect=direct conflicts with setting a replicaset name" do
243
- Mongo::URIParser.new('mongodb://localhost:27018?connect=direct;replicaset=foo')
244
- end
245
- end
246
-
247
- def test_case_insensitivity
248
- parser = Mongo::URIParser.new('mongodb://localhost:27018?wtimeoutms=500&JOURNAL=true&SaFe=true')
249
- assert_equal 500, parser.wtimeoutms
250
- assert_equal true, parser.journal
251
- assert_equal true, parser.safe
252
- end
253
-
254
- def test_read_preference_option_primary
255
- parser = Mongo::URIParser.new("mongodb://localhost:27018?readPreference=primary")
256
- assert_equal :primary, parser.readpreference
257
- end
258
-
259
- def test_read_preference_option_primary_unix_sock
260
- parser = Mongo::URIParser.new("mongodb:///tmp/mongod.sock?readPreference=primary")
261
- assert_equal :primary, parser.readpreference
262
- end
263
-
264
- def test_read_preference_option_primary_preferred
265
- parser = Mongo::URIParser.new("mongodb://localhost:27018?readPreference=primaryPreferred")
266
- assert_equal :primary_preferred, parser.readpreference
267
- end
268
-
269
- def test_read_preference_option_secondary
270
- parser = Mongo::URIParser.new("mongodb://localhost:27018?readPreference=secondary")
271
- assert_equal :secondary, parser.readpreference
272
- end
273
-
274
- def test_read_preference_option_secondary_preferred
275
- parser = Mongo::URIParser.new("mongodb://localhost:27018?readPreference=secondaryPreferred")
276
- assert_equal :secondary_preferred, parser.readpreference
277
- end
278
-
279
- def test_read_preference_option_nearest
280
- parser = Mongo::URIParser.new("mongodb://localhost:27018?readPreference=nearest")
281
- assert_equal :nearest, parser.readpreference
282
- end
283
-
284
- def test_read_preference_option_with_invalid
285
- assert_raise_error MongoArgumentError do
286
- Mongo::URIParser.new("mongodb://localhost:27018?readPreference=invalid")
287
- end
288
- end
289
-
290
- def test_read_preference_connection_options
291
- parser = Mongo::URIParser.new("mongodb://localhost:27018?replicaset=test&readPreference=nearest")
292
- assert_equal :nearest, parser.connection_options[:read]
293
- end
294
-
295
- def test_read_preference_connection_options_with_no_replica_set
296
- parser = Mongo::URIParser.new("mongodb://localhost:27018?readPreference=nearest")
297
- assert_equal :nearest, parser.connection_options[:read]
298
- end
299
-
300
- def test_read_preference_connection_options_prefers_preference_over_slaveok
301
- parser = Mongo::URIParser.new("mongodb://localhost:27018?replicaset=test&readPreference=nearest&slaveok=true")
302
- assert_equal :nearest, parser.connection_options[:read]
303
- end
304
-
305
- def test_read_preference_tags
306
- parser = Mongo::URIParser.new("mongodb://localhost:27017?replicaset=test&" +
307
- "readPreferenceTags=dc:ny,rack:1")
308
- expected_tags = [{ 'dc' => 'ny', 'rack' => '1' }]
309
- assert_equal expected_tags, parser.connection_options[:tag_sets]
310
- end
311
-
312
- def test_read_preference_tags_multiple
313
- parser = Mongo::URIParser.new("mongodb://localhost:27017?replicaset=test&" +
314
- "readPreferenceTags=dc:ny,rack:1&readPreferenceTags=dc:bos")
315
- expected_tags = [{'dc' => 'ny', 'rack' => '1'}, { 'dc' => 'bos' }]
316
- assert_equal expected_tags, parser.connection_options[:tag_sets]
317
- end
318
-
319
- def test_invalid_read_preference_tags
320
- assert_raise_error MongoArgumentError do
321
- Mongo::URIParser.new("mongodb://localhost:27017?replicaset=test&" +
322
- "readPreferenceTags=dc")
323
- end
324
- end
325
-
326
- def test_invalid_read_preference_tags_multiple
327
- assert_raise_error MongoArgumentError do
328
- Mongo::URIParser.new("mongodb://localhost:27017?replicaset=test&" +
329
- "readPreferenceTags=dc:nyc&readPreferenceTags=dc")
330
- end
331
- end
332
-
333
- def test_connection_when_sharded_with_no_options
334
- parser = Mongo::URIParser.new("mongodb://localhost:27017,localhost:27018")
335
- client = parser.connection({}, false, true)
336
- assert_equal [[ "localhost", 27017 ], [ "localhost", 27018 ]], client.seeds
337
- assert_true client.mongos?
338
- end
339
-
340
- def test_connection_when_sharded_with_options
341
- parser = Mongo::URIParser.new("mongodb://localhost:27017,localhost:27018")
342
- client = parser.connection({ :refresh_interval => 10 }, false, true)
343
- assert_equal [[ "localhost", 27017 ], [ "localhost", 27018 ]], client.seeds
344
- assert_equal 10, client.refresh_interval
345
- assert_true client.mongos?
346
- end
347
-
348
- def test_connection_when_sharded_with_uri_options
349
- parser = Mongo::URIParser.new("mongodb://localhost:27017,localhost:27018?readPreference=nearest")
350
- client = parser.connection({}, false, true)
351
- assert_equal [[ "localhost", 27017 ], [ "localhost", 27018 ]], client.seeds
352
- assert_equal :nearest, client.read
353
- assert_true client.mongos?
354
- end
355
-
356
- def test_auth_source
357
- parser = Mongo::URIParser.new("mongodb://user:pass@localhost?authSource=foobar")
358
- assert_equal 'foobar', parser.authsource
359
- end
360
-
361
- def test_auth_mechanism
362
- parser = Mongo::URIParser.new("mongodb://user@localhost?authMechanism=MONGODB-X509")
363
- assert_equal 'MONGODB-X509', parser.authmechanism
364
-
365
- assert_raise_error MongoArgumentError do
366
- Mongo::URIParser.new("mongodb://user@localhost?authMechanism=INVALID")
367
- end
368
- end
369
-
370
- def test_auth_mechanism_properties
371
- uri = "mongodb://user@localhost?authMechanism=GSSAPI&authMechanismProperties=SERVICE_NAME" +
372
- ":mongodb,CANONICALIZE_HOST_NAME:true"
373
- parser = Mongo::URIParser.new(uri)
374
- properties = {:service_name => "mongodb", :canonicalize_host_name => true}
375
- assert_equal properties, parser.authmechanismproperties
376
- assert_equal 'GSSAPI', parser.authmechanism
377
-
378
- uri = "mongodb://user@localhost?authMechanism=GSSAPI&authMechanismProperties=SERVICE_NAME" +
379
- ":MongoDB,CANONICALIZE_HOST_NAME:false,SERVICE_REALM:test"
380
- parser = Mongo::URIParser.new(uri)
381
- properties = {:service_name => "MongoDB", :canonicalize_host_name => false, :service_realm => "test"}
382
- assert_equal properties, parser.authmechanismproperties
383
- assert_equal 'GSSAPI', parser.authmechanism
384
- end
385
-
386
- def test_invalid_auth_mechanism_properties
387
- uri = "mongodb://user@localhost?authMechanism=GSSAPI&authMechanismProperties=SERVICE_NAME" +
388
- ":mongodb,INVALID_PROPERTY:true"
389
- assert_raise_error MongoArgumentError do
390
- parser = Mongo::URIParser.new(uri)
391
- end
392
-
393
- uri = "mongodb://user@localhost?authMechanism=PLAIN&authMechanismProperties="+
394
- "SERVICE_NAME:mongodb"
395
- assert_raise_error MongoArgumentError do
396
- parser = Mongo::URIParser.new(uri)
397
- end
398
- end
399
-
400
- def test_sasl_plain
401
- parser = Mongo::URIParser.new("mongodb://user:pass@localhost?authMechanism=PLAIN")
402
- assert_equal 'PLAIN', parser.auths.first[:mechanism]
403
- assert_equal 'user', parser.auths.first[:username]
404
- assert_equal 'pass', parser.auths.first[:password]
405
- assert_equal 'admin', parser.auths.first[:source]
406
-
407
- parser = Mongo::URIParser.new("mongodb://foo%2Fbar%40example.net:pass@localhost/some_db?authMechanism=PLAIN")
408
- assert_equal 'PLAIN', parser.auths.first[:mechanism]
409
- assert_equal 'foo/bar@example.net', parser.auths.first[:username]
410
- assert_equal 'pass', parser.auths.first[:password]
411
- assert_equal 'some_db', parser.auths.first[:source]
412
-
413
- assert_raise_error MongoArgumentError do
414
- Mongo::URIParser.new("mongodb://user@localhost/some_db?authMechanism=PLAIN")
415
- end
416
- end
417
-
418
- def test_gssapi
419
- uri = "mongodb://foo%2Fbar%40example.net@localhost?authMechanism=GSSAPI;"
420
- parser = Mongo::URIParser.new(uri)
421
- assert_equal 'GSSAPI', parser.auths.first[:mechanism]
422
- assert_equal 'foo/bar@example.net', parser.auths.first[:username]
423
-
424
-
425
- uri = "mongodb://foo%2Fbar%40example.net@localhost?authMechanism=GSSAPI;" +
426
- "authMechanismProperties=SERVICE_NAME:mongodb,SERVICE_REALM:example," +
427
- "CANONICALIZE_HOST_NAME:true"
428
- parser = Mongo::URIParser.new(uri)
429
- assert_equal 'GSSAPI', parser.auths.first[:mechanism]
430
- assert_equal 'foo/bar@example.net', parser.auths.first[:username]
431
- assert_equal 'mongodb', parser.auths.first[:extra][:service_name]
432
- assert_equal true, parser.auths.first[:extra][:canonicalize_host_name]
433
- assert_equal 'example', parser.auths.first[:extra][:service_realm]
434
- end
435
-
436
- def test_opts_case_sensitivity
437
- # options authsource, replicaset, w should be case sensitive
438
- uri = "mongodb://localhost?authSource=FooBar;" +
439
- "replicaSet=Foo;" +
440
- "w=Majority"
441
- parser = Mongo::URIParser.new(uri)
442
- assert_equal 'FooBar', parser.authsource
443
- assert_equal 'Foo', parser.replicaset
444
- assert_equal :Majority, parser.w
445
- end
446
- end