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
@@ -7,282 +7,282 @@ PhusionPassenger.require_passenger_lib 'union_station/core'
7
7
  module PhusionPassenger
8
8
 
9
9
  describe UnionStation::Core do
10
- YESTERDAY = Time.utc(2010, 4, 11, 11, 56, 02)
11
- TODAY = Time.utc(2010, 4, 11, 12, 56, 02)
12
- TOMORROW = Time.utc(2010, 4, 11, 13, 56, 02)
13
-
14
- before :each do
15
- @username = "logging"
16
- @password = "1234"
17
- @tmpdir = Dir.mktmpdir
18
- @dump_file = "#{@tmpdir}/transaction.txt"
19
- start_agent
20
- @core = UnionStation::Core.new(@socket_address, @username, @password, "localhost")
21
- @core2 = UnionStation::Core.new(@socket_address, @username, @password, "localhost")
22
- end
23
-
24
- after :each do
25
- @core.close
26
- @core2.close
27
- FileUtils.rm_rf(@tmpdir) if @tmpdir
28
- if @agent_pid
29
- Process.kill('KILL', @agent_pid)
30
- Process.waitpid(@agent_pid)
31
- end
32
- end
33
-
34
- def mock_time(time)
35
- UnionStation::Core.stub(:current_time).and_return(time)
36
- end
37
-
38
- def start_agent
39
- @agent_pid, @socket_filename, @socket_address = spawn_logging_agent(
40
- @tmpdir, @dump_file, @password)
41
- end
42
-
43
- def kill_agent
44
- if @agent_pid
45
- Process.kill('KILL', @agent_pid)
46
- Process.waitpid(@agent_pid)
47
- File.unlink(@socket_filename)
48
- @agent_pid = nil
49
- end
50
- end
51
-
52
- specify "logging with #new_transaction works" do
53
- mock_time(TODAY)
54
-
55
- transaction = @core.new_transaction("foobar")
56
- transaction.should_not be_null
57
- begin
58
- transaction.message("hello")
59
- ensure
60
- transaction.close(true)
61
- end
62
-
63
- File.read(@dump_file).should =~ /hello/
64
-
65
- transaction = @core.new_transaction("foobar", :processes)
66
- transaction.should_not be_null
67
- begin
68
- transaction.message("world")
69
- ensure
70
- transaction.close(true)
71
- end
72
-
73
- File.read(@dump_file).should =~ /world/
74
- end
75
-
76
- specify "#new_transaction reestablishes the connection if disconnected" do
77
- mock_time(TODAY)
78
-
79
- @core.new_transaction("foobar").close(true)
80
- connection = @core.instance_variable_get(:"@connection")
81
- connection.synchronize do
82
- connection.channel.close
83
- connection.channel = nil
84
- end
85
-
86
- transaction = @core.new_transaction("foobar")
87
- begin
88
- transaction.message("hello")
89
- ensure
90
- transaction.close(true)
91
- end
92
-
93
- File.read(@dump_file).should =~ /hello/
94
- end
95
-
96
- specify "#new_transaction does not reconnect to the server for a short period of time if connecting failed" do
97
- @core.reconnect_timeout = 60
98
- @core.max_connect_tries = 1
99
-
100
- mock_time(TODAY)
101
- kill_agent
102
- @core.new_transaction("foobar").should be_null
103
-
104
- mock_time(TODAY + 30)
105
- start_agent
106
- @core.new_transaction("foobar").should be_null
107
-
108
- mock_time(TODAY + 61)
109
- @core.new_transaction("foobar").should_not be_null
110
- end
111
-
112
- specify "logging with #continue_transaction works" do
113
- mock_time(TODAY)
114
-
115
- transaction = @core.new_transaction("foobar", :processes)
116
- begin
117
- transaction.message("hello")
118
- transaction2 = @core2.continue_transaction(transaction.txn_id, "foobar", :processes)
119
- transaction2.should_not be_null
120
- transaction2.txn_id.should == transaction.txn_id
121
- begin
122
- transaction2.message("world")
123
- ensure
124
- transaction2.close(true)
125
- end
126
- ensure
127
- transaction.close(true)
128
- end
129
-
130
- File.read(@dump_file).should =~ /#{Regexp.escape transaction.txn_id} .* hello$/
131
- File.read(@dump_file).should =~ /#{Regexp.escape transaction.txn_id} .* world$/
132
- end
133
-
134
- specify "#continue_transaction reestablishes the connection if disconnected" do
135
- mock_time(TODAY)
136
-
137
- transaction = @core.new_transaction("foobar")
138
- transaction.close(true)
139
- transaction2 = @core2.continue_transaction(transaction.txn_id, "foobar")
140
- transaction2.close(true)
141
-
142
- connection = @core2.instance_variable_get(:"@connection")
143
- connection.synchronize do
144
- connection.channel.close
145
- connection.channel = nil
146
- end
147
-
148
- transaction2 = @core2.continue_transaction(transaction.txn_id, "foobar")
149
- begin
150
- transaction2.message("hello")
151
- ensure
152
- transaction2.close(true)
153
- end
154
-
155
- File.read(@dump_file).should =~ /hello/
156
- end
157
-
158
- specify "#new_transaction and #continue_transaction eventually reestablish the connection to the logging server if the logging server crashed and was restarted" do
159
- mock_time(TODAY)
160
-
161
- transaction = @core.new_transaction("foobar")
162
- @core2.continue_transaction(transaction.txn_id, "foobar").close
163
- kill_agent
164
- start_agent
165
-
166
- transaction = @core.new_transaction("foobar")
167
- transaction.should be_null
168
- transaction2 = @core2.continue_transaction("1234-abcd", "foobar")
169
- transaction2.should be_null
170
-
171
- mock_time(TODAY + 60)
172
- transaction = @core.new_transaction("foobar")
173
- transaction2 = @core2.continue_transaction(transaction.txn_id, "foobar")
174
- begin
175
- transaction2.message("hello")
176
- ensure
177
- transaction2.close(true)
178
- end
179
- transaction.close(true)
180
-
181
- File.read(@dump_file).should =~ /hello/
182
- end
183
-
184
- specify "#continue_transaction does not reconnect to the server for a short period of time if connecting failed" do
185
- @core.reconnect_timeout = 60
186
- @core.max_connect_tries = 1
187
- @core2.reconnect_timeout = 60
188
- @core2.max_connect_tries = 1
189
-
190
- mock_time(TODAY)
191
- transaction = @core.new_transaction("foobar")
192
- @core2.continue_transaction(transaction.txn_id, "foobar")
193
- kill_agent
194
- @core2.continue_transaction(transaction.txn_id, "foobar").should be_null
195
-
196
- mock_time(TODAY + 30)
197
- start_agent
198
- @core2.continue_transaction(transaction.txn_id, "foobar").should be_null
199
-
200
- mock_time(TODAY + 61)
201
- @core2.continue_transaction(transaction.txn_id, "foobar").should_not be_null
202
- end
203
-
204
- it "only creates null Transaction objects if no server address is given" do
205
- core = UnionStation::Core.new(nil, nil, nil, nil)
206
- begin
207
- core.new_transaction("foobar").should be_null
208
- ensure
209
- core.close
210
- end
211
- end
212
-
213
- specify "#clear_connection closes the connection" do
214
- @core.new_transaction("foobar").close
215
- @core.clear_connection
216
- connection = @core.instance_variable_get(:"@connection")
217
- connection.synchronize do
218
- connection.channel.should be_nil
219
- end
220
- end
221
-
222
- describe "transaction objects" do
223
- it "becomes null once it is closed" do
224
- transaction = @core.new_transaction("foobar")
225
- transaction.close
226
- transaction.should be_null
227
- end
228
-
229
- it "does nothing if it's null" do
230
- logger = UnionStation::Core.new(nil, nil, nil, nil)
231
- begin
232
- transaction = logger.new_transaction("foobar")
233
- transaction.message("hello")
234
- transaction.close(true)
235
- ensure
236
- logger.close
237
- end
238
-
239
- File.exist?("#{@log_dir}/1").should be_false
240
- end
241
-
242
- describe "#begin_measure" do
243
- it "sends a BEGIN message" do
244
- transaction = @core.new_transaction("foobar")
245
- begin
246
- transaction.should_receive(:message).with(/^BEGIN: hello \(.+?,.+?,.+?\) $/)
247
- transaction.begin_measure("hello")
248
- ensure
249
- transaction.close
250
- end
251
- end
252
-
253
- it "adds extra information as base64" do
254
- transaction = @core.new_transaction("foobar")
255
- begin
256
- transaction.should_receive(:message).with(/^BEGIN: hello \(.+?,.+?,.+?\) YWJjZA==$/)
257
- transaction.begin_measure("hello", "abcd")
258
- ensure
259
- transaction.close
260
- end
261
- end
262
- end
263
-
264
- describe "#end_measure" do
265
- it "sends an END message if error_countered=false" do
266
- transaction = @core.new_transaction("foobar")
267
- begin
268
- transaction.should_receive(:message).with(/^END: hello \(.+?,.+?,.+?\)$/)
269
- transaction.end_measure("hello")
270
- ensure
271
- transaction.close
272
- end
273
- end
274
-
275
- it "sends a FAIL message if error_countered=true" do
276
- transaction = @core.new_transaction("foobar")
277
- begin
278
- transaction.should_receive(:message).with(/^FAIL: hello \(.+?,.+?,.+?\)$/)
279
- transaction.end_measure("hello", true)
280
- ensure
281
- transaction.close
282
- end
283
- end
284
- end
285
- end
10
+ YESTERDAY = Time.utc(2010, 4, 11, 11, 56, 02)
11
+ TODAY = Time.utc(2010, 4, 11, 12, 56, 02)
12
+ TOMORROW = Time.utc(2010, 4, 11, 13, 56, 02)
13
+
14
+ before :each do
15
+ @username = "logging"
16
+ @password = "1234"
17
+ @tmpdir = Dir.mktmpdir
18
+ @dump_file = "#{@tmpdir}/transaction.txt"
19
+ start_agent
20
+ @core = UnionStation::Core.new(@socket_address, @username, @password, "localhost")
21
+ @core2 = UnionStation::Core.new(@socket_address, @username, @password, "localhost")
22
+ end
23
+
24
+ after :each do
25
+ @core.close
26
+ @core2.close
27
+ FileUtils.rm_rf(@tmpdir) if @tmpdir
28
+ if @agent_pid
29
+ Process.kill('KILL', @agent_pid)
30
+ Process.waitpid(@agent_pid)
31
+ end
32
+ end
33
+
34
+ def mock_time(time)
35
+ UnionStation::Core.stub(:current_time).and_return(time)
36
+ end
37
+
38
+ def start_agent
39
+ @agent_pid, @socket_filename, @socket_address = spawn_logging_agent(
40
+ @tmpdir, @dump_file, @password)
41
+ end
42
+
43
+ def kill_agent
44
+ if @agent_pid
45
+ Process.kill('KILL', @agent_pid)
46
+ Process.waitpid(@agent_pid)
47
+ File.unlink(@socket_filename)
48
+ @agent_pid = nil
49
+ end
50
+ end
51
+
52
+ specify "logging with #new_transaction works" do
53
+ mock_time(TODAY)
54
+
55
+ transaction = @core.new_transaction("foobar")
56
+ transaction.should_not be_null
57
+ begin
58
+ transaction.message("hello")
59
+ ensure
60
+ transaction.close(true)
61
+ end
62
+
63
+ File.read(@dump_file).should =~ /hello/
64
+
65
+ transaction = @core.new_transaction("foobar", :processes)
66
+ transaction.should_not be_null
67
+ begin
68
+ transaction.message("world")
69
+ ensure
70
+ transaction.close(true)
71
+ end
72
+
73
+ File.read(@dump_file).should =~ /world/
74
+ end
75
+
76
+ specify "#new_transaction reestablishes the connection if disconnected" do
77
+ mock_time(TODAY)
78
+
79
+ @core.new_transaction("foobar").close(true)
80
+ connection = @core.instance_variable_get(:"@connection")
81
+ connection.synchronize do
82
+ connection.channel.close
83
+ connection.channel = nil
84
+ end
85
+
86
+ transaction = @core.new_transaction("foobar")
87
+ begin
88
+ transaction.message("hello")
89
+ ensure
90
+ transaction.close(true)
91
+ end
92
+
93
+ File.read(@dump_file).should =~ /hello/
94
+ end
95
+
96
+ specify "#new_transaction does not reconnect to the server for a short period of time if connecting failed" do
97
+ @core.reconnect_timeout = 60
98
+ @core.max_connect_tries = 1
99
+
100
+ mock_time(TODAY)
101
+ kill_agent
102
+ @core.new_transaction("foobar").should be_null
103
+
104
+ mock_time(TODAY + 30)
105
+ start_agent
106
+ @core.new_transaction("foobar").should be_null
107
+
108
+ mock_time(TODAY + 61)
109
+ @core.new_transaction("foobar").should_not be_null
110
+ end
111
+
112
+ specify "logging with #continue_transaction works" do
113
+ mock_time(TODAY)
114
+
115
+ transaction = @core.new_transaction("foobar", :processes)
116
+ begin
117
+ transaction.message("hello")
118
+ transaction2 = @core2.continue_transaction(transaction.txn_id, "foobar", :processes)
119
+ transaction2.should_not be_null
120
+ transaction2.txn_id.should == transaction.txn_id
121
+ begin
122
+ transaction2.message("world")
123
+ ensure
124
+ transaction2.close(true)
125
+ end
126
+ ensure
127
+ transaction.close(true)
128
+ end
129
+
130
+ File.read(@dump_file).should =~ /#{Regexp.escape transaction.txn_id} .* hello$/
131
+ File.read(@dump_file).should =~ /#{Regexp.escape transaction.txn_id} .* world$/
132
+ end
133
+
134
+ specify "#continue_transaction reestablishes the connection if disconnected" do
135
+ mock_time(TODAY)
136
+
137
+ transaction = @core.new_transaction("foobar")
138
+ transaction.close(true)
139
+ transaction2 = @core2.continue_transaction(transaction.txn_id, "foobar")
140
+ transaction2.close(true)
141
+
142
+ connection = @core2.instance_variable_get(:"@connection")
143
+ connection.synchronize do
144
+ connection.channel.close
145
+ connection.channel = nil
146
+ end
147
+
148
+ transaction2 = @core2.continue_transaction(transaction.txn_id, "foobar")
149
+ begin
150
+ transaction2.message("hello")
151
+ ensure
152
+ transaction2.close(true)
153
+ end
154
+
155
+ File.read(@dump_file).should =~ /hello/
156
+ end
157
+
158
+ specify "#new_transaction and #continue_transaction eventually reestablish the connection to the logging server if the logging server crashed and was restarted" do
159
+ mock_time(TODAY)
160
+
161
+ transaction = @core.new_transaction("foobar")
162
+ @core2.continue_transaction(transaction.txn_id, "foobar").close
163
+ kill_agent
164
+ start_agent
165
+
166
+ transaction = @core.new_transaction("foobar")
167
+ transaction.should be_null
168
+ transaction2 = @core2.continue_transaction("1234-abcd", "foobar")
169
+ transaction2.should be_null
170
+
171
+ mock_time(TODAY + 60)
172
+ transaction = @core.new_transaction("foobar")
173
+ transaction2 = @core2.continue_transaction(transaction.txn_id, "foobar")
174
+ begin
175
+ transaction2.message("hello")
176
+ ensure
177
+ transaction2.close(true)
178
+ end
179
+ transaction.close(true)
180
+
181
+ File.read(@dump_file).should =~ /hello/
182
+ end
183
+
184
+ specify "#continue_transaction does not reconnect to the server for a short period of time if connecting failed" do
185
+ @core.reconnect_timeout = 60
186
+ @core.max_connect_tries = 1
187
+ @core2.reconnect_timeout = 60
188
+ @core2.max_connect_tries = 1
189
+
190
+ mock_time(TODAY)
191
+ transaction = @core.new_transaction("foobar")
192
+ @core2.continue_transaction(transaction.txn_id, "foobar")
193
+ kill_agent
194
+ @core2.continue_transaction(transaction.txn_id, "foobar").should be_null
195
+
196
+ mock_time(TODAY + 30)
197
+ start_agent
198
+ @core2.continue_transaction(transaction.txn_id, "foobar").should be_null
199
+
200
+ mock_time(TODAY + 61)
201
+ @core2.continue_transaction(transaction.txn_id, "foobar").should_not be_null
202
+ end
203
+
204
+ it "only creates null Transaction objects if no server address is given" do
205
+ core = UnionStation::Core.new(nil, nil, nil, nil)
206
+ begin
207
+ core.new_transaction("foobar").should be_null
208
+ ensure
209
+ core.close
210
+ end
211
+ end
212
+
213
+ specify "#clear_connection closes the connection" do
214
+ @core.new_transaction("foobar").close
215
+ @core.clear_connection
216
+ connection = @core.instance_variable_get(:"@connection")
217
+ connection.synchronize do
218
+ connection.channel.should be_nil
219
+ end
220
+ end
221
+
222
+ describe "transaction objects" do
223
+ it "becomes null once it is closed" do
224
+ transaction = @core.new_transaction("foobar")
225
+ transaction.close
226
+ transaction.should be_null
227
+ end
228
+
229
+ it "does nothing if it's null" do
230
+ logger = UnionStation::Core.new(nil, nil, nil, nil)
231
+ begin
232
+ transaction = logger.new_transaction("foobar")
233
+ transaction.message("hello")
234
+ transaction.close(true)
235
+ ensure
236
+ logger.close
237
+ end
238
+
239
+ File.exist?("#{@log_dir}/1").should be_false
240
+ end
241
+
242
+ describe "#begin_measure" do
243
+ it "sends a BEGIN message" do
244
+ transaction = @core.new_transaction("foobar")
245
+ begin
246
+ transaction.should_receive(:message).with(/^BEGIN: hello \(.+?,.+?,.+?\) $/)
247
+ transaction.begin_measure("hello")
248
+ ensure
249
+ transaction.close
250
+ end
251
+ end
252
+
253
+ it "adds extra information as base64" do
254
+ transaction = @core.new_transaction("foobar")
255
+ begin
256
+ transaction.should_receive(:message).with(/^BEGIN: hello \(.+?,.+?,.+?\) YWJjZA==$/)
257
+ transaction.begin_measure("hello", "abcd")
258
+ ensure
259
+ transaction.close
260
+ end
261
+ end
262
+ end
263
+
264
+ describe "#end_measure" do
265
+ it "sends an END message if error_countered=false" do
266
+ transaction = @core.new_transaction("foobar")
267
+ begin
268
+ transaction.should_receive(:message).with(/^END: hello \(.+?,.+?,.+?\)$/)
269
+ transaction.end_measure("hello")
270
+ ensure
271
+ transaction.close
272
+ end
273
+ end
274
+
275
+ it "sends a FAIL message if error_countered=true" do
276
+ transaction = @core.new_transaction("foobar")
277
+ begin
278
+ transaction.should_receive(:message).with(/^FAIL: hello \(.+?,.+?,.+?\)$/)
279
+ transaction.end_measure("hello", true)
280
+ ensure
281
+ transaction.close
282
+ end
283
+ end
284
+ end
285
+ end
286
286
  end
287
287
 
288
288
  end # module PhusionPassenger