Skip to content

Commit 911f1d3

Browse files
author
Travis Fields
committed
Add acceptance test starting framework, YAY ACCEPTANCE TESTS
1 parent bae4ba0 commit 911f1d3

7 files changed

+280
-4
lines changed

Gemfile

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
source ENV['GEM_SOURCE'] || 'https://rubygems.org'
22

3+
def location_for(place, fake_version = nil)
4+
if place =~ /^(git:[^#]*)#(.*)/
5+
[fake_version, {:git => $1, :branch => $2, :require => false}].compact
6+
elsif place =~ /^file:\/\/(.*)/
7+
['>= 0', {:path => File.expand_path($1), :require => false}]
8+
else
9+
[place, {:require => false}]
10+
end
11+
end
12+
313
group :development, :test do
414
gem 'nokogiri'
515
gem 'mime-types', '<2.0', :require => false
@@ -8,16 +18,26 @@ group :development, :test do
818
gem 'puppetlabs_spec_helper', :require => false
919
gem 'puppet-lint', :require => false
1020
gem 'simplecov', :require => false
11-
gem 'rspec', '~> 2.14.0', :require => false
12-
gem 'beaker-rspec', :require => false
1321
gem 'yard', :require => false
14-
gem 'pry', :require => false
22+
end
23+
24+
beaker_version = ENV['BEAKER_VERSION']
25+
beaker_rspec_version = ENV['BEAKER_RSPEC_VERSION'] || '~> 5.0'
26+
group :system_tests do
27+
if beaker_version
28+
gem 'beaker', *location_for(beaker_version)
29+
end
30+
gem 'beaker-rspec', *location_for(beaker_rspec_version)
31+
gem 'specinfra', '~> 2.0', :require => false
1532
end
1633

1734
if puppetversion = ENV['PUPPET_GEM_VERSION']
1835
gem 'puppet', puppetversion, :require => false
1936
else
20-
gem 'puppet', '~> 3.7', :require => false
37+
gem 'puppet', '~> 3.7', :require => false
2138
end
2239

40+
if File.exists? "#{__FILE__}.local"
41+
eval(File.read("#{__FILE__}.local"), binding)
42+
end
2343
# vim:ft=ruby
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
HOSTS:
2+
debian6:
3+
roles:
4+
- master
5+
- database
6+
- dashboard
7+
platform: debian-6-i386
8+
template: debian-6-i386
9+
hypervisor: vcloud
10+
sql2012:
11+
roles:
12+
- agent
13+
- default
14+
platform: windows-2012r2-x86_64
15+
template: win-2012r2-x86_64
16+
hypervisor: vcloud
17+
sql2014:
18+
roles:
19+
- agent
20+
platform: windows-2012r2-x86_64
21+
template: win-2012r2-x86_64
22+
hypervisor: vcloud
23+
CONFIG:
24+
nfs_server: none
25+
consoleport: 443
26+
datastore: instance0
27+
folder: Delivery/Quality Assurance/FOSS/Dynamic
28+
resourcepool: delivery/Quality Assurance/FOSS/Dynamic
29+
pooling_api: http://vcloud.delivery.puppetlabs.net/
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
require 'spec_helper_acceptance'
2+
3+
QA_RESOURE_ROOT = "http://int-resources.ops.puppetlabs.net/QA_resources/microsoft_sql/iso/"
4+
SQL_2014_ISO = "SQLServer2014-x64-ENU.iso"
5+
SQL_2012_ISO = "SQLServer2012SP1-FullSlipstream-ENU-x64.iso"
6+
7+
RSpec.shared_context 'sqlserver_instance_context' do
8+
let(:sqlserver_version) { '2014' }
9+
let(:sqlserver_iso) { SQL_2014_ISO }
10+
let(:qa_iso_resource_root) { QA_RESOURE_ROOT }
11+
let(:packages_installed) { ["Database Engine Services", "Data Quality Service", "Full text search", "Database Engine Shared"] }
12+
let(:packages_uninstalled) { [] }
13+
let(:services_installed) { ["SQL Server (MSSQLSERVER)"] }
14+
let(:services_uninstalled) { [] }
15+
let(:beaker_host) { nil }
16+
let(:install_manifest) {
17+
<<-MANIFEST
18+
sqlserver_instance{'MSSQLSERVER':
19+
source => 'H:',
20+
features => ['SQL'],
21+
security_mode => 'SQL',
22+
sa_pwd => 'Pupp3t1@',
23+
sql_sysadmin_accounts => ['Administrator'],
24+
install_switches => {
25+
'TCPENABLED' => 1,
26+
'SQLBACKUPDIR' => 'C:\\MSSQLSERVER\\backupdir',
27+
'SQLTEMPDBDIR' => 'C:\\MSSQLSERVER\\tempdbdir',
28+
'INSTALLSQLDATADIR' => 'C:\\MSSQLSERVER\\datadir',
29+
'INSTANCEDIR' => 'C:\\Program Files\\Microsoft SQL Server',
30+
'INSTALLSHAREDDIR' => 'C:\\Program Files\\Microsoft SQL Server',
31+
'INSTALLSHAREDWOWDIR' => 'C:\\Program Files (x86)\\Microsoft SQL Server',
32+
}
33+
}
34+
MANIFEST
35+
}
36+
shared_examples 'server_prefetch' do
37+
it {
38+
manifest_pre = <<-MANIFEST
39+
$p_src = '#{qa_iso_resource_root}/#{sqlserver_iso}'
40+
$source = 'C:\\#{sqlserver_iso}'
41+
pget{"Download #{sqlserver_version} Iso":
42+
source => $p_src,
43+
target => 'C:',
44+
timeout => 150000,
45+
}
46+
mount_iso{$source:
47+
require => Pget['Download #{sqlserver_version} Iso'],
48+
drive_letter => 'H',
49+
}
50+
MANIFEST
51+
apply_manifest_on(beaker_host, manifest_pre)
52+
}
53+
end
54+
55+
shared_examples 'install sqlserver' do
56+
it { apply_manifest_on(beaker_host, install_manifest) }
57+
end
58+
59+
shared_examples 'services installed' do |services_installed = ["SQL Server (MSSQLSERVER)"]|
60+
services_installed.each do |service|
61+
describe service(service) do
62+
it { should be_installed }
63+
it { should be_enabled }
64+
end
65+
end
66+
end
67+
68+
shared_examples 'packages installed' do |packages_installed|
69+
packages_installed.each do |package|
70+
describe package(package) do
71+
it { should be_installed }
72+
end
73+
end
74+
end
75+
76+
end
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
require 'spec_helper_acceptance'
2+
3+
require File.expand_path(File.join(File.dirname(__FILE__), 'sqlserver_instance_shared_context.rb'))
4+
5+
RSpec.describe 'sqlserver_instance' do
6+
include_context 'sqlserver_instance_context'
7+
8+
%w(2012 2014).each do |version|
9+
beaker_host = get_host_for(version)
10+
describe "Install #{version} SQL Instance", :node => beaker_host do
11+
let(:beaker_host) { beaker_host }
12+
let(:sqlserver_version) { version }
13+
let(:sqlserver_iso) { version =~ /2012/ ? SQL_2012_ISO : SQL_2014_ISO }
14+
it_behaves_like 'server_prefetch'
15+
it_behaves_like 'install sqlserver'
16+
it_behaves_like 'services installed'
17+
it_behaves_like 'packages installed',
18+
["SQL Server #{version} Database Engine Services",
19+
"SQL Server #{version} Data Quality Service",
20+
"SQL Server #{version} Full text search",
21+
"SQL Server #{version} Database Engine Shared"]
22+
23+
%w(backupdir datadir tempdbdir).each do |file|
24+
describe file("C:\\MSSQLSERVER\\#{file}") do
25+
it { should be_directory }
26+
end
27+
end
28+
end
29+
end
30+
end
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
require 'spec_helper_acceptance'
2+
require File.expand_path(File.join(File.dirname(__FILE__), 'sqlserver_sqlcmd_examples.rb'))
3+
4+
5+
%w(2012 2014).each do |version|
6+
host = get_host_for(version)
7+
RSpec.describe "sqlserver::login #{version}", :node => host do
8+
include_context 'sqlcmd_context'
9+
let(:host) { host }
10+
11+
describe 'create a sql login' do
12+
create_login = <<-MANIFEST
13+
sqlserver::config{'MSSQLSERVER':
14+
admin_user => 'sa',
15+
admin_pass => 'Pupp3t1@',
16+
}
17+
sqlserver::login{'create logging user':
18+
login => 'loggingUser',
19+
password => 'Pupp3t1@',
20+
}
21+
MANIFEST
22+
let(:query) { "SELECT name FROM sys.server_principals WHERE name = 'loggingUser'" }
23+
let(:result) { "loggingUser" }
24+
it 'should create login [loggingUser]' do
25+
apply_manifest_on(host, create_login)
26+
end
27+
it_should_behave_like 'query result'
28+
end
29+
end
30+
end
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
require 'spec_helper_acceptance'
2+
3+
RSpec.shared_context 'sqlcmd_context' do
4+
let(:sql_admin_user) { 'sa' }
5+
let(:sql_admin_pass) { 'Pupp3t1@' }
6+
let(:sqlcmd_path) { 'sqlcmd.exe' }
7+
let(:host) { default }
8+
let(:query) { '' }
9+
let(:should_result) { '' }
10+
let(:row_count) { 1 }
11+
RSpec.shared_examples 'query result' do
12+
it {
13+
tmpfile = host.tmpfile('should_contain_query.sql')
14+
create_remote_file(host, tmpfile, query + "\n")
15+
tmpfile.gsub!("/", "\\")
16+
sqlcmd_query = <<-sql_query
17+
sqlcmd.exe -U #{sql_admin_user} -P #{sql_admin_pass} -h-1 -W -s "|" -i \"#{tmpfile}\"
18+
sql_query
19+
on host, sqlcmd_query, :environment => {"PATH" => '/cygdrive/c/Program Files/Microsoft SQL Server/Client SDK/ODBC/110/Tools/Binn:/cygdrive/c/Program Files/Microsoft SQL Server/110/Tools/Binn'} do |result|
20+
assert_match(Regexp.new(should_result), result.stdout)
21+
assert_match(Regexp.new("#{row_count} rows affected"), result.stdout, "Expected to have row count matching #{row_count}")
22+
end
23+
}
24+
end
25+
26+
27+
end

spec/spec_helper_acceptance.rb

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
require 'beaker-rspec/spec_helper'
2+
require 'beaker-rspec/helpers/serverspec'
3+
4+
5+
UNSUPPORTED_PLATFORMS = ['debian', 'ubuntu']
6+
FUTURE_PARSER = ENV['FUTURE_PARSER'] == 'true' || false
7+
8+
unless ENV['RS_PROVISION'] == 'no' or ENV['BEAKER_provision'] == 'no'
9+
is_foss = (ENV['IS_PE'] == 'no' || ENV['IS_PE'] == 'false') ? true : false
10+
if hosts.first.is_pe? && !is_foss
11+
install_pe
12+
else
13+
version = ENV['PUPPET_VERSION'] || '3.7.4'
14+
download_url = ENV['WIN_DOWNLOAD_URL'] || 'http://downloads.puppetlabs.com/windows/'
15+
hosts.each do |host|
16+
if host['platform'] =~ /windows/i
17+
install_puppet_from_msi(host,
18+
{
19+
:win_download_url => download_url,
20+
:version => version,
21+
:install_32 => true})
22+
end
23+
end
24+
end
25+
26+
agents.each do |agent|
27+
step "Install sqlserver to agent #{agent.node_name}"
28+
on agent, "mkdir -p #{default['distmoduledir']}/sqlserver"
29+
result = on agent, "echo #{default['distmoduledir']}"
30+
target = result.raw_output.chomp
31+
proj_root = File.expand_path(File.join(File.dirname(__FILE__), '..'))
32+
exec_puppet = <<EOS
33+
exec{'Download':
34+
command => 'powershell.exe -command "Invoke-WebRequest https://forgeapi.puppetlabs.com"',
35+
path => ['c:\\windows\\sysnative\\WindowsPowershell\\v1.0','c:\\windows\\system32\\WindowsPowershell\\v1.0'],
36+
}
37+
EOS
38+
apply_manifest_on(agent, exec_puppet)
39+
%w(puppetlabs/stdlib puppetlabs/acl cyberious/pget puppetlabs/reboot puppetlabs/registry).each do |dep|
40+
on agent, puppet("module install #{dep}")
41+
end
42+
on agent, "git clone https://github.com/puppetlabs/puppetlabs-mount_iso #{target}/mount_iso"
43+
install_dev_puppet_module_on(agent, {:proj_root => proj_root, :target_module_path => "#{target}", :module_name => 'sqlserver'})
44+
end
45+
end
46+
47+
RSpec.configure do |c|
48+
# Readable test descriptions
49+
c.formatter = :documentation
50+
end
51+
52+
def get_host_for(sqlserver_version)
53+
if sqlserver_version.to_i % 2012 != 0 && windows_agents.count > 1
54+
windows_agents[1]
55+
else
56+
windows_agents[0]
57+
end
58+
end
59+
60+
def windows_agents
61+
agents.select { |agent|
62+
agent.platform =~ /windows/
63+
}
64+
end

0 commit comments

Comments
 (0)