spec/chef/cookbooks/package/libraries/redis_helper/server_spec.rb (115 lines of code) (raw):

require 'chef_helper' RSpec.describe RedisHelper::Server do let(:chef_run) { ChefSpec::SoloRunner.new(step_into: %w(templatesymlink)).converge('gitlab::default') } subject { described_class.new(chef_run.node) } describe '#running_version' do let(:redis_cli_output) do <<~MSG # Server redis_version:3.2.12 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:e16da30f4a0a7845 redis_mode:standalone os:Linux 4.15.0-58-generic x86_64 MSG end before do # Un-doing the stub added in chef_helper allow_any_instance_of(described_class).to receive(:running_version).and_call_original allow(Gitlab).to receive(:[]).and_call_original allow(VersionHelper).to receive(:version).with(/redis-cli.*INFO/).and_return(redis_cli_output) allow_any_instance_of(OmnibusHelper).to receive(:service_up?).and_call_original end context 'when redis is not running' do it 'returns nil' do allow_any_instance_of(OmnibusHelper).to receive(:service_up?).with('redis').and_return(false) expect(subject.running_version).to be_nil end end context 'when redis is running' do before do allow_any_instance_of(OmnibusHelper).to receive(:service_up?).with('redis').and_return(true) end context 'over socket' do it 'calls VersionHelper.version with correct arguments' do expect(VersionHelper).to receive(:version).with('/opt/gitlab/embedded/bin/redis-cli -s /var/opt/gitlab/redis/redis.socket INFO') subject.running_version end end context 'over TCP' do context 'on non-TLS port' do before do stub_gitlab_rb( redis: { bind: '0.0.0.0', port: 6379 } ) end it 'calls VersionHelper.version with correct arguments' do expect(VersionHelper).to receive(:version).with('/opt/gitlab/embedded/bin/redis-cli -h 0.0.0.0 -p 6379 INFO') subject.running_version end end context 'on TLS port' do before do stub_gitlab_rb( redis: { bind: '0.0.0.0', tls_port: 6380, tls_cert_file: '/tmp/self_signed.crt', tls_key_file: '/tmp/self_signed.key', tls_auth_clients: 'yes' } ) end it 'calls VersionHelper.version with correct arguments' do expected_args = "-h 0.0.0.0 --tls -p 6380 --cacert '/opt/gitlab/embedded/ssl/certs/cacert.pem' --cacertdir '/opt/gitlab/embedded/ssl/certs/' --cert '/tmp/self_signed.crt' --key '/tmp/self_signed.key'" expect(VersionHelper).to receive(:version).with("/opt/gitlab/embedded/bin/redis-cli #{expected_args} INFO") subject.running_version end end end context 'with a Redis password specified' do before do stub_gitlab_rb( redis: { bind: '0.0.0.0', port: 6379, password: 'toomanysecrets' } ) end it 'it passes password to the command' do expect(VersionHelper).to receive(:version).with("/opt/gitlab/embedded/bin/redis-cli -h 0.0.0.0 -p 6379 -a 'toomanysecrets' INFO") subject.running_version end end it 'parses version from redis-cli output properly' do expect(subject.running_version).to eq('3.2.12') end end end describe '#installed_version' do let(:redis_server_output) { 'Redis server v=3.2.12 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=e16da30f4a0a7845' } before do # Un-doing the stub added in chef_helper allow_any_instance_of(described_class).to receive(:installed_version).and_call_original allow(Gitlab).to receive(:[]).and_call_original allow(VersionHelper).to receive(:version).with(/redis-server --version/).and_return(redis_server_output) allow_any_instance_of(OmnibusHelper).to receive(:service_up?).and_call_original end context 'when redis is not running' do it 'returns nil' do allow_any_instance_of(OmnibusHelper).to receive(:service_up?).with('redis').and_return(false) expect(subject.installed_version).to be_nil end end context 'when redis is running' do before do allow_any_instance_of(OmnibusHelper).to receive(:service_up?).with('redis').and_return(true) end it 'parses redis-server output properly' do expect(subject.installed_version).to eq('3.2.12') end end end end