passenger 5.0.0.beta3 → 5.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of passenger might be problematic. Click here for more details.

Files changed (218) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.editorconfig +11 -5
  5. data/CHANGELOG +38 -0
  6. data/CONTRIBUTING.md +1 -4
  7. data/Gemfile +0 -1
  8. data/Gemfile.lock +0 -2
  9. data/Rakefile +33 -33
  10. data/bin/passenger +1 -1
  11. data/bin/passenger-config +1 -1
  12. data/bin/passenger-install-apache2-module +800 -800
  13. data/bin/passenger-install-nginx-module +592 -592
  14. data/bin/passenger-memory-stats +127 -127
  15. data/bin/passenger-status +216 -216
  16. data/build/agents.rb +127 -127
  17. data/build/apache2.rb +87 -87
  18. data/build/basics.rb +60 -60
  19. data/build/common_library.rb +165 -165
  20. data/build/cplusplus_support.rb +51 -51
  21. data/build/cxx_tests.rb +268 -268
  22. data/build/debian.rb +143 -143
  23. data/build/documentation.rb +58 -58
  24. data/build/integration_tests.rb +81 -81
  25. data/build/misc.rb +132 -132
  26. data/build/nginx.rb +20 -20
  27. data/build/node_tests.rb +7 -7
  28. data/build/oxt_tests.rb +14 -14
  29. data/build/packaging.rb +570 -570
  30. data/build/preprocessor.rb +260 -260
  31. data/build/rake_extensions.rb +71 -71
  32. data/build/ruby_extension.rb +29 -29
  33. data/build/ruby_tests.rb +6 -6
  34. data/build/test_basics.rb +37 -37
  35. data/debian.template/control.template +3 -5
  36. data/dev/copy_boost_headers +134 -134
  37. data/dev/install_scripts_bootstrap_code.rb +25 -25
  38. data/dev/list_tests +20 -20
  39. data/dev/ruby_server.rb +223 -223
  40. data/dev/runner +18 -18
  41. data/doc/ServerOptimizationGuide.txt.md +55 -2
  42. data/doc/Users guide Nginx.txt +0 -26
  43. data/doc/Users guide Standalone.txt +5 -1
  44. data/doc/users_guide_snippets/tips.txt +9 -0
  45. data/ext/common/ApplicationPool2/Group.h +23 -11
  46. data/ext/common/ApplicationPool2/Implementation.cpp +32 -7
  47. data/ext/common/ApplicationPool2/Pool.h +22 -17
  48. data/ext/common/ApplicationPool2/SmartSpawner.h +4 -1
  49. data/ext/common/ApplicationPool2/Spawner.h +1 -1
  50. data/ext/common/Constants.h +1 -1
  51. data/ext/common/agents/Base.cpp +35 -20
  52. data/ext/common/agents/HelperAgent/Main.cpp +8 -1
  53. data/ext/common/agents/HelperAgent/OptionParser.h +18 -4
  54. data/ext/common/agents/HelperAgent/RequestHandler.h +2 -83
  55. data/ext/common/agents/HelperAgent/RequestHandler/ForwardResponse.cpp +54 -1
  56. data/ext/common/agents/HelperAgent/RequestHandler/InitRequest.cpp +7 -4
  57. data/ext/common/agents/Main.cpp +1 -1
  58. data/ext/common/agents/Watchdog/Main.cpp +54 -19
  59. data/ext/nginx/Configuration.c +7 -0
  60. data/ext/nginx/ContentHandler.c +9 -1
  61. data/helper-scripts/backtrace-sanitizer.rb +106 -87
  62. data/helper-scripts/crash-watch.rb +32 -0
  63. data/helper-scripts/download_binaries/extconf.rb +38 -38
  64. data/helper-scripts/meteor-loader.rb +107 -107
  65. data/helper-scripts/prespawn +101 -101
  66. data/helper-scripts/rack-loader.rb +96 -96
  67. data/helper-scripts/rack-preloader.rb +137 -137
  68. data/lib/phusion_passenger.rb +292 -292
  69. data/lib/phusion_passenger/abstract_installer.rb +438 -438
  70. data/lib/phusion_passenger/active_support3_extensions/init.rb +168 -170
  71. data/lib/phusion_passenger/admin_tools.rb +20 -20
  72. data/lib/phusion_passenger/admin_tools/instance.rb +178 -178
  73. data/lib/phusion_passenger/admin_tools/instance_registry.rb +61 -61
  74. data/lib/phusion_passenger/admin_tools/memory_stats.rb +267 -267
  75. data/lib/phusion_passenger/apache2/config_options.rb +182 -182
  76. data/lib/phusion_passenger/common_library.rb +479 -485
  77. data/lib/phusion_passenger/config/about_command.rb +161 -161
  78. data/lib/phusion_passenger/config/admin_command_command.rb +129 -129
  79. data/lib/phusion_passenger/config/agent_compiler.rb +121 -121
  80. data/lib/phusion_passenger/config/build_native_support_command.rb +43 -43
  81. data/lib/phusion_passenger/config/command.rb +25 -25
  82. data/lib/phusion_passenger/config/compile_agent_command.rb +62 -62
  83. data/lib/phusion_passenger/config/compile_nginx_engine_command.rb +88 -73
  84. data/lib/phusion_passenger/config/detach_process_command.rb +72 -72
  85. data/lib/phusion_passenger/config/download_agent_command.rb +246 -227
  86. data/lib/phusion_passenger/config/download_nginx_engine_command.rb +245 -224
  87. data/lib/phusion_passenger/config/install_agent_command.rb +144 -132
  88. data/lib/phusion_passenger/config/install_standalone_runtime_command.rb +205 -185
  89. data/lib/phusion_passenger/config/installation_utils.rb +204 -204
  90. data/lib/phusion_passenger/config/list_instances_command.rb +64 -64
  91. data/lib/phusion_passenger/config/main.rb +152 -152
  92. data/lib/phusion_passenger/config/nginx_engine_compiler.rb +319 -300
  93. data/lib/phusion_passenger/config/reopen_logs_command.rb +67 -67
  94. data/lib/phusion_passenger/config/restart_app_command.rb +155 -155
  95. data/lib/phusion_passenger/config/system_metrics_command.rb +13 -13
  96. data/lib/phusion_passenger/config/utils.rb +95 -95
  97. data/lib/phusion_passenger/config/validate_install_command.rb +198 -198
  98. data/lib/phusion_passenger/console_text_template.rb +25 -25
  99. data/lib/phusion_passenger/constants.rb +90 -90
  100. data/lib/phusion_passenger/debug_logging.rb +106 -106
  101. data/lib/phusion_passenger/loader_shared_helpers.rb +447 -432
  102. data/lib/phusion_passenger/message_channel.rb +312 -312
  103. data/lib/phusion_passenger/message_client.rb +176 -176
  104. data/lib/phusion_passenger/native_support.rb +369 -369
  105. data/lib/phusion_passenger/nginx/config_options.rb +297 -297
  106. data/lib/phusion_passenger/packaging.rb +131 -131
  107. data/lib/phusion_passenger/platform_info.rb +360 -360
  108. data/lib/phusion_passenger/platform_info/apache.rb +767 -767
  109. data/lib/phusion_passenger/platform_info/apache_detector.rb +199 -199
  110. data/lib/phusion_passenger/platform_info/binary_compatibility.rb +107 -107
  111. data/lib/phusion_passenger/platform_info/compiler.rb +570 -570
  112. data/lib/phusion_passenger/platform_info/curl.rb +32 -32
  113. data/lib/phusion_passenger/platform_info/cxx_portability.rb +188 -188
  114. data/lib/phusion_passenger/platform_info/depcheck.rb +372 -372
  115. data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +109 -109
  116. data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
  117. data/lib/phusion_passenger/platform_info/depcheck_specs/gems.rb +10 -34
  118. data/lib/phusion_passenger/platform_info/depcheck_specs/libs.rb +101 -101
  119. data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -5
  120. data/lib/phusion_passenger/platform_info/depcheck_specs/utilities.rb +13 -13
  121. data/lib/phusion_passenger/platform_info/linux.rb +55 -55
  122. data/lib/phusion_passenger/platform_info/operating_system.rb +149 -149
  123. data/lib/phusion_passenger/platform_info/ruby.rb +468 -448
  124. data/lib/phusion_passenger/platform_info/zlib.rb +9 -9
  125. data/lib/phusion_passenger/plugin.rb +66 -66
  126. data/lib/phusion_passenger/preloader_shared_helpers.rb +126 -126
  127. data/lib/phusion_passenger/public_api.rb +191 -191
  128. data/lib/phusion_passenger/rack/out_of_band_gc.rb +93 -94
  129. data/lib/phusion_passenger/rack/thread_handler_extension.rb +231 -227
  130. data/lib/phusion_passenger/request_handler.rb +567 -577
  131. data/lib/phusion_passenger/request_handler/thread_handler.rb +379 -381
  132. data/lib/phusion_passenger/ruby_core_enhancements.rb +86 -86
  133. data/lib/phusion_passenger/ruby_core_io_enhancements.rb +74 -74
  134. data/lib/phusion_passenger/simple_benchmarking.rb +25 -25
  135. data/lib/phusion_passenger/standalone/app_finder.rb +153 -150
  136. data/lib/phusion_passenger/standalone/command.rb +44 -40
  137. data/lib/phusion_passenger/standalone/config_utils.rb +53 -53
  138. data/lib/phusion_passenger/standalone/control_utils.rb +38 -59
  139. data/lib/phusion_passenger/standalone/main.rb +73 -73
  140. data/lib/phusion_passenger/standalone/start_command.rb +697 -685
  141. data/lib/phusion_passenger/standalone/start_command/builtin_engine.rb +193 -155
  142. data/lib/phusion_passenger/standalone/start_command/nginx_engine.rb +162 -133
  143. data/lib/phusion_passenger/standalone/status_command.rb +64 -64
  144. data/lib/phusion_passenger/standalone/stop_command.rb +72 -72
  145. data/lib/phusion_passenger/standalone/version_command.rb +9 -9
  146. data/lib/phusion_passenger/union_station/connection.rb +32 -32
  147. data/lib/phusion_passenger/union_station/core.rb +251 -251
  148. data/lib/phusion_passenger/union_station/transaction.rb +126 -126
  149. data/lib/phusion_passenger/utils.rb +199 -167
  150. data/lib/phusion_passenger/utils/ansi_colors.rb +128 -128
  151. data/lib/phusion_passenger/utils/download.rb +196 -196
  152. data/lib/phusion_passenger/utils/file_system_watcher.rb +158 -158
  153. data/lib/phusion_passenger/utils/hosts_file_parser.rb +101 -101
  154. data/lib/phusion_passenger/utils/lock.rb +31 -31
  155. data/lib/phusion_passenger/utils/native_support_utils.rb +31 -31
  156. data/lib/phusion_passenger/utils/progress_bar.rb +26 -26
  157. data/lib/phusion_passenger/utils/shellwords.rb +20 -20
  158. data/lib/phusion_passenger/utils/terminal_choice_menu.rb +206 -206
  159. data/lib/phusion_passenger/utils/unseekable_socket.rb +272 -272
  160. data/lib/phusion_passenger/vendor/crash_watch/app.rb +129 -0
  161. data/lib/phusion_passenger/vendor/crash_watch/gdb_controller.rb +341 -0
  162. data/lib/phusion_passenger/vendor/crash_watch/version.rb +24 -0
  163. data/lib/phusion_passenger/vendor/daemon_controller.rb +877 -0
  164. data/lib/phusion_passenger/vendor/daemon_controller/lock_file.rb +127 -0
  165. data/lib/phusion_passenger/vendor/daemon_controller/spawn.rb +26 -0
  166. data/lib/phusion_passenger/vendor/daemon_controller/version.rb +29 -0
  167. data/packaging/rpm/passenger_spec/passenger.spec.template +0 -1
  168. data/passenger.gemspec +0 -1
  169. data/resources/templates/config/nginx_engine_compiler/possible_solutions_for_download_and_extraction_problems.txt.erb +27 -0
  170. data/resources/templates/standalone/config.erb +19 -15
  171. data/test/integration_tests/apache2_tests.rb +566 -566
  172. data/test/integration_tests/downloaded_binaries_tests.rb +126 -125
  173. data/test/integration_tests/native_packaging_spec.rb +296 -296
  174. data/test/integration_tests/nginx_tests.rb +393 -393
  175. data/test/integration_tests/shared/example_webapp_tests.rb +282 -280
  176. data/test/integration_tests/source_packaging_test.rb +138 -138
  177. data/test/integration_tests/spec_helper.rb +5 -5
  178. data/test/integration_tests/standalone_tests.rb +367 -367
  179. data/test/ruby/debug_logging_spec.rb +133 -133
  180. data/test/ruby/message_channel_spec.rb +186 -186
  181. data/test/ruby/rack/loader_spec.rb +28 -28
  182. data/test/ruby/rack/preloader_spec.rb +34 -34
  183. data/test/ruby/rails3.0/loader_spec.rb +12 -12
  184. data/test/ruby/rails3.0/preloader_spec.rb +18 -18
  185. data/test/ruby/rails3.1/loader_spec.rb +12 -12
  186. data/test/ruby/rails3.1/preloader_spec.rb +18 -18
  187. data/test/ruby/rails3.2/loader_spec.rb +12 -12
  188. data/test/ruby/rails3.2/preloader_spec.rb +18 -18
  189. data/test/ruby/rails4.0/loader_spec.rb +12 -12
  190. data/test/ruby/rails4.0/preloader_spec.rb +18 -18
  191. data/test/ruby/rails4.1/loader_spec.rb +12 -12
  192. data/test/ruby/rails4.1/preloader_spec.rb +18 -18
  193. data/test/ruby/request_handler_spec.rb +730 -730
  194. data/test/ruby/shared/loader_sharedspec.rb +224 -224
  195. data/test/ruby/shared/rails/union_station_extensions_sharedspec.rb +327 -327
  196. data/test/ruby/shared/ruby_loader_sharedspec.rb +47 -47
  197. data/test/ruby/spec_helper.rb +65 -65
  198. data/test/ruby/standalone/runtime_installer_spec.rb +384 -384
  199. data/test/ruby/union_station_spec.rb +276 -276
  200. data/test/ruby/utils/file_system_watcher_spec.rb +220 -220
  201. data/test/ruby/utils/hosts_file_parser.rb +248 -248
  202. data/test/ruby/utils/tee_input_spec.rb +215 -215
  203. data/test/ruby/utils/unseekable_socket_spec.rb +57 -57
  204. data/test/ruby/utils_spec.rb +21 -21
  205. data/test/stub/rack/config.ru +87 -87
  206. data/test/stub/rack/library.rb +8 -8
  207. data/test/stub/rack/start.rb +30 -30
  208. data/test/support/apache2_controller.rb +191 -191
  209. data/test/support/nginx_controller.rb +90 -99
  210. data/test/support/placebo-preloader.rb +57 -57
  211. data/test/support/test_helper.rb +435 -435
  212. metadata +11 -21
  213. metadata.gz.asc +7 -7
  214. data/lib/phusion_passenger/standalone/command2.rb +0 -292
  215. data/lib/phusion_passenger/standalone/start2_command.rb +0 -799
  216. data/resources/templates/standalone/download_tool_missing.txt.erb +0 -18
  217. data/resources/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -17
  218. data/resources/templates/standalone/run_installer_as_root.txt.erb +0 -8
@@ -6,397 +6,397 @@ WEB_SERVER_DECHUNKS_REQUESTS = true
6
6
  require 'integration_tests/shared/example_webapp_tests'
7
7
 
8
8
  describe "Phusion Passenger for Nginx" do
9
- before :all do
10
- if !CONFIG['nginx']
11
- STDERR.puts "*** ERROR: You must set the 'nginx' config option in test/config.json."
12
- exit!(1)
13
- end
14
-
15
- check_hosts_configuration
16
- FileUtils.mkdir_p("tmp.nginx")
17
- end
18
-
19
- after :all do
20
- begin
21
- @nginx.stop if @nginx
22
- ensure
23
- FileUtils.rm_rf("tmp.nginx")
24
- end
25
- end
26
-
27
- before :each do
28
- File.open("test.log", "a") do |f|
29
- # Make sure that all Nginx log output is prepended by the test description
30
- # so that we know which messages are associated with which tests.
31
- f.puts "\n#### #{Time.now}: #{example.full_description}"
32
- @test_log_pos = f.pos
33
- end
34
- end
35
-
36
- after :each do
37
- log "End of test"
38
- if example.exception
39
- puts "\t---------------- Begin logs -------------------"
40
- File.open("test.log", "r") do |f|
41
- f.seek(@test_log_pos)
42
- puts f.read.split("\n").map{ |line| "\t#{line}" }.join("\n")
43
- end
44
- puts "\t---------------- End logs -------------------"
45
- puts "\tThe following test failed. The web server logs are printed above."
46
- end
47
- end
48
-
49
- def create_nginx_controller(options = {})
50
- @nginx = NginxController.new("tmp.nginx")
51
- if Process.uid == 0
52
- @nginx.set({
53
- :www_user => CONFIG['normal_user_1'],
54
- :www_group => Etc.getgrgid(Etc.getpwnam(CONFIG['normal_user_1']).gid).name
55
- }.merge(options))
56
- end
57
- end
58
-
59
- def log(message)
60
- File.open("test.log", "a") do |f|
61
- f.puts "[#{Time.now}] Spec: #{message}"
62
- end
63
- end
64
-
65
- describe "a Ruby app running on the root URI" do
66
- before :all do
67
- create_nginx_controller
68
- @server = "http://1.passenger.test:#{@nginx.port}"
69
- @stub = RackStub.new('rack')
70
- @nginx.add_server do |server|
71
- server[:server_name] = "1.passenger.test"
72
- server[:root] = "#{@stub.full_app_root}/public"
73
- end
74
- @nginx.start
75
- end
76
-
77
- after :all do
78
- @stub.destroy
79
- @nginx.stop if @nginx
80
- end
81
-
82
- before :each do
83
- @stub.reset
84
- end
85
-
86
- it_should_behave_like "an example web app"
87
- end
88
-
89
- describe "a Ruby app running in a sub-URI" do
90
- before :all do
91
- create_nginx_controller
92
- @server = "http://1.passenger.test:#{@nginx.port}/subapp"
93
- @stub = RackStub.new('rack')
94
- @nginx.add_server do |server|
95
- server[:server_name] = "1.passenger.test"
96
- server[:root] = File.expand_path("stub")
97
- server << %Q{
98
- location ~ ^/subapp(/.*|$) {
99
- alias #{@stub.full_app_root}/public$1;
100
- passenger_base_uri /subapp;
101
- passenger_document_root #{@stub.full_app_root}/public;
102
- passenger_app_root #{@stub.full_app_root};
103
- passenger_enabled on;
104
- }
105
- }
106
- end
107
- @nginx.start
108
- end
109
-
110
- after :all do
111
- @stub.destroy
112
- @nginx.stop if @nginx
113
- end
114
-
115
- before :each do
116
- @stub.reset
117
- end
118
-
119
- it_should_behave_like "an example web app"
120
-
121
- it "does not interfere with the root website" do
122
- @server = "http://1.passenger.test:#{@nginx.port}"
123
- get('/').should == "This is the stub directory."
124
- end
125
- end
126
-
127
- describe "a Python app running on the root URI" do
128
- before :all do
129
- create_nginx_controller
130
- @server = "http://1.passenger.test:#{@nginx.port}"
131
- @stub = PythonStub.new('wsgi')
132
- @nginx.add_server do |server|
133
- server[:server_name] = "1.passenger.test"
134
- server[:root] = "#{@stub.full_app_root}/public"
135
- end
136
- @nginx.start
137
- end
138
-
139
- after :all do
140
- @stub.destroy
141
- @nginx.stop if @nginx
142
- end
143
-
144
- before :each do
145
- @stub.reset
146
- end
147
-
148
- it_should_behave_like "an example web app"
149
- end
150
-
151
- describe "a Python app running in a sub-URI" do
152
- before :all do
153
- create_nginx_controller
154
- @server = "http://1.passenger.test:#{@nginx.port}/subapp"
155
- @stub = PythonStub.new('wsgi')
156
- @nginx.add_server do |server|
157
- server[:server_name] = "1.passenger.test"
158
- server[:root] = File.expand_path("stub")
159
- server << %Q{
160
- location ~ ^/subapp(/.*|$) {
161
- alias #{@stub.full_app_root}/public$1;
162
- passenger_base_uri /subapp;
163
- passenger_app_root #{@stub.full_app_root};
164
- passenger_document_root #{@stub.full_app_root}/public;
165
- passenger_enabled on;
166
- }
167
- }
168
- end
169
- @nginx.start
170
- end
171
-
172
- after :all do
173
- @stub.destroy
174
- @nginx.stop if @nginx
175
- end
176
-
177
- before :each do
178
- @stub.reset
179
- end
180
-
181
- it_should_behave_like "an example web app"
182
-
183
- it "does not interfere with the root website" do
184
- @server = "http://1.passenger.test:#{@nginx.port}"
185
- get('/').should == "This is the stub directory."
186
- end
187
- end
188
-
189
- describe "a Node.js app running on the root URI" do
190
- before :all do
191
- create_nginx_controller
192
- @server = "http://1.passenger.test:#{@nginx.port}"
193
- @stub = NodejsStub.new('node')
194
- @nginx.add_server do |server|
195
- server[:server_name] = "1.passenger.test"
196
- server[:root] = "#{@stub.full_app_root}/public"
197
- end
198
- @nginx.start
199
- end
200
-
201
- after :all do
202
- @stub.destroy
203
- @nginx.stop if @nginx
204
- end
205
-
206
- before :each do
207
- @stub.reset
208
- end
209
-
210
- it_should_behave_like "an example web app"
211
- end
212
-
213
- describe "a Node.js app running in a sub-URI" do
214
- before :all do
215
- create_nginx_controller
216
- @server = "http://1.passenger.test:#{@nginx.port}/subapp"
217
- @stub = NodejsStub.new('node')
218
- @nginx.add_server do |server|
219
- server[:server_name] = "1.passenger.test"
220
- server[:root] = File.expand_path("stub")
221
- server[:passenger_friendly_error_pages] = 'on'
222
- server << %Q{
223
- location ~ ^/subapp(/.*|$) {
224
- alias #{@stub.full_app_root}/public$1;
225
- passenger_base_uri /subapp;
226
- passenger_document_root #{@stub.full_app_root}/public;
227
- passenger_app_root #{@stub.full_app_root};
228
- passenger_enabled on;
229
- }
230
- }
231
- end
232
- @nginx.start
233
- end
234
-
235
- after :all do
236
- @stub.destroy
237
- @nginx.stop if @nginx
238
- end
239
-
240
- before :each do
241
- @stub.reset
242
- end
243
-
244
- it_should_behave_like "an example web app"
245
-
246
- it "does not interfere with the root website" do
247
- @server = "http://1.passenger.test:#{@nginx.port}"
248
- get('/').should == "This is the stub directory."
249
- end
250
- end
251
-
252
- describe "various features" do
253
- before :all do
254
- create_nginx_controller
255
- @server = "http://1.passenger.test:#{@nginx.port}"
256
- @stub = RackStub.new('rack')
257
- @nginx.set(:stat_throttle_rate => 0)
258
- @nginx.add_server do |server|
259
- server[:server_name] = "1.passenger.test"
260
- server[:root] = "#{@stub.full_app_root}/public"
261
- server[:passenger_load_shell_envvars] = "off"
262
- server[:passenger_friendly_error_pages] = "on"
263
- server << %q{
264
- location /crash_without_friendly_error_page {
265
- passenger_enabled on;
266
- passenger_friendly_error_pages off;
267
- }
268
- }
269
- end
270
- @nginx.add_server do |server|
271
- server[:server_name] = "2.passenger.test"
272
- server[:root] = "#{@stub.full_app_root}/public"
273
- server[:passenger_app_group_name] = "secondary"
274
- server[:passenger_load_shell_envvars] = "off"
275
- end
276
- @nginx.add_server do |server|
277
- server[:server_name] = "3.passenger.test"
278
- server[:passenger_app_group_name] = "tertiary"
279
- server[:root] = "#{@stub.full_app_root}/public"
280
- server[:passenger_load_shell_envvars] = "off"
281
- server[:passenger_max_requests] = 3
282
- end
283
- @nginx.start
284
- end
285
-
286
- after :all do
287
- @stub.destroy
288
- @nginx.stop if @nginx
289
- end
290
-
291
- before :each do
292
- @stub.reset
293
- @error_page_signature = /<meta name="generator" content="Phusion Passenger">/
294
- File.touch("#{@stub.app_root}/tmp/restart.txt", 1 + rand(100000))
295
- end
296
-
297
- it "sets ENV['SERVER_SOFTWARE']" do
298
- File.write("#{@stub.app_root}/config.ru", %q{
299
- server_software = ENV['SERVER_SOFTWARE']
300
- app = lambda do |env|
301
- [200, { "Content-Type" => "text/plain" }, [server_software]]
302
- end
303
- run app
304
- })
305
- get('/').should =~ /nginx/i
306
- end
307
-
308
- it "displays a friendly error page if the application fails to spawn" do
309
- File.write("#{@stub.app_root}/config.ru", %q{
310
- raise "my error"
311
- })
312
- data = get('/')
313
- data.should =~ /#{@error_page_signature}/
314
- data.should =~ /my error/
315
- end
316
-
317
- it "doesn't display a friendly error page if the application fails to spawn but passenger_friendly_error_pages is off" do
318
- File.write("#{@stub.app_root}/config.ru", %q{
319
- raise "my error"
320
- })
321
- data = get('/crash_without_friendly_error_page')
322
- data.should_not =~ /#{@error_page_signature}/
323
- data.should_not =~ /my error/
324
- end
325
-
326
- it "appends an X-Powered-By header containing the Phusion Passenger version number" do
327
- response = get_response('/')
328
- response["X-Powered-By"].should include("Phusion Passenger")
329
- response["X-Powered-By"].should include(PhusionPassenger::VERSION_STRING)
330
- end
331
-
332
- it "respawns the app after handling max_requests requests" do
333
- @server = "http://3.passenger.test:#{@nginx.port}/"
334
- pid = get("/pid")
335
- get("/pid").should == pid
336
- get("/pid").should == pid
337
- get("/pid").should_not == pid
338
- end
339
- end
340
-
341
- describe "oob work" do
342
- before :all do
343
- create_nginx_controller
344
- @server = "http://passenger.test:#{@nginx.port}"
345
- @stub = RackStub.new('rack')
346
- @nginx.set(:max_pool_size => 2)
347
- @nginx.add_server do |server|
348
- server[:server_name] = "passenger.test"
349
- server[:root] = "#{@stub.full_app_root}/public"
350
- end
351
- end
352
-
353
- after :all do
354
- @stub.destroy
355
- @nginx.stop if @nginx
356
- end
357
-
358
- before :each do
359
- @stub.reset
360
-
361
- File.write("#{@stub.app_root}/config.ru", <<-RUBY)
362
- PhusionPassenger.on_event(:oob_work) do
363
- f = File.open("#{@stub.full_app_root}/oob_work.\#{$$}", 'w')
364
- f.close
365
- sleep 1
366
- end
367
- app = lambda do |env|
368
- if env['PATH_INFO'] == '/oobw'
369
- [200, { "Content-Type" => "text/html", "!~Request-OOB-Work" => 'true' }, [$$]]
370
- else
371
- [200, { "Content-Type" => "text/html" }, [$$]]
372
- end
373
- end
374
- run app
375
- RUBY
376
-
377
- @nginx.start
378
- end
379
-
380
- it "invokes oobw when requested by the app process" do
381
- pid = get("/oobw")
382
- sleep 0.5 # wait for oobw callback to be invoked
383
- File.exists?("#{@stub.app_root}/oob_work.#{pid}").should == true
384
- end
385
-
386
- it "does not block client while invoking oob work" do
387
- get("/") # ensure there are spawned app processes
388
- t0 = Time.now
389
- get("/oobw")
390
- secs = Time.now - t0
391
- secs.should <= 0.1
392
- end
393
- end
394
-
395
- ##### Helper methods #####
396
-
397
- def start_web_server_if_necessary
398
- if !@nginx.running?
399
- @nginx.start
400
- end
401
- end
9
+ before :all do
10
+ if !CONFIG['nginx']
11
+ STDERR.puts "*** ERROR: You must set the 'nginx' config option in test/config.json."
12
+ exit!(1)
13
+ end
14
+
15
+ check_hosts_configuration
16
+ FileUtils.mkdir_p("tmp.nginx")
17
+ end
18
+
19
+ after :all do
20
+ begin
21
+ @nginx.stop if @nginx
22
+ ensure
23
+ FileUtils.rm_rf("tmp.nginx")
24
+ end
25
+ end
26
+
27
+ before :each do
28
+ File.open("test.log", "a") do |f|
29
+ # Make sure that all Nginx log output is prepended by the test description
30
+ # so that we know which messages are associated with which tests.
31
+ f.puts "\n#### #{Time.now}: #{example.full_description}"
32
+ @test_log_pos = f.pos
33
+ end
34
+ end
35
+
36
+ after :each do
37
+ log "End of test"
38
+ if example.exception
39
+ puts "\t---------------- Begin logs -------------------"
40
+ File.open("test.log", "r") do |f|
41
+ f.seek(@test_log_pos)
42
+ puts f.read.split("\n").map{ |line| "\t#{line}" }.join("\n")
43
+ end
44
+ puts "\t---------------- End logs -------------------"
45
+ puts "\tThe following test failed. The web server logs are printed above."
46
+ end
47
+ end
48
+
49
+ def create_nginx_controller(options = {})
50
+ @nginx = NginxController.new("tmp.nginx")
51
+ if Process.uid == 0
52
+ @nginx.set({
53
+ :www_user => CONFIG['normal_user_1'],
54
+ :www_group => Etc.getgrgid(Etc.getpwnam(CONFIG['normal_user_1']).gid).name
55
+ }.merge(options))
56
+ end
57
+ end
58
+
59
+ def log(message)
60
+ File.open("test.log", "a") do |f|
61
+ f.puts "[#{Time.now}] Spec: #{message}"
62
+ end
63
+ end
64
+
65
+ describe "a Ruby app running on the root URI" do
66
+ before :all do
67
+ create_nginx_controller
68
+ @server = "http://1.passenger.test:#{@nginx.port}"
69
+ @stub = RackStub.new('rack')
70
+ @nginx.add_server do |server|
71
+ server[:server_name] = "1.passenger.test"
72
+ server[:root] = "#{@stub.full_app_root}/public"
73
+ end
74
+ @nginx.start
75
+ end
76
+
77
+ after :all do
78
+ @stub.destroy
79
+ @nginx.stop if @nginx
80
+ end
81
+
82
+ before :each do
83
+ @stub.reset
84
+ end
85
+
86
+ it_should_behave_like "an example web app"
87
+ end
88
+
89
+ describe "a Ruby app running in a sub-URI" do
90
+ before :all do
91
+ create_nginx_controller
92
+ @server = "http://1.passenger.test:#{@nginx.port}/subapp"
93
+ @stub = RackStub.new('rack')
94
+ @nginx.add_server do |server|
95
+ server[:server_name] = "1.passenger.test"
96
+ server[:root] = File.expand_path("stub")
97
+ server << %Q{
98
+ location ~ ^/subapp(/.*|$) {
99
+ alias #{@stub.full_app_root}/public$1;
100
+ passenger_base_uri /subapp;
101
+ passenger_document_root #{@stub.full_app_root}/public;
102
+ passenger_app_root #{@stub.full_app_root};
103
+ passenger_enabled on;
104
+ }
105
+ }
106
+ end
107
+ @nginx.start
108
+ end
109
+
110
+ after :all do
111
+ @stub.destroy
112
+ @nginx.stop if @nginx
113
+ end
114
+
115
+ before :each do
116
+ @stub.reset
117
+ end
118
+
119
+ it_should_behave_like "an example web app"
120
+
121
+ it "does not interfere with the root website" do
122
+ @server = "http://1.passenger.test:#{@nginx.port}"
123
+ get('/').should == "This is the stub directory."
124
+ end
125
+ end
126
+
127
+ describe "a Python app running on the root URI" do
128
+ before :all do
129
+ create_nginx_controller
130
+ @server = "http://1.passenger.test:#{@nginx.port}"
131
+ @stub = PythonStub.new('wsgi')
132
+ @nginx.add_server do |server|
133
+ server[:server_name] = "1.passenger.test"
134
+ server[:root] = "#{@stub.full_app_root}/public"
135
+ end
136
+ @nginx.start
137
+ end
138
+
139
+ after :all do
140
+ @stub.destroy
141
+ @nginx.stop if @nginx
142
+ end
143
+
144
+ before :each do
145
+ @stub.reset
146
+ end
147
+
148
+ it_should_behave_like "an example web app"
149
+ end
150
+
151
+ describe "a Python app running in a sub-URI" do
152
+ before :all do
153
+ create_nginx_controller
154
+ @server = "http://1.passenger.test:#{@nginx.port}/subapp"
155
+ @stub = PythonStub.new('wsgi')
156
+ @nginx.add_server do |server|
157
+ server[:server_name] = "1.passenger.test"
158
+ server[:root] = File.expand_path("stub")
159
+ server << %Q{
160
+ location ~ ^/subapp(/.*|$) {
161
+ alias #{@stub.full_app_root}/public$1;
162
+ passenger_base_uri /subapp;
163
+ passenger_app_root #{@stub.full_app_root};
164
+ passenger_document_root #{@stub.full_app_root}/public;
165
+ passenger_enabled on;
166
+ }
167
+ }
168
+ end
169
+ @nginx.start
170
+ end
171
+
172
+ after :all do
173
+ @stub.destroy
174
+ @nginx.stop if @nginx
175
+ end
176
+
177
+ before :each do
178
+ @stub.reset
179
+ end
180
+
181
+ it_should_behave_like "an example web app"
182
+
183
+ it "does not interfere with the root website" do
184
+ @server = "http://1.passenger.test:#{@nginx.port}"
185
+ get('/').should == "This is the stub directory."
186
+ end
187
+ end
188
+
189
+ describe "a Node.js app running on the root URI" do
190
+ before :all do
191
+ create_nginx_controller
192
+ @server = "http://1.passenger.test:#{@nginx.port}"
193
+ @stub = NodejsStub.new('node')
194
+ @nginx.add_server do |server|
195
+ server[:server_name] = "1.passenger.test"
196
+ server[:root] = "#{@stub.full_app_root}/public"
197
+ end
198
+ @nginx.start
199
+ end
200
+
201
+ after :all do
202
+ @stub.destroy
203
+ @nginx.stop if @nginx
204
+ end
205
+
206
+ before :each do
207
+ @stub.reset
208
+ end
209
+
210
+ it_should_behave_like "an example web app"
211
+ end
212
+
213
+ describe "a Node.js app running in a sub-URI" do
214
+ before :all do
215
+ create_nginx_controller
216
+ @server = "http://1.passenger.test:#{@nginx.port}/subapp"
217
+ @stub = NodejsStub.new('node')
218
+ @nginx.add_server do |server|
219
+ server[:server_name] = "1.passenger.test"
220
+ server[:root] = File.expand_path("stub")
221
+ server[:passenger_friendly_error_pages] = 'on'
222
+ server << %Q{
223
+ location ~ ^/subapp(/.*|$) {
224
+ alias #{@stub.full_app_root}/public$1;
225
+ passenger_base_uri /subapp;
226
+ passenger_document_root #{@stub.full_app_root}/public;
227
+ passenger_app_root #{@stub.full_app_root};
228
+ passenger_enabled on;
229
+ }
230
+ }
231
+ end
232
+ @nginx.start
233
+ end
234
+
235
+ after :all do
236
+ @stub.destroy
237
+ @nginx.stop if @nginx
238
+ end
239
+
240
+ before :each do
241
+ @stub.reset
242
+ end
243
+
244
+ it_should_behave_like "an example web app"
245
+
246
+ it "does not interfere with the root website" do
247
+ @server = "http://1.passenger.test:#{@nginx.port}"
248
+ get('/').should == "This is the stub directory."
249
+ end
250
+ end
251
+
252
+ describe "various features" do
253
+ before :all do
254
+ create_nginx_controller
255
+ @server = "http://1.passenger.test:#{@nginx.port}"
256
+ @stub = RackStub.new('rack')
257
+ @nginx.set(:stat_throttle_rate => 0)
258
+ @nginx.add_server do |server|
259
+ server[:server_name] = "1.passenger.test"
260
+ server[:root] = "#{@stub.full_app_root}/public"
261
+ server[:passenger_load_shell_envvars] = "off"
262
+ server[:passenger_friendly_error_pages] = "on"
263
+ server << %q{
264
+ location /crash_without_friendly_error_page {
265
+ passenger_enabled on;
266
+ passenger_friendly_error_pages off;
267
+ }
268
+ }
269
+ end
270
+ @nginx.add_server do |server|
271
+ server[:server_name] = "2.passenger.test"
272
+ server[:root] = "#{@stub.full_app_root}/public"
273
+ server[:passenger_app_group_name] = "secondary"
274
+ server[:passenger_load_shell_envvars] = "off"
275
+ end
276
+ @nginx.add_server do |server|
277
+ server[:server_name] = "3.passenger.test"
278
+ server[:passenger_app_group_name] = "tertiary"
279
+ server[:root] = "#{@stub.full_app_root}/public"
280
+ server[:passenger_load_shell_envvars] = "off"
281
+ server[:passenger_max_requests] = 3
282
+ end
283
+ @nginx.start
284
+ end
285
+
286
+ after :all do
287
+ @stub.destroy
288
+ @nginx.stop if @nginx
289
+ end
290
+
291
+ before :each do
292
+ @stub.reset
293
+ @error_page_signature = /<meta name="generator" content="Phusion Passenger">/
294
+ File.touch("#{@stub.app_root}/tmp/restart.txt", 1 + rand(100000))
295
+ end
296
+
297
+ it "sets ENV['SERVER_SOFTWARE']" do
298
+ File.write("#{@stub.app_root}/config.ru", %q{
299
+ server_software = ENV['SERVER_SOFTWARE']
300
+ app = lambda do |env|
301
+ [200, { "Content-Type" => "text/plain" }, [server_software]]
302
+ end
303
+ run app
304
+ })
305
+ get('/').should =~ /nginx/i
306
+ end
307
+
308
+ it "displays a friendly error page if the application fails to spawn" do
309
+ File.write("#{@stub.app_root}/config.ru", %q{
310
+ raise "my error"
311
+ })
312
+ data = get('/')
313
+ data.should =~ /#{@error_page_signature}/
314
+ data.should =~ /my error/
315
+ end
316
+
317
+ it "doesn't display a friendly error page if the application fails to spawn but passenger_friendly_error_pages is off" do
318
+ File.write("#{@stub.app_root}/config.ru", %q{
319
+ raise "my error"
320
+ })
321
+ data = get('/crash_without_friendly_error_page')
322
+ data.should_not =~ /#{@error_page_signature}/
323
+ data.should_not =~ /my error/
324
+ end
325
+
326
+ it "appends an X-Powered-By header containing the Phusion Passenger version number" do
327
+ response = get_response('/')
328
+ response["X-Powered-By"].should include("Phusion Passenger")
329
+ response["X-Powered-By"].should include(PhusionPassenger::VERSION_STRING)
330
+ end
331
+
332
+ it "respawns the app after handling max_requests requests" do
333
+ @server = "http://3.passenger.test:#{@nginx.port}/"
334
+ pid = get("/pid")
335
+ get("/pid").should == pid
336
+ get("/pid").should == pid
337
+ get("/pid").should_not == pid
338
+ end
339
+ end
340
+
341
+ describe "oob work" do
342
+ before :all do
343
+ create_nginx_controller
344
+ @server = "http://passenger.test:#{@nginx.port}"
345
+ @stub = RackStub.new('rack')
346
+ @nginx.set(:max_pool_size => 2)
347
+ @nginx.add_server do |server|
348
+ server[:server_name] = "passenger.test"
349
+ server[:root] = "#{@stub.full_app_root}/public"
350
+ end
351
+ end
352
+
353
+ after :all do
354
+ @stub.destroy
355
+ @nginx.stop if @nginx
356
+ end
357
+
358
+ before :each do
359
+ @stub.reset
360
+
361
+ File.write("#{@stub.app_root}/config.ru", <<-RUBY)
362
+ PhusionPassenger.on_event(:oob_work) do
363
+ f = File.open("#{@stub.full_app_root}/oob_work.\#{$$}", 'w')
364
+ f.close
365
+ sleep 1
366
+ end
367
+ app = lambda do |env|
368
+ if env['PATH_INFO'] == '/oobw'
369
+ [200, { "Content-Type" => "text/html", "!~Request-OOB-Work" => 'true' }, [$$]]
370
+ else
371
+ [200, { "Content-Type" => "text/html" }, [$$]]
372
+ end
373
+ end
374
+ run app
375
+ RUBY
376
+
377
+ @nginx.start
378
+ end
379
+
380
+ it "invokes oobw when requested by the app process" do
381
+ pid = get("/oobw")
382
+ sleep 0.5 # wait for oobw callback to be invoked
383
+ File.exists?("#{@stub.app_root}/oob_work.#{pid}").should == true
384
+ end
385
+
386
+ it "does not block client while invoking oob work" do
387
+ get("/") # ensure there are spawned app processes
388
+ t0 = Time.now
389
+ get("/oobw")
390
+ secs = Time.now - t0
391
+ secs.should <= 0.1
392
+ end
393
+ end
394
+
395
+ ##### Helper methods #####
396
+
397
+ def start_web_server_if_necessary
398
+ if !@nginx.running?
399
+ @nginx.start
400
+ end
401
+ end
402
402
  end