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
@@ -35,167 +35,167 @@ require 'yaml'
35
35
  PACKAGE_NAME = PhusionPassenger::PACKAGE_NAME
36
36
  VERSION = PhusionPassenger::VERSION_STRING
37
37
  if RUBY_PLATFORM =~ /linux/
38
- TAR = "tar --warning=none"
38
+ TAR = "tar --warning=none"
39
39
  else
40
- TAR = "tar"
40
+ TAR = "tar"
41
41
  end
42
42
 
43
43
  def sh(*command)
44
- if !system(*command)
45
- abort "Command failed: #{command.join(' ')}"
46
- end
44
+ if !system(*command)
45
+ abort "Command failed: #{command.join(' ')}"
46
+ end
47
47
  end
48
48
 
49
49
  shared_examples_for "a proper package" do
50
- it "includes all files in the git repository" do
51
- git_files = `git ls-files`.split("\n")
52
- git_files.reject! { |filename| filename =~ /^Passenger.xcodeproj\// }
53
- git_files.delete(".gitmodules")
54
- git_files.delete("packaging/rpm")
55
- git_files.delete("ext/libeio/eio.3")
56
- git_files.delete("ext/libeio/eio.pod")
57
-
58
- package_files = {}
59
- Dir.chdir(@pkg_contents_dir) do
60
- `find .`.split("\n").each do |filename|
61
- filename.sub!(/^.\//, '')
62
- if !File.directory?(filename)
63
- package_files[filename] = true
64
- end
65
- end
66
- end
67
-
68
- error = false
69
- git_files.each do |filename|
70
- if !package_files[filename]
71
- error = true
72
- puts "File \"#{filename}\" is not in the package"
73
- end
74
- end
75
- raise "Some files are not in the package" if error
76
- end
77
-
78
- it "includes documentation HTML files" do
79
- File.exist?("#{@pkg_contents_dir}/doc/Users guide Apache.html").should be_true
80
- File.exist?("#{@pkg_contents_dir}/doc/Users guide Nginx.html").should be_true
81
- File.exist?("#{@pkg_contents_dir}/doc/Users guide Standalone.html").should be_true
82
- end
50
+ it "includes all files in the git repository" do
51
+ git_files = `git ls-files`.split("\n")
52
+ git_files.reject! { |filename| filename =~ /^Passenger.xcodeproj\// }
53
+ git_files.delete(".gitmodules")
54
+ git_files.delete("packaging/rpm")
55
+ git_files.delete("ext/libeio/eio.3")
56
+ git_files.delete("ext/libeio/eio.pod")
57
+
58
+ package_files = {}
59
+ Dir.chdir(@pkg_contents_dir) do
60
+ `find .`.split("\n").each do |filename|
61
+ filename.sub!(/^.\//, '')
62
+ if !File.directory?(filename)
63
+ package_files[filename] = true
64
+ end
65
+ end
66
+ end
67
+
68
+ error = false
69
+ git_files.each do |filename|
70
+ if !package_files[filename]
71
+ error = true
72
+ puts "File \"#{filename}\" is not in the package"
73
+ end
74
+ end
75
+ raise "Some files are not in the package" if error
76
+ end
77
+
78
+ it "includes documentation HTML files" do
79
+ File.exist?("#{@pkg_contents_dir}/doc/Users guide Apache.html").should be_true
80
+ File.exist?("#{@pkg_contents_dir}/doc/Users guide Nginx.html").should be_true
81
+ File.exist?("#{@pkg_contents_dir}/doc/Users guide Standalone.html").should be_true
82
+ end
83
83
  end
84
84
 
85
85
  shared_examples_for "a user-generated package" do
86
- it "isn't marked official" do
87
- File.exist?("#{@pkg_contents_dir}/resources/release.txt").should be_false
88
- end
86
+ it "isn't marked official" do
87
+ File.exist?("#{@pkg_contents_dir}/resources/release.txt").should be_false
88
+ end
89
89
  end
90
90
 
91
91
  shared_examples_for "an official package" do
92
- it "is marked official" do
93
- File.exist?("#{@pkg_contents_dir}/resources/release.txt").should be_true
94
- end
92
+ it "is marked official" do
93
+ File.exist?("#{@pkg_contents_dir}/resources/release.txt").should be_true
94
+ end
95
95
  end
96
96
 
97
97
  describe "A user-generated gem" do
98
- before :all do
99
- ENV['PKG_DIR'] = @temp_dir = Dir.mktmpdir
100
- basename = "#{PACKAGE_NAME}-#{VERSION}"
101
- @pkg_contents_dir = "#{@temp_dir}/#{basename}"
102
- Dir.chdir(SOURCE_ROOT) do
103
- sh "rake", *PhusionPassenger::Packaging::PREGENERATED_FILES
104
- sh "gem build #{PACKAGE_NAME}.gemspec"
105
- sh "mv #{PACKAGE_NAME}-#{VERSION}.gem #{@temp_dir}/"
106
- end
107
- Dir.chdir(@temp_dir) do
108
- sh "#{TAR} -xf #{basename}.gem"
109
- sh "mkdir #{basename}"
110
- sh "gunzip metadata.gz"
111
- Dir.chdir(basename) do
112
- sh "#{TAR} -xzf ../data.tar.gz"
113
- end
114
- end
115
- end
116
-
117
- after :all do
118
- ENV.delete('PKG_DIR')
119
- FileUtils.remove_entry_secure(@temp_dir)
120
- end
121
-
122
- it_behaves_like "a proper package"
123
- it_behaves_like "a user-generated package"
124
-
125
- it "doesn't invoke the binaries downloader upon gem installation" do
126
- spec = YAML.load_file("#{@temp_dir}/metadata")
127
- spec.extensions.should be_empty
128
- end
98
+ before :all do
99
+ ENV['PKG_DIR'] = @temp_dir = Dir.mktmpdir
100
+ basename = "#{PACKAGE_NAME}-#{VERSION}"
101
+ @pkg_contents_dir = "#{@temp_dir}/#{basename}"
102
+ Dir.chdir(SOURCE_ROOT) do
103
+ sh "rake", *PhusionPassenger::Packaging::PREGENERATED_FILES
104
+ sh "gem build #{PACKAGE_NAME}.gemspec"
105
+ sh "mv #{PACKAGE_NAME}-#{VERSION}.gem #{@temp_dir}/"
106
+ end
107
+ Dir.chdir(@temp_dir) do
108
+ sh "#{TAR} -xf #{basename}.gem"
109
+ sh "mkdir #{basename}"
110
+ sh "gunzip metadata.gz"
111
+ Dir.chdir(basename) do
112
+ sh "#{TAR} -xzf ../data.tar.gz"
113
+ end
114
+ end
115
+ end
116
+
117
+ after :all do
118
+ ENV.delete('PKG_DIR')
119
+ FileUtils.remove_entry_secure(@temp_dir)
120
+ end
121
+
122
+ it_behaves_like "a proper package"
123
+ it_behaves_like "a user-generated package"
124
+
125
+ it "doesn't invoke the binaries downloader upon gem installation" do
126
+ spec = YAML.load_file("#{@temp_dir}/metadata")
127
+ spec.extensions.should be_empty
128
+ end
129
129
  end
130
130
 
131
131
  describe "A user-generated tarball" do
132
- before :all do
133
- ENV['PKG_DIR'] = @temp_dir = Dir.mktmpdir
134
- basename = "#{PACKAGE_NAME}-#{VERSION}"
135
- @pkg_contents_dir = "#{@temp_dir}/#{basename}"
136
- sh "rake package:tarball"
137
- Dir.chdir(@temp_dir) do
138
- sh "#{TAR} -xzf #{basename}.tar.gz"
139
- end
140
- end
141
-
142
- after :all do
143
- ENV.delete('PKG_DIR')
144
- FileUtils.remove_entry_secure(@temp_dir)
145
- end
146
-
147
- it_behaves_like "a proper package"
148
- it_behaves_like "a user-generated package"
132
+ before :all do
133
+ ENV['PKG_DIR'] = @temp_dir = Dir.mktmpdir
134
+ basename = "#{PACKAGE_NAME}-#{VERSION}"
135
+ @pkg_contents_dir = "#{@temp_dir}/#{basename}"
136
+ sh "rake package:tarball"
137
+ Dir.chdir(@temp_dir) do
138
+ sh "#{TAR} -xzf #{basename}.tar.gz"
139
+ end
140
+ end
141
+
142
+ after :all do
143
+ ENV.delete('PKG_DIR')
144
+ FileUtils.remove_entry_secure(@temp_dir)
145
+ end
146
+
147
+ it_behaves_like "a proper package"
148
+ it_behaves_like "a user-generated package"
149
149
  end
150
150
 
151
151
  describe "An officially-generated gem" do
152
- before :all do
153
- ENV['PKG_DIR'] = @temp_dir = Dir.mktmpdir
154
- basename = "#{PACKAGE_NAME}-#{VERSION}"
155
- @pkg_contents_dir = "#{@temp_dir}/#{basename}"
156
- Dir.chdir(SOURCE_ROOT) do
157
- sh "rake package:set_official package:gem SKIP_SIGNING=1"
158
- end
159
- Dir.chdir(@temp_dir) do
160
- sh "#{TAR} -xf #{basename}.gem"
161
- sh "mkdir #{basename}"
162
- sh "gunzip metadata.gz"
163
- Dir.chdir(basename) do
164
- sh "#{TAR} -xzf ../data.tar.gz"
165
- end
166
- end
167
- end
168
-
169
- after :all do
170
- ENV.delete('PKG_DIR')
171
- FileUtils.remove_entry_secure(@temp_dir)
172
- end
173
-
174
- it_behaves_like "a proper package"
175
- it_behaves_like "an official package"
176
-
177
- it "invokes the binaries downloader upon gem installation" do
178
- spec = YAML.load_file("#{@temp_dir}/metadata")
179
- spec.extensions.should_not be_empty
180
- end
152
+ before :all do
153
+ ENV['PKG_DIR'] = @temp_dir = Dir.mktmpdir
154
+ basename = "#{PACKAGE_NAME}-#{VERSION}"
155
+ @pkg_contents_dir = "#{@temp_dir}/#{basename}"
156
+ Dir.chdir(SOURCE_ROOT) do
157
+ sh "rake package:set_official package:gem SKIP_SIGNING=1"
158
+ end
159
+ Dir.chdir(@temp_dir) do
160
+ sh "#{TAR} -xf #{basename}.gem"
161
+ sh "mkdir #{basename}"
162
+ sh "gunzip metadata.gz"
163
+ Dir.chdir(basename) do
164
+ sh "#{TAR} -xzf ../data.tar.gz"
165
+ end
166
+ end
167
+ end
168
+
169
+ after :all do
170
+ ENV.delete('PKG_DIR')
171
+ FileUtils.remove_entry_secure(@temp_dir)
172
+ end
173
+
174
+ it_behaves_like "a proper package"
175
+ it_behaves_like "an official package"
176
+
177
+ it "invokes the binaries downloader upon gem installation" do
178
+ spec = YAML.load_file("#{@temp_dir}/metadata")
179
+ spec.extensions.should_not be_empty
180
+ end
181
181
  end
182
182
 
183
183
  describe "An officially-generated tarball" do
184
- before :all do
185
- ENV['PKG_DIR'] = @temp_dir = Dir.mktmpdir
186
- basename = "#{PACKAGE_NAME}-#{VERSION}"
187
- @pkg_contents_dir = "#{@temp_dir}/#{basename}"
188
- sh "rake package:set_official package:tarball"
189
- Dir.chdir(@temp_dir) do
190
- sh "#{TAR} -xzf #{basename}.tar.gz"
191
- end
192
- end
193
-
194
- after :all do
195
- ENV.delete('PKG_DIR')
196
- FileUtils.remove_entry_secure(@temp_dir)
197
- end
198
-
199
- it_behaves_like "a proper package"
200
- it_behaves_like "an official package"
184
+ before :all do
185
+ ENV['PKG_DIR'] = @temp_dir = Dir.mktmpdir
186
+ basename = "#{PACKAGE_NAME}-#{VERSION}"
187
+ @pkg_contents_dir = "#{@temp_dir}/#{basename}"
188
+ sh "rake package:set_official package:tarball"
189
+ Dir.chdir(@temp_dir) do
190
+ sh "#{TAR} -xzf #{basename}.tar.gz"
191
+ end
192
+ end
193
+
194
+ after :all do
195
+ ENV.delete('PKG_DIR')
196
+ FileUtils.remove_entry_secure(@temp_dir)
197
+ end
198
+
199
+ it_behaves_like "a proper package"
200
+ it_behaves_like "an official package"
201
201
  end
@@ -4,12 +4,12 @@ Dir.chdir("#{source_root}/test")
4
4
  require 'rubygems'
5
5
  require 'json'
6
6
  begin
7
- CONFIG = JSON.load(File.read('config.json'))
7
+ CONFIG = JSON.load(File.read('config.json'))
8
8
  rescue Errno::ENOENT
9
- STDERR.puts "*** You do not have the file test/config.json. " <<
10
- "Please copy test/config.json.example to " <<
11
- "test/config.json, and edit it."
12
- exit 1
9
+ STDERR.puts "*** You do not have the file test/config.json. " <<
10
+ "Please copy test/config.json.example to " <<
11
+ "test/config.json, and edit it."
12
+ exit 1
13
13
  end
14
14
 
15
15
  $LOAD_PATH.unshift("#{source_root}/lib")
@@ -20,373 +20,373 @@ ENV['PASSENGER_COMPILE_NATIVE_SUPPORT_BINARY'] = '0'
20
20
  module PhusionPassenger
21
21
 
22
22
  describe "Passenger Standalone" do
23
- let(:version) { PhusionPassenger::VERSION_STRING }
24
- let(:nginx_version) { PhusionPassenger::PREFERRED_NGINX_VERSION }
25
- let(:compat_id) { PhusionPassenger::PlatformInfo.cxx_binary_compatibility_id }
26
-
27
- def sh(*command)
28
- if !system(*command)
29
- abort "Command failed: #{command.join(' ')}"
30
- end
31
- end
32
-
33
- def capture_output(command)
34
- output = `#{command} 2>&1`.strip
35
- if $?.exitstatus == 0
36
- return output
37
- else
38
- abort "Command #{command} exited with status #{$?.exitstatus}; output:\n#{output}"
39
- end
40
- end
41
-
42
- def start_server(document_root)
43
- server = WEBrick::HTTPServer.new(:BindAddress => '127.0.0.1',
44
- :Port => 0,
45
- :DocumentRoot => document_root,
46
- :Logger => WEBrick::Log.new("/dev/null"),
47
- :AccessLog => [])
48
- Thread.new do
49
- Thread.current.abort_on_exception = true
50
- server.start
51
- end
52
- [server, "http://127.0.0.1:#{server.config[:Port]}"]
53
- end
54
-
55
- def create_tarball(filename, contents = nil)
56
- filename = File.expand_path(filename)
57
- Dir.mktmpdir("tarball-") do |tarball_dir|
58
- Dir.chdir(tarball_dir) do
59
- if block_given?
60
- yield
61
- else
62
- contents.each do |content_name|
63
- create_file(content_name)
64
- end
65
- end
66
- sh "tar", "-czf", filename, "."
67
- end
68
- end
69
- end
70
-
71
- def create_dummy_support_binaries
72
- Dir.mkdir("support-binaries") if !File.exist?("support-binaries")
73
- File.open("support-binaries/#{AGENT_EXE}", "w") do |f|
74
- f.puts "#!/bin/bash"
75
- f.puts "echo PASS"
76
- end
77
- File.chmod(0755, "support-binaries/#{AGENT_EXE}")
78
- end
79
-
80
- def create_dummy_nginx_binary
81
- File.open("PassengerWebHelper", "w") do |f|
82
- f.puts "#!/bin/bash"
83
- f.puts "echo nginx version: 1.0.0"
84
- end
85
- File.chmod(0755, "PassengerWebHelper")
86
- end
87
-
88
- def create_file(filename, contents = nil)
89
- File.open(filename, "wb") do |f|
90
- f.write(contents) if contents
91
- end
92
- end
93
-
94
- specify "invoking 'passenger' without an argument is equivalent to 'passenger help'" do
95
- output = capture_output("passenger")
96
- output.should == capture_output("passenger help")
97
- end
98
-
99
- specify "'passenger --help' is equivalent to 'passenger help'" do
100
- output = capture_output("passenger")
101
- output.should == capture_output("passenger help")
102
- end
103
-
104
- specify "'passenger --version' displays the version number" do
105
- output = capture_output("passenger --version")
106
- output.should include("version #{PhusionPassenger::VERSION_STRING}\n")
107
- end
108
-
109
- describe "start command" do
110
- AGENT_BINARY_DOWNLOAD_MESSAGE = "--> Downloading a #{PROGRAM_NAME} agent binary for your platform"
111
- AGENT_BINARY_COMPILE_MESSAGE = "Compiling #{PROGRAM_NAME} agent"
112
- NGINX_BINARY_INSTALL_MESSAGE = "Installing Nginx"
113
-
114
- def test_serving_application(passenger_command)
115
- Dir.mktmpdir do |tmpdir|
116
- Dir.chdir(tmpdir) do
117
- File.open("config.ru", "w") do |f|
118
- f.write(%Q{
119
- app = lambda do |env|
120
- [200, { "Content-Type" => "text/plain" }, ["ok"]]
121
- end
122
- run app
123
- })
124
- end
125
- Dir.mkdir("public")
126
- Dir.mkdir("tmp")
127
- sh("#{passenger_command} -p 4000 -d --disable-turbocaching >/dev/null")
128
- begin
129
- open("http://127.0.0.1:4000/") do |f|
130
- f.read.should == "ok"
131
- end
132
- ensure
133
- sh("passenger stop -p 4000")
134
- end
135
- end
136
- end
137
- end
138
-
139
- context "if the runtime is not installed" do
140
- before :each do
141
- @user_dir = File.expand_path("~/#{USER_NAMESPACE_DIRNAME}")
142
- if File.exist?("buildout.old")
143
- raise "buildout.old exists. Please fix this first."
144
- end
145
- if File.exist?("#{@user_dir}.old")
146
- raise "#{@user_dir} exists. Please fix this first."
147
- end
148
- if PhusionPassenger.build_system_dir
149
- FileUtils.mv("#{PhusionPassenger.build_system_dir}/buildout",
150
- "#{PhusionPassenger.build_system_dir}/buildout.old")
151
- end
152
- if File.exist?(@user_dir)
153
- FileUtils.mv(@user_dir, "#{@user_dir}.old")
154
- end
155
- end
156
-
157
- after :each do
158
- FileUtils.rm_rf("#{PhusionPassenger.build_system_dir}/buildout")
159
- FileUtils.rm_rf(@user_dir)
160
- if PhusionPassenger.build_system_dir
161
- FileUtils.mv("#{PhusionPassenger.build_system_dir}/buildout.old",
162
- "#{PhusionPassenger.build_system_dir}/buildout")
163
- end
164
- if File.exist?("#{@user_dir}.old")
165
- FileUtils.mv("#{@user_dir}.old", @user_dir)
166
- end
167
- end
168
-
169
- context "when natively packaged" do
170
- it "tries to install the runtime" do
171
- command = "passenger start --no-install-runtime --runtime-check-only"
172
- `#{command} 2>&1`.should include("Refusing to install")
173
- end
174
-
175
- it "starts a server which serves the application" do
176
- output = capture_output("passenger start --runtime-check-only")
177
- output.should include(AGENT_BINARY_DOWNLOAD_MESSAGE)
178
- output.should include(NGINX_BINARY_INSTALL_MESSAGE)
179
- test_serving_application("passenger start")
180
- end
181
- end
182
-
183
- context "when custom packaged" do
184
- before :each do
185
- @tmpdir = Dir.mktmpdir
186
- sh "passenger-config --make-locations-ini --for-packaging-method=deb " +
187
- "> '#{@tmpdir}/locations.ini'"
188
- ENV['PASSENGER_LOCATION_CONFIGURATION_FILE'] = "#{@tmpdir}/locations.ini"
189
- end
190
-
191
- after :each do
192
- ENV.delete('PASSENGER_LOCATION_CONFIGURATION_FILE')
193
- FileUtils.remove_entry_secure(@tmpdir)
194
- end
195
-
196
- it "tries to install the runtime" do
197
- command = "passenger start --no-install-runtime --runtime-check-only"
198
- `#{command} 2>&1`.should include("Refusing to install")
199
- end
200
-
201
- it "starts a server which serves the application" do
202
- output = capture_output("passenger start --runtime-check-only")
203
- output.should include(AGENT_BINARY_DOWNLOAD_MESSAGE)
204
- output.should include(NGINX_BINARY_INSTALL_MESSAGE)
205
- test_serving_application("passenger start")
206
- end
207
- end
208
-
209
- # TODO: move these tests to config/install_standalone_runtime_command_spec.rb
210
-
211
- # before :each do
212
- # @runtime_dir = Dir.mktmpdir
213
- # @webroot = Dir.mktmpdir
214
- # @server, @base_url = start_server(@webroot)
215
-
216
- # Dir.mkdir("#{@webroot}/#{version}")
217
- # Dir.chdir("#{@webroot}/#{version}") do
218
- # create_tarball("webhelper-#{nginx_version}-#{compat_id}.tar.gz") do
219
- # create_dummy_nginx_binary
220
- # end
221
- # create_tarball("support-#{compat_id}.tar.gz") do
222
- # FileUtils.mkdir_p("support-binaries")
223
- # FileUtils.mkdir_p("common/libpassenger_common/ApplicationPool2")
224
- # create_file("common/libboost_oxt.a")
225
- # create_file("common/libpassenger_common/ApplicationPool2/Implementation.o")
226
- # create_dummy_support_binaries
227
- # end
228
- # end
229
-
230
- # create_file("#{PhusionPassenger.resources_dir}/release.txt")
231
- # end
232
-
233
- # after :each do
234
- # @server.stop
235
- # File.unlink("#{PhusionPassenger.resources_dir}/release.txt")
236
- # FileUtils.remove_entry_secure(@webroot)
237
- # FileUtils.remove_entry_secure(@runtime_dir)
238
- # end
239
-
240
- # context "when originally packaged" do
241
- # it "downloads binaries from the Internet" do
242
- # @output = capture_output("passenger start " +
243
- # "--runtime-dir '#{@runtime_dir}' " +
244
- # "--runtime-check-only " +
245
- # "--binaries-url-root '#{@base_url}'")
246
- # @output.should include(SUPPORT_BINARIES_DOWNLOAD_MESSAGE)
247
- # @output.should include(NGINX_BINARY_DOWNLOAD_MESSAGE)
248
- # @output.should_not include(NGINX_SOURCE_DOWNLOAD_MESSAGE)
249
- # @output.should_not include(COMPILING_MESSAGE)
250
- # end
251
-
252
- # it "builds the runtime if downloading fails" do
253
- # # Yes, we're testing the entire build system here.
254
- # command = "passenger start " +
255
- # "--runtime-dir '#{@runtime_dir}' " +
256
- # "--binaries-url-root '#{@base_url}/wrong'"
257
- # @output = capture_output("#{command} --runtime-check-only")
258
- # @output.should include(SUPPORT_BINARIES_DOWNLOAD_MESSAGE)
259
- # @output.should include(NGINX_BINARY_DOWNLOAD_MESSAGE)
260
- # @output.should include(NGINX_SOURCE_DOWNLOAD_MESSAGE)
261
- # @output.should include(COMPILING_MESSAGE)
262
-
263
- # test_serving_application(command)
264
- # end
265
-
266
- # specify "if the downloaded support binaries work but the downloaded web helper binary doesn't, " +
267
- # "and web helper compilation doesn't succeed the first time, then web helper compilation " +
268
- # "succeeds the second time" do
269
- # Dir.chdir("#{@webroot}/#{version}") do
270
- # create_tarball("support-#{compat_id}.tar.gz") do
271
- # FileUtils.cp_r(Dir["#{PhusionPassenger.build_system_dir}/buildout/*"],
272
- # ".")
273
- # end
274
- # create_tarball("webhelper-#{nginx_version}-#{compat_id}.tar.gz") do
275
- # create_file("PassengerWebHelper",
276
- # "#!/bin/sh\n" +
277
- # "exit 1\n")
278
- # end
279
- # end
280
-
281
- # # Temporarily make Passenger Standalone think our runtime is
282
- # # not compiled.
283
- # File.rename("#{PhusionPassenger.build_system_dir}/buildout",
284
- # "#{PhusionPassenger.build_system_dir}/buildout.renamed")
285
- # begin
286
- # command = "passenger start " +
287
- # "--runtime-dir '#{@runtime_dir}' " +
288
- # "--binaries-url-root '#{@base_url}'"
289
-
290
- # @output = `#{command} --runtime-check-only --no-compile-runtime 2>&1`
291
- # $?.exitstatus.should_not == 0
292
- # @output.should include(SUPPORT_BINARIES_DOWNLOAD_MESSAGE)
293
- # @output.should include("All good\n")
294
- # @output.should include(NGINX_BINARY_DOWNLOAD_MESSAGE)
295
- # @output.should include("Not usable, will compile from source")
296
- # @output.should include("Refusing to compile the Phusion Passenger Standalone runtime")
297
-
298
- # @output = capture_output("#{command} --runtime-check-only")
299
- # @output.should include(NGINX_SOURCE_DOWNLOAD_MESSAGE)
300
- # @output.should include(COMPILING_MESSAGE)
301
- # File.exist?("#{PhusionPassenger.build_system_dir}/buildout").should be_false
302
-
303
- # test_serving_application("#{command} --no-compile-runtime")
304
- # File.exist?("#{PhusionPassenger.build_system_dir}/buildout").should be_false
305
- # ensure
306
- # FileUtils.rm_rf("#{PhusionPassenger.build_system_dir}/buildout")
307
- # File.rename("#{PhusionPassenger.build_system_dir}/buildout.renamed",
308
- # "#{PhusionPassenger.build_system_dir}/buildout")
309
- # end
310
- # end
311
- # end
312
-
313
- # context "when custom packaged" do
314
- # before :each do
315
- # sh "passenger-config --make-locations-ini --for-packaging-method=deb " +
316
- # "> '#{@runtime_dir}/locations.ini'"
317
- # ENV['PASSENGER_LOCATION_CONFIGURATION_FILE'] = "#{@runtime_dir}/locations.ini"
318
- # create_file("#{PhusionPassenger.lib_dir}/PassengerWebHelper")
319
- # end
320
-
321
- # after :each do
322
- # ENV.delete('PASSENGER_LOCATION_CONFIGURATION_FILE')
323
- # File.unlink("#{PhusionPassenger.lib_dir}/PassengerWebHelper")
324
- # end
325
-
326
- # it "downloads only the Nginx binary from the Internet" do
327
- # File.rename("#{@webroot}/#{version}/webhelper-#{nginx_version}-#{compat_id}.tar.gz",
328
- # "#{@webroot}/#{version}/webhelper-0.0.1-#{compat_id}.tar.gz")
329
- # @output = capture_output("passenger start " +
330
- # "--runtime-dir '#{@runtime_dir}' " +
331
- # "--runtime-check-only " +
332
- # "--binaries-url-root '#{@base_url}' " +
333
- # "--nginx-version 0.0.1")
334
- # @output.should_not include(SUPPORT_BINARIES_DOWNLOAD_MESSAGE)
335
- # @output.should include(NGINX_BINARY_DOWNLOAD_MESSAGE)
336
- # @output.should_not include(NGINX_SOURCE_DOWNLOAD_MESSAGE)
337
- # @output.should_not include(COMPILING_MESSAGE)
338
- # end
339
-
340
- # it "only builds Nginx if downloading fails" do
341
- # # Yes, we're testing the build system here.
342
- # command = "passenger start " +
343
- # "--runtime-dir '#{@runtime_dir}' " +
344
- # "--binaries-url-root '#{@base_url}' " +
345
- # "--nginx-version 1.4.1"
346
- # @output = capture_output("#{command} --runtime-check-only")
347
- # @output.should_not include(SUPPORT_BINARIES_DOWNLOAD_MESSAGE)
348
- # @output.should include(NGINX_BINARY_DOWNLOAD_MESSAGE)
349
- # @output.should include(NGINX_SOURCE_DOWNLOAD_MESSAGE)
350
- # @output.should include(COMPILING_MESSAGE)
351
-
352
- # test_serving_application(command)
353
- # end
354
- # end
355
- end
356
-
357
- context "if the runtime is installed" do
358
- before :all do
359
- capture_output("passenger-config compile-nginx-engine")
360
- end
361
-
362
- it "doesn't download the runtime from the Internet" do
363
- command = "passenger start --no-install-runtime --runtime-check-only"
364
- capture_output(command).should_not include(AGENT_BINARY_DOWNLOAD_MESSAGE)
365
- end
366
-
367
- it "doesn't build the runtime" do
368
- command = "passenger start --no-install-runtime --runtime-check-only"
369
- capture_output(command).should_not include(AGENT_BINARY_COMPILE_MESSAGE)
370
- end
371
-
372
- it "starts a server which serves the application" do
373
- test_serving_application("passenger start")
374
- end
375
- end
376
-
377
- it "daemonizes if -d is given" do
378
- # Earlier tests already test this. This empty test here
379
- # is merely to show the intent of the tests, and to
380
- # speed up the test suite by preventing an unnecessary
381
- # compilation.
382
- end
383
- end
384
-
385
- describe "help command" do
386
- it "displays the available commands" do
387
- capture_output("passenger help").should include("Available commands:")
388
- end
389
- end
23
+ let(:version) { PhusionPassenger::VERSION_STRING }
24
+ let(:nginx_version) { PhusionPassenger::PREFERRED_NGINX_VERSION }
25
+ let(:compat_id) { PhusionPassenger::PlatformInfo.cxx_binary_compatibility_id }
26
+
27
+ def sh(*command)
28
+ if !system(*command)
29
+ abort "Command failed: #{command.join(' ')}"
30
+ end
31
+ end
32
+
33
+ def capture_output(command)
34
+ output = `#{command} 2>&1`.strip
35
+ if $?.exitstatus == 0
36
+ return output
37
+ else
38
+ abort "Command #{command} exited with status #{$?.exitstatus}; output:\n#{output}"
39
+ end
40
+ end
41
+
42
+ def start_server(document_root)
43
+ server = WEBrick::HTTPServer.new(:BindAddress => '127.0.0.1',
44
+ :Port => 0,
45
+ :DocumentRoot => document_root,
46
+ :Logger => WEBrick::Log.new("/dev/null"),
47
+ :AccessLog => [])
48
+ Thread.new do
49
+ Thread.current.abort_on_exception = true
50
+ server.start
51
+ end
52
+ [server, "http://127.0.0.1:#{server.config[:Port]}"]
53
+ end
54
+
55
+ def create_tarball(filename, contents = nil)
56
+ filename = File.expand_path(filename)
57
+ Dir.mktmpdir("tarball-") do |tarball_dir|
58
+ Dir.chdir(tarball_dir) do
59
+ if block_given?
60
+ yield
61
+ else
62
+ contents.each do |content_name|
63
+ create_file(content_name)
64
+ end
65
+ end
66
+ sh "tar", "-czf", filename, "."
67
+ end
68
+ end
69
+ end
70
+
71
+ def create_dummy_support_binaries
72
+ Dir.mkdir("support-binaries") if !File.exist?("support-binaries")
73
+ File.open("support-binaries/#{AGENT_EXE}", "w") do |f|
74
+ f.puts "#!/bin/bash"
75
+ f.puts "echo PASS"
76
+ end
77
+ File.chmod(0755, "support-binaries/#{AGENT_EXE}")
78
+ end
79
+
80
+ def create_dummy_nginx_binary
81
+ File.open("PassengerWebHelper", "w") do |f|
82
+ f.puts "#!/bin/bash"
83
+ f.puts "echo nginx version: 1.0.0"
84
+ end
85
+ File.chmod(0755, "PassengerWebHelper")
86
+ end
87
+
88
+ def create_file(filename, contents = nil)
89
+ File.open(filename, "wb") do |f|
90
+ f.write(contents) if contents
91
+ end
92
+ end
93
+
94
+ specify "invoking 'passenger' without an argument is equivalent to 'passenger help'" do
95
+ output = capture_output("passenger")
96
+ output.should == capture_output("passenger help")
97
+ end
98
+
99
+ specify "'passenger --help' is equivalent to 'passenger help'" do
100
+ output = capture_output("passenger")
101
+ output.should == capture_output("passenger help")
102
+ end
103
+
104
+ specify "'passenger --version' displays the version number" do
105
+ output = capture_output("passenger --version")
106
+ output.should include("version #{PhusionPassenger::VERSION_STRING}\n")
107
+ end
108
+
109
+ describe "start command" do
110
+ AGENT_BINARY_DOWNLOAD_MESSAGE = "--> Downloading a #{PROGRAM_NAME} agent binary for your platform"
111
+ AGENT_BINARY_COMPILE_MESSAGE = "Compiling #{PROGRAM_NAME} agent"
112
+ NGINX_BINARY_INSTALL_MESSAGE = "Installing Nginx"
113
+
114
+ def test_serving_application(passenger_command)
115
+ Dir.mktmpdir do |tmpdir|
116
+ Dir.chdir(tmpdir) do
117
+ File.open("config.ru", "w") do |f|
118
+ f.write(%Q{
119
+ app = lambda do |env|
120
+ [200, { "Content-Type" => "text/plain" }, ["ok"]]
121
+ end
122
+ run app
123
+ })
124
+ end
125
+ Dir.mkdir("public")
126
+ Dir.mkdir("tmp")
127
+ sh("#{passenger_command} -p 4000 -d --disable-turbocaching >/dev/null")
128
+ begin
129
+ open("http://127.0.0.1:4000/") do |f|
130
+ f.read.should == "ok"
131
+ end
132
+ ensure
133
+ sh("passenger stop -p 4000")
134
+ end
135
+ end
136
+ end
137
+ end
138
+
139
+ context "if the runtime is not installed" do
140
+ before :each do
141
+ @user_dir = File.expand_path("~/#{USER_NAMESPACE_DIRNAME}")
142
+ if File.exist?("buildout.old")
143
+ raise "buildout.old exists. Please fix this first."
144
+ end
145
+ if File.exist?("#{@user_dir}.old")
146
+ raise "#{@user_dir} exists. Please fix this first."
147
+ end
148
+ if PhusionPassenger.build_system_dir
149
+ FileUtils.mv("#{PhusionPassenger.build_system_dir}/buildout",
150
+ "#{PhusionPassenger.build_system_dir}/buildout.old")
151
+ end
152
+ if File.exist?(@user_dir)
153
+ FileUtils.mv(@user_dir, "#{@user_dir}.old")
154
+ end
155
+ end
156
+
157
+ after :each do
158
+ FileUtils.rm_rf("#{PhusionPassenger.build_system_dir}/buildout")
159
+ FileUtils.rm_rf(@user_dir)
160
+ if PhusionPassenger.build_system_dir
161
+ FileUtils.mv("#{PhusionPassenger.build_system_dir}/buildout.old",
162
+ "#{PhusionPassenger.build_system_dir}/buildout")
163
+ end
164
+ if File.exist?("#{@user_dir}.old")
165
+ FileUtils.mv("#{@user_dir}.old", @user_dir)
166
+ end
167
+ end
168
+
169
+ context "when natively packaged" do
170
+ it "tries to install the runtime" do
171
+ command = "passenger start --no-install-runtime --runtime-check-only"
172
+ `#{command} 2>&1`.should include("Refusing to install")
173
+ end
174
+
175
+ it "starts a server which serves the application" do
176
+ output = capture_output("passenger start --runtime-check-only")
177
+ output.should include(AGENT_BINARY_DOWNLOAD_MESSAGE)
178
+ output.should include(NGINX_BINARY_INSTALL_MESSAGE)
179
+ test_serving_application("passenger start")
180
+ end
181
+ end
182
+
183
+ context "when custom packaged" do
184
+ before :each do
185
+ @tmpdir = Dir.mktmpdir
186
+ sh "passenger-config --make-locations-ini --for-packaging-method=deb " +
187
+ "> '#{@tmpdir}/locations.ini'"
188
+ ENV['PASSENGER_LOCATION_CONFIGURATION_FILE'] = "#{@tmpdir}/locations.ini"
189
+ end
190
+
191
+ after :each do
192
+ ENV.delete('PASSENGER_LOCATION_CONFIGURATION_FILE')
193
+ FileUtils.remove_entry_secure(@tmpdir)
194
+ end
195
+
196
+ it "tries to install the runtime" do
197
+ command = "passenger start --no-install-runtime --runtime-check-only"
198
+ `#{command} 2>&1`.should include("Refusing to install")
199
+ end
200
+
201
+ it "starts a server which serves the application" do
202
+ output = capture_output("passenger start --runtime-check-only")
203
+ output.should include(AGENT_BINARY_DOWNLOAD_MESSAGE)
204
+ output.should include(NGINX_BINARY_INSTALL_MESSAGE)
205
+ test_serving_application("passenger start")
206
+ end
207
+ end
208
+
209
+ # TODO: move these tests to config/install_standalone_runtime_command_spec.rb
210
+
211
+ # before :each do
212
+ # @runtime_dir = Dir.mktmpdir
213
+ # @webroot = Dir.mktmpdir
214
+ # @server, @base_url = start_server(@webroot)
215
+
216
+ # Dir.mkdir("#{@webroot}/#{version}")
217
+ # Dir.chdir("#{@webroot}/#{version}") do
218
+ # create_tarball("webhelper-#{nginx_version}-#{compat_id}.tar.gz") do
219
+ # create_dummy_nginx_binary
220
+ # end
221
+ # create_tarball("support-#{compat_id}.tar.gz") do
222
+ # FileUtils.mkdir_p("support-binaries")
223
+ # FileUtils.mkdir_p("common/libpassenger_common/ApplicationPool2")
224
+ # create_file("common/libboost_oxt.a")
225
+ # create_file("common/libpassenger_common/ApplicationPool2/Implementation.o")
226
+ # create_dummy_support_binaries
227
+ # end
228
+ # end
229
+
230
+ # create_file("#{PhusionPassenger.resources_dir}/release.txt")
231
+ # end
232
+
233
+ # after :each do
234
+ # @server.stop
235
+ # File.unlink("#{PhusionPassenger.resources_dir}/release.txt")
236
+ # FileUtils.remove_entry_secure(@webroot)
237
+ # FileUtils.remove_entry_secure(@runtime_dir)
238
+ # end
239
+
240
+ # context "when originally packaged" do
241
+ # it "downloads binaries from the Internet" do
242
+ # @output = capture_output("passenger start " +
243
+ # "--runtime-dir '#{@runtime_dir}' " +
244
+ # "--runtime-check-only " +
245
+ # "--binaries-url-root '#{@base_url}'")
246
+ # @output.should include(SUPPORT_BINARIES_DOWNLOAD_MESSAGE)
247
+ # @output.should include(NGINX_BINARY_DOWNLOAD_MESSAGE)
248
+ # @output.should_not include(NGINX_SOURCE_DOWNLOAD_MESSAGE)
249
+ # @output.should_not include(COMPILING_MESSAGE)
250
+ # end
251
+
252
+ # it "builds the runtime if downloading fails" do
253
+ # # Yes, we're testing the entire build system here.
254
+ # command = "passenger start " +
255
+ # "--runtime-dir '#{@runtime_dir}' " +
256
+ # "--binaries-url-root '#{@base_url}/wrong'"
257
+ # @output = capture_output("#{command} --runtime-check-only")
258
+ # @output.should include(SUPPORT_BINARIES_DOWNLOAD_MESSAGE)
259
+ # @output.should include(NGINX_BINARY_DOWNLOAD_MESSAGE)
260
+ # @output.should include(NGINX_SOURCE_DOWNLOAD_MESSAGE)
261
+ # @output.should include(COMPILING_MESSAGE)
262
+
263
+ # test_serving_application(command)
264
+ # end
265
+
266
+ # specify "if the downloaded support binaries work but the downloaded web helper binary doesn't, " +
267
+ # "and web helper compilation doesn't succeed the first time, then web helper compilation " +
268
+ # "succeeds the second time" do
269
+ # Dir.chdir("#{@webroot}/#{version}") do
270
+ # create_tarball("support-#{compat_id}.tar.gz") do
271
+ # FileUtils.cp_r(Dir["#{PhusionPassenger.build_system_dir}/buildout/*"],
272
+ # ".")
273
+ # end
274
+ # create_tarball("webhelper-#{nginx_version}-#{compat_id}.tar.gz") do
275
+ # create_file("PassengerWebHelper",
276
+ # "#!/bin/sh\n" +
277
+ # "exit 1\n")
278
+ # end
279
+ # end
280
+
281
+ # # Temporarily make Passenger Standalone think our runtime is
282
+ # # not compiled.
283
+ # File.rename("#{PhusionPassenger.build_system_dir}/buildout",
284
+ # "#{PhusionPassenger.build_system_dir}/buildout.renamed")
285
+ # begin
286
+ # command = "passenger start " +
287
+ # "--runtime-dir '#{@runtime_dir}' " +
288
+ # "--binaries-url-root '#{@base_url}'"
289
+
290
+ # @output = `#{command} --runtime-check-only --no-compile-runtime 2>&1`
291
+ # $?.exitstatus.should_not == 0
292
+ # @output.should include(SUPPORT_BINARIES_DOWNLOAD_MESSAGE)
293
+ # @output.should include("All good\n")
294
+ # @output.should include(NGINX_BINARY_DOWNLOAD_MESSAGE)
295
+ # @output.should include("Not usable, will compile from source")
296
+ # @output.should include("Refusing to compile the Phusion Passenger Standalone runtime")
297
+
298
+ # @output = capture_output("#{command} --runtime-check-only")
299
+ # @output.should include(NGINX_SOURCE_DOWNLOAD_MESSAGE)
300
+ # @output.should include(COMPILING_MESSAGE)
301
+ # File.exist?("#{PhusionPassenger.build_system_dir}/buildout").should be_false
302
+
303
+ # test_serving_application("#{command} --no-compile-runtime")
304
+ # File.exist?("#{PhusionPassenger.build_system_dir}/buildout").should be_false
305
+ # ensure
306
+ # FileUtils.rm_rf("#{PhusionPassenger.build_system_dir}/buildout")
307
+ # File.rename("#{PhusionPassenger.build_system_dir}/buildout.renamed",
308
+ # "#{PhusionPassenger.build_system_dir}/buildout")
309
+ # end
310
+ # end
311
+ # end
312
+
313
+ # context "when custom packaged" do
314
+ # before :each do
315
+ # sh "passenger-config --make-locations-ini --for-packaging-method=deb " +
316
+ # "> '#{@runtime_dir}/locations.ini'"
317
+ # ENV['PASSENGER_LOCATION_CONFIGURATION_FILE'] = "#{@runtime_dir}/locations.ini"
318
+ # create_file("#{PhusionPassenger.lib_dir}/PassengerWebHelper")
319
+ # end
320
+
321
+ # after :each do
322
+ # ENV.delete('PASSENGER_LOCATION_CONFIGURATION_FILE')
323
+ # File.unlink("#{PhusionPassenger.lib_dir}/PassengerWebHelper")
324
+ # end
325
+
326
+ # it "downloads only the Nginx binary from the Internet" do
327
+ # File.rename("#{@webroot}/#{version}/webhelper-#{nginx_version}-#{compat_id}.tar.gz",
328
+ # "#{@webroot}/#{version}/webhelper-0.0.1-#{compat_id}.tar.gz")
329
+ # @output = capture_output("passenger start " +
330
+ # "--runtime-dir '#{@runtime_dir}' " +
331
+ # "--runtime-check-only " +
332
+ # "--binaries-url-root '#{@base_url}' " +
333
+ # "--nginx-version 0.0.1")
334
+ # @output.should_not include(SUPPORT_BINARIES_DOWNLOAD_MESSAGE)
335
+ # @output.should include(NGINX_BINARY_DOWNLOAD_MESSAGE)
336
+ # @output.should_not include(NGINX_SOURCE_DOWNLOAD_MESSAGE)
337
+ # @output.should_not include(COMPILING_MESSAGE)
338
+ # end
339
+
340
+ # it "only builds Nginx if downloading fails" do
341
+ # # Yes, we're testing the build system here.
342
+ # command = "passenger start " +
343
+ # "--runtime-dir '#{@runtime_dir}' " +
344
+ # "--binaries-url-root '#{@base_url}' " +
345
+ # "--nginx-version 1.4.1"
346
+ # @output = capture_output("#{command} --runtime-check-only")
347
+ # @output.should_not include(SUPPORT_BINARIES_DOWNLOAD_MESSAGE)
348
+ # @output.should include(NGINX_BINARY_DOWNLOAD_MESSAGE)
349
+ # @output.should include(NGINX_SOURCE_DOWNLOAD_MESSAGE)
350
+ # @output.should include(COMPILING_MESSAGE)
351
+
352
+ # test_serving_application(command)
353
+ # end
354
+ # end
355
+ end
356
+
357
+ context "if the runtime is installed" do
358
+ before :all do
359
+ capture_output("passenger-config compile-nginx-engine")
360
+ end
361
+
362
+ it "doesn't download the runtime from the Internet" do
363
+ command = "passenger start --no-install-runtime --runtime-check-only"
364
+ capture_output(command).should_not include(AGENT_BINARY_DOWNLOAD_MESSAGE)
365
+ end
366
+
367
+ it "doesn't build the runtime" do
368
+ command = "passenger start --no-install-runtime --runtime-check-only"
369
+ capture_output(command).should_not include(AGENT_BINARY_COMPILE_MESSAGE)
370
+ end
371
+
372
+ it "starts a server which serves the application" do
373
+ test_serving_application("passenger start")
374
+ end
375
+ end
376
+
377
+ it "daemonizes if -d is given" do
378
+ # Earlier tests already test this. This empty test here
379
+ # is merely to show the intent of the tests, and to
380
+ # speed up the test suite by preventing an unnecessary
381
+ # compilation.
382
+ end
383
+ end
384
+
385
+ describe "help command" do
386
+ it "displays the available commands" do
387
+ capture_output("passenger help").should include("Available commands:")
388
+ end
389
+ end
390
390
  end
391
391
 
392
392
  end # module PhusionPassenger