mongo 2.4.0.rc1 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) 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/auth/cr/conversation.rb +1 -1
  5. data/lib/mongo/auth/ldap/conversation.rb +1 -1
  6. data/lib/mongo/auth/scram/conversation.rb +1 -1
  7. data/lib/mongo/auth/x509/conversation.rb +4 -2
  8. data/lib/mongo/client.rb +7 -4
  9. data/lib/mongo/cluster.rb +55 -5
  10. data/lib/mongo/cluster/app_metadata.rb +7 -1
  11. data/lib/mongo/cluster/topology.rb +7 -6
  12. data/lib/mongo/cluster/topology/replica_set.rb +48 -2
  13. data/lib/mongo/cluster/topology/sharded.rb +47 -1
  14. data/lib/mongo/cluster/topology/single.rb +55 -4
  15. data/lib/mongo/cluster/topology/unknown.rb +65 -9
  16. data/lib/mongo/error/invalid_server_preference.rb +3 -1
  17. data/lib/mongo/event.rb +8 -0
  18. data/lib/mongo/event/description_changed.rb +20 -2
  19. data/lib/mongo/event/member_discovered.rb +65 -0
  20. data/lib/mongo/event/primary_elected.rb +3 -1
  21. data/lib/mongo/event/standalone_discovered.rb +1 -1
  22. data/lib/mongo/monitoring.rb +41 -0
  23. data/lib/mongo/monitoring/event.rb +6 -0
  24. data/lib/mongo/monitoring/event/server_closed.rb +46 -0
  25. data/lib/mongo/monitoring/event/server_description_changed.rb +58 -0
  26. data/lib/mongo/monitoring/event/server_opening.rb +46 -0
  27. data/lib/mongo/monitoring/event/topology_changed.rb +46 -0
  28. data/lib/mongo/monitoring/event/topology_closed.rb +41 -0
  29. data/lib/mongo/monitoring/event/topology_opening.rb +41 -0
  30. data/lib/mongo/monitoring/publishable.rb +12 -0
  31. data/lib/mongo/monitoring/sdam_log_subscriber.rb +54 -0
  32. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +30 -0
  33. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +33 -0
  34. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +30 -0
  35. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +40 -0
  36. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +30 -0
  37. data/lib/mongo/server.rb +6 -0
  38. data/lib/mongo/server/connection.rb +1 -1
  39. data/lib/mongo/server/description.rb +23 -3
  40. data/lib/mongo/server/description/inspector.rb +4 -2
  41. data/lib/mongo/server/description/inspector/description_changed.rb +2 -2
  42. data/lib/mongo/server/description/inspector/member_discovered.rb +59 -0
  43. data/lib/mongo/server/description/inspector/primary_elected.rb +2 -0
  44. data/lib/mongo/server_selector.rb +10 -5
  45. data/lib/mongo/server_selector/nearest.rb +1 -1
  46. data/lib/mongo/server_selector/primary_preferred.rb +1 -1
  47. data/lib/mongo/server_selector/secondary.rb +1 -1
  48. data/lib/mongo/server_selector/secondary_preferred.rb +1 -1
  49. data/lib/mongo/server_selector/selectable.rb +24 -12
  50. data/lib/mongo/uri.rb +1 -1
  51. data/lib/mongo/version.rb +1 -1
  52. data/mongo.gemspec +1 -1
  53. data/spec/mongo/auth/cr_spec.rb +6 -1
  54. data/spec/mongo/auth/ldap_spec.rb +6 -1
  55. data/spec/mongo/auth/scram_spec.rb +6 -1
  56. data/spec/mongo/auth/x509/conversation_spec.rb +69 -0
  57. data/spec/mongo/auth/x509_spec.rb +9 -4
  58. data/spec/mongo/client_spec.rb +40 -2
  59. data/spec/mongo/cluster/topology/replica_set_spec.rb +218 -9
  60. data/spec/mongo/cluster/topology/sharded_spec.rb +17 -2
  61. data/spec/mongo/cluster/topology/single_spec.rb +19 -4
  62. data/spec/mongo/cluster/topology/unknown_spec.rb +19 -1
  63. data/spec/mongo/cluster/topology_spec.rb +11 -7
  64. data/spec/mongo/cluster_spec.rb +25 -7
  65. data/spec/mongo/max_staleness_spec.rb +40 -22
  66. data/spec/mongo/monitoring_spec.rb +2 -2
  67. data/spec/mongo/sdam_monitoring_spec.rb +60 -0
  68. data/spec/mongo/sdam_spec.rb +77 -0
  69. data/spec/mongo/server/connection_pool_spec.rb +6 -1
  70. data/spec/mongo/server/connection_spec.rb +6 -1
  71. data/spec/mongo/server/description_spec.rb +90 -1
  72. data/spec/mongo/server_selection_spec.rb +7 -6
  73. data/spec/mongo/server_selector/nearest_spec.rb +7 -7
  74. data/spec/mongo/server_selector/primary_preferred_spec.rb +7 -7
  75. data/spec/mongo/server_selector/primary_spec.rb +4 -4
  76. data/spec/mongo/server_selector/secondary_preferred_spec.rb +6 -6
  77. data/spec/mongo/server_selector/secondary_spec.rb +6 -6
  78. data/spec/mongo/server_selector_spec.rb +8 -0
  79. data/spec/mongo/server_spec.rb +6 -1
  80. data/spec/mongo/uri_spec.rb +4 -4
  81. data/spec/spec_helper.rb +2 -0
  82. data/spec/support/max_staleness/ReplicaSetNoPrimary/Incompatible.yml +4 -4
  83. data/spec/support/max_staleness/ReplicaSetNoPrimary/LastUpdateTime.yml +3 -3
  84. data/spec/support/max_staleness/ReplicaSetNoPrimary/Nearest.yml +3 -3
  85. data/spec/support/max_staleness/ReplicaSetNoPrimary/Nearest2.yml +3 -3
  86. data/spec/support/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +15 -0
  87. data/spec/support/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred.yml +1 -1
  88. data/spec/support/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml +3 -3
  89. data/spec/support/max_staleness/ReplicaSetNoPrimary/Secondary.yml +3 -3
  90. data/spec/support/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred.yml +1 -1
  91. data/spec/support/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml +3 -3
  92. data/spec/support/max_staleness/ReplicaSetNoPrimary/ZeroMaxStaleness.yml +23 -0
  93. data/spec/support/max_staleness/ReplicaSetWithPrimary/Incompatible.yml +4 -4
  94. data/spec/support/max_staleness/ReplicaSetWithPrimary/LastUpdateTime.yml +5 -5
  95. data/spec/support/max_staleness/ReplicaSetWithPrimary/{ShortHeartbeartShortMaxStaleness2.yml → LongHeartbeat.yml} +4 -4
  96. data/spec/support/max_staleness/ReplicaSetWithPrimary/{ShortHeartbeartShortMaxStaleness.yml → LongHeartbeat2.yml} +6 -10
  97. data/spec/support/max_staleness/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml +3 -2
  98. data/spec/support/max_staleness/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml +2 -2
  99. data/spec/support/max_staleness/ReplicaSetWithPrimary/Nearest.yml +3 -3
  100. data/spec/support/max_staleness/ReplicaSetWithPrimary/Nearest2.yml +3 -3
  101. data/spec/support/max_staleness/ReplicaSetWithPrimary/Nearest_tags.yml +3 -3
  102. data/spec/support/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred.yml +2 -2
  103. data/spec/support/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred_incompatible.yml +3 -3
  104. data/spec/support/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred.yml +1 -1
  105. data/spec/support/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml +3 -3
  106. data/spec/support/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml +3 -3
  107. data/spec/support/max_staleness/ReplicaSetWithPrimary/Secondary_tags.yml +3 -3
  108. data/spec/support/max_staleness/ReplicaSetWithPrimary/Secondary_tags2.yml +3 -3
  109. data/spec/support/max_staleness/ReplicaSetWithPrimary/ZeroMaxStaleness.yml +7 -11
  110. data/spec/support/max_staleness/Sharded/Incompatible.yml +4 -4
  111. data/spec/support/max_staleness/Sharded/SmallMaxStaleness.yml +10 -2
  112. data/spec/support/max_staleness/Single/Incompatible.yml +4 -4
  113. data/spec/support/max_staleness/Single/SmallMaxStaleness.yml +2 -2
  114. data/spec/support/max_staleness/Unknown/SmallMaxStaleness.yml +14 -0
  115. data/spec/support/sdam/rs/primary_mismatched_me.yml +2 -2
  116. data/spec/support/sdam/rs/secondary_mismatched_me.yml +2 -2
  117. data/spec/support/sdam_monitoring.rb +144 -0
  118. data/spec/support/sdam_monitoring/replica_set_with_no_primary.yml +112 -0
  119. data/spec/support/sdam_monitoring/replica_set_with_primary.yml +111 -0
  120. data/spec/support/sdam_monitoring/replica_set_with_removal.yml +106 -0
  121. data/spec/support/sdam_monitoring/required_replica_set.yml +84 -0
  122. data/spec/support/sdam_monitoring/standalone.yml +70 -0
  123. data/spec/support/server_discovery_and_monitoring.rb +34 -1
  124. data/spec/support/server_selection.rb +14 -11
  125. data/spec/support/shared/server_selector.rb +6 -0
  126. metadata +49 -13
  127. metadata.gz.sig +0 -0
  128. data/spec/mongo/server_discovery_and_monitoring_spec.rb +0 -115
@@ -7,11 +7,11 @@ describe Mongo::Cluster::Topology::Sharded do
7
7
  end
8
8
 
9
9
  let(:topology) do
10
- described_class.new({})
10
+ described_class.new({}, monitoring)
11
11
  end
12
12
 
13
13
  let(:monitoring) do
14
- Mongo::Monitoring.new
14
+ Mongo::Monitoring.new(monitoring: false)
15
15
  end
16
16
 
17
17
  let(:listeners) do
@@ -20,6 +20,7 @@ describe Mongo::Cluster::Topology::Sharded do
20
20
 
21
21
  let(:cluster) do
22
22
  double('cluster').tap do |cl|
23
+ allow(cl).to receive(:topology).and_return(topology)
23
24
  allow(cl).to receive(:app_metadata).and_return(app_metadata)
24
25
  end
25
26
  end
@@ -86,6 +87,20 @@ describe Mongo::Cluster::Topology::Sharded do
86
87
  end
87
88
  end
88
89
 
90
+ describe '#has_readable_servers?' do
91
+
92
+ it 'returns true' do
93
+ expect(topology).to have_readable_server(nil, nil)
94
+ end
95
+ end
96
+
97
+ describe '#has_writable_servers?' do
98
+
99
+ it 'returns true' do
100
+ expect(topology).to have_writable_server(nil)
101
+ end
102
+ end
103
+
89
104
  describe '#add_hosts?' do
90
105
 
91
106
  it 'returns false' do
@@ -6,12 +6,12 @@ describe Mongo::Cluster::Topology::Single do
6
6
  Mongo::Address.new('127.0.0.1:27017')
7
7
  end
8
8
 
9
- let(:topology) do
10
- described_class.new({})
9
+ let(:monitoring) do
10
+ Mongo::Monitoring.new(monitoring: false)
11
11
  end
12
12
 
13
- let(:monitoring) do
14
- Mongo::Monitoring.new
13
+ let(:topology) do
14
+ described_class.new({}, monitoring)
15
15
  end
16
16
 
17
17
  let(:listeners) do
@@ -21,6 +21,7 @@ describe Mongo::Cluster::Topology::Single do
21
21
  let(:cluster) do
22
22
  double('cluster').tap do |cl|
23
23
  allow(cl).to receive(:app_metadata).and_return(app_metadata)
24
+ allow(cl).to receive(:topology).and_return(topology)
24
25
  end
25
26
  end
26
27
 
@@ -91,6 +92,20 @@ describe Mongo::Cluster::Topology::Single do
91
92
  end
92
93
  end
93
94
 
95
+ describe '#has_readable_servers?' do
96
+
97
+ it 'returns true' do
98
+ expect(topology).to have_readable_server(nil, nil)
99
+ end
100
+ end
101
+
102
+ describe '#has_writable_servers?' do
103
+
104
+ it 'returns true' do
105
+ expect(topology).to have_writable_server(nil)
106
+ end
107
+ end
108
+
94
109
  describe '#add_hosts?' do
95
110
 
96
111
  it 'returns false' do
@@ -2,8 +2,12 @@ require 'spec_helper'
2
2
 
3
3
  describe Mongo::Cluster::Topology::Unknown do
4
4
 
5
+ let(:monitoring) do
6
+ Mongo::Monitoring.new(monitoring: false)
7
+ end
8
+
5
9
  let(:topology) do
6
- described_class.new({})
10
+ described_class.new({}, monitoring)
7
11
  end
8
12
 
9
13
  describe '.servers' do
@@ -45,6 +49,20 @@ describe Mongo::Cluster::Topology::Unknown do
45
49
  end
46
50
  end
47
51
 
52
+ describe '#has_readable_servers?' do
53
+
54
+ it 'returns false' do
55
+ expect(topology).to_not have_readable_server(nil, nil)
56
+ end
57
+ end
58
+
59
+ describe '#has_writable_servers?' do
60
+
61
+ it 'returns false' do
62
+ expect(topology).to_not have_writable_server(nil)
63
+ end
64
+ end
65
+
48
66
  describe '#add_hosts?' do
49
67
 
50
68
  context 'when the description is from an unknown server' do
@@ -2,12 +2,16 @@ require 'spec_helper'
2
2
 
3
3
  describe Mongo::Cluster::Topology do
4
4
 
5
+ let(:monitoring) do
6
+ Mongo::Monitoring.new(monitoring: false)
7
+ end
8
+
5
9
  describe '.initial' do
6
10
 
7
11
  context 'when provided a replica set option' do
8
12
 
9
13
  let(:topology) do
10
- described_class.initial([ 'a' ], connect: :replica_set)
14
+ described_class.initial([ 'a' ], monitoring, connect: :replica_set)
11
15
  end
12
16
 
13
17
  it 'returns a replica set topology' do
@@ -18,7 +22,7 @@ describe Mongo::Cluster::Topology do
18
22
  context 'when provided a single option' do
19
23
 
20
24
  let(:topology) do
21
- described_class.initial([ 'a' ], connect: :direct)
25
+ described_class.initial([ 'a' ], monitoring, connect: :direct)
22
26
  end
23
27
 
24
28
  it 'returns a single topology' do
@@ -33,7 +37,7 @@ describe Mongo::Cluster::Topology do
33
37
  context 'when provided a sharded option' do
34
38
 
35
39
  let(:topology) do
36
- described_class.initial([ 'a' ], connect: :sharded)
40
+ described_class.initial([ 'a' ], monitoring, connect: :sharded)
37
41
  end
38
42
 
39
43
  it 'returns a sharded topology' do
@@ -46,7 +50,7 @@ describe Mongo::Cluster::Topology do
46
50
  context 'when a set name is in the options' do
47
51
 
48
52
  let(:topology) do
49
- described_class.initial([], replica_set: 'testing')
53
+ described_class.initial([], monitoring, replica_set: 'testing')
50
54
  end
51
55
 
52
56
  it 'returns a replica set topology' do
@@ -57,7 +61,7 @@ describe Mongo::Cluster::Topology do
57
61
  context 'when no set name is in the options' do
58
62
 
59
63
  let(:topology) do
60
- described_class.initial([], {})
64
+ described_class.initial([], monitoring, {})
61
65
  end
62
66
 
63
67
  it 'returns an unknown topology' do
@@ -68,7 +72,7 @@ describe Mongo::Cluster::Topology do
68
72
  context 'when provided a single mongos', if: single_mongos? do
69
73
 
70
74
  let(:topology) do
71
- described_class.initial(ADDRESSES, TEST_OPTIONS)
75
+ described_class.initial(ADDRESSES, monitoring, TEST_OPTIONS)
72
76
  end
73
77
 
74
78
  it 'returns a sharded topology' do
@@ -79,7 +83,7 @@ describe Mongo::Cluster::Topology do
79
83
  context 'when provided a single replica set member', if: single_rs_member? do
80
84
 
81
85
  let(:topology) do
82
- described_class.initial(ADDRESSES, TEST_OPTIONS)
86
+ described_class.initial(ADDRESSES, monitoring, TEST_OPTIONS)
83
87
  end
84
88
 
85
89
  it 'returns a single topology' do
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe Mongo::Cluster do
4
4
 
5
5
  let(:monitoring) do
6
- Mongo::Monitoring.new
6
+ Mongo::Monitoring.new(monitoring: false)
7
7
  end
8
8
 
9
9
  let(:cluster) do
@@ -59,6 +59,24 @@ describe Mongo::Cluster do
59
59
  end
60
60
  end
61
61
 
62
+ describe '#has_readable_server?' do
63
+
64
+ let(:selector) do
65
+ Mongo::ServerSelector.get(mode: :primary)
66
+ end
67
+
68
+ it 'delegates to the topology' do
69
+ expect(cluster.has_readable_server?).to eq(cluster.topology.has_readable_server?(cluster))
70
+ end
71
+ end
72
+
73
+ describe '#has_writable_server?' do
74
+
75
+ it 'delegates to the topology' do
76
+ expect(cluster.has_writable_server?).to eq(cluster.topology.has_writable_server?(cluster))
77
+ end
78
+ end
79
+
62
80
  describe '#inspect' do
63
81
 
64
82
  let(:preference) do
@@ -156,7 +174,7 @@ describe Mongo::Cluster do
156
174
  context 'when topology is Single' do
157
175
 
158
176
  let(:topology) do
159
- Mongo::Cluster::Topology::Single.new({})
177
+ Mongo::Cluster::Topology::Single.new({}, monitoring)
160
178
  end
161
179
 
162
180
  it 'returns an empty array' do
@@ -167,7 +185,7 @@ describe Mongo::Cluster do
167
185
  context 'when topology is ReplicaSet' do
168
186
 
169
187
  let(:topology) do
170
- Mongo::Cluster::Topology::ReplicaSet.new({})
188
+ Mongo::Cluster::Topology::ReplicaSet.new({}, monitoring)
171
189
  end
172
190
 
173
191
  it 'returns an empty array' do
@@ -178,7 +196,7 @@ describe Mongo::Cluster do
178
196
  context 'when topology is Sharded' do
179
197
 
180
198
  let(:topology) do
181
- Mongo::Cluster::Topology::Sharded.new({})
199
+ Mongo::Cluster::Topology::Sharded.new({}, monitoring)
182
200
  end
183
201
 
184
202
  it 'returns an empty array' do
@@ -189,7 +207,7 @@ describe Mongo::Cluster do
189
207
  context 'when topology is Unknown' do
190
208
 
191
209
  let(:topology) do
192
- Mongo::Cluster::Topology::Unknown.new({})
210
+ Mongo::Cluster::Topology::Unknown.new({}, monitoring)
193
211
  end
194
212
 
195
213
  it 'returns an empty array' do
@@ -268,7 +286,7 @@ describe Mongo::Cluster do
268
286
  end
269
287
 
270
288
  let(:monitoring) do
271
- Mongo::Monitoring.new
289
+ Mongo::Monitoring.new(monitoring: false)
272
290
  end
273
291
 
274
292
  let(:server_a) do
@@ -361,7 +379,7 @@ describe Mongo::Cluster do
361
379
  end
362
380
 
363
381
  let(:monitoring) do
364
- Mongo::Monitoring.new
382
+ Mongo::Monitoring.new(monitoring: false)
365
383
  end
366
384
 
367
385
  let(:server) do
@@ -11,7 +11,11 @@ describe 'Max Staleness Spec' do
11
11
  context(spec.description) do
12
12
 
13
13
  let(:topology) do
14
- spec.type.new({})
14
+ spec.type.new({}, monitoring, [])
15
+ end
16
+
17
+ let(:monitoring) do
18
+ Mongo::Monitoring.new(monitoring: false)
15
19
  end
16
20
 
17
21
  let(:monitoring) do
@@ -26,10 +30,10 @@ describe 'Max Staleness Spec' do
26
30
  if spec.heartbeat_frequency
27
31
  TEST_OPTIONS.merge(heartbeat_frequency: spec.heartbeat_frequency)
28
32
  else
29
- copy = TEST_OPTIONS.dup
30
- copy.delete(:heartbeat_frequency)
31
- copy
32
- end.merge!(server_selection_timeout: 0.2)
33
+ TEST_OPTIONS.dup.tap do |opts|
34
+ opts.delete(:heartbeat_frequency)
35
+ end
36
+ end.merge!(server_selection_timeout: 0.2, connect_timeout: 0.1)
33
37
  end
34
38
 
35
39
  let(:cluster) do
@@ -38,7 +42,8 @@ describe 'Max Staleness Spec' do
38
42
  allow(c).to receive(:single?).and_return(topology.single?)
39
43
  allow(c).to receive(:sharded?).and_return(topology.sharded?)
40
44
  allow(c).to receive(:replica_set?).and_return(topology.replica_set?)
41
- allow(c).to receive(:options).and_return(options.merge(server_selection_timeout: 0.2))
45
+ allow(c).to receive(:unknown?).and_return(topology.unknown?)
46
+ allow(c).to receive(:options).and_return(options)
42
47
  allow(c).to receive(:scan!).and_return(true)
43
48
  allow(c).to receive(:app_metadata).and_return(app_metadata)
44
49
  end
@@ -47,17 +52,17 @@ describe 'Max Staleness Spec' do
47
52
  let(:candidate_servers) do
48
53
  spec.candidate_servers.collect do |server|
49
54
  features = double('features').tap do |feat|
50
- allow(feat).to receive(:max_staleness_enabled?).and_return(server['maxWireVersion'] >= 5)
55
+ allow(feat).to receive(:max_staleness_enabled?).and_return(server['maxWireVersion'] && server['maxWireVersion'] >= 5)
51
56
  end
52
57
  address = Mongo::Address.new(server['address'])
53
58
  Mongo::Server.new(address, cluster, monitoring, listeners, options).tap do |s|
54
- allow(s).to receive(:average_round_trip_time).and_return(server['avg_rtt_ms'])
59
+ allow(s).to receive(:average_round_trip_time).and_return(server['avg_rtt_ms'] / 1000.0) if server['avg_rtt_ms']
55
60
  allow(s).to receive(:tags).and_return(server['tags'])
56
61
  allow(s).to receive(:secondary?).and_return(server['type'] == 'RSSecondary')
57
62
  allow(s).to receive(:primary?).and_return(server['type'] == 'RSPrimary')
58
63
  allow(s).to receive(:connectable?).and_return(true)
59
- allow(s).to receive(:last_write_date).and_return(server['lastWrite']['lastWriteDate']['$numberLong'].to_i * 1000)
60
- allow(s).to receive(:last_scan).and_return(server['lastUpdateTime'] * 1000)
64
+ allow(s).to receive(:last_write_date).and_return(server['lastWrite']['lastWriteDate']['$numberLong'].to_i) if server['lastWrite']
65
+ allow(s).to receive(:last_scan).and_return(server['lastUpdateTime'])
61
66
  allow(s).to receive(:features).and_return(features)
62
67
  end
63
68
  end
@@ -65,7 +70,7 @@ describe 'Max Staleness Spec' do
65
70
 
66
71
  let(:in_latency_window) do
67
72
  spec.in_latency_window.collect do |server|
68
- Mongo::Server.new(Mongo::Address.new(server['address']), cluster, monitoring, listeners)
73
+ Mongo::Server.new(Mongo::Address.new(server['address']), cluster, monitoring, listeners, options)
69
74
  end
70
75
  end
71
76
 
@@ -84,23 +89,36 @@ describe 'Max Staleness Spec' do
84
89
  allow(cluster).to receive(:servers).and_return(candidate_servers)
85
90
  end
86
91
 
87
- context 'Valid read preference and matching server available', unless: spec.invalid_max_staleness? do
92
+ context 'when the max staleness is invalid' do
88
93
 
89
- it 'Finds all suitable servers in the latency window', if: spec.replica_set? do
90
- expect(server_selector.send(:select, cluster.servers)).to match_array(in_latency_window)
91
- end
94
+ it 'Raises an InvalidServerPreference exception', if: spec.invalid_max_staleness? do
92
95
 
93
- it 'Finds the most suitable server in the latency window' do
94
- expect(in_latency_window).to include(server_selector.select_server(cluster))
96
+ expect do
97
+ server_selector.select_server(cluster)
98
+ end.to raise_exception(Mongo::Error::InvalidServerPreference)
95
99
  end
96
100
  end
97
101
 
98
- context 'when the max staleness cannot be applied', if: spec.invalid_max_staleness? do
102
+ context 'when the max staleness is valid' do
99
103
 
100
- it 'Raises exception' do
101
- expect do
102
- server_selector.select_server(cluster)
103
- end.to raise_exception(Mongo::Error::InvalidServerPreference)
104
+ context 'when there are available servers' do
105
+
106
+ it 'Finds all suitable servers in the latency window', if: (spec.replica_set? && !spec.invalid_max_staleness? && spec.server_available?) do
107
+ expect(server_selector.send(:select, cluster.servers)).to match_array(in_latency_window)
108
+ end
109
+
110
+ it 'Finds the most suitable server in the latency window', if: (!spec.invalid_max_staleness? && spec.server_available?) do
111
+ expect(in_latency_window).to include(server_selector.select_server(cluster))
112
+ end
113
+ end
114
+
115
+ context 'when there are no available servers', if: (!spec.invalid_max_staleness? && !spec.server_available?) do
116
+
117
+ it 'Raises a NoServerAvailable Exception' do
118
+ expect do
119
+ server_selector.select_server(cluster)
120
+ end.to raise_exception(Mongo::Error::NoServerAvailable)
121
+ end
104
122
  end
105
123
  end
106
124
  end
@@ -45,7 +45,7 @@ describe Mongo::Monitoring do
45
45
  end
46
46
 
47
47
  it 'includes the global subscribers' do
48
- expect(monitoring.subscribers.size).to eq(1)
48
+ expect(monitoring.subscribers.size).to eq(6)
49
49
  end
50
50
  end
51
51
 
@@ -58,7 +58,7 @@ describe Mongo::Monitoring do
58
58
  end
59
59
 
60
60
  it 'includes the global subscribers' do
61
- expect(monitoring.subscribers.size).to eq(1)
61
+ expect(monitoring.subscribers.size).to eq(6)
62
62
  end
63
63
  end
64
64
 
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'SDAM Monitoring' do
4
+ include Mongo::SDAM
5
+
6
+ SDAM_MONITORING_TESTS.each do |file|
7
+
8
+ spec = Mongo::SDAM::Spec.new(file)
9
+
10
+ context(spec.description) do
11
+
12
+ before(:all) do
13
+ @client = Mongo::Client.new([], heartbeat_frequency: 100, connect_timeout: 0.1)
14
+ @subscriber = Mongo::SDAMMonitoring::TestSubscriber.new
15
+ @client.subscribe(Mongo::Monitoring::SERVER_OPENING, @subscriber)
16
+ @client.subscribe(Mongo::Monitoring::SERVER_CLOSED, @subscriber)
17
+ @client.subscribe(Mongo::Monitoring::SERVER_DESCRIPTION_CHANGED, @subscriber)
18
+ @client.subscribe(Mongo::Monitoring::TOPOLOGY_OPENING, @subscriber)
19
+ @client.subscribe(Mongo::Monitoring::TOPOLOGY_CHANGED, @subscriber)
20
+ @client.send(:create_from_uri, spec.uri_string)
21
+ end
22
+
23
+ after(:all) do
24
+ @client.close
25
+ end
26
+
27
+ spec.phases.each_with_index do |phase, index|
28
+
29
+ context("Phase: #{index + 1}") do
30
+
31
+ before(:all) do
32
+ phase.responses.each do |response|
33
+ # For each response in the phase, we need to change that server's description.
34
+ server = find_server(@client, response.address)
35
+ server ||= Mongo::Server.new(
36
+ Mongo::Address.new(response.address),
37
+ @client.cluster,
38
+ @client.instance_variable_get(:@monitoring),
39
+ @client.cluster.send(:event_listeners),
40
+ @client.cluster.options
41
+ )
42
+ monitor = server.instance_variable_get(:@monitor)
43
+ description = monitor.inspector.run(server.description, response.ismaster, 0.5)
44
+ monitor.instance_variable_set(:@description, description)
45
+ end
46
+ end
47
+
48
+ phase.outcome.events.each do |expectation|
49
+
50
+ it "expects a #{expectation.name} to be fired" do
51
+ fired_event = @subscriber.first_event(expectation.name)
52
+ expect(fired_event).not_to be_nil
53
+ expect(fired_event).to match_sdam_monitoring_event(expectation)
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end