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
@@ -0,0 +1,161 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Protocol::Insert do
4
+
5
+ let(:opcode) { 2002 }
6
+ let(:db) { TEST_DB }
7
+ let(:coll) { TEST_COLL }
8
+ let(:ns) { "#{db}.#{coll}" }
9
+ let(:doc1) { { :name => 'Tyler' } }
10
+ let(:doc2) { { :name => 'Brandon' } }
11
+ let(:docs) { [doc1, doc2] }
12
+ let(:options) { Hash.new }
13
+
14
+ let(:message) do
15
+ described_class.new(db, coll, docs, options)
16
+ end
17
+
18
+ describe '#initialize' do
19
+
20
+ it 'sets the namepsace' do
21
+ expect(message.namespace).to eq(ns)
22
+ end
23
+
24
+ it 'sets the documents' do
25
+ expect(message.documents).to eq(docs)
26
+ end
27
+
28
+ context 'when options are provided' do
29
+
30
+ context 'when flags are provided' do
31
+ let(:options) { { :flags => [:continue_on_error] } }
32
+
33
+ it 'sets the flags' do
34
+ expect(message.flags).to eq(options[:flags])
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ describe '#==' do
41
+
42
+ context 'when the other is an insert' do
43
+
44
+ context 'when the fields are equal' do
45
+ let(:other) do
46
+ described_class.new(db, coll, docs, options)
47
+ end
48
+
49
+ it 'returns true' do
50
+ expect(message).to eq(other)
51
+ end
52
+ end
53
+
54
+ context 'when the database is not equal' do
55
+ let(:other) do
56
+ described_class.new('tyler', coll, docs, options)
57
+ end
58
+
59
+ it 'returns false' do
60
+ expect(message).not_to eq(other)
61
+ end
62
+ end
63
+
64
+ context 'when the collection is not equal' do
65
+ let(:other) do
66
+ described_class.new(db, 'tyler', docs, options)
67
+ end
68
+
69
+ it 'returns false' do
70
+ expect(message).not_to eq(other)
71
+ end
72
+ end
73
+
74
+ context 'when the documents are not equal' do
75
+ let(:other) do
76
+ described_class.new(db, coll, docs[1..1], options)
77
+ end
78
+
79
+ it 'returns false' do
80
+ expect(message).not_to eq(other)
81
+ end
82
+ end
83
+
84
+ context 'when the options are not equal' do
85
+ let(:other) do
86
+ described_class.new(db, coll, docs, :flags => [:continue_on_error])
87
+ end
88
+
89
+ it 'returns false' do
90
+ expect(message).not_to eq(other)
91
+ end
92
+ end
93
+ end
94
+
95
+ context 'when the other is not an insert' do
96
+ let(:other) do
97
+ expect(message).not_to eq('test')
98
+ end
99
+ end
100
+ end
101
+
102
+ describe '#hash' do
103
+ let(:values) do
104
+ message.send(:fields).map do |field|
105
+ message.instance_variable_get(field[:name])
106
+ end
107
+ end
108
+
109
+ it 'returns a hash of the field values' do
110
+ expect(message.hash).to eq(values.hash)
111
+ end
112
+ end
113
+
114
+ describe '#replyable?' do
115
+
116
+ it 'returns false' do
117
+ expect(message).to_not be_replyable
118
+ end
119
+ end
120
+
121
+ describe '#serialize' do
122
+ let(:bytes) { message.serialize }
123
+
124
+ include_examples 'message with a header'
125
+
126
+ describe 'flags' do
127
+ let(:field) { bytes[16..19] }
128
+
129
+ context 'when no flags are provided' do
130
+ it 'does not set any bits' do
131
+ expect(field).to be_int32(0)
132
+ end
133
+ end
134
+
135
+ context 'when flags are provided' do
136
+ let(:options) { { :flags => flags } }
137
+
138
+ context 'continue on error flag' do
139
+ let(:flags) { [:continue_on_error] }
140
+ it 'sets the first bit' do
141
+ expect(field).to be_int32(1)
142
+ end
143
+ end
144
+ end
145
+ end
146
+
147
+ describe 'namespace' do
148
+ let(:field) { bytes[20..36] }
149
+ it 'serializes the namespace' do
150
+ expect(field).to be_cstring(ns)
151
+ end
152
+ end
153
+
154
+ describe 'documents' do
155
+ let(:field) { bytes[37..-1] }
156
+ it 'serializes the documents' do
157
+ expect(field).to be_bson_sequence(docs)
158
+ end
159
+ end
160
+ end
161
+ end
@@ -0,0 +1,101 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Protocol::KillCursors do
4
+
5
+ let(:opcode) { 2007 }
6
+ let(:cursor_ids) { [123, 456, 789] }
7
+ let(:id_count) { cursor_ids.size }
8
+ let(:message) do
9
+ described_class.new(cursor_ids)
10
+ end
11
+
12
+ describe '#initialize' do
13
+
14
+ it 'sets the cursor ids' do
15
+ expect(message.cursor_ids).to eq(cursor_ids)
16
+ end
17
+
18
+ it 'sets the count' do
19
+ expect(message.id_count).to eq(id_count)
20
+ end
21
+ end
22
+
23
+ describe '#==' do
24
+
25
+ context 'when the other is a killcursors' do
26
+
27
+ context 'when the cursor ids are equal' do
28
+ let(:other) do
29
+ described_class.new(cursor_ids)
30
+ end
31
+
32
+ it 'returns true' do
33
+ expect(message).to eq(other)
34
+ end
35
+ end
36
+
37
+ context 'when the cursor ids are not equal' do
38
+ let(:other) do
39
+ described_class.new([123, 456])
40
+ end
41
+
42
+ it 'returns false' do
43
+ expect(message).not_to eq(other)
44
+ end
45
+ end
46
+ end
47
+
48
+ context 'when the other is not a killcursors' do
49
+ let(:other) do
50
+ expect(message).not_to eq('test')
51
+ end
52
+ end
53
+ end
54
+
55
+ describe '#hash' do
56
+ let(:values) do
57
+ message.send(:fields).map do |field|
58
+ message.instance_variable_get(field[:name])
59
+ end
60
+ end
61
+
62
+ it 'returns a hash of the field values' do
63
+ expect(message.hash).to eq(values.hash)
64
+ end
65
+ end
66
+
67
+ describe '#replyable?' do
68
+
69
+ it 'returns false' do
70
+ expect(message).to_not be_replyable
71
+ end
72
+ end
73
+
74
+ describe '#serialize' do
75
+ let(:bytes) { message.serialize }
76
+
77
+ include_examples 'message with a header'
78
+
79
+ describe 'zero' do
80
+ let(:field) { bytes[16..19] }
81
+
82
+ it 'serializes a zero' do
83
+ expect(field).to be_int32(0)
84
+ end
85
+ end
86
+
87
+ describe 'number of cursors' do
88
+ let(:field) { bytes[20..23] }
89
+ it 'serializes the cursor count' do
90
+ expect(field).to be_int32(id_count)
91
+ end
92
+ end
93
+
94
+ describe 'cursor ids' do
95
+ let(:field) { bytes[24..-1] }
96
+ it 'serializes the selector' do
97
+ expect(field).to be_int64_sequence(cursor_ids)
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,285 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Protocol::Query do
4
+
5
+ let(:opcode) { 2004 }
6
+ let(:db) { TEST_DB }
7
+ let(:coll) { TEST_COLL }
8
+ let(:ns) { "#{db}.#{coll}" }
9
+ let(:selector) { { :name => 'Tyler' } }
10
+ let(:options) { Hash.new }
11
+
12
+ let(:message) do
13
+ described_class.new(db, coll, selector, options)
14
+ end
15
+
16
+ describe '#initialize' do
17
+
18
+ it 'sets the namepsace' do
19
+ expect(message.namespace).to eq(ns)
20
+ end
21
+
22
+ it 'sets the selector' do
23
+ expect(message.selector).to eq(selector)
24
+ end
25
+
26
+ context 'when options are provided' do
27
+
28
+ context 'when flags are provided' do
29
+ let(:options) { { :flags => [:slave_ok] } }
30
+
31
+ it 'sets the flags' do
32
+ expect(message.flags).to eq(options[:flags])
33
+ end
34
+ end
35
+
36
+ context 'when a limit is provided' do
37
+ let(:options) { { :limit => 5 } }
38
+
39
+ it 'sets the limit' do
40
+ expect(message.limit).to eq(options[:limit])
41
+ end
42
+ end
43
+
44
+ context 'when a skip is provided' do
45
+ let(:options) { { :skip => 13 } }
46
+
47
+ it 'sets the flags' do
48
+ expect(message.skip).to eq(options[:skip])
49
+ end
50
+ end
51
+
52
+ context 'when a projection is provided' do
53
+ let(:options) { { :project => { :_id => 0 } } }
54
+
55
+ it 'sets the projection' do
56
+ expect(message.project).to eq(options[:project])
57
+ end
58
+ end
59
+ end
60
+ end
61
+
62
+ describe '#==' do
63
+
64
+ context 'when the other is a query' do
65
+
66
+ context 'when the fields are equal' do
67
+ let(:other) do
68
+ described_class.new(db, coll, selector, options)
69
+ end
70
+
71
+ it 'returns true' do
72
+ expect(message).to eq(other)
73
+ end
74
+ end
75
+
76
+ context 'when the database is not equal' do
77
+ let(:other) do
78
+ described_class.new('tyler', coll, selector, options)
79
+ end
80
+
81
+ it 'returns false' do
82
+ expect(message).not_to eq(other)
83
+ end
84
+ end
85
+
86
+ context 'when the collection is not equal' do
87
+ let(:other) do
88
+ described_class.new(db, 'tyler', selector, options)
89
+ end
90
+
91
+ it 'returns false' do
92
+ expect(message).not_to eq(other)
93
+ end
94
+ end
95
+
96
+ context 'when the selector is not equal' do
97
+ let(:other) do
98
+ described_class.new(db, coll, { :a => 1 }, options)
99
+ end
100
+
101
+ it 'returns false' do
102
+ expect(message).not_to eq(other)
103
+ end
104
+ end
105
+
106
+ context 'when the options are not equal' do
107
+ let(:other) do
108
+ described_class.new(db, coll, selector, :skip => 2)
109
+ end
110
+
111
+ it 'returns false' do
112
+ expect(message).not_to eq(other)
113
+ end
114
+ end
115
+ end
116
+
117
+ context 'when the other is not a query' do
118
+ let(:other) do
119
+ expect(message).not_to eq('test')
120
+ end
121
+ end
122
+ end
123
+
124
+ describe '#hash' do
125
+ let(:values) do
126
+ message.send(:fields).map do |field|
127
+ message.instance_variable_get(field[:name])
128
+ end
129
+ end
130
+
131
+ it 'returns a hash of the field values' do
132
+ expect(message.hash).to eq(values.hash)
133
+ end
134
+ end
135
+
136
+ describe '#replyable?' do
137
+
138
+ it 'returns true' do
139
+ expect(message).to be_replyable
140
+ end
141
+ end
142
+
143
+ describe '#serialize' do
144
+ let(:bytes) { message.serialize }
145
+
146
+ include_examples 'message with a header'
147
+
148
+ describe 'flags' do
149
+ let(:field) { bytes[16..19] }
150
+
151
+ context 'when no flags are provided' do
152
+ it 'does not set any bits' do
153
+ expect(field).to be_int32(0)
154
+ end
155
+ end
156
+
157
+ context 'when flags are provided' do
158
+ let(:options) { { :flags => flags } }
159
+
160
+ context 'tailable cursor flag' do
161
+ let(:flags) { [:tailable_cursor] }
162
+ it 'sets the second bit' do
163
+ expect(field).to be_int32(2)
164
+ end
165
+ end
166
+
167
+ context 'slave ok flag' do
168
+ let(:flags) { [:slave_ok] }
169
+ it 'sets the third bit' do
170
+ expect(field).to be_int32(4)
171
+ end
172
+ end
173
+
174
+ context 'oplog replay flag' do
175
+ let(:flags) { [:oplog_replay] }
176
+ it 'sets the fourth bit' do
177
+ expect(field).to be_int32(8)
178
+ end
179
+ end
180
+
181
+ context 'no cursor timeout flag' do
182
+ let(:flags) { [:no_cursor_timeout] }
183
+ it 'sets the fifth bit' do
184
+ expect(field).to be_int32(16)
185
+ end
186
+ end
187
+
188
+ context 'await data flag' do
189
+ let(:flags) { [:await_data] }
190
+ it 'sets the sixth bit' do
191
+ expect(field).to be_int32(32)
192
+ end
193
+ end
194
+
195
+ context 'exhaust flag' do
196
+ let(:flags) { [:exhaust] }
197
+ it 'sets the seventh bit' do
198
+ expect(field).to be_int32(64)
199
+ end
200
+ end
201
+
202
+ context 'partial flag' do
203
+ let(:flags) { [:partial] }
204
+ it 'sets the eigth bit' do
205
+ expect(field).to be_int32(128)
206
+ end
207
+ end
208
+
209
+ context 'multiple flags' do
210
+ let(:flags) { [:await_data, :slave_ok] }
211
+ it 'sets the correct bits' do
212
+ expect(field).to be_int32(36)
213
+ end
214
+ end
215
+ end
216
+ end
217
+
218
+ describe 'namespace' do
219
+ let(:field) { bytes[20..36] }
220
+ it 'serializes the namespace' do
221
+ expect(field).to be_cstring(ns)
222
+ end
223
+ end
224
+
225
+ describe 'skip' do
226
+ let(:field) { bytes[37..40] }
227
+
228
+ context 'when no skip is provided' do
229
+ it 'serializes a zero' do
230
+ expect(field).to be_int32(0)
231
+ end
232
+ end
233
+
234
+ context 'when skip is provided' do
235
+ let(:options) { { :skip => 5 } }
236
+
237
+ it 'serializes the skip' do
238
+ expect(field).to be_int32(options[:skip])
239
+ end
240
+ end
241
+ end
242
+
243
+ describe 'limit' do
244
+ let(:field) { bytes[41..44] }
245
+
246
+ context 'when no limit is provided' do
247
+ it 'serializes a zero' do
248
+ expect(field).to be_int32(0)
249
+ end
250
+ end
251
+
252
+ context 'when limit is provided' do
253
+ let(:options) { { :limit => 123 } }
254
+ it 'serializes the limit' do
255
+ expect(field).to be_int32(options[:limit])
256
+ end
257
+ end
258
+ end
259
+
260
+ describe 'selector' do
261
+ let(:field) { bytes[45..65] }
262
+ it 'serializes the selector' do
263
+ expect(field).to be_bson(selector)
264
+ end
265
+ end
266
+
267
+ describe 'project' do
268
+ let(:field) { bytes[66..-1] }
269
+ context 'when no projection is provided' do
270
+ it 'does not serialize a projection' do
271
+ expect(field).to be_empty
272
+ end
273
+ end
274
+
275
+ context 'when projection is provided' do
276
+ let(:options) { { :project => projection } }
277
+ let(:projection) { { :_id => 0 } }
278
+
279
+ it 'serializes the projection' do
280
+ expect(field).to be_bson(projection)
281
+ end
282
+ end
283
+ end
284
+ end
285
+ end
@@ -0,0 +1,157 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Protocol::Reply do
4
+
5
+ let(:length) { 78 }
6
+ let(:request_id) { 0 }
7
+ let(:response_to) { 0 }
8
+ let(:op_code) { 1 }
9
+ let(:flags) { 0 }
10
+ let(:start) { 0 }
11
+ let(:n_returned) { 2 }
12
+ let(:cursor_id) { 999_999 }
13
+ let(:doc) { { 'name' => 'Tyler' } }
14
+ let(:documents) { [doc] * 2 }
15
+
16
+ let(:header) do
17
+ [length, request_id, response_to, op_code].pack('l<l<l<l<')
18
+ end
19
+
20
+ let(:data) do
21
+ data = [flags].pack('l<')
22
+ data << [cursor_id].pack('q<')
23
+ data << [start].pack('l<')
24
+ data << [n_returned].pack('l<')
25
+ data << documents.map(&:to_bson).join
26
+ end
27
+
28
+ let(:io) { StringIO.new(header + data) }
29
+ let(:reply) { described_class.deserialize(io) }
30
+
31
+ describe '#==' do
32
+
33
+ context 'when the other is a reply' do
34
+
35
+ context 'when the fields are equal' do
36
+ let(:other) do
37
+ other = described_class.allocate
38
+ other.instance_variable_set(:@flags, [])
39
+ other.instance_variable_set(:@number_returned, n_returned)
40
+ other.instance_variable_set(:@cursor_id, cursor_id)
41
+ other.instance_variable_set(:@documents, documents)
42
+ other.instance_variable_set(:@starting_from, start)
43
+ other
44
+ end
45
+
46
+ it 'returns true' do
47
+ expect(reply).to eq(other)
48
+ end
49
+ end
50
+
51
+ context 'when fields are not equal' do
52
+ let(:other) do
53
+ other = described_class.allocate
54
+ other.instance_variable_set(:@flags, [:await_capable])
55
+ other.instance_variable_set(:@number_returned, n_returned)
56
+ other.instance_variable_set(:@cursor_id, cursor_id)
57
+ other.instance_variable_set(:@documents, documents)
58
+ other.instance_variable_set(:@starting_from, start)
59
+ other
60
+ end
61
+
62
+ it 'returns false' do
63
+ expect(reply).not_to eq(other)
64
+ end
65
+ end
66
+ end
67
+
68
+ context 'when the other is not a reply' do
69
+ let(:other) do
70
+ expect(message).not_to eq('test')
71
+ end
72
+ end
73
+ end
74
+
75
+ describe '#hash' do
76
+ let(:values) do
77
+ reply.send(:fields).map do |field|
78
+ reply.instance_variable_get(field[:name])
79
+ end
80
+ end
81
+
82
+ it 'returns a hash of the field values' do
83
+ expect(reply.hash).to eq(values.hash)
84
+ end
85
+ end
86
+
87
+ describe '#deserialize' do
88
+
89
+ describe 'response flags' do
90
+
91
+ context 'no flags' do
92
+ it 'sets no flags' do
93
+ expect(reply.flags).to be_empty
94
+ end
95
+ end
96
+
97
+ context 'cursor not found' do
98
+ let(:flags) { 1 }
99
+ it 'sets the cursor not found flag' do
100
+ expect(reply.flags).to eq([:cursor_not_found])
101
+ end
102
+ end
103
+
104
+ context 'query failure' do
105
+ let(:flags) { 2 }
106
+ it 'sets the query failure flag' do
107
+ expect(reply.flags).to eq([:query_failure])
108
+ end
109
+ end
110
+
111
+ context 'shard config stale' do
112
+ let(:flags) { 4 }
113
+ it 'sets the shard config stale flag' do
114
+ expect(reply.flags).to eq([:shard_config_stale])
115
+ end
116
+ end
117
+
118
+ context 'await capable' do
119
+ let(:flags) { 8 }
120
+ it 'sets the await capable flag' do
121
+ expect(reply.flags).to eq([:await_capable])
122
+ end
123
+ end
124
+
125
+ context 'multiple flags' do
126
+ let(:flags) { 10 }
127
+ it 'sets multiple flags' do
128
+ expect(reply.flags).to include(:query_failure, :await_capable)
129
+ end
130
+ end
131
+ end
132
+
133
+ describe 'cursor id' do
134
+ it 'sets the cursor id attribute' do
135
+ expect(reply.cursor_id).to eq(cursor_id)
136
+ end
137
+ end
138
+
139
+ describe 'starting from' do
140
+ it 'sets the starting from attribute' do
141
+ expect(reply.starting_from).to eq(start)
142
+ end
143
+ end
144
+
145
+ describe 'number returned' do
146
+ it 'sets the number returned attribute' do
147
+ expect(reply.number_returned).to eq(n_returned)
148
+ end
149
+ end
150
+
151
+ describe 'documents' do
152
+ it 'sets the documents attribute' do
153
+ expect(reply.documents).to eq(documents)
154
+ end
155
+ end
156
+ end
157
+ end