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,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