mongo 2.0.6 → 2.1.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 (317) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +5 -2
  3. data/lib/mongo/address/ipv4.rb +6 -1
  4. data/lib/mongo/address/unix.rb +2 -2
  5. data/lib/mongo/address.rb +18 -10
  6. data/lib/mongo/auth/cr/conversation.rb +1 -1
  7. data/lib/mongo/auth/ldap/conversation.rb +7 -3
  8. data/lib/mongo/auth/scram/conversation.rb +9 -3
  9. data/lib/mongo/auth/user/view.rb +23 -2
  10. data/lib/mongo/auth/x509/conversation.rb +1 -1
  11. data/lib/mongo/bulk_write/combineable.rb +51 -0
  12. data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
  13. data/lib/mongo/bulk_write/result.rb +191 -0
  14. data/lib/mongo/bulk_write/result_combiner.rb +117 -0
  15. data/lib/mongo/bulk_write/transformable.rb +132 -0
  16. data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
  17. data/lib/mongo/bulk_write/validatable.rb +62 -0
  18. data/lib/mongo/bulk_write.rb +159 -23
  19. data/lib/mongo/client.rb +52 -16
  20. data/lib/mongo/cluster/topology/replica_set.rb +27 -9
  21. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  22. data/lib/mongo/cluster/topology/unknown.rb +5 -2
  23. data/lib/mongo/cluster.rb +42 -7
  24. data/lib/mongo/collection/view/aggregation.rb +48 -9
  25. data/lib/mongo/collection/view/immutable.rb +6 -6
  26. data/lib/mongo/collection/view/iterable.rb +18 -4
  27. data/lib/mongo/collection/view/map_reduce.rb +58 -17
  28. data/lib/mongo/collection/view/readable.rb +173 -42
  29. data/lib/mongo/collection/view/writable.rb +37 -23
  30. data/lib/mongo/collection/view.rb +2 -2
  31. data/lib/mongo/collection.rb +370 -33
  32. data/lib/mongo/cursor.rb +15 -3
  33. data/lib/mongo/database/view.rb +5 -4
  34. data/lib/mongo/database.rb +14 -4
  35. data/lib/mongo/dbref.rb +113 -0
  36. data/lib/mongo/error/closed_stream.rb +34 -0
  37. data/lib/mongo/error/extra_file_chunk.rb +34 -0
  38. data/lib/mongo/error/{invalid_uri_option.rb → file_not_found.rb} +11 -12
  39. data/lib/mongo/error/invalid_file.rb +2 -2
  40. data/lib/mongo/error/invalid_file_revision.rb +37 -0
  41. data/lib/mongo/error/invalid_uri.rb +5 -4
  42. data/lib/mongo/error/missing_file_chunk.rb +38 -0
  43. data/lib/mongo/error/operation_failure.rb +1 -1
  44. data/lib/mongo/error/parser.rb +1 -1
  45. data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
  46. data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
  47. data/lib/mongo/error.rb +13 -2
  48. data/lib/mongo/event/description_changed.rb +1 -1
  49. data/lib/mongo/grid/file/chunk.rb +6 -6
  50. data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
  51. data/lib/mongo/grid/file.rb +13 -10
  52. data/lib/mongo/grid/fs_bucket.rb +448 -0
  53. data/lib/mongo/grid/stream/read.rb +208 -0
  54. data/lib/mongo/grid/stream/write.rb +187 -0
  55. data/lib/mongo/grid/stream.rb +64 -0
  56. data/lib/mongo/grid.rb +2 -1
  57. data/lib/mongo/index/view.rb +3 -3
  58. data/lib/mongo/index.rb +5 -0
  59. data/lib/mongo/loggable.rb +34 -57
  60. data/lib/mongo/logger.rb +16 -78
  61. data/lib/mongo/monitoring/command_log_subscriber.rb +112 -0
  62. data/lib/mongo/monitoring/event/command_failed.rb +96 -0
  63. data/lib/mongo/monitoring/event/command_started.rb +89 -0
  64. data/lib/mongo/monitoring/event/command_succeeded.rb +118 -0
  65. data/lib/mongo/monitoring/event/secure.rb +58 -0
  66. data/lib/mongo/monitoring/event.rb +18 -0
  67. data/lib/mongo/monitoring/publishable.rb +106 -0
  68. data/lib/mongo/monitoring.rb +195 -0
  69. data/lib/mongo/operation/{aggregate.rb → commands/aggregate.rb} +3 -41
  70. data/lib/mongo/operation/commands/collections_info/result.rb +39 -0
  71. data/lib/mongo/operation/commands/collections_info.rb +68 -0
  72. data/lib/mongo/operation/{command.rb → commands/command.rb} +2 -18
  73. data/lib/mongo/operation/commands/indexes.rb +70 -0
  74. data/lib/mongo/operation/commands/list_collections/result.rb +112 -0
  75. data/lib/mongo/operation/commands/list_collections.rb +54 -0
  76. data/lib/mongo/operation/commands/list_indexes/result.rb +116 -0
  77. data/lib/mongo/operation/commands/list_indexes.rb +56 -0
  78. data/lib/mongo/operation/{map_reduce → commands/map_reduce}/result.rb +1 -1
  79. data/lib/mongo/operation/{map_reduce.rb → commands/map_reduce.rb} +3 -41
  80. data/lib/mongo/operation/commands/parallel_scan/result.rb +72 -0
  81. data/lib/mongo/operation/commands/parallel_scan.rb +56 -0
  82. data/lib/mongo/operation/commands/user_query.rb +69 -0
  83. data/lib/mongo/{bulk_write/ordered_bulk_write.rb → operation/commands/users_info/result.rb} +18 -30
  84. data/lib/mongo/operation/commands/users_info.rb +53 -0
  85. data/lib/mongo/operation/commands.rb +24 -0
  86. data/lib/mongo/operation/executable.rb +4 -68
  87. data/lib/mongo/operation/kill_cursors.rb +3 -3
  88. data/lib/mongo/operation/read/get_more.rb +2 -22
  89. data/lib/mongo/{bulk_write/unordered_bulk_write.rb → operation/read/query/result.rb} +20 -26
  90. data/lib/mongo/operation/read/query.rb +4 -21
  91. data/lib/mongo/operation/read.rb +0 -4
  92. data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
  93. data/lib/mongo/operation/result.rb +13 -1
  94. data/lib/mongo/operation/specifiable.rb +42 -0
  95. data/lib/mongo/operation/write/bulk/bulkable.rb +82 -0
  96. data/lib/mongo/operation/write/bulk/delete/result.rb +74 -0
  97. data/lib/mongo/operation/write/bulk/delete.rb +71 -0
  98. data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
  99. data/lib/mongo/operation/write/bulk/insert.rb +96 -0
  100. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
  101. data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
  102. data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
  103. data/lib/mongo/operation/write/bulk/update.rb +81 -0
  104. data/lib/mongo/operation/write/bulk.rb +6 -3
  105. data/lib/mongo/operation/write/command/create_index.rb +0 -1
  106. data/lib/mongo/operation/write/command/create_user.rb +0 -1
  107. data/lib/mongo/operation/write/command/delete.rb +0 -1
  108. data/lib/mongo/operation/write/command/drop_index.rb +0 -1
  109. data/lib/mongo/operation/write/command/insert.rb +0 -1
  110. data/lib/mongo/operation/write/command/remove_user.rb +0 -1
  111. data/lib/mongo/operation/write/command/update.rb +0 -1
  112. data/lib/mongo/operation/write/command/update_user.rb +0 -1
  113. data/lib/mongo/operation/write/command/writable.rb +13 -18
  114. data/lib/mongo/operation/write/create_index.rb +4 -27
  115. data/lib/mongo/operation/write/create_user.rb +4 -30
  116. data/lib/mongo/operation/write/delete.rb +6 -29
  117. data/lib/mongo/operation/write/drop_index.rb +3 -3
  118. data/lib/mongo/operation/write/gle.rb +48 -0
  119. data/lib/mongo/operation/write/idable.rb +5 -0
  120. data/lib/mongo/operation/write/insert.rb +2 -24
  121. data/lib/mongo/operation/write/remove_user.rb +4 -27
  122. data/lib/mongo/operation/write/update.rb +13 -36
  123. data/lib/mongo/operation/write/update_user.rb +4 -30
  124. data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
  125. data/lib/mongo/operation/write.rb +2 -0
  126. data/lib/mongo/operation.rb +32 -4
  127. data/lib/mongo/options/mapper.rb +4 -2
  128. data/lib/mongo/options/redacted.rb +156 -0
  129. data/lib/mongo/options.rb +1 -0
  130. data/lib/mongo/protocol/delete.rb +75 -15
  131. data/lib/mongo/protocol/get_more.rb +65 -13
  132. data/lib/mongo/protocol/insert.rb +85 -13
  133. data/lib/mongo/protocol/kill_cursors.rb +59 -14
  134. data/lib/mongo/protocol/message.rb +12 -12
  135. data/lib/mongo/protocol/query.rb +163 -37
  136. data/lib/mongo/protocol/reply.rb +103 -0
  137. data/lib/mongo/protocol/serializers.rb +1 -1
  138. data/lib/mongo/protocol/update.rb +82 -14
  139. data/lib/mongo/retryable.rb +83 -0
  140. data/lib/mongo/server/connectable.rb +21 -25
  141. data/lib/mongo/server/connection.rb +75 -4
  142. data/lib/mongo/server/connection_pool/queue.rb +15 -0
  143. data/lib/mongo/server/connection_pool.rb +12 -0
  144. data/lib/mongo/server/description/features.rb +2 -1
  145. data/lib/mongo/server/description.rb +52 -1
  146. data/lib/mongo/server/monitor/connection.rb +26 -2
  147. data/lib/mongo/server/monitor.rb +19 -3
  148. data/lib/mongo/server.rb +39 -5
  149. data/lib/mongo/server_selector/selectable.rb +40 -31
  150. data/lib/mongo/server_selector.rb +19 -10
  151. data/lib/mongo/socket/ssl.rb +28 -16
  152. data/lib/mongo/socket/tcp.rb +3 -3
  153. data/lib/mongo/socket/unix.rb +5 -8
  154. data/lib/mongo/socket.rb +11 -4
  155. data/lib/mongo/uri.rb +248 -137
  156. data/lib/mongo/version.rb +1 -1
  157. data/lib/mongo.rb +5 -3
  158. data/spec/mongo/address/unix_spec.rb +1 -1
  159. data/spec/mongo/address_spec.rb +25 -0
  160. data/spec/mongo/auth/cr_spec.rb +9 -1
  161. data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
  162. data/spec/mongo/auth/ldap_spec.rb +9 -1
  163. data/spec/mongo/auth/scram_spec.rb +9 -1
  164. data/spec/mongo/auth/user/view_spec.rb +26 -1
  165. data/spec/mongo/auth/x509_spec.rb +9 -1
  166. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +271 -0
  167. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
  168. data/spec/mongo/bulk_write_spec.rb +428 -0
  169. data/spec/mongo/client_spec.rb +167 -17
  170. data/spec/mongo/cluster/topology/replica_set_spec.rb +18 -9
  171. data/spec/mongo/cluster/topology/sharded_spec.rb +11 -3
  172. data/spec/mongo/cluster/topology/single_spec.rb +12 -4
  173. data/spec/mongo/cluster_spec.rb +55 -10
  174. data/spec/mongo/collection/view/aggregation_spec.rb +188 -1
  175. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  176. data/spec/mongo/collection/view/immutable_spec.rb +103 -0
  177. data/spec/mongo/collection/view/map_reduce_spec.rb +99 -4
  178. data/spec/mongo/collection/view/readable_spec.rb +238 -6
  179. data/spec/mongo/collection/view/writable_spec.rb +4 -4
  180. data/spec/mongo/collection/view_spec.rb +459 -71
  181. data/spec/mongo/collection_spec.rb +1291 -9
  182. data/spec/mongo/command_monitoring_spec.rb +51 -0
  183. data/spec/mongo/connection_string_spec.rb +115 -0
  184. data/spec/mongo/crud_spec.rb +2 -2
  185. data/spec/mongo/cursor_spec.rb +3 -3
  186. data/spec/mongo/database_spec.rb +47 -11
  187. data/spec/mongo/dbref_spec.rb +149 -0
  188. data/spec/mongo/grid/file/chunk_spec.rb +5 -5
  189. data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
  190. data/spec/mongo/grid/file_spec.rb +8 -8
  191. data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
  192. data/spec/mongo/grid/stream/read_spec.rb +275 -0
  193. data/spec/mongo/grid/stream/write_spec.rb +440 -0
  194. data/spec/mongo/grid/stream_spec.rb +48 -0
  195. data/spec/mongo/gridfs_spec.rb +50 -0
  196. data/spec/mongo/logger_spec.rb +0 -40
  197. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
  198. data/spec/mongo/monitoring/event/command_started_spec.rb +26 -0
  199. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +26 -0
  200. data/spec/mongo/monitoring/event/secure_spec.rb +57 -0
  201. data/spec/mongo/monitoring_spec.rb +168 -0
  202. data/spec/mongo/operation/commands/aggregate_spec.rb +69 -0
  203. data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
  204. data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +0 -18
  205. data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
  206. data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +1 -19
  207. data/spec/mongo/operation/kill_cursors_spec.rb +1 -17
  208. data/spec/mongo/operation/read/get_more_spec.rb +0 -16
  209. data/spec/mongo/operation/read/query_spec.rb +19 -16
  210. data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
  211. data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +18 -29
  212. data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +3 -14
  213. data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +8 -19
  214. data/spec/mongo/operation/write/command/delete_spec.rb +0 -16
  215. data/spec/mongo/operation/write/command/insert_spec.rb +0 -16
  216. data/spec/mongo/operation/write/command/update_spec.rb +0 -16
  217. data/spec/mongo/operation/write/delete_spec.rb +4 -4
  218. data/spec/mongo/operation/write/insert_spec.rb +2 -13
  219. data/spec/mongo/operation/write/update_spec.rb +7 -7
  220. data/spec/mongo/options/redacted_spec.rb +350 -0
  221. data/spec/mongo/protocol/kill_cursors_spec.rb +5 -3
  222. data/spec/mongo/protocol/query_spec.rb +15 -30
  223. data/spec/mongo/retryable_spec.rb +147 -0
  224. data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
  225. data/spec/mongo/server/connection_pool_spec.rb +50 -6
  226. data/spec/mongo/server/connection_spec.rb +49 -4
  227. data/spec/mongo/server/description_spec.rb +49 -3
  228. data/spec/mongo/server/monitor_spec.rb +51 -0
  229. data/spec/mongo/server_discovery_and_monitoring_spec.rb +32 -59
  230. data/spec/mongo/server_selection_rtt_spec.rb +37 -57
  231. data/spec/mongo/server_selection_spec.rb +19 -9
  232. data/spec/mongo/server_selector/nearest_spec.rb +35 -27
  233. data/spec/mongo/server_selector/primary_preferred_spec.rb +32 -30
  234. data/spec/mongo/server_selector/primary_spec.rb +21 -14
  235. data/spec/mongo/server_selector/secondary_preferred_spec.rb +28 -26
  236. data/spec/mongo/server_selector/secondary_spec.rb +24 -22
  237. data/spec/mongo/server_selector_spec.rb +87 -24
  238. data/spec/mongo/server_spec.rb +94 -8
  239. data/spec/mongo/socket/ssl_spec.rb +123 -13
  240. data/spec/mongo/socket/unix_spec.rb +52 -0
  241. data/spec/mongo/uri_spec.rb +295 -67
  242. data/spec/spec_helper.rb +40 -24
  243. data/spec/support/authorization.rb +23 -9
  244. data/spec/support/certificates/client.pem +4 -4
  245. data/spec/support/command_monitoring/bulkWrite.yml +73 -0
  246. data/spec/support/command_monitoring/command.yml +42 -0
  247. data/spec/support/command_monitoring/deleteMany.yml +55 -0
  248. data/spec/support/command_monitoring/deleteOne.yml +55 -0
  249. data/spec/support/command_monitoring/find.yml +219 -0
  250. data/spec/support/command_monitoring/insertMany.yml +81 -0
  251. data/spec/support/command_monitoring/insertOne.yml +51 -0
  252. data/spec/support/command_monitoring/updateMany.yml +67 -0
  253. data/spec/support/command_monitoring/updateOne.yml +95 -0
  254. data/spec/support/command_monitoring.rb +365 -0
  255. data/spec/support/connection_string.rb +228 -0
  256. data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
  257. data/spec/support/connection_string_tests/valid-auth.yml +256 -0
  258. data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
  259. data/spec/support/connection_string_tests/valid-options.yml +30 -0
  260. data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
  261. data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
  262. data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
  263. data/spec/support/crud/read.rb +22 -19
  264. data/spec/support/crud/write.rb +58 -27
  265. data/spec/support/crud.rb +10 -2
  266. data/spec/support/gridfs.rb +637 -0
  267. data/spec/support/gridfs_tests/delete.yml +157 -0
  268. data/spec/support/gridfs_tests/download.yml +210 -0
  269. data/spec/support/gridfs_tests/download_by_name.yml +113 -0
  270. data/spec/support/gridfs_tests/upload.yml +158 -0
  271. data/spec/support/matchers.rb +1 -1
  272. data/spec/support/sdam/rs/equal_electionids.yml +44 -0
  273. data/spec/support/sdam/rs/new_primary_new_electionid.yml +95 -0
  274. data/spec/support/sdam/rs/null_election_id.yml +144 -0
  275. data/spec/support/sdam/rs/primary_disconnect_electionid.yml +124 -0
  276. data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
  277. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
  278. data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
  279. data/spec/support/sdam/sharded/mongos_disconnect.yml +104 -0
  280. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  281. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  282. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  283. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  284. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  285. data/spec/support/sdam/single/not_ok_response.yml +0 -1
  286. data/spec/support/server_discovery_and_monitoring.rb +22 -3
  287. data/spec/support/server_selection.rb +3 -1
  288. data/spec/support/shared/bulk_write.rb +218 -22
  289. data/spec/support/shared/server_selector.rb +80 -14
  290. data.tar.gz.sig +0 -0
  291. metadata +188 -59
  292. metadata.gz.sig +0 -0
  293. data/lib/mongo/bulk_write/bulk_writable.rb +0 -196
  294. data/lib/mongo/bulk_write/deletable.rb +0 -56
  295. data/lib/mongo/bulk_write/insertable.rb +0 -48
  296. data/lib/mongo/bulk_write/replacable.rb +0 -57
  297. data/lib/mongo/bulk_write/updatable.rb +0 -68
  298. data/lib/mongo/grid/fs.rb +0 -149
  299. data/lib/mongo/operation/list_collections/result.rb +0 -114
  300. data/lib/mongo/operation/list_indexes/result.rb +0 -118
  301. data/lib/mongo/operation/read/collections_info.rb +0 -68
  302. data/lib/mongo/operation/read/indexes.rb +0 -69
  303. data/lib/mongo/operation/read/list_collections.rb +0 -76
  304. data/lib/mongo/operation/read/list_indexes.rb +0 -78
  305. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
  306. data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
  307. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
  308. data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
  309. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
  310. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -162
  311. data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
  312. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
  313. data/spec/mongo/bulk/bulk_write_spec.rb +0 -262
  314. data/spec/mongo/grid/fs_spec.rb +0 -160
  315. data/spec/mongo/loggable_spec.rb +0 -63
  316. data/spec/mongo/operation/aggregate_spec.rb +0 -127
  317. /data/lib/mongo/operation/{aggregate → commands/aggregate}/result.rb +0 -0
@@ -0,0 +1,81 @@
1
+ data:
2
+ - { _id: 1, x: 11 }
3
+
4
+ collection_name: &collection_name "test"
5
+ database_name: &database_name "ruby-driver"
6
+
7
+ tests:
8
+ -
9
+ description: "A successful insert many"
10
+ operation:
11
+ name: "insertMany"
12
+ arguments:
13
+ documents:
14
+ - { _id: 2, x: 22 }
15
+ - { _id: 3, x: 33 }
16
+ expectations:
17
+ -
18
+ command_started_event:
19
+ command:
20
+ insert: *collection_name
21
+ documents:
22
+ - { _id: 2, x: 22 }
23
+ - { _id: 3, x: 33 }
24
+ ordered: true
25
+ command_name: "insert"
26
+ database_name: *database_name
27
+ -
28
+ command_succeeded_event:
29
+ reply: { ok: 1.0, n: 2 }
30
+ command_name: "insert"
31
+ -
32
+ description: "A successful insert many command with write errors"
33
+ operation:
34
+ name: "insertMany"
35
+ arguments:
36
+ documents:
37
+ - { _id: 1, x: 11 }
38
+ - { _id: 2, x: 22 }
39
+ expectations:
40
+ -
41
+ command_started_event:
42
+ command:
43
+ insert: *collection_name
44
+ documents:
45
+ - { _id: 1, x: 11 }
46
+ - { _id: 2, x: 22 }
47
+ ordered: true
48
+ command_name: "insert"
49
+ database_name: *database_name
50
+ -
51
+ command_succeeded_event:
52
+ reply:
53
+ ok: 1.0
54
+ n: 0
55
+ writeErrors:
56
+ - { index: 0, code: 42, errmsg: "" }
57
+ command_name: "insert"
58
+ -
59
+ description: "A successful unordered insert many"
60
+ operation:
61
+ name: "insertMany"
62
+ arguments:
63
+ documents:
64
+ - { _id: 2, x: 22 }
65
+ - { _id: 3, x: 33 }
66
+ ordered: false
67
+ expectations:
68
+ -
69
+ command_started_event:
70
+ command:
71
+ insert: *collection_name
72
+ documents:
73
+ - { _id: 2, x: 22 }
74
+ - { _id: 3, x: 33 }
75
+ ordered: false
76
+ command_name: "insert"
77
+ database_name: *database_name
78
+ -
79
+ command_succeeded_event:
80
+ reply: { ok: 1.0, n: 2 }
81
+ command_name: "insert"
@@ -0,0 +1,51 @@
1
+ data:
2
+ - { _id: 1, x: 11 }
3
+
4
+ collection_name: &collection_name "test"
5
+ database_name: &database_name "ruby-driver"
6
+
7
+ tests:
8
+ -
9
+ description: "A successful insert one"
10
+ operation:
11
+ name: "insertOne"
12
+ arguments:
13
+ document: { _id: 2, x: 22 }
14
+ expectations:
15
+ -
16
+ command_started_event:
17
+ command:
18
+ insert: *collection_name
19
+ documents:
20
+ - { _id: 2, x: 22 }
21
+ ordered: true
22
+ command_name: "insert"
23
+ database_name: *database_name
24
+ -
25
+ command_succeeded_event:
26
+ reply: { ok: 1.0, n: 1 }
27
+ command_name: "insert"
28
+ -
29
+ description: "A successful insert one command with write errors"
30
+ operation:
31
+ name: "insertOne"
32
+ arguments:
33
+ document: { _id: 1, x: 11 }
34
+ expectations:
35
+ -
36
+ command_started_event:
37
+ command:
38
+ insert: *collection_name
39
+ documents:
40
+ - { _id: 1, x: 11 }
41
+ ordered: true
42
+ command_name: "insert"
43
+ database_name: *database_name
44
+ -
45
+ command_succeeded_event:
46
+ reply:
47
+ ok: 1.0
48
+ n: 0
49
+ writeErrors:
50
+ - { index: 0, code: 42, errmsg: "" }
51
+ command_name: "insert"
@@ -0,0 +1,67 @@
1
+ data:
2
+ - { _id: 1, x: 11 }
3
+ - { _id: 2, x: 22 }
4
+ - { _id: 3, x: 33 }
5
+
6
+ collection_name: &collection_name "test"
7
+ database_name: &database_name "ruby-driver"
8
+
9
+ tests:
10
+ -
11
+ description: "A successful update many"
12
+ operation:
13
+ name: "updateMany"
14
+ arguments:
15
+ filter:
16
+ _id: { $gt: 1 }
17
+ update:
18
+ $inc: { x: 1 }
19
+ expectations:
20
+ -
21
+ command_started_event:
22
+ command:
23
+ update: *collection_name
24
+ ordered: true
25
+ updates:
26
+ -
27
+ q: { _id: { $gt: 1 }}
28
+ u: { $inc: { x: 1 }}
29
+ multi: true
30
+ upsert: false
31
+ command_name: "update"
32
+ database_name: *database_name
33
+ -
34
+ command_succeeded_event:
35
+ reply: { ok: 1.0, n: 2 }
36
+ command_name: "update"
37
+ -
38
+ description: "A successful update many command with write errors"
39
+ operation:
40
+ name: "updateMany"
41
+ arguments:
42
+ filter:
43
+ _id: { $gt: 1 }
44
+ update:
45
+ $nothing: { x: 1 }
46
+ expectations:
47
+ -
48
+ command_started_event:
49
+ command:
50
+ update: *collection_name
51
+ ordered: true
52
+ updates:
53
+ -
54
+ q: { _id: { $gt: 1 }}
55
+ u: { $nothing: { x: 1 }}
56
+ multi: true
57
+ upsert: false
58
+ command_name: "update"
59
+ database_name: *database_name
60
+ -
61
+ command_succeeded_event:
62
+ reply:
63
+ ok: 1.0
64
+ n: 0
65
+ writeErrors:
66
+ - { index: 0, code: 42, errmsg: "" }
67
+ command_name: "update"
@@ -0,0 +1,95 @@
1
+ data:
2
+ - { _id: 1, x: 11 }
3
+ - { _id: 2, x: 22 }
4
+ - { _id: 3, x: 33 }
5
+
6
+ collection_name: &collection_name "test"
7
+ database_name: &database_name "ruby-driver"
8
+
9
+ tests:
10
+ -
11
+ description: "A successful update one"
12
+ operation:
13
+ name: "updateOne"
14
+ arguments:
15
+ filter:
16
+ _id: { $gt: 1 }
17
+ update:
18
+ $inc: { x: 1 }
19
+ expectations:
20
+ -
21
+ command_started_event:
22
+ command:
23
+ update: *collection_name
24
+ ordered: true
25
+ updates:
26
+ -
27
+ q: { _id: { $gt: 1 }}
28
+ u: { $inc: { x: 1 }}
29
+ multi: false
30
+ upsert: false
31
+ command_name: "update"
32
+ database_name: *database_name
33
+ -
34
+ command_succeeded_event:
35
+ reply: { ok: 1.0, n: 1 }
36
+ command_name: "update"
37
+ -
38
+ description: "A successful update one with upsert when the upserted id is not an object id"
39
+ operation:
40
+ name: "updateOne"
41
+ arguments:
42
+ filter:
43
+ _id: 4
44
+ update:
45
+ $inc: { x: 1 }
46
+ upsert: true
47
+ expectations:
48
+ -
49
+ command_started_event:
50
+ command:
51
+ update: *collection_name
52
+ ordered: true
53
+ updates:
54
+ -
55
+ q: { _id: 4 }
56
+ u: { $inc: { x: 1 } }
57
+ multi: false
58
+ upsert: true
59
+ command_name: "update"
60
+ database_name: *database_name
61
+ -
62
+ command_succeeded_event:
63
+ reply: { ok: 1.0, n: 1, upserted: [{ index: 0, _id: 4 }] }
64
+ command_name: "update"
65
+ -
66
+ description: "A successful update one command with write errors"
67
+ operation:
68
+ name: "updateOne"
69
+ arguments:
70
+ filter:
71
+ _id: { $gt: 1 }
72
+ update:
73
+ $nothing: { x: 1 }
74
+ expectations:
75
+ -
76
+ command_started_event:
77
+ command:
78
+ update: *collection_name
79
+ ordered: true
80
+ updates:
81
+ -
82
+ q: { _id: { $gt: 1 }}
83
+ u: { $nothing: { x: 1 }}
84
+ multi: false
85
+ upsert: false
86
+ command_name: "update"
87
+ database_name: *database_name
88
+ -
89
+ command_succeeded_event:
90
+ reply:
91
+ ok: 1.0
92
+ n: 0
93
+ writeErrors:
94
+ - { index: 0, code: 42, errmsg: "" }
95
+ command_name: "update"
@@ -0,0 +1,365 @@
1
+ # Copyright (C) 2014-2015 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
+
16
+ RSpec::Matchers.define :match_command_name do |expectation|
17
+
18
+ match do |event|
19
+ expect(event.command_name.to_s).to eq(expectation.command_name.to_s)
20
+ end
21
+ end
22
+
23
+ RSpec::Matchers.define :match_database_name do |expectation|
24
+
25
+ match do |event|
26
+ expect(event.database_name.to_s).to eq(expectation.database_name.to_s)
27
+ end
28
+ end
29
+
30
+ RSpec::Matchers.define :generate_request_id do |expectation|
31
+
32
+ match do |event|
33
+ expect(event.request_id).to be > 0
34
+ end
35
+ end
36
+
37
+ RSpec::Matchers.define :generate_operation_id do |expectation|
38
+
39
+ match do |event|
40
+ expect(event.request_id).to be > 0
41
+ end
42
+ end
43
+
44
+ RSpec::Matchers.define :match_command do |expectation|
45
+ include Mongo::CommandMonitoring::Matchable
46
+
47
+ match do |event|
48
+ data_matches?(event.command, expectation.event_data['command'])
49
+ end
50
+ end
51
+
52
+ RSpec::Matchers.define :match_reply do |expectation|
53
+ include Mongo::CommandMonitoring::Matchable
54
+
55
+ match do |event|
56
+ data_matches?(event.reply, expectation.event_data['reply'])
57
+ end
58
+ end
59
+
60
+ RSpec::Matchers.define :match_command_started_event do |expectation|
61
+
62
+ match do |event|
63
+ expect(event).to match_command_name(expectation)
64
+ expect(event).to match_database_name(expectation)
65
+ expect(event).to generate_operation_id
66
+ expect(event).to generate_request_id
67
+ expect(event).to match_command(expectation)
68
+ end
69
+ end
70
+
71
+ RSpec::Matchers.define :match_command_succeeded_event do |expectation|
72
+
73
+ match do |event|
74
+ expect(event).to match_command_name(expectation)
75
+ expect(event).to generate_operation_id
76
+ expect(event).to generate_request_id
77
+ expect(event).to match_reply(expectation)
78
+ end
79
+ end
80
+
81
+ RSpec::Matchers.define :match_command_failed_event do |expectation|
82
+
83
+ match do |event|
84
+ expect(event).to match_command_name(expectation)
85
+ expect(event).to generate_operation_id
86
+ expect(event).to generate_request_id
87
+ end
88
+ end
89
+
90
+ module Mongo
91
+ module CommandMonitoring
92
+
93
+ # Matchers common behaviour.
94
+ #
95
+ # @since 2.1.0
96
+ module Matchable
97
+
98
+ # Determine if the data matches.
99
+ #
100
+ # @example Does the data match?
101
+ # matchable.data_matches?(actual, expected)
102
+ #
103
+ # @param [ Object ] actual The actual data.
104
+ # @param [ Object ] expected The expected data.
105
+ #
106
+ # @return [ true, false ] If the data matches.
107
+ #
108
+ # @since 2.1.0
109
+ def data_matches?(actual, expected)
110
+ case expected
111
+ when ::Hash, BSON::Document then
112
+ hash_matches?(actual, expected)
113
+ when ::Array
114
+ array_matches?(actual, expected)
115
+ else
116
+ value_matches?(actual, expected)
117
+ end
118
+ end
119
+
120
+ # Determine if the hash matches.
121
+ #
122
+ # @example Does the hash match?
123
+ # matchable.hash_matches?(actual, expected)
124
+ #
125
+ # @param [ Hash ] actual The actual hash.
126
+ # @param [ Hash ] expected The expected hash.
127
+ #
128
+ # @return [ true, false ] If the hash matches.
129
+ #
130
+ # @since 2.1.0
131
+ def hash_matches?(actual, expected)
132
+ if expected.keys.first == '$numberLong'
133
+ converted = expected.values.first.to_i
134
+ (actual == converted) || actual >= 0
135
+ else
136
+ expected.each do |key, value|
137
+ return false unless data_matches?(actual[key], value)
138
+ end
139
+ end
140
+ end
141
+
142
+ # Determine if an array matches.
143
+ #
144
+ # @example Does the array match?
145
+ # matchable.array_matches?(actual, expected)
146
+ #
147
+ # @param [ Array ] actual The actual array.
148
+ # @param [ Array ] expected The expected array.
149
+ #
150
+ # @return [ true, false ] If the array matches.
151
+ #
152
+ # @since 2.1.0
153
+ def array_matches?(actual, expected)
154
+ expected.each_with_index do |value, i|
155
+ # @todo: Durran: fix for kill cursors replies
156
+ if actual
157
+ return false unless data_matches?(actual[i], value)
158
+ end
159
+ end
160
+ end
161
+
162
+ # Check if a value matches.
163
+ #
164
+ # @example Does a value match.
165
+ # matchable.value_matches?(actual, expected)
166
+ #
167
+ # @param [ Object ] actual The actual value.
168
+ # @param [ Object ] expected The expected object.
169
+ #
170
+ # @return [ true, false ] If the value matches.
171
+ #
172
+ # @since 2.1.0
173
+ def value_matches?(actual, expected)
174
+ case expected
175
+ when '42', 42 then
176
+ actual > 0
177
+ when '' then
178
+ !actual.nil?
179
+ else
180
+ actual == expected
181
+ end
182
+ end
183
+ end
184
+
185
+ # Represents a command monitoring spec in its entirety.
186
+ #
187
+ # @since 2.1.0
188
+ class Spec
189
+
190
+ # Create the spec.
191
+ #
192
+ # @example Create the spec.
193
+ # Spec.new('/path/to/test')
194
+ #
195
+ # @param [ String ] file The yaml test file.
196
+ #
197
+ # @since 2.1.0
198
+ def initialize(file)
199
+ file = File.new(file)
200
+ @spec = YAML.load(ERB.new(file.read).result)
201
+ file.close
202
+ @data = @spec['data']
203
+ @tests = @spec['tests']
204
+ end
205
+
206
+ # Get all the tests in the spec.
207
+ #
208
+ # @example Get all the tests.
209
+ # spec.tests
210
+ #
211
+ # @return [ Array<Test> ] The tests.
212
+ def tests
213
+ @tests.map do |test|
214
+ Test.new(@data, test)
215
+ end
216
+ end
217
+ end
218
+
219
+ # Represents an individual command monitoring test.
220
+ #
221
+ # @since 2.1.0
222
+ class Test
223
+
224
+ # @return [ String ] description The test description.
225
+ attr_reader :description
226
+
227
+ # @return [ Array<Expectation> ] The expectations.
228
+ attr_reader :expectations
229
+
230
+ # Create the new test.
231
+ #
232
+ # @example Create the test.
233
+ # Test.new(data, test)
234
+ #
235
+ # @param [ Array<Hash> ] data The test data.
236
+ # @param [ Hash ] The test itself.
237
+ #
238
+ # @since 2.1.0
239
+ def initialize(data, test)
240
+ @data = data
241
+ @description = test['description']
242
+ @operation = Mongo::CRUD::Operation.get(test['operation'])
243
+ @expectations = test['expectations'].map{ |e| Expectation.new(e) }
244
+ end
245
+
246
+ # Run the test against the provided collection.
247
+ #
248
+ # @example Run the test.
249
+ # test.run(collection)
250
+ #
251
+ # @param [ Mongo::Collection ] collection The collection.
252
+ #
253
+ # @since 2.1.0
254
+ def run(collection)
255
+ collection.insert_many(@data)
256
+ @operation.execute(collection)
257
+ end
258
+ end
259
+
260
+ # Encapsulates expectation behaviour.
261
+ #
262
+ # @since 2.1.0
263
+ class Expectation
264
+
265
+ # @return [ String ] event_type The type of expected event.
266
+ attr_reader :event_type
267
+
268
+ # @return [ Hash ] event_data The event data.
269
+ attr_reader :event_data
270
+
271
+ # Get the expected command name.
272
+ #
273
+ # @example Get the expected command name.
274
+ # expectation.command_name
275
+ #
276
+ # @return [ String ] The command name.
277
+ #
278
+ # @since 2.1.0
279
+ def command_name
280
+ @event_data['command_name']
281
+ end
282
+
283
+ # Get the expected database name.
284
+ #
285
+ # @example Get the expected database name.
286
+ # expectation.database_name
287
+ #
288
+ # @return [ String ] The database name.
289
+ #
290
+ # @since 2.1.0
291
+ def database_name
292
+ @event_data['database_name']
293
+ end
294
+
295
+ # Get a readable event name.
296
+ #
297
+ # @example Get the event name.
298
+ # expectation.event_name
299
+ #
300
+ # @return [ String ] The event name.
301
+ #
302
+ # @since 2.1.0
303
+ def event_name
304
+ event_type.gsub('_', ' ')
305
+ end
306
+
307
+ # Create the new expectation.
308
+ #
309
+ # @example Create the new expectation.
310
+ # Expectation.new(expectation)
311
+ #
312
+ # @param [ Hash ] expectation The expectation.
313
+ #
314
+ # @since 2.1.0
315
+ def initialize(expectation)
316
+ @event_type = expectation.keys.first
317
+ @event_data = expectation[@event_type]
318
+ end
319
+
320
+ # Get the name of the matcher.
321
+ #
322
+ # @example Get the matcher name.
323
+ # expectation.matcher
324
+ #
325
+ # @return [ String ] The matcher name.
326
+ #
327
+ # @since 2.1.0
328
+ def matcher
329
+ "match_#{event_type}"
330
+ end
331
+ end
332
+
333
+ # The test subscriber to track the events.
334
+ #
335
+ # @since 2.1.0
336
+ class TestSubscriber
337
+
338
+ def started(event)
339
+ command_started_event[event.command_name] = event
340
+ end
341
+
342
+ def succeeded(event)
343
+ command_succeeded_event[event.command_name] = event
344
+ end
345
+
346
+ def failed(event)
347
+ command_failed_event[event.command_name] = event
348
+ end
349
+
350
+ private
351
+
352
+ def command_started_event
353
+ @started_events ||= BSON::Document.new
354
+ end
355
+
356
+ def command_succeeded_event
357
+ @succeeded_events ||= BSON::Document.new
358
+ end
359
+
360
+ def command_failed_event
361
+ @failed_events ||= BSON::Document.new
362
+ end
363
+ end
364
+ end
365
+ end