mongo 2.14.1 → 2.15.0.alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +4 -1
  4. data/Rakefile +8 -15
  5. data/lib/mongo/auth/aws/conversation.rb +1 -4
  6. data/lib/mongo/auth/base.rb +13 -7
  7. data/lib/mongo/auth/conversation_base.rb +32 -0
  8. data/lib/mongo/auth/cr/conversation.rb +6 -29
  9. data/lib/mongo/auth/gssapi/conversation.rb +4 -15
  10. data/lib/mongo/auth/ldap/conversation.rb +3 -14
  11. data/lib/mongo/auth/sasl_conversation_base.rb +1 -13
  12. data/lib/mongo/auth/scram_conversation_base.rb +7 -34
  13. data/lib/mongo/auth/user/view.rb +16 -9
  14. data/lib/mongo/auth/x509/conversation.rb +4 -25
  15. data/lib/mongo/bulk_write.rb +21 -18
  16. data/lib/mongo/client.rb +82 -6
  17. data/lib/mongo/cluster/reapers/cursor_reaper.rb +6 -2
  18. data/lib/mongo/cluster.rb +19 -2
  19. data/lib/mongo/collection/view/aggregation.rb +1 -1
  20. data/lib/mongo/collection/view/change_stream.rb +1 -1
  21. data/lib/mongo/collection/view/iterable.rb +7 -17
  22. data/lib/mongo/collection/view/map_reduce.rb +2 -2
  23. data/lib/mongo/collection/view/readable.rb +42 -20
  24. data/lib/mongo/collection/view/writable.rb +14 -14
  25. data/lib/mongo/collection.rb +6 -6
  26. data/lib/mongo/cursor.rb +2 -12
  27. data/lib/mongo/database/view.rb +1 -1
  28. data/lib/mongo/database.rb +8 -3
  29. data/lib/mongo/error/bulk_write_error.rb +17 -3
  30. data/lib/mongo/error/internal_driver_error.rb +22 -0
  31. data/lib/mongo/error/operation_failure.rb +21 -2
  32. data/lib/mongo/error/parser.rb +65 -12
  33. data/lib/mongo/error/server_api_conflict.rb +23 -0
  34. data/lib/mongo/error/server_api_not_supported.rb +24 -0
  35. data/lib/mongo/error/unmet_dependency.rb +21 -0
  36. data/lib/mongo/error.rb +9 -1
  37. data/lib/mongo/index/view.rb +21 -11
  38. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +27 -16
  39. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +26 -15
  40. data/lib/mongo/monitoring.rb +13 -4
  41. data/lib/mongo/operation/collections_info/command.rb +2 -2
  42. data/lib/mongo/operation/collections_info.rb +18 -1
  43. data/lib/mongo/operation/context.rb +99 -0
  44. data/lib/mongo/operation/indexes.rb +15 -1
  45. data/lib/mongo/operation/insert/command.rb +2 -2
  46. data/lib/mongo/operation/insert/legacy.rb +2 -2
  47. data/lib/mongo/operation/insert/op_msg.rb +2 -2
  48. data/lib/mongo/operation/list_collections/result.rb +4 -1
  49. data/lib/mongo/operation/parallel_scan/command.rb +2 -1
  50. data/lib/mongo/operation/result.rb +2 -0
  51. data/lib/mongo/operation/shared/executable.rb +24 -14
  52. data/lib/mongo/operation/shared/executable_no_validate.rb +2 -2
  53. data/lib/mongo/operation/shared/op_msg_or_command.rb +1 -7
  54. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +1 -7
  55. data/lib/mongo/operation/shared/polymorphic_operation.rb +39 -0
  56. data/lib/mongo/operation/shared/read_preference_supported.rb +36 -38
  57. data/lib/mongo/operation/shared/response_handling.rb +23 -23
  58. data/lib/mongo/operation/shared/sessions_supported.rb +15 -5
  59. data/lib/mongo/operation/shared/write.rb +8 -18
  60. data/lib/mongo/operation.rb +2 -2
  61. data/lib/mongo/protocol/compressed.rb +51 -5
  62. data/lib/mongo/protocol/message.rb +20 -2
  63. data/lib/mongo/protocol/msg.rb +38 -13
  64. data/lib/mongo/protocol/query.rb +11 -11
  65. data/lib/mongo/query_cache.rb +30 -0
  66. data/lib/mongo/retryable.rb +1 -1
  67. data/lib/mongo/server/app_metadata.rb +52 -18
  68. data/lib/mongo/server/connection.rb +5 -0
  69. data/lib/mongo/server/connection_base.rb +13 -10
  70. data/lib/mongo/server/connection_pool.rb +6 -2
  71. data/lib/mongo/server/description/features.rb +9 -8
  72. data/lib/mongo/server/description.rb +4 -0
  73. data/lib/mongo/server/monitor/app_metadata.rb +1 -1
  74. data/lib/mongo/server/monitor/connection.rb +9 -10
  75. data/lib/mongo/server/monitor.rb +20 -1
  76. data/lib/mongo/server/pending_connection.rb +24 -6
  77. data/lib/mongo/server/push_monitor.rb +11 -1
  78. data/lib/mongo/server.rb +7 -1
  79. data/lib/mongo/server_selector/secondary_preferred.rb +7 -2
  80. data/lib/mongo/session/session_pool.rb +4 -2
  81. data/lib/mongo/session.rb +2 -2
  82. data/lib/mongo/socket/ssl.rb +8 -0
  83. data/lib/mongo/socket.rb +29 -4
  84. data/lib/mongo/uri/options_mapper.rb +38 -0
  85. data/lib/mongo/utils.rb +15 -0
  86. data/lib/mongo/version.rb +1 -1
  87. data/lib/mongo.rb +23 -0
  88. data/spec/README.md +24 -1
  89. data/spec/integration/auth_spec.rb +25 -15
  90. data/spec/integration/bulk_write_error_message_spec.rb +41 -0
  91. data/spec/integration/change_stream_spec.rb +4 -4
  92. data/spec/integration/command_monitoring_spec.rb +2 -2
  93. data/spec/integration/connection_spec.rb +2 -0
  94. data/spec/integration/docs_examples_spec.rb +8 -1
  95. data/spec/integration/fork_reconnect_spec.rb +4 -1
  96. data/spec/integration/ocsp_verifier_spec.rb +13 -7
  97. data/spec/integration/operation_failure_code_spec.rb +1 -1
  98. data/spec/integration/operation_failure_message_spec.rb +90 -0
  99. data/spec/integration/query_cache_spec.rb +0 -45
  100. data/spec/integration/reconnect_spec.rb +1 -1
  101. data/spec/integration/snappy_compression_spec.rb +25 -0
  102. data/spec/integration/srv_monitoring_spec.rb +1 -1
  103. data/spec/integration/transactions_examples_spec.rb +6 -0
  104. data/spec/integration/zlib_compression_spec.rb +1 -1
  105. data/spec/integration/zstd_compression_spec.rb +26 -0
  106. data/spec/lite_spec_helper.rb +7 -1
  107. data/spec/mongo/address_spec.rb +15 -11
  108. data/spec/mongo/auth/ldap/conversation_spec.rb +1 -1
  109. data/spec/mongo/auth/ldap_spec.rb +5 -1
  110. data/spec/mongo/auth/scram_negotiation_spec.rb +1 -1
  111. data/spec/mongo/auth/scram_spec.rb +1 -1
  112. data/spec/mongo/auth/x509/conversation_spec.rb +3 -3
  113. data/spec/mongo/client_construction_spec.rb +207 -33
  114. data/spec/mongo/client_spec.rb +17 -0
  115. data/spec/mongo/cluster_spec.rb +1 -0
  116. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  117. data/spec/mongo/collection/view/readable_spec.rb +33 -19
  118. data/spec/mongo/collection_crud_spec.rb +4357 -0
  119. data/spec/mongo/collection_ddl_spec.rb +534 -0
  120. data/spec/mongo/collection_spec.rb +5 -4859
  121. data/spec/mongo/database_spec.rb +66 -4
  122. data/spec/mongo/error/bulk_write_error_spec.rb +3 -3
  123. data/spec/mongo/error/parser_spec.rb +37 -6
  124. data/spec/mongo/index/view_spec.rb +4 -0
  125. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +1 -1
  126. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +1 -1
  127. data/spec/mongo/operation/aggregate_spec.rb +2 -1
  128. data/spec/mongo/operation/collections_info_spec.rb +4 -1
  129. data/spec/mongo/operation/command_spec.rb +6 -3
  130. data/spec/mongo/operation/create_index_spec.rb +6 -3
  131. data/spec/mongo/operation/create_user_spec.rb +6 -3
  132. data/spec/mongo/operation/delete/bulk_spec.rb +9 -6
  133. data/spec/mongo/operation/delete_spec.rb +11 -7
  134. data/spec/mongo/operation/drop_index_spec.rb +6 -2
  135. data/spec/mongo/operation/find/legacy_spec.rb +3 -1
  136. data/spec/mongo/operation/get_more_spec.rb +3 -1
  137. data/spec/mongo/operation/indexes_spec.rb +5 -1
  138. data/spec/mongo/operation/insert/bulk_spec.rb +10 -7
  139. data/spec/mongo/operation/insert_spec.rb +15 -12
  140. data/spec/mongo/operation/map_reduce_spec.rb +5 -2
  141. data/spec/mongo/operation/read_preference_legacy_spec.rb +19 -9
  142. data/spec/mongo/operation/read_preference_op_msg_spec.rb +3 -3
  143. data/spec/mongo/operation/remove_user_spec.rb +6 -3
  144. data/spec/mongo/operation/result_spec.rb +1 -1
  145. data/spec/mongo/operation/update/bulk_spec.rb +9 -6
  146. data/spec/mongo/operation/update_spec.rb +10 -7
  147. data/spec/mongo/operation/update_user_spec.rb +4 -1
  148. data/spec/mongo/protocol/compressed_spec.rb +26 -12
  149. data/spec/mongo/query_cache_middleware_spec.rb +55 -0
  150. data/spec/mongo/retryable_spec.rb +3 -2
  151. data/spec/mongo/server/app_metadata_shared.rb +7 -33
  152. data/spec/mongo/server/app_metadata_spec.rb +2 -0
  153. data/spec/mongo/server/connection_pool/populator_spec.rb +3 -1
  154. data/spec/mongo/server/connection_pool_spec.rb +1 -1
  155. data/spec/mongo/server/connection_spec.rb +24 -17
  156. data/spec/mongo/server/monitor/connection_spec.rb +17 -7
  157. data/spec/mongo/server/monitor_spec.rb +9 -1
  158. data/spec/mongo/server_selector/secondary_preferred_spec.rb +6 -6
  159. data/spec/mongo/server_spec.rb +15 -2
  160. data/spec/mongo/socket/ssl_spec.rb +40 -0
  161. data/spec/mongo/socket_spec.rb +2 -2
  162. data/spec/mongo/tls_context_hooks_spec.rb +37 -0
  163. data/spec/runners/connection_string.rb +0 -4
  164. data/spec/runners/crud/requirement.rb +40 -3
  165. data/spec/runners/crud/verifier.rb +8 -0
  166. data/spec/runners/transactions/operation.rb +1 -1
  167. data/spec/runners/transactions/test.rb +1 -0
  168. data/spec/runners/unified/assertions.rb +249 -0
  169. data/spec/runners/unified/change_stream_operations.rb +26 -0
  170. data/spec/runners/unified/crud_operations.rb +199 -0
  171. data/spec/runners/unified/ddl_operations.rb +96 -0
  172. data/spec/runners/unified/entity_map.rb +39 -0
  173. data/spec/runners/unified/error.rb +25 -0
  174. data/spec/runners/unified/event_subscriber.rb +91 -0
  175. data/spec/runners/unified/exceptions.rb +21 -0
  176. data/spec/runners/unified/grid_fs_operations.rb +55 -0
  177. data/spec/runners/unified/support_operations.rb +250 -0
  178. data/spec/runners/unified/test.rb +393 -0
  179. data/spec/runners/unified/test_group.rb +28 -0
  180. data/spec/runners/unified/using_hash.rb +31 -0
  181. data/spec/runners/unified.rb +96 -0
  182. data/spec/shared/lib/mrss/cluster_config.rb +0 -3
  183. data/spec/shared/lib/mrss/docker_runner.rb +0 -3
  184. data/spec/shared/lib/mrss/lite_constraints.rb +0 -16
  185. data/spec/shared/lib/mrss/server_version_registry.rb +0 -3
  186. data/spec/shared/lib/mrss/spec_organizer.rb +0 -3
  187. data/spec/shared/shlib/server.sh +1 -1
  188. data/spec/spec_helper.rb +4 -1
  189. data/spec/spec_tests/crud_unified_spec.rb +10 -0
  190. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -1
  191. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +267 -0
  192. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +60 -0
  193. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount.yml → estimatedDocumentCount-pre4.9.yml} +2 -0
  194. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +146 -0
  195. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors.yml → estimatedDocumentCount-serverErrors-pre4.9.yml} +2 -0
  196. data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +1 -1
  197. data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
  198. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +220 -0
  199. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
  200. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +184 -0
  201. data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
  202. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
  203. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
  204. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
  205. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
  206. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
  207. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +170 -0
  208. data/spec/spec_tests/data/uri_options/compression-options.yml +1 -1
  209. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +416 -0
  210. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +409 -0
  211. data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +67 -0
  212. data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
  213. data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +44 -0
  214. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +180 -0
  215. data/spec/spec_tests/unified_spec.rb +15 -0
  216. data/spec/spec_tests/uri_options_spec.rb +16 -0
  217. data/spec/spec_tests/versioned_api_spec.rb +10 -0
  218. data/spec/support/client_registry.rb +4 -8
  219. data/spec/support/client_registry_macros.rb +4 -4
  220. data/spec/support/common_shortcuts.rb +15 -1
  221. data/spec/support/shared/session.rb +2 -2
  222. data/spec/support/spec_config.rb +42 -11
  223. data/spec/support/utils.rb +64 -3
  224. data.tar.gz.sig +0 -0
  225. metadata +1005 -915
  226. metadata.gz.sig +0 -0
  227. data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +0 -58
  228. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +0 -47
  229. data/spec/integration/secondary_reads_spec.rb +0 -102
  230. data/spec/support/cluster_config.rb +0 -207
@@ -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
@@ -1042,49 +1042,4 @@ describe 'QueryCache' do
1042
1042
  expect(events.length).to eq(2)
1043
1043
  end
1044
1044
  end
1045
-
1046
- context 'when result set has multiple documents and cursor is iterated partially' do
1047
-
1048
- before do
1049
- Mongo::QueryCache.enabled = false
1050
- 5.times do
1051
- authorized_collection.insert_one({ name: 'testing' })
1052
- end
1053
- end
1054
-
1055
- shared_examples 'retrieves full result set on second iteration' do
1056
- it 'retrieves full result set on second iteration' do
1057
- Mongo::QueryCache.clear
1058
- Mongo::QueryCache.enabled = true
1059
-
1060
- partial_first_iteration
1061
-
1062
- authorized_collection.find.to_a.length.should == 5
1063
- end
1064
-
1065
- end
1066
-
1067
- context 'using each & break' do
1068
- let(:partial_first_iteration) do
1069
- called = false
1070
- authorized_collection.find.each do
1071
- called = true
1072
- break
1073
- end
1074
- called.should be true
1075
- end
1076
-
1077
- include_examples 'retrieves full result set on second iteration'
1078
- end
1079
-
1080
- context 'using next' do
1081
- let(:partial_first_iteration) do
1082
- # #next is executed in its own fiber, and query cache is disabled
1083
- # for that operation.
1084
- authorized_collection.find.to_enum.next
1085
- end
1086
-
1087
- include_examples 'retrieves full result set on second iteration'
1088
- end
1089
- end
1090
1045
  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
 
@@ -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
@@ -69,6 +69,10 @@ unless SpecConfig.instance.client_debug?
69
69
  end
70
70
  Encoding.default_external = Encoding::UTF_8
71
71
 
72
+ module Mrss
73
+ autoload :Utils, 'mrss/utils'
74
+ end
75
+
72
76
  require 'mrss/lite_constraints'
73
77
  require 'support/matchers'
74
78
  require 'support/event_subscriber'
@@ -88,6 +92,8 @@ else
88
92
  TimeoutInterrupt = Timeout
89
93
  end
90
94
 
95
+ class ExampleTimeout < StandardError; end
96
+
91
97
  RSpec.configure do |config|
92
98
  config.extend(CommonShortcuts::ClassMethods)
93
99
  config.include(CommonShortcuts::InstanceMethods)
@@ -118,7 +124,7 @@ RSpec.configure do |config|
118
124
  else
119
125
  45
120
126
  end
121
- TimeoutInterrupt.timeout(timeout) do
127
+ TimeoutInterrupt.timeout(timeout, ExampleTimeout) do
122
128
  example.run
123
129
  end
124
130
  end
@@ -263,21 +263,25 @@ describe Mongo::Address do
263
263
  end
264
264
  end
265
265
 
266
- if Socket.const_defined?(:TCP_KEEPINTVL)
267
- it 'sets the socket TCP_KEEPINTVL option' do
268
- expect(socket.getsockopt(Socket::IPPROTO_TCP, Socket::TCP_KEEPINTVL).int).to be <= 10
266
+ context 'keep-alive options' do
267
+ fails_on_jruby
268
+
269
+ if Socket.const_defined?(:TCP_KEEPINTVL)
270
+ it 'sets the socket TCP_KEEPINTVL option' do
271
+ expect(socket.getsockopt(Socket::IPPROTO_TCP, Socket::TCP_KEEPINTVL).int).to be <= 10
272
+ end
269
273
  end
270
- end
271
274
 
272
- if Socket.const_defined?(:TCP_KEEPCNT)
273
- it 'sets the socket TCP_KEEPCNT option' do
274
- expect(socket.getsockopt(Socket::IPPROTO_TCP, Socket::TCP_KEEPCNT).int).to be <= 9
275
+ if Socket.const_defined?(:TCP_KEEPCNT)
276
+ it 'sets the socket TCP_KEEPCNT option' do
277
+ expect(socket.getsockopt(Socket::IPPROTO_TCP, Socket::TCP_KEEPCNT).int).to be <= 9
278
+ end
275
279
  end
276
- end
277
280
 
278
- if Socket.const_defined?(:TCP_KEEPIDLE)
279
- it 'sets the socket TCP_KEEPIDLE option' do
280
- expect(socket.getsockopt(Socket::IPPROTO_TCP, Socket::TCP_KEEPIDLE).int).to be <= 120
281
+ if Socket.const_defined?(:TCP_KEEPIDLE)
282
+ it 'sets the socket TCP_KEEPIDLE option' do
283
+ expect(socket.getsockopt(Socket::IPPROTO_TCP, Socket::TCP_KEEPIDLE).int).to be <= 120
284
+ end
281
285
  end
282
286
  end
283
287
  end
@@ -4,7 +4,7 @@ describe Mongo::Auth::LDAP::Conversation do
4
4
 
5
5
  let(:user) do
6
6
  Mongo::Auth::User.new(
7
- database: Mongo::Database::ADMIN,
7
+ database: '$external',
8
8
  user: 'user',
9
9
  password: 'pencil'
10
10
  )
@@ -11,7 +11,11 @@ describe Mongo::Auth::LDAP do
11
11
  end
12
12
 
13
13
  let(:user) do
14
- Mongo::Auth::User.new(database: SpecConfig.instance.test_db, user: 'driver', password: 'password')
14
+ Mongo::Auth::User.new(
15
+ database: '$external',
16
+ user: 'driver',
17
+ password: 'password',
18
+ )
15
19
  end
16
20
 
17
21
  describe '#login' do
@@ -329,7 +329,7 @@ describe 'SCRAM-SHA auth mechanism negotiation' do
329
329
  end
330
330
 
331
331
  let(:client) do
332
- new_local_client(uri, SpecConfig.instance.ssl_options.merge(max_pool_size: 1))
332
+ new_local_client(uri, SpecConfig.instance.monitoring_options.merge(max_pool_size: 1))
333
333
  end
334
334
 
335
335
  context 'when the user exists' do
@@ -8,7 +8,7 @@ describe Mongo::Auth::Scram do
8
8
  end
9
9
 
10
10
  let(:connection) do
11
- Mongo::Server::Connection.new(server, SpecConfig.instance.test_options)
11
+ Mongo::Server::Connection.new(server, SpecConfig.instance.monitoring_options)
12
12
  end
13
13
 
14
14
  let(:cache_mod) { Mongo::Auth::CredentialCache }
@@ -4,7 +4,7 @@ describe Mongo::Auth::X509::Conversation do
4
4
 
5
5
  let(:user) do
6
6
  Mongo::Auth::User.new(
7
- database: Mongo::Database::ADMIN,
7
+ database: '$external',
8
8
  user: 'user',
9
9
  )
10
10
  end
@@ -35,7 +35,7 @@ describe Mongo::Auth::X509::Conversation do
35
35
 
36
36
  let(:user) do
37
37
  Mongo::Auth::User.new(
38
- database: Mongo::Database::ADMIN
38
+ database: '$external',
39
39
  )
40
40
  end
41
41
 
@@ -52,7 +52,7 @@ describe Mongo::Auth::X509::Conversation do
52
52
 
53
53
  let(:user) do
54
54
  Mongo::Auth::User.new(
55
- database: Mongo::Database::ADMIN,
55
+ database: '$external',
56
56
  user: nil
57
57
  )
58
58
  end