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,260 +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
- module BasicAuthTests
16
-
17
- def init_auth_basic
18
- @test_user = 'bob'
19
- @test_user_pwd = 'user'
20
-
21
- # db user for cleanup (for pre-2.4)
22
- @db.add_user('admin', 'cleanup', nil, :roles => [])
23
- end
24
-
25
- def teardown
26
- return unless @client && @db
27
- unless has_auth?(TEST_DB, TEST_USER)
28
- @client[TEST_DB].authenticate(TEST_USER, TEST_USER_PWD)
29
- end
30
-
31
- if @client.server_version < '2.5'
32
- @db['system.users'].remove
33
- else
34
- @db.command(:dropAllUsersFromDatabase => 1)
35
- end
36
- end
37
-
38
- def remove_user(database, username, password)
39
- database.authenticate(username, password) unless has_auth?(database.name, username)
40
- database.remove_user(username)
41
- database.logout
42
- end
43
-
44
- def has_auth?(db_name, username)
45
- @client.auths.any? { |a| a[:source] == db_name && a[:username] == username }
46
- end
47
-
48
- def test_descriptive_mech_error
49
- assert_raise_error Mongo::MongoArgumentError, Mongo::Authentication::MECHANISM_ERROR do
50
- @db.authenticate('emily', nil, nil, nil, 'FAKE_MECHANISM')
51
- end
52
- assert_raise_error Mongo::MongoArgumentError, Mongo::Authentication::MECHANISM_ERROR do
53
- uri = "mongodb://user:pwd@host:port/example?authSource=$external&authMechanism=FAKE_MECHANISM"
54
- Mongo::MongoClient.from_uri(uri)
55
- end
56
- end
57
-
58
- def test_add_remove_user
59
- init_auth_basic
60
-
61
- # add user
62
- silently { @db.add_user(@test_user, @test_user_pwd) }
63
- assert @db.authenticate(@test_user, @test_user_pwd)
64
-
65
- # remove user
66
- assert @db.remove_user(@test_user)
67
- end
68
-
69
- def test_update_user
70
- init_auth_basic
71
-
72
- # add user
73
- silently { @db.add_user(@test_user, @test_user_pwd) }
74
- assert @db.authenticate(@test_user, @test_user_pwd)
75
- @db.logout
76
-
77
- # update user
78
- silently { @db.add_user(@test_user, 'updated') }
79
- assert_raise Mongo::AuthenticationError do
80
- @db.authenticate('bob', 'user')
81
- end
82
- assert @db.authenticate('bob', 'updated')
83
- end
84
-
85
- def test_remove_non_existent_user
86
- init_auth_basic
87
-
88
- if @client.server_version < '2.5'
89
- assert_equal false, @db.remove_user('joe')
90
- else
91
- assert_raise Mongo::OperationFailure do
92
- assert @db.remove_user('joe')
93
- end
94
- end
95
- end
96
-
97
- def test_authenticate
98
- init_auth_basic
99
- silently { @db.add_user(@test_user, @test_user_pwd) }
100
- assert @db.authenticate(@test_user, @test_user_pwd)
101
- end
102
-
103
- def test_authenticate_non_existent_user
104
- init_auth_basic
105
- assert_raise Mongo::AuthenticationError do
106
- @db.authenticate('frank', 'thetank')
107
- end
108
- end
109
-
110
- def test_logout
111
- init_auth_basic
112
- silently { @db.add_user(@test_user, @test_user_pwd) }
113
- assert @db.authenticate(@test_user, @test_user_pwd)
114
- assert @db.logout
115
- end
116
-
117
- def test_authenticate_with_special_characters
118
- init_auth_basic
119
- silently { assert @db.add_user('foo:bar','@foo') }
120
- assert @db.authenticate('foo:bar','@foo')
121
- end
122
-
123
- def test_authenticate_read_only
124
- init_auth_basic
125
- silently { @db.add_user(@test_user, @test_user_pwd, true) }
126
- assert @db.authenticate(@test_user, @test_user_pwd)
127
- end
128
-
129
- def test_authenticate_with_connection_uri
130
- init_auth_basic
131
- silently { @db.add_user(@test_user, @test_user_pwd) }
132
-
133
- uri = "mongodb://#{@test_user}:#{@test_user_pwd}@#{@host_info}/#{@db.name}"
134
- client = Mongo::URIParser.new(uri).connection
135
-
136
- assert client
137
- assert_equal client.auths.size, 1
138
- assert client[@db.name]['auth_test'].count
139
-
140
- auth = client.auths.first
141
- assert_equal @db.name, auth[:db_name]
142
- assert_equal @test_user, auth[:username]
143
- assert_equal @test_user_pwd, auth[:password]
144
- end
145
-
146
- def test_socket_auths
147
- init_auth_basic
148
- # setup
149
- db_a = @client[TEST_DB + '_a']
150
- silently { db_a.add_user('user_a', 'password') }
151
- assert db_a.authenticate('user_a', 'password')
152
-
153
- db_b = @client[TEST_DB + '_b']
154
- silently { db_b.add_user('user_b', 'password') }
155
- assert db_b.authenticate('user_b', 'password')
156
-
157
- db_c = @client[TEST_DB + '_c']
158
- silently { db_c.add_user('user_c', 'password') }
159
- assert db_c.authenticate('user_c', 'password')
160
-
161
- # client auths should be applied to socket on checkout
162
- socket = @client.checkout_reader(:mode => :primary)
163
- assert_equal 4, socket.auths.size
164
- assert_equal @client.auths, socket.auths
165
- @client.checkin(socket)
166
-
167
- # logout should remove saved auth on socket and client
168
- assert db_b.logout
169
- socket = @client.checkout_reader(:mode => :primary)
170
- assert_equal 3, socket.auths.size
171
- assert_equal @client.auths, socket.auths
172
- @client.checkin(socket)
173
-
174
- # clean-up
175
- db_b.authenticate('user_b', 'password')
176
- remove_user(db_a, 'user_a', 'password')
177
- remove_user(db_b, 'user_b', 'password')
178
- remove_user(db_c, 'user_c', 'password')
179
- end
180
-
181
- def test_default_roles_non_admin
182
- init_auth_basic
183
- @db.stubs(:command).returns({}, true)
184
- @db.expects(:command).with do |command, cmd_opts|
185
- command[:createUser] == @test_user
186
- cmd_opts[:roles] == ['dbOwner'] if cmd_opts
187
- end
188
-
189
- silently { @db.add_user(@test_user, @test_user_pwd) }
190
- end
191
-
192
- def test_default_roles_non_admin_read_only
193
- init_auth_basic
194
- @db.stubs(:command).returns({}, true)
195
- @db.expects(:command).with do |command, cmd_opts|
196
- command[:createUser] == @test_user
197
- cmd_opts[:roles] == ['read'] if cmd_opts
198
- end
199
- silently { @db.add_user(@test_user, @test_user_pwd, true) }
200
- end
201
-
202
- def test_delegated_authentication
203
- return unless @client.server_version >= '2.4' && @client.server_version < '2.5'
204
- with_auth(@client) do
205
- init_auth_basic
206
- # create user in test databases
207
- accounts = @client[TEST_DB + '_accounts']
208
- silently do
209
- accounts.add_user('emily', 'password')
210
- @db.add_user('emily', nil, nil, :roles => ['read'], :userSource => accounts.name)
211
- end
212
- @admin.logout
213
-
214
- # validate that direct authentication is not allowed
215
- assert_raise Mongo::AuthenticationError do
216
- @db.authenticate('emily', 'password')
217
- end
218
-
219
- # validate delegated authentication
220
- assert accounts.authenticate('emily', 'password')
221
- assert @db.collection_names
222
- accounts.logout
223
- assert_raise Mongo::OperationFailure do
224
- @db.collection_names
225
- end
226
-
227
- # validate auth using source database
228
- @db.authenticate('emily', 'password', nil, accounts.name)
229
- assert @db.collection_names
230
- accounts.logout
231
- assert_raise Mongo::OperationFailure do
232
- @db.collection_names
233
- end
234
-
235
- remove_user(accounts, 'emily', 'password')
236
- end
237
- end
238
-
239
- def test_update_user_to_read_only
240
- with_auth(@client) do
241
- init_auth_basic
242
- silently { @db.add_user(@test_user, @test_user_pwd) }
243
- @admin.logout
244
- @db.authenticate(@test_user, @test_user_pwd)
245
- @db['test'].insert({})
246
- @db.logout
247
-
248
- @admin.authenticate(TEST_USER, TEST_USER_PWD)
249
- silently { @db.add_user('emily', 'password', true) }
250
- @admin.logout
251
-
252
- silently { @db.authenticate('emily', 'password') }
253
- assert_raise Mongo::OperationFailure do
254
- @db['test'].insert({})
255
- end
256
- @db.logout
257
- @admin.authenticate(TEST_USER, TEST_USER_PWD)
258
- end
259
- end
260
- end
@@ -1,249 +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.0x
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
- module BulkAPIAuthTests
16
-
17
- include Mongo
18
-
19
- def init_auth_bulk
20
- # Set up the test db
21
- @collection = @db["bulk-api-auth-tests"]
22
-
23
- # db user can insert but not remove
24
- res = BSON::OrderedHash.new
25
- res[:db] = @db.name
26
- res[:collection] = ""
27
-
28
- cmd = BSON::OrderedHash.new
29
- cmd[:createRole] = "insertOnly"
30
- cmd[:privileges] = [{:resource => res, :actions => [ "insert", "find" ]}]
31
- cmd[:roles] = []
32
- @db.command(cmd)
33
- @db.add_user('insertOnly', 'password', nil, :roles => ['insertOnly'])
34
-
35
- # db user can insert and remove
36
- cmd = BSON::OrderedHash.new
37
- cmd[:createRole] = "insertAndRemove"
38
- cmd[:privileges] = [{:resource => res, :actions => [ "insert", "remove", "find" ]}]
39
- cmd[:roles] = []
40
- @db.command(cmd)
41
- @db.add_user('insertAndRemove', 'password', nil, :roles => ['insertAndRemove'])
42
-
43
- @admin.logout
44
- end
45
-
46
- def clear_collection(collection)
47
- @admin.authenticate(TEST_USER, TEST_USER_PWD)
48
- collection.remove
49
- @admin.logout
50
- end
51
-
52
- def teardown_bulk
53
- remove_all_users_and_roles(@db)
54
- remove_all_users_and_roles(@admin)
55
- end
56
-
57
- def remove_all_users_and_roles(database)
58
- @admin.authenticate(TEST_USER, TEST_USER_PWD)
59
- if @version < '2.5.3'
60
- database['system.users'].remove
61
- else
62
- database.command({:dropAllRolesFromDatabase => 1})
63
- # Don't delete the TEST_USER from the TEST_DB, it is needed for future tests
64
- database.command({:dropAllUsersFromDatabase => 1}) unless database.name == TEST_DB
65
- end
66
- @admin.logout
67
- end
68
-
69
- def test_auth_no_error
70
- return unless @version >= '2.5.3'
71
- init_auth_bulk
72
- with_write_commands_and_operations(@db.connection) do |wire_version|
73
- clear_collection(@collection)
74
- @db.authenticate('insertAndRemove', 'password')
75
- bulk = @collection.initialize_ordered_bulk_op
76
- bulk.insert({:a => 1})
77
- bulk.find({:a => 1}).remove_one
78
-
79
- result = bulk.execute
80
- assert_match_document(
81
- {
82
- "ok" => 1,
83
- "nInserted" => 1,
84
- "nRemoved" => 1
85
- }, result, "wire_version:#{wire_version}")
86
- assert_equal 0, @collection.count
87
- @db.logout
88
- end
89
- teardown_bulk
90
- end
91
-
92
- def test_auth_error
93
- return unless @version >= '2.5.3'
94
- init_auth_bulk
95
- with_write_commands_and_operations(@db.connection) do |wire_version|
96
- clear_collection(@collection)
97
- @db.authenticate('insertOnly', 'password')
98
- bulk = @collection.initialize_ordered_bulk_op
99
- bulk.insert({:a => 1})
100
- bulk.find({:a => 1}).remove
101
- bulk.insert({:a => 2})
102
-
103
- ex = assert_raise Mongo::BulkWriteError do
104
- bulk.execute
105
- end
106
- result = ex.result
107
- assert_match_document(
108
- {
109
- "ok" => 1,
110
- "n" => 1,
111
- "writeErrors" =>
112
- [{
113
- "index" => 1,
114
- "code" => 13,
115
- "errmsg" => /not authorized/
116
- }],
117
- "code" => 65,
118
- "errmsg" => "batch item errors occurred",
119
- "nInserted" => 1
120
- }, result, "wire_version:#{wire_version}")
121
- assert_equal 1, @collection.count
122
- @db.logout
123
- end
124
- teardown_bulk
125
- end
126
-
127
- def test_auth_error_unordered
128
- return unless @version >= '2.5.3'
129
- init_auth_bulk
130
- with_write_commands_and_operations(@db.connection) do |wire_version|
131
- clear_collection(@collection)
132
- @db.authenticate('insertOnly', 'password')
133
- bulk = @collection.initialize_unordered_bulk_op
134
- bulk.insert({:a => 1})
135
- bulk.find({:a => 1}).remove_one
136
- bulk.insert({:a => 2})
137
-
138
- ex = assert_raise Mongo::BulkWriteError do
139
- bulk.execute
140
- end
141
- result = ex.result
142
- assert_equal 1, result["writeErrors"].length
143
- assert_equal 2, result["n"]
144
- assert_equal 2, result["nInserted"]
145
- assert_equal 2, @collection.count
146
- @db.logout
147
- end
148
- teardown_bulk
149
- end
150
-
151
- def test_duplicate_key_with_auth_error
152
- return unless @version >= '2.5.3'
153
- init_auth_bulk
154
- with_write_commands_and_operations(@db.connection) do |wire_version|
155
- clear_collection(@collection)
156
- @db.authenticate('insertOnly', 'password')
157
- bulk = @collection.initialize_ordered_bulk_op
158
- bulk.insert({:_id => 1, :a => 1})
159
- bulk.insert({:_id => 1, :a => 2})
160
- bulk.find({:a => 1}).remove_one
161
-
162
- ex = assert_raise Mongo::BulkWriteError do
163
- bulk.execute
164
- end
165
- result = ex.result
166
- assert_match_document(
167
- {
168
- "ok" => 1,
169
- "n" => 1,
170
- "writeErrors" =>
171
- [{
172
- "index" => 1,
173
- "code" => 11000,
174
- "errmsg" => /duplicate key error/
175
- }],
176
- "code" => 65,
177
- "errmsg" => "batch item errors occurred",
178
- "nInserted" => 1
179
- }, result, "wire_version:#{wire_version}")
180
- assert_equal 1, @collection.count
181
- @db.logout
182
- end
183
- teardown_bulk
184
- end
185
-
186
- def test_duplicate_key_with_auth_error_unordered
187
- return unless @version >= '2.5.3'
188
- init_auth_bulk
189
- with_write_commands_and_operations(@db.connection) do |wire_version|
190
- clear_collection(@collection)
191
- @db.authenticate('insertOnly', 'password')
192
- bulk = @collection.initialize_unordered_bulk_op
193
- bulk.insert({:_id => 1, :a => 1})
194
- bulk.insert({:_id => 1, :a => 1})
195
- bulk.find({:a => 1}).remove_one
196
-
197
- ex = assert_raise Mongo::BulkWriteError do
198
- bulk.execute
199
- end
200
- result = ex.result
201
- assert_equal 2, result["writeErrors"].length
202
- assert_equal 1, result["n"]
203
- assert_equal 1, result["nInserted"]
204
- assert_equal 1, @collection.count
205
- @db.logout
206
- end
207
- teardown_bulk
208
- end
209
-
210
- def test_write_concern_error_with_auth_error
211
- with_no_replication(@db.connection) do
212
- return unless @version >= '2.5.3'
213
- init_auth_bulk
214
- with_write_commands_and_operations(@db.connection) do |wire_version|
215
- clear_collection(@collection)
216
- @db.authenticate('insertOnly', 'password')
217
- bulk = @collection.initialize_ordered_bulk_op
218
- bulk.insert({:_id => 1, :a => 1})
219
- bulk.insert({:_id => 2, :a => 1})
220
- bulk.find({:a => 1}).remove_one
221
-
222
- ex = assert_raise Mongo::BulkWriteError do
223
- bulk.execute({:w => 2})
224
- end
225
- result = ex.result
226
-
227
- assert_match_document(
228
- {
229
- "ok" => 0,
230
- "n" => 0,
231
- "nInserted" => 0,
232
- "writeErrors" =>
233
- [{
234
- "index" => 0,
235
- "code" => 2,
236
- "errmsg" => /'w' > 1/
237
- }],
238
- "code" => 65,
239
- "errmsg" => "batch item errors occurred"
240
- }, result, "wire_version#{wire_version}")
241
- # Re-visit this when RUBY-731 is resolved:
242
- assert (@collection.count == batch_commands?(wire_version) ? 0 : 1)
243
- @db.logout
244
- end
245
- teardown_bulk
246
- end
247
- end
248
-
249
- end
@@ -1,176 +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
- module GSSAPITests
16
-
17
- # Tests for the GSSAPI Authentication Mechanism.
18
- #
19
- # Note: These tests will be skipped automatically unless the test environment
20
- # has been configured.
21
- #
22
- # In order to run these tests, you must be using JRuby and must set the following
23
- # environment variables. The realm and KDC are required so that the corresponding
24
- # system properties can be set:
25
- #
26
- # export MONGODB_GSSAPI_HOST='server.domain.com'
27
- # export MONGODB_GSSAPI_USER='applicationuser@example.com'
28
- # export MONGODB_GSSAPI_REALM='applicationuser@example.com'
29
- # export MONGODB_GSSAPI_KDC='SERVER.DOMAIN.COM'
30
- #
31
- # You must use kinit when on MRI.
32
- # You have the option of providing a config file that references a keytab file on JRuby:
33
- #
34
- # export JAAS_LOGIN_CONFIG_FILE='file:///path/to/config/file'
35
- #
36
- MONGODB_GSSAPI_HOST = ENV['MONGODB_GSSAPI_HOST']
37
- MONGODB_GSSAPI_USER = ENV['MONGODB_GSSAPI_USER']
38
- MONGODB_GSSAPI_REALM = ENV['MONGODB_GSSAPI_REALM']
39
- MONGODB_GSSAPI_KDC = ENV['MONGODB_GSSAPI_KDC']
40
- MONGODB_GSSAPI_PORT = ENV['MONGODB_GSSAPI_PORT'] || '27017'
41
- MONGODB_GSSAPI_DB = ENV['MONGODB_GSSAPI_DB']
42
- JAAS_LOGIN_CONFIG_FILE = ENV['JAAS_LOGIN_CONFIG_FILE'] # only JRuby
43
-
44
- if ENV.key?('MONGODB_GSSAPI_HOST') && ENV.key?('MONGODB_GSSAPI_USER') &&
45
- ENV.key?('MONGODB_GSSAPI_REALM') && ENV.key?('MONGODB_GSSAPI_KDC') &&
46
- ENV.key?('MONGODB_GSSAPI_DB')
47
- def test_gssapi_authenticate
48
- client = Mongo::MongoClient.new(MONGODB_GSSAPI_HOST, MONGODB_GSSAPI_PORT)
49
- if client['admin'].command(:isMaster => 1)['setName']
50
- client = Mongo::MongoReplicaSetClient.new(["#{MONGODB_GSSAPI_HOST}:#{MONGODB_GSSAPI_PORT}"])
51
- end
52
-
53
- set_system_properties
54
- db = client[MONGODB_GSSAPI_DB]
55
- db.authenticate(MONGODB_GSSAPI_USER, nil, nil, nil, 'GSSAPI')
56
- assert db.command(:dbstats => 1)
57
-
58
- threads = []
59
- 4.times do
60
- threads << Thread.new do
61
- assert db.command(:dbstats => 1)
62
- end
63
- end
64
- threads.each(&:join)
65
- end
66
-
67
- def test_gssapi_authenticate_uri
68
- require 'cgi'
69
- set_system_properties
70
- username = CGI::escape(ENV['MONGODB_GSSAPI_USER'])
71
- uri = "mongodb://#{username}@#{ENV['MONGODB_GSSAPI_HOST']}:#{ENV['MONGODB_GSSAPI_PORT']}/?" +
72
- "authMechanism=GSSAPI"
73
- client = @client.class.from_uri(uri)
74
- assert client[MONGODB_GSSAPI_DB].command(:dbstats => 1)
75
- end
76
-
77
- def test_wrong_service_name_fails
78
- extra_opts = { :service_name => 'example' }
79
- client = Mongo::MongoClient.new(MONGODB_GSSAPI_HOST, MONGODB_GSSAPI_PORT)
80
- if client['admin'].command(:isMaster => 1)['setName']
81
- client = Mongo::MongoReplicaSetClient.new(["#{MONGODB_GSSAPI_HOST}:#{MONGODB_GSSAPI_PORT}"])
82
- end
83
-
84
- set_system_properties
85
- assert_raise_error Mongo::AuthenticationError do
86
- client[MONGODB_GSSAPI_DB].authenticate(MONGODB_GSSAPI_USER, nil, nil, nil, 'GSSAPI', extra_opts)
87
- end
88
- end
89
-
90
- def test_wrong_service_name_fails_uri
91
- set_system_properties
92
-
93
- require 'cgi'
94
- username = CGI::escape(ENV['MONGODB_GSSAPI_USER'])
95
- uri = "mongodb://#{username}@#{ENV['MONGODB_GSSAPI_HOST']}:#{ENV['MONGODB_GSSAPI_PORT']}/?" +
96
- "authMechanism=GSSAPI&authMechanismProperties=SERVICE_NAME:example"
97
- client = @client.class.from_uri(uri)
98
- assert_raise_error Mongo::AuthenticationError do
99
- client[MONGODB_GSSAPI_DB].command(:dbstats => 1)
100
- end
101
- end
102
-
103
- def test_extra_opts
104
- extra_opts = { :service_name => 'example', :canonicalize_host_name => true,
105
- :service_realm => 'dumdum' }
106
- client = Mongo::MongoClient.new(TEST_HOST, MONGODB_GSSAPI_PORT)
107
- set_system_properties
108
-
109
- Mongo::Sasl::GSSAPI.expects(:authenticate).with do |username, client, socket, opts|
110
- assert_equal opts[:service_name], extra_opts[:service_name]
111
- assert_equal opts[:canonicalize_host_name], extra_opts[:canonicalize_host_name]
112
- assert_equal opts[:service_realm], extra_opts[:service_realm]
113
- [ username, client, socket, opts ]
114
- end.returns('ok' => true )
115
- client[MONGODB_GSSAPI_DB].authenticate(MONGODB_GSSAPI_USER, nil, nil, nil, 'GSSAPI', extra_opts)
116
- end
117
-
118
- def test_extra_opts_uri
119
- extra_opts = { :service_name => 'example', :canonicalize_host_name => true,
120
- :service_realm => 'dumdum' }
121
- set_system_properties
122
-
123
- Mongo::Sasl::GSSAPI.expects(:authenticate).with do |username, client, socket, opts|
124
- assert_equal opts[:service_name], extra_opts[:service_name]
125
- assert_equal opts[:canonicalize_host_name], extra_opts[:canonicalize_host_name]
126
- assert_equal opts[:service_realm], extra_opts[:service_realm]
127
- [ username, client, socket, opts ]
128
- end.returns('ok' => true)
129
-
130
- require 'cgi'
131
- username = CGI::escape(ENV['MONGODB_GSSAPI_USER'])
132
- uri = "mongodb://#{username}@#{ENV['MONGODB_GSSAPI_HOST']}:#{ENV['MONGODB_GSSAPI_PORT']}/?" +
133
- "authMechanism=GSSAPI&authmechanismproperties=SERVICE_NAME:example," +
134
- "CANONICALIZE_HOST_NAME:true,SERVICE_REALM:dumdum"
135
- client = @client.class.from_uri(uri)
136
- client.expects(:receive_message).returns([[{ 'ok' => 1 }], 1, 1])
137
- client[MONGODB_GSSAPI_DB].command(:dbstats => 1)
138
- end
139
-
140
- # In order to run this test, you must set the following environment variable:
141
- #
142
- # export MONGODB_GSSAPI_HOST_IP='---.---.---.---'
143
- #
144
- if ENV.key?('MONGODB_GSSAPI_HOST_IP')
145
- def test_canonicalize_host_name
146
- extra_opts = { :canonicalize_host_name => true }
147
- set_system_properties
148
- client = Mongo::MongoClient.new(ENV['MONGODB_GSSAPI_HOST_IP'], MONGODB_GSSAPI_PORT)
149
-
150
- db = client[MONGODB_GSSAPI_DB]
151
- db.authenticate(MONGODB_GSSAPI_USER, nil, nil, nil, 'GSSAPI', extra_opts)
152
- assert db.command(:dbstats => 1)
153
- end
154
- end
155
-
156
- def test_invalid_extra_options
157
- extra_opts = { :invalid => true, :option => true }
158
- client = Mongo::MongoClient.new(MONGODB_GSSAPI_HOST)
159
-
160
- assert_raise Mongo::MongoArgumentError do
161
- client[MONGODB_GSSAPI_DB].authenticate(MONGODB_GSSAPI_USER, nil, nil, nil, 'GSSAPI', extra_opts)
162
- end
163
- end
164
-
165
- private
166
- def set_system_properties
167
- if RUBY_PLATFORM =~ /java/
168
- java.lang.System.set_property 'javax.security.auth.useSubjectCredsOnly', 'false'
169
- java.lang.System.set_property "java.security.krb5.realm", MONGODB_GSSAPI_REALM
170
- java.lang.System.set_property "java.security.krb5.kdc", MONGODB_GSSAPI_KDC
171
- java.lang.System.set_property "java.security.auth.login.config", JAAS_LOGIN_CONFIG_FILE if JAAS_LOGIN_CONFIG_FILE
172
- end
173
- end
174
- end
175
-
176
- end