1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
|
def make_server(mode, options = {})
tags = options[:tags] || {}
average_round_trip_time = options[:average_round_trip_time] || 0
ismaster = {
'setName' => 'mongodb_set',
'ismaster' => mode == :primary,
'secondary' => mode != :primary,
'tags' => tags,
'ok' => 1
}
listeners = Mongo::Event::Listeners.new
monitoring = Mongo::Monitoring.new
address = options[:address]
server = Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
description = Mongo::Server::Description.new(address, ismaster, average_round_trip_time)
server.tap do |s|
allow(s).to receive(:description).and_return(description)
end
end
shared_context 'server selector' do
let(:max_staleness) { nil }
let(:tag_sets) { [] }
let(:tag_set) do
{ 'test' => 'tag' }
end
let(:server_tags) do
{ 'test' => 'tag', 'other' => 'tag' }
end
let(:primary) { make_server(:primary) }
let(:secondary) { make_server(:secondary) }
let(:options) { { :mode => name, :tag_sets => tag_sets, max_staleness: max_staleness } }
let(:selector) { described_class.new(options) }
let(:monitoring) do
Mongo::Monitoring.new(monitoring: false)
end
let(:topology) do
double('topology')
end
before(:all) do
module Mongo
# We monkey-patch the server here, so the monitors do not run and no
# real TCP connection is attempted.
#
# @since 2.1.0
class Server
alias :original_initialize :initialize
def initialize(address, cluster, monitoring, event_listeners, options = {})
@address = address
@cluster = cluster
@monitoring = monitoring
@options = options.freeze
@monitor = Monitor.new(address, event_listeners, options)
end
alias :original_disconnect! :disconnect!
def disconnect!; true; end
end
end
end
after(:all) do
# Return the server implementation to its original for the other
# tests in the suite.
module Mongo
class Server
alias :initialize :original_initialize
remove_method(:original_initialize)
alias :disconnect! :original_disconnect!
remove_method(:original_disconnect!)
end
end
end
end
shared_examples 'a server selector mode' do
describe '#name' do
it 'returns the name' do
expect(selector.name).to eq(name)
end
end
describe '#slave_ok?' do
it 'returns whether the slave_ok bit should be set' do
expect(selector.slave_ok?).to eq(slave_ok)
end
end
describe '#==' do
context 'when mode is the same' do
let(:other) do
described_class.new
end
context 'tag sets are the same' do
it 'returns true' do
expect(selector).to eq(other)
end
end
end
context 'mode is different' do
let(:other) do
described_class.new.tap do |sel|
allow(sel).to receive(:name).and_return(:other_mode)
end
end
it 'returns false' do
expect(selector).not_to eq(other)
end
end
end
end
shared_examples 'a server selector accepting tag sets' do
describe '#tag_sets' do
context 'tags not provided' do
it 'returns an empty array' do
expect(selector.tag_sets).to be_empty
end
end
context 'tag sets provided' do
let(:tag_sets) do
[ tag_set ]
end
it 'returns the tag sets' do
expect(selector.tag_sets).to eq(tag_sets)
end
end
end
describe '#==' do
context 'when mode is the same' do
let(:other) { described_class.new }
context 'tag sets are different' do
let(:tag_sets) { { 'other' => 'tag' } }
it 'returns false' do
expect(selector).not_to eq(other)
end
end
end
end
end
shared_examples 'a server selector with sensitive data in its options' do
describe '#inspect' do
context 'when there is sensitive data in the options' do
let(:options) do
Mongo::Options::Redacted.new(:mode => name, :password => 'sensitive_data')
end
it 'does not print out sensitive data' do
expect(selector.inspect).not_to match(options[:password])
end
end
end
end
|