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,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'BulkWriteError message' do
4
+ let(:client) { authorized_client }
5
+ let(:collection_name) { 'bulk_write_error_message_spec' }
6
+ let(:collection) { client[collection_name] }
7
+
8
+ before do
9
+ collection.delete_many
10
+ end
11
+
12
+ context 'a bulk write with one error' do
13
+ it 'reports code name, code and message' do
14
+ begin
15
+ collection.insert_many([
16
+ {_id: 1},
17
+ {_id: 1},
18
+ {_id: 1},
19
+ ], ordered: true)
20
+ fail('Should have raised')
21
+ rescue Mongo::Error::BulkWriteError => e
22
+ e.message.should =~ %r,\A\[11000\]: (insertDocument :: caused by :: 11000 )?E11000 duplicate key error (collection|index):,
23
+ end
24
+ end
25
+ end
26
+
27
+ context 'a bulk write with multiple errors' do
28
+ it 'reports code name, code and message' do
29
+ begin
30
+ collection.insert_many([
31
+ {_id: 1},
32
+ {_id: 1},
33
+ {_id: 1},
34
+ ], ordered: false)
35
+ fail('Should have raised')
36
+ rescue Mongo::Error::BulkWriteError => e
37
+ e.message.should =~ %r,\AMultiple errors: \[11000\]: (insertDocument :: caused by :: 11000 )?E11000 duplicate key error (collection|index):.*\[11000\]: (insertDocument :: caused by :: 11000 )?E11000 duplicate key error (collection|index):,
38
+ end
39
+ end
40
+ end
41
+ end
@@ -98,7 +98,7 @@ describe 'Change stream integration', retry: 4 do
98
98
  it 'watch raises error' do
99
99
  expect do
100
100
  client['change-stream'].watch
101
- end.to raise_error(Mongo::Error::OperationFailure, /Failing command due to 'failCommand' failpoint \(10107\)/)
101
+ end.to raise_error(Mongo::Error::OperationFailure, /10107\b.*Failing command due to 'failCommand' failpoint/)
102
102
  end
103
103
  end
104
104
 
@@ -283,7 +283,7 @@ describe 'Change stream integration', retry: 4 do
283
283
 
284
284
  expect do
285
285
  enum.next
286
- end.to raise_error(Mongo::Error::OperationFailure, /Failing command due to 'failCommand' failpoint \(101\)/)
286
+ end.to raise_error(Mongo::Error::OperationFailure, /101\b.*Failing command due to 'failCommand' failpoint/)
287
287
  end
288
288
  end
289
289
  end
@@ -414,7 +414,7 @@ describe 'Change stream integration', retry: 4 do
414
414
 
415
415
  expect do
416
416
  enum.try_next
417
- end.to raise_error(Mongo::Error::OperationFailure, /Failing command due to 'failCommand' failpoint \(10107\)/)
417
+ end.to raise_error(Mongo::Error::OperationFailure, /10107\b.*Failing command due to 'failCommand' failpoint/)
418
418
  end
419
419
  end
420
420
 
@@ -441,7 +441,7 @@ describe 'Change stream integration', retry: 4 do
441
441
 
442
442
  expect do
443
443
  enum.try_next
444
- end.to raise_error(Mongo::Error::OperationFailure, /Failing command due to 'failCommand' failpoint \(10107\)/)
444
+ end.to raise_error(Mongo::Error::OperationFailure, /10107\b.*Failing command due to 'failCommand' failpoint/)
445
445
  end
446
446
  end
447
447
  end
@@ -135,8 +135,8 @@ describe 'Command monitoring' do
135
135
 
136
136
  subscriber.clear_events!
137
137
  expect do
138
- command.execute(server, client: nil)
139
- end.to raise_error(Mongo::Error::OperationFailure, /Not enough data-bearing nodes \(100\)/)
138
+ command.execute(server, context: Mongo::Operation::Context.new(session: session))
139
+ end.to raise_error(Mongo::Error::OperationFailure, /100\b.*Not enough data-bearing nodes/)
140
140
 
141
141
  expect(subscriber.started_events.length).to eq(1)
142
142
  event = subscriber.started_events.first
@@ -232,6 +232,8 @@ describe 'Connections' do
232
232
  end
233
233
 
234
234
  describe 'wire protocol version range update' do
235
+ require_no_required_api_version
236
+
235
237
  # 3.2 wire protocol is 4.
236
238
  # Wire protocol < 2 means only scram auth is available,
237
239
  # which is not supported by modern mongos.
@@ -4,7 +4,14 @@ describe 'aggregation examples in Ruby' do
4
4
  before(:all) do
5
5
  # In sharded clusters we need to ensure the database exists before running
6
6
  # the tests in this file.
7
- ClientRegistry.instance.global_client('authorized')['_placeholder'].create
7
+ begin
8
+ ClientRegistry.instance.global_client('authorized')['_placeholder'].create
9
+ rescue Mongo::Error::OperationFailure => e
10
+ # Collection already exists
11
+ if e.code != 48
12
+ raise
13
+ end
14
+ end
8
15
  end
9
16
 
10
17
  let(:client) do
@@ -18,7 +18,10 @@ describe 'fork reconnect' do
18
18
 
19
19
  describe 'monitoring connection' do
20
20
  let(:monitor) do
21
- Mongo::Server::Monitor.new(server, [], Mongo::Monitoring.new, server.options)
21
+ Mongo::Server::Monitor.new(server, [], Mongo::Monitoring.new, server.options.merge(
22
+ app_metadata: client.cluster.monitor_app_metadata,
23
+ push_monitor_app_metadata: client.cluster.push_monitor_app_metadata,
24
+ ))
22
25
  end
23
26
 
24
27
  it 'reconnects' do
@@ -42,7 +42,7 @@ describe Mongo::Socket::OcspVerifier do
42
42
  lambda do
43
43
  verifier.verify
44
44
  end.should raise_error(Mongo::Error::ServerCertificateRevoked)
45
- end.should take_shorter_than 3
45
+ end.should take_shorter_than 7
46
46
  end
47
47
  end
48
48
 
@@ -76,7 +76,7 @@ describe Mongo::Socket::OcspVerifier do
76
76
  end
77
77
 
78
78
  let(:verifier) do
79
- described_class.new('foo', cert, ca_cert, cert_store, timeout: 3)
79
+ described_class.new('foo', cert, ca_cert, cert_store, timeout: 7)
80
80
  end
81
81
  end
82
82
 
@@ -101,7 +101,7 @@ describe Mongo::Socket::OcspVerifier do
101
101
  # the operation complete quickly.
102
102
  lambda do
103
103
  verifier.verify
104
- end.should take_shorter_than 3
104
+ end.should take_shorter_than 7
105
105
  end
106
106
  end
107
107
 
@@ -124,7 +124,7 @@ describe Mongo::Socket::OcspVerifier do
124
124
  it 'does not wait for the timeout' do
125
125
  lambda do
126
126
  verifier.verify
127
- end.should take_shorter_than 3
127
+ end.should take_shorter_than 7
128
128
  end
129
129
  end
130
130
 
@@ -152,7 +152,7 @@ describe Mongo::Socket::OcspVerifier do
152
152
  it 'does not wait for the timeout' do
153
153
  lambda do
154
154
  verifier.verify
155
- end.should take_shorter_than 3
155
+ end.should take_shorter_than 7
156
156
  end
157
157
  end
158
158
  end
@@ -198,7 +198,7 @@ describe Mongo::Socket::OcspVerifier do
198
198
  it 'does not wait for the timeout' do
199
199
  lambda do
200
200
  verifier.verify
201
- end.should take_shorter_than 3
201
+ end.should take_shorter_than 7
202
202
  end
203
203
  end
204
204
 
@@ -228,7 +228,7 @@ describe Mongo::Socket::OcspVerifier do
228
228
  it 'does not wait for the timeout' do
229
229
  lambda do
230
230
  verifier.verify
231
- end.should take_shorter_than 3
231
+ end.should take_shorter_than 7
232
232
  end
233
233
  end
234
234
  end
@@ -278,6 +278,8 @@ describe Mongo::Socket::OcspVerifier do
278
278
  ensure
279
279
  server.shutdown
280
280
  end
281
+
282
+ ::Utils.wait_for_port_free(8100, 5)
281
283
  end
282
284
 
283
285
  [400, 404, 500, 503].each do |_code|
@@ -312,6 +314,9 @@ describe Mongo::Socket::OcspVerifier do
312
314
  context 'responder URI has no path' do
313
315
  require_external_connectivity
314
316
 
317
+ # https://github.com/jruby/jruby-openssl/issues/210
318
+ fails_on_jruby
319
+
315
320
  include_context 'basic verifier'
316
321
 
317
322
  let(:cert_path) { File.join(File.dirname(__FILE__), '../support/certificates/atlas-ocsp.crt') }
@@ -323,6 +328,7 @@ describe Mongo::Socket::OcspVerifier do
323
328
  end
324
329
 
325
330
  before do
331
+ verifier.ocsp_uris.length.should > 0
326
332
  URI.parse(verifier.ocsp_uris.first).path.should == ''
327
333
  end
328
334
 
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'OperationFailure code' do
4
- let(:collection_name) { 'operation_error_code_spec' }
4
+ let(:collection_name) { 'operation_failure_code_spec' }
5
5
  let(:collection) { authorized_client[collection_name] }
6
6
 
7
7
  before do
@@ -0,0 +1,90 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'OperationFailure message' do
4
+ let(:client) { authorized_client }
5
+ let(:collection_name) { 'operation_failure_message_spec' }
6
+ let(:collection) { client[collection_name] }
7
+
8
+ context 'crud error' do
9
+ before do
10
+ collection.delete_many
11
+ end
12
+
13
+ context 'a command error with code and code name' do
14
+ context 'on modern servers that provide code name' do
15
+ # Sharded clusters include the code name: SERVER-55582
16
+ require_topology :single, :replica_set
17
+
18
+ min_server_fcv '3.4'
19
+
20
+ it 'reports code, code name and message' do
21
+ begin
22
+ client.command(bogus_command: nil)
23
+ fail('Should have raised')
24
+ rescue Mongo::Error::OperationFailure => e
25
+ e.code_name.should == 'CommandNotFound'
26
+ e.message.should =~ %r,\A\[59:CommandNotFound\]: no such (?:command|cmd): '?bogus_command'?,
27
+ end
28
+ end
29
+ end
30
+
31
+ context 'on legacy servers where code name is not provided' do
32
+ max_server_version '3.2'
33
+
34
+ it 'reports code and message' do
35
+ begin
36
+ client.command(bogus_command: nil)
37
+ fail('Should have raised')
38
+ rescue Mongo::Error::OperationFailure => e
39
+ e.code_name.should be nil
40
+ e.message.should =~ %r,\A\[59\]: no such (?:command|cmd): '?bogus_command'?,
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ context 'a write error with code and no code name' do
47
+ # Sharded clusters include the code name: SERVER-55582
48
+ require_topology :single, :replica_set
49
+
50
+ it 'reports code name, code and message' do
51
+ begin
52
+ collection.insert_one(_id: 1)
53
+ collection.insert_one(_id: 1)
54
+ fail('Should have raised')
55
+ rescue Mongo::Error::OperationFailure => e
56
+ e.code_name.should be nil
57
+ e.message.should =~ %r,\A\[11000\]: (?:insertDocument :: caused by :: 11000 )?E11000 duplicate key error (?:collection|index):,
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+ context 'authentication error' do
64
+ require_no_external_user
65
+
66
+ let(:client) do
67
+ authorized_client.with(user: 'bogus', password: 'bogus')
68
+ end
69
+
70
+ context 'on modern servers where code name is provided' do
71
+ min_server_fcv '3.4'
72
+
73
+ it 'includes code and code name in the message' do
74
+ lambda do
75
+ client.command(ping: 1)
76
+ end.should raise_error(Mongo::Auth::Unauthorized, /User bogus.*is not authorized.*\[18:AuthenticationFailed\]: Authentication failed/)
77
+ end
78
+ end
79
+
80
+ context 'on legacy servers where code name is not provided' do
81
+ max_server_version '3.2'
82
+
83
+ it 'includes code only in the message' do
84
+ lambda do
85
+ client.command(ping: 1)
86
+ end.should raise_error(Mongo::Auth::Unauthorized, /User bogus.*is not authorized.*\[18\]: (?:Authentication|auth) failed/)
87
+ end
88
+ end
89
+ end
90
+ end
@@ -65,7 +65,7 @@ describe 'Client after reconnect' do
65
65
  end
66
66
 
67
67
  let(:client) do
68
- new_local_client(uri, SpecConfig.instance.ssl_options.merge(
68
+ new_local_client(uri, SpecConfig.instance.monitoring_options.merge(
69
69
  server_selection_timeout: 3.86, logger: logger))
70
70
  end
71
71
 
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'SDAM error handling' do
4
- clean_slate_for_all
4
+ clean_slate
5
5
 
6
6
  after do
7
7
  # Close all clients after every test to avoid leaking expectations into
@@ -67,10 +67,8 @@ describe 'SDAM events' do
67
67
  started_events.length.should <= 10
68
68
 
69
69
  succeeded_events = subscriber.select_succeeded_events(Mongo::Monitoring::Event::ServerHeartbeatSucceeded)
70
- # Since we gracefully close the client, we expect each heartbeat
71
- # to complete.
72
70
  started_events.length.should > 1
73
- (succeeded_events.length-1..succeeded_events.length).should include(started_events.length)
71
+ (succeeded_events.length..succeeded_events.length+1).should include(started_events.length)
74
72
  end
75
73
  end
76
74
 
@@ -109,9 +107,9 @@ describe 'SDAM events' do
109
107
  # There may be in-flight ismasters that don't complete, both
110
108
  # regular and awaited.
111
109
  started_awaited.length.should > 1
112
- (succeeded_awaited.length-1..succeeded_awaited.length).should include(started_awaited.length)
110
+ (succeeded_awaited.length..succeeded_awaited.length+1).should include(started_awaited.length)
113
111
  started_regular.length.should > 1
114
- (succeeded_regular.length-1..succeeded_regular.length).should include(started_regular.length)
112
+ (succeeded_regular.length..succeeded_regular.length+1).should include(started_regular.length)
115
113
  end
116
114
  end
117
115
  end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Snappy compression' do
4
+ require_snappy_compression
5
+
6
+ before do
7
+ authorized_client['test'].drop
8
+ end
9
+
10
+ context 'when client has snappy compressor option enabled' do
11
+ it 'compresses the message to the server' do
12
+ # Double check that the client has snappy compression enabled
13
+ expect(authorized_client.options[:compressors]).to include('snappy')
14
+
15
+ expect(Mongo::Protocol::Compressed).to receive(:new).twice.and_call_original
16
+ expect(Snappy).to receive(:deflate).twice.and_call_original
17
+ expect(Snappy).to receive(:inflate).twice.and_call_original
18
+
19
+ authorized_client['test'].insert_one(_id: 1, text: 'hello world')
20
+ document = authorized_client['test'].find(_id: 1).first
21
+
22
+ expect(document['text']).to eq('hello world')
23
+ end
24
+ end
25
+ end
@@ -117,7 +117,7 @@ describe 'SRV Monitoring' do
117
117
 
118
118
  let(:client) do
119
119
  new_local_client(uri,
120
- SpecConfig.instance.ssl_options.merge(
120
+ SpecConfig.instance.monitoring_options.merge(
121
121
  server_selection_timeout: 3.16,
122
122
  socket_timeout: 8.11,
123
123
  connect_timeout: 8.12,
@@ -8,6 +8,12 @@ describe 'Transactions examples' do
8
8
  authorized_client.with(read_concern: {level: :majority}, write: {w: :majority})
9
9
  end
10
10
 
11
+ before do
12
+ if SpecConfig.instance.client_debug?
13
+ Mongo::Logger.logger.level = 0
14
+ end
15
+ end
16
+
11
17
  let(:hr) do
12
18
  client.use(:hr).database
13
19
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'Zlib compression' do
4
- require_compression
4
+ require_zlib_compression
5
5
 
6
6
  before do
7
7
  authorized_client['test'].drop
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Zstd compression' do
4
+ min_server_version '4.2'
5
+ require_zstd_compression
6
+
7
+ before do
8
+ authorized_client['test'].drop
9
+ end
10
+
11
+ context 'when client has snappy compressor option enabled' do
12
+ it 'compresses the message to the server' do
13
+ # Double check that the client has zstd compression enabled
14
+ expect(authorized_client.options[:compressors]).to include('zstd')
15
+
16
+ expect(Mongo::Protocol::Compressed).to receive(:new).twice.and_call_original
17
+ expect(Zstd).to receive(:compress).twice.and_call_original
18
+ expect(Zstd).to receive(:decompress).twice.and_call_original
19
+
20
+ authorized_client['test'].insert_one(_id: 1, text: 'hello world')
21
+ document = authorized_client['test'].find(_id: 1).first
22
+
23
+ expect(document['text']).to eq('hello world')
24
+ end
25
+ end
26
+ end