File: framework_spawner_spec.rb

package info (click to toggle)
passenger 2.2.11debian-2
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 11,576 kB
  • ctags: 28,138
  • sloc: cpp: 66,323; ruby: 9,646; ansic: 2,425; python: 141; sh: 56; makefile: 29
file content (133 lines) | stat: -rw-r--r-- 3,319 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
require 'support/config'
require 'support/test_helper'
require 'phusion_passenger/railz/framework_spawner'

require 'ruby/rails/minimal_spawner_spec'
require 'ruby/spawn_server_spec'
require 'ruby/rails/spawner_privilege_lowering_spec'
require 'ruby/rails/spawner_error_handling_spec'
include PhusionPassenger
include PhusionPassenger::Railz

# TODO: test whether FrameworkSpawner restarts ApplicationSpawner if it crashed

describe FrameworkSpawner do
	include TestHelper
	
	before :each do
		@stub = setup_rails_stub('foobar')
		if use_vendor_rails?
			@stub.use_vendor_rails('minimal')
			@spawner = FrameworkSpawner.new(:vendor => "#{@stub.app_root}/vendor/rails")
		else
			version = Application.detect_framework_version(@stub.app_root)
			@spawner = FrameworkSpawner.new(:version => version)
		end
		@spawner.start
		@server = @spawner
	end
	
	after :each do
		@spawner.stop
		@stub.destroy
	end
	
	describe "situations in which Rails is loaded via the gem" do
		def use_vendor_rails?
			false
		end
		
		it_should_behave_like "a spawn server"
	end
	
	describe "situations in which Rails is loaded via vendor folder" do
		def use_vendor_rails?
			true
		end
		
		it_should_behave_like "a spawn server"
	end
	
	def spawn_arbitrary_application
		@spawner.spawn_application(@stub.app_root,
			"lowest_user" => CONFIG['lowest_user'])
	end
end

describe FrameworkSpawner do
	include TestHelper
	
	describe "situations in which Rails is loaded via the gem" do
		def use_vendor_rails?
			false
		end
		
		it_should_behave_like "a minimal spawner"
		it_should_behave_like "handling errors in application initialization"
		it_should_behave_like "handling errors in framework initialization"
	end
	
	describe "situations in which Rails is loaded via vendor folder" do
		def use_vendor_rails?
			true
		end
		
		it_should_behave_like "a minimal spawner"
		it_should_behave_like "handling errors in framework initialization"
	end
	
	def spawn_stub_application(stub, extra_options = {})
		if use_vendor_rails?
			stub.use_vendor_rails('minimal')
		end
		version = Application.detect_framework_version(stub.app_root)
		if version == :vendor
			options = { :vendor => "#{stub.app_root}/vendor/rails" }
		else
			options = { :version => version }
		end
		options["lowest_user"] = CONFIG['lowest_user']
		options = options.merge(extra_options)
		spawner = FrameworkSpawner.new(options)
		spawner.start
		begin
			return spawner.spawn_application(stub.app_root, options)
		ensure
			spawner.stop
		end
	end
	
	def load_nonexistant_framework(options = {})
		spawner = FrameworkSpawner.new(options.merge(:version => "1.9.827"))
		begin
			spawner.start
		ensure
			spawner.stop rescue nil
		end
	end
end

Process.euid == ApplicationSpawner::ROOT_UID &&
describe("FrameworkSpawner privilege lowering support") do
	include TestHelper
	
	it_should_behave_like "a spawner that supports lowering of privileges"
	
	def spawn_stub_application(options = {})
		options = {
			"lower_privilege" => true,
			"lowest_user" => CONFIG['lowest_user']
		}.merge(options)
		@stub.use_vendor_rails('minimal')
		@spawner = FrameworkSpawner.new(:vendor =>
			"#{@stub.app_root}/vendor/rails")
		@spawner.start
		begin
			app = @spawner.spawn_application(@stub.app_root, options)
			yield app
		ensure
			app.close if app
			@spawner.stop
		end
	end
end