Update rabbitmq module
[mirror/dsa-puppet.git] / 3rdparty / modules / rabbitmq / spec / classes / rabbitmq_spec.rb
index 675a875..4c2a5be 100644 (file)
 require 'spec_helper'
 
 describe 'rabbitmq' do
-
   context 'on unsupported distributions' do
-    let(:facts) {{ :osfamily => 'Unsupported' }}
-
-    it 'we fail' do
-      expect { catalogue }.to raise_error(Puppet::Error, /not supported on an Unsupported/)
-    end
-  end
-
-  context 'on Debian' do
-    let(:facts) {{ :osfamily => 'Debian', :lsbdistid => 'Debian', :lsbdistcodename => 'squeeze' }}
-    it 'includes rabbitmq::repo::apt' do
-      should contain_class('rabbitmq::repo::apt')
-    end
-
-    describe 'apt::source default values' do
-      it 'should add a repo with defaults values' do
-        should contain_apt__source('rabbitmq').with( {
-          :ensure   => 'present',
-          :location => 'http://www.rabbitmq.com/debian/',
-          :release  => 'testing',
-          :repos    => 'main',
-        })
-      end
-    end
-  end
-
-  context 'on Debian' do
-    let(:params) {{ :manage_repos => false }}
-    let(:facts) {{ :osfamily => 'Debian', :lsbdistid => 'Debian', :lsbdistcodename => 'squeeze' }}
-    it 'does ensure rabbitmq apt::source is absent when manage_repos is false' do
-      should_not contain_apt__source('rabbitmq')
-    end
-  end
-
-  context 'on Debian' do
-    let(:params) {{ :manage_repos => true }}
-    let(:facts) {{ :osfamily => 'Debian', :lsbdistid => 'Debian', :lsbdistcodename => 'squeeze' }}
-
-    it 'includes rabbitmq::repo::apt' do
-      should contain_class('rabbitmq::repo::apt')
+    let(:facts) do
+      {
+        os: { family: 'Unsupported' }
+      }
     end
 
-    describe 'apt::source default values' do
-      it 'should add a repo with defaults values' do
-        should contain_apt__source('rabbitmq').with( {
-          :ensure   => 'present',
-          :location => 'http://www.rabbitmq.com/debian/',
-          :release  => 'testing',
-          :repos    => 'main',
-        })
-      end
+    it 'we fail' do
+      expect { catalogue }.to raise_error(Puppet::Error, %r{not supported on an Unsupported})
     end
   end
 
-  context 'on Debian' do
-    let(:params) {{ :repos_ensure => false }}
-    let(:facts) {{ :osfamily => 'Debian', :lsbdistid => 'Debian', :lsbdistcodename => 'squeeze' }}
-    it 'does ensure rabbitmq apt::source is absent when repos_ensure is false' do
-      should contain_apt__source('rabbitmq').with(
-        'ensure'  => 'absent'
+  # TODO: get Archlinux & OpenBSD facts from facterdb
+
+  on_supported_os.each do |os, facts|
+    context "on #{os}" do
+      let(:facts) { facts }
+
+      packagename = case facts[:osfamily]
+                    when 'Archlinux'
+                      'rabbitmq'
+                    else
+                      'rabbitmq-server'
+                    end
+      has_systemd = (
+        (facts[:os]['family'] == 'RedHat' && facts[:os]['release']['major'].to_i >= 7) ||
+        (facts[:os]['family'] == 'Debian' && facts[:os]['release']['full'] == '16.04') ||
+        (facts[:os]['family'] == 'Archlinux')
       )
-    end
-  end
-
-  context 'on Debian' do
-    let(:params) {{ :repos_ensure => true }}
-    let(:facts) {{ :osfamily => 'Debian', :lsbdistid => 'Debian', :lsbdistcodename => 'squeeze' }}
 
-    it 'includes rabbitmq::repo::apt' do
-      should contain_class('rabbitmq::repo::apt')
-    end
+      it { is_expected.to compile.with_all_deps }
+      it { is_expected.to contain_class('rabbitmq::install') }
+      it { is_expected.to contain_class('rabbitmq::config') }
+      it { is_expected.to contain_class('rabbitmq::service') }
 
-    describe 'apt::source default values' do
-      it 'should add a repo with defaults values' do
-        should contain_apt__source('rabbitmq').with( {
-          :ensure   => 'present',
-          :location => 'http://www.rabbitmq.com/debian/',
-          :release  => 'testing',
-          :repos    => 'main',
-        })
+      it { is_expected.to contain_package(packagename).with_ensure('installed').with_name(packagename) }
+      if facts[:os]['family'] == 'Suse'
+        it { is_expected.to contain_package('rabbitmq-server-plugins') }
       end
-    end
-  end
-
-  context 'on Debian' do
-    let(:params) {{ :manage_repos => true, :repos_ensure => false }}
-    let(:facts) {{ :osfamily => 'Debian', :lsbdistid => 'Debian', :lsbdistcodename => 'squeeze' }}
 
-    it 'includes rabbitmq::repo::apt' do
-      should contain_class('rabbitmq::repo::apt')
-    end
-
-    describe 'apt::source default values' do
-      it 'should add a repo with defaults values' do
-        should contain_apt__source('rabbitmq').with( {
-          :ensure => 'absent',
-        })
+      context 'with default params' do
+        it { is_expected.not_to contain_class('rabbitmq::repo::apt') }
+        it { is_expected.not_to contain_apt__source('rabbitmq') }
+        it { is_expected.not_to contain_class('rabbitmq::repo::rhel') }
+        it { is_expected.not_to contain_yumrepo('rabbitmq') }
       end
-    end
-  end
 
-  context 'on Debian' do
-    let(:params) {{ :manage_repos => true, :repos_ensure => true }}
-    let(:facts) {{ :osfamily => 'Debian', :lsbdistid => 'Debian', :lsbdistcodename => 'squeeze' }}
+      context 'with repos_ensure => true' do
+        let(:params) { { repos_ensure: true } }
 
-    it 'includes rabbitmq::repo::apt' do
-      should contain_class('rabbitmq::repo::apt')
-    end
+        if facts[:os]['family'] == 'Debian'
+          it 'includes rabbitmq::repo::apt' do
+            is_expected.to contain_class('rabbitmq::repo::apt').
+              with_key_source('https://packagecloud.io/gpg.key').
+              with_key_content(nil)
+          end
 
-    describe 'apt::source default values' do
-      it 'should add a repo with defaults values' do
-        should contain_apt__source('rabbitmq').with( {
-          :ensure   => 'present',
-          :location => 'http://www.rabbitmq.com/debian/',
-          :release  => 'testing',
-          :repos    => 'main',
-        })
-      end
-    end
-  end
+          it 'adds a repo with default values' do
+            is_expected.to contain_apt__source('rabbitmq').
+              with_ensure('present').
+              with_location("https://packagecloud.io/rabbitmq/rabbitmq-server/#{facts[:os]['name'].downcase}").
+              with_release(nil).
+              with_repos('main')
+          end
+        else
+          it { is_expected.not_to contain_class('rabbitmq::repo::apt') }
+          it { is_expected.not_to contain_apt__souce('rabbitmq') }
+        end
 
-  context 'on Debian' do
-    let(:params) {{ :manage_repos => false, :repos_ensure => true }}
-    let(:facts) {{ :osfamily => 'Debian', :lsbdistid => 'Debian', :lsbdistcodename => 'squeeze' }}
-    it 'does ensure rabbitmq apt::source is absent when manage_repos is false and repos_ensure is true' do
-      should_not contain_apt__source('rabbitmq')
-    end
-  end
+        if facts[:os]['family'] == 'RedHat'
+          it { is_expected.to contain_class('rabbitmq::repo::rhel') }
 
-  context 'on Debian' do
-    let(:facts) {{ :osfamily => 'Debian', :lsbdistid => 'Debian', :lsbdistcodename => 'squeeze' }}
-    context 'with manage_repos => false and repos_ensure => false' do
-      let(:params) {{ :manage_repos => false, :repos_ensure => false }}
-      it 'does ensure rabbitmq apt::source is absent when manage_repos is false and repos_ensure is false' do
-        should_not contain_apt__source('rabbitmq')
+          it 'the repo should be present, and contain the expected values' do
+            is_expected.to contain_yumrepo('rabbitmq').
+              with_ensure('present').
+              with_baseurl(%r{https://packagecloud.io/rabbitmq/rabbitmq-server/el/\d+/\$basearch$}).
+              with_gpgkey('https://www.rabbitmq.com/rabbitmq-release-signing-key.asc')
+          end
+        else
+          it { is_expected.not_to contain_class('rabbitmq::repo::rhel') }
+          it { is_expected.not_to contain_yumrepo('rabbitmq') }
+        end
       end
-    end
 
-    context 'with file_limit => unlimited' do
-      let(:params) {{ :file_limit => 'unlimited' }}
-      it { should contain_file('/etc/default/rabbitmq-server').with_content(/ulimit -n unlimited/) }
-    end
+      context 'with no pin', if: facts[:os]['family'] == 'Debian' do
+        let(:params) { { repos_ensure: true, package_apt_pin: '' } }
 
-    context 'with file_limit => infinity' do
-      let(:params) {{ :file_limit => 'infinity' }}
-      it { should contain_file('/etc/default/rabbitmq-server').with_content(/ulimit -n infinity/) }
-    end
-
-    context 'with file_limit => -1' do
-      let(:params) {{ :file_limit => -1 }}
-      it { should contain_file('/etc/default/rabbitmq-server').with_content(/ulimit -n -1/) }
-    end
-
-    context 'with file_limit => \'1234\'' do
-      let(:params) {{ :file_limit => '1234' }}
-      it { should contain_file('/etc/default/rabbitmq-server').with_content(/ulimit -n 1234/) }
-    end
-
-    context 'with file_limit => foo' do
-      let(:params) {{ :file_limit => 'foo' }}
-      it 'does not compile' do
-        expect { catalogue }.to raise_error(Puppet::Error, /\$file_limit must be an integer, 'unlimited', or 'infinity'/)
+        describe 'it sets up an apt::source' do
+          it {
+            is_expected.to contain_apt__source('rabbitmq').with(
+              'location'    => "https://packagecloud.io/rabbitmq/rabbitmq-server/#{facts[:os]['name'].downcase}",
+              'repos'       => 'main',
+              'key'         => '{"id"=>"418A7F2FB0E1E6E7EABF6FE8C2E73424D59097AB", "source"=>"https://packagecloud.io/gpg.key", "content"=>:undef}'
+            )
+          }
+        end
       end
-    end
-  end
 
-  context 'on Redhat' do
-    let(:facts) {{ :osfamily => 'RedHat' }}
-    it 'includes rabbitmq::repo::rhel' do
-      should contain_class('rabbitmq::repo::rhel')
-      should contain_exec('rpm --import http://www.rabbitmq.com/rabbitmq-signing-key-public.asc')
-    end
-  end
+      context 'with pin', if: facts[:os]['family'] == 'Debian' do
+        let(:params) { { repos_ensure: true, package_apt_pin: '700' } }
 
-  context 'on Redhat' do
-    let(:params) {{ :repos_ensure => false }}
-    let(:facts) {{ :osfamily => 'RedHat' }}
-    it 'does not import repo public key when repos_ensure is false' do
-      should contain_class('rabbitmq::repo::rhel')
-      should_not contain_exec('rpm --import http://www.rabbitmq.com/rabbitmq-signing-key-public.asc')
-    end
-  end
+        describe 'it sets up an apt::source and pin' do
+          it {
+            is_expected.to contain_apt__source('rabbitmq').with(
+              'location'    => "https://packagecloud.io/rabbitmq/rabbitmq-server/#{facts[:os]['name'].downcase}",
+              'repos'       => 'main',
+              'key'         => '{"id"=>"418A7F2FB0E1E6E7EABF6FE8C2E73424D59097AB", "source"=>"https://packagecloud.io/gpg.key", "content"=>:undef}'
+            )
+          }
 
-  context 'on Redhat' do
-    let(:params) {{ :repos_ensure => true }}
-    let(:facts) {{ :osfamily => 'RedHat' }}
-    it 'does import repo public key when repos_ensure is true' do
-      should contain_class('rabbitmq::repo::rhel')
-      should contain_exec('rpm --import http://www.rabbitmq.com/rabbitmq-signing-key-public.asc')
-    end
-  end
+          it {
+            is_expected.to contain_apt__pin('rabbitmq').with(
+              'packages' => '*',
+              'priority' => '700',
+              'origin'   => 'packagecloud.io'
+            )
+          }
+        end
+      end
 
-  context 'on Redhat' do
-    let(:params) {{ :manage_repos => false }}
-    let(:facts) {{ :osfamily => 'RedHat' }}
-    it 'does not import repo public key when manage_repos is false' do
-      should_not contain_class('rabbitmq::repo::rhel')
-      should_not contain_exec('rpm --import http://www.rabbitmq.com/rabbitmq-signing-key-public.asc')
-    end
-  end
+      ['unlimited', 'infinity', -1, 1234].each do |value|
+        context "with file_limit => '#{value}'" do
+          let(:params) { { file_limit: value } }
+
+          if facts[:os]['family'] == 'RedHat'
+            it do
+              is_expected.to contain_file('/etc/security/limits.d/rabbitmq-server.conf').
+                with_owner('0').
+                with_group('0').
+                with_mode('0644').
+                that_notifies('Class[Rabbitmq::Service]').
+                with_content("rabbitmq soft nofile #{value}\nrabbitmq hard nofile #{value}\n")
+            end
+          else
+            it { is_expected.not_to contain_file('/etc/security/limits.d/rabbitmq-server.conf') }
+          end
 
-  context 'on Redhat' do
-    let(:params) {{ :manage_repos => true }}
-    let(:facts) {{ :osfamily => 'RedHat' }}
-    it 'does import repo public key when manage_repos is true' do
-      should contain_class('rabbitmq::repo::rhel')
-      should contain_exec('rpm --import http://www.rabbitmq.com/rabbitmq-signing-key-public.asc')
-    end
-  end
+          if facts[:os]['family'] == 'Debian'
+            it { is_expected.to contain_file('/etc/default/rabbitmq-server').with_content(%r{ulimit -n #{value}}) }
+          else
+            it { is_expected.not_to contain_file('/etc/default/rabbitmq-server') }
+          end
 
-  context 'on Redhat' do
-    let(:params) {{ :manage_repos => false, :repos_ensure => true }}
-    let(:facts) {{ :osfamily => 'RedHat' }}
-    it 'does not import repo public key when manage_repos is false and repos_ensure is true' do
-      should_not contain_class('rabbitmq::repo::rhel')
-      should_not contain_exec('rpm --import http://www.rabbitmq.com/rabbitmq-signing-key-public.asc')
-    end
-  end
+          if has_systemd
+            it do
+              is_expected.to contain_file("/etc/systemd/system/#{packagename}.service.d/limits.conf").
+                with_owner('0').
+                with_group('0').
+                with_mode('0644').
+                that_notifies('Exec[rabbitmq-systemd-reload]').
+                with_content("[Service]\nLimitNOFILE=#{value}\n")
+            end
+          else
+            it { is_expected.not_to contain_file('/etc/systemd/system/rabbitmq-server.service.d/limits.conf') }
+          end
+        end
+      end
 
-  context 'on Redhat' do
-    let(:params) {{ :manage_repos => true, :repos_ensure => true }}
-    let(:facts) {{ :osfamily => 'RedHat' }}
-    it 'does import repo public key when manage_repos is true and repos_ensure is true' do
-      should contain_class('rabbitmq::repo::rhel')
-      should contain_exec('rpm --import http://www.rabbitmq.com/rabbitmq-signing-key-public.asc')
-    end
-  end
+      [-42, '-42', 'foo', '42'].each do |value|
+        context "with file_limit => '#{value}'" do
+          let(:params) { { file_limit: value } }
 
-  context 'on Redhat' do
-    let(:params) {{ :manage_repos => false, :repos_ensure => false }}
-    let(:facts) {{ :osfamily => 'RedHat' }}
-    it 'does not import repo public key when manage_repos is false and repos_ensure is false' do
-      should_not contain_class('rabbitmq::repo::rhel')
-      should_not contain_exec('rpm --import http://www.rabbitmq.com/rabbitmq-signing-key-public.asc')
-    end
-  end
+          it 'does not compile' do
+            expect { catalogue }.to raise_error(Puppet::PreformattedError, %r{Error while evaluating a Resource Statement})
+          end
+        end
+      end
 
-  context 'on Redhat' do
-    let(:params) {{ :manage_repos => true, :repos_ensure => false }}
-    let(:facts) {{ :osfamily => 'RedHat' }}
-    it 'does not import repo public key when manage_repos is true and repos_ensure is false' do
-      should contain_class('rabbitmq::repo::rhel')
-      should_not contain_exec('rpm --import http://www.rabbitmq.com/rabbitmq-signing-key-public.asc')
-    end
-  end
+      context 'on systems with systemd', if: has_systemd do
+        it {
+          is_expected.to contain_file("/etc/systemd/system/#{packagename}.service.d").with(
+            'ensure'                  => 'directory',
+            'owner'                   => '0',
+            'group'                   => '0',
+            'mode'                    => '0755',
+            'selinux_ignore_defaults' => true
+          )
+        }
 
-  context 'on RedHat 7.0 or more' do
-    let(:facts) {{ :osfamily => 'RedHat', :operatingsystemmajrelease => '7' }}
-
-    it { should contain_file('/etc/systemd/system/rabbitmq-server.service.d').with(
-      'ensure'                  => 'directory',
-      'owner'                   => '0',
-      'group'                   => '0',
-      'mode'                    => '0755',
-      'selinux_ignore_defaults' => true
-    ) }
-
-    it { should contain_exec('rabbitmq-systemd-reload').with(
-      'command'     => '/usr/bin/systemctl daemon-reload',
-      'notify'      => 'Class[Rabbitmq::Service]',
-      'refreshonly' => true
-    ) }
-    context 'with file_limit => unlimited' do
-      let(:params) {{ :file_limit => 'unlimited' }}
-      it { should contain_file('/etc/systemd/system/rabbitmq-server.service.d/limits.conf').with(
-        'owner'   => '0',
-        'group'   => '0',
-        'mode'    => '0644',
-        'notify'  => 'Exec[rabbitmq-systemd-reload]',
-        'content' => '[Service]
-LimitNOFILE=unlimited
-'
-      ) }
-    end
+        it { is_expected.to contain_file("/etc/systemd/system/#{packagename}.service.d/limits.conf") }
 
-    context 'with file_limit => infinity' do
-      let(:params) {{ :file_limit => 'infinity' }}
-      it { should contain_file('/etc/systemd/system/rabbitmq-server.service.d/limits.conf').with(
-        'owner'   => '0',
-        'group'   => '0',
-        'mode'    => '0644',
-        'notify'  => 'Exec[rabbitmq-systemd-reload]',
-        'content' => '[Service]
-LimitNOFILE=infinity
-'
-      ) }
-    end
+        it {
+          is_expected.to contain_exec('rabbitmq-systemd-reload').with(
+            command: '/bin/systemctl daemon-reload',
+            notify: 'Class[Rabbitmq::Service]',
+            refreshonly: true
+          )
+        }
+      end
 
-    context 'with file_limit => -1' do
-      let(:params) {{ :file_limit => -1 }}
-      it { should contain_file('/etc/systemd/system/rabbitmq-server.service.d/limits.conf').with(
-        'owner'   => '0',
-        'group'   => '0',
-        'mode'    => '0644',
-        'notify'  => 'Exec[rabbitmq-systemd-reload]',
-        'content' => '[Service]
-LimitNOFILE=-1
-'
-      ) }
-    end
+      context 'on systems without systemd', unless: has_systemd do
+        it { is_expected.not_to contain_file('/etc/systemd/system/rabbitmq-server.service.d') }
+        it { is_expected.not_to contain_file('/etc/systemd/system/rabbitmq-server.service.d/limits.conf') }
+        it { is_expected.not_to contain_exec('rabbitmq-systemd-reload') }
+      end
 
-    context 'with file_limit => \'1234\'' do
-      let(:params) {{ :file_limit => '1234' }}
-      it { should contain_file('/etc/systemd/system/rabbitmq-server.service.d/limits.conf').with(
-        'owner'   => '0',
-        'group'   => '0',
-        'mode'    => '0644',
-        'notify'  => 'Exec[rabbitmq-systemd-reload]',
-        'content' => '[Service]
-LimitNOFILE=1234
-'
-      ) }
-    end
+      context 'with admin_enable set to true' do
+        let(:params) { { admin_enable: true, management_ip_address: '1.1.1.1' } }
 
-    context 'with file_limit => foo' do
-      let(:params) {{ :file_limit => 'foo' }}
-      it 'does not compile' do
-        expect { catalogue }.to raise_error(Puppet::Error, /\$file_limit must be an integer, 'unlimited', or 'infinity'/)
-      end
-    end
-  end
+        context 'with service_manage set to true' do
+          let(:params) { { admin_enable: true, management_ip_address: '1.1.1.1', service_manage: true } }
 
-  context 'on RedHat before 7.0' do
-    let(:facts) {{ :osfamily => 'RedHat', :operatingsystemmajrelease => '6' }}
-
-    context 'with file_limit => unlimited' do
-      let(:params) {{ :file_limit => 'unlimited' }}
-      it { should contain_file('/etc/security/limits.d/rabbitmq-server.conf').with(
-        'owner'   => '0',
-        'group'   => '0',
-        'mode'    => '0644',
-        'notify'  => 'Class[Rabbitmq::Service]',
-        'content' => 'rabbitmq soft nofile unlimited
-rabbitmq hard nofile unlimited
-'
-      ) }
-    end
+          context 'with rabbitmqadmin_package set to blub' do
+            let(:params) { { rabbitmqadmin_package: 'blub' } }
 
-    context 'with file_limit => infinity' do
-      let(:params) {{ :file_limit => 'infinity' }}
-      it { should contain_file('/etc/security/limits.d/rabbitmq-server.conf').with(
-        'owner'   => '0',
-        'group'   => '0',
-        'mode'    => '0644',
-        'notify'  => 'Class[Rabbitmq::Service]',
-        'content' => 'rabbitmq soft nofile infinity
-rabbitmq hard nofile infinity
-'
-      ) }
-    end
+            it 'installs a package called blub' do
+              is_expected.to contain_package('rabbitmqadmin').with_name('blub')
+            end
+          end
+          if facts[:os]['family'] == 'Archlinux'
+            it 'installs a package called rabbitmqadmin' do
+              is_expected.to contain_package('rabbitmqadmin').with_name('rabbitmqadmin')
+            end
+          else
+            it 'we enable the admin interface by default' do
+              is_expected.to contain_class('rabbitmq::install::rabbitmqadmin')
+              is_expected.to contain_rabbitmq_plugin('rabbitmq_management').with(
+                notify: 'Class[Rabbitmq::Service]'
+              )
+              is_expected.to contain_archive('rabbitmqadmin').with_source('http://1.1.1.1:15672/cli/rabbitmqadmin')
+            end
+          end
+          if %w[RedHat Debian SUSE].include?(facts[:os]['family'])
+            it { is_expected.to contain_package('python') }
+          end
+          if %w[FreeBSD OpenBSD].include?(facts[:os]['family'])
+            it { is_expected.to contain_package('python2') }
+          end
+        end
+        context 'with manage_python false' do
+          let(:params) { { manage_python: false } }
 
-    context 'with file_limit => -1' do
-      let(:params) {{ :file_limit => -1 }}
-      it { should contain_file('/etc/security/limits.d/rabbitmq-server.conf').with(
-        'owner'   => '0',
-        'group'   => '0',
-        'mode'    => '0644',
-        'notify'  => 'Class[Rabbitmq::Service]',
-        'content' => 'rabbitmq soft nofile -1
-rabbitmq hard nofile -1
-'
-      ) }
-    end
+          it do
+            is_expected.to contain_class('rabbitmq::install::rabbitmqadmin')
+            is_expected.not_to contain_package('python')
+            is_expected.not_to contain_package('python2')
+          end
+        end
 
-    context 'with file_limit => \'1234\'' do
-      let(:params) {{ :file_limit => '1234' }}
-      it { should contain_file('/etc/security/limits.d/rabbitmq-server.conf').with(
-        'owner'   => '0',
-        'group'   => '0',
-        'mode'    => '0644',
-        'notify'  => 'Class[Rabbitmq::Service]',
-        'content' => 'rabbitmq soft nofile 1234
-rabbitmq hard nofile 1234
-'
-      ) }
-    end
+        context 'with $management_ip_address undef and service_manage set to true', unless: facts[:osfamily] == 'Archlinux' do
+          let(:params) { { admin_enable: true, management_ip_address: :undef } }
 
-    context 'with file_limit => foo' do
-      let(:params) {{ :file_limit => 'foo' }}
-      it 'does not compile' do
-        expect { catalogue }.to raise_error(Puppet::Error, /\$file_limit must be an integer, 'unlimited', or 'infinity'/)
-      end
-    end
-  end
+          it 'we enable the admin interface by default' do
+            is_expected.to contain_class('rabbitmq::install::rabbitmqadmin')
+            is_expected.to contain_rabbitmq_plugin('rabbitmq_management').with(
+              notify: 'Class[Rabbitmq::Service]'
+            )
+            is_expected.to contain_archive('rabbitmqadmin').with_source('http://127.0.0.1:15672/cli/rabbitmqadmin')
+          end
+        end
+        context 'with service_manage set to true, node_ip_address = undef, and default user/pass specified', unless: facts[:osfamily] == 'Archlinux' do
+          let(:params) { { admin_enable: true, default_user: 'foobar', default_pass: 'hunter2', node_ip_address: :undef } }
 
-  ['Debian', 'RedHat', 'SUSE', 'Archlinux'].each do |distro|
-    context "on #{distro}" do
-      let(:facts) {{
-        :osfamily => distro,
-        :lsbdistcodename => 'squeeze',
-        :lsbdistid => 'Debian'
-      }}
+          it 'we use the correct URL to rabbitmqadmin' do
+            is_expected.to contain_archive('rabbitmqadmin').with(
+              source: 'http://127.0.0.1:15672/cli/rabbitmqadmin',
+              username: 'foobar',
+              password: 'hunter2'
+            )
+          end
+        end
+        context 'with service_manage set to true and default user/pass specified', unless: facts[:osfamily] == 'Archlinux' do
+          let(:params) { { admin_enable: true, default_user: 'foobar', default_pass: 'hunter2', management_ip_address: '1.1.1.1' } }
 
-      it { should contain_class('rabbitmq::install') }
-      it { should contain_class('rabbitmq::config') }
-      it { should contain_class('rabbitmq::service') }
+          it 'we use the correct URL to rabbitmqadmin' do
+            is_expected.to contain_archive('rabbitmqadmin').with(
+              source: 'http://1.1.1.1:15672/cli/rabbitmqadmin',
+              username: 'foobar',
+              password: 'hunter2'
+            )
+          end
+        end
+        context 'with service_manage set to true and archive_options set', unless: facts[:osfamily] == 'Archlinux' do
+          let(:params) do
+            {
+              admin_enable: true,
+              management_ip_address: '1.1.1.1',
+              archive_options: %w[fizz pop]
+            }
+          end
 
-     context 'with admin_enable set to true' do
-        let(:params) {{ :admin_enable => true }}
-        context 'with service_manage set to true' do
-          it 'we enable the admin interface by default' do
-            should contain_class('rabbitmq::install::rabbitmqadmin')
-            should contain_rabbitmq_plugin('rabbitmq_management').with(
-              'require' => 'Class[Rabbitmq::Install]',
-              'notify'  => 'Class[Rabbitmq::Service]'
+          it 'we use the correct archive_options to rabbitmqadmin' do
+            is_expected.to contain_archive('rabbitmqadmin').with(
+              source: 'http://1.1.1.1:15672/cli/rabbitmqadmin',
+              download_options: %w[fizz pop]
             )
-            should contain_staging__file('rabbitmqadmin').with_source("http://guest:guest@localhost:15672/cli/rabbitmqadmin")
           end
         end
-        context 'with service_manage set to true and default user/pass specified' do
-          let(:params) {{ :admin_enable => true, :default_user => 'foobar', :default_pass => 'hunter2' }}
+        context 'with service_manage set to true and management port specified', unless: facts[:osfamily] == 'Archlinux' do
+          # note that the 2.x management port is 55672 not 15672
+          let(:params) { { admin_enable: true, management_port: 55_672, management_ip_address: '1.1.1.1' } }
+
           it 'we use the correct URL to rabbitmqadmin' do
-            should contain_staging__file('rabbitmqadmin').with_source("http://foobar:hunter2@localhost:15672/cli/rabbitmqadmin")
+            is_expected.to contain_archive('rabbitmqadmin').with(
+              source: 'http://1.1.1.1:55672/cli/rabbitmqadmin',
+              username: 'guest',
+              password: 'guest'
+            )
           end
         end
-        context 'with service_manage set to true and management port specified' do
+        context 'with ipv6, service_manage set to true and management port specified', unless: facts[:osfamily] == 'Archlinux' do
           # note that the 2.x management port is 55672 not 15672
-          let(:params) {{ :admin_enable => true, :management_port => '55672' }}
+          let(:params) { { admin_enable: true, management_port: 55_672, management_ip_address: '::1' } }
+
           it 'we use the correct URL to rabbitmqadmin' do
-            should contain_staging__file('rabbitmqadmin').with_source("http://guest:guest@localhost:55672/cli/rabbitmqadmin")
+            is_expected.to contain_archive('rabbitmqadmin').with(
+              source: 'http://[::1]:55672/cli/rabbitmqadmin',
+              username: 'guest',
+              password: 'guest'
+            )
           end
         end
         context 'with service_manage set to false' do
-          let(:params) {{ :admin_enable => true, :service_manage => false }}
-          it 'should do nothing' do
-            should_not contain_class('rabbitmq::install::rabbitmqadmin')
-            should_not contain_rabbitmq_plugin('rabbitmq_management')
+          let(:params) { { admin_enable: true, service_manage: false } }
+
+          it 'does nothing' do
+            is_expected.not_to contain_class('rabbitmq::install::rabbitmqadmin')
+            is_expected.not_to contain_rabbitmq_plugin('rabbitmq_management')
           end
         end
       end
 
       describe 'manages configuration directory correctly' do
-        it { should contain_file('/etc/rabbitmq').with(
-          'ensure' => 'directory'
-        )}
+        it {
+          is_expected.to contain_file('/etc/rabbitmq').with(
+            'ensure' => 'directory',
+            'mode'   => '0755'
+          )
+        }
       end
 
       describe 'manages configuration file correctly' do
-        it { should contain_file('rabbitmq.config') }
+        it {
+          is_expected.to contain_file('rabbitmq.config').with(
+            'owner' => '0',
+            'group' => 'rabbitmq',
+            'mode'  => '0640'
+          )
+        }
+      end
+
+      describe 'does not contain pre-ranch settings with default config' do
+        it do
+          is_expected.to contain_file('rabbitmq.config'). \
+            without_content(%r{binary,}).                 \
+            without_content(%r{\{packet,        raw\},}). \
+            without_content(%r{\{reuseaddr,     true\},})
+        end
+      end
+
+      describe 'contains pre-ranch settings with config_ranch set to false' do
+        let(:params) { { config_ranch: false } }
+
+        it do
+          is_expected.to contain_file('rabbitmq.config'). \
+            with_content(%r{binary,}).                 \
+            with_content(%r{\{packet,        raw\},}). \
+            with_content(%r{\{reuseaddr,     true\},})
+        end
       end
 
       context 'configures config_cluster' do
-        let(:facts) {{ :osfamily => distro, :lsbdistid => 'Debian' }}
-        let(:params) {{
-          :config_cluster           => true,
-          :cluster_nodes            => ['hare-1', 'hare-2'],
-          :cluster_node_type        => 'ram',
-          :wipe_db_on_cookie_change => false
-        }}
-
-        describe 'with defaults' do
-          it 'fails' do
-            expect { catalogue }.to raise_error(Puppet::Error, /You must set the \$erlang_cookie value/)
-          end
+        let(:params) do
+          {
+            config_cluster: true,
+            cluster_nodes: ['hare-1', 'hare-2'],
+            cluster_node_type: 'ram',
+            wipe_db_on_cookie_change: false
+          }
         end
 
         describe 'with erlang_cookie set' do
-          let(:params) {{
-            :config_cluster           => true,
-            :cluster_nodes            => ['hare-1', 'hare-2'],
-            :cluster_node_type        => 'ram',
-            :erlang_cookie            => 'TESTCOOKIE',
-            :wipe_db_on_cookie_change => true
-          }}
+          let(:params) do
+            {
+              config_cluster: true,
+              cluster_nodes: ['hare-1', 'hare-2'],
+              cluster_node_type: 'ram',
+              erlang_cookie: 'TESTCOOKIE',
+              wipe_db_on_cookie_change: true
+            }
+          end
+
+          it 'contains the rabbitmq_erlang_cookie' do
+            is_expected.to contain_rabbitmq_erlang_cookie('/var/lib/rabbitmq/.erlang.cookie')
+          end
+        end
+
+        describe 'with erlang_cookie set but without config_cluster' do
+          let(:params) do
+            {
+              config_cluster: false,
+              erlang_cookie: 'TESTCOOKIE'
+            }
+          end
+
           it 'contains the rabbitmq_erlang_cookie' do
-            should contain_rabbitmq_erlang_cookie('/var/lib/rabbitmq/.erlang.cookie')
+            is_expected.to contain_rabbitmq_erlang_cookie('/var/lib/rabbitmq/.erlang.cookie')
+          end
+        end
+
+        describe 'without erlang_cookie and without config_cluster' do
+          let(:params) do
+            {
+              config_cluster: false
+            }
+          end
+
+          it 'contains the rabbitmq_erlang_cookie' do
+            is_expected.not_to contain_rabbitmq_erlang_cookie('/var/lib/rabbitmq/.erlang.cookie')
           end
         end
 
         describe 'and sets appropriate configuration' do
-          let(:params) {{
-            :config_cluster           => true,
-            :cluster_nodes            => ['hare-1', 'hare-2'],
-            :cluster_node_type        => 'ram',
-            :erlang_cookie            => 'ORIGINAL',
-            :wipe_db_on_cookie_change => true
-          }}
-          it 'for cluster_nodes' do
-            should contain_file('rabbitmq.config').with({
-              'content' => /cluster_nodes.*\['rabbit@hare-1', 'rabbit@hare-2'\], ram/,
-            })
+          let(:params) do
+            {
+              config_cluster: true,
+              cluster_nodes: ['hare-1', 'hare-2'],
+              cluster_node_type: 'ram',
+              erlang_cookie: 'ORIGINAL',
+              wipe_db_on_cookie_change: true
+            }
           end
 
+          it 'for cluster_nodes' do
+            is_expected.to contain_file('rabbitmq.config').with('content' => %r{cluster_nodes.*\['rabbit@hare-1', 'rabbit@hare-2'\], ram})
+          end
         end
       end
 
       describe 'rabbitmq-env configuration' do
-        let(:params) {{ :environment_variables => {
-          'NODE_IP_ADDRESS'    => '1.1.1.1',
-          'NODE_PORT'          => '5656',
-          'NODENAME'           => 'HOSTNAME',
-          'SERVICENAME'        => 'RabbitMQ',
-          'CONSOLE_LOG'        => 'RabbitMQ.debug',
-          'CTL_ERL_ARGS'       => 'verbose',
-          'SERVER_ERL_ARGS'    => 'v',
-          'SERVER_START_ARGS'  => 'debug'
-        }}}
-        it 'should set environment variables' do
-          should contain_file('rabbitmq-env.config') \
-            .with_content(/NODE_IP_ADDRESS=1.1.1.1/) \
-            .with_content(/NODE_PORT=5656/) \
-            .with_content(/NODENAME=HOSTNAME/) \
-            .with_content(/SERVICENAME=RabbitMQ/) \
-            .with_content(/CONSOLE_LOG=RabbitMQ.debug/) \
-            .with_content(/CTL_ERL_ARGS=verbose/) \
-            .with_content(/SERVER_ERL_ARGS=v/) \
-            .with_content(/SERVER_START_ARGS=debug/)
+        context 'with default params' do
+          it 'sets environment variables' do
+            is_expected.to contain_file('rabbitmq-env.config'). \
+              with_content(%r{ERL_INETRC=/etc/rabbitmq/inetrc})
+          end
+        end
+
+        context 'with environment_variables set' do
+          let(:params) do
+            { environment_variables: {
+              'NODE_IP_ADDRESS' => '1.1.1.1',
+              'NODE_PORT'          => '5656',
+              'NODENAME'           => 'HOSTNAME',
+              'SERVICENAME'        => 'RabbitMQ',
+              'CONSOLE_LOG'        => 'RabbitMQ.debug',
+              'CTL_ERL_ARGS'       => 'verbose',
+              'SERVER_ERL_ARGS'    => 'v',
+              'SERVER_START_ARGS'  => 'debug'
+            } }
+          end
+
+          it 'sets environment variables' do
+            is_expected.to contain_file('rabbitmq-env.config'). \
+              with_content(%r{NODE_IP_ADDRESS=1.1.1.1}). \
+              with_content(%r{NODE_PORT=5656}). \
+              with_content(%r{NODENAME=HOSTNAME}). \
+              with_content(%r{SERVICENAME=RabbitMQ}). \
+              with_content(%r{CONSOLE_LOG=RabbitMQ.debug}). \
+              with_content(%r{CTL_ERL_ARGS=verbose}). \
+              with_content(%r{SERVER_ERL_ARGS=v}). \
+              with_content(%r{SERVER_START_ARGS=debug})
+          end
         end
       end
 
       context 'delete_guest_user' do
         describe 'should do nothing by default' do
-          it { should_not contain_rabbitmq_user('guest') }
+          it { is_expected.not_to contain_rabbitmq_user('guest') }
         end
 
         describe 'delete user when delete_guest_user set' do
-          let(:params) {{ :delete_guest_user => true }}
+          let(:params) { { delete_guest_user: true } }
+
           it 'removes the user' do
-            should contain_rabbitmq_user('guest').with(
+            is_expected.to contain_rabbitmq_user('guest').with(
               'ensure'   => 'absent',
               'provider' => 'rabbitmqctl'
             )
@@ -530,431 +485,925 @@ rabbitmq hard nofile 1234
 
       context 'configuration setting' do
         describe 'node_ip_address when set' do
-          let(:params) {{ :node_ip_address => '172.0.0.1' }}
-          it 'should set NODE_IP_ADDRESS to specified value' do
-            should contain_file('rabbitmq-env.config').
+          let(:params) { { node_ip_address: '172.0.0.1' } }
+
+          it 'sets NODE_IP_ADDRESS to specified value' do
+            is_expected.to contain_file('rabbitmq-env.config').
               with_content(%r{NODE_IP_ADDRESS=172\.0\.0\.1})
           end
         end
 
         describe 'stomp by default' do
-          it 'should not specify stomp parameters in rabbitmq.config' do
-            should contain_file('rabbitmq.config').without({
-              'content' => /stomp/,})
+          it 'does not specify stomp parameters in rabbitmq.config' do
+            is_expected.to contain_file('rabbitmq.config').without('content' => %r{stomp})
           end
         end
         describe 'stomp when set' do
-          let(:params) {{ :config_stomp => true, :stomp_port => 5679 }}
-          it 'should specify stomp port in rabbitmq.config' do
-            should contain_file('rabbitmq.config').with({
-              'content' => /rabbitmq_stomp.*tcp_listeners, \[5679\]/m,
-            })
+          let(:params) { { config_stomp: true, stomp_port: 5679 } }
+
+          it 'specifies stomp port in rabbitmq.config' do
+            is_expected.to contain_file('rabbitmq.config').with('content' => %r{rabbitmq_stomp.*tcp_listeners, \[5679\]}m)
           end
         end
         describe 'stomp when set ssl port w/o ssl enabled' do
-          let(:params) {{ :config_stomp => true, :stomp_port => 5679, :ssl => false, :ssl_stomp_port => 5680 }}
-          it 'should not configure ssl_listeners in rabbitmq.config' do
-            should contain_file('rabbitmq.config').without({
-              'content' => /rabbitmq_stomp.*ssl_listeners, \[5680\]/m,
-            })
+          let(:params) { { config_stomp: true, stomp_port: 5679, ssl: false, ssl_stomp_port: 5680 } }
+
+          it 'does not configure ssl_listeners in rabbitmq.config' do
+            is_expected.to contain_file('rabbitmq.config').without('content' => %r{rabbitmq_stomp.*ssl_listeners, \[5680\]}m)
           end
         end
         describe 'stomp when set with ssl' do
-          let(:params) {{ :config_stomp => true, :stomp_port => 5679, :ssl => true, :ssl_stomp_port => 5680 }}
-          it 'should specify stomp port and ssl stomp port in rabbitmq.config' do
-            should contain_file('rabbitmq.config').with({
-              'content' => /rabbitmq_stomp.*tcp_listeners, \[5679\].*ssl_listeners, \[5680\]/m,
-            })
+          let(:params) { { config_stomp: true, stomp_port: 5679, ssl: true, ssl_stomp_port: 5680 } }
+
+          it 'specifies stomp port and ssl stomp port in rabbitmq.config' do
+            is_expected.to contain_file('rabbitmq.config').with('content' => %r{rabbitmq_stomp.*tcp_listeners, \[5679\].*ssl_listeners, \[5680\]}m)
           end
         end
       end
 
       describe 'configuring ldap authentication' do
         let :params do
-          { :config_stomp          => true,
-            :ldap_auth             => true,
-            :ldap_server           => 'ldap.example.com',
-            :ldap_user_dn_pattern  => 'ou=users,dc=example,dc=com',
-            :ldap_other_bind       => 'as_user',
-            :ldap_use_ssl          => false,
-            :ldap_port             => '389',
-            :ldap_log              => true,
-            :ldap_config_variables => { 'foo' => 'bar' }
-          }
+          { config_stomp: true,
+            ldap_auth: true,
+            ldap_server: 'ldap.example.com',
+            ldap_user_dn_pattern: 'ou=users,dc=example,dc=com',
+            ldap_other_bind: 'as_user',
+            ldap_use_ssl: false,
+            ldap_port: 389,
+            ldap_log: true,
+            ldap_config_variables: { 'foo' => 'bar' } }
         end
 
-        it { should contain_rabbitmq_plugin('rabbitmq_auth_backend_ldap') }
+        it { is_expected.to contain_rabbitmq_plugin('rabbitmq_auth_backend_ldap') }
 
-        it 'should contain ldap parameters' do
+        it 'contains ldap parameters' do
           verify_contents(catalogue, 'rabbitmq.config',
                           ['[', '  {rabbit, [', '    {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_ldap]},', '  ]}',
-                            '  {rabbitmq_auth_backend_ldap, [', '    {other_bind, as_user},',
-                            '    {servers, ["ldap.example.com"]},',
-                            '    {user_dn_pattern, "ou=users,dc=example,dc=com"},', '    {use_ssl, false},',
-                            '    {port, 389},', '    {foo, bar},', '    {log, true}'])
+                           '  {rabbitmq_auth_backend_ldap, [', '    {other_bind, as_user},',
+                           '    {servers, ["ldap.example.com"]},',
+                           '    {user_dn_pattern, "ou=users,dc=example,dc=com"},', '    {use_ssl, false},',
+                           '    {port, 389},', '    {foo, bar},', '    {log, true}'])
         end
       end
 
       describe 'configuring ldap authentication' do
         let :params do
-          { :config_stomp         => false,
-            :ldap_auth            => true,
-            :ldap_server          => 'ldap.example.com',
-            :ldap_user_dn_pattern => 'ou=users,dc=example,dc=com',
-            :ldap_other_bind      => 'as_user',
-            :ldap_use_ssl         => false,
-            :ldap_port            => '389',
-            :ldap_log             => true,
-            :ldap_config_variables => { 'foo' => 'bar' }
-          }
+          { config_stomp: false,
+            ldap_auth: true,
+            ldap_server: 'ldap.example.com',
+            ldap_user_dn_pattern: 'ou=users,dc=example,dc=com',
+            ldap_other_bind: 'as_user',
+            ldap_use_ssl: false,
+            ldap_port: 389,
+            ldap_log: true,
+            ldap_config_variables: { 'foo' => 'bar' } }
         end
 
-        it { should contain_rabbitmq_plugin('rabbitmq_auth_backend_ldap') }
+        it { is_expected.to contain_rabbitmq_plugin('rabbitmq_auth_backend_ldap') }
 
-        it 'should contain ldap parameters' do
+        it 'contains ldap parameters' do
           verify_contents(catalogue, 'rabbitmq.config',
                           ['[', '  {rabbit, [', '    {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_ldap]},', '  ]}',
-                            '  {rabbitmq_auth_backend_ldap, [', '    {other_bind, as_user},',
-                            '    {servers, ["ldap.example.com"]},',
-                            '    {user_dn_pattern, "ou=users,dc=example,dc=com"},', '    {use_ssl, false},',
-                            '    {port, 389},', '    {foo, bar},', '    {log, true}'])
+                           '  {rabbitmq_auth_backend_ldap, [', '    {other_bind, as_user},',
+                           '    {servers, ["ldap.example.com"]},',
+                           '    {user_dn_pattern, "ou=users,dc=example,dc=com"},', '    {use_ssl, false},',
+                           '    {port, 389},', '    {foo, bar},', '    {log, true}'])
+        end
+      end
+
+      describe 'configuring ldap authentication' do
+        let :params do
+          { config_stomp: false,
+            ldap_auth: true,
+            ldap_server: 'ldap.example.com',
+            ldap_other_bind: 'as_user',
+            ldap_use_ssl: false,
+            ldap_port: 389,
+            ldap_log: true,
+            ldap_config_variables: { 'foo' => 'bar' } }
+        end
+
+        it { is_expected.to contain_rabbitmq_plugin('rabbitmq_auth_backend_ldap') }
+
+        it 'does not set user_dn_pattern when none is specified' do
+          verify_contents(catalogue, 'rabbitmq.config',
+                          ['[', '  {rabbit, [', '    {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_ldap]},', '  ]}',
+                           '  {rabbitmq_auth_backend_ldap, [', '    {other_bind, as_user},',
+                           '    {servers, ["ldap.example.com"]},',
+                           '    {use_ssl, false},',
+                           '    {port, 389},', '    {foo, bar},', '    {log, true}'])
+          content = catalogue.resource('file', 'rabbitmq.config').send(:parameters)[:content]
+          expect(content).not_to include 'user_dn_pattern'
+        end
+      end
+
+      describe 'configuring auth_backends' do
+        let :params do
+          { auth_backends: ['{baz, foo}', 'bar'] }
+        end
+
+        it 'contains auth_backends' do
+          verify_contents(catalogue, 'rabbitmq.config',
+                          ['    {auth_backends, [{baz, foo}, bar]},'])
+        end
+      end
+
+      describe 'auth_backends overrides ldap_auth' do
+        let :params do
+          { auth_backends: ['{baz, foo}', 'bar'],
+            ldap_auth: true }
+        end
+
+        it 'contains auth_backends' do
+          verify_contents(catalogue, 'rabbitmq.config',
+                          ['    {auth_backends, [{baz, foo}, bar]},'])
+        end
+      end
+
+      describe 'configuring shovel plugin' do
+        let :params do
+          {
+            config_shovel: true
+          }
+        end
+
+        it { is_expected.to contain_rabbitmq_plugin('rabbitmq_shovel') }
+
+        it { is_expected.to contain_rabbitmq_plugin('rabbitmq_shovel_management') }
+
+        describe 'with admin_enable false' do
+          let :params do
+            {
+              config_shovel: true,
+              admin_enable: false
+            }
+          end
+
+          it { is_expected.not_to contain_rabbitmq_plugin('rabbitmq_shovel_management') }
+        end
+
+        describe 'with static shovels' do
+          let :params do
+            {
+              config_shovel: true,
+              config_shovel_statics: {
+                'shovel_first' => '{sources,[{broker,"amqp://"}]},
+        {destinations,[{broker,"amqp://site1.example.com"}]},
+        {queue,<<"source_one">>}',
+                'shovel_second' => '{sources,[{broker,"amqp://"}]},
+        {destinations,[{broker,"amqp://site2.example.com"}]},
+        {queue,<<"source_two">>}'
+              }
+            }
+          end
+
+          it 'generates correct configuration' do
+            verify_contents(catalogue, 'rabbitmq.config', [
+                              '  {rabbitmq_shovel,',
+                              '    [{shovels,[',
+                              '      {shovel_first,[{sources,[{broker,"amqp://"}]},',
+                              '        {destinations,[{broker,"amqp://site1.example.com"}]},',
+                              '        {queue,<<"source_one">>}]},',
+                              '      {shovel_second,[{sources,[{broker,"amqp://"}]},',
+                              '        {destinations,[{broker,"amqp://site2.example.com"}]},',
+                              '        {queue,<<"source_two">>}]}',
+                              '    ]}]}'
+                            ])
+          end
+        end
+      end
+
+      describe 'configuring shovel plugin' do
+        let :params do
+          {
+            config_shovel: true
+          }
+        end
+
+        it { is_expected.to contain_rabbitmq_plugin('rabbitmq_shovel') }
+
+        it { is_expected.to contain_rabbitmq_plugin('rabbitmq_shovel_management') }
+
+        describe 'with admin_enable false' do
+          let :params do
+            {
+              config_shovel: true,
+              admin_enable: false
+            }
+          end
+
+          it { is_expected.not_to contain_rabbitmq_plugin('rabbitmq_shovel_management') }
+        end
+
+        describe 'with static shovels' do
+          let :params do
+            {
+              config_shovel: true,
+              config_shovel_statics: {
+                'shovel_first' => '{sources,[{broker,"amqp://"}]},
+        {destinations,[{broker,"amqp://site1.example.com"}]},
+        {queue,<<"source_one">>}',
+                'shovel_second' => '{sources,[{broker,"amqp://"}]},
+        {destinations,[{broker,"amqp://site2.example.com"}]},
+        {queue,<<"source_two">>}'
+              }
+            }
+          end
+
+          it 'generates correct configuration' do
+            verify_contents(catalogue, 'rabbitmq.config', [
+                              '  {rabbitmq_shovel,',
+                              '    [{shovels,[',
+                              '      {shovel_first,[{sources,[{broker,"amqp://"}]},',
+                              '        {destinations,[{broker,"amqp://site1.example.com"}]},',
+                              '        {queue,<<"source_one">>}]},',
+                              '      {shovel_second,[{sources,[{broker,"amqp://"}]},',
+                              '        {destinations,[{broker,"amqp://site2.example.com"}]},',
+                              '        {queue,<<"source_two">>}]}',
+                              '    ]}]}'
+                            ])
+          end
         end
       end
 
       describe 'default_user and default_pass set' do
-        let(:params) {{ :default_user => 'foo', :default_pass => 'bar' }}
-        it 'should set default_user and default_pass to specified values' do
-          should contain_file('rabbitmq.config').with({
-            'content' => /default_user, <<"foo">>.*default_pass, <<"bar">>/m,
-          })
+        let(:params) { { default_user: 'foo', default_pass: 'bar' } }
+
+        it 'sets default_user and default_pass to specified values' do
+          is_expected.to contain_file('rabbitmq.config').with('content' => %r{default_user, <<"foo">>.*default_pass, <<"bar">>}m)
         end
       end
 
       describe 'interfaces option with no ssl' do
-        let(:params) {
-          { :interface => '0.0.0.0',
-        } }
+        let(:params) do
+          { interface: '0.0.0.0' }
+        end
 
-        it 'should set ssl options to specified values' do
-          should contain_file('rabbitmq.config').with_content(%r{tcp_listeners, \[\{"0.0.0.0", 5672\}\]})
+        it 'sets ssl options to specified values' do
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{tcp_listeners, \[\{"0.0.0.0", 5672\}\]})
         end
       end
 
-      describe 'ssl options' do
-        let(:params) {
-          { :ssl => true,
-            :ssl_port => 3141,
-            :ssl_cacert => '/path/to/cacert',
-            :ssl_cert => '/path/to/cert',
-            :ssl_key => '/path/to/key'
-        } }
-
-        it 'should set ssl options to specified values' do
-          should contain_file('rabbitmq.config').with_content(
+      describe 'ssl options and mangament_ssl false' do
+        let(:params) do
+          { ssl: true,
+            ssl_port: 3141,
+            ssl_cacert: '/path/to/cacert',
+            ssl_cert: '/path/to/cert',
+            ssl_key: '/path/to/key',
+            ssl_secure_renegotiate: true,
+            ssl_reuse_sessions: true,
+            ssl_honor_cipher_order: true,
+            ssl_dhfile: :undef,
+            management_ssl: false,
+            management_port: 13_142 }
+        end
+
+        it 'sets ssl options to specified values' do
+          is_expected.to contain_file('rabbitmq.config').with_content(
             %r{ssl_listeners, \[3141\]}
           )
-          should contain_file('rabbitmq.config').with_content(
+          is_expected.to contain_file('rabbitmq.config').with_content(
             %r{ssl_options, \[}
           )
-          should contain_file('rabbitmq.config').with_content(
+          is_expected.to contain_file('rabbitmq.config').with_content(
             %r{cacertfile,"/path/to/cacert"}
           )
-          should contain_file('rabbitmq.config').with_content(
+          is_expected.to contain_file('rabbitmq.config').with_content(
             %r{certfile,"/path/to/cert"}
           )
-          should contain_file('rabbitmq.config').with_content(
+          is_expected.to contain_file('rabbitmq.config').with_content(
             %r{keyfile,"/path/to/key"}
           )
+          is_expected.to contain_file('rabbitmq.config').with_content(
+            %r{secure_renegotiate,true}
+          )
+          is_expected.to contain_file('rabbitmq.config').with_content(
+            %r{reuse_sessions,true}
+          )
+          is_expected.to contain_file('rabbitmq.config').with_content(
+            %r{honor_cipher_order,true}
+          )
+          is_expected.to contain_file('rabbitmq.config').without_content(
+            %r{dhfile,}
+          )
+        end
+        it 'sets non ssl port for management port' do
+          is_expected.to contain_file('rabbitmq.config').with_content(
+            %r{port, 13142}
+          )
+          is_expected.to contain_file('rabbitmqadmin.conf').with_content(
+            %r{port\s=\s13142}
+          )
         end
       end
 
+      describe 'ssl options and mangament_ssl true' do
+        let(:params) do
+          { ssl: true,
+            ssl_port: 3141,
+            ssl_cacert: '/path/to/cacert',
+            ssl_cert: '/path/to/cert',
+            ssl_key: '/path/to/key',
+            ssl_secure_renegotiate: true,
+            ssl_reuse_sessions: true,
+            ssl_honor_cipher_order: true,
+            ssl_dhfile: :undef,
+
+            management_ssl: true,
+            ssl_management_port: 13_141 }
+        end
 
-      describe 'ssl options with ssl_interfaces' do
-        let(:params) {
-          { :ssl => true,
-            :ssl_port => 3141,
-            :ssl_interface => '0.0.0.0',
-            :ssl_cacert => '/path/to/cacert',
-            :ssl_cert => '/path/to/cert',
-            :ssl_key => '/path/to/key'
-        } }
-
-        it 'should set ssl options to specified values' do
-          should contain_file('rabbitmq.config').with_content(%r{ssl_listeners, \[\{"0.0.0.0", 3141\}\]})
-          should contain_file('rabbitmq.config').with_content(%r{cacertfile,"/path/to/cacert"})
-          should contain_file('rabbitmq.config').with_content(%r{certfile,"/path/to/cert"})
-          should contain_file('rabbitmq.config').with_content(%r{keyfile,"/path/to/key})
+        it 'sets ssl options to specified values' do
+          is_expected.to contain_file('rabbitmq.config').with_content(
+            %r{ssl_listeners, \[3141\]}
+          )
+          is_expected.to contain_file('rabbitmq.config').with_content(
+            %r{ssl_opts, }
+          )
+          is_expected.to contain_file('rabbitmq.config').with_content(
+            %r{ssl_options, \[}
+          )
+          is_expected.to contain_file('rabbitmq.config').with_content(
+            %r{cacertfile,"/path/to/cacert"}
+          )
+          is_expected.to contain_file('rabbitmq.config').with_content(
+            %r{certfile,"/path/to/cert"}
+          )
+          is_expected.to contain_file('rabbitmq.config').with_content(
+            %r{keyfile,"/path/to/key"}
+          )
+          is_expected.to contain_file('rabbitmq.config').with_content(
+            %r{secure_renegotiate,true}
+          )
+          is_expected.to contain_file('rabbitmq.config').with_content(
+            %r{reuse_sessions,true}
+          )
+          is_expected.to contain_file('rabbitmq.config').with_content(
+            %r{honor_cipher_order,true}
+          )
+          is_expected.to contain_file('rabbitmq.config').without_content(
+            %r{dhfile,}
+          )
+        end
+        it 'sets ssl managment port to specified values' do
+          is_expected.to contain_file('rabbitmq.config').with_content(
+            %r{port, 13141}
+          )
+        end
+        it 'sets ssl options in the rabbitmqadmin.conf' do
+          is_expected.to contain_file('rabbitmqadmin.conf').with_content(
+            %r{ssl_ca_cert_file\s=\s/path/to/cacert}
+          )
+          is_expected.to contain_file('rabbitmqadmin.conf').with_content(
+            %r{ssl_cert_file\s=\s/path/to/cert}
+          )
+          is_expected.to contain_file('rabbitmqadmin.conf').with_content(
+            %r{ssl_key_file\s=\s/path/to/key}
+          )
+          is_expected.to contain_file('rabbitmqadmin.conf').with_content(
+            %r{hostname\s=\s}
+          )
+          is_expected.to contain_file('rabbitmqadmin.conf').with_content(
+            %r{port\s=\s13141}
+          )
         end
       end
 
+      describe 'ssl options' do
+        let(:params) do
+          { ssl: true,
+            ssl_port: 3141,
+            ssl_cacert: '/path/to/cacert',
+            ssl_cert: '/path/to/cert',
+            ssl_key: '/path/to/key',
+            ssl_secure_renegotiate: true,
+            ssl_reuse_sessions: true,
+            ssl_honor_cipher_order: true,
+            ssl_dhfile: :undef }
+        end
 
+        it 'sets ssl options to specified values' do
+          is_expected.to contain_file('rabbitmq.config').with_content(
+            %r{ssl_listeners, \[3141\]}
+          )
+          is_expected.to contain_file('rabbitmq.config').with_content(
+            %r{ssl_options, \[}
+          )
+          is_expected.to contain_file('rabbitmq.config').with_content(
+            %r{cacertfile,"/path/to/cacert"}
+          )
+          is_expected.to contain_file('rabbitmq.config').with_content(
+            %r{certfile,"/path/to/cert"}
+          )
+          is_expected.to contain_file('rabbitmq.config').with_content(
+            %r{keyfile,"/path/to/key"}
+          )
+          is_expected.to contain_file('rabbitmq.config').with_content(
+            %r{secure_renegotiate,true}
+          )
+          is_expected.to contain_file('rabbitmq.config').with_content(
+            %r{reuse_sessions,true}
+          )
+          is_expected.to contain_file('rabbitmq.config').with_content(
+            %r{honor_cipher_order,true}
+          )
+          is_expected.to contain_file('rabbitmq.config').without_content(
+            %r{dhfile,}
+          )
+        end
+      end
+
+      describe 'ssl options with ssl_interfaces' do
+        let(:params) do
+          { ssl: true,
+            ssl_port: 3141,
+            ssl_interface: '0.0.0.0',
+            ssl_cacert: '/path/to/cacert',
+            ssl_cert: '/path/to/cert',
+            ssl_key: '/path/to/key' }
+        end
+
+        it 'sets ssl options to specified values' do
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{ssl_listeners, \[\{"0.0.0.0", 3141\}\]})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{cacertfile,"/path/to/cacert"})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{certfile,"/path/to/cert"})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{keyfile,"/path/to/key})
+        end
+      end
 
       describe 'ssl options with ssl_only' do
-        let(:params) {
-          { :ssl => true,
-            :ssl_only => true,
-            :ssl_port => 3141,
-            :ssl_cacert => '/path/to/cacert',
-            :ssl_cert => '/path/to/cert',
-            :ssl_key => '/path/to/key'
-        } }
-
-        it 'should set ssl options to specified values' do
-          should contain_file('rabbitmq.config').with_content(%r{tcp_listeners, \[\]})
-          should contain_file('rabbitmq.config').with_content(%r{ssl_listeners, \[3141\]})
-          should contain_file('rabbitmq.config').with_content(%r{ssl_options, \[})
-          should contain_file('rabbitmq.config').with_content(%r{cacertfile,"/path/to/cacert"})
-          should contain_file('rabbitmq.config').with_content(%r{certfile,"/path/to/cert"})
-          should contain_file('rabbitmq.config').with_content(%r{keyfile,"/path/to/key})
+        let(:params) do
+          { ssl: true,
+            ssl_only: true,
+            ssl_port: 3141,
+            ssl_cacert: '/path/to/cacert',
+            ssl_cert: '/path/to/cert',
+            ssl_key: '/path/to/key' }
+        end
+
+        it 'sets ssl options to specified values' do
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{tcp_listeners, \[\]})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{ssl_listeners, \[3141\]})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{ssl_options, \[})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{cacertfile,"/path/to/cacert"})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{certfile,"/path/to/cert"})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{keyfile,"/path/to/key})
+        end
+        it 'does not set TCP listener environment defaults' do
+          is_expected.to contain_file('rabbitmq-env.config'). \
+            without_content(%r{NODE_PORT=}). \
+            without_content(%r{NODE_IP_ADDRESS=})
         end
       end
 
       describe 'ssl options with ssl_only and ssl_interfaces' do
-        let(:params) {
-          { :ssl => true,
-            :ssl_only => true,
-            :ssl_port => 3141,
-            :ssl_interface => '0.0.0.0',
-            :ssl_cacert => '/path/to/cacert',
-            :ssl_cert => '/path/to/cert',
-            :ssl_key => '/path/to/key'
-        } }
-
-        it 'should set ssl options to specified values' do
-          should contain_file('rabbitmq.config').with_content(%r{tcp_listeners, \[\]})
-          should contain_file('rabbitmq.config').with_content(%r{ssl_listeners, \[\{"0.0.0.0", 3141\}\]})
-          should contain_file('rabbitmq.config').with_content(%r{cacertfile,"/path/to/cacert"})
-          should contain_file('rabbitmq.config').with_content(%r{certfile,"/path/to/cert"})
-          should contain_file('rabbitmq.config').with_content(%r{keyfile,"/path/to/key})
+        let(:params) do
+          { ssl: true,
+            ssl_only: true,
+            ssl_port: 3141,
+            ssl_interface: '0.0.0.0',
+            ssl_cacert: '/path/to/cacert',
+            ssl_cert: '/path/to/cert',
+            ssl_key: '/path/to/key' }
         end
-      end
 
-      describe 'ssl options with specific ssl versions' do
-        let(:params) {
-          { :ssl => true,
-            :ssl_port => 3141,
-            :ssl_cacert => '/path/to/cacert',
-            :ssl_cert => '/path/to/cert',
-            :ssl_key => '/path/to/key',
-            :ssl_versions => ['tlsv1.2', 'tlsv1.1']
-        } }
-
-        it 'should set ssl options to specified values' do
-          should contain_file('rabbitmq.config').with_content(%r{ssl_listeners, \[3141\]})
-          should contain_file('rabbitmq.config').with_content(%r{ssl_options, \[})
-          should contain_file('rabbitmq.config').with_content(%r{cacertfile,"/path/to/cacert"})
-          should contain_file('rabbitmq.config').with_content(%r{certfile,"/path/to/cert"})
-          should contain_file('rabbitmq.config').with_content(%r{keyfile,"/path/to/key})
-          should contain_file('rabbitmq.config').with_content(%r{ssl, \[\{versions, \['tlsv1.1', 'tlsv1.2'\]\}\]})
-          should contain_file('rabbitmq.config').with_content(%r{versions, \['tlsv1.1', 'tlsv1.2'\]})
+        it 'sets ssl options to specified values' do
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{tcp_listeners, \[\]})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{ssl_listeners, \[\{"0.0.0.0", 3141\}\]})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{cacertfile,"/path/to/cacert"})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{certfile,"/path/to/cert"})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{keyfile,"/path/to/key})
         end
       end
 
-      describe 'ssl options with invalid ssl_versions type' do
-        let(:params) {
-          { :ssl => true,
-            :ssl_port => 3141,
-            :ssl_cacert => '/path/to/cacert',
-            :ssl_cert => '/path/to/cert',
-            :ssl_key => '/path/to/key',
-            :ssl_versions => 'tlsv1.2, tlsv1.1'
-        } }
+      describe 'ssl options with specific ssl versions' do
+        let(:params) do
+          { ssl: true,
+            ssl_port: 3141,
+            ssl_cacert: '/path/to/cacert',
+            ssl_cert: '/path/to/cert',
+            ssl_key: '/path/to/key',
+            ssl_versions: ['tlsv1.2', 'tlsv1.1'] }
+        end
 
-        it 'fails' do
-          expect { catalogue }.to raise_error(Puppet::Error, /is not an Array/)
+        it 'sets ssl options to specified values' do
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{ssl_listeners, \[3141\]})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{ssl_options, \[})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{cacertfile,"/path/to/cacert"})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{certfile,"/path/to/cert"})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{keyfile,"/path/to/key})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{ssl, \[\{versions, \['tlsv1.1', 'tlsv1.2'\]\}\]})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{versions, \['tlsv1.1', 'tlsv1.2'\]})
         end
       end
 
       describe 'ssl options with ssl_versions and not ssl' do
-        let(:params) {
-          { :ssl => false,
-            :ssl_port => 3141,
-            :ssl_cacert => '/path/to/cacert',
-            :ssl_cert => '/path/to/cert',
-            :ssl_key => '/path/to/key',
-            :ssl_versions => ['tlsv1.2', 'tlsv1.1']
-        } }
+        let(:params) do
+          { ssl: false,
+            ssl_port: 3141,
+            ssl_cacert: '/path/to/cacert',
+            ssl_cert: '/path/to/cert',
+            ssl_key: '/path/to/key',
+            ssl_versions: ['tlsv1.2', 'tlsv1.1'] }
+        end
 
         it 'fails' do
-          expect { catalogue }.to raise_error(Puppet::Error, /\$ssl_versions requires that \$ssl => true/)
+          expect { catalogue }.to raise_error(Puppet::Error, %r{\$ssl_versions requires that \$ssl => true})
         end
       end
 
       describe 'ssl options with ssl ciphers' do
-        let(:params) {
-          { :ssl => true,
-            :ssl_port => 3141,
-            :ssl_cacert => '/path/to/cacert',
-            :ssl_cert => '/path/to/cert',
-            :ssl_key => '/path/to/key',
-            :ssl_ciphers => ['ecdhe_rsa,aes_256_cbc,sha', 'dhe_rsa,aes_256_cbc,sha']
-        } }
-
-        it 'should set ssl ciphers to specified values' do
-          should contain_file('rabbitmq.config').with_content(%r{ciphers,\[[[:space:]]+{dhe_rsa,aes_256_cbc,sha},[[:space:]]+{ecdhe_rsa,aes_256_cbc,sha}[[:space:]]+\]})
+        let(:params) do
+          { ssl: true,
+            ssl_port: 3141,
+            ssl_cacert: '/path/to/cacert',
+            ssl_cert: '/path/to/cert',
+            ssl_key: '/path/to/key',
+            ssl_ciphers: ['ecdhe_rsa,aes_256_cbc,sha', 'dhe_rsa,aes_256_cbc,sha'] }
+        end
+
+        it 'sets ssl ciphers to specified values' do
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{ciphers,\[[[:space:]]+{dhe_rsa,aes_256_cbc,sha},[[:space:]]+{ecdhe_rsa,aes_256_cbc,sha}[[:space:]]+\]})
         end
       end
 
       describe 'ssl admin options with specific ssl versions' do
-        let(:params) {
-          { :ssl => true,
-            :ssl_management_port => 5926,
-            :ssl_cacert => '/path/to/cacert',
-            :ssl_cert => '/path/to/cert',
-            :ssl_key => '/path/to/key',
-            :ssl_versions => ['tlsv1.2', 'tlsv1.1'],
-            :admin_enable => true
-        } }
-
-        it 'should set admin ssl opts to specified values' do
-          should contain_file('rabbitmq.config').with_content(%r{rabbitmq_management, \[})
-          should contain_file('rabbitmq.config').with_content(%r{listener, \[})
-          should contain_file('rabbitmq.config').with_content(%r{port, 5926\}})
-          should contain_file('rabbitmq.config').with_content(%r{ssl, true\}})
-          should contain_file('rabbitmq.config').with_content(%r{ssl_opts, \[\{cacertfile, "/path/to/cacert"\},})
-          should contain_file('rabbitmq.config').with_content(%r{certfile, "/path/to/cert"\},})
-          should contain_file('rabbitmq.config').with_content(%r{keyfile, "/path/to/key"\}})
-          should contain_file('rabbitmq.config').with_content(%r{,\{versions, \['tlsv1.1', 'tlsv1.2'\]\}[\r\n ]*\]\}})
+        let(:params) do
+          { ssl: true,
+            ssl_management_port: 5926,
+            ssl_cacert: '/path/to/cacert',
+            ssl_cert: '/path/to/cert',
+            ssl_key: '/path/to/key',
+            ssl_versions: ['tlsv1.2', 'tlsv1.1'],
+            admin_enable: true }
+        end
+
+        it 'sets admin ssl opts to specified values' do
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{rabbitmq_management, \[})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{listener, \[})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{port, 5926\}})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{ssl, true\}})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{ssl_opts, \[})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{cacertfile, "/path/to/cacert"\},})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{certfile, "/path/to/cert"\},})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{keyfile, "/path/to/key"\}})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{,\{versions, \['tlsv1.1', 'tlsv1.2'\]\}})
+        end
+      end
+
+      describe 'ssl with ssl_dhfile' do
+        let(:params) do
+          { ssl: true,
+            ssl_interface: '0.0.0.0',
+            ssl_dhfile: '/etc/pki/tls/dh-params.pem' }
+        end
+
+        it { is_expected.to contain_file('rabbitmq.config').with_content(%r{dhfile, "/etc/pki/tls/dh-params\.pem}) }
+      end
+
+      describe 'ssl with ssl_dhfile unset' do
+        let(:params) do
+          { ssl: true,
+            ssl_interface: '0.0.0.0',
+            ssl_dhfile: :undef }
         end
+
+        it { is_expected.to contain_file('rabbitmq.config').without_content(%r{dhfile,}) }
+      end
+
+      describe 'ssl with ssl_secure_renegotiate false' do
+        let(:params) do
+          { ssl: true,
+            ssl_interface: '0.0.0.0',
+            ssl_secure_renegotiate: false }
+        end
+
+        it { is_expected.to contain_file('rabbitmq.config').with_content(%r{secure_renegotiate,false}) }
+      end
+
+      describe 'ssl with ssl_reuse_sessions false' do
+        let(:params) do
+          { ssl: true,
+            ssl_interface: '0.0.0.0',
+            ssl_reuse_sessions: false }
+        end
+
+        it { is_expected.to contain_file('rabbitmq.config').with_content(%r{reuse_sessions,false}) }
+      end
+
+      describe 'ssl with ssl_honor_cipher_order false' do
+        let(:params) do
+          { ssl: true,
+            ssl_interface: '0.0.0.0',
+            ssl_honor_cipher_order: false }
+        end
+
+        it { is_expected.to contain_file('rabbitmq.config').with_content(%r{honor_cipher_order,false}) }
       end
 
       describe 'ssl admin options' do
-        let(:params) {
-          { :ssl => true,
-            :ssl_management_port => 3141,
-            :ssl_cacert => '/path/to/cacert',
-            :ssl_cert => '/path/to/cert',
-            :ssl_key => '/path/to/key',
-            :admin_enable => true
-        } }
-
-        it 'should set rabbitmq_management ssl options to specified values' do
-          should contain_file('rabbitmq.config').with_content(%r{rabbitmq_management, \[})
-          should contain_file('rabbitmq.config').with_content(%r{listener, \[})
-          should contain_file('rabbitmq.config').with_content(%r{port, 3141\}})
-          should contain_file('rabbitmq.config').with_content(%r{ssl, true\}})
-          should contain_file('rabbitmq.config').with_content(%r{ssl_opts, \[\{cacertfile, "/path/to/cacert"\},})
-          should contain_file('rabbitmq.config').with_content(%r{certfile, "/path/to/cert"\},})
-          should contain_file('rabbitmq.config').with_content(%r{keyfile, "/path/to/key"\}[\r\n ]*\]\}})
+        let(:params) do
+          { ssl: true,
+            ssl_management_port: 3141,
+            ssl_cacert: '/path/to/cacert',
+            ssl_cert: '/path/to/cert',
+            ssl_key: '/path/to/key',
+            ssl_management_verify: 'verify_peer',
+            ssl_management_fail_if_no_peer_cert: true,
+            admin_enable: true }
+        end
+
+        it 'sets rabbitmq_management ssl options to specified values' do
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{rabbitmq_management, \[})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{listener, \[})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{port, 3141\}})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{ssl, true\}})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{ssl_opts, \[})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{verify,verify_peer\},})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{fail_if_no_peer_cert,true\}})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{cacertfile, "/path/to/cacert"\},})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{certfile, "/path/to/cert"\},})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{keyfile, "/path/to/key"\}})
         end
       end
 
       describe 'admin without ssl' do
-        let(:params) {
-          { :ssl => false,
-            :management_port => 3141,
-            :admin_enable => true
-        } }
+        let(:params) do
+          { ssl: false,
+            management_port: 3141,
+            admin_enable: true }
+        end
 
-        it 'should set rabbitmq_management  options to specified values' do
-          should contain_file('rabbitmq.config').with_content(%r{rabbitmq_management, \[})
-          should contain_file('rabbitmq.config').with_content(%r{listener, \[})
-          should contain_file('rabbitmq.config').with_content(%r{port, 3141\}})
+        it 'sets rabbitmq_management options to specified values' do
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{rabbitmq_management, \[})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{listener, \[})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{port, 3141\}})
         end
       end
 
       describe 'ssl admin options' do
-        let(:params) {
-          { :ssl => true,
-            :ssl_management_port => 3141,
-            :ssl_cacert => '/path/to/cacert',
-            :ssl_cert => '/path/to/cert',
-            :ssl_key => '/path/to/key',
-            :admin_enable => true
-        } }
-
-        it 'should set rabbitmq_management ssl options to specified values' do
-          should contain_file('rabbitmq.config').with_content(%r{rabbitmq_management, \[})
-          should contain_file('rabbitmq.config').with_content(%r{listener, \[})
-          should contain_file('rabbitmq.config').with_content(%r{port, 3141\},})
-          should contain_file('rabbitmq.config').with_content(%r{ssl, true\},})
-          should contain_file('rabbitmq.config').with_content(%r{ssl_opts, \[\{cacertfile, "/path/to/cacert"\},})
-          should contain_file('rabbitmq.config').with_content(%r{certfile, "/path/to/cert"\},})
-          should contain_file('rabbitmq.config').with_content(%r{keyfile, "/path/to/key"\}[\r\n ]*\]\}})
+        let(:params) do
+          { ssl: true,
+            ssl_management_port: 3141,
+            ssl_cacert: '/path/to/cacert',
+            ssl_cert: '/path/to/cert',
+            ssl_key: '/path/to/key',
+            admin_enable: true }
+        end
+
+        it 'sets rabbitmq_management ssl options to specified values' do
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{rabbitmq_management, \[})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{listener, \[})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{port, 3141\},})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{ssl, true\},})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{ssl_opts, \[})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{cacertfile, "/path/to/cacert"\},})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{certfile, "/path/to/cert"\},})
+          is_expected.to contain_file('rabbitmq.config').with_content(%r{keyfile, "/path/to/key"\}})
         end
       end
 
       describe 'admin without ssl' do
-        let(:params) {
-          { :ssl => false,
-            :management_port => 3141,
-            :admin_enable => true
-        } }
-
-        it 'should set rabbitmq_management  options to specified values' do
-          should contain_file('rabbitmq.config') \
-            .with_content(/\{rabbitmq_management, \[/) \
-            .with_content(/\{listener, \[/) \
-            .with_content(/\{port, 3141\}/)
+        let(:params) do
+          { ssl: false,
+            management_port: 3141,
+            admin_enable: true }
+        end
+
+        it 'sets rabbitmq_management options to specified values' do
+          is_expected.to contain_file('rabbitmq.config'). \
+            with_content(%r{\{rabbitmq_management, \[}). \
+            with_content(%r{\{listener, \[}). \
+            with_content(%r{\{port, 3141\}})
+        end
+      end
+
+      describe 'ipv6 enabled' do
+        let(:params) { { ipv6: true } }
+
+        it 'enables resolver inet6 in inetrc' do
+          is_expected.to contain_file('rabbitmq-inetrc').with_content(%r{{inet6, true}.})
+        end
+
+        context 'without other erl args' do
+          it 'enables inet6 distribution' do
+            is_expected.to contain_file('rabbitmq-env.config'). \
+              with_content(%r{^RABBITMQ_SERVER_ERL_ARGS="-proto_dist inet6_tcp"$}). \
+              with_content(%r{^RABBITMQ_CTL_ERL_ARGS="-proto_dist inet6_tcp"$})
+          end
+        end
+
+        context 'with other quoted erl args' do
+          let(:params) do
+            { ipv6: true,
+              environment_variables: { 'RABBITMQ_SERVER_ERL_ARGS' => '"some quoted args"',
+                                       'RABBITMQ_CTL_ERL_ARGS'    => '"other quoted args"' } }
+          end
+
+          it 'enables inet6 distribution and quote properly' do
+            is_expected.to contain_file('rabbitmq-env.config'). \
+              with_content(%r{^RABBITMQ_SERVER_ERL_ARGS="some quoted args -proto_dist inet6_tcp"$}). \
+              with_content(%r{^RABBITMQ_CTL_ERL_ARGS="other quoted args -proto_dist inet6_tcp"$})
+          end
+        end
+
+        context 'with other unquoted erl args' do
+          let(:params) do
+            { ipv6: true,
+              environment_variables: { 'RABBITMQ_SERVER_ERL_ARGS' => 'foo',
+                                       'RABBITMQ_CTL_ERL_ARGS'    => 'bar' } }
+          end
+
+          it 'enables inet6 distribution and quote properly' do
+            is_expected.to contain_file('rabbitmq-env.config'). \
+              with_content(%r{^RABBITMQ_SERVER_ERL_ARGS="foo -proto_dist inet6_tcp"$}). \
+              with_content(%r{^RABBITMQ_CTL_ERL_ARGS="bar -proto_dist inet6_tcp"$})
+          end
+        end
+
+        context 'with SSL and without other erl args' do
+          let(:params) do
+            { ipv6: true,
+              ssl_erl_dist: true }
+          end
+
+          it 'enables inet6 distribution' do
+            is_expected.to contain_file('rabbitmq-env.config'). \
+              with_content(%r{^RABBITMQ_SERVER_ERL_ARGS=" -pa /usr/lib64/erlang/lib/ssl-7.3.3.1/ebin -proto_dist inet6_tls"$}). \
+              with_content(%r{^RABBITMQ_CTL_ERL_ARGS=" -pa /usr/lib64/erlang/lib/ssl-7.3.3.1/ebin -proto_dist inet6_tls"$})
+          end
+        end
+
+        context 'with SSL and other quoted erl args' do
+          let(:params) do
+            { ipv6: true,
+              ssl_erl_dist: true,
+              environment_variables: { 'RABBITMQ_SERVER_ERL_ARGS' => '"some quoted args"',
+                                       'RABBITMQ_CTL_ERL_ARGS'    => '"other quoted args"' } }
+          end
+
+          it 'enables inet6 distribution and quote properly' do
+            is_expected.to contain_file('rabbitmq-env.config'). \
+              with_content(%r{^RABBITMQ_SERVER_ERL_ARGS="some quoted args -pa /usr/lib64/erlang/lib/ssl-7.3.3.1/ebin  -proto_dist inet6_tls"$}). \
+              with_content(%r{^RABBITMQ_CTL_ERL_ARGS="other quoted args -pa /usr/lib64/erlang/lib/ssl-7.3.3.1/ebin  -proto_dist inet6_tls"$})
+          end
+        end
+
+        context 'with SSL and with other unquoted erl args' do
+          let(:params) do
+            { ipv6: true,
+              ssl_erl_dist: true,
+              environment_variables: { 'RABBITMQ_SERVER_ERL_ARGS' => 'foo',
+                                       'RABBITMQ_CTL_ERL_ARGS'    => 'bar' } }
+          end
+
+          it 'enables inet6 distribution and quote properly' do
+            is_expected.to contain_file('rabbitmq-env.config'). \
+              with_content(%r{^RABBITMQ_SERVER_ERL_ARGS="foo -pa /usr/lib64/erlang/lib/ssl-7.3.3.1/ebin  -proto_dist inet6_tls"$}). \
+              with_content(%r{^RABBITMQ_CTL_ERL_ARGS="bar -pa /usr/lib64/erlang/lib/ssl-7.3.3.1/ebin  -proto_dist inet6_tls"$})
+          end
         end
       end
 
       describe 'config_variables options' do
-        let(:params) {{ :config_variables => {
-            'hipe_compile'                  => true,
+        let(:params) do
+          { config_variables: {
+            'hipe_compile' => true,
             'vm_memory_high_watermark'      => 0.4,
-            'frame_max'                     => 131072,
-            'collect_statistics'            => "none",
-            'auth_mechanisms'               => "['PLAIN', 'AMQPLAIN']",
-        }}}
-        it 'should set environment variables' do
-          should contain_file('rabbitmq.config') \
-            .with_content(/\{hipe_compile, true\}/) \
-            .with_content(/\{vm_memory_high_watermark, 0.4\}/) \
-            .with_content(/\{frame_max, 131072\}/) \
-            .with_content(/\{collect_statistics, none\}/) \
-            .with_content(/\{auth_mechanisms, \['PLAIN', 'AMQPLAIN'\]\}/)
+            'frame_max'                     => 131_072,
+            'collect_statistics'            => 'none',
+            'auth_mechanisms'               => "['PLAIN', 'AMQPLAIN']"
+          } }
+        end
+
+        it 'sets environment variables' do
+          is_expected.to contain_file('rabbitmq.config'). \
+            with_content(%r{\{hipe_compile, true\}}). \
+            with_content(%r{\{vm_memory_high_watermark, 0.4\}}). \
+            with_content(%r{\{frame_max, 131072\}}). \
+            with_content(%r{\{collect_statistics, none\}}). \
+            with_content(%r{\{auth_mechanisms, \['PLAIN', 'AMQPLAIN'\]\}})
         end
       end
 
       describe 'config_kernel_variables options' do
-        let(:params) {{ :config_kernel_variables => {
-            'inet_dist_listen_min'      => 9100,
-            'inet_dist_listen_max'      => 9105,
-        }}}
-        it 'should set config variables' do
-          should contain_file('rabbitmq.config') \
-            .with_content(/\{inet_dist_listen_min, 9100\}/) \
-            .with_content(/\{inet_dist_listen_max, 9105\}/)
+        let(:params) do
+          { config_kernel_variables: {
+            'inet_dist_listen_min' => 9100,
+            'inet_dist_listen_max' => 9105
+          } }
+        end
+
+        it 'sets config variables' do
+          is_expected.to contain_file('rabbitmq.config'). \
+            with_content(%r{\{inet_dist_listen_min, 9100\}}). \
+            with_content(%r{\{inet_dist_listen_max, 9105\}})
+        end
+      end
+
+      describe 'config_management_variables' do
+        let(:params) do
+          { config_management_variables: {
+            'rates_mode' => 'none'
+          } }
+        end
+
+        it 'sets config variables' do
+          is_expected.to contain_file('rabbitmq.config'). \
+            with_content(%r{\{rates_mode, none\}})
         end
       end
 
       describe 'tcp_keepalive enabled' do
-        let(:params) {{ :tcp_keepalive => true }}
-        it 'should set tcp_listen_options keepalive true' do
-          should contain_file('rabbitmq.config') \
-            .with_content(/\{tcp_listen_options, \[\{keepalive, true\}\]\},/)
+        let(:params) { { tcp_keepalive: true } }
+
+        it 'sets tcp_listen_options keepalive true' do
+          is_expected.to contain_file('rabbitmq.config'). \
+            with_content(%r{\{keepalive,     true\}})
         end
       end
 
       describe 'tcp_keepalive disabled (default)' do
-        it 'should not set tcp_listen_options' do
-          should contain_file('rabbitmq.config') \
-            .without_content(/\{tcp_listen_options, \[\{keepalive, true\}\]\},/)
+        it 'does not set tcp_listen_options' do
+          is_expected.to contain_file('rabbitmq.config'). \
+            without_content(%r{\{keepalive,     true\}})
         end
       end
 
-      describe 'non-bool tcp_keepalive parameter' do
-        let :params do
-          { :tcp_keepalive => 'string' }
+      describe 'tcp_backlog with default value' do
+        it 'sets tcp_listen_options backlog to 128' do
+          is_expected.to contain_file('rabbitmq.config'). \
+            with_content(%r{\{backlog,       128\}})
+        end
+      end
+
+      describe 'tcp_backlog with non-default value' do
+        let(:params) do
+          { tcp_backlog: 256 }
+        end
+
+        it 'sets tcp_listen_options backlog to 256' do
+          is_expected.to contain_file('rabbitmq.config'). \
+            with_content(%r{\{backlog,       256\}})
+        end
+      end
+
+      describe 'tcp_sndbuf with default value' do
+        it 'does not set tcp_listen_options sndbuf' do
+          is_expected.to contain_file('rabbitmq.config'). \
+            without_content(%r{sndbuf})
+        end
+      end
+
+      describe 'tcp_sndbuf with non-default value' do
+        let(:params) do
+          { tcp_sndbuf: 128 }
+        end
+
+        it 'sets tcp_listen_options sndbuf to 128' do
+          is_expected.to contain_file('rabbitmq.config'). \
+            with_content(%r{\{sndbuf,       128\}})
+        end
+      end
+
+      describe 'tcp_recbuf with default value' do
+        it 'does not set tcp_listen_options recbuf' do
+          is_expected.to contain_file('rabbitmq.config'). \
+            without_content(%r{recbuf})
+        end
+      end
+
+      describe 'tcp_recbuf with non-default value' do
+        let(:params) do
+          { tcp_recbuf: 128 }
         end
 
-        it 'should raise an error' do
-          expect {
-            should contain_file('rabbitmq.config')
-          }.to raise_error(Puppet::Error, /is not a boolean/)
+        it 'sets tcp_listen_options recbuf to 128' do
+          is_expected.to contain_file('rabbitmq.config'). \
+            with_content(%r{\{recbuf,       128\}})
+        end
+      end
+
+      describe 'rabbitmq-heartbeat options' do
+        let(:params) { { heartbeat: 60 } }
+
+        it 'sets heartbeat paramter in config file' do
+          is_expected.to contain_file('rabbitmq.config'). \
+            with_content(%r{\{heartbeat, 60\}})
         end
       end
 
       context 'delete_guest_user' do
         describe 'should do nothing by default' do
-          it { should_not contain_rabbitmq_user('guest') }
+          it { is_expected.not_to contain_rabbitmq_user('guest') }
         end
 
         describe 'delete user when delete_guest_user set' do
-          let(:params) {{ :delete_guest_user => true }}
+          let(:params) { { delete_guest_user: true } }
+
           it 'removes the user' do
-            should contain_rabbitmq_user('guest').with(
+            is_expected.to contain_rabbitmq_user('guest').with(
               'ensure'   => 'absent',
               'provider' => 'rabbitmqctl'
             )
@@ -966,134 +1415,36 @@ rabbitmq hard nofile 1234
       ## rabbitmq::service
       ##
       describe 'service with default params' do
-        it { should contain_service('rabbitmq-server').with(
-          'ensure'     => 'running',
-          'enable'     => 'true',
-          'hasstatus'  => 'true',
-          'hasrestart' => 'true'
-        )}
+        it {
+          is_expected.to contain_service('rabbitmq-server').with(
+            'ensure'     => 'running',
+            'enable'     => 'true',
+            'hasstatus'  => 'true',
+            'hasrestart' => 'true'
+          )
+        }
       end
 
       describe 'service with ensure stopped' do
         let :params do
-          { :service_ensure => 'stopped' }
+          { service_ensure: 'stopped' }
         end
 
-        it { should contain_service('rabbitmq-server').with(
-          'ensure'    => 'stopped',
-          'enable'    => false
-        ) }
-      end
-
-      describe 'service with ensure neither running neither stopped' do
-        let :params do
-          { :service_ensure => 'foo' }
-        end
-
-        it 'should raise an error' do
-          expect {
-            should contain_service('rabbitmq-server').with(
-              'ensure' => 'stopped' )
-          }.to raise_error(Puppet::Error, /validate_re\(\): "foo" does not match "\^\(running\|stopped\)\$"/)
-        end
+        it {
+          is_expected.to contain_service('rabbitmq-server').with(
+            'ensure'    => 'stopped',
+            'enable'    => false
+          )
+        }
       end
 
       describe 'service with service_manage equal to false' do
         let :params do
-          { :service_manage => false }
+          { service_manage: false }
         end
 
-        it { should_not contain_service('rabbitmq-server') }
-      end
-
-    end
-  end
-
-  ##
-  ## rabbitmq::install
-  ##
-  context "on RHEL" do
-    let(:facts) {{ :osfamily => 'RedHat' }}
-    let(:params) {{ :package_source => 'http://www.rabbitmq.com/releases/rabbitmq-server/v3.2.3/rabbitmq-server-3.2.3-1.noarch.rpm' }}
-    it 'installs the rabbitmq package' do
-      should contain_package('rabbitmq-server').with(
-        'ensure'   => 'installed',
-        'name'     => 'rabbitmq-server',
-        'provider' => 'rpm',
-        'source'   => 'http://www.rabbitmq.com/releases/rabbitmq-server/v3.2.3/rabbitmq-server-3.2.3-1.noarch.rpm'
-      )
-    end
-  end
-
-  context "on Debian" do
-    let(:facts) {{ :osfamily => 'Debian', :lsbdistid => 'Debian', :lsbdistcodename => 'precise' }}
-    it 'installs the rabbitmq package' do
-      should contain_package('rabbitmq-server').with(
-        'ensure'   => 'installed',
-        'name'     => 'rabbitmq-server',
-        'provider' => 'apt'
-      )
-    end
-  end
-
-  context "on Archlinux" do
-    let(:facts) {{ :osfamily => 'Archlinux' }}
-    it 'installs the rabbitmq package' do
-      should contain_package('rabbitmq-server').with(
-        'ensure'   => 'installed',
-        'name'     => 'rabbitmq')
-    end
-  end
-
-  describe 'repo management on Debian' do
-    let(:facts)  {{ :osfamily => 'Debian', :lsbdistid => 'Debian' }}
-
-    context 'with no pin' do
-      let(:params) {{ :package_apt_pin => '' }}
-      describe 'it sets up an apt::source' do
-
-        it { should contain_apt__source('rabbitmq').with(
-          'location'    => 'http://www.rabbitmq.com/debian/',
-          'release'     => 'testing',
-          'repos'       => 'main',
-          'include_src' => false,
-          'key'         => 'F78372A06FF50C80464FC1B4F7B8CEA6056E8E56'
-        ) }
-      end
-    end
-
-    context 'with pin' do
-      let(:params) {{ :package_apt_pin => '700' }}
-      describe 'it sets up an apt::source and pin' do
-
-        it { should contain_apt__source('rabbitmq').with(
-          'location'    => 'http://www.rabbitmq.com/debian/',
-          'release'     => 'testing',
-          'repos'       => 'main',
-          'include_src' => false,
-          'key'         => 'F78372A06FF50C80464FC1B4F7B8CEA6056E8E56'
-        ) }
-
-        it { should contain_apt__pin('rabbitmq').with(
-          'packages' => 'rabbitmq-server',
-          'priority' => '700'
-        ) }
-
+        it { is_expected.not_to contain_service('rabbitmq-server') }
       end
     end
   end
-
-  ['RedHat', 'SuSE'].each do |distro|
-    describe "repo management on #{distro}" do
-      describe 'imports the key' do
-        let(:facts) {{ :osfamily => distro }}
-        let(:params) {{ :package_gpg_key => 'http://www.rabbitmq.com/rabbitmq-signing-key-public.asc' }}
-
-        it { should contain_exec("rpm --import #{params[:package_gpg_key]}").with(
-          'path' => ['/bin','/usr/bin','/sbin','/usr/sbin']
-        ) }
-      end
-    end
-  end
-
 end