c6656e4031
not strictly required, these conversions keep us up to date with latest rspec conventions and best practices which will prevent use from having to convert them when they become deprecated later
675 lines
22 KiB
Ruby
675 lines
22 KiB
Ruby
require 'spec_helper'
|
|
|
|
RSpec.describe Metasploit::Framework::Database do
|
|
context 'CONSTANTS' do
|
|
context 'CONFIGURATIONS_PATHNAME_PRECEDENCE' do
|
|
subject(:configurations_pathname_precedence) {
|
|
described_class::CONFIGURATIONS_PATHNAME_PRECEDENCE
|
|
}
|
|
|
|
it { is_expected.to match_array(
|
|
[
|
|
:environment_configurations_pathname,
|
|
:user_configurations_pathname,
|
|
:project_configurations_pathname
|
|
]
|
|
) }
|
|
end
|
|
end
|
|
|
|
context '.configurations_pathname' do
|
|
subject(:configurations_pathname) {
|
|
described_class.configurations_pathname(*arguments)
|
|
}
|
|
|
|
context 'with options' do
|
|
let(:arguments) {
|
|
[
|
|
{
|
|
path: path
|
|
}
|
|
]
|
|
}
|
|
|
|
context 'with :path' do
|
|
context 'that exists' do
|
|
let(:path) {
|
|
tempfile.path
|
|
}
|
|
|
|
let(:tempfile) {
|
|
Tempfile.new(['database', '.yml'])
|
|
}
|
|
|
|
it 'returns Pathname(path)' do
|
|
expect(configurations_pathname).to eq(Pathname.new(path))
|
|
end
|
|
end
|
|
|
|
context 'that does not exist' do
|
|
let(:path) {
|
|
'/a/configurations/path/that/does/not/exist/database.yml'
|
|
}
|
|
|
|
|
|
it { is_expected.to be_nil }
|
|
end
|
|
end
|
|
|
|
context 'without :path' do
|
|
let(:path) {
|
|
''
|
|
}
|
|
|
|
it 'calls configurations_pathnames' do
|
|
expect(described_class).to receive(:configurations_pathnames).and_call_original
|
|
|
|
configurations_pathname
|
|
end
|
|
|
|
it 'returns first pathname from configurations_pathnames' do
|
|
expect(configurations_pathname).to eq(described_class.configurations_pathnames.first)
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'without options' do
|
|
let(:arguments) {
|
|
[]
|
|
}
|
|
|
|
it 'calls configurations_pathnames' do
|
|
expect(described_class).to receive(:configurations_pathnames).and_call_original
|
|
|
|
configurations_pathname
|
|
end
|
|
|
|
it 'returns first pathname from configurations_pathnames' do
|
|
expect(configurations_pathname).to eq(described_class.configurations_pathnames.first)
|
|
end
|
|
end
|
|
end
|
|
|
|
context '.configurations_pathnames' do
|
|
subject(:configurations_pathnames) {
|
|
described_class.configurations_pathnames
|
|
}
|
|
|
|
before(:example) do
|
|
allow(described_class).to receive(:environment_configurations_pathname).and_return(
|
|
environment_configurations_pathname
|
|
)
|
|
end
|
|
|
|
context 'with environment_configurations_pathname' do
|
|
context 'that exists' do
|
|
#
|
|
# lets
|
|
#
|
|
|
|
let(:environment_configurations_pathname) {
|
|
Pathname.new(environment_configurations_tempfile.path)
|
|
}
|
|
|
|
let(:environment_configurations_tempfile) {
|
|
Tempfile.new(['environment_configurations', '.database.yml'])
|
|
}
|
|
|
|
#
|
|
# Callbacks
|
|
#
|
|
|
|
before(:example) do
|
|
allow(described_class).to receive(:user_configurations_pathname).and_return(
|
|
user_configurations_pathname
|
|
)
|
|
end
|
|
|
|
context 'with user_configurations_pathname' do
|
|
context 'that exists' do
|
|
#
|
|
# lets
|
|
#
|
|
|
|
let(:user_configurations_pathname) {
|
|
Pathname.new(user_configurations_tempfile.path)
|
|
}
|
|
|
|
let(:user_configurations_tempfile) {
|
|
Tempfile.new(['user_configurations', '.database.yml'])
|
|
}
|
|
|
|
#
|
|
# Callbacks
|
|
#
|
|
|
|
before(:example) do
|
|
allow(described_class).to receive(:project_configurations_pathname).and_return(
|
|
project_configurations_pathname
|
|
)
|
|
end
|
|
|
|
context 'with project_configurations_pathname' do
|
|
context 'that exists' do
|
|
let(:project_configurations_pathname) {
|
|
Pathname.new(project_configurations_tempfile.path)
|
|
}
|
|
|
|
let(:project_configurations_tempfile) {
|
|
Tempfile.new(['project_configurations', '.database.yml'])
|
|
}
|
|
|
|
it 'is [environment_configurations_pathname, user_configurations_pathname, project_configurations_pathname]' do
|
|
expect(project_configurations_pathname).to exist
|
|
expect(configurations_pathnames).to match_array(
|
|
[
|
|
environment_configurations_pathname,
|
|
user_configurations_pathname,
|
|
project_configurations_pathname
|
|
]
|
|
)
|
|
end
|
|
end
|
|
|
|
context 'that does not exist' do
|
|
let(:project_configurations_pathname) {
|
|
Pathname.new('/metasploit-framework/does/not/exist/here/config/database.yml')
|
|
}
|
|
|
|
it 'is [environment_configurations_pathname, user_configurations_pathname]' do
|
|
expect(environment_configurations_pathname).to exist
|
|
expect(user_configurations_pathname).to exist
|
|
expect(project_configurations_pathname).not_to exist
|
|
|
|
expect(project_configurations_pathname).not_to exist
|
|
expect(configurations_pathnames).to match_array(
|
|
[
|
|
environment_configurations_pathname,
|
|
user_configurations_pathname
|
|
]
|
|
)
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'without project_configurations_pathname' do
|
|
let(:project_configurations_pathname) {
|
|
nil
|
|
}
|
|
|
|
it 'is [environment_configuration_pathname, user_configurations_pathname]' do
|
|
expect(environment_configurations_pathname).to exist
|
|
expect(user_configurations_pathname).to exist
|
|
|
|
expect(configurations_pathnames).to match_array(
|
|
[
|
|
environment_configurations_pathname,
|
|
user_configurations_pathname
|
|
]
|
|
)
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'with does not exist' do
|
|
#
|
|
# lets
|
|
#
|
|
|
|
let(:user_configurations_pathname) {
|
|
Pathname.new('/user/configuration/that/does/not/exist/.msf4/database.yml')
|
|
}
|
|
|
|
#
|
|
# Callbacks
|
|
#
|
|
|
|
before(:example) do
|
|
allow(described_class).to receive(:project_configurations_pathname).and_return(
|
|
project_configurations_pathname
|
|
)
|
|
end
|
|
|
|
context 'with project_configurations_pathname' do
|
|
context 'that exists' do
|
|
let(:project_configurations_pathname) {
|
|
Pathname.new(project_configurations_tempfile.path)
|
|
}
|
|
|
|
let(:project_configurations_tempfile) {
|
|
Tempfile.new(['project_configurations', '.database.yml'])
|
|
}
|
|
|
|
it 'is [environment_configurations_pathname, project_configurations_pathname]' do
|
|
expect(environment_configurations_pathname).to exist
|
|
expect(user_configurations_pathname).not_to exist
|
|
expect(project_configurations_pathname).to exist
|
|
|
|
expect(configurations_pathnames).to match_array(
|
|
[
|
|
environment_configurations_pathname,
|
|
project_configurations_pathname
|
|
]
|
|
)
|
|
end
|
|
end
|
|
|
|
context 'that does not exist' do
|
|
let(:project_configurations_pathname) {
|
|
Pathname.new('/metasploit-framework/that/does/not/exist/config/database.yml')
|
|
}
|
|
|
|
it 'is [environment_configurations_pathname]' do
|
|
expect(environment_configurations_pathname).to exist
|
|
expect(user_configurations_pathname).not_to exist
|
|
expect(project_configurations_pathname).not_to exist
|
|
|
|
expect(configurations_pathnames).to match_array(
|
|
[
|
|
environment_configurations_pathname
|
|
]
|
|
)
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'without project_configurations_pathname' do
|
|
let(:project_configurations_pathname) {
|
|
nil
|
|
}
|
|
|
|
it 'is [environment_configurations_pathname]' do
|
|
expect(environment_configurations_pathname).to exist
|
|
expect(user_configurations_pathname).not_to exist
|
|
expect(project_configurations_pathname).to be_nil
|
|
|
|
expect(configurations_pathnames).to match_array(
|
|
[
|
|
environment_configurations_pathname
|
|
]
|
|
)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'without user_configurations_pathname' do
|
|
#
|
|
# lets
|
|
#
|
|
|
|
let(:user_configurations_pathname) {
|
|
nil
|
|
}
|
|
|
|
#
|
|
# Callbacks
|
|
#
|
|
|
|
before(:example) do
|
|
allow(described_class).to receive(:project_configurations_pathname).and_return(
|
|
project_configurations_pathname
|
|
)
|
|
end
|
|
|
|
context 'with project_configurations_pathname' do
|
|
|
|
end
|
|
|
|
context 'without project_configurations_pathname' do
|
|
let(:project_configurations_pathname) {
|
|
nil
|
|
}
|
|
|
|
it 'contains only the environment_configuration_pathname' do
|
|
expect(configurations_pathnames).to match_array([environment_configurations_pathname])
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'that does not exist' do
|
|
|
|
end
|
|
end
|
|
|
|
context 'without environment_configurations_pathname' do
|
|
#
|
|
# lets
|
|
#
|
|
|
|
let(:environment_configurations_pathname) {
|
|
nil
|
|
}
|
|
|
|
#
|
|
# Callbacks
|
|
#
|
|
|
|
before(:example) do
|
|
allow(described_class).to receive(:user_configurations_pathname).and_return(
|
|
user_configurations_pathname
|
|
)
|
|
end
|
|
|
|
context 'with user_configurations_pathname' do
|
|
context 'that exists' do
|
|
#
|
|
# lets
|
|
#
|
|
|
|
let(:user_configurations_pathname) {
|
|
Pathname.new(user_configurations_tempfile.path)
|
|
}
|
|
|
|
let(:user_configurations_tempfile) {
|
|
Tempfile.new(['user_configurations', '.database.yml'])
|
|
}
|
|
|
|
#
|
|
# Callbacks
|
|
#
|
|
|
|
before(:example) do
|
|
allow(described_class).to receive(:project_configurations_pathname).and_return(
|
|
project_configurations_pathname
|
|
)
|
|
end
|
|
|
|
context 'with project_configurations_pathname' do
|
|
context 'that exists' do
|
|
let(:project_configurations_pathname) {
|
|
Pathname.new(project_configurations_tempfile.path)
|
|
}
|
|
|
|
let(:project_configurations_tempfile) {
|
|
Tempfile.new(['project_configurations', '.database.yml'])
|
|
}
|
|
|
|
it 'is [user_configurations_pathname, project_configurations_pathname]' do
|
|
expect(environment_configurations_pathname).to be_nil
|
|
expect(user_configurations_pathname).to exist
|
|
expect(project_configurations_pathname).to exist
|
|
|
|
expect(configurations_pathnames).to match_array(
|
|
[
|
|
user_configurations_pathname,
|
|
project_configurations_pathname
|
|
]
|
|
)
|
|
end
|
|
end
|
|
|
|
context 'that does not exist' do
|
|
let(:project_configurations_pathname) {
|
|
Pathname.new('/metasploit-framework/that/does/not/exist/config/database.yml')
|
|
}
|
|
|
|
it 'is [user_configurations_pathname]' do
|
|
expect(environment_configurations_pathname).to be_nil
|
|
expect(user_configurations_pathname).to exist
|
|
expect(project_configurations_pathname).not_to exist
|
|
|
|
expect(configurations_pathnames).to match_array(
|
|
[
|
|
user_configurations_pathname
|
|
]
|
|
)
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'without project_configurations_pathname' do
|
|
let(:project_configurations_pathname) {
|
|
nil
|
|
}
|
|
|
|
it 'is [user_configurations_pathname]' do
|
|
expect(environment_configurations_pathname).to be_nil
|
|
expect(user_configurations_pathname).to exist
|
|
expect(project_configurations_pathname).to be_nil
|
|
|
|
expect(configurations_pathnames).to match_array(
|
|
[
|
|
user_configurations_pathname
|
|
]
|
|
)
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'that does not exist' do
|
|
#
|
|
# lets
|
|
#
|
|
|
|
let(:user_configurations_pathname) {
|
|
Pathname.new('/user/configuration/that/does/not/exist/.msf4/database.yml')
|
|
}
|
|
|
|
#
|
|
# Callbacks
|
|
#
|
|
|
|
before(:example) do
|
|
allow(described_class).to receive(:project_configurations_pathname).and_return(
|
|
project_configurations_pathname
|
|
)
|
|
end
|
|
|
|
context 'with project_configurations_pathname' do
|
|
context 'that exists' do
|
|
let(:project_configurations_pathname) {
|
|
Pathname.new(project_configurations_tempfile.path)
|
|
}
|
|
|
|
let(:project_configurations_tempfile) {
|
|
Tempfile.new(['project_configurations', '.database.yml'])
|
|
}
|
|
|
|
it 'is [project_configurations_pathname]' do
|
|
expect(environment_configurations_pathname).to be_nil
|
|
expect(user_configurations_pathname).not_to exist
|
|
expect(project_configurations_pathname).to exist
|
|
|
|
expect(configurations_pathnames).to match_array(
|
|
[
|
|
project_configurations_pathname
|
|
]
|
|
)
|
|
end
|
|
end
|
|
|
|
context 'that does not exist' do
|
|
let(:project_configurations_pathname) {
|
|
Pathname.new('/metasploit-framework/that/does/not/exist/config/database.yml')
|
|
}
|
|
|
|
it 'is []' do
|
|
expect(environment_configurations_pathname).to be_nil
|
|
expect(user_configurations_pathname).not_to exist
|
|
expect(project_configurations_pathname).not_to exist
|
|
|
|
expect(configurations_pathnames).to eq([])
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'without project_configurations_pathname' do
|
|
let(:project_configurations_pathname) {
|
|
nil
|
|
}
|
|
|
|
it 'is []' do
|
|
expect(environment_configurations_pathname).to be_nil
|
|
expect(user_configurations_pathname).not_to exist
|
|
expect(project_configurations_pathname).to be_nil
|
|
|
|
expect(configurations_pathnames).to eq([])
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'without user_configurations_pathname' do
|
|
#
|
|
# lets
|
|
#
|
|
|
|
let(:user_configurations_pathname) {
|
|
nil
|
|
}
|
|
|
|
#
|
|
# Callbacks
|
|
#
|
|
|
|
before(:example) do
|
|
allow(described_class).to receive(:project_configurations_pathname).and_return(
|
|
project_configurations_pathname
|
|
)
|
|
end
|
|
|
|
context 'with project_configurations_pathname' do
|
|
context 'that exists' do
|
|
let(:project_configurations_pathname) {
|
|
Pathname.new(project_configurations_tempfile.path)
|
|
}
|
|
|
|
let(:project_configurations_tempfile) {
|
|
Tempfile.new(['project_configurations', '.database.yml'])
|
|
}
|
|
|
|
it 'is [project_configurations_pathname]' do
|
|
expect(environment_configurations_pathname).to be_nil
|
|
expect(user_configurations_pathname).to be_nil
|
|
expect(project_configurations_pathname).to exist
|
|
|
|
expect(configurations_pathnames).to match_array(
|
|
[
|
|
project_configurations_pathname
|
|
]
|
|
)
|
|
end
|
|
end
|
|
|
|
context 'that does not exist' do
|
|
let(:project_configurations_pathname) {
|
|
Pathname.new('/metasploit-framework/that/does/not/exist/config/database.yml')
|
|
}
|
|
|
|
it 'is []' do
|
|
expect(environment_configurations_pathname).to be_nil
|
|
expect(user_configurations_pathname).to be_nil
|
|
expect(project_configurations_pathname).not_to exist
|
|
|
|
expect(configurations_pathnames).to eq([])
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'without project_configurations_pathname' do
|
|
let(:project_configurations_pathname) {
|
|
nil
|
|
}
|
|
|
|
it { is_expected.to eq([]) }
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
context '.environment_configurations_pathname' do
|
|
subject(:environment_configurations_pathname) {
|
|
described_class.environment_configurations_pathname
|
|
}
|
|
|
|
around(:example) do |example|
|
|
env_before = ENV.to_hash
|
|
|
|
begin
|
|
example.run
|
|
ensure
|
|
ENV.update(env_before)
|
|
end
|
|
end
|
|
|
|
context 'with MSF_DATABASE_CONFIG' do
|
|
before(:example) do
|
|
ENV['MSF_DATABASE_CONFIG'] = msf_database_config
|
|
end
|
|
|
|
context 'with blank' do
|
|
let(:msf_database_config) {
|
|
''
|
|
}
|
|
|
|
it { is_expected.to be_nil }
|
|
end
|
|
|
|
context 'without blank' do
|
|
let(:msf_database_config) {
|
|
'msf/database/config/database.yml'
|
|
}
|
|
|
|
it 'is Pathname of MSF_DATABASE_CONFIG' do
|
|
expect(environment_configurations_pathname).to eq(Pathname.new(msf_database_config))
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'without MSF_DATABASE_CONFIG' do
|
|
before(:example) do
|
|
ENV.delete('MSF_DATABASE_CONFIG')
|
|
end
|
|
|
|
it { is_expected.to be_nil }
|
|
end
|
|
end
|
|
|
|
context '.project_configurations_pathname' do
|
|
subject(:project_configurations_pathname) {
|
|
described_class.project_configurations_pathname
|
|
}
|
|
|
|
it 'is <metasploit-framework>/config/database.yml' do
|
|
root = Pathname.new(__FILE__).realpath.parent.parent.parent.parent.parent
|
|
expect(project_configurations_pathname).to eq(root.join('config', 'database.yml'))
|
|
end
|
|
end
|
|
|
|
context '.user_configurations_pathname' do
|
|
subject(:user_configurations_pathname) {
|
|
described_class.user_configurations_pathname
|
|
}
|
|
|
|
#
|
|
# lets
|
|
#
|
|
|
|
let(:config_root) {
|
|
Dir.mktmpdir
|
|
}
|
|
|
|
#
|
|
# Callbacks
|
|
#
|
|
|
|
around(:example) do |example|
|
|
begin
|
|
example.run
|
|
ensure
|
|
FileUtils.remove_entry_secure config_root
|
|
end
|
|
end
|
|
|
|
before(:example) do
|
|
allow(Msf::Config).to receive(:get_config_root).and_return(config_root)
|
|
end
|
|
|
|
it 'is database.yml under the user config root' do
|
|
expect(user_configurations_pathname).to eq(Pathname.new(config_root).join('database.yml'))
|
|
end
|
|
end
|
|
end
|