mongo 2.7.0 → 2.7.1

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 (125) 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 +39 -14
  5. data/Rakefile +1 -0
  6. data/lib/mongo/auth.rb +4 -1
  7. data/lib/mongo/client.rb +4 -3
  8. data/lib/mongo/cluster.rb +1 -1
  9. data/lib/mongo/collection/view/readable.rb +5 -2
  10. data/lib/mongo/database.rb +1 -0
  11. data/lib/mongo/error/invalid_server_preference.rb +1 -0
  12. data/lib/mongo/error/operation_failure.rb +10 -0
  13. data/lib/mongo/error/parser.rb +10 -0
  14. data/lib/mongo/event.rb +1 -2
  15. data/lib/mongo/operation/result.rb +4 -1
  16. data/lib/mongo/operation/shared/executable_transaction_label.rb +3 -1
  17. data/lib/mongo/operation/shared/sessions_supported.rb +1 -1
  18. data/lib/mongo/protocol/msg.rb +1 -1
  19. data/lib/mongo/protocol/query.rb +2 -2
  20. data/lib/mongo/retryable.rb +20 -6
  21. data/lib/mongo/server.rb +6 -0
  22. data/lib/mongo/server/connection.rb +4 -4
  23. data/lib/mongo/server/monitor/connection.rb +9 -5
  24. data/lib/mongo/server_selector/selectable.rb +86 -32
  25. data/lib/mongo/session.rb +98 -15
  26. data/lib/mongo/version.rb +1 -1
  27. data/spec/README.md +85 -0
  28. data/spec/integration/bulk_insert_spec.rb +1 -1
  29. data/spec/integration/change_stream_examples_spec.rb +3 -1
  30. data/spec/integration/change_stream_spec.rb +10 -14
  31. data/spec/integration/client_construction_spec.rb +1 -0
  32. data/spec/integration/command_monitoring_spec.rb +37 -1
  33. data/spec/integration/command_spec.rb +141 -0
  34. data/spec/integration/connection_spec.rb +4 -2
  35. data/spec/integration/cursor_reaping_spec.rb +1 -1
  36. data/spec/integration/docs_examples_spec.rb +1 -1
  37. data/spec/integration/retryable_writes_spec.rb +33 -42
  38. data/spec/integration/server_description_spec.rb +3 -3
  39. data/spec/integration/server_selector_spec.rb +79 -0
  40. data/spec/lite_spec_helper.rb +4 -2
  41. data/spec/mongo/address_spec.rb +8 -0
  42. data/spec/mongo/auth/cr_spec.rb +5 -2
  43. data/spec/mongo/auth/invalid_mechanism_spec.rb +11 -0
  44. data/spec/mongo/auth/scram/conversation_spec.rb +3 -2
  45. data/spec/mongo/auth/scram/negotiation_spec.rb +1 -2
  46. data/spec/mongo/auth/scram_spec.rb +11 -6
  47. data/spec/mongo/auth/user/view_spec.rb +13 -6
  48. data/spec/mongo/bulk_write_spec.rb +81 -104
  49. data/spec/mongo/client_construction_spec.rb +18 -7
  50. data/spec/mongo/client_spec.rb +11 -7
  51. data/spec/mongo/cluster_spec.rb +30 -1
  52. data/spec/mongo/collection/view/aggregation_spec.rb +18 -10
  53. data/spec/mongo/collection/view/change_stream_spec.rb +28 -8
  54. data/spec/mongo/collection/view/map_reduce_spec.rb +24 -10
  55. data/spec/mongo/collection/view/readable_spec.rb +37 -19
  56. data/spec/mongo/collection/view/writable_spec.rb +64 -32
  57. data/spec/mongo/collection/view_spec.rb +4 -2
  58. data/spec/mongo/collection_spec.rb +163 -73
  59. data/spec/mongo/cursor_spec.rb +5 -2
  60. data/spec/mongo/database_spec.rb +41 -19
  61. data/spec/mongo/error/no_server_available_spec.rb +1 -1
  62. data/spec/mongo/error/parser_spec.rb +29 -0
  63. data/spec/mongo/grid/stream/write_spec.rb +2 -1
  64. data/spec/mongo/index/view_spec.rb +42 -24
  65. data/spec/mongo/operation/delete/op_msg_spec.rb +11 -7
  66. data/spec/mongo/operation/insert/op_msg_spec.rb +10 -6
  67. data/spec/mongo/operation/update/op_msg_spec.rb +10 -6
  68. data/spec/mongo/protocol/compressed_spec.rb +1 -1
  69. data/spec/mongo/protocol/msg_spec.rb +1 -1
  70. data/spec/mongo/server/app_metadata_spec.rb +2 -1
  71. data/spec/mongo/server/connection_auth_spec.rb +1 -1
  72. data/spec/mongo/server/monitor/connection_spec.rb +42 -0
  73. data/spec/mongo/server_selector_spec.rb +17 -0
  74. data/spec/mongo/server_spec.rb +110 -0
  75. data/spec/mongo/session/session_pool_spec.rb +1 -1
  76. data/spec/mongo/session_spec.rb +1 -1
  77. data/spec/mongo/session_transaction_spec.rb +162 -1
  78. data/spec/mongo/socket/ssl_spec.rb +14 -7
  79. data/spec/mongo/uri/srv_protocol_spec.rb +41 -34
  80. data/spec/spec_helper.rb +3 -191
  81. data/spec/spec_tests/change_streams_spec.rb +3 -6
  82. data/spec/spec_tests/data/transactions/abort.yml +3 -1
  83. data/spec/spec_tests/data/transactions/commit.yml +4 -3
  84. data/spec/spec_tests/data/transactions/error-labels.yml +17 -13
  85. data/spec/spec_tests/data/transactions/read-concern.yml +611 -0
  86. data/spec/spec_tests/data/transactions/retryable-commit.yml +126 -21
  87. data/spec/spec_tests/data/transactions_api/callback-aborts.yml +42 -39
  88. data/spec/spec_tests/data/transactions_api/callback-commits.yml +52 -50
  89. data/spec/spec_tests/data/transactions_api/callback-retry.yml +33 -31
  90. data/spec/spec_tests/data/transactions_api/commit-retry.yml +42 -39
  91. data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror-4.2.yml +13 -12
  92. data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror.yml +15 -26
  93. data/spec/spec_tests/data/transactions_api/commit-writeconcernerror.yml +25 -33
  94. data/spec/spec_tests/data/transactions_api/commit.yml +44 -42
  95. data/spec/spec_tests/data/transactions_api/transaction-options.yml +25 -23
  96. data/spec/spec_tests/max_staleness_spec.rb +2 -0
  97. data/spec/spec_tests/retryable_writes_spec.rb +2 -6
  98. data/spec/spec_tests/sdam_spec.rb +2 -0
  99. data/spec/spec_tests/server_selection_spec.rb +3 -0
  100. data/spec/spec_tests/transactions_api_spec.rb +7 -1
  101. data/spec/spec_tests/transactions_spec.rb +6 -0
  102. data/spec/spec_tests/uri_options_spec.rb +4 -26
  103. data/spec/support/certificates/ca.pem +21 -16
  104. data/spec/support/certificates/client.pem +90 -90
  105. data/spec/support/certificates/client_cert.pem +21 -20
  106. data/spec/support/certificates/client_key.pem +27 -28
  107. data/spec/support/certificates/client_key_encrypted.pem +26 -26
  108. data/spec/support/certificates/crl.pem +10 -8
  109. data/spec/support/certificates/crl_client_revoked.pem +11 -10
  110. data/spec/support/certificates/server.pem +48 -33
  111. data/spec/support/change_streams.rb +12 -32
  112. data/spec/support/client_registry.rb +12 -1
  113. data/spec/support/cluster_config.rb +48 -2
  114. data/spec/support/common_shortcuts.rb +73 -7
  115. data/spec/support/connection_string.rb +0 -3
  116. data/spec/support/constraints.rb +87 -22
  117. data/spec/support/crud.rb +2 -1
  118. data/spec/support/shared/server_selector.rb +0 -28
  119. data/spec/support/shared/session.rb +25 -14
  120. data/spec/support/transactions.rb +4 -8
  121. data/spec/support/transactions/operation.rb +26 -4
  122. data/spec/support/transactions/verifier.rb +5 -2
  123. metadata +496 -488
  124. metadata.gz.sig +5 -2
  125. data/spec/support/certificates/password_protected.pem +0 -51
@@ -1,12 +1,78 @@
1
1
  module CommonShortcuts
2
- # Declares a topology double, which is configured to accept summary
3
- # calls as those are used in SDAM event creation
4
- def declare_topology_double
5
- let(:topology) do
6
- double('topology').tap do |topology|
7
- allow(topology).to receive(:summary)
2
+ module ClassMethods
3
+ # Declares a topology double, which is configured to accept summary
4
+ # calls as those are used in SDAM event creation
5
+ def declare_topology_double
6
+ let(:topology) do
7
+ double('topology').tap do |topology|
8
+ allow(topology).to receive(:summary)
9
+ end
8
10
  end
9
11
  end
10
12
  end
11
- end
12
13
 
14
+ module InstanceMethods
15
+ def kill_all_server_sessions
16
+ begin
17
+ ClientRegistry.instance.global_client('root_authorized').command(killAllSessions: [])
18
+ # killAllSessions also kills the implicit session which the driver uses
19
+ # to send this command, as a result it always fails
20
+ rescue Mongo::Error::OperationFailure => e
21
+ # "operation was interrupted"
22
+ unless e.code == 11601
23
+ raise
24
+ end
25
+ end
26
+ end
27
+
28
+ def wait_for_all_servers(cluster)
29
+ # Cluster waits for initial round of sdam until the primary
30
+ # is discovered, which means by the time a connection is obtained
31
+ # here some of the servers in the topology may still be unknown.
32
+ # This messes with event expectations below. Therefore, wait for
33
+ # all servers in the topology to be checked.
34
+ #
35
+ # This wait here assumes all addresses specified for the test
36
+ # suite are for working servers of the cluster; if this is not
37
+ # the case, this test will fail due to exceeding the general
38
+ # test timeout eventually.
39
+ while cluster.servers_list.any? { |server| server.unknown? }
40
+ warn "Waiting for unknown servers in #{cluster.servers}"
41
+ sleep 0.25
42
+ end
43
+ end
44
+
45
+ def make_server(mode, options = {})
46
+ tags = options[:tags] || {}
47
+ average_round_trip_time = options[:average_round_trip_time] || 0
48
+
49
+ ismaster = {
50
+ 'ismaster' => mode == :primary,
51
+ 'secondary' => mode == :secondary,
52
+ 'arbiterOnly' => mode == :arbiter,
53
+ 'isreplicaset' => mode == :ghost,
54
+ 'hidden' => mode == :other,
55
+ 'tags' => tags,
56
+ 'ok' => 1,
57
+ 'minWireVersion' => 2, 'maxWireVersion' => 8,
58
+ }
59
+ if [:primary, :secondary, :arbiter, :other].include?(mode)
60
+ ismaster['setName'] = 'mongodb_set'
61
+ end
62
+
63
+ listeners = Mongo::Event::Listeners.new
64
+ monitoring = Mongo::Monitoring.new
65
+ address = options[:address]
66
+
67
+ cluster = double('cluster')
68
+ allow(cluster).to receive(:topology).and_return(topology)
69
+ allow(cluster).to receive(:app_metadata)
70
+ allow(cluster).to receive(:options).and_return({})
71
+ server = Mongo::Server.new(address, cluster, monitoring, listeners, SpecConfig.instance.test_options)
72
+ description = Mongo::Server::Description.new(address, ismaster, average_round_trip_time)
73
+ server.tap do |s|
74
+ allow(s).to receive(:description).and_return(description)
75
+ end
76
+ end
77
+ end
78
+ end
@@ -214,9 +214,6 @@ module Mongo
214
214
  # Replica Set Options
215
215
  'replicaset' => :replica_set,
216
216
 
217
- # Auth Source
218
- 'authsource' => :auth_source,
219
-
220
217
  # Timeout Options
221
218
  'connecttimeoutms' => :connect_timeout,
222
219
  'sockettimeoutms' => :socket_timeout,
@@ -23,27 +23,37 @@ module Constraints
23
23
  end
24
24
  end
25
25
 
26
- def require_sessions
26
+ def min_server_fcv(version)
27
+ unless version =~ /^\d+\.\d+$/
28
+ raise ArgumentError, "FCV can only be major.minor: #{version}"
29
+ end
30
+
31
+ before do
32
+ unless ClusterConfig.instance.fcv_ish >= version
33
+ skip "FCV #{version} or higher required, we have #{ClusterConfig.instance.fcv_ish} (server #{ClusterConfig.instance.server_version})"
34
+ end
35
+ end
36
+ end
37
+
38
+ def max_server_fcv(version)
39
+ unless version =~ /^\d+\.\d+$/
40
+ raise ArgumentError, "Version can only be major.minor: #{version}"
41
+ end
42
+
27
43
  before do
28
- unless sessions_enabled?
29
- skip 'Sessions are not enabled'
44
+ if version < ClusterConfig.instance.fcv_ish
45
+ skip "FCV #{version} or lower required, we have #{ClusterConfig.instance.fcv_ish} (server #{ClusterConfig.instance.server_version})"
30
46
  end
31
47
  end
32
48
  end
33
49
 
34
50
  def require_topology(*topologies)
35
- topologies = topologies.map { |t| t.to_s }
36
- invalid_topologies = topologies - %w(single replica_set sharded)
51
+ invalid_topologies = topologies - [:single, :replica_set, :sharded]
37
52
  unless invalid_topologies.empty?
38
53
  raise ArgumentError, "Invalid topologies requested: #{invalid_topologies.join(', ')}"
39
54
  end
40
55
  before do
41
- topology = authorized_client.cluster.topology.class.name.sub(/.*::/, '')
42
- topology = topology.gsub(/([A-Z])/) { |match| '_' + match.downcase }.sub(/^_/, '')
43
- if topology =~ /^replica_set/
44
- topology = 'replica_set'
45
- end
46
- unless topologies.include?(topology)
56
+ unless topologies.include?(topology = ClusterConfig.instance.topology)
47
57
  skip "Topology #{topologies.join(' or ')} required, we have #{topology}"
48
58
  end
49
59
  end
@@ -51,32 +61,29 @@ module Constraints
51
61
 
52
62
  def max_example_run_time(timeout)
53
63
  around do |example|
54
- TimeoutInterrupt.timeout(timeout) do
64
+ TimeoutInterrupt.timeout(timeout, TimeoutInterrupt::Error.new("Test execution terminated after #{timeout} seconds")) do
55
65
  example.run
56
66
  end
57
67
  end
58
68
  end
59
69
 
60
70
  def require_transaction_support
61
- min_server_version '4.0'
71
+ min_server_fcv '4.0'
62
72
  require_topology :replica_set
63
73
  end
64
74
 
65
- def require_scram_sha_256_support
75
+ def require_ssl
66
76
  before do
67
- $mongo_server_features ||= begin
68
- scanned_client_server!.features
69
- end
70
- unless $mongo_server_features.scram_sha_256_enabled?
71
- skip "SCRAM SHA 256 is not enabled on the server"
77
+ unless SpecConfig.instance.ssl?
78
+ skip "SSL not enabled"
72
79
  end
73
80
  end
74
81
  end
75
82
 
76
- def require_ssl
83
+ def require_local_tls
77
84
  before do
78
- unless SpecConfig.instance.ssl?
79
- skip "SSL not enabled"
85
+ unless SpecConfig.instance.ssl? && !SpecConfig.instance.ci?
86
+ skip 'Not running locally with TLS enabled'
80
87
  end
81
88
  end
82
89
  end
@@ -88,4 +95,62 @@ module Constraints
88
95
  end
89
96
  end
90
97
  end
98
+
99
+ def require_compression
100
+ before do
101
+ if SpecConfig.instance.compressors.nil?
102
+ skip "Compression is not enabled"
103
+ end
104
+ end
105
+ end
106
+
107
+ def require_no_compression
108
+ before do
109
+ if SpecConfig.instance.compressors
110
+ skip "Compression is enabled"
111
+ end
112
+ end
113
+ end
114
+
115
+ def ruby_version_gte(version)
116
+ before do
117
+ if RUBY_VERSION < version
118
+ skip "Ruby version #{version} or higher required"
119
+ end
120
+ end
121
+ end
122
+
123
+ def ruby_version_lt(version)
124
+ before do
125
+ if RUBY_VERSION >= version
126
+ skip "Ruby version less than #{version} required"
127
+ end
128
+ end
129
+ end
130
+
131
+ def require_auth
132
+ before do
133
+ unless ENV['AUTH'] == 'auth' || ClusterConfig.instance.auth_enabled?
134
+ skip "Auth required"
135
+ end
136
+ end
137
+ end
138
+
139
+ def require_no_auth
140
+ before do
141
+ if ENV['AUTH'] == 'auth' || ClusterConfig.instance.auth_enabled?
142
+ skip "Auth not allowed"
143
+ end
144
+ end
145
+ end
146
+
147
+ # Can the driver specify a write concern that won't be overridden?
148
+ # (mongos 4.0+ overrides the write concern)
149
+ def require_set_write_concern
150
+ before do
151
+ if ClusterConfig.instance.topology == :sharded && ClusterConfig.instance.short_server_version >= '4.0'
152
+ skip "mongos 4.0+ overrides write concern"
153
+ end
154
+ end
155
+ end
91
156
  end
@@ -87,7 +87,8 @@ module Mongo
87
87
 
88
88
  def lower_bound_satisfied?(client)
89
89
  return true unless @min_server_version
90
- @min_server_version <= client.database.command(buildInfo: 1).first['version']
90
+ #@min_server_version <= client.database.command(buildInfo: 1).first['version']
91
+ @min_server_version <= ClusterConfig.instance.fcv_ish
91
92
  end
92
93
  end
93
94
 
@@ -1,31 +1,3 @@
1
- def make_server(mode, options = {})
2
- tags = options[:tags] || {}
3
- average_round_trip_time = options[:average_round_trip_time] || 0
4
-
5
- ismaster = {
6
- 'setName' => 'mongodb_set',
7
- 'ismaster' => mode == :primary,
8
- 'secondary' => mode != :primary,
9
- 'tags' => tags,
10
- 'ok' => 1,
11
- 'minWireVersion' => 2, 'maxWireVersion' => 8,
12
- }
13
-
14
- listeners = Mongo::Event::Listeners.new
15
- monitoring = Mongo::Monitoring.new
16
- address = options[:address]
17
-
18
- cluster = double('cluster')
19
- allow(cluster).to receive(:topology).and_return(topology)
20
- allow(cluster).to receive(:app_metadata)
21
- allow(cluster).to receive(:options).and_return({})
22
- server = Mongo::Server.new(address, cluster, monitoring, listeners, SpecConfig.instance.test_options)
23
- description = Mongo::Server::Description.new(address, ismaster, average_round_trip_time)
24
- server.tap do |s|
25
- allow(s).to receive(:description).and_return(description)
26
- end
27
- end
28
-
29
1
  shared_context 'server selector' do
30
2
 
31
3
  let(:max_staleness) { nil }
@@ -1,7 +1,7 @@
1
1
  shared_examples 'an operation using a session' do
2
2
 
3
3
  describe 'operation execution' do
4
- min_server_version '3.6'
4
+ min_server_fcv '3.6'
5
5
  require_topology :replica_set, :sharded
6
6
 
7
7
  context 'when the session is created from the same client used for the operation' do
@@ -86,7 +86,7 @@ end
86
86
  shared_examples 'a failed operation using a session' do
87
87
 
88
88
  context 'when the operation fails' do
89
- min_server_version '3.6'
89
+ min_server_fcv '3.6'
90
90
  require_topology :replica_set, :sharded
91
91
 
92
92
  let!(:before_last_use) do
@@ -127,7 +127,8 @@ shared_examples 'an explicit session with an unacknowledged write' do
127
127
  EventSubscriber.clear_events!
128
128
  end
129
129
 
130
- context 'when sessions are supported', if: sessions_enabled? do
130
+ context 'when sessions are supported' do
131
+ min_server_fcv '3.6'
131
132
 
132
133
  let(:session) do
133
134
  client.start_session
@@ -139,7 +140,8 @@ shared_examples 'an explicit session with an unacknowledged write' do
139
140
  end
140
141
  end
141
142
 
142
- context 'when sessions are not supported', if: !sessions_enabled? do
143
+ context 'when sessions are not supported' do
144
+ min_server_fcv '3.6'
143
145
 
144
146
  let(:session) do
145
147
  double('session').tap do |s|
@@ -160,7 +162,8 @@ shared_examples 'an implicit session with an unacknowledged write' do
160
162
  EventSubscriber.clear_events!
161
163
  end
162
164
 
163
- context 'when sessions are supported', if: sessions_enabled? do
165
+ context 'when sessions are supported' do
166
+ min_server_fcv '3.6'
164
167
 
165
168
  it 'does not add a session id to the operation' do
166
169
  operation
@@ -168,7 +171,8 @@ shared_examples 'an implicit session with an unacknowledged write' do
168
171
  end
169
172
  end
170
173
 
171
- context 'when sessions are not supported', if: !sessions_enabled? do
174
+ context 'when sessions are not supported' do
175
+ min_server_fcv '3.6'
172
176
 
173
177
  it 'does not add a session id to the operation' do
174
178
  operation
@@ -183,7 +187,9 @@ shared_examples 'an operation supporting causally consistent reads' do
183
187
  subscribed_client
184
188
  end
185
189
 
186
- context 'when connected to a standalone', if: sessions_enabled? && standalone? do
190
+ context 'when connected to a standalone' do
191
+ min_server_fcv '3.6'
192
+ require_topology :single
187
193
 
188
194
  context 'when the collection specifies a read concern' do
189
195
 
@@ -267,7 +273,7 @@ shared_examples 'an operation supporting causally consistent reads' do
267
273
  end
268
274
 
269
275
  context 'when connected to replica set or sharded cluster' do
270
- min_server_version '3.6'
276
+ min_server_fcv '3.6'
271
277
  require_topology :replica_set, :sharded
272
278
 
273
279
  context 'when the collection specifies a read concern' do
@@ -623,7 +629,7 @@ shared_examples 'an operation updating cluster time' do
623
629
  context 'when the command is run once' do
624
630
 
625
631
  context 'when the server is version 3.6' do
626
- min_server_version '3.6'
632
+ min_server_fcv '3.6'
627
633
 
628
634
  context 'when the cluster is sharded or a replica set' do
629
635
  require_topology :replica_set, :sharded
@@ -689,7 +695,7 @@ shared_examples 'an operation updating cluster time' do
689
695
  end
690
696
 
691
697
  context 'when the cluster is sharded or a replica set' do
692
- min_server_version '3.6'
698
+ min_server_fcv '3.6'
693
699
  require_topology :replica_set, :sharded
694
700
 
695
701
  context 'when the session cluster time is advanced' do
@@ -720,6 +726,8 @@ shared_examples 'an operation updating cluster time' do
720
726
  context 'when the advanced cluster time is not greater than the existing cluster time' do
721
727
 
722
728
  let(:advanced_cluster_time) do
729
+ expect(reply_cluster_time[Mongo::Cluster::CLUSTER_TIME].increment > 0).to be true
730
+
723
731
  new_timestamp = BSON::Timestamp.new(reply_cluster_time[Mongo::Cluster::CLUSTER_TIME].seconds,
724
732
  reply_cluster_time[Mongo::Cluster::CLUSTER_TIME].increment - 1)
725
733
  new_cluster_time = reply_cluster_time.dup
@@ -746,7 +754,9 @@ shared_examples 'an operation updating cluster time' do
746
754
  end
747
755
  end
748
756
 
749
- context 'when the server is a standalone', if: (standalone? && sessions_enabled?) do
757
+ context 'when the server is a standalone' do
758
+ min_server_fcv '3.6'
759
+ require_topology :single
750
760
 
751
761
  let(:before_cluster_time) do
752
762
  client.cluster.cluster_time
@@ -765,7 +775,8 @@ shared_examples 'an operation updating cluster time' do
765
775
  end
766
776
  end
767
777
 
768
- context 'when the server is less than version 3.6', if: !sessions_enabled? do
778
+ context 'when the server is less than version 3.6' do
779
+ max_server_version '3.4'
769
780
 
770
781
  let(:before_cluster_time) do
771
782
  client.cluster.cluster_time
@@ -780,7 +791,7 @@ shared_examples 'an operation updating cluster time' do
780
791
  end
781
792
 
782
793
  shared_examples 'an operation not using a session' do
783
- require_sessions
794
+ min_server_fcv '3.6'
784
795
 
785
796
  describe 'operation execution' do
786
797
 
@@ -850,7 +861,7 @@ shared_examples 'an operation not using a session' do
850
861
  end
851
862
 
852
863
  shared_examples 'a failed operation not using a session' do
853
- require_sessions
864
+ min_server_fcv '3.6'
854
865
 
855
866
  context 'when the operation fails' do
856
867
 
@@ -61,11 +61,7 @@ module Mongo
61
61
  # @since 2.6.0
62
62
  def tests
63
63
  @transaction_tests.map do |test|
64
- if test['skipReason']
65
- nil
66
- else
67
- Proc.new { Mongo::Transactions::TransactionsTest.new(@data, test, self) }
68
- end
64
+ Proc.new { Mongo::Transactions::TransactionsTest.new(@data, test, self) }
69
65
  end.compact
70
66
  end
71
67
 
@@ -100,6 +96,7 @@ module Mongo
100
96
  attr_reader :expectations
101
97
 
102
98
  attr_reader :expected_results
99
+ attr_reader :skip_reason
103
100
 
104
101
  # Instantiate the new CRUDTest.
105
102
  #
@@ -122,6 +119,7 @@ module Mongo
122
119
  @fail_point = test['failPoint']
123
120
  @operations = test['operations']
124
121
  @expectations = test['expectations']
122
+ @skip_reason = test['skipReason']
125
123
  @outcome = test['outcome']
126
124
  @expected_results = @operations.map do |o|
127
125
  result = o['result']
@@ -259,9 +257,7 @@ module Mongo
259
257
  coll = support_client[@spec.collection_name]
260
258
  coll.database.drop
261
259
  coll.with(write: { w: :majority }).drop
262
- support_client.command(
263
- { create: @spec.collection_name },
264
- { write_concern: { w: :majority } })
260
+ support_client.command(create: @spec.collection_name, writeConcern: { w: :majority })
265
261
 
266
262
  coll.with(write: { w: :majority }).insert_many(@data) unless @data.empty?
267
263
  admin_support_client.command(@fail_point) if @fail_point