spec/mongo/server/monitor_spec.rb in mongo-2.10.5 vs spec/mongo/server/monitor_spec.rb in mongo-2.11.0.rc0

- old
+ new

@@ -11,205 +11,157 @@ let(:listeners) do Mongo::Event::Listeners.new end + let(:monitor_options) do + {} + end + + let(:cluster) do + double('cluster').tap do |cluster| + allow(cluster).to receive(:run_sdam_flow) + allow(cluster).to receive(:heartbeat_interval).and_return(1000) + end + end + + let(:server) do + Mongo::Server.new(address, cluster, Mongo::Monitoring.new, listeners, + monitoring_io: false) + end + + let(:monitor) do + register_background_thread_object( + described_class.new(server, listeners, Mongo::Monitoring.new, + SpecConfig.instance.test_options.merge(cluster: cluster).merge(monitor_options)) + ) + end + describe '#scan!' do context 'when calling multiple times in succession' do - let(:monitor) do - described_class.new(address, listeners, Mongo::Monitoring.new, - SpecConfig.instance.test_options) - end - it 'throttles the scans to minimum 500ms' do start = Time.now monitor.scan! monitor.scan! expect(Time.now - start).to be >= 0.5 end end context 'when the ismaster fails the first time' do - let(:monitor) do - described_class.new(address, listeners, Mongo::Monitoring.new, - SpecConfig.instance.test_options.merge(monitoring_io: false)) + let(:monitor_options) do + {monitoring_io: false} end let(:socket) do monitor.connection.connect! monitor.connection.__send__(:socket) end - before do + it 'retries the ismaster' do expect(socket).to receive(:write).once.and_raise(Mongo::Error::SocketError) expect(socket).to receive(:write).and_call_original + expect(cluster).to receive(:run_sdam_flow) monitor.scan! end - - context 'in single topology' do - require_topology :single - - it 'retries the ismaster' do - expect(monitor.description).to be_standalone - end - end - - context 'in replica set topology' do - require_topology :replica_set - - it 'retries the ismaster' do - expect(monitor.description).to be_primary - end - end - - context 'in sharded topology' do - require_topology :sharded - - it 'retries the ismaster' do - expect(monitor.description).to be_mongos - end - end end context 'when the ismaster command succeeds' do - let(:monitor) do - described_class.new(address, listeners, Mongo::Monitoring.new, - SpecConfig.instance.test_options) - end + it 'invokes sdam flow' do + server.unknown! + expect(server.description).to be_unknown - before do + updated_desc = nil + expect(cluster).to receive(:run_sdam_flow) do |prev_desc, _updated_desc| + updated_desc = _updated_desc + end monitor.scan! - end - context 'in single topology' do - require_topology :single - - it 'updates the server description' do - expect(monitor.description).to be_standalone - end + expect(updated_desc).not_to be_unknown end - - context 'in replica set topology' do - require_topology :replica_set - - it 'updates the server description' do - expect(monitor.description).to be_primary - end - end - - context 'in sharded topology' do - require_topology :sharded - - it 'updates the server description' do - expect(monitor.description).to be_mongos - end - end end context 'when the ismaster command fails' do context 'when no server is running on the address' do - let(:bad_address) do + let(:address) do Mongo::Address.new('127.0.0.1:27050') end - let(:monitor) do - described_class.new(bad_address, listeners, Mongo::Monitoring.new) - end - before do + server.unknown! + expect(server.description).to be_unknown monitor.scan! end it 'keeps the server unknown' do - expect(monitor.description).to be_unknown + expect(server.description).to be_unknown end end context 'when the socket gets an exception' do - let(:bad_address) do + let(:address) do default_address end - let(:monitor) do - described_class.new(bad_address, listeners, Mongo::Monitoring.new) - end - let(:socket) do monitor.connection.connect! monitor.connection.__send__(:socket) end before do expect(socket).to receive(:write).twice.and_raise(Mongo::Error::SocketError) + server.unknown! + expect(server.description).to be_unknown monitor.scan! end it 'keeps the server unknown' do - expect(monitor.description).to be_unknown + expect(server.description).to be_unknown end it 'disconnects the connection' do expect(monitor.connection).to_not be_connected end end end end +=begin heartbeat interval is now taken out of cluster, monitor has no useful options describe '#heartbeat_frequency' do context 'when an option is provided' do - let(:monitor) do - described_class.new(address, listeners, Mongo::Monitoring.new, :heartbeat_frequency => 5) + let(:monitor_options) do + {:heartbeat_frequency => 5} end it 'returns the option' do expect(monitor.heartbeat_frequency).to eq(5) end end context 'when no option is provided' do - let(:monitor) do - described_class.new(address, listeners, Mongo::Monitoring.new) + let(:monitor_options) do + {:heartbeat_frequency => nil} end it 'defaults to 10' do expect(monitor.heartbeat_frequency).to eq(10) end end end +=end - describe '#run!' do - - let(:monitor) do - described_class.new(address, listeners, Mongo::Monitoring.new, :heartbeat_frequency => 1) - end - - before do - monitor.run! - sleep(1) - end - - it 'refreshes the server on the provided interval' do - expect(monitor.description).to_not be_nil - end - end - describe '#restart!' do - let(:monitor) do - described_class.new(address, listeners, Mongo::Monitoring.new, SpecConfig.instance.test_options) - end - let!(:thread) do monitor.run! end context 'when the monitor is already running' do @@ -231,26 +183,25 @@ end end end describe '#stop' do - let(:monitor) do - described_class.new(address, listeners, Mongo::Monitoring.new, - SpecConfig.instance.test_options) - end let(:thread) do monitor.run! end it 'kills the monitor thread' do ClientRegistry.instance.close_all_clients thread - sleep 1 - expect(monitor.connection).to receive(:disconnect!).and_call_original - monitor.stop!(true) - expect(thread.alive?).to be(false) + sleep 0.5 + + RSpec::Mocks.with_temporary_scope do + expect(monitor.connection).to receive(:disconnect!).and_call_original + monitor.stop! + expect(thread.alive?).to be(false) + end end end describe '#connection' do @@ -258,20 +209,28 @@ let(:connect_timeout) do 1 end - let(:monitor) do - described_class.new(address, listeners, Mongo::Monitoring.new, SpecConfig.instance.test_options.merge(connect_timeout: connect_timeout)) + let(:monitor_options) do + {connect_timeout: connect_timeout} end it 'sets the value as the timeout on the connection' do expect(monitor.connection.timeout).to eq(connect_timeout) end it 'set the value as the timeout on the socket' do monitor.connection.connect! expect(monitor.connection.send(:socket).timeout).to eq(connect_timeout) end + end + end + + describe '#log_warn' do + it 'works' do + expect do + monitor.log_warn('test warning') + end.not_to raise_error end end end