mongo 2.9.2 → 2.10.0.rc0

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 (227) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/mongo.rb +1 -0
  5. data/lib/mongo/auth/user/view.rb +4 -4
  6. data/lib/mongo/bulk_write.rb +14 -8
  7. data/lib/mongo/bulk_write/result.rb +1 -1
  8. data/lib/mongo/bulk_write/result_combiner.rb +2 -2
  9. data/lib/mongo/bulk_write/transformable.rb +17 -9
  10. data/lib/mongo/client.rb +107 -16
  11. data/lib/mongo/cluster.rb +47 -25
  12. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +1 -1
  13. data/lib/mongo/cluster_time.rb +139 -0
  14. data/lib/mongo/collection.rb +84 -25
  15. data/lib/mongo/collection/view.rb +7 -3
  16. data/lib/mongo/collection/view/aggregation.rb +4 -4
  17. data/lib/mongo/collection/view/builder/aggregation.rb +31 -6
  18. data/lib/mongo/collection/view/builder/find_command.rb +4 -1
  19. data/lib/mongo/collection/view/builder/map_reduce.rb +4 -1
  20. data/lib/mongo/collection/view/change_stream.rb +54 -66
  21. data/lib/mongo/collection/view/iterable.rb +2 -2
  22. data/lib/mongo/collection/view/map_reduce.rb +6 -4
  23. data/lib/mongo/collection/view/readable.rb +36 -16
  24. data/lib/mongo/collection/view/writable.rb +68 -22
  25. data/lib/mongo/cursor.rb +87 -20
  26. data/lib/mongo/database.rb +47 -43
  27. data/lib/mongo/database/view.rb +54 -11
  28. data/lib/mongo/error.rb +13 -4
  29. data/lib/mongo/error/invalid_write_concern.rb +2 -2
  30. data/lib/mongo/error/operation_failure.rb +65 -11
  31. data/lib/mongo/error/parser.rb +41 -8
  32. data/lib/mongo/grid/fs_bucket.rb +26 -6
  33. data/lib/mongo/grid/stream/read.rb +9 -2
  34. data/lib/mongo/grid/stream/write.rb +21 -5
  35. data/lib/mongo/index/view.rb +3 -3
  36. data/lib/mongo/lint.rb +10 -3
  37. data/lib/mongo/operation.rb +2 -0
  38. data/lib/mongo/operation/aggregate/result.rb +19 -6
  39. data/lib/mongo/operation/collections_info.rb +1 -1
  40. data/lib/mongo/operation/get_more/result.rb +9 -0
  41. data/lib/mongo/operation/list_collections/command.rb +1 -3
  42. data/lib/mongo/operation/list_collections/op_msg.rb +1 -2
  43. data/lib/mongo/operation/parallel_scan/command.rb +4 -1
  44. data/lib/mongo/operation/parallel_scan/op_msg.rb +4 -1
  45. data/lib/mongo/operation/result.rb +27 -4
  46. data/lib/mongo/operation/shared/executable.rb +19 -5
  47. data/lib/mongo/operation/shared/executable_no_validate.rb +1 -2
  48. data/lib/mongo/operation/shared/executable_transaction_label.rb +0 -9
  49. data/lib/mongo/operation/shared/polymorphic_result.rb +9 -1
  50. data/lib/mongo/operation/shared/result/aggregatable.rb +2 -2
  51. data/lib/mongo/operation/shared/sessions_supported.rb +42 -32
  52. data/lib/mongo/operation/shared/specifiable.rb +40 -0
  53. data/lib/mongo/operation/shared/unpinnable.rb +39 -0
  54. data/lib/mongo/operation/shared/write.rb +1 -1
  55. data/lib/mongo/protocol/update.rb +6 -2
  56. data/lib/mongo/retryable.rb +79 -39
  57. data/lib/mongo/server/connection.rb +10 -3
  58. data/lib/mongo/server/description.rb +25 -1
  59. data/lib/mongo/server/monitor/connection.rb +1 -1
  60. data/lib/mongo/server_selector.rb +10 -0
  61. data/lib/mongo/server_selector/selectable.rb +172 -32
  62. data/lib/mongo/session.rb +654 -581
  63. data/lib/mongo/session/session_pool.rb +1 -1
  64. data/lib/mongo/socket.rb +7 -28
  65. data/lib/mongo/socket/ssl.rb +26 -1
  66. data/lib/mongo/socket/tcp.rb +3 -0
  67. data/lib/mongo/socket/unix.rb +3 -0
  68. data/lib/mongo/uri.rb +112 -265
  69. data/lib/mongo/uri/srv_protocol.rb +4 -1
  70. data/lib/mongo/version.rb +1 -1
  71. data/lib/mongo/write_concern.rb +10 -29
  72. data/lib/mongo/write_concern/acknowledged.rb +12 -0
  73. data/lib/mongo/write_concern/base.rb +17 -13
  74. data/lib/mongo/write_concern/unacknowledged.rb +12 -0
  75. data/spec/atlas/atlas_connectivity_spec.rb +7 -37
  76. data/spec/atlas/operations_spec.rb +25 -0
  77. data/spec/integration/change_stream_examples_spec.rb +45 -31
  78. data/spec/integration/change_stream_spec.rb +305 -5
  79. data/spec/integration/client_spec.rb +44 -0
  80. data/spec/integration/command_monitoring_spec.rb +1 -0
  81. data/spec/integration/command_spec.rb +7 -1
  82. data/spec/integration/mmapv1_spec.rb +28 -0
  83. data/spec/integration/mongos_pinning_spec.rb +34 -0
  84. data/spec/integration/operation_failure_code_spec.rb +2 -2
  85. data/spec/integration/{read_concern.rb → read_concern_spec.rb} +7 -1
  86. data/spec/integration/read_preference_spec.rb +485 -0
  87. data/spec/integration/retryable_writes_spec.rb +8 -19
  88. data/spec/integration/sdam_error_handling_spec.rb +1 -1
  89. data/spec/integration/sdam_events_spec.rb +2 -2
  90. data/spec/integration/server_description_spec.rb +14 -17
  91. data/spec/integration/server_selector_spec.rb +7 -3
  92. data/spec/integration/server_spec.rb +48 -0
  93. data/spec/integration/ssl_uri_options_spec.rb +1 -1
  94. data/spec/integration/step_down_spec.rb +10 -4
  95. data/spec/integration/transactions_examples_spec.rb +11 -10
  96. data/spec/lite_spec_helper.rb +19 -16
  97. data/spec/mongo/auth/scram/negotiation_spec.rb +11 -8
  98. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +6 -6
  99. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +4 -4
  100. data/spec/mongo/bulk_write_spec.rb +12 -2
  101. data/spec/mongo/client_construction_spec.rb +160 -8
  102. data/spec/mongo/client_spec.rb +5 -4
  103. data/spec/mongo/cluster_spec.rb +6 -6
  104. data/spec/mongo/cluster_time_spec.rb +148 -0
  105. data/spec/mongo/collection/view/aggregation_spec.rb +34 -15
  106. data/spec/mongo/collection/view/change_stream_spec.rb +62 -3
  107. data/spec/mongo/collection/view/map_reduce_spec.rb +7 -5
  108. data/spec/mongo/collection/view/readable_spec.rb +4 -4
  109. data/spec/mongo/collection_spec.rb +331 -14
  110. data/spec/mongo/cursor_spec.rb +117 -5
  111. data/spec/mongo/database_spec.rb +240 -8
  112. data/spec/mongo/error/operation_failure_spec.rb +47 -1
  113. data/spec/mongo/error/parser_spec.rb +160 -23
  114. data/spec/mongo/operation/insert/bulk_spec.rb +2 -1
  115. data/spec/mongo/operation/result_spec.rb +27 -0
  116. data/spec/mongo/operation/update/bulk_spec.rb +1 -0
  117. data/spec/mongo/retryable_spec.rb +2 -0
  118. data/spec/mongo/server/app_metadata_spec.rb +2 -2
  119. data/spec/mongo/server/connection_spec.rb +13 -17
  120. data/spec/mongo/server/monitor/connection_spec.rb +13 -10
  121. data/spec/mongo/server_selector_spec.rb +34 -2
  122. data/spec/mongo/session/session_pool_spec.rb +14 -3
  123. data/spec/mongo/session_spec.rb +3 -3
  124. data/spec/mongo/session_transaction_spec.rb +4 -3
  125. data/spec/mongo/socket/ssl_spec.rb +19 -5
  126. data/spec/mongo/socket_spec.rb +1 -62
  127. data/spec/mongo/uri/srv_protocol_spec.rb +14 -20
  128. data/spec/mongo/uri_option_parsing_spec.rb +94 -8
  129. data/spec/mongo/uri_spec.rb +23 -10
  130. data/spec/mongo/write_concern_spec.rb +56 -3
  131. data/spec/spec_tests/change_streams_spec.rb +2 -1
  132. data/spec/spec_tests/cmap_spec.rb +1 -1
  133. data/spec/spec_tests/crud_spec.rb +12 -2
  134. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +24 -1
  135. data/spec/spec_tests/data/change_streams/change-streams.yml +172 -3
  136. data/spec/spec_tests/data/command_monitoring/bulkWrite.yml +1 -1
  137. data/spec/spec_tests/data/command_monitoring/updateMany.yml +0 -2
  138. data/spec/spec_tests/data/command_monitoring/updateOne.yml +0 -5
  139. data/spec/spec_tests/data/crud/read/aggregate-out.yml +0 -6
  140. data/spec/spec_tests/data/crud/read/count-empty.yml +29 -0
  141. data/spec/spec_tests/data/crud/write/bulkWrite-arrayFilters.yml +1 -0
  142. data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +101 -0
  143. data/spec/spec_tests/data/crud/write/bulkWrite.yml +401 -0
  144. data/spec/spec_tests/data/crud/write/insertMany.yml +58 -2
  145. data/spec/spec_tests/data/crud/write/updateMany-arrayFilters.yml +3 -0
  146. data/spec/spec_tests/data/crud/write/updateOne-arrayFilters.yml +6 -1
  147. data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +103 -0
  148. data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +110 -0
  149. data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +81 -0
  150. data/spec/spec_tests/data/crud_v2/db-aggregate.yml +38 -0
  151. data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +92 -0
  152. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +2 -2
  153. data/spec/spec_tests/data/transactions/abort.yml +3 -0
  154. data/spec/spec_tests/data/transactions/bulk.yml +3 -8
  155. data/spec/spec_tests/data/transactions/causal-consistency.yml +3 -8
  156. data/spec/spec_tests/data/transactions/commit.yml +3 -1
  157. data/spec/spec_tests/data/transactions/count.yml +3 -0
  158. data/spec/spec_tests/data/transactions/delete.yml +3 -0
  159. data/spec/spec_tests/data/transactions/error-labels.yml +4 -1
  160. data/spec/spec_tests/data/transactions/errors-client.yml +56 -0
  161. data/spec/spec_tests/data/transactions/errors.yml +3 -0
  162. data/spec/spec_tests/data/transactions/findOneAndDelete.yml +3 -0
  163. data/spec/spec_tests/data/transactions/findOneAndReplace.yml +3 -0
  164. data/spec/spec_tests/data/transactions/findOneAndUpdate.yml +3 -0
  165. data/spec/spec_tests/data/transactions/insert.yml +3 -0
  166. data/spec/spec_tests/data/transactions/isolation.yml +3 -0
  167. data/spec/spec_tests/data/transactions/mongos-pin-auto.yml +1671 -0
  168. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +347 -0
  169. data/spec/spec_tests/data/transactions/pin-mongos.yml +557 -0
  170. data/spec/spec_tests/data/transactions/read-concern.yml +3 -0
  171. data/spec/spec_tests/data/transactions/read-pref.yml +3 -0
  172. data/spec/spec_tests/data/transactions/reads.yml +3 -0
  173. data/spec/spec_tests/data/transactions/retryable-abort.yml +5 -2
  174. data/spec/spec_tests/data/transactions/retryable-commit.yml +4 -1
  175. data/spec/spec_tests/data/transactions/retryable-writes.yml +3 -0
  176. data/spec/spec_tests/data/transactions/run-command.yml +3 -0
  177. data/spec/spec_tests/data/transactions/transaction-options.yml +6 -0
  178. data/spec/spec_tests/data/transactions/update.yml +3 -8
  179. data/spec/spec_tests/data/transactions/write-concern.yml +348 -38
  180. data/spec/spec_tests/data/transactions_api/callback-aborts.yml +6 -0
  181. data/spec/spec_tests/data/transactions_api/callback-commits.yml +5 -0
  182. data/spec/spec_tests/data/transactions_api/callback-retry.yml +7 -2
  183. data/spec/spec_tests/data/transactions_api/commit-retry.yml +70 -15
  184. data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror-4.2.yml +3 -0
  185. data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror.yml +3 -0
  186. data/spec/spec_tests/data/transactions_api/commit-writeconcernerror.yml +59 -109
  187. data/spec/spec_tests/data/transactions_api/commit.yml +5 -0
  188. data/spec/spec_tests/data/transactions_api/transaction-options.yml +10 -0
  189. data/spec/spec_tests/retryable_reads_spec.rb +5 -2
  190. data/spec/spec_tests/retryable_writes_spec.rb +5 -2
  191. data/spec/spec_tests/sdam_monitoring_spec.rb +3 -3
  192. data/spec/spec_tests/sdam_spec.rb +2 -2
  193. data/spec/spec_tests/transactions_api_spec.rb +1 -67
  194. data/spec/spec_tests/transactions_spec.rb +2 -66
  195. data/spec/support/authorization.rb +4 -0
  196. data/spec/support/change_streams.rb +30 -10
  197. data/spec/support/change_streams/operation.rb +27 -0
  198. data/spec/support/client_registry.rb +44 -25
  199. data/spec/support/cluster_config.rb +25 -14
  200. data/spec/support/cluster_tools.rb +32 -10
  201. data/spec/support/command_monitoring.rb +1 -1
  202. data/spec/support/common_shortcuts.rb +30 -0
  203. data/spec/support/connection_string.rb +8 -3
  204. data/spec/support/constraints.rb +34 -0
  205. data/spec/support/crud.rb +31 -16
  206. data/spec/support/crud/context.rb +23 -0
  207. data/spec/support/crud/operation.rb +311 -14
  208. data/spec/support/crud/spec.rb +2 -1
  209. data/spec/support/crud/test.rb +24 -27
  210. data/spec/support/crud/test_base.rb +22 -0
  211. data/spec/support/crud/verifier.rb +15 -1
  212. data/spec/support/event_subscriber.rb +12 -0
  213. data/spec/support/sdam_formatter_integration.rb +12 -6
  214. data/spec/support/shared/server_selector.rb +10 -0
  215. data/spec/support/shared/session.rb +13 -12
  216. data/spec/support/spec_config.rb +32 -22
  217. data/spec/support/spec_setup.rb +2 -2
  218. data/spec/support/transactions.rb +87 -0
  219. data/spec/support/transactions/context.rb +33 -0
  220. data/spec/support/transactions/operation.rb +99 -349
  221. data/spec/support/transactions/spec.rb +1 -3
  222. data/spec/support/transactions/test.rb +110 -49
  223. data/spec/support/utils.rb +74 -1
  224. metadata +52 -10
  225. metadata.gz.sig +0 -0
  226. data/spec/support/crud/read.rb +0 -265
  227. data/spec/support/crud/write.rb +0 -284
@@ -13,6 +13,12 @@ require 'spec_helper'
13
13
  describe 'Retryable writes integration tests' do
14
14
  include PrimarySocket
15
15
 
16
+ require_wired_tiger_on_36
17
+
18
+ # These tests override server selector, which fails if there are multiple
19
+ # eligible servers as would be the case in a multi-shard sharded cluster
20
+ require_no_multi_shard
21
+
16
22
  before do
17
23
  authorized_collection.delete_many
18
24
  end
@@ -114,8 +120,8 @@ describe 'Retryable writes integration tests' do
114
120
  context 'when the selected server does not support retryable writes' do
115
121
 
116
122
  before do
117
- legacy_primary = double('legacy primary', :'retry_writes?' => false)
118
- allow(client.cluster).to receive(:next_primary).and_return(primary_server, legacy_primary)
123
+ legacy_primary = double('legacy primary', :retry_writes? => false)
124
+ expect(collection).to receive(:select_server).and_return(primary_server, legacy_primary)
119
125
  expect(primary_socket).to receive(:write).and_raise(error)
120
126
  end
121
127
 
@@ -688,21 +694,4 @@ describe 'Retryable writes integration tests' do
688
694
 
689
695
  it_behaves_like 'an operation that does not support retryable writes'
690
696
  end
691
-
692
- context 'when the operation is database#command' do
693
-
694
- let(:operation) do
695
- collection.database.command(ping: 1)
696
- end
697
-
698
- let(:expectation) do
699
- 0
700
- end
701
-
702
- let(:unsuccessful_retry_value) do
703
- 0
704
- end
705
-
706
- it_behaves_like 'an operation that does not support retryable writes'
707
- end
708
697
  end
@@ -7,7 +7,7 @@ describe 'SDAM error handling' do
7
7
 
8
8
  # These tests operate on specific servers, and don't work in a multi
9
9
  # shard cluster where multiple servers are equally eligible
10
- require_topology :replica_set
10
+ require_no_multi_shard
11
11
 
12
12
  let(:client) { authorized_client_without_any_retries }
13
13
 
@@ -17,7 +17,7 @@ describe 'SDAM events' do
17
17
  client.database.command(ismaster: 1)
18
18
  expect(subscriber.events).to be_empty
19
19
 
20
- client.close
20
+ client.close(true)
21
21
 
22
22
  expect(subscriber.events).not_to be_empty
23
23
  event = subscriber.first_event('server_closed_event')
@@ -35,7 +35,7 @@ describe 'SDAM events' do
35
35
  client.database.command(ismaster: 1)
36
36
  expect(subscriber.events).to be_empty
37
37
 
38
- client.close
38
+ client.close(true)
39
39
 
40
40
  expect(subscriber.events).not_to be_empty
41
41
  event = subscriber.first_event('topology_closed_event')
@@ -1,15 +1,21 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'Server description' do
4
+ clean_slate
5
+
6
+ let(:client) { ClientRegistry.instance.global_client('authorized') }
7
+ let(:desc) do
8
+ client.cluster.next_primary.description
9
+ end
10
+
11
+ let!(:start_time) { Time.now }
12
+
4
13
  describe '#op_time' do
5
14
  require_topology :replica_set
6
15
  min_server_fcv '3.4'
7
16
 
8
- let(:client) { ClientRegistry.instance.global_client('authorized') }
9
- let(:desc) { client.cluster.servers.first.description }
10
-
11
17
  it 'is set' do
12
- client.database.command(ismaster: 1)
18
+ expect(desc).not_to be_unknown
13
19
 
14
20
  expect(desc.op_time).to be_a(BSON::Timestamp)
15
21
  end
@@ -19,30 +25,21 @@ describe 'Server description' do
19
25
  require_topology :replica_set
20
26
  min_server_fcv '3.4'
21
27
 
22
- let(:client) { ClientRegistry.instance.global_client('authorized') }
23
- let(:desc) { client.cluster.servers.first.description }
24
-
25
28
  it 'is set' do
26
- client.database.command(ismaster: 1)
29
+ expect(desc).not_to be_unknown
27
30
 
28
31
  expect(desc.last_write_date).to be_a(Time)
29
32
  end
30
33
  end
31
34
 
32
35
  describe '#last_update_time' do
33
- before do
34
- ClientRegistry.instance.close_all_clients
35
- end
36
-
37
- let(:client) { ClientRegistry.instance.global_client('authorized') }
38
- let(:desc) { client.cluster.next_primary.description }
39
36
 
40
37
  it 'is set' do
41
- client.database.command(ismaster: 1)
38
+ expect(desc).not_to be_unknown
42
39
 
43
40
  expect(desc.last_update_time).to be_a(Time)
44
- # checked in the last 3 seconds
45
- expect(Time.now - desc.last_update_time < 3).to be true
41
+ # checked while this test was running
42
+ expect(desc.last_update_time).to be > start_time
46
43
  end
47
44
  end
48
45
  end
@@ -6,6 +6,10 @@ describe 'Server selector' do
6
6
  let(:cluster) { client.cluster }
7
7
 
8
8
  describe '#select_server' do
9
+ # These tests operate on specific servers, and don't work in a multi
10
+ # shard cluster where multiple servers are equally eligible
11
+ require_no_multi_shard
12
+
9
13
  let(:result) { selector.select_server(cluster) }
10
14
 
11
15
  it 'selects' do
@@ -13,7 +17,7 @@ describe 'Server selector' do
13
17
  end
14
18
 
15
19
  context 'no servers in the cluster' do
16
- let(:client) { Mongo::Client.new([], server_selection_timeout: 2) }
20
+ let(:client) { new_local_client_nmio([], server_selection_timeout: 2) }
17
21
 
18
22
  it 'raises NoServerAvailable with a message explaining the situation' do
19
23
  expect do
@@ -35,7 +39,7 @@ describe 'Server selector' do
35
39
  context 'there is a known primary' do
36
40
  before do
37
41
  client.cluster.next_primary
38
- client.close
42
+ client.close(true)
39
43
  expect(client.cluster.connected?).to be false
40
44
  end
41
45
 
@@ -47,7 +51,7 @@ describe 'Server selector' do
47
51
  context 'there is no known primary' do
48
52
  before do
49
53
  primary_server = client.cluster.next_primary
50
- client.close
54
+ client.close(true)
51
55
  expect(client.cluster.connected?).to be false
52
56
  primary_server.unknown!
53
57
  end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Server' do
4
+ let(:client) { authorized_client }
5
+
6
+ let(:server) { client.cluster.next_primary }
7
+
8
+ let(:collection) { client['collection'] }
9
+ let(:view) { Mongo::Collection::View.new(collection) }
10
+
11
+ describe 'operations when client/cluster are disconnected' do
12
+ # Server versions lower than 3.4 use the legacy find result
13
+ min_server_fcv '3.4'
14
+
15
+ context 'normal server' do
16
+ it 'can be used for reads' do
17
+ result = view.send(:send_initial_query, server)
18
+ expect(result).to be_a(Mongo::Operation::Find::Result)
19
+ end
20
+ end
21
+
22
+ context 'known server in disconnected cluster' do
23
+ before do
24
+ client.close
25
+ expect(server).not_to be_unknown
26
+ end
27
+
28
+ it 'can be used for reads' do
29
+ result = view.send(:send_initial_query, server)
30
+ expect(result).to be_a(Mongo::Operation::Find::Result)
31
+ end
32
+ end
33
+
34
+ context 'unknown server in disconnected cluster' do
35
+ before do
36
+ client.close
37
+ server.unknown!
38
+ expect(server).to be_unknown
39
+ end
40
+
41
+ it 'can be used for reads' do
42
+ result = view.send(:send_initial_query, server)
43
+ # Driver falls back to the oldest MongoDB protocol
44
+ expect(result).to be_a(Mongo::Operation::Find::Legacy::Result)
45
+ end
46
+ end
47
+ end
48
+ end
@@ -19,7 +19,7 @@ describe 'SSL connections with URI options' do
19
19
  end
20
20
 
21
21
  it 'successfully connects and runs an operation' do
22
- client = Mongo::Client.new(uri)
22
+ client = new_local_client(uri)
23
23
  expect { client[:foo].count_documents({}) }.not_to raise_error
24
24
  end
25
25
  end
@@ -3,12 +3,19 @@ require 'spec_helper'
3
3
  describe 'Step down behavior' do
4
4
  require_topology :replica_set
5
5
 
6
- =begin Uncommenting this will reduce the runtime of the test, but the spec currently does not allow us to do it
6
+ # This setup reduces the runtime of the test and makes execution more
7
+ # reliable. The spec as written requests a simple brute force step down,
8
+ # but this causes intermittent failures.
7
9
  before(:all) do
8
10
  # These before/after blocks are run even if the tests themselves are
9
11
  # skipped due to server version not being appropriate
10
12
  if ClusterConfig.instance.fcv_ish >= '4.2' && ClusterConfig.instance.topology == :replica_set
11
- ClusterTools.instance.set_election_timeout(1)
13
+ # It seems that a short election timeout can cause unintended elections,
14
+ # which makes the server close connections which causes the driver to
15
+ # reconnect which then fails the step down test.
16
+ # The election timeout here is greater than the catch up period and
17
+ # step down timeout specified in cluster tools.
18
+ ClusterTools.instance.set_election_timeout(5)
12
19
  ClusterTools.instance.set_election_handoff(false)
13
20
  end
14
21
  end
@@ -20,7 +27,6 @@ describe 'Step down behavior' do
20
27
  ClusterTools.instance.reset_priorities
21
28
  end
22
29
  end
23
- =end
24
30
 
25
31
  let(:event_subscriber) { EventSubscriber.new }
26
32
 
@@ -70,7 +76,7 @@ describe 'Step down behavior' do
70
76
  expect(connection_created_events).not_to be_empty
71
77
 
72
78
  current_primary = subscribed_client.cluster.next_primary
73
- ClusterTools.instance.force_step_down
79
+ ClusterTools.instance.change_primary
74
80
 
75
81
  EventSubscriber.clear_events!
76
82
 
@@ -1,6 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'Transactions examples' do
4
+ require_wired_tiger
4
5
  require_transaction_support
5
6
 
6
7
  let(:hr) do
@@ -44,8 +45,8 @@ describe 'Transactions examples' do
44
45
  session.commit_transaction
45
46
  puts 'Transaction committed.'
46
47
  rescue Mongo::Error => e
47
- if e.label?(Mongo::Error::UNKNOWN_TRANSACTION_COMMIT_RESULT_LABEL)
48
- puts "#{Mongo::Error::UNKNOWN_TRANSACTION_COMMIT_RESULT_LABEL}, retrying commit operation..."
48
+ if e.label?('UnknownTransactionCommitResult')
49
+ puts "UnknownTransactionCommitResult, retrying commit operation..."
49
50
  retry
50
51
  else
51
52
  puts 'Error during commit ...'
@@ -80,9 +81,9 @@ describe 'Transactions examples' do
80
81
  rescue Mongo::Error => e
81
82
 
82
83
  puts 'Transaction aborted. Caught exception during transaction.'
83
- raise unless e.label?(Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL)
84
+ raise unless e.label?('TransientTransactionError')
84
85
 
85
- puts "#{Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL}, retrying transaction ..."
86
+ puts "TransientTransactionError, retrying transaction ..."
86
87
  retry
87
88
  end
88
89
  end
@@ -110,8 +111,8 @@ describe 'Transactions examples' do
110
111
  session.commit_transaction
111
112
  puts 'Transaction committed.'
112
113
  rescue Mongo::Error=> e
113
- if e.label?(Mongo::Error::UNKNOWN_TRANSACTION_COMMIT_RESULT_LABEL)
114
- puts "#{Mongo::Error::UNKNOWN_TRANSACTION_COMMIT_RESULT_LABEL}, retrying commit operation..."
114
+ if e.label?('UnknownTransactionCommitResult')
115
+ puts "UnknownTransactionCommitResult, retrying commit operation..."
115
116
  retry
116
117
  else
117
118
  puts 'Error during commit ...'
@@ -154,8 +155,8 @@ describe 'Transactions examples' do
154
155
  yield session # performs transaction
155
156
  rescue Mongo::Error => e
156
157
  puts 'Transaction aborted. Caught exception during transaction.'
157
- raise unless e.label?(Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL)
158
- puts "#{Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL}, retrying transaction ..."
158
+ raise unless e.label?('TransientTransactionError')
159
+ puts "TransientTransactionError, retrying transaction ..."
159
160
  retry
160
161
  end
161
162
  end
@@ -165,8 +166,8 @@ describe 'Transactions examples' do
165
166
  session.commit_transaction
166
167
  puts 'Transaction committed.'
167
168
  rescue Mongo::Error => e
168
- if e.label?(Mongo::Error::UNKNOWN_TRANSACTION_COMMIT_RESULT_LABEL)
169
- puts "#{Mongo::Error::UNKNOWN_TRANSACTION_COMMIT_RESULT_LABEL}, retrying commit operation ..."
169
+ if e.label?('UnknownTransactionCommitResult')
170
+ puts "UnknownTransactionCommitResult, retrying commit operation ..."
170
171
  retry
171
172
  else
172
173
  puts 'Error during commit ...'
@@ -1,24 +1,27 @@
1
1
  COVERAGE_MIN = 90
2
2
  CURRENT_PATH = File.expand_path(File.dirname(__FILE__))
3
- SERVER_DISCOVERY_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/sdam/**/*.yml")
4
- SDAM_MONITORING_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/sdam_monitoring/*.yml")
5
- SERVER_SELECTION_RTT_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/server_selection_rtt/*.yml")
6
- SERVER_SELECTION_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/server_selection/**/*.yml")
7
- MAX_STALENESS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/max_staleness/**/*.yml")
8
- CRUD_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/crud/**/*.yml")
9
- RETRYABLE_WRITES_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/retryable_writes/**/*.yml")
3
+
4
+ SERVER_DISCOVERY_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/sdam/**/*.yml").sort
5
+ SDAM_MONITORING_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/sdam_monitoring/*.yml").sort
6
+ SERVER_SELECTION_RTT_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/server_selection_rtt/*.yml").sort
7
+ SERVER_SELECTION_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/server_selection/**/*.yml").sort
8
+ MAX_STALENESS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/max_staleness/**/*.yml").sort
9
+ CRUD_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/crud/**/*.yml").sort
10
+ CRUD2_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/crud_v2/**/*.yml").sort
11
+ RETRYABLE_WRITES_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/retryable_writes/**/*.yml").sort
10
12
  RETRYABLE_READS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/retryable_reads/**/*.yml").sort
11
- COMMAND_MONITORING_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/command_monitoring/**/*.yml")
12
- CONNECTION_STRING_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/connection_string/*.yml")
13
- URI_OPTIONS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/uri_options/*.yml")
14
- DNS_SEEDLIST_DISCOVERY_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/dns_seedlist_discovery/*.yml")
15
- GRIDFS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/gridfs/*.yml")
16
- TRANSACTIONS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/transactions/*.yml")
17
- TRANSACTIONS_API_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/transactions_api/*.yml")
18
- CHANGE_STREAMS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/change_streams/*.yml")
19
- CMAP_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/cmap/*.yml")
13
+ COMMAND_MONITORING_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/command_monitoring/**/*.yml").sort
14
+ CONNECTION_STRING_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/connection_string/*.yml").sort
15
+ URI_OPTIONS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/uri_options/*.yml").sort
16
+ DNS_SEEDLIST_DISCOVERY_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/dns_seedlist_discovery/*.yml").sort
17
+ GRIDFS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/gridfs/*.yml").sort
18
+ TRANSACTIONS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/transactions/*.yml").sort
19
+ TRANSACTIONS_API_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/transactions_api/*.yml").sort
20
+ CHANGE_STREAMS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/change_streams/*.yml").sort
21
+ CMAP_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/cmap/*.yml").sort
20
22
 
21
23
  require 'mongo'
24
+ require 'pp'
22
25
 
23
26
  unless ENV['CI']
24
27
  begin
@@ -1,11 +1,14 @@
1
1
  require 'spec_helper'
2
2
 
3
+ # This test should set cleanup: false on all clients, because due to
4
+ # https://jira.mongodb.org/browse/RUBY-1772 we may be getting connections
5
+ # established after the client is closed which screws up our assertions on
6
+ # the auth calls. When 1772 is fixed, the cleanup should happen on existing
7
+ # connections and thus should no longer interfere with auth assertions.
8
+
3
9
  describe 'SCRAM-SHA auth mechanism negotiation' do
4
10
  min_server_fcv '4.0'
5
-
6
- before(:all) do
7
- ClientRegistry.instance.close_all_clients
8
- end
11
+ clean_slate
9
12
 
10
13
  URI_OPTION_MAP = {
11
14
  :auth_source => 'authsource',
@@ -13,7 +16,7 @@ describe 'SCRAM-SHA auth mechanism negotiation' do
13
16
  }
14
17
 
15
18
  let(:create_user!) do
16
- ClientRegistry.instance.global_client('root_authorized_admin').tap do |client|
19
+ root_authorized_admin_client.tap do |client|
17
20
  users = client.database.users
18
21
  if users.info(user.name).any?
19
22
  users.remove(user.name)
@@ -24,7 +27,7 @@ describe 'SCRAM-SHA auth mechanism negotiation' do
24
27
  roles: ['root'],
25
28
  mechanisms: server_user_auth_mechanisms,
26
29
  )
27
- client.close
30
+ client.close(true)
28
31
  end
29
32
  end
30
33
 
@@ -49,7 +52,7 @@ describe 'SCRAM-SHA auth mechanism negotiation' do
49
52
 
50
53
  new_local_client(
51
54
  SpecConfig.instance.addresses,
52
- SpecConfig.instance.test_options.merge(opts)
55
+ SpecConfig.instance.test_options.merge(opts).update(cleanup: false)
53
56
  )
54
57
  end
55
58
 
@@ -332,7 +335,7 @@ describe 'SCRAM-SHA auth mechanism negotiation' do
332
335
  end
333
336
 
334
337
  let(:client) do
335
- new_local_client(uri, SpecConfig.instance.ssl_options)
338
+ new_local_client(uri, SpecConfig.instance.ssl_options.merge(cleanup: false))
336
339
  end
337
340
 
338
341
  context 'when the user exists' do
@@ -150,8 +150,8 @@ describe Mongo::BulkWrite::OrderedCombiner do
150
150
  [
151
151
  {
152
152
  replace_one: [
153
- { 'q' => { _id: 0 }, 'u' => { name: 'test' }, 'multi' => false, 'upsert' => false },
154
- { 'q' => { _id: 1 }, 'u' => { name: 'test' }, 'multi' => false, 'upsert' => false }
153
+ { 'q' => { _id: 0 }, 'u' => { name: 'test' }, },
154
+ { 'q' => { _id: 1 }, 'u' => { name: 'test' }, },
155
155
  ]
156
156
  }
157
157
  ]
@@ -192,8 +192,8 @@ describe Mongo::BulkWrite::OrderedCombiner do
192
192
  [
193
193
  {
194
194
  update_one: [
195
- { 'q' => { _id: 0 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => false, 'upsert' => false },
196
- { 'q' => { _id: 1 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => false, 'upsert' => false }
195
+ { 'q' => { _id: 0 }, 'u' => { '$set' => { name: 'test' }}, },
196
+ { 'q' => { _id: 1 }, 'u' => { '$set' => { name: 'test' }}, },
197
197
  ]
198
198
  }
199
199
  ]
@@ -234,8 +234,8 @@ describe Mongo::BulkWrite::OrderedCombiner do
234
234
  [
235
235
  {
236
236
  update_many: [
237
- { 'q' => { _id: 0 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => true, 'upsert' => false },
238
- { 'q' => { _id: 1 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => true, 'upsert' => false }
237
+ { 'q' => { _id: 0 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => true, },
238
+ { 'q' => { _id: 1 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => true, },
239
239
  ]
240
240
  }
241
241
  ]