mongo 2.20.1 → 2.21.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 (246) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -0
  3. data/Rakefile +2 -2
  4. data/lib/mongo/address.rb +22 -3
  5. data/lib/mongo/auth/aws/credentials_retriever.rb +70 -17
  6. data/lib/mongo/auth/base.rb +1 -1
  7. data/lib/mongo/bulk_write.rb +35 -2
  8. data/lib/mongo/client.rb +38 -6
  9. data/lib/mongo/client_encryption.rb +6 -3
  10. data/lib/mongo/cluster/reapers/cursor_reaper.rb +6 -1
  11. data/lib/mongo/cluster/sdam_flow.rb +20 -7
  12. data/lib/mongo/cluster.rb +14 -4
  13. data/lib/mongo/collection/helpers.rb +1 -1
  14. data/lib/mongo/collection/view/aggregation/behavior.rb +131 -0
  15. data/lib/mongo/collection/view/aggregation.rb +33 -99
  16. data/lib/mongo/collection/view/builder/aggregation.rb +1 -7
  17. data/lib/mongo/collection/view/change_stream.rb +80 -27
  18. data/lib/mongo/collection/view/iterable.rb +76 -60
  19. data/lib/mongo/collection/view/map_reduce.rb +25 -8
  20. data/lib/mongo/collection/view/readable.rb +79 -30
  21. data/lib/mongo/collection/view/writable.rb +109 -48
  22. data/lib/mongo/collection/view.rb +43 -3
  23. data/lib/mongo/collection.rb +158 -23
  24. data/lib/mongo/crypt/auto_encrypter.rb +4 -6
  25. data/lib/mongo/crypt/binding.rb +4 -4
  26. data/lib/mongo/crypt/context.rb +20 -14
  27. data/lib/mongo/crypt/encryption_io.rb +56 -26
  28. data/lib/mongo/crypt/explicit_encrypter.rb +49 -20
  29. data/lib/mongo/crypt/explicit_encryption_context.rb +17 -11
  30. data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +22 -6
  31. data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +29 -4
  32. data/lib/mongo/csot_timeout_holder.rb +119 -0
  33. data/lib/mongo/cursor/kill_spec.rb +5 -2
  34. data/lib/mongo/cursor/nontailable.rb +27 -0
  35. data/lib/mongo/cursor.rb +86 -24
  36. data/lib/mongo/cursor_host.rb +82 -0
  37. data/lib/mongo/database/view.rb +81 -14
  38. data/lib/mongo/database.rb +88 -18
  39. data/lib/mongo/error/operation_failure.rb +209 -204
  40. data/lib/mongo/error/server_timeout_error.rb +12 -0
  41. data/lib/mongo/error/socket_timeout_error.rb +3 -1
  42. data/lib/mongo/error/timeout_error.rb +23 -0
  43. data/lib/mongo/error.rb +2 -0
  44. data/lib/mongo/grid/fs_bucket.rb +45 -12
  45. data/lib/mongo/grid/stream/read.rb +15 -1
  46. data/lib/mongo/grid/stream/write.rb +21 -4
  47. data/lib/mongo/index/view.rb +77 -16
  48. data/lib/mongo/operation/context.rb +40 -2
  49. data/lib/mongo/operation/create_search_indexes/op_msg.rb +2 -2
  50. data/lib/mongo/operation/delete/op_msg.rb +2 -1
  51. data/lib/mongo/operation/drop_search_index/op_msg.rb +2 -2
  52. data/lib/mongo/operation/find/op_msg.rb +45 -0
  53. data/lib/mongo/operation/get_more/op_msg.rb +33 -0
  54. data/lib/mongo/operation/insert/op_msg.rb +3 -2
  55. data/lib/mongo/operation/insert/result.rb +4 -2
  56. data/lib/mongo/operation/list_collections/result.rb +1 -1
  57. data/lib/mongo/operation/map_reduce/result.rb +1 -1
  58. data/lib/mongo/operation/op_msg_base.rb +3 -1
  59. data/lib/mongo/operation/result.rb +26 -5
  60. data/lib/mongo/operation/shared/executable.rb +12 -1
  61. data/lib/mongo/operation/shared/op_msg_executable.rb +4 -1
  62. data/lib/mongo/operation/shared/response_handling.rb +3 -3
  63. data/lib/mongo/operation/shared/sessions_supported.rb +1 -1
  64. data/lib/mongo/operation/shared/timed.rb +52 -0
  65. data/lib/mongo/operation/shared/write.rb +4 -1
  66. data/lib/mongo/operation/update/op_msg.rb +2 -1
  67. data/lib/mongo/operation/update_search_index/op_msg.rb +2 -2
  68. data/lib/mongo/operation.rb +1 -0
  69. data/lib/mongo/protocol/message.rb +1 -4
  70. data/lib/mongo/protocol/msg.rb +2 -2
  71. data/lib/mongo/retryable/read_worker.rb +69 -29
  72. data/lib/mongo/retryable/write_worker.rb +49 -18
  73. data/lib/mongo/retryable.rb +8 -2
  74. data/lib/mongo/server/connection.rb +11 -5
  75. data/lib/mongo/server/connection_base.rb +22 -2
  76. data/lib/mongo/server/connection_pool.rb +32 -14
  77. data/lib/mongo/server/description/features.rb +1 -1
  78. data/lib/mongo/server/description.rb +18 -5
  79. data/lib/mongo/server/monitor.rb +7 -4
  80. data/lib/mongo/server/pending_connection.rb +7 -3
  81. data/lib/mongo/server/{round_trip_time_averager.rb → round_trip_time_calculator.rb} +25 -7
  82. data/lib/mongo/server.rb +11 -6
  83. data/lib/mongo/server_selector/base.rb +25 -9
  84. data/lib/mongo/session.rb +78 -9
  85. data/lib/mongo/socket/ssl.rb +109 -17
  86. data/lib/mongo/socket/tcp.rb +40 -6
  87. data/lib/mongo/socket.rb +154 -25
  88. data/lib/mongo/uri/options_mapper.rb +1 -0
  89. data/lib/mongo/version.rb +1 -1
  90. data/lib/mongo.rb +1 -0
  91. data/spec/atlas/atlas_connectivity_spec.rb +4 -0
  92. data/spec/atlas/operations_spec.rb +4 -0
  93. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +2 -1
  94. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +494 -487
  95. data/spec/integration/client_side_encryption/on_demand_aws_credentials_spec.rb +1 -1
  96. data/spec/integration/client_side_encryption/range_explicit_encryption_prose_spec.rb +66 -22
  97. data/spec/integration/client_side_operations_timeout/encryption_prose_spec.rb +131 -0
  98. data/spec/integration/connection_pool_populator_spec.rb +2 -0
  99. data/spec/integration/cursor_pinning_spec.rb +15 -60
  100. data/spec/integration/cursor_reaping_spec.rb +1 -1
  101. data/spec/integration/docs_examples_spec.rb +1 -1
  102. data/spec/integration/operation_failure_code_spec.rb +1 -1
  103. data/spec/integration/operation_failure_message_spec.rb +3 -3
  104. data/spec/integration/retryable_errors_spec.rb +2 -2
  105. data/spec/integration/sdam_error_handling_spec.rb +2 -1
  106. data/spec/integration/search_indexes_prose_spec.rb +4 -0
  107. data/spec/integration/server_spec.rb +4 -3
  108. data/spec/integration/transactions_api_examples_spec.rb +2 -0
  109. data/spec/kerberos/kerberos_spec.rb +4 -0
  110. data/spec/lite_spec_helper.rb +3 -1
  111. data/spec/mongo/auth/user/view_spec.rb +1 -1
  112. data/spec/mongo/caching_cursor_spec.rb +1 -1
  113. data/spec/mongo/client_encryption_spec.rb +1 -0
  114. data/spec/mongo/client_spec.rb +158 -4
  115. data/spec/mongo/collection/view/aggregation_spec.rb +14 -39
  116. data/spec/mongo/collection/view/change_stream_spec.rb +3 -3
  117. data/spec/mongo/collection_spec.rb +5 -6
  118. data/spec/mongo/crypt/auto_encrypter_spec.rb +14 -12
  119. data/spec/mongo/crypt/data_key_context_spec.rb +3 -1
  120. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +2 -2
  121. data/spec/mongo/crypt/handle_spec.rb +1 -1
  122. data/spec/mongo/cursor_spec.rb +26 -9
  123. data/spec/mongo/error/operation_failure_heavy_spec.rb +2 -2
  124. data/spec/mongo/operation/context_spec.rb +79 -0
  125. data/spec/mongo/operation/create/op_msg_spec.rb +106 -110
  126. data/spec/mongo/operation/delete/op_msg_spec.rb +6 -5
  127. data/spec/mongo/operation/find/op_msg_spec.rb +66 -0
  128. data/spec/mongo/operation/get_more/op_msg_spec.rb +65 -0
  129. data/spec/mongo/operation/insert/op_msg_spec.rb +128 -131
  130. data/spec/mongo/operation/shared/csot/examples.rb +113 -0
  131. data/spec/mongo/query_cache_spec.rb +243 -225
  132. data/spec/mongo/retryable_spec.rb +1 -0
  133. data/spec/mongo/server/round_trip_time_calculator_spec.rb +120 -0
  134. data/spec/mongo/socket/ssl_spec.rb +0 -10
  135. data/spec/runners/change_streams/test.rb +2 -2
  136. data/spec/runners/crud/operation.rb +1 -1
  137. data/spec/runners/crud/verifier.rb +3 -1
  138. data/spec/runners/transactions/operation.rb +4 -6
  139. data/spec/runners/unified/ambiguous_operations.rb +13 -0
  140. data/spec/runners/unified/assertions.rb +4 -0
  141. data/spec/runners/unified/change_stream_operations.rb +14 -24
  142. data/spec/runners/unified/crud_operations.rb +82 -59
  143. data/spec/runners/unified/ddl_operations.rb +38 -7
  144. data/spec/runners/unified/grid_fs_operations.rb +37 -2
  145. data/spec/runners/unified/support_operations.rb +43 -4
  146. data/spec/runners/unified/test.rb +22 -10
  147. data/spec/runners/unified.rb +1 -1
  148. data/spec/solo/clean_exit_spec.rb +2 -0
  149. data/spec/spec_tests/client_side_operations_timeout_spec.rb +15 -0
  150. data/spec/spec_tests/data/change_streams_unified/change-streams-clusterTime.yml +3 -1
  151. data/spec/spec_tests/data/change_streams_unified/change-streams-disambiguatedPaths.yml +3 -1
  152. data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +3 -1
  153. data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +1 -1
  154. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1 -1
  155. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1 -1
  156. data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +1 -1
  157. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +2 -1
  158. data/spec/spec_tests/data/client_side_encryption/timeoutMS.yml +67 -0
  159. data/spec/spec_tests/data/client_side_operations_timeout/bulkWrite.yml +87 -0
  160. data/spec/spec_tests/data/client_side_operations_timeout/change-streams.yml +358 -0
  161. data/spec/spec_tests/data/client_side_operations_timeout/close-cursors.yml +129 -0
  162. data/spec/spec_tests/data/client_side_operations_timeout/command-execution.yml +250 -0
  163. data/spec/spec_tests/data/client_side_operations_timeout/convenient-transactions.yml +113 -0
  164. data/spec/spec_tests/data/client_side_operations_timeout/cursors.yml +70 -0
  165. data/spec/spec_tests/data/client_side_operations_timeout/deprecated-options.yml +3982 -0
  166. data/spec/spec_tests/data/client_side_operations_timeout/error-transformations.yml +96 -0
  167. data/spec/spec_tests/data/client_side_operations_timeout/global-timeoutMS.yml +3236 -0
  168. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-advanced.yml +207 -0
  169. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-delete.yml +152 -0
  170. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-download.yml +182 -0
  171. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-find.yml +100 -0
  172. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-upload.yml +249 -0
  173. data/spec/spec_tests/data/client_side_operations_timeout/legacy-timeouts.yml +204 -0
  174. data/spec/spec_tests/data/client_side_operations_timeout/non-tailable-cursors.yml +307 -0
  175. data/spec/spec_tests/data/client_side_operations_timeout/override-collection-timeoutMS.yml +1877 -0
  176. data/spec/spec_tests/data/client_side_operations_timeout/override-operation-timeoutMS.yml +1918 -0
  177. data/spec/spec_tests/data/client_side_operations_timeout/retryability-legacy-timeouts.yml +1676 -0
  178. data/spec/spec_tests/data/client_side_operations_timeout/retryability-timeoutMS.yml +2824 -0
  179. data/spec/spec_tests/data/client_side_operations_timeout/sessions-inherit-timeoutMS.yml +168 -0
  180. data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-operation-timeoutMS.yml +171 -0
  181. data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-timeoutMS.yml +168 -0
  182. data/spec/spec_tests/data/client_side_operations_timeout/tailable-awaitData.yml +247 -0
  183. data/spec/spec_tests/data/client_side_operations_timeout/tailable-non-awaitData.yml +181 -0
  184. data/spec/spec_tests/data/crud_unified/aggregate-write-readPreference.yml +4 -0
  185. data/spec/spec_tests/data/crud_unified/db-aggregate-write-readPreference.yml +4 -0
  186. data/spec/spec_tests/data/crud_unified/find-test-all-options.yml +29 -0
  187. data/spec/spec_tests/server_selection_rtt_spec.rb +6 -6
  188. data/spec/support/certificates/atlas-ocsp-ca.crt +81 -83
  189. data/spec/support/certificates/atlas-ocsp.crt +107 -107
  190. data/spec/support/cluster_tools.rb +3 -3
  191. data/spec/support/common_shortcuts.rb +2 -2
  192. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Date.json +1 -1
  193. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalNoPrecision.json +1 -1
  194. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalPrecision.json +1 -1
  195. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoubleNoPrecision.json +1 -1
  196. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoublePrecision.json +1 -1
  197. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Int.json +1 -1
  198. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Long.json +1 -1
  199. data/spec/support/shared/session.rb +2 -2
  200. data/spec/support/spec_setup.rb +2 -2
  201. data/spec/support/utils.rb +3 -1
  202. metadata +78 -91
  203. data/spec/mongo/server/round_trip_time_averager_spec.rb +0 -48
  204. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Aggregate.yml +0 -242
  205. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Correctness.yml +0 -423
  206. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Delete.yml +0 -183
  207. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-FindOneAndUpdate.yml +0 -240
  208. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-InsertFind.yml +0 -236
  209. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Update.yml +0 -253
  210. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Aggregate.yml +0 -1688
  211. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Correctness.yml +0 -294
  212. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Delete.yml +0 -906
  213. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-FindOneAndUpdate.yml +0 -1685
  214. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-InsertFind.yml +0 -1681
  215. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Update.yml +0 -1698
  216. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Aggregate.yml +0 -330
  217. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Correctness.yml +0 -425
  218. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Delete.yml +0 -227
  219. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-FindOneAndUpdate.yml +0 -328
  220. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-InsertFind.yml +0 -320
  221. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Update.yml +0 -337
  222. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Aggregate.yml +0 -914
  223. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Correctness.yml +0 -293
  224. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Delete.yml +0 -519
  225. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-FindOneAndUpdate.yml +0 -912
  226. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-InsertFind.yml +0 -908
  227. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Update.yml +0 -925
  228. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Aggregate.yml +0 -326
  229. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Correctness.yml +0 -425
  230. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Delete.yml +0 -225
  231. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-FindOneAndUpdate.yml +0 -324
  232. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-InsertFind.yml +0 -320
  233. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Update.yml +0 -339
  234. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Aggregate.yml +0 -242
  235. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Correctness.yml +0 -424
  236. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Delete.yml +0 -183
  237. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-FindOneAndUpdate.yml +0 -240
  238. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-InsertFind.yml +0 -236
  239. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Update.yml +0 -255
  240. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Aggregate.yml +0 -242
  241. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Correctness.yml +0 -423
  242. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Delete.yml +0 -183
  243. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-FindOneAndUpdate.yml +0 -240
  244. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-InsertFind.yml +0 -236
  245. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Update.yml +0 -255
  246. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-WrongType.yml +0 -44
@@ -2,8 +2,12 @@
2
2
  # rubocop:todo all
3
3
 
4
4
  require 'spec_helper'
5
+ require_relative '../shared/csot/examples'
5
6
 
6
7
  describe Mongo::Operation::Create::OpMsg do
8
+ include CSOT::Examples
9
+
10
+ let(:context) { Mongo::Operation::Context.new }
7
11
 
8
12
  let(:write_concern) do
9
13
  Mongo::WriteConcern.get(w: :majority)
@@ -73,8 +77,6 @@ describe Mongo::Operation::Create::OpMsg do
73
77
  end
74
78
 
75
79
  describe '#selector' do
76
- min_server_fcv '3.6'
77
-
78
80
  it 'does not mutate user input' do
79
81
  user_input = IceNine.deep_freeze(spec.dup)
80
82
  expect do
@@ -87,158 +89,152 @@ describe Mongo::Operation::Create::OpMsg do
87
89
  # https://jira.mongodb.org/browse/RUBY-2224
88
90
  require_no_linting
89
91
 
90
- context 'when the server supports OP_MSG' do
92
+ let(:global_args) do
93
+ {
94
+ create: TEST_COLL,
95
+ writeConcern: write_concern.options,
96
+ '$db' => SpecConfig.instance.test_db,
97
+ lsid: session.session_id
98
+ }
99
+ end
100
+
101
+ let(:session) do
102
+ authorized_client.start_session
103
+ end
91
104
 
92
- let(:global_args) do
93
- {
94
- create: TEST_COLL,
95
- writeConcern: write_concern.options,
96
- '$db' => SpecConfig.instance.test_db,
97
- lsid: session.session_id
98
- }
105
+ context 'when the topology is replica set or sharded' do
106
+ require_topology :replica_set, :sharded
107
+
108
+ let(:expected_global_args) do
109
+ global_args.merge(Mongo::Operation::CLUSTER_TIME => authorized_client.cluster.cluster_time)
99
110
  end
100
111
 
101
- let(:session) do
102
- authorized_client.start_session
112
+ it 'creates the correct OP_MSG message' do
113
+ authorized_client.command(ping:1)
114
+ expect(Mongo::Protocol::Msg).to receive(:new).with([], {}, expected_global_args)
115
+ op.send(:message, connection)
103
116
  end
117
+ end
104
118
 
105
- context 'when the topology is replica set or sharded' do
106
- min_server_fcv '3.6'
107
- require_topology :replica_set, :sharded
119
+ context 'when the topology is standalone' do
120
+ require_topology :single
108
121
 
109
- let(:expected_global_args) do
110
- global_args.merge(Mongo::Operation::CLUSTER_TIME => authorized_client.cluster.cluster_time)
111
- end
122
+ let(:expected_global_args) do
123
+ global_args
124
+ end
112
125
 
113
- it 'creates the correct OP_MSG message' do
114
- authorized_client.command(ping:1)
115
- expect(Mongo::Protocol::Msg).to receive(:new).with([], {}, expected_global_args)
116
- op.send(:message, connection)
117
- end
126
+ it 'creates the correct OP_MSG message' do
127
+ authorized_client.command(ping:1)
128
+ expect(Mongo::Protocol::Msg).to receive(:new).with([], {}, expected_global_args)
129
+ op.send(:message, connection)
118
130
  end
119
131
 
120
- context 'when the topology is standalone' do
121
- min_server_fcv '3.6'
122
- require_topology :single
132
+ context 'when an implicit session is created and the topology is then updated and the server does not support sessions' do
133
+ # Mocks on features are incompatible with linting
134
+ require_no_linting
123
135
 
124
136
  let(:expected_global_args) do
125
- global_args
126
- end
127
-
128
- it 'creates the correct OP_MSG message' do
129
- authorized_client.command(ping:1)
130
- expect(Mongo::Protocol::Msg).to receive(:new).with([], {}, expected_global_args)
131
- op.send(:message, connection)
132
- end
133
-
134
- context 'when an implicit session is created and the topology is then updated and the server does not support sessions' do
135
- # Mocks on features are incompatible with linting
136
- require_no_linting
137
-
138
- let(:expected_global_args) do
139
- global_args.dup.tap do |args|
140
- args.delete(:lsid)
141
- end
137
+ global_args.dup.tap do |args|
138
+ args.delete(:lsid)
142
139
  end
140
+ end
143
141
 
144
- let(:session) do
145
- Mongo::Session.new(nil, authorized_client, implicit: true).tap do |session|
146
- allow(session).to receive(:session_id).and_return(42)
147
- session.should be_implicit
148
- end
142
+ let(:session) do
143
+ Mongo::Session.new(nil, authorized_client, implicit: true).tap do |session|
144
+ allow(session).to receive(:session_id).and_return(42)
145
+ session.should be_implicit
149
146
  end
147
+ end
150
148
 
151
- it 'creates the correct OP_MSG message' do
152
- RSpec::Mocks.with_temporary_scope do
153
- expect(connection.features).to receive(:sessions_enabled?).and_return(false)
149
+ it 'creates the correct OP_MSG message' do
150
+ RSpec::Mocks.with_temporary_scope do
151
+ expect(connection.features).to receive(:sessions_enabled?).and_return(false)
154
152
 
155
- expect(expected_global_args[:session]).to be nil
156
- expect(Mongo::Protocol::Msg).to receive(:new).with([], {}, expected_global_args)
157
- op.send(:message, connection)
158
- end
153
+ expect(expected_global_args[:session]).to be nil
154
+ expect(Mongo::Protocol::Msg).to receive(:new).with([], {}, expected_global_args)
155
+ op.send(:message, connection)
159
156
  end
160
157
  end
161
158
  end
159
+ end
162
160
 
163
- context 'when the write concern is 0' do
161
+ context 'when the write concern is 0' do
164
162
 
165
- let(:write_concern) do
166
- Mongo::WriteConcern.get(w: 0)
167
- end
163
+ let(:write_concern) do
164
+ Mongo::WriteConcern.get(w: 0)
165
+ end
168
166
 
169
- context 'when the session is implicit' do
167
+ context 'when the session is implicit' do
170
168
 
171
- let(:session) do
172
- Mongo::Session.new(nil, authorized_client, implicit: true).tap do |session|
173
- allow(session).to receive(:session_id).and_return(42)
174
- session.should be_implicit
175
- end
169
+ let(:session) do
170
+ Mongo::Session.new(nil, authorized_client, implicit: true).tap do |session|
171
+ allow(session).to receive(:session_id).and_return(42)
172
+ session.should be_implicit
176
173
  end
174
+ end
177
175
 
178
- context 'when the topology is replica set or sharded' do
179
- min_server_fcv '3.6'
180
- require_topology :replica_set, :sharded
176
+ context 'when the topology is replica set or sharded' do
177
+ require_topology :replica_set, :sharded
181
178
 
182
- let(:expected_global_args) do
183
- global_args.dup.tap do |args|
184
- args.delete(:lsid)
185
- args.merge!(Mongo::Operation::CLUSTER_TIME => authorized_client.cluster.cluster_time)
186
- end
179
+ let(:expected_global_args) do
180
+ global_args.dup.tap do |args|
181
+ args.delete(:lsid)
182
+ args.merge!(Mongo::Operation::CLUSTER_TIME => authorized_client.cluster.cluster_time)
187
183
  end
184
+ end
188
185
 
189
- it 'does not send a session id in the command' do
190
- authorized_client.command(ping:1)
191
- expect(Mongo::Protocol::Msg).to receive(:new).with([:more_to_come], {}, expected_global_args)
192
- op.send(:message, connection)
193
- end
186
+ it 'does not send a session id in the command' do
187
+ authorized_client.command(ping:1)
188
+ expect(Mongo::Protocol::Msg).to receive(:new).with([:more_to_come], {}, expected_global_args)
189
+ op.send(:message, connection)
194
190
  end
191
+ end
195
192
 
196
- context 'when the topology is standalone' do
197
- min_server_fcv '3.6'
198
- require_topology :single
193
+ context 'when the topology is standalone' do
194
+ require_topology :single
199
195
 
200
- let(:expected_global_args) do
201
- global_args.dup.tap do |args|
202
- args.delete(:lsid)
203
- end
196
+ let(:expected_global_args) do
197
+ global_args.dup.tap do |args|
198
+ args.delete(:lsid)
204
199
  end
200
+ end
205
201
 
206
- it 'creates the correct OP_MSG message' do
207
- authorized_client.command(ping:1)
208
- expect(Mongo::Protocol::Msg).to receive(:new).with([:more_to_come], {}, expected_global_args)
209
- op.send(:message, connection)
210
- end
202
+ it 'creates the correct OP_MSG message' do
203
+ authorized_client.command(ping:1)
204
+ expect(Mongo::Protocol::Msg).to receive(:new).with([:more_to_come], {}, expected_global_args)
205
+ op.send(:message, connection)
211
206
  end
212
207
  end
208
+ end
213
209
 
214
- context 'when the session is explicit' do
215
- min_server_fcv '3.6'
216
- require_topology :replica_set, :sharded
210
+ context 'when the session is explicit' do
211
+ require_topology :replica_set, :sharded
217
212
 
218
- let(:session) do
219
- authorized_client.start_session
220
- end
213
+ let(:session) do
214
+ authorized_client.start_session
215
+ end
221
216
 
222
- before do
223
- session.should_not be_implicit
224
- end
217
+ before do
218
+ session.should_not be_implicit
219
+ end
225
220
 
226
- let(:expected_global_args) do
227
- global_args.dup.tap do |args|
228
- args.delete(:lsid)
229
- args.merge!(Mongo::Operation::CLUSTER_TIME => authorized_client.cluster.cluster_time)
230
- end
221
+ let(:expected_global_args) do
222
+ global_args.dup.tap do |args|
223
+ args.delete(:lsid)
224
+ args.merge!(Mongo::Operation::CLUSTER_TIME => authorized_client.cluster.cluster_time)
231
225
  end
226
+ end
232
227
 
233
- it 'does not send a session id in the command' do
234
- authorized_client.command(ping:1)
235
- RSpec::Mocks.with_temporary_scope do
236
- expect(Mongo::Protocol::Msg).to receive(:new).with([:more_to_come], {}, expected_global_args)
237
- op.send(:message, connection)
238
- end
228
+ it 'does not send a session id in the command' do
229
+ authorized_client.command(ping:1)
230
+ RSpec::Mocks.with_temporary_scope do
231
+ expect(Mongo::Protocol::Msg).to receive(:new).with([:more_to_come], {}, expected_global_args)
232
+ op.send(:message, connection)
239
233
  end
240
234
  end
241
235
  end
242
236
  end
243
237
  end
238
+
239
+ it_behaves_like 'a CSOT-compliant OpMsg subclass'
244
240
  end
@@ -2,8 +2,12 @@
2
2
  # rubocop:todo all
3
3
 
4
4
  require 'spec_helper'
5
+ require_relative '../shared/csot/examples'
5
6
 
6
7
  describe Mongo::Operation::Delete::OpMsg do
8
+ include CSOT::Examples
9
+
10
+ let(:context) { Mongo::Operation::Context.new }
7
11
 
8
12
  let(:write_concern) do
9
13
  Mongo::WriteConcern.get(w: :majority)
@@ -125,7 +129,6 @@ describe Mongo::Operation::Delete::OpMsg do
125
129
  end
126
130
 
127
131
  context 'when the topology is replica set or sharded' do
128
- min_server_fcv '3.6'
129
132
  require_topology :replica_set, :sharded
130
133
 
131
134
  let(:expected_global_args) do
@@ -140,7 +143,6 @@ describe Mongo::Operation::Delete::OpMsg do
140
143
  end
141
144
 
142
145
  context 'when the topology is standalone' do
143
- min_server_fcv '3.6'
144
146
  require_topology :single
145
147
 
146
148
  let(:expected_global_args) do
@@ -198,7 +200,6 @@ describe Mongo::Operation::Delete::OpMsg do
198
200
  end
199
201
 
200
202
  context 'when the topology is replica set or sharded' do
201
- min_server_fcv '3.6'
202
203
  require_topology :replica_set, :sharded
203
204
 
204
205
  let(:expected_global_args) do
@@ -216,7 +217,6 @@ describe Mongo::Operation::Delete::OpMsg do
216
217
  end
217
218
 
218
219
  context 'when the topology is standalone' do
219
- min_server_fcv '3.6'
220
220
  require_topology :single
221
221
 
222
222
  let(:expected_global_args) do
@@ -234,7 +234,6 @@ describe Mongo::Operation::Delete::OpMsg do
234
234
  end
235
235
 
236
236
  context 'when the session is explicit' do
237
- min_server_fcv '3.6'
238
237
  require_topology :replica_set, :sharded
239
238
 
240
239
  let(:session) do
@@ -263,4 +262,6 @@ describe Mongo::Operation::Delete::OpMsg do
263
262
  end
264
263
  end
265
264
  end
265
+
266
+ it_behaves_like 'a CSOT-compliant OpMsg subclass'
266
267
  end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require_relative '../shared/csot/examples'
5
+
6
+ describe Mongo::Operation::Find::OpMsg do
7
+ include CSOT::Examples
8
+
9
+ let(:spec) do
10
+ { coll_name: 'coll_name',
11
+ filter: {},
12
+ db_name: 'db_name' }
13
+ end
14
+
15
+ let(:op) { described_class.new(spec) }
16
+
17
+ context 'when it is a CSOT-compliant OpMsg' do
18
+ include_examples 'mock CSOT environment'
19
+
20
+ context 'when no timeout_ms set' do
21
+ it 'does not set maxTimeMS' do
22
+ expect(body.key?(:maxTimeMS)).to be false
23
+ end
24
+ end
25
+
26
+ context 'when timeout_ms is set' do
27
+ let(:remaining_timeout_sec) { 3 }
28
+
29
+ context 'when cursor is non-tailable' do
30
+ let(:cursor_type) { nil }
31
+
32
+ context 'when timeout_mode is cursor_lifetime' do
33
+ let(:timeout_mode) { :cursor_lifetime }
34
+
35
+ it 'sets maxTimeMS' do
36
+ expect(body[:maxTimeMS]).to be == 3_000
37
+ end
38
+ end
39
+
40
+ context 'when timeout_mode is iteration' do
41
+ let(:timeout_mode) { :iteration }
42
+
43
+ it 'omits maxTimeMS' do
44
+ expect(body[:maxTimeMS]).to be_nil
45
+ end
46
+ end
47
+ end
48
+
49
+ context 'when cursor is tailable' do
50
+ let(:cursor_type) { :tailable }
51
+
52
+ it 'omits maxTimeMS' do
53
+ expect(body[:maxTimeMS]).to be_nil
54
+ end
55
+ end
56
+
57
+ context 'when cursor is tailable_await' do
58
+ let(:cursor_type) { :tailable_await }
59
+
60
+ it 'sets maxTimeMS' do
61
+ expect(body[:maxTimeMS]).to be == 3_000
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require_relative '../shared/csot/examples'
5
+
6
+ describe Mongo::Operation::GetMore::OpMsg do
7
+ include CSOT::Examples
8
+
9
+ let(:spec) do
10
+ {
11
+ options: {},
12
+ db_name: 'db_name',
13
+ coll_name: 'coll_name',
14
+ cursor_id: 1_234_567_890,
15
+ }
16
+ end
17
+
18
+ let(:op) { described_class.new(spec) }
19
+
20
+ context 'when it is a CSOT-compliant OpMsg' do
21
+ include_examples 'mock CSOT environment'
22
+
23
+ context 'when no timeout_ms set' do
24
+ it 'does not set maxTimeMS' do
25
+ expect(body.key?(:maxTimeMS)).to be false
26
+ end
27
+ end
28
+
29
+ context 'when timeout_ms is set' do
30
+ let(:remaining_timeout_sec) { 3 }
31
+
32
+ context 'when cursor is non-tailable' do
33
+ it 'omits maxTimeMS' do
34
+ expect(body[:maxTimeMS]).to be_nil
35
+ end
36
+ end
37
+
38
+ context 'when cursor is tailable' do
39
+ let(:cursor_type) { :tailable }
40
+
41
+ it 'omits maxTimeMS' do
42
+ expect(body[:maxTimeMS]).to be_nil
43
+ end
44
+ end
45
+
46
+ context 'when cursor is tailable_await' do
47
+ let(:cursor_type) { :tailable_await }
48
+
49
+ context 'when max_await_time_ms is omitted' do
50
+ it 'omits maxTimeMS' do
51
+ expect(body[:maxTimeMS]).to be_nil
52
+ end
53
+ end
54
+
55
+ context 'when max_await_time_ms is given' do
56
+ let(:max_await_time_ms) { 1_234 }
57
+
58
+ it 'sets maxTimeMS' do
59
+ expect(body[:maxTimeMS]).to be == 1_234
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end