phpservermon/puphpet/puppet/modules/rvm/spec/acceptance/rvm_system_spec.rb

409 lines
13 KiB
Ruby

require "spec_helper_acceptance"
describe "rvm" do
# host variables
let(:osfamily) { fact("osfamily") }
let(:operatingsystem) { fact("operatingsystem") }
# rvm config
let(:rvm_path) { "/usr/local/rvm/" }
# ruby 1.9.3 config
let(:ruby19_version) { "ruby-1.9.3-p484" } # chosen for RVM binary support across nodesets
let(:ruby19_environment) { "#{rvm_path}environments/#{ruby19_version}" }
let(:ruby19_bin) { "#{rvm_path}rubies/#{ruby19_version}/bin/" }
let(:ruby19_gems) { "#{rvm_path}gems/#{ruby19_version}/gems/" }
let(:ruby19_gemset) { "myproject" }
let(:ruby19_and_gemset) { "#{ruby19_version}@#{ruby19_gemset}" }
# ruby 2.0 config
let(:ruby20_version) { "ruby-2.0.0-p481" } # chosen for RVM binary support across nodesets
let(:ruby20_environment) { "#{rvm_path}environments/#{ruby20_version}" }
let(:ruby20_bin) { "#{rvm_path}rubies/#{ruby20_version}/bin/" }
let(:ruby20_gems) { "#{rvm_path}gems/#{ruby20_version}/gems/" }
let(:ruby20_gemset) { "myproject" }
let(:ruby20_and_gemset) { "#{ruby20_version}@#{ruby20_gemset}" }
# passenger baseline configuration
let(:service_name) {
case osfamily
when "Debian"
"apache2"
when "RedHat"
"httpd"
end
}
let(:mod_dir) {
case osfamily
when "Debian"
"/etc/apache2/mods-available/"
when "RedHat"
"/etc/httpd/conf.d/"
end
}
let(:rackapp_user) {
case osfamily
when "Debian"
"www-data"
when "RedHat"
"apache"
end
}
let(:rackapp_group) {
case osfamily
when "Debian"
"www-data"
when "RedHat"
"apache"
end
}
let(:conf_file) { "#{mod_dir}passenger.conf" }
let(:load_file) { "#{mod_dir}passenger.load" }
# baseline manifest
let(:manifest) {
<<-EOS
if $::osfamily == 'RedHat' {
class { 'epel':
before => Class['rvm'],
}
}
# ensure rvm doesn't timeout finding binary rubies
class { 'rvm::rvmrc':
max_time_flag => '20',
} ->
class { 'rvm': } ->
rvm::system_user { 'vagrant': }
EOS
}
it "rvm should install and configure system user" do
# Run it twice and test for idempotency
apply_manifest(manifest, :catch_failures => true)
apply_manifest(manifest, :catch_changes => true)
shell("/usr/local/rvm/bin/rvm list") do |r|
r.stdout.should =~ Regexp.new(Regexp.escape("# No rvm rubies installed yet."))
r.exit_code.should be_zero
end
end
context "when installing rubies" do
let(:manifest) {
super() + <<-EOS
rvm_system_ruby {
'#{ruby19_version}':
ensure => 'present',
default_use => false;
'#{ruby20_version}':
ensure => 'present',
default_use => false;
}
EOS
}
it "should install with no errors" do
apply_manifest(manifest, :catch_failures => true)
apply_manifest(manifest, :catch_changes => true)
end
it "should reflect installed rubies" do
shell("/usr/local/rvm/bin/rvm list") do |r|
r.stdout.should =~ Regexp.new(Regexp.escape("\n #{ruby19_version}"))
r.stdout.should =~ Regexp.new(Regexp.escape("\n #{ruby20_version}"))
r.exit_code.should be_zero
end
end
context "and installing gems" do
let(:gem_name) { "simple-rss" } # used because has no dependencies
let(:gem_version) { "1.3.1" }
let(:gemset_manifest) {
manifest + <<-EOS
rvm_gemset {
'#{ruby19_and_gemset}':
ensure => present,
require => Rvm_system_ruby['#{ruby19_version}'];
}
rvm_gem {
'#{ruby19_and_gemset}/#{gem_name}':
ensure => '#{gem_version}',
require => Rvm_gemset['#{ruby19_and_gemset}'];
}
rvm_gemset {
'#{ruby20_and_gemset}':
ensure => present,
require => Rvm_system_ruby['#{ruby20_version}'];
}
rvm_gem {
'#{ruby20_and_gemset}/#{gem_name}':
ensure => '#{gem_version}',
require => Rvm_gemset['#{ruby20_and_gemset}'];
}
EOS
}
it "should install with no errors" do
apply_manifest(gemset_manifest, :catch_failures => true)
apply_manifest(gemset_manifest, :catch_changes => true)
end
it "should reflect installed gems and gemsets" do
shell("/usr/local/rvm/bin/rvm #{ruby19_version} gemset list") do |r|
r.stdout.should =~ Regexp.new(Regexp.escape("\n=> (default)"))
r.stdout.should =~ Regexp.new(Regexp.escape("\n global"))
r.stdout.should =~ Regexp.new(Regexp.escape("\n #{ruby19_gemset}"))
r.exit_code.should be_zero
end
shell("/usr/local/rvm/bin/rvm #{ruby20_version} gemset list") do |r|
r.stdout.should =~ Regexp.new(Regexp.escape("\n=> (default)"))
r.stdout.should =~ Regexp.new(Regexp.escape("\n global"))
r.stdout.should =~ Regexp.new(Regexp.escape("\n #{ruby20_gemset}"))
r.exit_code.should be_zero
end
end
end
end
context "when installing jruby" do
let(:jruby_version) { "jruby-1.7.6" }
let(:manifest) {
super() + <<-EOS
rvm_system_ruby { '#{jruby_version}':
ensure => 'present',
default_use => false;
}
EOS
}
it 'should install with no errors' do
apply_manifest(manifest, :catch_failures => true)
apply_manifest(manifest, :catch_changes => true)
end
it 'should reflect installed rubies' do
shell("/usr/local/rvm/bin/rvm list") do |r|
r.stdout.should =~ Regexp.new(Regexp.escape("\n #{jruby_version}"))
r.exit_code.should be_zero
end
end
end
context "when installing passenger 3.0.x" do
let(:passenger_version) { "3.0.21" }
let(:passenger_domain) { "passenger3.example.com" }
let(:passenger_ruby) { "#{rvm_path}wrappers/#{ruby19_version}/ruby" }
let(:passenger_root) { "#{ruby19_gems}passenger-#{passenger_version}" }
# particular to 3.0.x (may or may not also work with 2.x?)
let(:passenger_module_path) { "#{passenger_root}/ext/apache2/mod_passenger.so" }
let(:manifest) {
super() + <<-EOS
rvm_system_ruby {
'#{ruby19_version}':
ensure => 'present',
default_use => false,
}
class { 'apache':
service_enable => false, # otherwise detects changes in 2nd run in ubuntu and docker
}
class { 'rvm::passenger::apache':
version => '#{passenger_version}',
ruby_version => '#{ruby19_version}',
mininstances => '3',
maxinstancesperapp => '0',
maxpoolsize => '30',
spawnmethod => 'smart-lv2',
}
/* a simple ruby rack 'hello world' app */
file { '/var/www/passenger':
ensure => directory,
owner => '#{rackapp_user}',
group => '#{rackapp_group}',
require => Class['rvm::passenger::apache'],
}
file { '/var/www/passenger/config.ru':
ensure => file,
owner => '#{rackapp_user}',
group => '#{rackapp_group}',
content => "app = proc { |env| [200, { \\"Content-Type\\" => \\"text/html\\" }, [\\"hello <b>world</b>\\"]] }\\nrun app",
require => File['/var/www/passenger'] ,
}
apache::vhost { '#{passenger_domain}':
port => '80',
docroot => '/var/www/passenger/public',
docroot_group => '#{rackapp_group}' ,
docroot_owner => '#{rackapp_user}' ,
custom_fragment => "PassengerRuby #{passenger_ruby}\\nRailsEnv development" ,
default_vhost => true ,
require => File['/var/www/passenger/config.ru'] ,
}
EOS
}
it "should install with no errors" do
# Run it twice and test for idempotency
apply_manifest(manifest, :catch_failures => true)
apply_manifest(manifest, :catch_changes => true)
shell("rvm #{ruby19_version} do #{ruby19_bin}gem list passenger | grep \"passenger (#{passenger_version})\"").exit_code.should be_zero
end
it "should be running" do
service(service_name) do |s|
s.should_not be_enabled
s.should be_running
end
end
it "should answer" do
shell("/usr/bin/curl localhost:80") do |r|
r.stdout.should =~ /^hello <b>world<\/b>$/
r.exit_code.should == 0
end
end
it "should output status via passenger-status" do
shell("rvmsudo_secure_path=1 /usr/local/rvm/bin/rvm #{ruby19_version} do passenger-status") do |r|
# spacing may vary
r.stdout.should =~ /[\-]+ General information [\-]+/
r.stdout.should =~ /max[ ]+= [0-9]+/
r.stdout.should =~ /count[ ]+= [0-9]+/
r.stdout.should =~ /active[ ]+= [0-9]+/
r.stdout.should =~ /inactive[ ]+= [0-9]+/
r.stdout.should =~ /Waiting on global queue: [0-9]+/
r.exit_code.should == 0
end
end
it "module loading should be configured as expected" do
file(load_file) do |f|
f.should contain "LoadModule passenger_module #{passenger_module_path}"
end
end
it "module behavior should be configured as expected" do
file(conf_file) do |f|
f.should contain "PassengerRoot \"#{passenger_root}\""
f.should contain "PassengerRuby \"#{passenger_ruby}\""
end
end
end
context "when installing passenger 4.0.x" do
let(:passenger_version) { "4.0.46" }
let(:passenger_domain) { "passenger4.example.com" }
let(:passenger_ruby) { "#{rvm_path}wrappers/#{ruby20_version}/ruby" }
let(:passenger_root) { "#{ruby20_gems}passenger-#{passenger_version}" }
# particular to passenger 4.0.x
let(:passenger_module_path) { "#{passenger_root}/buildout/apache2/mod_passenger.so" }
let(:manifest) {
super() + <<-EOS
rvm_system_ruby {
'#{ruby20_version}':
ensure => 'present',
default_use => false,
}
class { 'apache':
service_enable => false, # otherwise detects changes in 2nd run in ubuntu and docker
}
class { 'rvm::passenger::apache':
version => '#{passenger_version}',
ruby_version => '#{ruby20_version}',
mininstances => '3',
maxinstancesperapp => '0',
maxpoolsize => '30',
spawnmethod => 'smart-lv2',
}
/* a simple ruby rack 'hello world' app */
file { '/var/www/passenger':
ensure => directory,
owner => '#{rackapp_user}',
group => '#{rackapp_group}',
require => Class['rvm::passenger::apache'],
}
file { '/var/www/passenger/config.ru':
ensure => file,
owner => '#{rackapp_user}',
group => '#{rackapp_group}',
content => "app = proc { |env| [200, { \\"Content-Type\\" => \\"text/html\\" }, [\\"hello <b>world</b>\\"]] }\\nrun app",
require => File['/var/www/passenger'] ,
}
apache::vhost { '#{passenger_domain}':
port => '80',
docroot => '/var/www/passenger/public',
docroot_group => '#{rackapp_group}' ,
docroot_owner => '#{rackapp_user}' ,
custom_fragment => "PassengerRuby #{passenger_ruby}\\nRailsEnv development" ,
default_vhost => true ,
require => File['/var/www/passenger/config.ru'] ,
}
EOS
}
it "should install with no errors" do
# Run it twice and test for idempotency
apply_manifest(manifest, :catch_failures => true)
apply_manifest(manifest, :catch_changes => true)
shell("/usr/local/rvm/bin/rvm #{ruby20_version} do #{ruby20_bin}gem list passenger | grep \"passenger (#{passenger_version})\"").exit_code.should be_zero
end
it "should be running" do
service(service_name) do |s|
s.should_not be_enabled
s.should be_running
end
end
it "should answer" do
shell("/usr/bin/curl localhost:80") do |r|
r.stdout.should =~ /^hello <b>world<\/b>$/
r.exit_code.should == 0
end
end
it "should output status via passenger-status" do
shell("rvmsudo_secure_path=1 /usr/local/rvm/bin/rvm #{ruby20_version} do passenger-status") do |r|
# spacing may vary
r.stdout.should =~ /[\-]+ General information [\-]+/
r.stdout.should =~ /Max pool size \: [0-9]+/
r.stdout.should =~ /Processes \: [0-9]+/
r.stdout.should =~ /Requests in top\-level queue \: [0-9]+/
r.stdout.should =~ /[\-]+ Application groups [\-]+/
# the following will only appear after a request has been made, as in "should answer to" above
r.stdout.should =~ /App root\: \/var\/www\/passenger/
r.stdout.should =~ /Requests in queue\: [0-9]+/
r.exit_code.should == 0
end
end
it "module loading should be configured as expected" do
file(load_file) do |f|
f.should contain "LoadModule passenger_module #{passenger_module_path}"
end
end
it "module behavior should be configured as expected" do
file(conf_file) do |f|
f.should contain "PassengerRoot \"#{passenger_root}\""
f.should contain "PassengerRuby \"#{passenger_ruby}\""
end
end
end
end