mongo 2.14.0 → 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.tar.gz.sig +0 -0
  4. data/README.md +4 -1
  5. data/Rakefile +8 -15
  6. data/lib/mongo.rb +23 -0
  7. data/lib/mongo/auth/aws/conversation.rb +1 -4
  8. data/lib/mongo/auth/base.rb +13 -7
  9. data/lib/mongo/auth/conversation_base.rb +32 -0
  10. data/lib/mongo/auth/cr/conversation.rb +6 -29
  11. data/lib/mongo/auth/gssapi/conversation.rb +4 -15
  12. data/lib/mongo/auth/ldap/conversation.rb +3 -14
  13. data/lib/mongo/auth/sasl_conversation_base.rb +1 -13
  14. data/lib/mongo/auth/scram_conversation_base.rb +7 -34
  15. data/lib/mongo/auth/user/view.rb +16 -9
  16. data/lib/mongo/auth/x509/conversation.rb +4 -25
  17. data/lib/mongo/background_thread.rb +11 -0
  18. data/lib/mongo/bulk_write.rb +21 -18
  19. data/lib/mongo/client.rb +82 -6
  20. data/lib/mongo/cluster.rb +19 -28
  21. data/lib/mongo/cluster/reapers/cursor_reaper.rb +6 -2
  22. data/lib/mongo/cluster/sdam_flow.rb +14 -0
  23. data/lib/mongo/collection.rb +8 -6
  24. data/lib/mongo/collection/view/aggregation.rb +1 -1
  25. data/lib/mongo/collection/view/change_stream.rb +1 -1
  26. data/lib/mongo/collection/view/iterable.rb +1 -1
  27. data/lib/mongo/collection/view/map_reduce.rb +2 -2
  28. data/lib/mongo/collection/view/readable.rb +42 -20
  29. data/lib/mongo/collection/view/writable.rb +14 -14
  30. data/lib/mongo/cursor.rb +2 -2
  31. data/lib/mongo/database.rb +22 -5
  32. data/lib/mongo/database/view.rb +1 -1
  33. data/lib/mongo/error.rb +9 -1
  34. data/lib/mongo/error/bulk_write_error.rb +17 -3
  35. data/lib/mongo/error/internal_driver_error.rb +22 -0
  36. data/lib/mongo/error/operation_failure.rb +21 -2
  37. data/lib/mongo/error/parser.rb +65 -12
  38. data/lib/mongo/error/server_api_conflict.rb +23 -0
  39. data/lib/mongo/error/server_api_not_supported.rb +24 -0
  40. data/lib/mongo/error/unmet_dependency.rb +21 -0
  41. data/lib/mongo/grid/fs_bucket.rb +37 -37
  42. data/lib/mongo/index/view.rb +21 -11
  43. data/lib/mongo/monitoring.rb +13 -4
  44. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +27 -16
  45. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +26 -15
  46. data/lib/mongo/operation.rb +2 -2
  47. data/lib/mongo/operation/collections_info.rb +18 -1
  48. data/lib/mongo/operation/collections_info/command.rb +2 -2
  49. data/lib/mongo/operation/context.rb +99 -0
  50. data/lib/mongo/operation/indexes.rb +15 -1
  51. data/lib/mongo/operation/insert/command.rb +2 -2
  52. data/lib/mongo/operation/insert/legacy.rb +2 -2
  53. data/lib/mongo/operation/insert/op_msg.rb +2 -2
  54. data/lib/mongo/operation/list_collections/result.rb +4 -1
  55. data/lib/mongo/operation/result.rb +2 -0
  56. data/lib/mongo/operation/shared/executable.rb +24 -14
  57. data/lib/mongo/operation/shared/executable_no_validate.rb +2 -2
  58. data/lib/mongo/operation/shared/op_msg_or_command.rb +1 -7
  59. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +1 -7
  60. data/lib/mongo/operation/shared/polymorphic_operation.rb +39 -0
  61. data/lib/mongo/operation/shared/response_handling.rb +23 -23
  62. data/lib/mongo/operation/shared/sessions_supported.rb +13 -2
  63. data/lib/mongo/operation/shared/write.rb +8 -18
  64. data/lib/mongo/protocol/compressed.rb +51 -5
  65. data/lib/mongo/protocol/message.rb +20 -2
  66. data/lib/mongo/protocol/msg.rb +36 -11
  67. data/lib/mongo/query_cache.rb +30 -0
  68. data/lib/mongo/retryable.rb +1 -1
  69. data/lib/mongo/server.rb +7 -15
  70. data/lib/mongo/server/app_metadata.rb +52 -18
  71. data/lib/mongo/server/connection.rb +5 -0
  72. data/lib/mongo/server/connection_base.rb +13 -10
  73. data/lib/mongo/server/connection_pool.rb +6 -4
  74. data/lib/mongo/server/description.rb +4 -0
  75. data/lib/mongo/server/description/features.rb +9 -8
  76. data/lib/mongo/server/monitor.rb +20 -1
  77. data/lib/mongo/server/monitor/app_metadata.rb +1 -1
  78. data/lib/mongo/server/monitor/connection.rb +9 -10
  79. data/lib/mongo/server/pending_connection.rb +24 -6
  80. data/lib/mongo/server/push_monitor.rb +11 -1
  81. data/lib/mongo/session.rb +2 -2
  82. data/lib/mongo/session/session_pool.rb +4 -2
  83. data/lib/mongo/socket.rb +29 -4
  84. data/lib/mongo/socket/ssl.rb +8 -0
  85. data/lib/mongo/srv/monitor.rb +0 -11
  86. data/lib/mongo/uri/options_mapper.rb +38 -0
  87. data/lib/mongo/utils.rb +15 -0
  88. data/lib/mongo/version.rb +1 -1
  89. data/spec/README.md +24 -1
  90. data/spec/integration/auth_spec.rb +25 -15
  91. data/spec/integration/bulk_write_error_message_spec.rb +41 -0
  92. data/spec/integration/change_stream_spec.rb +4 -4
  93. data/spec/integration/command_monitoring_spec.rb +2 -2
  94. data/spec/integration/connection_spec.rb +2 -0
  95. data/spec/integration/docs_examples_spec.rb +8 -1
  96. data/spec/integration/fork_reconnect_spec.rb +4 -1
  97. data/spec/integration/ocsp_verifier_spec.rb +13 -7
  98. data/spec/integration/operation_failure_code_spec.rb +1 -1
  99. data/spec/integration/operation_failure_message_spec.rb +90 -0
  100. data/spec/integration/reconnect_spec.rb +1 -1
  101. data/spec/integration/sdam_error_handling_spec.rb +1 -1
  102. data/spec/integration/sdam_events_spec.rb +3 -5
  103. data/spec/integration/snappy_compression_spec.rb +25 -0
  104. data/spec/integration/srv_monitoring_spec.rb +1 -1
  105. data/spec/integration/transactions_examples_spec.rb +6 -0
  106. data/spec/integration/zlib_compression_spec.rb +1 -1
  107. data/spec/integration/zstd_compression_spec.rb +26 -0
  108. data/spec/lite_spec_helper.rb +7 -1
  109. data/spec/mongo/address_spec.rb +15 -11
  110. data/spec/mongo/auth/ldap/conversation_spec.rb +1 -1
  111. data/spec/mongo/auth/ldap_spec.rb +5 -1
  112. data/spec/mongo/auth/scram_negotiation_spec.rb +1 -1
  113. data/spec/mongo/auth/scram_spec.rb +1 -1
  114. data/spec/mongo/auth/x509/conversation_spec.rb +3 -3
  115. data/spec/mongo/client_construction_spec.rb +207 -33
  116. data/spec/mongo/client_spec.rb +17 -0
  117. data/spec/mongo/cluster_spec.rb +3 -18
  118. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  119. data/spec/mongo/collection/view/readable_spec.rb +33 -19
  120. data/spec/mongo/collection_crud_spec.rb +4357 -0
  121. data/spec/mongo/collection_ddl_spec.rb +534 -0
  122. data/spec/mongo/collection_spec.rb +5 -4859
  123. data/spec/mongo/database_spec.rb +66 -4
  124. data/spec/mongo/error/bulk_write_error_spec.rb +3 -3
  125. data/spec/mongo/error/parser_spec.rb +37 -6
  126. data/spec/mongo/index/view_spec.rb +8 -2
  127. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +1 -1
  128. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +1 -1
  129. data/spec/mongo/operation/aggregate_spec.rb +2 -1
  130. data/spec/mongo/operation/collections_info_spec.rb +4 -1
  131. data/spec/mongo/operation/command_spec.rb +6 -3
  132. data/spec/mongo/operation/create_index_spec.rb +6 -3
  133. data/spec/mongo/operation/create_user_spec.rb +6 -3
  134. data/spec/mongo/operation/delete/bulk_spec.rb +9 -6
  135. data/spec/mongo/operation/delete_spec.rb +11 -7
  136. data/spec/mongo/operation/drop_index_spec.rb +6 -2
  137. data/spec/mongo/operation/find/legacy_spec.rb +3 -1
  138. data/spec/mongo/operation/get_more_spec.rb +3 -1
  139. data/spec/mongo/operation/indexes_spec.rb +5 -1
  140. data/spec/mongo/operation/insert/bulk_spec.rb +10 -7
  141. data/spec/mongo/operation/insert_spec.rb +15 -12
  142. data/spec/mongo/operation/map_reduce_spec.rb +5 -2
  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_spec.rb +2 -0
  152. data/spec/mongo/server/connection_pool/populator_spec.rb +3 -1
  153. data/spec/mongo/server/connection_pool_spec.rb +1 -1
  154. data/spec/mongo/server/connection_spec.rb +24 -17
  155. data/spec/mongo/server/monitor/connection_spec.rb +17 -7
  156. data/spec/mongo/server/monitor_spec.rb +9 -1
  157. data/spec/mongo/server_spec.rb +15 -2
  158. data/spec/mongo/socket/ssl_spec.rb +40 -0
  159. data/spec/mongo/socket_spec.rb +2 -2
  160. data/spec/mongo/tls_context_hooks_spec.rb +37 -0
  161. data/spec/runners/connection_string.rb +0 -4
  162. data/spec/runners/crud/requirement.rb +40 -3
  163. data/spec/runners/crud/verifier.rb +8 -0
  164. data/spec/runners/transactions/operation.rb +13 -2
  165. data/spec/runners/transactions/test.rb +1 -0
  166. data/spec/runners/unified.rb +96 -0
  167. data/spec/runners/unified/assertions.rb +249 -0
  168. data/spec/runners/unified/change_stream_operations.rb +26 -0
  169. data/spec/runners/unified/crud_operations.rb +199 -0
  170. data/spec/runners/unified/ddl_operations.rb +96 -0
  171. data/spec/runners/unified/entity_map.rb +39 -0
  172. data/spec/runners/unified/error.rb +25 -0
  173. data/spec/runners/unified/event_subscriber.rb +91 -0
  174. data/spec/runners/unified/exceptions.rb +21 -0
  175. data/spec/runners/unified/grid_fs_operations.rb +55 -0
  176. data/spec/runners/unified/support_operations.rb +250 -0
  177. data/spec/runners/unified/test.rb +393 -0
  178. data/spec/runners/unified/test_group.rb +28 -0
  179. data/spec/runners/unified/using_hash.rb +31 -0
  180. data/spec/shared/bin/get-mongodb-download-url +17 -0
  181. data/spec/shared/lib/mrss/cluster_config.rb +218 -0
  182. data/spec/shared/lib/mrss/constraints.rb +43 -0
  183. data/spec/shared/lib/mrss/docker_runner.rb +262 -0
  184. data/spec/shared/lib/mrss/server_version_registry.rb +112 -0
  185. data/spec/shared/lib/mrss/utils.rb +15 -0
  186. data/spec/shared/share/Dockerfile.erb +231 -0
  187. data/spec/shared/shlib/distro.sh +73 -0
  188. data/spec/shared/shlib/server.sh +290 -0
  189. data/spec/shared/shlib/set_env.sh +128 -0
  190. data/spec/solo/clean_exit_spec.rb +21 -0
  191. data/spec/spec_helper.rb +4 -1
  192. data/spec/spec_tests/crud_unified_spec.rb +10 -0
  193. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -1
  194. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +267 -0
  195. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +60 -0
  196. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount.yml → estimatedDocumentCount-pre4.9.yml} +2 -0
  197. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +146 -0
  198. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors.yml → estimatedDocumentCount-serverErrors-pre4.9.yml} +2 -0
  199. data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +1 -1
  200. data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
  201. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +220 -0
  202. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
  203. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +184 -0
  204. data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
  205. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
  206. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
  207. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
  208. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
  209. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
  210. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +170 -0
  211. data/spec/spec_tests/data/uri_options/compression-options.yml +1 -1
  212. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +416 -0
  213. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +409 -0
  214. data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +67 -0
  215. data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
  216. data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +44 -0
  217. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +180 -0
  218. data/spec/spec_tests/unified_spec.rb +15 -0
  219. data/spec/spec_tests/uri_options_spec.rb +16 -0
  220. data/spec/spec_tests/versioned_api_spec.rb +10 -0
  221. data/spec/support/common_shortcuts.rb +15 -1
  222. data/spec/support/shared/session.rb +2 -2
  223. data/spec/support/spec_config.rb +46 -3
  224. data/spec/support/spec_setup.rb +48 -38
  225. data/spec/support/utils.rb +64 -3
  226. metadata +1104 -992
  227. metadata.gz.sig +0 -0
  228. data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +0 -58
  229. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +0 -47
  230. data/spec/support/cluster_config.rb +0 -207
@@ -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
@@ -0,0 +1,193 @@
1
+ description: "poc-retryable-reads"
2
+
3
+ schemaVersion: "1.0"
4
+
5
+ runOnRequirements:
6
+ - minServerVersion: "4.0"
7
+ topologies: [ single, replicaset ]
8
+ - minServerVersion: "4.1.7"
9
+ topologies: [ sharded ]
10
+
11
+ createEntities:
12
+ - client:
13
+ id: &client0 client0
14
+ useMultipleMongoses: false
15
+ observeEvents: [ commandStartedEvent ]
16
+ - client:
17
+ id: &client1 client1
18
+ uriOptions: { retryReads: false }
19
+ useMultipleMongoses: false
20
+ observeEvents: [ commandStartedEvent ]
21
+ - database:
22
+ id: &database0 database0
23
+ client: *client0
24
+ databaseName: &databaseName retryable-reads-tests
25
+ - database:
26
+ id: &database1 database1
27
+ client: *client1
28
+ databaseName: *databaseName
29
+ - collection:
30
+ id: &collection0 collection0
31
+ database: *database0
32
+ collectionName: &collectionName coll
33
+ - collection:
34
+ id: &collection1 collection1
35
+ database: *database1
36
+ collectionName: *collectionName
37
+
38
+ initialData:
39
+ - collectionName: *collectionName
40
+ databaseName: *databaseName
41
+ documents:
42
+ - {_id: 1, x: 11}
43
+ - {_id: 2, x: 22}
44
+ - {_id: 3, x: 33}
45
+
46
+ tests:
47
+ - description: "Aggregate succeeds after InterruptedAtShutdown"
48
+ operations:
49
+ - name: failPoint
50
+ object: testRunner
51
+ arguments:
52
+ client: *client0
53
+ failPoint:
54
+ configureFailPoint: failCommand
55
+ mode: { times: 1 }
56
+ data:
57
+ failCommands: [ aggregate ]
58
+ errorCode: 11600 # InterruptedAtShutdown
59
+ - name: aggregate
60
+ object: *collection0
61
+ arguments:
62
+ pipeline: &pipeline
63
+ - $match: { _id: { $gt: 1 } }
64
+ - $sort: { x: 1 }
65
+ expectResult:
66
+ - { _id: 2, x: 22 }
67
+ - { _id: 3, x: 33 }
68
+ expectEvents:
69
+ - client: *client0
70
+ events:
71
+ - commandStartedEvent:
72
+ command:
73
+ aggregate: *collectionName
74
+ pipeline: *pipeline
75
+ databaseName: *databaseName
76
+ - commandStartedEvent:
77
+ command:
78
+ aggregate: *collectionName
79
+ pipeline: *pipeline
80
+ databaseName: *databaseName
81
+
82
+ - description: "Find succeeds on second attempt"
83
+ operations:
84
+ - name: failPoint
85
+ object: testRunner
86
+ arguments:
87
+ client: *client0
88
+ failPoint:
89
+ configureFailPoint: failCommand
90
+ mode: { times: 1 }
91
+ data:
92
+ failCommands: [ find ]
93
+ closeConnection: true
94
+ # Find options and expected result changed to use common initialData
95
+ - name: find
96
+ object: collection0
97
+ arguments:
98
+ filter: {}
99
+ sort: { _id: 1 }
100
+ limit: 2
101
+ expectResult:
102
+ - { _id: 1, x: 11 }
103
+ - { _id: 2, x: 22 }
104
+ expectEvents:
105
+ - client: *client0
106
+ events:
107
+ - &findAttempt
108
+ commandStartedEvent:
109
+ command:
110
+ find: *collectionName
111
+ filter: {}
112
+ sort: { _id: 1 }
113
+ limit: 2
114
+ databaseName: *databaseName
115
+ - *findAttempt
116
+
117
+ - description: "Find fails on first attempt"
118
+ operations:
119
+ - name: failPoint
120
+ object: testRunner
121
+ arguments:
122
+ client: *client0
123
+ failPoint:
124
+ configureFailPoint: failCommand
125
+ mode: { times: 1 }
126
+ data:
127
+ failCommands: [ find ]
128
+ closeConnection: true
129
+ - name: find
130
+ object: collection1 # client uses retryReads=false
131
+ arguments:
132
+ filter: {}
133
+ # Other arguments in the original test are not relevant
134
+ expectError: { isError: true }
135
+ expectEvents:
136
+ - client: *client1
137
+ events:
138
+ - commandStartedEvent:
139
+ command:
140
+ find: *collectionName
141
+ filter: {}
142
+ databaseName: *databaseName
143
+
144
+ - description: "Find fails on second attempt"
145
+ operations:
146
+ - name: failPoint
147
+ object: testRunner
148
+ arguments:
149
+ client: *client0
150
+ failPoint:
151
+ configureFailPoint: failCommand
152
+ mode: { times: 2 }
153
+ data:
154
+ failCommands: [ find ]
155
+ closeConnection: true
156
+ - name: find
157
+ object: collection0
158
+ arguments:
159
+ filter: {}
160
+ # Other arguments in the original test are not relevant
161
+ expectError: { isError: true }
162
+ expectEvents:
163
+ - client: *client0
164
+ events:
165
+ - &findAttempt
166
+ commandStartedEvent:
167
+ command:
168
+ find: *collectionName
169
+ filter: {}
170
+ databaseName: *databaseName
171
+ - *findAttempt
172
+
173
+ - description: "ListDatabases succeeds on second attempt"
174
+ operations:
175
+ - name: failPoint
176
+ object: testRunner
177
+ arguments:
178
+ client: *client0
179
+ failPoint:
180
+ configureFailPoint: failCommand
181
+ mode: { times: 1 }
182
+ data:
183
+ failCommands: [ listDatabases ]
184
+ closeConnection: true
185
+ - name: listDatabases
186
+ object: *client0
187
+ expectEvents:
188
+ - client: *client0
189
+ events:
190
+ - commandStartedEvent:
191
+ command: { listDatabases: 1 }
192
+ - commandStartedEvent:
193
+ command: { listDatabases: 1 }