mongo 1.12.5 → 2.0.0.beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (437) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CONTRIBUTING.md +64 -0
  5. data/LICENSE +1 -1
  6. data/README.md +23 -125
  7. data/Rakefile +26 -21
  8. data/bin/mongo_console +6 -38
  9. data/lib/mongo.rb +23 -82
  10. data/lib/mongo/address.rb +111 -0
  11. data/lib/mongo/address/ipv4.rb +85 -0
  12. data/lib/mongo/address/ipv6.rb +85 -0
  13. data/lib/mongo/address/unix.rb +76 -0
  14. data/lib/mongo/auth.rb +108 -0
  15. data/lib/mongo/auth/cr.rb +44 -0
  16. data/lib/mongo/auth/cr/conversation.rb +119 -0
  17. data/lib/mongo/auth/executable.rb +52 -0
  18. data/lib/mongo/auth/ldap.rb +48 -0
  19. data/lib/mongo/auth/ldap/conversation.rb +92 -0
  20. data/lib/mongo/auth/roles.rb +104 -0
  21. data/lib/mongo/auth/scram.rb +53 -0
  22. data/lib/mongo/auth/scram/conversation.rb +450 -0
  23. data/lib/mongo/auth/user.rb +159 -0
  24. data/lib/mongo/auth/user/view.rb +102 -0
  25. data/lib/mongo/auth/x509.rb +48 -0
  26. data/lib/mongo/auth/x509/conversation.rb +92 -0
  27. data/lib/mongo/{gridfs.rb → bulk.rb} +2 -5
  28. data/lib/mongo/bulk/bulk_write.rb +307 -0
  29. data/lib/mongo/client.rb +233 -0
  30. data/lib/mongo/cluster.rb +203 -0
  31. data/lib/mongo/cluster/topology.rb +60 -0
  32. data/lib/mongo/cluster/topology/replica_set.rb +160 -0
  33. data/lib/mongo/cluster/topology/sharded.rb +132 -0
  34. data/lib/mongo/cluster/topology/standalone.rb +132 -0
  35. data/lib/mongo/cluster/topology/unknown.rb +155 -0
  36. data/lib/mongo/collection.rb +130 -1101
  37. data/lib/mongo/collection/view.rb +169 -0
  38. data/lib/mongo/collection/view/aggregation.rb +108 -0
  39. data/lib/mongo/collection/view/explainable.rb +49 -0
  40. data/lib/mongo/collection/view/immutable.rb +43 -0
  41. data/lib/mongo/collection/view/iterable.rb +48 -0
  42. data/lib/mongo/collection/view/map_reduce.rb +191 -0
  43. data/lib/mongo/collection/view/readable.rb +363 -0
  44. data/lib/mongo/collection/view/writable.rb +169 -0
  45. data/lib/mongo/cursor.rb +79 -680
  46. data/lib/mongo/database.rb +224 -0
  47. data/lib/mongo/database/view.rb +101 -0
  48. data/lib/mongo/error.rb +81 -0
  49. data/lib/mongo/error/bulk_write_failure.rb +41 -0
  50. data/lib/mongo/{utils/thread_local_variable_manager.rb → error/empty_batch.rb} +22 -8
  51. data/{test/functional/db_connection_test.rb → lib/mongo/error/invalid_bulk_operation.rb} +19 -8
  52. data/lib/mongo/error/invalid_collection_name.rb +39 -0
  53. data/lib/mongo/error/invalid_database_name.rb +39 -0
  54. data/{test/replica_set/ssl_test.rb → lib/mongo/error/invalid_document.rb} +21 -14
  55. data/lib/mongo/error/invalid_file.rb +38 -0
  56. data/lib/mongo/error/invalid_nonce.rb +46 -0
  57. data/lib/mongo/error/invalid_replacement_document.rb +39 -0
  58. data/lib/mongo/error/invalid_signature.rb +47 -0
  59. data/{test/functional/ssl_test.rb → lib/mongo/error/invalid_update_document.rb} +22 -12
  60. data/lib/mongo/error/max_bson_size.rb +40 -0
  61. data/lib/mongo/error/max_message_size.rb +42 -0
  62. data/lib/mongo/{utils.rb → error/need_primary_server.rb} +10 -6
  63. data/lib/mongo/{connection.rb → error/operation_failure.rb} +10 -6
  64. data/lib/mongo/error/parser.rb +77 -0
  65. data/lib/mongo/{connection/socket.rb → error/socket_error.rb} +10 -5
  66. data/lib/mongo/error/socket_timeout_error.rb +23 -0
  67. data/lib/mongo/error/unsupported_features.rb +43 -0
  68. data/lib/mongo/event.rb +40 -0
  69. data/lib/mongo/event/listeners.rb +63 -0
  70. data/lib/mongo/event/primary_elected.rb +53 -0
  71. data/lib/mongo/event/publisher.rb +42 -0
  72. data/lib/mongo/event/server_added.rb +53 -0
  73. data/lib/mongo/event/server_removed.rb +53 -0
  74. data/lib/mongo/event/subscriber.rb +41 -0
  75. data/lib/mongo/grid.rb +16 -0
  76. data/lib/mongo/grid/file.rb +94 -0
  77. data/lib/mongo/grid/file/chunk.rb +184 -0
  78. data/lib/mongo/grid/file/metadata.rb +223 -0
  79. data/lib/mongo/grid/fs.rb +149 -0
  80. data/lib/mongo/index.rb +64 -0
  81. data/lib/mongo/index/view.rb +205 -0
  82. data/lib/mongo/loggable.rb +126 -0
  83. data/lib/mongo/logger.rb +132 -0
  84. data/lib/mongo/operation.rb +26 -0
  85. data/lib/mongo/operation/aggregate.rb +100 -0
  86. data/lib/mongo/operation/aggregate/result.rb +84 -0
  87. data/lib/mongo/operation/batchable.rb +103 -0
  88. data/lib/mongo/operation/bulk_delete/result.rb +197 -0
  89. data/lib/mongo/operation/bulk_insert/result.rb +195 -0
  90. data/lib/mongo/operation/bulk_update/result.rb +295 -0
  91. data/lib/mongo/operation/command.rb +62 -0
  92. data/lib/mongo/operation/executable.rb +105 -0
  93. data/lib/mongo/operation/kill_cursors.rb +39 -0
  94. data/lib/mongo/operation/limited.rb +37 -0
  95. data/lib/mongo/operation/list_collections/result.rb +116 -0
  96. data/lib/mongo/operation/list_indexes/result.rb +118 -0
  97. data/lib/mongo/operation/map_reduce.rb +96 -0
  98. data/lib/mongo/operation/map_reduce/result.rb +122 -0
  99. data/lib/mongo/{functional.rb → operation/read.rb} +7 -7
  100. data/lib/mongo/operation/read/collections_info.rb +67 -0
  101. data/lib/mongo/operation/read/get_more.rb +71 -0
  102. data/lib/mongo/operation/read/indexes.rb +68 -0
  103. data/lib/mongo/operation/read/list_collections.rb +75 -0
  104. data/lib/mongo/operation/read/list_indexes.rb +77 -0
  105. data/lib/mongo/operation/read/query.rb +71 -0
  106. data/lib/mongo/operation/read_preferrable.rb +34 -0
  107. data/lib/mongo/operation/result.rb +259 -0
  108. data/lib/mongo/operation/specifiable.rb +380 -0
  109. data/lib/mongo/operation/write.rb +25 -0
  110. data/lib/mongo/operation/write/bulk_delete.rb +158 -0
  111. data/lib/mongo/operation/write/bulk_insert.rb +160 -0
  112. data/lib/mongo/operation/write/bulk_update.rb +167 -0
  113. data/lib/mongo/{connection/socket/socket_util.rb → operation/write/command.rb} +9 -24
  114. data/lib/mongo/operation/write/command/create_user.rb +43 -0
  115. data/lib/mongo/operation/write/command/delete.rb +56 -0
  116. data/lib/mongo/operation/write/command/drop_index.rb +51 -0
  117. data/lib/mongo/operation/write/command/ensure_index.rb +55 -0
  118. data/lib/mongo/operation/write/command/insert.rb +55 -0
  119. data/lib/mongo/operation/write/command/remove_user.rb +42 -0
  120. data/lib/mongo/operation/write/command/update.rb +60 -0
  121. data/lib/mongo/operation/write/command/writable.rb +61 -0
  122. data/lib/mongo/operation/write/create_index.rb +84 -0
  123. data/lib/mongo/operation/write/create_user.rb +75 -0
  124. data/lib/mongo/operation/write/delete.rb +91 -0
  125. data/lib/mongo/operation/write/drop_index.rb +62 -0
  126. data/lib/mongo/operation/write/insert.rb +88 -0
  127. data/lib/mongo/operation/write/remove_user.rb +70 -0
  128. data/lib/mongo/operation/write/update.rb +98 -0
  129. data/lib/mongo/protocol.rb +15 -0
  130. data/lib/mongo/protocol/bit_vector.rb +61 -0
  131. data/lib/mongo/protocol/delete.rb +94 -0
  132. data/lib/mongo/protocol/get_more.rb +99 -0
  133. data/lib/mongo/protocol/insert.rb +99 -0
  134. data/lib/mongo/protocol/kill_cursors.rb +74 -0
  135. data/lib/mongo/protocol/message.rb +252 -0
  136. data/lib/mongo/protocol/query.rb +147 -0
  137. data/lib/mongo/protocol/reply.rb +72 -0
  138. data/lib/mongo/protocol/serializers.rb +180 -0
  139. data/lib/mongo/protocol/update.rb +111 -0
  140. data/lib/mongo/server.rb +163 -0
  141. data/lib/mongo/server/connectable.rb +99 -0
  142. data/lib/mongo/server/connection.rb +133 -0
  143. data/lib/mongo/server/connection_pool.rb +141 -0
  144. data/lib/mongo/server/connection_pool/queue.rb +182 -0
  145. data/lib/mongo/server/context.rb +66 -0
  146. data/lib/mongo/server/description.rb +450 -0
  147. data/lib/mongo/server/description/features.rb +85 -0
  148. data/lib/mongo/server/description/inspector.rb +79 -0
  149. data/lib/mongo/server/description/inspector/primary_elected.rb +58 -0
  150. data/lib/mongo/server/description/inspector/server_added.rb +59 -0
  151. data/lib/mongo/server/description/inspector/server_removed.rb +59 -0
  152. data/lib/mongo/server/monitor.rb +160 -0
  153. data/lib/mongo/server/monitor/connection.rb +88 -0
  154. data/lib/mongo/server_selector.rb +81 -0
  155. data/lib/mongo/server_selector/nearest.rb +94 -0
  156. data/lib/mongo/server_selector/primary.rb +88 -0
  157. data/lib/mongo/server_selector/primary_preferred.rb +94 -0
  158. data/lib/mongo/server_selector/secondary.rb +91 -0
  159. data/lib/mongo/server_selector/secondary_preferred.rb +96 -0
  160. data/lib/mongo/server_selector/selectable.rb +209 -0
  161. data/lib/mongo/socket.rb +179 -0
  162. data/lib/mongo/socket/ssl.rb +108 -0
  163. data/lib/mongo/socket/tcp.rb +69 -0
  164. data/lib/mongo/socket/unix.rb +66 -0
  165. data/lib/mongo/uri.rb +504 -0
  166. data/lib/mongo/version.rb +21 -0
  167. data/lib/mongo/write_concern.rb +99 -0
  168. data/lib/mongo/write_concern/acknowledged.rb +38 -0
  169. data/lib/mongo/write_concern/normalizable.rb +73 -0
  170. data/lib/mongo/write_concern/unacknowledged.rb +43 -0
  171. data/mongo.gemspec +17 -14
  172. data/spec/mongo/address/ipv4_spec.rb +74 -0
  173. data/spec/mongo/address/ipv6_spec.rb +74 -0
  174. data/spec/mongo/address/unix_spec.rb +30 -0
  175. data/spec/mongo/address_spec.rb +206 -0
  176. data/spec/mongo/auth/cr_spec.rb +59 -0
  177. data/spec/mongo/auth/ldap_spec.rb +40 -0
  178. data/spec/mongo/auth/scram/conversation_spec.rb +197 -0
  179. data/spec/mongo/auth/scram_spec.rb +55 -0
  180. data/spec/mongo/auth/user/view_spec.rb +76 -0
  181. data/spec/mongo/auth/user_spec.rb +190 -0
  182. data/spec/mongo/auth/x509_spec.rb +40 -0
  183. data/spec/mongo/auth_spec.rb +65 -0
  184. data/spec/mongo/bulk/bulk_write_spec.rb +175 -0
  185. data/spec/mongo/client_spec.rb +564 -0
  186. data/spec/mongo/cluster/topology/replica_set_spec.rb +101 -0
  187. data/spec/mongo/cluster/topology/sharded_spec.rb +74 -0
  188. data/spec/mongo/cluster/topology/standalone_spec.rb +79 -0
  189. data/spec/mongo/cluster/topology_spec.rb +65 -0
  190. data/spec/mongo/cluster_spec.rb +129 -0
  191. data/spec/mongo/collection/view/aggregation_spec.rb +135 -0
  192. data/spec/mongo/collection/view/explainable_spec.rb +32 -0
  193. data/spec/mongo/collection/view/map_reduce_spec.rb +242 -0
  194. data/spec/mongo/collection/view/readable_spec.rb +603 -0
  195. data/spec/mongo/collection/view/writable_spec.rb +504 -0
  196. data/spec/mongo/collection/view_spec.rb +521 -0
  197. data/spec/mongo/collection_spec.rb +362 -0
  198. data/spec/mongo/cursor_spec.rb +295 -0
  199. data/spec/mongo/database_spec.rb +306 -0
  200. data/spec/mongo/error/parser_spec.rb +119 -0
  201. data/spec/mongo/event/publisher_spec.rb +50 -0
  202. data/spec/mongo/event/subscriber_spec.rb +34 -0
  203. data/spec/mongo/grid/file/chunk_spec.rb +226 -0
  204. data/spec/mongo/grid/file/metadata_spec.rb +69 -0
  205. data/spec/mongo/grid/file_spec.rb +138 -0
  206. data/spec/mongo/grid/fs_spec.rb +129 -0
  207. data/spec/mongo/index/view_spec.rb +226 -0
  208. data/spec/mongo/loggable_spec.rb +62 -0
  209. data/spec/mongo/logger_spec.rb +97 -0
  210. data/spec/mongo/operation/aggregate/result_spec.rb +80 -0
  211. data/spec/mongo/operation/aggregate_spec.rb +135 -0
  212. data/spec/mongo/operation/command_spec.rb +106 -0
  213. data/spec/mongo/operation/kill_cursors_spec.rb +66 -0
  214. data/spec/mongo/operation/limited_spec.rb +50 -0
  215. data/spec/mongo/operation/map_reduce_spec.rb +143 -0
  216. data/spec/mongo/operation/read/collections_info_spec.rb +40 -0
  217. data/spec/mongo/operation/read/get_more_spec.rb +81 -0
  218. data/spec/mongo/operation/read/indexes_spec.rb +31 -0
  219. data/spec/mongo/operation/read/query_spec.rb +84 -0
  220. data/spec/mongo/operation/result_spec.rb +275 -0
  221. data/spec/mongo/operation/specifiable_spec.rb +53 -0
  222. data/spec/mongo/operation/write/bulk_delete_spec.rb +473 -0
  223. data/spec/mongo/operation/write/bulk_insert_spec.rb +466 -0
  224. data/spec/mongo/operation/write/bulk_update_spec.rb +524 -0
  225. data/spec/mongo/operation/write/command/delete_spec.rb +116 -0
  226. data/spec/mongo/operation/write/command/insert_spec.rb +117 -0
  227. data/spec/mongo/operation/write/command/update_spec.rb +123 -0
  228. data/spec/mongo/operation/write/create_user_spec.rb +44 -0
  229. data/spec/mongo/operation/write/delete_spec.rb +178 -0
  230. data/spec/mongo/operation/write/drop_index_spec.rb +51 -0
  231. data/spec/mongo/operation/write/ensure_index_spec.rb +81 -0
  232. data/spec/mongo/operation/write/insert_spec.rb +231 -0
  233. data/spec/mongo/operation/write/remove_user_spec.rb +46 -0
  234. data/spec/mongo/operation/write/response_spec.rb +85 -0
  235. data/spec/mongo/operation/write/update_spec.rb +177 -0
  236. data/spec/mongo/protocol/delete_spec.rb +167 -0
  237. data/spec/mongo/protocol/get_more_spec.rb +146 -0
  238. data/spec/mongo/protocol/insert_spec.rb +161 -0
  239. data/spec/mongo/protocol/kill_cursors_spec.rb +101 -0
  240. data/spec/mongo/protocol/query_spec.rb +285 -0
  241. data/spec/mongo/protocol/reply_spec.rb +157 -0
  242. data/spec/mongo/protocol/update_spec.rb +186 -0
  243. data/spec/mongo/server/connection_pool/queue_spec.rb +170 -0
  244. data/spec/mongo/server/connection_pool_spec.rb +120 -0
  245. data/spec/mongo/server/connection_spec.rb +289 -0
  246. data/spec/mongo/server/description/features_spec.rb +138 -0
  247. data/spec/mongo/server/description/inspector/primary_elected_spec.rb +94 -0
  248. data/spec/mongo/server/description/inspector/server_added_spec.rb +92 -0
  249. data/spec/mongo/server/description/inspector/server_removed_spec.rb +95 -0
  250. data/spec/mongo/server/description_spec.rb +510 -0
  251. data/spec/mongo/server/monitor_spec.rb +130 -0
  252. data/spec/mongo/server_discovery_and_monitoring_spec.rb +103 -0
  253. data/spec/mongo/server_selection_rtt_spec.rb +104 -0
  254. data/spec/mongo/server_selection_spec.rb +89 -0
  255. data/spec/mongo/server_selector/nearest_spec.rb +250 -0
  256. data/spec/mongo/server_selector/primary_preferred_spec.rb +290 -0
  257. data/spec/mongo/server_selector/primary_spec.rb +114 -0
  258. data/spec/mongo/server_selector/secondary_preferred_spec.rb +252 -0
  259. data/spec/mongo/server_selector/secondary_spec.rb +196 -0
  260. data/spec/mongo/server_selector_spec.rb +101 -0
  261. data/spec/mongo/server_spec.rb +131 -0
  262. data/spec/mongo/uri_spec.rb +517 -0
  263. data/spec/mongo/write_concern/acknowledged_spec.rb +44 -0
  264. data/spec/mongo/write_concern/unacknowledged_spec.rb +15 -0
  265. data/spec/mongo_orchestration_spec.rb +70 -0
  266. data/spec/spec_helper.rb +148 -0
  267. data/spec/support/authorization.rb +245 -0
  268. data/spec/support/helpers.rb +140 -0
  269. data/spec/support/matchers.rb +37 -0
  270. data/spec/support/mongo_orchestration.rb +61 -0
  271. data/spec/support/mongo_orchestration/requestable.rb +109 -0
  272. data/spec/support/mongo_orchestration/standalone.rb +57 -0
  273. data/spec/support/sdam/rs/discover_arbiters.yml +41 -0
  274. data/spec/support/sdam/rs/discover_passives.yml +41 -0
  275. data/spec/support/sdam/rs/discover_primary.yml +40 -0
  276. data/spec/support/sdam/rs/discover_secondary.yml +41 -0
  277. data/spec/support/sdam/rs/discovery.yml +195 -0
  278. data/spec/support/sdam/rs/ghost_discovered.yml +39 -0
  279. data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +34 -0
  280. data/spec/support/sdam/rs/member_reconfig.yml +68 -0
  281. data/spec/support/sdam/rs/member_standalone.yml +60 -0
  282. data/spec/support/sdam/rs/new_primary.yml +74 -0
  283. data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +71 -0
  284. data/spec/support/sdam/rs/non_rs_member.yml +31 -0
  285. data/spec/support/sdam/rs/normalize_case.yml +49 -0
  286. data/spec/support/sdam/rs/primary_becomes_standalone.yml +52 -0
  287. data/spec/support/sdam/rs/primary_changes_set_name.yml +57 -0
  288. data/spec/support/sdam/rs/primary_disconnect.yml +56 -0
  289. data/spec/support/sdam/rs/primary_wrong_set_name.yml +27 -0
  290. data/spec/support/sdam/rs/response_from_removed.yml +63 -0
  291. data/spec/support/sdam/rs/rsother_discovered.yml +41 -0
  292. data/spec/support/sdam/rs/sec_not_auth.yml +49 -0
  293. data/spec/support/sdam/rs/secondary_wrong_set_name.yml +28 -0
  294. data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +69 -0
  295. data/spec/support/sdam/rs/unexpected_mongos.yml +26 -0
  296. data/spec/support/sdam/rs/wrong_set_name.yml +35 -0
  297. data/spec/support/sdam/sharded/multiple_mongoses.yml +46 -0
  298. data/spec/support/sdam/sharded/non_mongos_removed.yml +41 -0
  299. data/spec/support/sdam/sharded/normalize_uri_case.yml +32 -0
  300. data/spec/support/sdam/single/direct_connection_external_ip.yml +34 -0
  301. data/spec/support/sdam/single/direct_connection_mongos.yml +33 -0
  302. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +35 -0
  303. data/spec/support/sdam/single/direct_connection_rsprimary.yml +34 -0
  304. data/spec/support/sdam/single/direct_connection_rssecondary.yml +35 -0
  305. data/spec/support/sdam/single/direct_connection_slave.yml +32 -0
  306. data/spec/support/sdam/single/direct_connection_standalone.yml +32 -0
  307. data/spec/support/sdam/single/not_ok_response.yml +39 -0
  308. data/spec/support/sdam/single/standalone_removed.yml +32 -0
  309. data/spec/support/sdam/single/unavailable_seed.yml +28 -0
  310. data/spec/support/server_discovery_and_monitoring.rb +167 -0
  311. data/spec/support/server_selection.rb +140 -0
  312. data/spec/support/server_selection/rtt/first_value.yml +4 -0
  313. data/spec/support/server_selection/rtt/first_value_zero.yml +4 -0
  314. data/spec/support/server_selection/rtt/value_test_1.yml +4 -0
  315. data/spec/support/server_selection/rtt/value_test_2.yml +4 -0
  316. data/spec/support/server_selection/rtt/value_test_3.yml +4 -0
  317. data/spec/support/server_selection/rtt/value_test_4.yml +4 -0
  318. data/spec/support/server_selection/rtt/value_test_5.yml +4 -0
  319. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +32 -0
  320. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +27 -0
  321. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +23 -0
  322. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +32 -0
  323. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +27 -0
  324. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +32 -0
  325. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +32 -0
  326. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +27 -0
  327. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +27 -0
  328. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +41 -0
  329. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +34 -0
  330. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +33 -0
  331. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +39 -0
  332. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +36 -0
  333. data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +32 -0
  334. data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +23 -0
  335. data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +13 -0
  336. data/spec/support/server_selection_rtt.rb +41 -0
  337. data/spec/support/shared/bulk_write.rb +498 -0
  338. data/spec/support/shared/cursor.rb +38 -0
  339. data/spec/support/shared/operation.rb +77 -0
  340. data/spec/support/shared/protocol.rb +31 -0
  341. data/spec/support/shared/server_selector.rb +111 -0
  342. data/spec/support/shared/socket.rb +82 -0
  343. data/spec/support/travis.rb +14 -0
  344. metadata +523 -189
  345. metadata.gz.sig +0 -0
  346. data/VERSION +0 -1
  347. data/lib/mongo/bulk_write_collection_view.rb +0 -387
  348. data/lib/mongo/collection_writer.rb +0 -364
  349. data/lib/mongo/connection/node.rb +0 -249
  350. data/lib/mongo/connection/pool.rb +0 -340
  351. data/lib/mongo/connection/pool_manager.rb +0 -320
  352. data/lib/mongo/connection/sharding_pool_manager.rb +0 -67
  353. data/lib/mongo/connection/socket/ssl_socket.rb +0 -95
  354. data/lib/mongo/connection/socket/tcp_socket.rb +0 -87
  355. data/lib/mongo/connection/socket/unix_socket.rb +0 -39
  356. data/lib/mongo/db.rb +0 -808
  357. data/lib/mongo/exception.rb +0 -145
  358. data/lib/mongo/functional/authentication.rb +0 -455
  359. data/lib/mongo/functional/logging.rb +0 -85
  360. data/lib/mongo/functional/read_preference.rb +0 -183
  361. data/lib/mongo/functional/scram.rb +0 -556
  362. data/lib/mongo/functional/uri_parser.rb +0 -409
  363. data/lib/mongo/functional/write_concern.rb +0 -66
  364. data/lib/mongo/gridfs/grid.rb +0 -112
  365. data/lib/mongo/gridfs/grid_ext.rb +0 -53
  366. data/lib/mongo/gridfs/grid_file_system.rb +0 -163
  367. data/lib/mongo/gridfs/grid_io.rb +0 -484
  368. data/lib/mongo/legacy.rb +0 -140
  369. data/lib/mongo/mongo_client.rb +0 -697
  370. data/lib/mongo/mongo_replica_set_client.rb +0 -535
  371. data/lib/mongo/mongo_sharded_client.rb +0 -159
  372. data/lib/mongo/networking.rb +0 -372
  373. data/lib/mongo/utils/conversions.rb +0 -110
  374. data/lib/mongo/utils/core_ext.rb +0 -70
  375. data/lib/mongo/utils/server_version.rb +0 -69
  376. data/lib/mongo/utils/support.rb +0 -80
  377. data/test/functional/authentication_test.rb +0 -39
  378. data/test/functional/bulk_api_stress_test.rb +0 -133
  379. data/test/functional/bulk_write_collection_view_test.rb +0 -1198
  380. data/test/functional/client_test.rb +0 -627
  381. data/test/functional/collection_test.rb +0 -2175
  382. data/test/functional/collection_writer_test.rb +0 -83
  383. data/test/functional/conversions_test.rb +0 -163
  384. data/test/functional/cursor_fail_test.rb +0 -57
  385. data/test/functional/cursor_message_test.rb +0 -56
  386. data/test/functional/cursor_test.rb +0 -683
  387. data/test/functional/db_api_test.rb +0 -835
  388. data/test/functional/db_test.rb +0 -348
  389. data/test/functional/grid_file_system_test.rb +0 -285
  390. data/test/functional/grid_io_test.rb +0 -252
  391. data/test/functional/grid_test.rb +0 -273
  392. data/test/functional/pool_test.rb +0 -136
  393. data/test/functional/safe_test.rb +0 -98
  394. data/test/functional/support_test.rb +0 -62
  395. data/test/functional/timeout_test.rb +0 -60
  396. data/test/functional/uri_test.rb +0 -446
  397. data/test/functional/write_concern_test.rb +0 -118
  398. data/test/helpers/general.rb +0 -50
  399. data/test/helpers/test_unit.rb +0 -476
  400. data/test/replica_set/authentication_test.rb +0 -37
  401. data/test/replica_set/basic_test.rb +0 -189
  402. data/test/replica_set/client_test.rb +0 -393
  403. data/test/replica_set/connection_test.rb +0 -138
  404. data/test/replica_set/count_test.rb +0 -66
  405. data/test/replica_set/cursor_test.rb +0 -220
  406. data/test/replica_set/insert_test.rb +0 -157
  407. data/test/replica_set/max_values_test.rb +0 -151
  408. data/test/replica_set/pinning_test.rb +0 -105
  409. data/test/replica_set/query_test.rb +0 -73
  410. data/test/replica_set/read_preference_test.rb +0 -219
  411. data/test/replica_set/refresh_test.rb +0 -211
  412. data/test/replica_set/replication_ack_test.rb +0 -95
  413. data/test/sharded_cluster/basic_test.rb +0 -203
  414. data/test/shared/authentication/basic_auth_shared.rb +0 -260
  415. data/test/shared/authentication/bulk_api_auth_shared.rb +0 -249
  416. data/test/shared/authentication/gssapi_shared.rb +0 -176
  417. data/test/shared/authentication/sasl_plain_shared.rb +0 -96
  418. data/test/shared/authentication/scram_shared.rb +0 -92
  419. data/test/shared/ssl_shared.rb +0 -235
  420. data/test/test_helper.rb +0 -61
  421. data/test/threading/basic_test.rb +0 -120
  422. data/test/tools/mongo_config.rb +0 -708
  423. data/test/tools/mongo_config_test.rb +0 -160
  424. data/test/unit/client_test.rb +0 -381
  425. data/test/unit/collection_test.rb +0 -166
  426. data/test/unit/connection_test.rb +0 -335
  427. data/test/unit/cursor_test.rb +0 -307
  428. data/test/unit/db_test.rb +0 -136
  429. data/test/unit/grid_test.rb +0 -76
  430. data/test/unit/mongo_sharded_client_test.rb +0 -48
  431. data/test/unit/node_test.rb +0 -93
  432. data/test/unit/pool_manager_test.rb +0 -111
  433. data/test/unit/read_pref_test.rb +0 -406
  434. data/test/unit/read_test.rb +0 -159
  435. data/test/unit/safe_test.rb +0 -158
  436. data/test/unit/sharding_pool_manager_test.rb +0 -84
  437. data/test/unit/write_concern_test.rb +0 -175
@@ -1,83 +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
- module Mongo
18
- class Collection
19
- public :batch_write
20
- end
21
- class CollectionWriter
22
- public :sort_by_first_sym, :ordered_group_by_first
23
- end
24
- end
25
-
26
- class CollectionWriterTest < Test::Unit::TestCase
27
-
28
- DATABASE_NAME = 'ruby_test_collection_writer'
29
- COLLECTION_NAME = 'test'
30
-
31
- def default_setup
32
- @client = MongoClient.from_uri(TEST_URI)
33
- @db = @client[DATABASE_NAME]
34
- @collection = @db[COLLECTION_NAME]
35
- @collection.drop
36
- end
37
-
38
- context "Bulk API Execute" do
39
- setup do
40
- default_setup
41
- end
42
-
43
- should "sort_by_first_sym for grouping unordered ops" do
44
- pairs = [
45
- [:insert, {:n => 0}],
46
- [:update, {:n => 1}], [:update, {:n => 2}],
47
- [:delete, {:n => 3}],
48
- [:insert, {:n => 5}], [:insert, {:n => 6}], [:insert, {:n => 7}],
49
- [:update, {:n => 8}],
50
- [:delete, {:n => 9}], [:delete, {:n => 10}]
51
- ]
52
- result = @collection.command_writer.sort_by_first_sym(pairs)
53
- expected = [
54
- :delete, :delete, :delete,
55
- :insert, :insert, :insert, :insert,
56
- :update, :update, :update
57
- ]
58
- assert_equal expected, result.collect{|first, rest| first}
59
- end
60
-
61
- should "calculate ordered_group_by_first" do
62
- pairs = [
63
- [:insert, {:n => 0}],
64
- [:update, {:n => 1}], [:update, {:n => 2}],
65
- [:delete, {:n => 3}],
66
- [:insert, {:n => 5}], [:insert, {:n => 6}], [:insert, {:n => 7}],
67
- [:update, {:n => 8}],
68
- [:delete, {:n => 9}], [:delete, {:n => 10}]
69
- ]
70
- result = @collection.command_writer.ordered_group_by_first(pairs)
71
- expected = [
72
- [:insert, [{:n => 0}]],
73
- [:update, [{:n => 1}, {:n => 2}]],
74
- [:delete, [{:n => 3}]],
75
- [:insert, [{:n => 5}, {:n => 6}, {:n => 7}]],
76
- [:update, [{:n => 8}]],
77
- [:delete, [{:n => 9}, {:n => 10}]]
78
- ]
79
- assert_equal expected, result
80
- end
81
-
82
- end
83
- end
@@ -1,163 +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 ConversionsTest < Test::Unit::TestCase
18
- include Mongo::Conversions
19
-
20
- def test_array_as_sort_parameters_with_array_of_key_and_value
21
- params = array_as_sort_parameters(["field1", "asc"])
22
- assert_equal({"field1" => 1}, params)
23
- end
24
-
25
- def test_array_as_sort_parameters_with_array_of_string_and_values
26
- params = array_as_sort_parameters([["field1", :asc], ["field2", :desc]])
27
- assert_equal({ "field1" => 1, "field2" => -1 }, params)
28
- end
29
-
30
- def test_array_as_sort_parameters_with_array_of_key_and_hash
31
- params = array_as_sort_parameters(["score", {"$meta" => "textScore"}])
32
- assert_equal({"score" => {"$meta" => "textScore"}}, params)
33
- end
34
-
35
- def test_array_as_sort_parameters_with_array_of_key_and_hashes
36
- params = array_as_sort_parameters([["field1", :asc],["score", {"$meta" => "textScore"}]])
37
- assert_equal({"field1" => 1, "score" => {"$meta" => "textScore"}}, params)
38
- end
39
-
40
- def test_hash_as_sort_parameters_with_string
41
- sort = BSON::OrderedHash["field", "asc"]
42
- params = hash_as_sort_parameters(sort)
43
- assert_equal({"field" => 1}, params)
44
- end
45
-
46
- def test_hash_as_sort_parameters_with_hash
47
- sort = BSON::OrderedHash["score", {"$meta" => "textScore"}]
48
- params = hash_as_sort_parameters(sort)
49
- assert_equal({"score" => {"$meta" => "textScore"}}, params)
50
- end
51
-
52
- def test_hash_as_sort_parameters_with_hash_and_string
53
- sort = BSON::OrderedHash["score", {"$meta" => "textScore"}, "field", "asc"]
54
- params = hash_as_sort_parameters(sort)
55
- assert_equal({ "score" => {"$meta" => "textScore"}, "field" => 1 }, params)
56
- end
57
-
58
- def test_string_as_sort_parameters_with_string
59
- params = string_as_sort_parameters("field")
60
- assert_equal({ "field" => 1 }, params)
61
- end
62
-
63
- def test_string_as_sort_parameters_with_empty_string
64
- params = string_as_sort_parameters("")
65
- assert_equal({}, params)
66
- end
67
-
68
- def test_symbol_as_sort_parameters
69
- params = string_as_sort_parameters(:field)
70
- assert_equal({ "field" => 1 }, params)
71
- end
72
-
73
- def test_sort_value_when_value_is_one
74
- assert_equal 1, sort_value(1)
75
- end
76
-
77
- def test_sort_value_when_value_is_one_as_a_string
78
- assert_equal 1, sort_value("1")
79
- end
80
-
81
- def test_sort_value_when_value_is_negative_one
82
- assert_equal(-1, sort_value(-1))
83
- end
84
-
85
- def test_sort_value_when_value_is_negative_one_as_a_string
86
- assert_equal(-1, sort_value("-1"))
87
- end
88
-
89
- def test_sort_value_when_value_is_ascending
90
- assert_equal 1, sort_value("ascending")
91
- end
92
-
93
- def test_sort_value_when_value_is_asc
94
- assert_equal 1, sort_value("asc")
95
- end
96
-
97
- def test_sort_value_when_value_is_uppercase_ascending
98
- assert_equal 1, sort_value("ASCENDING")
99
- end
100
-
101
- def test_sort_value_when_value_is_uppercase_asc
102
- assert_equal 1, sort_value("ASC")
103
- end
104
-
105
- def test_sort_value_when_value_is_symbol_ascending
106
- assert_equal 1, sort_value(:ascending)
107
- end
108
-
109
- def test_sort_value_when_value_is_symbol_asc
110
- assert_equal 1, sort_value(:asc)
111
- end
112
-
113
- def test_sort_value_when_value_is_symbol_uppercase_ascending
114
- assert_equal 1, sort_value(:ASCENDING)
115
- end
116
-
117
- def test_sort_value_when_value_is_symbol_uppercase_asc
118
- assert_equal 1, sort_value(:ASC)
119
- end
120
-
121
- def test_sort_value_when_value_is_descending
122
- assert_equal(-1, sort_value("descending"))
123
- end
124
-
125
- def test_sort_value_when_value_is_desc
126
- assert_equal(-1, sort_value("desc"))
127
- end
128
-
129
- def test_sort_value_when_value_is_uppercase_descending
130
- assert_equal(-1, sort_value("DESCENDING"))
131
- end
132
-
133
- def test_sort_value_when_value_is_uppercase_desc
134
- assert_equal(-1, sort_value("DESC"))
135
- end
136
-
137
- def test_sort_value_when_value_is_symbol_descending
138
- assert_equal(-1, sort_value(:descending))
139
- end
140
-
141
- def test_sort_value_when_value_is_symbol_desc
142
- assert_equal(-1, sort_value(:desc))
143
- end
144
-
145
- def test_sort_value_when_value_is_uppercase_symbol_descending
146
- assert_equal(-1, sort_value(:DESCENDING))
147
- end
148
-
149
- def test_sort_value_when_value_is_uppercase_symbol_desc
150
- assert_equal(-1, sort_value(:DESC))
151
- end
152
-
153
- def test_sort_value_when_value_is_hash
154
- assert_equal({"$meta" => "textScore"}, sort_value("$meta" => "textScore"))
155
- end
156
-
157
- def test_sort_value_when_value_is_invalid
158
- assert_raise Mongo::InvalidSortValueError do
159
- sort_value(2)
160
- end
161
- end
162
-
163
- end
@@ -1,57 +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
- require 'logger'
17
-
18
- class CursorFailTest < Test::Unit::TestCase
19
-
20
- include Mongo
21
-
22
- def setup
23
- @connection = standard_connection
24
- @db = @connection[TEST_DB]
25
- end
26
-
27
- def test_refill_via_get_more_alt_coll
28
- coll = @db.collection('test-alt-coll')
29
- coll.remove
30
- coll.insert('a' => 1) # collection not created until it's used
31
- assert_equal 1, coll.count
32
-
33
- 1000.times { |i|
34
- assert_equal 1 + i, coll.count
35
- coll.insert('a' => i)
36
- }
37
-
38
- assert_equal 1001, coll.count
39
- count = 0
40
- coll.find.each { |obj|
41
- count += obj['a']
42
- }
43
- assert_equal 1001, coll.count
44
-
45
- # do the same thing again for debugging
46
- assert_equal 1001, coll.count
47
- count2 = 0
48
- coll.find.each { |obj|
49
- count2 += obj['a']
50
- }
51
- assert_equal 1001, coll.count
52
-
53
- assert_equal count, count2
54
- assert_equal 499501, count
55
- end
56
-
57
- end
@@ -1,56 +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
- require 'logger'
17
-
18
- class CursorMessageTest < Test::Unit::TestCase
19
-
20
- include Mongo
21
-
22
- def setup
23
- @connection = standard_connection
24
- @db = @connection.db(TEST_DB)
25
- @coll = @db.collection('test')
26
- @version = @connection.server_version
27
- @coll.remove
28
- @coll.insert('a' => 1) # collection not created until it's used
29
- @coll_full_name = "#{TEST_DB}.test"
30
- end
31
-
32
- def test_valid_batch_sizes
33
- assert_raise ArgumentError do
34
- @coll.find({}, :batch_size => 1, :limit => 5)
35
- end
36
-
37
- assert_raise ArgumentError do
38
- @coll.find({}, :batch_size => -1, :limit => 5)
39
- end
40
-
41
- assert @coll.find({}, :batch_size => 0, :limit => 5)
42
- end
43
-
44
- def test_batch_size
45
- @coll.remove
46
- 200.times do |n|
47
- @coll.insert({:a => n})
48
- end
49
-
50
- list = @coll.find({}, :batch_size => 2, :limit => 6).to_a
51
- assert_equal 6, list.length
52
-
53
- list = @coll.find({}, :batch_size => 100, :limit => 101).to_a
54
- assert_equal 101, list.length
55
- end
56
- end
@@ -1,683 +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
- require 'logger'
17
-
18
- class CursorTest < Test::Unit::TestCase
19
- include Mongo
20
- include Mongo::Constants
21
-
22
- def setup
23
- @connection = standard_connection
24
- @db = @connection.db(TEST_DB)
25
- @coll = @db.collection('test')
26
- @version = @connection.server_version
27
- @coll.remove
28
- @coll.insert('a' => 1) # collection not created until it's used
29
- @coll_full_name = "#{TEST_DB}.test"
30
- end
31
-
32
- def test_alive
33
- batch = []
34
- 5000.times do |n|
35
- batch << {:a => n}
36
- end
37
-
38
- @coll.insert(batch)
39
- cursor = @coll.find
40
- assert !cursor.alive?
41
- cursor.next
42
- assert cursor.alive?
43
- cursor.close
44
- assert !cursor.alive?
45
- @coll.remove
46
- end
47
-
48
- def test_add_and_remove_options
49
- c = @coll.find
50
- assert_equal 0, c.options & OP_QUERY_EXHAUST
51
- c.add_option(OP_QUERY_EXHAUST)
52
- assert_equal OP_QUERY_EXHAUST, c.options & OP_QUERY_EXHAUST
53
- c.remove_option(OP_QUERY_EXHAUST)
54
- assert_equal 0, c.options & OP_QUERY_EXHAUST
55
-
56
- c.next
57
- assert_raise Mongo::InvalidOperation do
58
- c.add_option(OP_QUERY_EXHAUST)
59
- end
60
-
61
- assert_raise Mongo::InvalidOperation do
62
- c.add_option(OP_QUERY_EXHAUST)
63
- end
64
- end
65
-
66
- def test_exhaust
67
- if @version >= "2.0"
68
- @coll.remove
69
- data = "1" * 10_000
70
- 5000.times do |n|
71
- @coll.insert({:n => n, :data => data})
72
- end
73
-
74
- c = Cursor.new(@coll)
75
- c.add_option(OP_QUERY_EXHAUST)
76
- assert_equal @coll.count, c.to_a.size
77
- assert c.closed?
78
-
79
- c = Cursor.new(@coll)
80
- c.add_option(OP_QUERY_EXHAUST)
81
- 4999.times do
82
- c.next
83
- end
84
- assert c.has_next?
85
- assert c.next
86
- assert !c.has_next?
87
- assert c.closed?
88
-
89
- @coll.remove
90
- end
91
- end
92
-
93
- def test_compile_regex_get_more
94
- return unless defined?(BSON::BSON_RUBY) && BSON::BSON_CODER == BSON::BSON_RUBY
95
- @coll.remove
96
- n_docs = 3
97
- n_docs.times { |n| @coll.insert({ 'n' => /.*/ }) }
98
- cursor = @coll.find({}, :batch_size => (n_docs-1), :compile_regex => false)
99
- cursor.expects(:send_get_more)
100
- cursor.to_a.each do |doc|
101
- assert_kind_of BSON::Regex, doc['n']
102
- end
103
- end
104
-
105
- def test_max_time_ms_error
106
- cursor = @coll.find
107
- cursor.stubs(:send_initial_query).returns(true)
108
-
109
- cursor.instance_variable_set(:@cache, [{
110
- '$err' => 'operation exceeded time limit',
111
- 'code' => 50
112
- }])
113
-
114
- assert_raise ExecutionTimeout do
115
- cursor.to_a
116
- end
117
- end
118
-
119
- def test_max_time_ms
120
- with_forced_timeout(@connection) do
121
- assert_raise ExecutionTimeout do
122
- cursor = @coll.find.max_time_ms(100)
123
- cursor.to_a
124
- end
125
- end
126
- end
127
-
128
- def test_exhaust_after_limit_error
129
- c = Cursor.new(@coll, :limit => 17)
130
- assert_raise MongoArgumentError do
131
- c.add_option(OP_QUERY_EXHAUST)
132
- end
133
-
134
- assert_raise MongoArgumentError do
135
- c.add_option(OP_QUERY_EXHAUST + OP_QUERY_SLAVE_OK)
136
- end
137
- end
138
-
139
- def test_limit_after_exhaust_error
140
- c = Cursor.new(@coll)
141
- c.add_option(OP_QUERY_EXHAUST)
142
- assert_raise MongoArgumentError do
143
- c.limit(17)
144
- end
145
- end
146
-
147
- def test_exhaust_with_mongos
148
- @connection.expects(:mongos?).returns(:true)
149
- c = Cursor.new(@coll)
150
-
151
- assert_raise MongoArgumentError do
152
- c.add_option(OP_QUERY_EXHAUST)
153
- end
154
- end
155
-
156
- def test_inspect
157
- selector = {:a => 1}
158
- cursor = @coll.find(selector)
159
- assert_equal "<Mongo::Cursor:0x#{cursor.object_id.to_s(16)} namespace='#{@db.name}.#{@coll.name}' " +
160
- "@selector=#{selector.inspect} @cursor_id=#{cursor.cursor_id}>", cursor.inspect
161
- end
162
-
163
- def test_explain
164
- cursor = @coll.find('a' => 1)
165
- explanation = cursor.explain
166
- if @version < '2.7'
167
- assert_not_nil explanation['cursor']
168
- assert_kind_of Numeric, explanation['n']
169
- assert_kind_of Numeric, explanation['millis']
170
- assert_kind_of Numeric, explanation['nscanned']
171
- else
172
- cursor = @coll.find('a' => 1)
173
- assert_not_nil explanation
174
- assert explanation.keys.include?('executionStats')
175
- end
176
- end
177
-
178
- def test_each_with_no_block
179
- assert_kind_of(Enumerator, @coll.find().each) if defined? Enumerator
180
- end
181
-
182
- def test_count
183
- @coll.remove
184
-
185
- assert_equal 0, @coll.find().count()
186
-
187
- 10.times do |i|
188
- @coll.save("x" => i)
189
- end
190
-
191
- assert_equal 10, @coll.find().count()
192
- assert_kind_of Integer, @coll.find().count()
193
- assert_equal 10, @coll.find({}, :limit => 5).count()
194
- assert_equal 10, @coll.find({}, :skip => 5).count()
195
-
196
- assert_equal 5, @coll.find({}, :limit => 5).count(true)
197
- assert_equal 5, @coll.find({}, :skip => 5).count(true)
198
- assert_equal 2, @coll.find({}, :skip => 5, :limit => 2).count(true)
199
-
200
- assert_equal 1, @coll.find({"x" => 1}).count()
201
- assert_equal 5, @coll.find({"x" => {"$lt" => 5}}).count()
202
-
203
- a = @coll.find()
204
- b = a.count()
205
- a.each do |doc|
206
- break
207
- end
208
- assert_equal b, a.count()
209
-
210
- assert_equal 0, @db['acollectionthatdoesn'].count()
211
- end
212
-
213
- def test_sort
214
- @coll.remove
215
- 5.times{|x| @coll.insert({"age" => x}) }
216
-
217
- assert_kind_of Cursor, @coll.find().sort(:age, 1)
218
-
219
- assert_equal 0, @coll.find().sort(:age, 1).next_document["age"]
220
- assert_equal 4, @coll.find().sort(:age, -1).next_document["age"]
221
- assert_equal 0, @coll.find().sort([["age", :asc]]).next_document["age"]
222
-
223
- assert_kind_of Cursor, @coll.find().sort([[:age, -1], [:b, 1]])
224
-
225
- assert_equal 4, @coll.find().sort(:age, 1).sort(:age, -1).next_document["age"]
226
- assert_equal 0, @coll.find().sort(:age, -1).sort(:age, 1).next_document["age"]
227
-
228
- assert_equal 4, @coll.find().sort([:age, :asc]).sort(:age, -1).next_document["age"]
229
- assert_equal 0, @coll.find().sort([:age, :desc]).sort(:age, 1).next_document["age"]
230
-
231
- cursor = @coll.find()
232
- cursor.next_document
233
- assert_raise InvalidOperation do
234
- cursor.sort(["age"])
235
- end
236
-
237
- assert_raise InvalidSortValueError do
238
- @coll.find().sort(:age, 25).next_document
239
- end
240
-
241
- assert_raise InvalidSortValueError do
242
- @coll.find().sort(25).next_document
243
- end
244
- end
245
-
246
- def test_sort_date
247
- @coll.remove
248
- 5.times{|x| @coll.insert({"created_at" => Time.utc(2000 + x)}) }
249
-
250
- assert_equal 2000, @coll.find().sort(:created_at, :asc).next_document["created_at"].year
251
- assert_equal 2004, @coll.find().sort(:created_at, :desc).next_document["created_at"].year
252
-
253
- assert_equal 2000, @coll.find().sort([:created_at, :asc]).next_document["created_at"].year
254
- assert_equal 2004, @coll.find().sort([:created_at, :desc]).next_document["created_at"].year
255
-
256
- assert_equal 2000, @coll.find().sort([[:created_at, :asc]]).next_document["created_at"].year
257
- assert_equal 2004, @coll.find().sort([[:created_at, :desc]]).next_document["created_at"].year
258
- end
259
-
260
- def test_sort_min_max_keys
261
- @coll.remove
262
- @coll.insert({"n" => 1000000})
263
- @coll.insert({"n" => -1000000})
264
- @coll.insert({"n" => MaxKey.new})
265
- @coll.insert({"n" => MinKey.new})
266
-
267
- results = @coll.find.sort([:n, :asc]).to_a
268
-
269
- assert_equal MinKey.new, results[0]['n']
270
- assert_equal(-1000000, results[1]['n'])
271
- assert_equal 1000000, results[2]['n']
272
- assert_equal MaxKey.new, results[3]['n']
273
- end
274
-
275
- def test_id_range_queries
276
- @coll.remove
277
-
278
- t1 = Time.now
279
- t1_id = ObjectId.from_time(t1)
280
- @coll.save({:t => 't1'})
281
- @coll.save({:t => 't1'})
282
- @coll.save({:t => 't1'})
283
- sleep(1)
284
- t2 = Time.now
285
- t2_id = ObjectId.from_time(t2)
286
- @coll.save({:t => 't2'})
287
- @coll.save({:t => 't2'})
288
- @coll.save({:t => 't2'})
289
-
290
- assert_equal 3, @coll.find({'_id' => {'$gt' => t1_id, '$lt' => t2_id}}).count
291
- @coll.find({'_id' => {'$gt' => t2_id}}).each do |doc|
292
- assert_equal 't2', doc['t']
293
- end
294
- end
295
-
296
- def test_limit
297
- @coll.remove
298
-
299
- 10.times do |i|
300
- @coll.save("x" => i)
301
- end
302
- assert_equal 10, @coll.find().count()
303
-
304
- results = @coll.find().limit(5).to_a
305
- assert_equal 5, results.length
306
- end
307
-
308
- def test_timeout_options
309
- cursor = Cursor.new(@coll)
310
- assert_equal true, cursor.timeout
311
-
312
- cursor = @coll.find
313
- assert_equal true, cursor.timeout
314
-
315
- cursor = @coll.find({}, :timeout => nil)
316
- assert_equal true, cursor.timeout
317
-
318
- cursor = Cursor.new(@coll, :timeout => false)
319
- assert_equal false, cursor.timeout
320
-
321
- @coll.find({}, :timeout => false) do |c|
322
- assert_equal false, c.timeout
323
- end
324
- end
325
-
326
- def test_timeout
327
- opts = Cursor.new(@coll).options
328
- assert_equal 0, opts & Mongo::Constants::OP_QUERY_NO_CURSOR_TIMEOUT
329
-
330
- opts = Cursor.new(@coll, :timeout => false).options
331
- assert_equal Mongo::Constants::OP_QUERY_NO_CURSOR_TIMEOUT,
332
- opts & Mongo::Constants::OP_QUERY_NO_CURSOR_TIMEOUT
333
- end
334
-
335
- def test_limit_exceptions
336
- cursor = @coll.find()
337
- cursor.next_document
338
- assert_raise InvalidOperation, "Cannot modify the query once it has been run or closed." do
339
- cursor.limit(1)
340
- end
341
-
342
- cursor = @coll.find()
343
- cursor.close
344
- assert_raise InvalidOperation, "Cannot modify the query once it has been run or closed." do
345
- cursor.limit(1)
346
- end
347
- end
348
-
349
- def test_skip
350
- @coll.remove
351
-
352
- 10.times do |i|
353
- @coll.save("x" => i)
354
- end
355
- assert_equal 10, @coll.find().count()
356
-
357
- all_results = @coll.find().to_a
358
- skip_results = @coll.find().skip(2).to_a
359
- assert_equal 10, all_results.length
360
- assert_equal 8, skip_results.length
361
-
362
- assert_equal all_results.slice(2...10), skip_results
363
- end
364
-
365
- def test_skip_exceptions
366
- cursor = @coll.find()
367
- cursor.next_document
368
- assert_raise InvalidOperation, "Cannot modify the query once it has been run or closed." do
369
- cursor.skip(1)
370
- end
371
-
372
- cursor = @coll.find()
373
- cursor.close
374
- assert_raise InvalidOperation, "Cannot modify the query once it has been run or closed." do
375
- cursor.skip(1)
376
- end
377
- end
378
-
379
- def test_limit_skip_chaining
380
- @coll.remove
381
- 10.times do |i|
382
- @coll.save("x" => i)
383
- end
384
-
385
- all_results = @coll.find().to_a
386
- limited_skip_results = @coll.find().limit(5).skip(3).to_a
387
-
388
- assert_equal all_results.slice(3...8), limited_skip_results
389
- end
390
-
391
- def test_close_no_query_sent
392
- begin
393
- cursor = @coll.find('a' => 1)
394
- cursor.close
395
- assert cursor.closed?
396
- rescue => ex
397
- fail ex.to_s
398
- end
399
- end
400
-
401
- def test_refill_via_get_more
402
- assert_equal 1, @coll.count
403
- 1000.times { |i|
404
- assert_equal 1 + i, @coll.count
405
- @coll.insert('a' => i)
406
- }
407
-
408
- assert_equal 1001, @coll.count
409
- count = 0
410
- @coll.find.each { |obj|
411
- count += obj['a']
412
- }
413
- assert_equal 1001, @coll.count
414
-
415
- # do the same thing again for debugging
416
- assert_equal 1001, @coll.count
417
- count2 = 0
418
- @coll.find.each { |obj|
419
- count2 += obj['a']
420
- }
421
- assert_equal 1001, @coll.count
422
-
423
- assert_equal count, count2
424
- assert_equal 499501, count
425
- end
426
-
427
- def test_refill_via_get_more_alt_coll
428
- coll = @db.collection('test-alt-coll')
429
- coll.remove
430
- coll.insert('a' => 1) # collection not created until it's used
431
- assert_equal 1, coll.count
432
-
433
- 1000.times { |i|
434
- assert_equal 1 + i, coll.count
435
- coll.insert('a' => i)
436
- }
437
-
438
- assert_equal 1001, coll.count
439
- count = 0
440
- coll.find.each { |obj|
441
- count += obj['a']
442
- }
443
- assert_equal 1001, coll.count
444
-
445
- # do the same thing again for debugging
446
- assert_equal 1001, coll.count
447
- count2 = 0
448
- coll.find.each { |obj|
449
- count2 += obj['a']
450
- }
451
- assert_equal 1001, coll.count
452
-
453
- assert_equal count, count2
454
- assert_equal 499501, count
455
- end
456
-
457
- def test_close_after_query_sent
458
- begin
459
- cursor = @coll.find('a' => 1)
460
- cursor.next_document
461
- cursor.close
462
- assert cursor.closed?
463
- rescue => ex
464
- fail ex.to_s
465
- end
466
- end
467
-
468
- def test_kill_cursors
469
- @coll.drop
470
-
471
- client_cursors = cursor_count(@db)
472
-
473
- 10000.times do |i|
474
- @coll.insert("i" => i)
475
- end
476
-
477
- assert_equal(client_cursors, cursor_count(@db))
478
-
479
- 10.times do |i|
480
- @coll.find_one()
481
- end
482
-
483
- assert_equal(client_cursors, cursor_count(@db))
484
-
485
- 10.times do |i|
486
- a = @coll.find()
487
- a.next_document
488
- a.close()
489
- end
490
-
491
- assert_equal(client_cursors, cursor_count(@db))
492
-
493
- a = @coll.find()
494
- a.next_document
495
-
496
- assert_not_equal(client_cursors, cursor_count(@db))
497
-
498
- a.close()
499
-
500
- assert_equal(client_cursors, cursor_count(@db))
501
-
502
- a = @coll.find({}, :limit => 10).next_document
503
-
504
- assert_equal(client_cursors, cursor_count(@db))
505
-
506
- @coll.find() do |cursor|
507
- cursor.next_document
508
- end
509
-
510
- assert_equal(client_cursors, cursor_count(@db))
511
-
512
- @coll.find() { |cursor|
513
- cursor.next_document
514
- }
515
-
516
- assert_equal(client_cursors, cursor_count(@db))
517
- end
518
-
519
- def test_count_with_fields
520
- @coll.remove
521
- @coll.save("x" => 1)
522
-
523
- if @version < "1.1.3"
524
- assert_equal(0, @coll.find({}, :fields => ["a"]).count())
525
- else
526
- assert_equal(1, @coll.find({}, :fields => ["a"]).count())
527
- end
528
- end
529
-
530
- def test_count_with_hint
531
- @coll.drop
532
- @coll.save(:i => 1)
533
- @coll.save(:i => 2)
534
- assert_equal 2, @coll.find.count
535
-
536
- @coll.ensure_index(BSON::OrderedHash[:i, Mongo::ASCENDING])
537
-
538
- # Check that a named_hint can be specified
539
- assert_equal 1, @coll.find({ :i => 1 }, :named_hint => '_id_').count
540
- assert_equal 2, @coll.find({ }, :named_hint => '_id_').count
541
-
542
- # Verify that the hint is being sent to the server by providing a bad hint
543
- if @version > '2.6'
544
- assert_raise Mongo::OperationFailure do
545
- @coll.find({ :i => 1 }, :hint => 'bad_hint').count
546
- end
547
- else
548
- assert_equal 1, @coll.find({ :i => 1 }, :hint => 'bad_hint').count
549
- end
550
-
551
- # Verify that the named_hint is being sent to the server by providing a bad hint
552
- if @version > '2.6'
553
- assert_raise Mongo::OperationFailure do
554
- @coll.find({ :i => 1 }, :named_hint => 'bad_hint').count
555
- end
556
- else
557
- assert_equal 1, @coll.find({ :i => 1 }, :named_hint => 'bad_hint').count
558
- end
559
-
560
- @coll.ensure_index(BSON::OrderedHash[:x, Mongo::ASCENDING], :sparse => true)
561
-
562
- # The sparse index won't have any entries.
563
- # Check that count returns 0 when using the hint.
564
- expected = @version > '2.6' ? 0 : 1
565
- assert_equal expected, @coll.find({ :i => 1 }, :hint => { 'x' => 1 }).count
566
- assert_equal expected, @coll.find({ :i => 1 }, :hint => 'x').count
567
- assert_equal expected, @coll.find({ :i => 1 }, :named_hint => 'x_1').count
568
-
569
- # Verify that the hint / named hint set on the collection is used.
570
- @coll.hint = { 'x' => 1 }
571
- assert_equal expected, @coll.find(:i => 1).count
572
-
573
- @coll.hint = 'x'
574
- assert_equal expected, @coll.find(:i => 1).count
575
-
576
- @coll.named_hint = 'x_1'
577
- assert_equal expected, @coll.find(:i => 1).count
578
-
579
- assert_equal 2, @coll.find({ }, :hint => 'x').count
580
- assert_equal 2, @coll.find({ }, :named_hint => 'x_1').count
581
- end
582
-
583
- def test_has_next
584
- @coll.remove
585
- 200.times do |n|
586
- @coll.save("x" => n)
587
- end
588
-
589
- cursor = @coll.find
590
- n = 0
591
- while cursor.has_next?
592
- assert cursor.next
593
- n += 1
594
- end
595
-
596
- assert_equal n, 200
597
- assert_equal false, cursor.has_next?
598
- end
599
-
600
- def test_cursor_invalid
601
- @coll.remove
602
- 10000.times do |n|
603
- @coll.insert({:a => n})
604
- end
605
-
606
- cursor = @coll.find({})
607
-
608
- assert_raise_error Mongo::OperationFailure, "CURSOR_NOT_FOUND" do
609
- 9999.times do
610
- cursor.next_document
611
- cursor.instance_variable_set(:@cursor_id, 1234567890)
612
- end
613
- end
614
- end
615
-
616
- def test_enumberables
617
- @coll.remove
618
- 100.times do |n|
619
- @coll.insert({:a => n})
620
- end
621
-
622
- assert_equal 100, @coll.find.to_a.length
623
- assert_equal 100, @coll.find.to_set.length
624
-
625
- cursor = @coll.find
626
- 50.times { |n| cursor.next_document }
627
- assert_equal 50, cursor.to_a.length
628
- end
629
-
630
- def test_rewind
631
- @coll.remove
632
- 100.times do |n|
633
- @coll.insert({:a => n})
634
- end
635
-
636
- cursor = @coll.find
637
- cursor.to_a
638
- assert_equal [], cursor.map {|doc| doc }
639
-
640
- cursor.rewind!
641
- assert_equal 100, cursor.map {|doc| doc }.length
642
-
643
- cursor.rewind!
644
- 5.times { cursor.next_document }
645
- cursor.rewind!
646
- assert_equal 100, cursor.map {|doc| doc }.length
647
- end
648
-
649
- def test_transformer
650
- transformer = Proc.new { |doc| doc }
651
- cursor = Cursor.new(@coll, :transformer => transformer)
652
- assert_equal(transformer, cursor.transformer)
653
- end
654
-
655
- def test_instance_transformation_with_next
656
- klass = Struct.new(:id, :a)
657
- transformer = Proc.new { |doc| klass.new(doc['_id'], doc['a']) }
658
- cursor = Cursor.new(@coll, :transformer => transformer)
659
- instance = cursor.next
660
-
661
- assert_instance_of(klass, instance)
662
- assert_instance_of(BSON::ObjectId, instance.id)
663
- assert_equal(1, instance.a)
664
- end
665
-
666
- def test_instance_transformation_with_each
667
- klass = Struct.new(:id, :a)
668
- transformer = Proc.new { |doc| klass.new(doc['_id'], doc['a']) }
669
- cursor = Cursor.new(@coll, :transformer => transformer)
670
-
671
- cursor.each do |instance|
672
- assert_instance_of(klass, instance)
673
- end
674
- end
675
-
676
- def cursor_count(db)
677
- if @version > '2.6.0'
678
- db.command("serverStatus" => 1)["metrics"]["cursor"]["open"]["total"]
679
- else
680
- db.command("cursorInfo" => 1)["clientCursors_size"]
681
- end
682
- end
683
- end