mongo 2.14.1 → 2.15.0.alpha

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 (230) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +4 -1
  4. data/Rakefile +8 -15
  5. data/lib/mongo/auth/aws/conversation.rb +1 -4
  6. data/lib/mongo/auth/base.rb +13 -7
  7. data/lib/mongo/auth/conversation_base.rb +32 -0
  8. data/lib/mongo/auth/cr/conversation.rb +6 -29
  9. data/lib/mongo/auth/gssapi/conversation.rb +4 -15
  10. data/lib/mongo/auth/ldap/conversation.rb +3 -14
  11. data/lib/mongo/auth/sasl_conversation_base.rb +1 -13
  12. data/lib/mongo/auth/scram_conversation_base.rb +7 -34
  13. data/lib/mongo/auth/user/view.rb +16 -9
  14. data/lib/mongo/auth/x509/conversation.rb +4 -25
  15. data/lib/mongo/bulk_write.rb +21 -18
  16. data/lib/mongo/client.rb +82 -6
  17. data/lib/mongo/cluster/reapers/cursor_reaper.rb +6 -2
  18. data/lib/mongo/cluster.rb +19 -2
  19. data/lib/mongo/collection/view/aggregation.rb +1 -1
  20. data/lib/mongo/collection/view/change_stream.rb +1 -1
  21. data/lib/mongo/collection/view/iterable.rb +7 -17
  22. data/lib/mongo/collection/view/map_reduce.rb +2 -2
  23. data/lib/mongo/collection/view/readable.rb +42 -20
  24. data/lib/mongo/collection/view/writable.rb +14 -14
  25. data/lib/mongo/collection.rb +6 -6
  26. data/lib/mongo/cursor.rb +2 -12
  27. data/lib/mongo/database/view.rb +1 -1
  28. data/lib/mongo/database.rb +8 -3
  29. data/lib/mongo/error/bulk_write_error.rb +17 -3
  30. data/lib/mongo/error/internal_driver_error.rb +22 -0
  31. data/lib/mongo/error/operation_failure.rb +21 -2
  32. data/lib/mongo/error/parser.rb +65 -12
  33. data/lib/mongo/error/server_api_conflict.rb +23 -0
  34. data/lib/mongo/error/server_api_not_supported.rb +24 -0
  35. data/lib/mongo/error/unmet_dependency.rb +21 -0
  36. data/lib/mongo/error.rb +9 -1
  37. data/lib/mongo/index/view.rb +21 -11
  38. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +27 -16
  39. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +26 -15
  40. data/lib/mongo/monitoring.rb +13 -4
  41. data/lib/mongo/operation/collections_info/command.rb +2 -2
  42. data/lib/mongo/operation/collections_info.rb +18 -1
  43. data/lib/mongo/operation/context.rb +99 -0
  44. data/lib/mongo/operation/indexes.rb +15 -1
  45. data/lib/mongo/operation/insert/command.rb +2 -2
  46. data/lib/mongo/operation/insert/legacy.rb +2 -2
  47. data/lib/mongo/operation/insert/op_msg.rb +2 -2
  48. data/lib/mongo/operation/list_collections/result.rb +4 -1
  49. data/lib/mongo/operation/parallel_scan/command.rb +2 -1
  50. data/lib/mongo/operation/result.rb +2 -0
  51. data/lib/mongo/operation/shared/executable.rb +24 -14
  52. data/lib/mongo/operation/shared/executable_no_validate.rb +2 -2
  53. data/lib/mongo/operation/shared/op_msg_or_command.rb +1 -7
  54. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +1 -7
  55. data/lib/mongo/operation/shared/polymorphic_operation.rb +39 -0
  56. data/lib/mongo/operation/shared/read_preference_supported.rb +36 -38
  57. data/lib/mongo/operation/shared/response_handling.rb +23 -23
  58. data/lib/mongo/operation/shared/sessions_supported.rb +15 -5
  59. data/lib/mongo/operation/shared/write.rb +8 -18
  60. data/lib/mongo/operation.rb +2 -2
  61. data/lib/mongo/protocol/compressed.rb +51 -5
  62. data/lib/mongo/protocol/message.rb +20 -2
  63. data/lib/mongo/protocol/msg.rb +38 -13
  64. data/lib/mongo/protocol/query.rb +11 -11
  65. data/lib/mongo/query_cache.rb +30 -0
  66. data/lib/mongo/retryable.rb +1 -1
  67. data/lib/mongo/server/app_metadata.rb +52 -18
  68. data/lib/mongo/server/connection.rb +5 -0
  69. data/lib/mongo/server/connection_base.rb +13 -10
  70. data/lib/mongo/server/connection_pool.rb +6 -2
  71. data/lib/mongo/server/description/features.rb +9 -8
  72. data/lib/mongo/server/description.rb +4 -0
  73. data/lib/mongo/server/monitor/app_metadata.rb +1 -1
  74. data/lib/mongo/server/monitor/connection.rb +9 -10
  75. data/lib/mongo/server/monitor.rb +20 -1
  76. data/lib/mongo/server/pending_connection.rb +24 -6
  77. data/lib/mongo/server/push_monitor.rb +11 -1
  78. data/lib/mongo/server.rb +7 -1
  79. data/lib/mongo/server_selector/secondary_preferred.rb +7 -2
  80. data/lib/mongo/session/session_pool.rb +4 -2
  81. data/lib/mongo/session.rb +2 -2
  82. data/lib/mongo/socket/ssl.rb +8 -0
  83. data/lib/mongo/socket.rb +29 -4
  84. data/lib/mongo/uri/options_mapper.rb +38 -0
  85. data/lib/mongo/utils.rb +15 -0
  86. data/lib/mongo/version.rb +1 -1
  87. data/lib/mongo.rb +23 -0
  88. data/spec/README.md +24 -1
  89. data/spec/integration/auth_spec.rb +25 -15
  90. data/spec/integration/bulk_write_error_message_spec.rb +41 -0
  91. data/spec/integration/change_stream_spec.rb +4 -4
  92. data/spec/integration/command_monitoring_spec.rb +2 -2
  93. data/spec/integration/connection_spec.rb +2 -0
  94. data/spec/integration/docs_examples_spec.rb +8 -1
  95. data/spec/integration/fork_reconnect_spec.rb +4 -1
  96. data/spec/integration/ocsp_verifier_spec.rb +13 -7
  97. data/spec/integration/operation_failure_code_spec.rb +1 -1
  98. data/spec/integration/operation_failure_message_spec.rb +90 -0
  99. data/spec/integration/query_cache_spec.rb +0 -45
  100. data/spec/integration/reconnect_spec.rb +1 -1
  101. data/spec/integration/snappy_compression_spec.rb +25 -0
  102. data/spec/integration/srv_monitoring_spec.rb +1 -1
  103. data/spec/integration/transactions_examples_spec.rb +6 -0
  104. data/spec/integration/zlib_compression_spec.rb +1 -1
  105. data/spec/integration/zstd_compression_spec.rb +26 -0
  106. data/spec/lite_spec_helper.rb +7 -1
  107. data/spec/mongo/address_spec.rb +15 -11
  108. data/spec/mongo/auth/ldap/conversation_spec.rb +1 -1
  109. data/spec/mongo/auth/ldap_spec.rb +5 -1
  110. data/spec/mongo/auth/scram_negotiation_spec.rb +1 -1
  111. data/spec/mongo/auth/scram_spec.rb +1 -1
  112. data/spec/mongo/auth/x509/conversation_spec.rb +3 -3
  113. data/spec/mongo/client_construction_spec.rb +207 -33
  114. data/spec/mongo/client_spec.rb +17 -0
  115. data/spec/mongo/cluster_spec.rb +1 -0
  116. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  117. data/spec/mongo/collection/view/readable_spec.rb +33 -19
  118. data/spec/mongo/collection_crud_spec.rb +4357 -0
  119. data/spec/mongo/collection_ddl_spec.rb +534 -0
  120. data/spec/mongo/collection_spec.rb +5 -4859
  121. data/spec/mongo/database_spec.rb +66 -4
  122. data/spec/mongo/error/bulk_write_error_spec.rb +3 -3
  123. data/spec/mongo/error/parser_spec.rb +37 -6
  124. data/spec/mongo/index/view_spec.rb +4 -0
  125. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +1 -1
  126. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +1 -1
  127. data/spec/mongo/operation/aggregate_spec.rb +2 -1
  128. data/spec/mongo/operation/collections_info_spec.rb +4 -1
  129. data/spec/mongo/operation/command_spec.rb +6 -3
  130. data/spec/mongo/operation/create_index_spec.rb +6 -3
  131. data/spec/mongo/operation/create_user_spec.rb +6 -3
  132. data/spec/mongo/operation/delete/bulk_spec.rb +9 -6
  133. data/spec/mongo/operation/delete_spec.rb +11 -7
  134. data/spec/mongo/operation/drop_index_spec.rb +6 -2
  135. data/spec/mongo/operation/find/legacy_spec.rb +3 -1
  136. data/spec/mongo/operation/get_more_spec.rb +3 -1
  137. data/spec/mongo/operation/indexes_spec.rb +5 -1
  138. data/spec/mongo/operation/insert/bulk_spec.rb +10 -7
  139. data/spec/mongo/operation/insert_spec.rb +15 -12
  140. data/spec/mongo/operation/map_reduce_spec.rb +5 -2
  141. data/spec/mongo/operation/read_preference_legacy_spec.rb +19 -9
  142. data/spec/mongo/operation/read_preference_op_msg_spec.rb +3 -3
  143. data/spec/mongo/operation/remove_user_spec.rb +6 -3
  144. data/spec/mongo/operation/result_spec.rb +1 -1
  145. data/spec/mongo/operation/update/bulk_spec.rb +9 -6
  146. data/spec/mongo/operation/update_spec.rb +10 -7
  147. data/spec/mongo/operation/update_user_spec.rb +4 -1
  148. data/spec/mongo/protocol/compressed_spec.rb +26 -12
  149. data/spec/mongo/query_cache_middleware_spec.rb +55 -0
  150. data/spec/mongo/retryable_spec.rb +3 -2
  151. data/spec/mongo/server/app_metadata_shared.rb +7 -33
  152. data/spec/mongo/server/app_metadata_spec.rb +2 -0
  153. data/spec/mongo/server/connection_pool/populator_spec.rb +3 -1
  154. data/spec/mongo/server/connection_pool_spec.rb +1 -1
  155. data/spec/mongo/server/connection_spec.rb +24 -17
  156. data/spec/mongo/server/monitor/connection_spec.rb +17 -7
  157. data/spec/mongo/server/monitor_spec.rb +9 -1
  158. data/spec/mongo/server_selector/secondary_preferred_spec.rb +6 -6
  159. data/spec/mongo/server_spec.rb +15 -2
  160. data/spec/mongo/socket/ssl_spec.rb +40 -0
  161. data/spec/mongo/socket_spec.rb +2 -2
  162. data/spec/mongo/tls_context_hooks_spec.rb +37 -0
  163. data/spec/runners/connection_string.rb +0 -4
  164. data/spec/runners/crud/requirement.rb +40 -3
  165. data/spec/runners/crud/verifier.rb +8 -0
  166. data/spec/runners/transactions/operation.rb +1 -1
  167. data/spec/runners/transactions/test.rb +1 -0
  168. data/spec/runners/unified/assertions.rb +249 -0
  169. data/spec/runners/unified/change_stream_operations.rb +26 -0
  170. data/spec/runners/unified/crud_operations.rb +199 -0
  171. data/spec/runners/unified/ddl_operations.rb +96 -0
  172. data/spec/runners/unified/entity_map.rb +39 -0
  173. data/spec/runners/unified/error.rb +25 -0
  174. data/spec/runners/unified/event_subscriber.rb +91 -0
  175. data/spec/runners/unified/exceptions.rb +21 -0
  176. data/spec/runners/unified/grid_fs_operations.rb +55 -0
  177. data/spec/runners/unified/support_operations.rb +250 -0
  178. data/spec/runners/unified/test.rb +393 -0
  179. data/spec/runners/unified/test_group.rb +28 -0
  180. data/spec/runners/unified/using_hash.rb +31 -0
  181. data/spec/runners/unified.rb +96 -0
  182. data/spec/shared/lib/mrss/cluster_config.rb +0 -3
  183. data/spec/shared/lib/mrss/docker_runner.rb +0 -3
  184. data/spec/shared/lib/mrss/lite_constraints.rb +0 -16
  185. data/spec/shared/lib/mrss/server_version_registry.rb +0 -3
  186. data/spec/shared/lib/mrss/spec_organizer.rb +0 -3
  187. data/spec/shared/shlib/server.sh +1 -1
  188. data/spec/spec_helper.rb +4 -1
  189. data/spec/spec_tests/crud_unified_spec.rb +10 -0
  190. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -1
  191. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +267 -0
  192. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +60 -0
  193. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount.yml → estimatedDocumentCount-pre4.9.yml} +2 -0
  194. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +146 -0
  195. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors.yml → estimatedDocumentCount-serverErrors-pre4.9.yml} +2 -0
  196. data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +1 -1
  197. data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
  198. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +220 -0
  199. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
  200. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +184 -0
  201. data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
  202. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
  203. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
  204. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
  205. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
  206. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
  207. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +170 -0
  208. data/spec/spec_tests/data/uri_options/compression-options.yml +1 -1
  209. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +416 -0
  210. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +409 -0
  211. data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +67 -0
  212. data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
  213. data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +44 -0
  214. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +180 -0
  215. data/spec/spec_tests/unified_spec.rb +15 -0
  216. data/spec/spec_tests/uri_options_spec.rb +16 -0
  217. data/spec/spec_tests/versioned_api_spec.rb +10 -0
  218. data/spec/support/client_registry.rb +4 -8
  219. data/spec/support/client_registry_macros.rb +4 -4
  220. data/spec/support/common_shortcuts.rb +15 -1
  221. data/spec/support/shared/session.rb +2 -2
  222. data/spec/support/spec_config.rb +42 -11
  223. data/spec/support/utils.rb +64 -3
  224. data.tar.gz.sig +0 -0
  225. metadata +1005 -915
  226. metadata.gz.sig +0 -0
  227. data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +0 -58
  228. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +0 -47
  229. data/spec/integration/secondary_reads_spec.rb +0 -102
  230. data/spec/support/cluster_config.rb +0 -207
@@ -0,0 +1,220 @@
1
+ description: "poc-change-streams"
2
+
3
+ schemaVersion: "1.0"
4
+
5
+ createEntities:
6
+ # Entities for creating changeStreams
7
+ - client:
8
+ id: &client0 client0
9
+ useMultipleMongoses: false
10
+ observeEvents: [ commandStartedEvent ]
11
+ # Original tests do not observe getMore commands but only because event
12
+ # assertions ignore extra events. killCursors is explicitly ignored.
13
+ ignoreCommandMonitoringEvents: [ getMore, killCursors ]
14
+ - database:
15
+ id: &database0 database0
16
+ client: *client0
17
+ databaseName: &database0Name change-stream-tests
18
+ - collection:
19
+ id: &collection0 collection0
20
+ database: *database0
21
+ collectionName: &collection0Name test
22
+ # Entities for executing insert operations
23
+ - client:
24
+ id: &client1 client1
25
+ useMultipleMongoses: false
26
+ - database:
27
+ id: &database1 database1
28
+ client: *client1
29
+ databaseName: &database1Name change-stream-tests
30
+ - database:
31
+ id: &database2 database2
32
+ client: *client1
33
+ databaseName: &database2Name change-stream-tests-2
34
+ - collection:
35
+ id: &collection1 collection1
36
+ database: *database1
37
+ collectionName: &collection1Name test
38
+ - collection:
39
+ id: &collection2 collection2
40
+ database: *database1
41
+ collectionName: &collection2Name test2
42
+ - collection:
43
+ id: &collection3 collection3
44
+ database: *database2
45
+ collectionName: &collection3Name test
46
+
47
+ initialData:
48
+ - collectionName: *collection1Name
49
+ databaseName: *database1Name
50
+ documents: []
51
+ - collectionName: *collection2Name
52
+ databaseName: *database1Name
53
+ documents: []
54
+ - collectionName: *collection3Name
55
+ databaseName: *database2Name
56
+ documents: []
57
+
58
+ tests:
59
+ - description: "Executing a watch helper on a MongoClient results in notifications for changes to all collections in all databases in the cluster."
60
+ runOnRequirements:
61
+ - minServerVersion: "3.8.0"
62
+ topologies: [ replicaset ]
63
+ operations:
64
+ - name: createChangeStream
65
+ object: *client0
66
+ arguments:
67
+ pipeline: []
68
+ saveResultAsEntity: &changeStream0 changeStream0
69
+ - name: insertOne
70
+ object: *collection2
71
+ arguments:
72
+ document: { x: 1 }
73
+ - name: insertOne
74
+ object: *collection3
75
+ arguments:
76
+ document: { y: 1 }
77
+ - name: insertOne
78
+ object: *collection1
79
+ arguments:
80
+ document: { z: 1 }
81
+ - name: iterateUntilDocumentOrError
82
+ object: *changeStream0
83
+ expectResult:
84
+ operationType: insert
85
+ ns:
86
+ db: *database1Name
87
+ coll: *collection2Name
88
+ fullDocument:
89
+ _id: { $$type: objectId }
90
+ x: 1
91
+ - name: iterateUntilDocumentOrError
92
+ object: *changeStream0
93
+ expectResult:
94
+ operationType: insert
95
+ ns:
96
+ db: *database2Name
97
+ coll: *collection3Name
98
+ fullDocument:
99
+ # Original tests did not include _id, but matching now only permits
100
+ # extra keys for root-level documents.
101
+ _id: { $$type: objectId }
102
+ y: 1
103
+ - name: iterateUntilDocumentOrError
104
+ object: *changeStream0
105
+ expectResult:
106
+ operationType: insert
107
+ ns:
108
+ db: *database1Name
109
+ coll: *collection1Name
110
+ fullDocument:
111
+ _id: { $$type: objectId }
112
+ z: 1
113
+ expectEvents:
114
+ - client: *client0
115
+ events:
116
+ - commandStartedEvent:
117
+ command:
118
+ aggregate: 1
119
+ cursor: {}
120
+ pipeline:
121
+ - $changeStream:
122
+ allChangesForCluster: true
123
+ # Some drivers may send a default value for fullDocument
124
+ # or omit it entirely (see: SPEC-1350).
125
+ fullDocument: { $$unsetOrMatches: default }
126
+ commandName: aggregate
127
+ databaseName: admin
128
+
129
+ - description: "Test consecutive resume"
130
+ runOnRequirements:
131
+ - minServerVersion: "4.1.7"
132
+ topologies: [ replicaset ]
133
+ operations:
134
+ - name: failPoint
135
+ object: testRunner
136
+ arguments:
137
+ client: *client0
138
+ failPoint:
139
+ configureFailPoint: failCommand
140
+ mode: { times: 2 }
141
+ data:
142
+ failCommands: [ getMore ]
143
+ closeConnection: true
144
+ - name: createChangeStream
145
+ object: *collection0
146
+ arguments:
147
+ batchSize: 1
148
+ pipeline: []
149
+ saveResultAsEntity: *changeStream0
150
+ - name: insertOne
151
+ object: *collection1
152
+ arguments:
153
+ document: { x: 1 }
154
+ - name: insertOne
155
+ object: *collection1
156
+ arguments:
157
+ document: { x: 2 }
158
+ - name: insertOne
159
+ object: *collection1
160
+ arguments:
161
+ document: { x: 3 }
162
+ - name: iterateUntilDocumentOrError
163
+ object: *changeStream0
164
+ expectResult:
165
+ operationType: insert
166
+ ns:
167
+ db: *database1Name
168
+ coll: *collection1Name
169
+ fullDocument:
170
+ _id: { $$type: objectId }
171
+ x: 1
172
+ - name: iterateUntilDocumentOrError
173
+ object: *changeStream0
174
+ expectResult:
175
+ operationType: insert
176
+ ns:
177
+ db: *database1Name
178
+ coll: *collection1Name
179
+ fullDocument:
180
+ _id: { $$type: objectId }
181
+ x: 2
182
+ - name: iterateUntilDocumentOrError
183
+ object: *changeStream0
184
+ expectResult:
185
+ operationType: insert
186
+ ns:
187
+ db: *database1Name
188
+ coll: *collection1Name
189
+ fullDocument:
190
+ _id: { $$type: objectId }
191
+ x: 3
192
+ expectEvents:
193
+ - client: *client0
194
+ events:
195
+ - commandStartedEvent:
196
+ command:
197
+ aggregate: *collection1Name
198
+ cursor: { batchSize: 1 }
199
+ pipeline:
200
+ - $changeStream:
201
+ fullDocument: { $$unsetOrMatches: default }
202
+ commandName: aggregate
203
+ databaseName: *database1Name
204
+ # The original test only asserted the first command, since expected
205
+ # events were only an ordered subset. This file does ignore getMore
206
+ # commands but we must expect the subsequent aggregate commands, since
207
+ # each failed getMore will resume. While doing so we can also assert
208
+ # that those commands include a resume token.
209
+ - &resumingAggregate
210
+ commandStartedEvent:
211
+ command:
212
+ aggregate: *collection1Name
213
+ cursor: { batchSize: 1 }
214
+ pipeline:
215
+ - $changeStream:
216
+ fullDocument: { $$unsetOrMatches: default }
217
+ resumeAfter: { $$exists: true }
218
+ commandName: aggregate
219
+ databaseName: *database0Name
220
+ - *resumingAggregate
@@ -0,0 +1,102 @@
1
+ description: "poc-command-monitoring"
2
+
3
+ schemaVersion: "1.0"
4
+
5
+ createEntities:
6
+ - client:
7
+ id: &client0 client0
8
+ observeEvents:
9
+ - commandStartedEvent
10
+ - commandSucceededEvent
11
+ - commandFailedEvent
12
+ - database:
13
+ id: &database0 database0
14
+ client: *client0
15
+ databaseName: &database0Name command-monitoring-tests
16
+ - collection:
17
+ id: &collection0 collection0
18
+ database: *database0
19
+ collectionName: &collection0Name test
20
+
21
+ initialData:
22
+ - collectionName: *collection0Name
23
+ databaseName: *database0Name
24
+ documents:
25
+ - { _id: 1, x: 11 }
26
+ - { _id: 2, x: 22 }
27
+ - { _id: 3, x: 33 }
28
+ - { _id: 4, x: 44 }
29
+ - { _id: 5, x: 55 }
30
+
31
+ tests:
32
+ - description: "A successful find event with a getmore and the server kills the cursor"
33
+ runOnRequirements:
34
+ - minServerVersion: "3.1"
35
+ topologies: [ single, replicaset ]
36
+ operations:
37
+ - name: find
38
+ object: *collection0
39
+ arguments:
40
+ filter: { _id: { $gte: 1 }}
41
+ sort: { _id: 1 }
42
+ batchSize: 3
43
+ limit: 4
44
+ expectEvents:
45
+ - client: *client0
46
+ events:
47
+ - commandStartedEvent:
48
+ command:
49
+ find: *collection0Name
50
+ filter: { _id: { $gte : 1 } }
51
+ sort: { _id: 1 }
52
+ batchSize: 3
53
+ limit: 4
54
+ commandName: find
55
+ databaseName: *database0Name
56
+ - commandSucceededEvent:
57
+ reply:
58
+ ok: 1
59
+ cursor:
60
+ id: { $$type: [ int, long ] }
61
+ ns: &namespace command-monitoring-tests.test
62
+ firstBatch:
63
+ - { _id: 1, x: 11 }
64
+ - { _id: 2, x: 22 }
65
+ - { _id: 3, x: 33 }
66
+ commandName: find
67
+ - commandStartedEvent:
68
+ command:
69
+ getMore: { $$type: [ int, long ] }
70
+ collection: *collection0Name
71
+ # https://jira.mongodb.org/browse/RUBY-2443
72
+ batchSize: 3
73
+ commandName: getMore
74
+ databaseName: *database0Name
75
+ - commandSucceededEvent:
76
+ reply:
77
+ ok: 1
78
+ cursor:
79
+ id: 0
80
+ ns: *namespace
81
+ nextBatch:
82
+ - { _id: 4, x: 44 }
83
+ commandName: getMore
84
+
85
+ - description: "A failed find event"
86
+ operations:
87
+ - name: find
88
+ object: *collection0
89
+ arguments:
90
+ filter: { $or: true }
91
+ expectError: { isError: true }
92
+ expectEvents:
93
+ - client: *client0
94
+ events:
95
+ - commandStartedEvent:
96
+ command:
97
+ find: *collection0Name
98
+ filter: { $or: true }
99
+ commandName: find
100
+ databaseName: *database0Name
101
+ - commandFailedEvent:
102
+ commandName: find
@@ -0,0 +1,184 @@
1
+ description: "poc-crud"
2
+
3
+ schemaVersion: "1.0"
4
+
5
+ createEntities:
6
+ - client:
7
+ id: &client0 client0
8
+ observeEvents: [ commandStartedEvent ]
9
+ - database:
10
+ id: &database0 database0
11
+ client: *client0
12
+ databaseName: &database0Name crud-tests
13
+ - database:
14
+ id: &database1 database1
15
+ client: *client0
16
+ databaseName: &database1Name admin
17
+ - collection:
18
+ id: &collection0 collection0
19
+ database: *database0
20
+ collectionName: &collection0Name coll0
21
+ - collection:
22
+ id: &collection1 collection1
23
+ database: *database0
24
+ collectionName: &collection1Name coll1
25
+ - collection:
26
+ id: &collection2 collection2
27
+ database: *database0
28
+ collectionName: &collection2Name coll2
29
+ collectionOptions:
30
+ readConcern: { level: majority }
31
+
32
+ initialData:
33
+ - collectionName: *collection0Name
34
+ databaseName: *database0Name
35
+ documents:
36
+ - { _id: 1, x: 11 }
37
+ - { _id: 2, x: 22 }
38
+ - collectionName: *collection1Name
39
+ databaseName: *database0Name
40
+ documents:
41
+ - { _id: 1, x: 11 }
42
+ - collectionName: *collection2Name
43
+ databaseName: *database0Name
44
+ documents:
45
+ - { _id: 1, x: 11 }
46
+ - { _id: 2, x: 22 }
47
+ - { _id: 3, x: 33 }
48
+ - collectionName: &out aggregate_out
49
+ databaseName: *database0Name
50
+ documents: []
51
+
52
+ tests:
53
+ - description: "BulkWrite with mixed ordered operations"
54
+ operations:
55
+ - name: bulkWrite
56
+ object: *collection0
57
+ arguments:
58
+ requests:
59
+ - insertOne:
60
+ document: { _id: 3, x: 33 }
61
+ - updateOne:
62
+ filter: { _id: 2 }
63
+ update: { $inc: { x: 1 } }
64
+ - updateMany:
65
+ filter: { _id: { $gt: 1 } }
66
+ update: { $inc: { x: 1 } }
67
+ - insertOne:
68
+ document: { _id: 4, x: 44 }
69
+ - deleteMany:
70
+ filter: { x: { $nin: [ 24, 34 ] } }
71
+ - replaceOne:
72
+ filter: { _id: 4 }
73
+ replacement: { _id: 4, x: 44 }
74
+ upsert: true
75
+ ordered: true
76
+ expectResult:
77
+ deletedCount: 2
78
+ insertedCount: 2
79
+ insertedIds: { $$unsetOrMatches: { 0: 3, 3: 4 } }
80
+ matchedCount: 3
81
+ modifiedCount: 3
82
+ upsertedCount: 1
83
+ upsertedIds: { 5: 4 }
84
+ outcome:
85
+ - collectionName: *collection0Name
86
+ databaseName: *database0Name
87
+ documents:
88
+ - {_id: 2, x: 24 }
89
+ - {_id: 3, x: 34 }
90
+ - {_id: 4, x: 44 }
91
+
92
+ - description: "InsertMany continue-on-error behavior with unordered (duplicate key in requests)"
93
+ operations:
94
+ - name: insertMany
95
+ object: *collection1
96
+ arguments:
97
+ documents:
98
+ - { _id: 2, x: 22 }
99
+ - { _id: 2, x: 22 }
100
+ - { _id: 3, x: 33 }
101
+ ordered: false
102
+ expectError:
103
+ expectResult:
104
+ deletedCount: 0
105
+ insertedCount: 2
106
+ # Since the map of insertedIds is generated before execution it
107
+ # could indicate inserts that did not actually succeed. We omit
108
+ # this field rather than expect drivers to provide an accurate
109
+ # map filtered by write errors.
110
+ matchedCount: 0
111
+ modifiedCount: 0
112
+ upsertedCount: 0
113
+ upsertedIds: { }
114
+ outcome:
115
+ - collectionName: *collection1Name
116
+ databaseName: *database0Name
117
+ documents:
118
+ - { _id: 1, x: 11 }
119
+ - { _id: 2, x: 22 }
120
+ - { _id: 3, x: 33 }
121
+
122
+ - description: "ReplaceOne prohibits atomic modifiers"
123
+ skipReason: RUBY-2437
124
+ operations:
125
+ - name: replaceOne
126
+ object: *collection1
127
+ arguments:
128
+ filter: { _id: 1 }
129
+ replacement: { $set: { x: 22 }}
130
+ expectError:
131
+ isClientError: true
132
+ expectEvents:
133
+ - client: *client0
134
+ events: []
135
+ outcome:
136
+ - collectionName: *collection1Name
137
+ databaseName: *database0Name
138
+ documents:
139
+ - { _id: 1, x: 11 }
140
+
141
+ - description: "readConcern majority with out stage"
142
+ runOnRequirements:
143
+ - minServerVersion: "4.1.0"
144
+ topologies: [ replicaset, sharded-replicaset ]
145
+ operations:
146
+ - name: aggregate
147
+ object: *collection2
148
+ arguments:
149
+ pipeline: &pipeline
150
+ - $sort: { x : 1 }
151
+ - $match: { _id: { $gt: 1 } }
152
+ - $out: *out
153
+ expectEvents:
154
+ - client: *client0
155
+ events:
156
+ - commandStartedEvent:
157
+ command:
158
+ aggregate: *collection2Name
159
+ pipeline: *pipeline
160
+ readConcern: { level: majority }
161
+ # The following two assertions were not in the original test
162
+ commandName: aggregate
163
+ databaseName: *database0Name
164
+ outcome:
165
+ - collectionName: *out
166
+ databaseName: *database0Name
167
+ documents:
168
+ - { _id: 2, x: 22 }
169
+ - { _id: 3, x: 33 }
170
+
171
+ - description: "Aggregate with $listLocalSessions"
172
+ runOnRequirements:
173
+ - minServerVersion: "3.6.0"
174
+ operations:
175
+ - name: aggregate
176
+ object: *database1
177
+ arguments:
178
+ pipeline:
179
+ - $listLocalSessions: { }
180
+ - $limit: 1
181
+ - $addFields: { dummy: "dummy field"}
182
+ - $project: { _id: 0, dummy: 1}
183
+ expectResult:
184
+ - { dummy: "dummy field" }
@@ -0,0 +1,155 @@
1
+ description: "poc-gridfs"
2
+
3
+ schemaVersion: "1.0"
4
+
5
+ createEntities:
6
+ - client:
7
+ id: &client0 client0
8
+ - database:
9
+ id: &database0 database0
10
+ client: *client0
11
+ databaseName: &database0Name gridfs-tests
12
+ - bucket:
13
+ id: &bucket0 bucket0
14
+ database: *database0
15
+ - collection:
16
+ id: &bucket0_files_collection bucket0_files_collection
17
+ database: *database0
18
+ collectionName: &bucket0_files_collectionName fs.files
19
+ - collection:
20
+ id: &bucket0_chunks_collection bucket0_chunks_collection
21
+ database: *database0
22
+ collectionName: &bucket0_chunks_collectionName fs.chunks
23
+
24
+ initialData:
25
+ - collectionName: *bucket0_files_collectionName
26
+ databaseName: *database0Name
27
+ documents:
28
+ - _id: { $oid: "000000000000000000000005" }
29
+ length: 10
30
+ chunkSize: 4
31
+ uploadDate: { $date: "1970-01-01T00:00:00.000Z" }
32
+ md5: "57d83cd477bfb1ccd975ab33d827a92b"
33
+ filename: "length-10"
34
+ contentType: "application/octet-stream"
35
+ aliases: []
36
+ metadata: {}
37
+ - collectionName: *bucket0_chunks_collectionName
38
+ databaseName: *database0Name
39
+ documents:
40
+ - _id: { $oid: "000000000000000000000005" }
41
+ files_id: { $oid: "000000000000000000000005" }
42
+ n: 0
43
+ data: { $binary: { base64: "ESIzRA==", subType: "00" } } # hex: 11223344
44
+ - _id: { $oid: "000000000000000000000006" }
45
+ files_id: { $oid: "000000000000000000000005" }
46
+ n: 1
47
+ data: { $binary: { base64: "VWZ3iA==", subType: "00" } } # hex: 55667788
48
+ - _id: { $oid: "000000000000000000000007" }
49
+ files_id: { $oid: "000000000000000000000005" }
50
+ n: 2
51
+ data: { $binary: { base64: "mao=", subType: "00" } } # hex: 99aa
52
+
53
+ tests:
54
+ # Changed from original test ("length is 8") to operate on same initialData
55
+ - description: "Delete when length is 10"
56
+ operations:
57
+ - name: delete
58
+ object: *bucket0
59
+ arguments:
60
+ id: { $oid: "000000000000000000000005" }
61
+ # Original test uses "assert.data" syntax to modify outcome collection for
62
+ # comparison. This can be accomplished using "outcome" directly.
63
+ outcome:
64
+ - collectionName: *bucket0_files_collectionName
65
+ databaseName: *database0Name
66
+ documents: []
67
+ - collectionName: *bucket0_chunks_collectionName
68
+ databaseName: *database0Name
69
+ documents: []
70
+
71
+ - description: "Download when there are three chunks"
72
+ operations:
73
+ # Original test uses "download" operation. We use an explicit operation
74
+ # that returns a stream and then assert the contents of that stream.
75
+ - name: download
76
+ object: *bucket0
77
+ arguments:
78
+ id: { $oid: "000000000000000000000005" }
79
+ expectResult: { $$matchesHexBytes: "112233445566778899aa" }
80
+
81
+ - description: "Download when files entry does not exist"
82
+ operations:
83
+ - name: download
84
+ object: *bucket0
85
+ arguments:
86
+ id: { $oid: "000000000000000000000000" }
87
+ # Original test expects "FileNotFound" error, which isn't specified
88
+ expectError: { isError: true }
89
+
90
+ - description: "Download when an intermediate chunk is missing"
91
+ operations:
92
+ # Original test uses "arrange" syntax to modify initialData. This can be
93
+ # accomplished as a delete operation on the chunks collection.
94
+ - name: deleteOne
95
+ object: *bucket0_chunks_collection
96
+ arguments:
97
+ filter:
98
+ files_id: { $oid: "000000000000000000000005" }
99
+ n: 1
100
+ expectResult:
101
+ deletedCount: 1
102
+ - name: download
103
+ object: *bucket0
104
+ arguments:
105
+ id: { $oid: "000000000000000000000005" }
106
+ # Original test expects "ChunkIsMissing" error, which isn't specified
107
+ expectError: { isError: true }
108
+
109
+ - description: "Upload when length is 5"
110
+ operations:
111
+ # Original test uses "upload" operation. We use an explicit operation
112
+ # that takes a stream, which has been created from the expected hex bytes.
113
+ - name: upload
114
+ object: *bucket0
115
+ arguments:
116
+ filename: filename
117
+ source: { $$hexBytes: "1122334455" }
118
+ chunkSizeBytes: 4
119
+ # Original test references the result directly in "assert.data". Here,
120
+ # we need to save the result as an entity, which we can later reference.
121
+ expectResult: { $$type: objectId }
122
+ saveResultAsEntity: &oid0 oid0
123
+ # "outcome" does not allow operators, but we can perform the assertions
124
+ # with separate find operations.
125
+ - name: find
126
+ object: *bucket0_files_collection
127
+ arguments:
128
+ filter: {}
129
+ sort: { uploadDate: -1 }
130
+ limit: 1
131
+ expectResult:
132
+ - _id: { $$matchesEntity: *oid0 }
133
+ length: 5
134
+ chunkSize: 4
135
+ uploadDate: { $$type: date }
136
+ # The md5 field is deprecated so some drivers do not calculate it when uploading files.
137
+ md5: { $$unsetOrMatches: "283d4fea5dded59cf837d3047328f5af" }
138
+ filename: filename
139
+ - name: find
140
+ object: *bucket0_chunks_collection
141
+ arguments:
142
+ # We cannot use the saved ObjectId when querying, but filtering by a
143
+ # non-zero timestamp will exclude initialData and sort can return the
144
+ # expected chunks in order.
145
+ filter: { _id: { $gt: { $oid: "000000000000000000000007" } } }
146
+ sort: { n: 1 }
147
+ expectResult:
148
+ - _id: { $$type: objectId }
149
+ files_id: { $$matchesEntity: *oid0 }
150
+ n: 0
151
+ data: { $binary: { base64: "ESIzRA==", subType: "00" } } # hex 11223344
152
+ - _id: { $$type: objectId }
153
+ files_id: { $$matchesEntity: *oid0 }
154
+ n: 1
155
+ data: { $binary: { base64: "VQ==", subType: "00" } } # hex 55