passenger 2.2.15 → 3.0.0.pre1

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 (1338) hide show
  1. data/DEVELOPERS.TXT +21 -12
  2. data/LICENSE +1 -1
  3. data/NEWS +8 -1
  4. data/PACKAGING.TXT +25 -0
  5. data/Rakefile +28 -891
  6. data/bin/passenger +32 -0
  7. data/bin/passenger-config +5 -5
  8. data/bin/passenger-install-apache2-module +37 -24
  9. data/bin/passenger-install-nginx-module +48 -46
  10. data/bin/passenger-make-enterprisey +8 -9
  11. data/bin/passenger-memory-stats +20 -150
  12. data/bin/passenger-status +130 -44
  13. data/bin/passenger-stress-test +5 -4
  14. data/build/agents.rb +73 -0
  15. data/build/apache2.rb +165 -0
  16. data/build/basics.rb +81 -0
  17. data/build/common_library.rb +198 -0
  18. data/build/config.rb +35 -0
  19. data/{misc/rake/cplusplus.rb → build/cplusplus_support.rb} +1 -1
  20. data/build/cxx_tests.rb +205 -0
  21. data/build/documentation.rb +77 -0
  22. data/{misc/rake → build}/gempackagetask.rb +1 -1
  23. data/build/integration_tests.rb +57 -0
  24. data/build/misc.rb +146 -0
  25. data/build/nginx.rb +64 -0
  26. data/build/oxt_tests.rb +52 -0
  27. data/{misc/rake → build}/packagetask.rb +0 -0
  28. data/build/packaging.rb +189 -0
  29. data/{misc/rake/extensions.rb → build/rake_extensions.rb} +1 -1
  30. data/{misc/rake → build}/rdoctask.rb +0 -0
  31. data/build/ruby_extension.rb +46 -0
  32. data/build/ruby_tests.rb +42 -0
  33. data/build/test_basics.rb +31 -0
  34. data/doc/ApplicationPool algorithm.txt +447 -234
  35. data/doc/Architectural overview.html +47 -56
  36. data/doc/Doxyfile +1 -1
  37. data/doc/Security of user switching support.html +46 -57
  38. data/doc/Users guide Apache.html +1033 -306
  39. data/doc/Users guide Apache.txt +419 -99
  40. data/doc/Users guide Nginx.html +1252 -253
  41. data/doc/Users guide Nginx.txt +711 -87
  42. data/doc/Users guide Standalone.html +603 -0
  43. data/doc/Users guide Standalone.txt +40 -0
  44. data/doc/cxxapi/AbstractSpawnManager_8h_source.html +141 -0
  45. data/doc/cxxapi/Account_8h_source.html +206 -0
  46. data/doc/cxxapi/AccountsDatabase_8h_source.html +161 -0
  47. data/doc/cxxapi/AgentBase_8h_source.html +70 -0
  48. data/doc/cxxapi/AgentsStarter_8h_source.html +112 -0
  49. data/doc/cxxapi/BCrypt_8h_source.html +104 -0
  50. data/doc/cxxapi/Blowfish_8h_source.html +134 -0
  51. data/doc/cxxapi/Bucket_8h_source.html +4 -3
  52. data/doc/cxxapi/Constants_8h_source.html +79 -0
  53. data/doc/cxxapi/ContentHandler_8h_source.html +95 -0
  54. data/doc/cxxapi/DirectoryMapper_8h_source.html +9 -8
  55. data/doc/cxxapi/EventedClient_8h_source.html +629 -0
  56. data/doc/cxxapi/EventedMessageServer_8h_source.html +358 -0
  57. data/doc/cxxapi/EventedServer_8h_source.html +326 -0
  58. data/doc/cxxapi/Exceptions_8h_source.html +366 -0
  59. data/doc/cxxapi/FileDescriptor_8h_source.html +260 -0
  60. data/doc/cxxapi/Hooks_8h_source.html +2 -1
  61. data/doc/cxxapi/HttpStatusExtractor_8h_source.html +382 -0
  62. data/doc/cxxapi/Logging_8h_source.html +726 -0
  63. data/doc/cxxapi/MessageChannel_8h_source.html +852 -0
  64. data/doc/cxxapi/MessageClient_8h_source.html +328 -0
  65. data/doc/cxxapi/MessageReadersWriters_8h_source.html +539 -0
  66. data/doc/cxxapi/MessageServer_8h_source.html +606 -0
  67. data/doc/cxxapi/PoolOptions_8h_source.html +548 -0
  68. data/doc/cxxapi/Process_8h_source.html +286 -0
  69. data/doc/cxxapi/RandomGenerator_8h_source.html +191 -0
  70. data/doc/cxxapi/ResourceLocator_8h_source.html +115 -0
  71. data/doc/cxxapi/ScgiRequestParser_8h_source.html +406 -0
  72. data/doc/cxxapi/ServerInstanceDir_8h_source.html +374 -0
  73. data/doc/cxxapi/Session_8h_source.html +501 -0
  74. data/doc/cxxapi/SpawnManager_8h_source.html +647 -0
  75. data/doc/cxxapi/StaticContentHandler_8h_source.html +68 -0
  76. data/doc/cxxapi/StaticString_8h_source.html +254 -0
  77. data/doc/cxxapi/StringListCreator_8h_source.html +114 -0
  78. data/doc/cxxapi/Utils_8h_source.html +442 -0
  79. data/doc/cxxapi/annotated.html +46 -0
  80. data/doc/cxxapi/apache2_2Configuration_8h_source.html +82 -0
  81. data/doc/cxxapi/classAgentWatcher-members.html +30 -26
  82. data/doc/cxxapi/classAgentWatcher.html +168 -194
  83. data/doc/cxxapi/classClient-members.html +14 -11
  84. data/doc/cxxapi/classClient.html +35 -35
  85. data/doc/cxxapi/classHooks-members.html +2 -0
  86. data/doc/cxxapi/classHooks.html +2 -0
  87. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager-members.html +16 -13
  88. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager.html +78 -82
  89. data/doc/cxxapi/classPassenger_1_1ArgumentException-members.html +12 -9
  90. data/doc/cxxapi/classPassenger_1_1ArgumentException.html +26 -22
  91. data/doc/cxxapi/classPassenger_1_1ArrayMessage-members.html +37 -0
  92. data/doc/cxxapi/classPassenger_1_1ArrayMessage.html +113 -0
  93. data/doc/cxxapi/classPassenger_1_1BufferedUpload-members.html +14 -11
  94. data/doc/cxxapi/classPassenger_1_1BufferedUpload.html +41 -42
  95. data/doc/cxxapi/classPassenger_1_1BusyException-members.html +12 -9
  96. data/doc/cxxapi/classPassenger_1_1BusyException.html +24 -20
  97. data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +12 -9
  98. data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +23 -19
  99. data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +2 -0
  100. data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +8 -6
  101. data/doc/cxxapi/classPassenger_1_1EOFException-members.html +12 -9
  102. data/doc/cxxapi/classPassenger_1_1EOFException.html +27 -23
  103. data/doc/cxxapi/classPassenger_1_1EventFd-members.html +12 -9
  104. data/doc/cxxapi/classPassenger_1_1EventFd.html +24 -21
  105. data/doc/cxxapi/classPassenger_1_1EventedClient-members.html +54 -0
  106. data/doc/cxxapi/classPassenger_1_1EventedClient.html +436 -0
  107. data/doc/cxxapi/classPassenger_1_1EventedMessageServer-members.html +37 -0
  108. data/doc/cxxapi/classPassenger_1_1EventedMessageServer.html +59 -0
  109. data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.map +3 -0
  110. data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.md5 +1 -0
  111. data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.png +0 -0
  112. data/doc/cxxapi/classPassenger_1_1EventedServer-members.html +37 -0
  113. data/doc/cxxapi/classPassenger_1_1EventedServer.html +93 -0
  114. data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.map +3 -0
  115. data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.md5 +1 -0
  116. data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.png +0 -0
  117. data/doc/cxxapi/classPassenger_1_1FileDescriptor-members.html +16 -13
  118. data/doc/cxxapi/classPassenger_1_1FileDescriptor.html +63 -70
  119. data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +12 -9
  120. data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +26 -22
  121. data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +17 -14
  122. data/doc/cxxapi/classPassenger_1_1FileSystemException.html +32 -30
  123. data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor-members.html +15 -12
  124. data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor.html +59 -59
  125. data/doc/cxxapi/classPassenger_1_1IOException-members.html +12 -9
  126. data/doc/cxxapi/classPassenger_1_1IOException.html +27 -23
  127. data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +36 -33
  128. data/doc/cxxapi/classPassenger_1_1MessageChannel.html +326 -344
  129. data/doc/cxxapi/classPassenger_1_1MessageServer-members.html +25 -22
  130. data/doc/cxxapi/classPassenger_1_1MessageServer.html +160 -191
  131. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext-members.html +12 -9
  132. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext.html +29 -27
  133. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.map +3 -1
  134. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.md5 +1 -1
  135. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.png +0 -0
  136. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext-members.html +17 -14
  137. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext.html +69 -79
  138. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.map +3 -1
  139. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.md5 +1 -1
  140. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.png +0 -0
  141. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler-members.html +15 -12
  142. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler.html +60 -63
  143. data/doc/cxxapi/classPassenger_1_1Process-members.html +20 -17
  144. data/doc/cxxapi/classPassenger_1_1Process.html +88 -95
  145. data/doc/cxxapi/classPassenger_1_1RandomGenerator-members.html +13 -10
  146. data/doc/cxxapi/classPassenger_1_1RandomGenerator.html +36 -35
  147. data/doc/cxxapi/classPassenger_1_1RuntimeException-members.html +12 -9
  148. data/doc/cxxapi/classPassenger_1_1RuntimeException.html +24 -20
  149. data/doc/cxxapi/classPassenger_1_1ScalarMessage-members.html +37 -0
  150. data/doc/cxxapi/classPassenger_1_1ScalarMessage.html +76 -0
  151. data/doc/cxxapi/classPassenger_1_1ScgiRequestParser-members.html +26 -23
  152. data/doc/cxxapi/classPassenger_1_1ScgiRequestParser.html +121 -138
  153. data/doc/cxxapi/classPassenger_1_1SecurityException-members.html +12 -9
  154. data/doc/cxxapi/classPassenger_1_1SecurityException.html +26 -22
  155. data/doc/cxxapi/classPassenger_1_1Session-members.html +29 -26
  156. data/doc/cxxapi/classPassenger_1_1Session.html +219 -240
  157. data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +14 -11
  158. data/doc/cxxapi/classPassenger_1_1SpawnException.html +36 -37
  159. data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +18 -15
  160. data/doc/cxxapi/classPassenger_1_1SpawnManager.html +115 -110
  161. data/doc/cxxapi/classPassenger_1_1StandardSession-members.html +30 -27
  162. data/doc/cxxapi/classPassenger_1_1StandardSession.html +163 -184
  163. data/doc/cxxapi/classPassenger_1_1StaticString-members.html +12 -9
  164. data/doc/cxxapi/classPassenger_1_1StaticString.html +27 -25
  165. data/doc/cxxapi/classPassenger_1_1SystemException-members.html +16 -13
  166. data/doc/cxxapi/classPassenger_1_1SystemException.html +65 -67
  167. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException-members.html +16 -13
  168. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException.html +27 -23
  169. data/doc/cxxapi/classPassenger_1_1TimeoutException-members.html +12 -9
  170. data/doc/cxxapi/classPassenger_1_1TimeoutException.html +24 -20
  171. data/doc/cxxapi/classPassenger_1_1Uint16Message-members.html +36 -0
  172. data/doc/cxxapi/classPassenger_1_1Uint16Message.html +51 -0
  173. data/doc/cxxapi/classPassenger_1_1Uint32Message-members.html +36 -0
  174. data/doc/cxxapi/classPassenger_1_1Uint32Message.html +51 -0
  175. data/doc/cxxapi/classServer-members.html +12 -9
  176. data/doc/cxxapi/classServer.html +23 -20
  177. data/doc/cxxapi/classServerInstanceDirToucher-members.html +12 -9
  178. data/doc/cxxapi/classServerInstanceDirToucher.html +21 -17
  179. data/doc/cxxapi/classes.html +18 -4
  180. data/doc/cxxapi/definitions_8h_source.html +1 -0
  181. data/doc/cxxapi/files.html +36 -1
  182. data/doc/cxxapi/functions.html +53 -21
  183. data/doc/cxxapi/functions_0x62.html +82 -0
  184. data/doc/cxxapi/functions_0x63.html +99 -0
  185. data/doc/cxxapi/functions_0x64.html +95 -0
  186. data/doc/cxxapi/functions_0x65.html +88 -0
  187. data/doc/cxxapi/functions_0x66.html +100 -0
  188. data/doc/cxxapi/functions_0x67.html +170 -0
  189. data/doc/cxxapi/functions_0x68.html +88 -0
  190. data/doc/cxxapi/functions_0x69.html +93 -0
  191. data/doc/cxxapi/functions_0x6b.html +80 -0
  192. data/doc/cxxapi/functions_0x6c.html +88 -0
  193. data/doc/cxxapi/functions_0x6d.html +88 -0
  194. data/doc/cxxapi/functions_0x6e.html +86 -0
  195. data/doc/cxxapi/functions_0x6f.html +94 -0
  196. data/doc/cxxapi/functions_0x70.html +94 -0
  197. data/doc/cxxapi/functions_0x72.html +110 -0
  198. data/doc/cxxapi/functions_0x73.html +171 -0
  199. data/doc/cxxapi/functions_0x74.html +85 -0
  200. data/doc/cxxapi/functions_0x75.html +85 -0
  201. data/doc/cxxapi/functions_0x77.html +92 -0
  202. data/doc/cxxapi/functions_0x7e.html +79 -0
  203. data/doc/cxxapi/functions_enum.html +14 -12
  204. data/doc/cxxapi/functions_eval.html +22 -16
  205. data/doc/cxxapi/functions_func.html +460 -1
  206. data/doc/cxxapi/functions_vars.html +163 -63
  207. data/doc/cxxapi/graph_legend.html +1 -0
  208. data/doc/cxxapi/graph_legend.png +0 -0
  209. data/doc/cxxapi/group__Core.html +2 -2
  210. data/doc/cxxapi/group__Core.map +1 -2
  211. data/doc/cxxapi/group__Core.png +0 -0
  212. data/doc/cxxapi/group__Exceptions.html +32 -40
  213. data/doc/cxxapi/group__Hooks.html +2 -1
  214. data/doc/cxxapi/group__Hooks.map +1 -1
  215. data/doc/cxxapi/group__Hooks.png +0 -0
  216. data/doc/cxxapi/group__Support.html +509 -0
  217. data/doc/cxxapi/hierarchy.html +66 -62
  218. data/doc/cxxapi/inherit__graph__10.map +3 -1
  219. data/doc/cxxapi/inherit__graph__10.md5 +1 -1
  220. data/doc/cxxapi/inherit__graph__10.png +0 -0
  221. data/doc/cxxapi/inherit__graph__11.map +4 -1
  222. data/doc/cxxapi/inherit__graph__11.md5 +1 -1
  223. data/doc/cxxapi/inherit__graph__11.png +0 -0
  224. data/doc/cxxapi/inherit__graph__12.map +3 -1
  225. data/doc/cxxapi/inherit__graph__12.md5 +1 -1
  226. data/doc/cxxapi/inherit__graph__12.png +0 -0
  227. data/doc/cxxapi/inherit__graph__13.map +3 -1
  228. data/doc/cxxapi/inherit__graph__13.md5 +1 -1
  229. data/doc/cxxapi/inherit__graph__13.png +0 -0
  230. data/doc/cxxapi/inherit__graph__14.map +3 -1
  231. data/doc/cxxapi/inherit__graph__14.md5 +1 -1
  232. data/doc/cxxapi/inherit__graph__14.png +0 -0
  233. data/doc/cxxapi/inherit__graph__15.map +5 -1
  234. data/doc/cxxapi/inherit__graph__15.md5 +1 -1
  235. data/doc/cxxapi/inherit__graph__15.png +0 -0
  236. data/doc/cxxapi/inherit__graph__16.map +3 -3
  237. data/doc/cxxapi/inherit__graph__16.md5 +1 -1
  238. data/doc/cxxapi/inherit__graph__16.png +0 -0
  239. data/doc/cxxapi/inherit__graph__17.map +3 -1
  240. data/doc/cxxapi/inherit__graph__17.md5 +1 -1
  241. data/doc/cxxapi/inherit__graph__17.png +0 -0
  242. data/doc/cxxapi/inherit__graph__18.map +4 -1
  243. data/doc/cxxapi/inherit__graph__18.md5 +1 -1
  244. data/doc/cxxapi/inherit__graph__18.png +0 -0
  245. data/doc/cxxapi/inherit__graph__19.map +3 -1
  246. data/doc/cxxapi/inherit__graph__19.md5 +1 -1
  247. data/doc/cxxapi/inherit__graph__19.png +0 -0
  248. data/doc/cxxapi/inherit__graph__20.map +3 -2
  249. data/doc/cxxapi/inherit__graph__20.md5 +1 -1
  250. data/doc/cxxapi/inherit__graph__20.png +0 -0
  251. data/doc/cxxapi/inherit__graph__21.map +3 -1
  252. data/doc/cxxapi/inherit__graph__21.md5 +1 -1
  253. data/doc/cxxapi/inherit__graph__21.png +0 -0
  254. data/doc/cxxapi/inherit__graph__22.map +3 -1
  255. data/doc/cxxapi/inherit__graph__22.md5 +1 -1
  256. data/doc/cxxapi/inherit__graph__22.png +0 -0
  257. data/doc/cxxapi/inherit__graph__23.map +3 -1
  258. data/doc/cxxapi/inherit__graph__23.md5 +1 -1
  259. data/doc/cxxapi/inherit__graph__23.png +0 -0
  260. data/doc/cxxapi/inherit__graph__24.map +3 -1
  261. data/doc/cxxapi/inherit__graph__24.md5 +1 -1
  262. data/doc/cxxapi/inherit__graph__24.png +0 -0
  263. data/doc/cxxapi/inherit__graph__25.map +3 -1
  264. data/doc/cxxapi/inherit__graph__25.md5 +1 -1
  265. data/doc/cxxapi/inherit__graph__25.png +0 -0
  266. data/doc/cxxapi/inherit__graph__26.map +3 -1
  267. data/doc/cxxapi/inherit__graph__26.md5 +1 -1
  268. data/doc/cxxapi/inherit__graph__26.png +0 -0
  269. data/doc/cxxapi/inherit__graph__27.map +3 -1
  270. data/doc/cxxapi/inherit__graph__27.md5 +1 -1
  271. data/doc/cxxapi/inherit__graph__27.png +0 -0
  272. data/doc/cxxapi/inherit__graph__28.map +4 -1
  273. data/doc/cxxapi/inherit__graph__28.md5 +1 -1
  274. data/doc/cxxapi/inherit__graph__28.png +0 -0
  275. data/doc/cxxapi/inherit__graph__29.map +3 -1
  276. data/doc/cxxapi/inherit__graph__29.md5 +1 -1
  277. data/doc/cxxapi/inherit__graph__29.png +0 -0
  278. data/doc/cxxapi/inherit__graph__30.map +3 -2
  279. data/doc/cxxapi/inherit__graph__30.md5 +1 -1
  280. data/doc/cxxapi/inherit__graph__30.png +0 -0
  281. data/doc/cxxapi/inherit__graph__31.map +3 -1
  282. data/doc/cxxapi/inherit__graph__31.md5 +1 -1
  283. data/doc/cxxapi/inherit__graph__31.png +0 -0
  284. data/doc/cxxapi/inherit__graph__32.map +5 -1
  285. data/doc/cxxapi/inherit__graph__32.md5 +1 -1
  286. data/doc/cxxapi/inherit__graph__32.png +0 -0
  287. data/doc/cxxapi/inherit__graph__33.map +3 -1
  288. data/doc/cxxapi/inherit__graph__33.md5 +1 -1
  289. data/doc/cxxapi/inherit__graph__33.png +0 -0
  290. data/doc/cxxapi/inherit__graph__34.map +3 -3
  291. data/doc/cxxapi/inherit__graph__34.md5 +1 -1
  292. data/doc/cxxapi/inherit__graph__34.png +0 -0
  293. data/doc/cxxapi/inherit__graph__35.map +3 -1
  294. data/doc/cxxapi/inherit__graph__35.md5 +1 -1
  295. data/doc/cxxapi/inherit__graph__35.png +0 -0
  296. data/doc/cxxapi/inherit__graph__36.map +3 -1
  297. data/doc/cxxapi/inherit__graph__36.md5 +1 -1
  298. data/doc/cxxapi/inherit__graph__36.png +0 -0
  299. data/doc/cxxapi/inherit__graph__37.map +3 -1
  300. data/doc/cxxapi/inherit__graph__37.md5 +1 -1
  301. data/doc/cxxapi/inherit__graph__37.png +0 -0
  302. data/doc/cxxapi/inherit__graph__4.map +3 -1
  303. data/doc/cxxapi/inherit__graph__4.md5 +1 -1
  304. data/doc/cxxapi/inherit__graph__4.png +0 -0
  305. data/doc/cxxapi/inherit__graph__5.map +3 -1
  306. data/doc/cxxapi/inherit__graph__5.md5 +1 -1
  307. data/doc/cxxapi/inherit__graph__5.png +0 -0
  308. data/doc/cxxapi/inherit__graph__6.map +3 -1
  309. data/doc/cxxapi/inherit__graph__6.md5 +1 -1
  310. data/doc/cxxapi/inherit__graph__6.png +0 -0
  311. data/doc/cxxapi/inherit__graph__7.map +3 -1
  312. data/doc/cxxapi/inherit__graph__7.md5 +1 -1
  313. data/doc/cxxapi/inherit__graph__7.png +0 -0
  314. data/doc/cxxapi/inherit__graph__8.map +3 -1
  315. data/doc/cxxapi/inherit__graph__8.md5 +1 -1
  316. data/doc/cxxapi/inherit__graph__8.png +0 -0
  317. data/doc/cxxapi/inherit__graph__9.map +3 -1
  318. data/doc/cxxapi/inherit__graph__9.md5 +1 -1
  319. data/doc/cxxapi/inherit__graph__9.png +0 -0
  320. data/doc/cxxapi/inherits.html +123 -126
  321. data/doc/cxxapi/main.html +1 -0
  322. data/doc/cxxapi/modules.html +2 -1
  323. data/doc/cxxapi/namespacePassenger.html +263 -492
  324. data/doc/cxxapi/namespacemembers.html +68 -96
  325. data/doc/cxxapi/namespacemembers_enum.html +14 -12
  326. data/doc/cxxapi/namespacemembers_eval.html +20 -15
  327. data/doc/cxxapi/namespacemembers_func.html +52 -88
  328. data/doc/cxxapi/namespacemembers_type.html +18 -14
  329. data/doc/cxxapi/namespaces.html +12 -9
  330. data/doc/cxxapi/nginx_2Configuration_8h_source.html +125 -0
  331. data/doc/cxxapi/ngx__http__passenger__module_8h_source.html +94 -0
  332. data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard-members.html +12 -9
  333. data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard.html +24 -22
  334. data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +43 -38
  335. data/doc/cxxapi/structPassenger_1_1PoolOptions.html +275 -325
  336. data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash-members.html +12 -9
  337. data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash.html +24 -22
  338. data/doc/cxxapi/tree.html +152 -7
  339. data/doc/users_guide_snippets/{analysis_and_system_maintenance_tools.txt → analysis_and_system_maintenance.txt} +58 -1
  340. data/doc/users_guide_snippets/appendix_c_spawning_methods.txt +1 -2
  341. data/doc/users_guide_snippets/global_queueing_explained.txt +1 -5
  342. data/doc/users_guide_snippets/{rails_spawn_method.txt → passenger_spawn_method.txt} +9 -8
  343. data/doc/users_guide_snippets/tips.txt +12 -6
  344. data/doc/users_guide_snippets/under_the_hood/page_caching_support.txt +22 -0
  345. data/ext/apache2/Bucket.cpp +4 -4
  346. data/ext/apache2/Bucket.h +3 -3
  347. data/ext/apache2/Configuration.cpp +278 -381
  348. data/ext/apache2/Configuration.h +3 -357
  349. data/ext/apache2/Configuration.hpp +461 -0
  350. data/ext/apache2/DirectoryMapper.h +3 -3
  351. data/ext/apache2/HelperAgent.cpp +359 -0
  352. data/ext/apache2/Hooks.cpp +339 -226
  353. data/ext/apache2/Hooks.h +1 -1
  354. data/ext/apache2/mod_passenger.c +10 -4
  355. data/ext/boost/algorithm/string/case_conv.hpp +4 -4
  356. data/ext/boost/algorithm/string/concept.hpp +2 -2
  357. data/ext/boost/algorithm/string/detail/case_conv.hpp +18 -9
  358. data/ext/boost/algorithm/string/detail/find_format.hpp +44 -43
  359. data/ext/boost/algorithm/string/detail/find_format_all.hpp +56 -56
  360. data/ext/boost/algorithm/string/detail/find_format_store.hpp +7 -0
  361. data/ext/boost/algorithm/string/detail/finder.hpp +14 -14
  362. data/ext/boost/algorithm/string/detail/formatter.hpp +2 -2
  363. data/ext/boost/algorithm/string/detail/replace_storage.hpp +3 -3
  364. data/ext/boost/algorithm/string/detail/sequence.hpp +3 -3
  365. data/ext/boost/algorithm/string/erase.hpp +98 -98
  366. data/ext/boost/algorithm/string/find_format.hpp +56 -38
  367. data/ext/boost/algorithm/string/finder.hpp +6 -6
  368. data/ext/boost/algorithm/string/formatter.hpp +1 -1
  369. data/ext/boost/algorithm/string/replace.hpp +99 -99
  370. data/ext/boost/bind.hpp +5 -1670
  371. data/ext/boost/bind/bind.hpp +1751 -0
  372. data/ext/boost/bind/bind_mf2_cc.hpp +228 -0
  373. data/ext/boost/bind/mem_fn.hpp +389 -0
  374. data/ext/boost/bind/mem_fn_template.hpp +54 -27
  375. data/ext/boost/bind/placeholders.hpp +3 -2
  376. data/ext/boost/concept_check.hpp +10 -0
  377. data/ext/boost/config/abi/msvc_prefix.hpp +15 -1
  378. data/ext/boost/config/abi_prefix.hpp +1 -1
  379. data/ext/boost/config/abi_suffix.hpp +3 -2
  380. data/ext/boost/config/auto_link.hpp +6 -1
  381. data/ext/boost/config/compiler/borland.hpp +75 -17
  382. data/ext/boost/config/compiler/codegear.hpp +163 -0
  383. data/ext/boost/config/compiler/common_edg.hpp +35 -0
  384. data/ext/boost/config/compiler/digitalmars.hpp +26 -0
  385. data/ext/boost/config/compiler/gcc.hpp +69 -14
  386. data/ext/boost/config/compiler/hp_acc.hpp +32 -0
  387. data/ext/boost/config/compiler/intel.hpp +13 -2
  388. data/ext/boost/config/compiler/kai.hpp +0 -2
  389. data/ext/boost/config/compiler/metrowerks.hpp +29 -1
  390. data/ext/boost/config/compiler/mpw.hpp +30 -0
  391. data/ext/boost/config/compiler/pgi.hpp +37 -0
  392. data/ext/boost/config/compiler/sgi_mipspro.hpp +1 -0
  393. data/ext/boost/config/compiler/sunpro_cc.hpp +39 -7
  394. data/ext/boost/config/compiler/vacpp.hpp +31 -3
  395. data/ext/boost/config/compiler/visualc.hpp +72 -5
  396. data/ext/boost/config/no_tr1/cmath.hpp +28 -0
  397. data/ext/boost/config/platform/bsd.hpp +16 -3
  398. data/ext/boost/config/platform/hpux.hpp +3 -0
  399. data/ext/boost/config/platform/macos.hpp +8 -0
  400. data/ext/boost/config/platform/solaris.hpp +7 -0
  401. data/ext/boost/config/platform/vxworks.hpp +31 -0
  402. data/ext/boost/config/select_compiler_config.hpp +4 -0
  403. data/ext/boost/config/select_platform_config.hpp +6 -2
  404. data/ext/boost/config/select_stdlib_config.hpp +17 -8
  405. data/ext/boost/config/stdlib/dinkumware.hpp +34 -2
  406. data/ext/boost/config/stdlib/libcomo.hpp +25 -0
  407. data/ext/boost/config/stdlib/libstdcpp3.hpp +56 -2
  408. data/ext/boost/config/stdlib/modena.hpp +25 -0
  409. data/ext/boost/config/stdlib/msl.hpp +24 -0
  410. data/ext/boost/config/stdlib/roguewave.hpp +26 -0
  411. data/ext/boost/config/stdlib/sgi.hpp +25 -0
  412. data/ext/boost/config/stdlib/stlport.hpp +36 -1
  413. data/ext/boost/config/stdlib/vacpp.hpp +25 -0
  414. data/ext/boost/config/suffix.hpp +67 -32
  415. data/ext/boost/config/warning_disable.hpp +47 -0
  416. data/ext/boost/cstdint.hpp +62 -36
  417. data/ext/boost/date_time/c_time.hpp +28 -12
  418. data/ext/boost/date_time/compiler_config.hpp +27 -5
  419. data/ext/boost/date_time/constrained_value.hpp +36 -13
  420. data/ext/boost/date_time/date.hpp +44 -33
  421. data/ext/boost/date_time/date_duration.hpp +13 -14
  422. data/ext/boost/date_time/date_facet.hpp +215 -226
  423. data/ext/boost/date_time/date_generator_formatter.hpp +22 -20
  424. data/ext/boost/date_time/date_generator_parser.hpp +52 -51
  425. data/ext/boost/date_time/date_generators.hpp +16 -16
  426. data/ext/boost/date_time/date_parsing.hpp +115 -98
  427. data/ext/boost/date_time/filetime_functions.hpp +133 -41
  428. data/ext/boost/date_time/format_date_parser.hpp +22 -10
  429. data/ext/boost/date_time/gregorian/conversion.hpp +32 -39
  430. data/ext/boost/date_time/gregorian/greg_calendar.hpp +15 -14
  431. data/ext/boost/date_time/gregorian/greg_date.hpp +19 -18
  432. data/ext/boost/date_time/gregorian/greg_duration.hpp +106 -10
  433. data/ext/boost/date_time/gregorian/greg_duration_types.hpp +16 -7
  434. data/ext/boost/date_time/gregorian/greg_weekday.hpp +2 -2
  435. data/ext/boost/date_time/gregorian/gregorian_io.hpp +11 -4
  436. data/ext/boost/date_time/gregorian_calendar.hpp +8 -8
  437. data/ext/boost/date_time/gregorian_calendar.ipp +30 -30
  438. data/ext/boost/date_time/int_adapter.hpp +4 -2
  439. data/ext/boost/date_time/microsec_time_clock.hpp +39 -117
  440. data/ext/boost/date_time/period_parser.hpp +17 -15
  441. data/ext/boost/date_time/posix_time/conversion.hpp +28 -29
  442. data/ext/boost/date_time/posix_time/posix_time_config.hpp +19 -19
  443. data/ext/boost/date_time/posix_time/posix_time_io.hpp +31 -38
  444. data/ext/boost/date_time/posix_time/time_formatters.hpp +32 -32
  445. data/ext/boost/date_time/string_parse_tree.hpp +46 -46
  446. data/ext/boost/date_time/strings_from_facet.hpp +7 -5
  447. data/ext/boost/date_time/time.hpp +7 -6
  448. data/ext/boost/date_time/time_defs.hpp +12 -2
  449. data/ext/boost/date_time/time_duration.hpp +27 -26
  450. data/ext/boost/date_time/time_facet.hpp +386 -321
  451. data/ext/boost/date_time/time_formatting_streams.hpp +8 -5
  452. data/ext/boost/date_time/time_resolution_traits.hpp +29 -25
  453. data/ext/boost/date_time/time_system_split.hpp +7 -13
  454. data/ext/boost/date_time/wrapping_int.hpp +21 -15
  455. data/ext/boost/detail/call_traits.hpp +1 -1
  456. data/ext/boost/detail/endian.hpp +4 -4
  457. data/ext/boost/detail/no_exceptions_support.hpp +87 -0
  458. data/ext/boost/detail/sp_typeinfo.hpp +50 -4
  459. data/ext/boost/detail/workaround.hpp +63 -3
  460. data/ext/boost/enable_shared_from_this.hpp +4 -59
  461. data/ext/boost/exception/current_exception_cast.hpp +43 -0
  462. data/ext/boost/exception/detail/attribute_noreturn.hpp +17 -0
  463. data/ext/boost/exception/detail/error_info_impl.hpp +75 -0
  464. data/ext/boost/exception/detail/exception_ptr.hpp +490 -0
  465. data/ext/boost/exception/detail/is_output_streamable.hpp +47 -0
  466. data/ext/boost/exception/detail/object_hex_dump.hpp +50 -0
  467. data/ext/boost/exception/detail/type_info.hpp +79 -0
  468. data/ext/boost/exception/diagnostic_information.hpp +182 -0
  469. data/ext/boost/exception/exception.hpp +422 -0
  470. data/ext/boost/exception/get_error_info.hpp +130 -0
  471. data/ext/boost/exception/info.hpp +167 -0
  472. data/ext/boost/exception/to_string.hpp +83 -0
  473. data/ext/boost/exception/to_string_stub.hpp +109 -0
  474. data/ext/boost/exception_ptr.hpp +11 -0
  475. data/ext/boost/function/detail/prologue.hpp +2 -1
  476. data/ext/boost/function/function_base.hpp +270 -128
  477. data/ext/boost/function/function_fwd.hpp +70 -0
  478. data/ext/boost/function/function_template.hpp +319 -130
  479. data/ext/boost/get_pointer.hpp +5 -1
  480. data/ext/boost/integer.hpp +253 -0
  481. data/ext/boost/integer_fwd.hpp +174 -0
  482. data/ext/boost/integer_traits.hpp +26 -1
  483. data/ext/boost/io/ios_state.hpp +8 -0
  484. data/ext/boost/iterator/detail/config_def.hpp +4 -2
  485. data/ext/boost/iterator/iterator_adaptor.hpp +7 -2
  486. data/ext/boost/iterator/iterator_facade.hpp +1 -2
  487. data/ext/boost/lexical_cast.hpp +113 -105
  488. data/ext/boost/limits.hpp +1 -1
  489. data/ext/boost/mem_fn.hpp +5 -370
  490. data/ext/boost/memory_order.hpp +53 -0
  491. data/ext/boost/mpl/always.hpp +3 -3
  492. data/ext/boost/mpl/and.hpp +3 -3
  493. data/ext/boost/mpl/apply.hpp +3 -3
  494. data/ext/boost/mpl/apply_fwd.hpp +3 -3
  495. data/ext/boost/mpl/apply_wrap.hpp +37 -6
  496. data/ext/boost/mpl/arg.hpp +3 -3
  497. data/ext/boost/mpl/arg_fwd.hpp +3 -3
  498. data/ext/boost/mpl/assert.hpp +6 -6
  499. data/ext/boost/mpl/aux_/adl_barrier.hpp +3 -3
  500. data/ext/boost/mpl/aux_/arg_typedef.hpp +3 -3
  501. data/ext/boost/mpl/aux_/arity.hpp +3 -3
  502. data/ext/boost/mpl/aux_/arity_spec.hpp +3 -3
  503. data/ext/boost/mpl/aux_/common_name_wknd.hpp +3 -3
  504. data/ext/boost/mpl/aux_/config/adl.hpp +4 -4
  505. data/ext/boost/mpl/aux_/config/arrays.hpp +4 -4
  506. data/ext/boost/mpl/aux_/config/bcc.hpp +28 -0
  507. data/ext/boost/mpl/aux_/config/bind.hpp +4 -4
  508. data/ext/boost/mpl/aux_/config/compiler.hpp +8 -6
  509. data/ext/boost/mpl/aux_/config/ctps.hpp +3 -3
  510. data/ext/boost/mpl/aux_/config/dtp.hpp +5 -5
  511. data/ext/boost/mpl/aux_/config/eti.hpp +3 -3
  512. data/ext/boost/mpl/aux_/config/gcc.hpp +3 -3
  513. data/ext/boost/mpl/aux_/config/has_apply.hpp +3 -3
  514. data/ext/boost/mpl/aux_/config/has_xxx.hpp +3 -3
  515. data/ext/boost/mpl/aux_/config/integral.hpp +4 -4
  516. data/ext/boost/mpl/aux_/config/intel.hpp +3 -3
  517. data/ext/boost/mpl/aux_/config/lambda.hpp +3 -3
  518. data/ext/boost/mpl/aux_/config/msvc.hpp +3 -3
  519. data/ext/boost/mpl/aux_/config/msvc_typename.hpp +3 -3
  520. data/ext/boost/mpl/aux_/config/nttp.hpp +3 -3
  521. data/ext/boost/mpl/aux_/config/overload_resolution.hpp +3 -3
  522. data/ext/boost/mpl/aux_/config/pp_counter.hpp +3 -3
  523. data/ext/boost/mpl/aux_/config/preprocessor.hpp +4 -4
  524. data/ext/boost/mpl/aux_/config/static_constant.hpp +3 -3
  525. data/ext/boost/mpl/aux_/config/ttp.hpp +4 -4
  526. data/ext/boost/mpl/aux_/config/use_preprocessed.hpp +3 -3
  527. data/ext/boost/mpl/aux_/config/workaround.hpp +3 -3
  528. data/ext/boost/mpl/aux_/full_lambda.hpp +3 -3
  529. data/ext/boost/mpl/aux_/has_apply.hpp +3 -3
  530. data/ext/boost/mpl/aux_/has_type.hpp +3 -3
  531. data/ext/boost/mpl/aux_/include_preprocessed.hpp +3 -3
  532. data/ext/boost/mpl/aux_/integral_wrapper.hpp +3 -3
  533. data/ext/boost/mpl/aux_/lambda_arity_param.hpp +3 -3
  534. data/ext/boost/mpl/aux_/lambda_support.hpp +4 -4
  535. data/ext/boost/mpl/aux_/msvc_never_true.hpp +3 -3
  536. data/ext/boost/mpl/aux_/na.hpp +3 -3
  537. data/ext/boost/mpl/aux_/na_assert.hpp +3 -3
  538. data/ext/boost/mpl/aux_/na_fwd.hpp +3 -3
  539. data/ext/boost/mpl/aux_/na_spec.hpp +3 -3
  540. data/ext/boost/mpl/aux_/nested_type_wknd.hpp +3 -3
  541. data/ext/boost/mpl/aux_/nttp_decl.hpp +3 -3
  542. data/ext/boost/mpl/aux_/preprocessor/def_params_tail.hpp +3 -3
  543. data/ext/boost/mpl/aux_/preprocessor/enum.hpp +3 -3
  544. data/ext/boost/mpl/aux_/preprocessor/filter_params.hpp +3 -3
  545. data/ext/boost/mpl/aux_/preprocessor/params.hpp +3 -3
  546. data/ext/boost/mpl/aux_/preprocessor/sub.hpp +3 -3
  547. data/ext/boost/mpl/aux_/static_cast.hpp +3 -3
  548. data/ext/boost/mpl/aux_/template_arity.hpp +3 -3
  549. data/ext/boost/mpl/aux_/template_arity_fwd.hpp +3 -3
  550. data/ext/boost/mpl/aux_/type_wrapper.hpp +3 -3
  551. data/ext/boost/mpl/aux_/value_wknd.hpp +3 -3
  552. data/ext/boost/mpl/aux_/yes_no.hpp +3 -3
  553. data/ext/boost/mpl/bind.hpp +3 -3
  554. data/ext/boost/mpl/bind_fwd.hpp +3 -3
  555. data/ext/boost/mpl/bool.hpp +3 -3
  556. data/ext/boost/mpl/bool_fwd.hpp +3 -3
  557. data/ext/boost/mpl/eval_if.hpp +3 -3
  558. data/ext/boost/mpl/has_xxx.hpp +10 -8
  559. data/ext/boost/mpl/identity.hpp +3 -3
  560. data/ext/boost/mpl/if.hpp +3 -3
  561. data/ext/boost/mpl/int.hpp +3 -3
  562. data/ext/boost/mpl/int_fwd.hpp +3 -3
  563. data/ext/boost/mpl/integral_c.hpp +3 -3
  564. data/ext/boost/mpl/integral_c_fwd.hpp +3 -3
  565. data/ext/boost/mpl/integral_c_tag.hpp +3 -3
  566. data/ext/boost/mpl/lambda.hpp +3 -3
  567. data/ext/boost/mpl/lambda_fwd.hpp +3 -3
  568. data/ext/boost/mpl/limits/arity.hpp +3 -3
  569. data/ext/boost/mpl/logical.hpp +3 -3
  570. data/ext/boost/mpl/next.hpp +3 -3
  571. data/ext/boost/mpl/next_prior.hpp +3 -3
  572. data/ext/boost/mpl/not.hpp +3 -3
  573. data/ext/boost/mpl/or.hpp +3 -3
  574. data/ext/boost/mpl/placeholders.hpp +3 -3
  575. data/ext/boost/mpl/protect.hpp +3 -3
  576. data/ext/boost/mpl/quote.hpp +18 -7
  577. data/ext/boost/mpl/size_t.hpp +3 -3
  578. data/ext/boost/mpl/size_t_fwd.hpp +3 -3
  579. data/ext/boost/mpl/void.hpp +3 -3
  580. data/ext/boost/mpl/void_fwd.hpp +3 -3
  581. data/ext/boost/non_type.hpp +27 -27
  582. data/ext/boost/operators.hpp +51 -18
  583. data/ext/boost/preprocessor/arithmetic/detail/div_base.hpp +61 -0
  584. data/ext/boost/preprocessor/arithmetic/mod.hpp +39 -0
  585. data/ext/boost/preprocessor/comparison/less_equal.hpp +39 -0
  586. data/ext/boost/preprocessor/control/deduce_d.hpp +22 -0
  587. data/ext/boost/preprocessor/logical/not.hpp +30 -0
  588. data/ext/boost/preprocessor/seq/cat.hpp +48 -0
  589. data/ext/boost/preprocessor/seq/fold_left.hpp +1070 -0
  590. data/ext/boost/preprocessor/seq/transform.hpp +48 -0
  591. data/ext/boost/range/as_literal.hpp +10 -14
  592. data/ext/boost/range/begin.hpp +4 -4
  593. data/ext/boost/range/detail/implementation_help.hpp +4 -0
  594. data/ext/boost/range/end.hpp +4 -4
  595. data/ext/boost/range/iterator_range.hpp +31 -15
  596. data/ext/boost/ref.hpp +12 -1
  597. data/ext/boost/scoped_array.hpp +16 -0
  598. data/ext/boost/scoped_ptr.hpp +16 -0
  599. data/ext/boost/shared_ptr.hpp +2 -602
  600. data/ext/boost/{detail → smart_ptr}/bad_weak_ptr.hpp +4 -4
  601. data/ext/boost/{detail → smart_ptr/detail}/atomic_count.hpp +14 -19
  602. data/ext/boost/{detail → smart_ptr/detail}/atomic_count_gcc.hpp +13 -9
  603. data/ext/boost/{detail → smart_ptr/detail}/atomic_count_gcc_x86.hpp +5 -12
  604. data/ext/boost/{detail → smart_ptr/detail}/atomic_count_pthreads.hpp +5 -5
  605. data/ext/boost/{detail → smart_ptr/detail}/atomic_count_solaris.hpp +3 -3
  606. data/ext/boost/{detail → smart_ptr/detail}/atomic_count_sync.hpp +9 -5
  607. data/ext/boost/{detail → smart_ptr/detail}/atomic_count_win32.hpp +3 -3
  608. data/ext/boost/smart_ptr/detail/operator_bool.hpp +56 -0
  609. data/ext/boost/{detail → smart_ptr/detail}/shared_count.hpp +86 -17
  610. data/ext/boost/smart_ptr/detail/sp_convertible.hpp +76 -0
  611. data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +70 -0
  612. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_acc_ia64.hpp +4 -4
  613. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_cw_ppc.hpp +4 -4
  614. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_cw_x86.hpp +4 -4
  615. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_gcc_ia64.hpp +4 -4
  616. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +172 -0
  617. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_gcc_ppc.hpp +4 -4
  618. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_gcc_sparc.hpp +7 -7
  619. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_gcc_x86.hpp +4 -4
  620. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_nt.hpp +4 -4
  621. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_pt.hpp +4 -4
  622. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_solaris.hpp +4 -4
  623. data/ext/boost/smart_ptr/detail/sp_counted_base_spin.hpp +131 -0
  624. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_sync.hpp +8 -4
  625. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_w32.hpp +4 -4
  626. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_impl.hpp +5 -5
  627. data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +49 -0
  628. data/ext/boost/smart_ptr/detail/spinlock.hpp +53 -0
  629. data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +85 -0
  630. data/ext/boost/smart_ptr/detail/spinlock_nt.hpp +89 -0
  631. data/ext/boost/smart_ptr/detail/spinlock_pool.hpp +87 -0
  632. data/ext/boost/smart_ptr/detail/spinlock_pt.hpp +79 -0
  633. data/ext/boost/smart_ptr/detail/spinlock_sync.hpp +87 -0
  634. data/ext/boost/smart_ptr/detail/yield_k.hpp +149 -0
  635. data/ext/boost/smart_ptr/enable_shared_from_this.hpp +79 -0
  636. data/ext/boost/smart_ptr/scoped_array.hpp +107 -0
  637. data/ext/boost/smart_ptr/scoped_ptr.hpp +131 -0
  638. data/ext/boost/smart_ptr/shared_ptr.hpp +701 -0
  639. data/ext/boost/smart_ptr/weak_ptr.hpp +230 -0
  640. data/ext/boost/src/pthread/thread.cpp +115 -203
  641. data/ext/boost/src/tss_null.cpp +1 -1
  642. data/ext/boost/static_assert.hpp +14 -4
  643. data/ext/boost/thread.hpp +7 -2
  644. data/ext/boost/thread/barrier.hpp +63 -0
  645. data/ext/boost/thread/detail/force_cast.hpp +39 -0
  646. data/ext/boost/thread/detail/move.hpp +29 -2
  647. data/ext/boost/thread/detail/platform.hpp +3 -3
  648. data/ext/boost/thread/detail/singleton.hpp +59 -0
  649. data/ext/boost/thread/detail/thread.hpp +496 -0
  650. data/ext/boost/thread/detail/thread_group.hpp +105 -0
  651. data/ext/boost/thread/detail/thread_heap_alloc.hpp +23 -0
  652. data/ext/boost/thread/detail/thread_interruption.hpp +35 -0
  653. data/ext/boost/thread/detail/tss_hooks.hpp +82 -0
  654. data/ext/boost/thread/exceptions.hpp +174 -60
  655. data/ext/boost/thread/future.hpp +1364 -0
  656. data/ext/boost/thread/locks.hpp +899 -32
  657. data/ext/boost/thread/once.hpp +4 -0
  658. data/ext/boost/thread/pthread/condition_variable.hpp +16 -21
  659. data/ext/boost/thread/pthread/condition_variable_fwd.hpp +37 -3
  660. data/ext/boost/thread/pthread/mutex.hpp +20 -7
  661. data/ext/boost/thread/pthread/once.hpp +7 -2
  662. data/ext/boost/thread/pthread/pthread_mutex_scoped_lock.hpp +5 -1
  663. data/ext/boost/thread/pthread/recursive_mutex.hpp +22 -5
  664. data/ext/boost/thread/pthread/shared_mutex.hpp +303 -0
  665. data/ext/boost/thread/pthread/thread_data.hpp +37 -10
  666. data/ext/boost/thread/pthread/thread_heap_alloc.hpp +242 -0
  667. data/ext/boost/thread/pthread/timespec.hpp +11 -3
  668. data/ext/boost/thread/shared_mutex.hpp +21 -0
  669. data/ext/boost/thread/thread.hpp +8 -3
  670. data/ext/boost/thread/thread_time.hpp +4 -0
  671. data/ext/boost/thread/tss.hpp +106 -13
  672. data/ext/boost/thread/xtime.hpp +6 -2
  673. data/ext/boost/throw_exception.hpp +36 -7
  674. data/ext/boost/token_functions.hpp +1 -1
  675. data/ext/boost/tokenizer.hpp +1 -1
  676. data/ext/boost/type_traits/add_pointer.hpp +1 -1
  677. data/ext/boost/type_traits/add_volatile.hpp +47 -0
  678. data/ext/boost/type_traits/alignment_of.hpp +29 -1
  679. data/ext/boost/type_traits/config.hpp +1 -1
  680. data/ext/boost/type_traits/conversion_traits.hpp +1 -1
  681. data/ext/boost/type_traits/has_trivial_destructor.hpp +42 -0
  682. data/ext/boost/type_traits/intrinsics.hpp +88 -1
  683. data/ext/boost/type_traits/is_abstract.hpp +14 -5
  684. data/ext/boost/type_traits/is_arithmetic.hpp +8 -0
  685. data/ext/boost/type_traits/is_array.hpp +3 -2
  686. data/ext/boost/type_traits/is_base_and_derived.hpp +254 -0
  687. data/ext/boost/type_traits/is_base_of.hpp +51 -0
  688. data/ext/boost/type_traits/is_class.hpp +12 -0
  689. data/ext/boost/type_traits/is_const.hpp +6 -2
  690. data/ext/boost/type_traits/is_convertible.hpp +14 -2
  691. data/ext/boost/type_traits/is_enum.hpp +10 -1
  692. data/ext/boost/type_traits/is_function.hpp +11 -3
  693. data/ext/boost/type_traits/is_fundamental.hpp +45 -0
  694. data/ext/boost/type_traits/is_integral.hpp +5 -0
  695. data/ext/boost/type_traits/is_member_function_pointer.hpp +5 -3
  696. data/ext/boost/type_traits/is_member_pointer.hpp +4 -2
  697. data/ext/boost/type_traits/is_pointer.hpp +3 -1
  698. data/ext/boost/type_traits/is_reference.hpp +4 -2
  699. data/ext/boost/type_traits/is_signed.hpp +135 -0
  700. data/ext/boost/type_traits/is_unsigned.hpp +130 -0
  701. data/ext/boost/type_traits/is_void.hpp +5 -0
  702. data/ext/boost/type_traits/is_volatile.hpp +4 -2
  703. data/ext/boost/type_traits/make_unsigned.hpp +137 -0
  704. data/ext/boost/type_traits/remove_reference.hpp +1 -1
  705. data/ext/boost/type_traits/type_with_alignment.hpp +106 -1
  706. data/ext/boost/utility.hpp +2 -1
  707. data/ext/boost/utility/addressof.hpp +61 -17
  708. data/ext/boost/utility/binary.hpp +708 -0
  709. data/ext/boost/utility/enable_if.hpp +2 -2
  710. data/ext/boost/weak_ptr.hpp +4 -174
  711. data/ext/common/AbstractSpawnManager.h +110 -0
  712. data/ext/common/Account.h +175 -0
  713. data/ext/common/AccountsDatabase.cpp +81 -0
  714. data/ext/common/AccountsDatabase.h +130 -0
  715. data/ext/common/AgentBase.cpp +323 -0
  716. data/ext/common/{Version.h → AgentBase.h} +14 -6
  717. data/ext/common/AgentsStarter.cpp +154 -0
  718. data/ext/common/AgentsStarter.h +81 -0
  719. data/ext/common/AgentsStarter.hpp +619 -0
  720. data/ext/common/ApplicationPool/Client.h +796 -0
  721. data/ext/common/{ApplicationPool.h → ApplicationPool/Interface.h} +108 -18
  722. data/ext/common/ApplicationPool/Pool.h +1315 -0
  723. data/ext/common/ApplicationPool/Server.h +475 -0
  724. data/ext/common/BCrypt.cpp +343 -0
  725. data/ext/common/BCrypt.h +73 -0
  726. data/ext/common/Blowfish.c +685 -0
  727. data/ext/common/Blowfish.h +103 -0
  728. data/ext/common/Constants.h +48 -0
  729. data/ext/common/EventedClient.h +598 -0
  730. data/ext/common/EventedMessageServer.h +327 -0
  731. data/ext/common/EventedServer.h +295 -0
  732. data/ext/common/Exceptions.h +78 -1
  733. data/ext/common/FileDescriptor.h +229 -0
  734. data/ext/common/HelperAgent/BacktracesServer.h +59 -0
  735. data/ext/common/Logging.cpp +8 -9
  736. data/ext/common/Logging.h +593 -21
  737. data/ext/common/LoggingAgent/ChangeNotifier.h +63 -0
  738. data/ext/common/LoggingAgent/DataStoreId.h +177 -0
  739. data/ext/common/LoggingAgent/LoggingServer.h +1343 -0
  740. data/ext/common/LoggingAgent/Main.cpp +278 -0
  741. data/ext/common/LoggingAgent/RemoteSender.h +457 -0
  742. data/ext/common/MessageChannel.h +196 -34
  743. data/ext/common/MessageClient.h +297 -0
  744. data/ext/common/MessageReadersWriters.h +508 -0
  745. data/ext/common/MessageServer.h +575 -0
  746. data/ext/common/PoolOptions.h +279 -117
  747. data/ext/common/Process.h +255 -0
  748. data/ext/common/RandomGenerator.h +160 -0
  749. data/ext/common/ResourceLocator.h +84 -0
  750. data/ext/common/ServerInstanceDir.h +343 -0
  751. data/ext/common/Session.h +470 -0
  752. data/ext/common/SpawnManager.h +256 -201
  753. data/ext/common/StaticString.h +79 -4
  754. data/ext/common/StringListCreator.h +2 -2
  755. data/ext/common/Utils.cpp +385 -397
  756. data/ext/common/Utils.h +79 -165
  757. data/ext/common/{Base64.cpp → Utils/Base64.cpp} +0 -0
  758. data/ext/common/{Base64.h → Utils/Base64.h} +27 -1
  759. data/ext/common/Utils/BlockingQueue.h +136 -0
  760. data/ext/common/Utils/BlockingScalar.h +50 -0
  761. data/ext/common/{CachedFileStat.cpp → Utils/CachedFileStat.cpp} +1 -1
  762. data/ext/common/{CachedFileStat.h → Utils/CachedFileStat.h} +1 -1
  763. data/ext/common/{CachedFileStat.hpp → Utils/CachedFileStat.hpp} +1 -1
  764. data/ext/common/{FileChangeChecker.h → Utils/FileChangeChecker.h} +1 -1
  765. data/ext/common/Utils/FileHandleGuard.h +81 -0
  766. data/ext/common/Utils/IOUtils.cpp +754 -0
  767. data/ext/common/Utils/IOUtils.h +253 -0
  768. data/ext/common/Utils/MD5.cpp +406 -0
  769. data/ext/common/Utils/MD5.h +98 -0
  770. data/ext/common/Utils/MemZeroGuard.h +103 -0
  771. data/ext/common/Utils/ProcessMetricsCollector.h +462 -0
  772. data/ext/common/Utils/ScopeGuard.h +72 -0
  773. data/ext/common/Utils/StrIntUtils.cpp +329 -0
  774. data/ext/common/Utils/StrIntUtils.h +228 -0
  775. data/ext/common/{SystemTime.cpp → Utils/SystemTime.cpp} +5 -1
  776. data/ext/common/Utils/SystemTime.h +201 -0
  777. data/ext/common/{Timer.h → Utils/Timer.h} +58 -18
  778. data/ext/common/Utils/VariantMap.h +363 -0
  779. data/ext/common/Utils/foo.cpp +10 -0
  780. data/ext/common/Watchdog.cpp +1034 -0
  781. data/ext/google/COPYING +28 -0
  782. data/ext/google/ChangeLog +167 -0
  783. data/ext/google/dense_hash_map +310 -0
  784. data/ext/google/dense_hash_set +287 -0
  785. data/ext/google/sparse_hash_map +294 -0
  786. data/ext/google/sparse_hash_set +275 -0
  787. data/ext/google/sparsehash/densehashtable.h +1062 -0
  788. data/ext/google/sparsehash/sparseconfig.h +55 -0
  789. data/ext/google/sparsehash/sparsehashtable.h +1015 -0
  790. data/ext/google/sparsetable +1468 -0
  791. data/ext/google/type_traits.h +250 -0
  792. data/ext/libev/Changes +302 -0
  793. data/ext/libev/LICENSE +36 -0
  794. data/ext/libev/Makefile.am +18 -0
  795. data/ext/libev/Makefile.in +685 -0
  796. data/ext/libev/README +58 -0
  797. data/ext/libev/aclocal.m4 +7549 -0
  798. data/ext/libev/autogen.sh +6 -0
  799. data/ext/libev/config.guess +1526 -0
  800. data/ext/libev/config.h +122 -0
  801. data/ext/libev/config.h.in +121 -0
  802. data/ext/libev/config.sub +1658 -0
  803. data/ext/libev/configure +22156 -0
  804. data/ext/libev/configure.ac +18 -0
  805. data/ext/libev/ev++.h +800 -0
  806. data/ext/libev/ev.c +3694 -0
  807. data/ext/libev/ev.h +705 -0
  808. data/ext/libev/ev_epoll.c +228 -0
  809. data/ext/libev/ev_kqueue.c +196 -0
  810. data/ext/libev/ev_poll.c +144 -0
  811. data/ext/libev/ev_port.c +165 -0
  812. data/ext/libev/ev_select.c +308 -0
  813. data/ext/libev/ev_vars.h +187 -0
  814. data/ext/libev/ev_win32.c +153 -0
  815. data/ext/libev/ev_wrap.h +178 -0
  816. data/ext/libev/event.c +401 -0
  817. data/ext/libev/event.h +158 -0
  818. data/ext/libev/install-sh +294 -0
  819. data/ext/libev/libev.m4 +38 -0
  820. data/ext/libev/ltmain.sh +6871 -0
  821. data/ext/libev/missing +336 -0
  822. data/ext/libev/mkinstalldirs +111 -0
  823. data/ext/nginx/Configuration.c +532 -182
  824. data/ext/nginx/Configuration.h +33 -10
  825. data/ext/nginx/ContentHandler.c +188 -53
  826. data/ext/nginx/ContentHandler.h +1 -1
  827. data/ext/nginx/{HelperServer.cpp → HelperAgent.cpp} +433 -299
  828. data/ext/nginx/HttpStatusExtractor.h +1 -1
  829. data/ext/nginx/ScgiRequestParser.h +68 -11
  830. data/ext/nginx/StaticContentHandler.c +4 -1
  831. data/ext/nginx/StaticContentHandler.h +1 -1
  832. data/ext/nginx/config +5 -5
  833. data/ext/nginx/ngx_http_passenger_module.c +315 -469
  834. data/ext/nginx/ngx_http_passenger_module.h +8 -17
  835. data/ext/oxt/backtrace.cpp +49 -41
  836. data/ext/oxt/backtrace.hpp +1 -1
  837. data/ext/oxt/detail/backtrace_disabled.hpp +1 -1
  838. data/ext/oxt/detail/backtrace_enabled.hpp +16 -15
  839. data/ext/oxt/detail/spin_lock_darwin.hpp +69 -0
  840. data/ext/oxt/detail/spin_lock_gcc_x86.hpp +3 -4
  841. data/ext/oxt/detail/spin_lock_portable.hpp +1 -1
  842. data/ext/oxt/detail/spin_lock_pthreads.hpp +1 -1
  843. data/ext/oxt/detail/tracable_exception_disabled.hpp +1 -1
  844. data/ext/oxt/detail/tracable_exception_enabled.hpp +1 -1
  845. data/ext/oxt/dynamic_thread_group.hpp +195 -0
  846. data/ext/oxt/macros.hpp +1 -1
  847. data/ext/oxt/spin_lock.hpp +4 -2
  848. data/ext/oxt/system_calls.cpp +129 -13
  849. data/ext/oxt/system_calls.hpp +16 -2
  850. data/ext/oxt/thread.cpp +1 -1
  851. data/ext/oxt/thread.hpp +49 -14
  852. data/ext/oxt/tracable_exception.cpp +5 -5
  853. data/ext/oxt/tracable_exception.hpp +1 -1
  854. data/ext/phusion_passenger/extconf.rb +7 -2
  855. data/ext/phusion_passenger/native_support.c +733 -33
  856. data/{bin → helper-scripts}/passenger-spawn-server +50 -12
  857. data/helper-scripts/prespawn +63 -0
  858. data/lib/phusion_passenger.rb +113 -0
  859. data/lib/phusion_passenger/abstract_installer.rb +50 -12
  860. data/lib/phusion_passenger/abstract_request_handler.rb +432 -171
  861. data/lib/phusion_passenger/abstract_server.rb +125 -122
  862. data/lib/phusion_passenger/abstract_server_collection.rb +51 -22
  863. data/lib/phusion_passenger/admin_tools.rb +1 -1
  864. data/lib/phusion_passenger/admin_tools/memory_stats.rb +299 -0
  865. data/lib/phusion_passenger/admin_tools/server_instance.rb +334 -0
  866. data/lib/phusion_passenger/analytics_logger.rb +342 -0
  867. data/lib/phusion_passenger/{application.rb → app_process.rb} +73 -24
  868. data/lib/phusion_passenger/classic_rails/application_spawner.rb +344 -0
  869. data/lib/phusion_passenger/{railz → classic_rails}/cgi_fixed.rb +2 -2
  870. data/lib/phusion_passenger/{railz → classic_rails}/framework_spawner.rb +75 -98
  871. data/lib/phusion_passenger/{railz → classic_rails}/request_handler.rb +8 -6
  872. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ac_base_extension.rb +65 -0
  873. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ac_benchmarking_extension.rb +48 -0
  874. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ac_rescue_extension.rb +59 -0
  875. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ar_abstract_adapter_extension.rb +54 -0
  876. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/as_cache_extension.rb +130 -0
  877. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/av_benchmark_helper_extension.rb +47 -0
  878. data/lib/phusion_passenger/classic_rails_extensions/init.rb +123 -0
  879. data/lib/phusion_passenger/console_text_template.rb +1 -1
  880. data/lib/phusion_passenger/constants.rb +9 -5
  881. data/lib/phusion_passenger/debug_logging.rb +104 -0
  882. data/lib/phusion_passenger/dependencies.rb +187 -4
  883. data/lib/phusion_passenger/exceptions.rb +4 -4
  884. data/lib/phusion_passenger/html_template.rb +6 -8
  885. data/lib/phusion_passenger/message_channel.rb +137 -21
  886. data/lib/phusion_passenger/message_client.rb +173 -0
  887. data/lib/phusion_passenger/native_support.rb +108 -0
  888. data/lib/phusion_passenger/packaging.rb +82 -13
  889. data/lib/phusion_passenger/platform_info.rb +84 -475
  890. data/lib/phusion_passenger/platform_info/apache.rb +329 -0
  891. data/lib/phusion_passenger/platform_info/binary_compatibility.rb +187 -0
  892. data/lib/phusion_passenger/platform_info/compiler.rb +154 -0
  893. data/lib/phusion_passenger/{events.rb → platform_info/curl.rb} +26 -23
  894. data/lib/phusion_passenger/platform_info/documentation_tools.rb +35 -0
  895. data/lib/phusion_passenger/platform_info/linux.rb +77 -0
  896. data/lib/phusion_passenger/platform_info/operating_system.rb +51 -0
  897. data/lib/phusion_passenger/platform_info/ruby.rb +198 -0
  898. data/lib/phusion_passenger/platform_info/zlib.rb +38 -0
  899. data/lib/phusion_passenger/plugin.rb +96 -0
  900. data/lib/phusion_passenger/public_api.rb +112 -0
  901. data/lib/phusion_passenger/rack/application_spawner.rb +146 -71
  902. data/lib/phusion_passenger/rack/request_handler.rb +36 -13
  903. data/lib/phusion_passenger/rails3_extensions/init.rb +204 -0
  904. data/lib/phusion_passenger/simple_benchmarking.rb +1 -1
  905. data/lib/phusion_passenger/spawn_manager.rb +137 -141
  906. data/lib/phusion_passenger/standalone/app_finder.rb +153 -0
  907. data/lib/phusion_passenger/standalone/command.rb +237 -0
  908. data/lib/phusion_passenger/standalone/config_file.rb +119 -0
  909. data/lib/phusion_passenger/standalone/help_command.rb +57 -0
  910. data/lib/phusion_passenger/standalone/main.rb +101 -0
  911. data/lib/phusion_passenger/standalone/package_runtime_command.rb +92 -0
  912. data/lib/phusion_passenger/standalone/runtime_installer.rb +466 -0
  913. data/lib/phusion_passenger/standalone/start_command.rb +510 -0
  914. data/lib/phusion_passenger/standalone/status_command.rb +62 -0
  915. data/lib/phusion_passenger/standalone/stop_command.rb +74 -0
  916. data/lib/phusion_passenger/standalone/utils.rb +42 -0
  917. data/lib/phusion_passenger/standalone/version_command.rb +42 -0
  918. data/lib/phusion_passenger/templates/framework_init_error.html.erb +1 -1
  919. data/lib/phusion_passenger/templates/standalone/cannot_write_to_dir.txt.erb +11 -0
  920. data/lib/phusion_passenger/templates/standalone/config.erb +69 -0
  921. data/lib/phusion_passenger/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +17 -0
  922. data/lib/phusion_passenger/templates/standalone/run_installer_as_root.txt.erb +8 -0
  923. data/lib/phusion_passenger/templates/standalone/welcome.txt.erb +8 -0
  924. data/lib/phusion_passenger/templates/standalone_default_root/index.html +1 -0
  925. data/lib/phusion_passenger/templates/version_not_found.html.erb +2 -2
  926. data/lib/phusion_passenger/utils.rb +476 -125
  927. data/lib/phusion_passenger/utils/file_system_watcher.rb +186 -0
  928. data/lib/phusion_passenger/utils/hosts_file_parser.rb +130 -0
  929. data/lib/phusion_passenger/utils/tmpdir.rb +70 -0
  930. data/lib/phusion_passenger/utils/unseekable_socket.rb +196 -0
  931. data/lib/phusion_passenger/wsgi/application_spawner.rb +24 -20
  932. data/lib/phusion_passenger/wsgi/request_handler.py +1 -1
  933. data/misc/copy_boost_headers.rb +36 -9
  934. data/misc/find_owner_pipe_leaks.rb +1 -1
  935. data/misc/render_error_pages.rb +1 -1
  936. data/misc/union_station_gateway.crt +32 -0
  937. data/test/config.yml.example +24 -13
  938. data/test/cxx/ApplicationPool_PoolTest.cpp +33 -0
  939. data/test/cxx/ApplicationPool_PoolTestCases.cpp +1029 -0
  940. data/test/cxx/ApplicationPool_ServerTest.cpp +308 -0
  941. data/test/cxx/ApplicationPool_Server_PoolTest.cpp +80 -0
  942. data/test/{Base64Test.cpp → cxx/Base64Test.cpp} +4 -2
  943. data/test/{CachedFileStatTest.cpp → cxx/CachedFileStatTest.cpp} +3 -3
  944. data/test/{CxxTestMain.cpp → cxx/CxxTestMain.cpp} +6 -27
  945. data/test/cxx/EventedClientTest.cpp +386 -0
  946. data/test/{FileChangeCheckerTest.cpp → cxx/FileChangeCheckerTest.cpp} +3 -5
  947. data/test/cxx/FileDescriptorTest.cpp +69 -0
  948. data/test/{HttpStatusExtractorTest.cpp → cxx/HttpStatusExtractorTest.cpp} +1 -1
  949. data/test/cxx/IOUtilsTest.cpp +398 -0
  950. data/test/cxx/LoggingTest.cpp +914 -0
  951. data/test/cxx/MessageChannelTest.cpp +672 -0
  952. data/test/cxx/MessageReadersWritersTest.cpp +574 -0
  953. data/test/cxx/MessageServerTest.cpp +383 -0
  954. data/test/{PoolOptionsTest.cpp → cxx/PoolOptionsTest.cpp} +2 -3
  955. data/test/{ScgiRequestParserTest.cpp → cxx/ScgiRequestParserTest.cpp} +53 -1
  956. data/test/cxx/ServerInstanceDirTest.cpp +186 -0
  957. data/test/cxx/SpawnManagerTest.cpp +161 -0
  958. data/test/cxx/StaticStringTest.cpp +86 -0
  959. data/test/{SystemTimeTest.cpp → cxx/SystemTimeTest.cpp} +2 -2
  960. data/test/cxx/TestSupport.cpp +166 -0
  961. data/test/cxx/TestSupport.h +254 -0
  962. data/test/cxx/UtilsTest.cpp +521 -0
  963. data/test/cxx/VariantMapTest.cpp +179 -0
  964. data/test/integration_tests/apache2_tests.rb +198 -127
  965. data/test/integration_tests/cgi_environment_spec.rb +26 -0
  966. data/test/integration_tests/mycook_spec.rb +2 -28
  967. data/test/integration_tests/nginx_tests.rb +125 -16
  968. data/test/integration_tests/spec_helper.rb +19 -0
  969. data/test/oxt/backtrace_test.cpp +19 -59
  970. data/test/oxt/counter.hpp +55 -0
  971. data/test/oxt/dynamic_thread_group_test.cpp +131 -0
  972. data/test/oxt/oxt_test_main.cpp +2 -2
  973. data/test/oxt/spin_lock_test.cpp +59 -0
  974. data/test/oxt/syscall_interruption_test.cpp +1 -1
  975. data/test/ruby/abstract_request_handler_spec.rb +346 -25
  976. data/test/ruby/abstract_server_collection_spec.rb +4 -3
  977. data/test/ruby/abstract_server_spec.rb +37 -27
  978. data/test/ruby/admin_tools_spec.rb +362 -0
  979. data/test/ruby/analytics_logger_spec.rb +253 -0
  980. data/test/ruby/{application_spec.rb → app_process_spec.rb} +14 -14
  981. data/test/ruby/classic_rails/application_spawner_spec.rb +89 -0
  982. data/test/ruby/classic_rails/framework_spawner_spec.rb +92 -0
  983. data/test/ruby/debug_logging_spec.rb +141 -0
  984. data/test/ruby/message_channel_spec.rb +51 -25
  985. data/test/ruby/rack/application_spawner_spec.rb +99 -82
  986. data/test/ruby/shared/abstract_server_spec.rb +23 -0
  987. data/test/ruby/shared/rails/analytics_logging_extensions_spec.rb +375 -0
  988. data/test/ruby/shared/spawners/classic_rails/framework_spawner_spec.rb +38 -0
  989. data/test/ruby/shared/spawners/classic_rails/lack_of_rails_gem_version_spec.rb +19 -0
  990. data/test/ruby/shared/spawners/classic_rails/spawner_spec.rb +15 -0
  991. data/test/ruby/shared/spawners/non_preloading_spawner_spec.rb +27 -0
  992. data/test/ruby/shared/spawners/preloading_spawner_spec.rb +29 -0
  993. data/test/ruby/shared/spawners/reload_all_spec.rb +36 -0
  994. data/test/ruby/shared/spawners/reload_single_spec.rb +52 -0
  995. data/test/ruby/shared/spawners/spawn_server_spec.rb +28 -0
  996. data/test/ruby/shared/spawners/spawner_spec.rb +273 -0
  997. data/test/ruby/shared/utils/pseudo_io_spec.rb +60 -0
  998. data/test/ruby/spawn_manager_spec.rb +104 -175
  999. data/test/ruby/spec_helper.rb +104 -0
  1000. data/test/ruby/utils/file_system_watcher_spec.rb +221 -0
  1001. data/test/ruby/utils/hosts_file_parser.rb +258 -0
  1002. data/test/ruby/utils/unseekable_socket_spec.rb +66 -0
  1003. data/test/ruby/utils_spec.rb +410 -59
  1004. data/test/ruby/wsgi/application_spawner_spec.rb +16 -20
  1005. data/test/stub/apache2/httpd.conf.erb +11 -6
  1006. data/test/stub/message_channel.rb +3 -1
  1007. data/test/stub/message_channel_2.rb +3 -1
  1008. data/test/stub/message_channel_3.rb +5 -3
  1009. data/test/stub/nginx/nginx.conf.erb +3 -2
  1010. data/test/stub/rails_apps/1.2/empty/Rakefile +10 -0
  1011. data/test/stub/rails_apps/1.2/empty/app/controllers/application.rb +7 -0
  1012. data/test/stub/rails_apps/{foobar → 1.2/empty}/app/helpers/application_helper.rb +0 -0
  1013. data/test/stub/rails_apps/{mycook → 1.2/empty}/config/boot.rb +3 -3
  1014. data/test/stub/rails_apps/1.2/empty/config/database.yml +31 -0
  1015. data/test/stub/rails_apps/1.2/empty/config/environment.rb +66 -0
  1016. data/test/stub/rails_apps/1.2/empty/config/environments/development.rb +21 -0
  1017. data/test/stub/rails_apps/{foobar → 1.2/empty}/config/environments/production.rb +0 -0
  1018. data/test/stub/rails_apps/1.2/empty/config/environments/staging.rb +18 -0
  1019. data/test/stub/rails_apps/1.2/empty/config/environments/test.rb +19 -0
  1020. data/test/stub/rails_apps/1.2/empty/config/routes.rb +23 -0
  1021. data/test/stub/rails_apps/1.2/empty/doc/README_FOR_APP +2 -0
  1022. data/test/stub/rails_apps/{mycook → 1.2/empty}/public/404.html +0 -0
  1023. data/test/stub/rails_apps/1.2/empty/public/500.html +30 -0
  1024. data/test/stub/rails_apps/1.2/empty/public/dispatch.cgi +10 -0
  1025. data/test/stub/rails_apps/1.2/empty/public/dispatch.fcgi +24 -0
  1026. data/test/stub/rails_apps/1.2/empty/public/dispatch.rb +10 -0
  1027. data/test/stub/rails_apps/{mycook → 1.2/empty}/public/favicon.ico +0 -0
  1028. data/test/stub/rails_apps/{mycook → 1.2/empty}/public/images/rails.png +0 -0
  1029. data/test/stub/rails_apps/1.2/empty/public/robots.txt +1 -0
  1030. data/test/stub/rails_apps/1.2/empty/script/about +3 -0
  1031. data/test/stub/rails_apps/1.2/empty/script/breakpointer +3 -0
  1032. data/test/stub/rails_apps/1.2/empty/script/console +3 -0
  1033. data/test/stub/rails_apps/1.2/empty/script/destroy +3 -0
  1034. data/test/stub/rails_apps/1.2/empty/script/generate +3 -0
  1035. data/test/stub/rails_apps/1.2/empty/script/performance/benchmarker +3 -0
  1036. data/test/stub/rails_apps/1.2/empty/script/performance/profiler +3 -0
  1037. data/test/stub/rails_apps/1.2/empty/script/plugin +3 -0
  1038. data/test/stub/rails_apps/1.2/empty/script/process/inspector +3 -0
  1039. data/test/stub/rails_apps/1.2/empty/script/process/reaper +3 -0
  1040. data/test/stub/rails_apps/1.2/empty/script/process/spawner +3 -0
  1041. data/test/stub/rails_apps/1.2/empty/script/runner +3 -0
  1042. data/test/stub/rails_apps/1.2/empty/script/server +3 -0
  1043. data/test/stub/rails_apps/1.2/empty/test/test_helper.rb +28 -0
  1044. data/test/stub/rails_apps/2.0/empty/Rakefile +10 -0
  1045. data/test/stub/rails_apps/2.0/empty/app/controllers/application.rb +10 -0
  1046. data/test/stub/rails_apps/{mycook → 2.0/empty}/app/helpers/application_helper.rb +0 -0
  1047. data/test/stub/rails_apps/{foobar → 2.0/empty}/config/boot.rb +3 -3
  1048. data/test/stub/rails_apps/2.0/empty/config/database.yml +31 -0
  1049. data/test/stub/rails_apps/2.0/empty/config/environment.rb +59 -0
  1050. data/test/stub/rails_apps/{mycook → 2.0/empty}/config/environments/development.rb +1 -1
  1051. data/test/stub/rails_apps/2.0/empty/config/environments/production.rb +18 -0
  1052. data/test/stub/rails_apps/2.0/empty/config/environments/staging.rb +18 -0
  1053. data/test/stub/rails_apps/2.0/empty/config/environments/test.rb +22 -0
  1054. data/test/stub/rails_apps/{foobar → 2.0/empty}/config/initializers/inflections.rb +0 -0
  1055. data/test/stub/rails_apps/{foobar → 2.0/empty}/config/initializers/mime_types.rb +0 -0
  1056. data/test/stub/rails_apps/{foobar → 2.0/empty}/config/routes.rb +0 -0
  1057. data/test/stub/rails_apps/2.0/empty/doc/README_FOR_APP +2 -0
  1058. data/test/stub/rails_apps/2.0/empty/public/404.html +30 -0
  1059. data/test/stub/rails_apps/{mycook → 2.0/empty}/public/422.html +0 -0
  1060. data/test/stub/rails_apps/{mycook → 2.0/empty}/public/500.html +0 -0
  1061. data/test/stub/rails_apps/2.0/empty/public/dispatch.cgi +10 -0
  1062. data/test/stub/rails_apps/2.0/empty/public/dispatch.fcgi +24 -0
  1063. data/test/stub/rails_apps/2.0/empty/public/dispatch.rb +10 -0
  1064. data/test/stub/rails_apps/2.0/empty/public/favicon.ico +0 -0
  1065. data/test/stub/rails_apps/2.0/empty/public/images/rails.png +0 -0
  1066. data/test/stub/rails_apps/{mycook → 2.0/empty}/public/robots.txt +0 -0
  1067. data/test/stub/rails_apps/2.0/empty/script/about +3 -0
  1068. data/test/stub/rails_apps/2.0/empty/script/console +3 -0
  1069. data/test/stub/rails_apps/2.0/empty/script/destroy +3 -0
  1070. data/test/stub/rails_apps/2.0/empty/script/generate +3 -0
  1071. data/test/stub/rails_apps/2.0/empty/script/performance/benchmarker +3 -0
  1072. data/test/stub/rails_apps/2.0/empty/script/performance/profiler +3 -0
  1073. data/test/stub/rails_apps/2.0/empty/script/performance/request +3 -0
  1074. data/test/stub/rails_apps/2.0/empty/script/plugin +3 -0
  1075. data/test/stub/rails_apps/2.0/empty/script/process/inspector +3 -0
  1076. data/test/stub/rails_apps/2.0/empty/script/process/reaper +3 -0
  1077. data/test/stub/rails_apps/2.0/empty/script/process/spawner +3 -0
  1078. data/test/stub/rails_apps/2.0/empty/script/runner +3 -0
  1079. data/test/stub/rails_apps/2.0/empty/script/server +3 -0
  1080. data/test/stub/rails_apps/2.0/empty/test/test_helper.rb +38 -0
  1081. data/test/stub/rails_apps/2.2/empty/Rakefile +10 -0
  1082. data/test/stub/rails_apps/2.2/empty/app/controllers/application.rb +15 -0
  1083. data/test/stub/rails_apps/2.2/empty/app/helpers/application_helper.rb +3 -0
  1084. data/test/stub/rails_apps/2.2/empty/config/boot.rb +109 -0
  1085. data/test/stub/rails_apps/2.2/empty/config/database.yml +31 -0
  1086. data/test/stub/rails_apps/2.2/empty/config/environment.rb +75 -0
  1087. data/test/stub/rails_apps/{foobar → 2.2/empty}/config/environments/development.rb +0 -0
  1088. data/test/stub/rails_apps/2.2/empty/config/environments/production.rb +24 -0
  1089. data/test/stub/rails_apps/2.2/empty/config/environments/staging.rb +24 -0
  1090. data/test/stub/rails_apps/2.2/empty/config/environments/test.rb +22 -0
  1091. data/test/stub/rails_apps/2.2/empty/config/initializers/inflections.rb +10 -0
  1092. data/test/stub/rails_apps/{mycook → 2.2/empty}/config/initializers/mime_types.rb +0 -0
  1093. data/test/stub/rails_apps/2.2/empty/config/initializers/new_rails_defaults.rb +17 -0
  1094. data/test/stub/rails_apps/2.2/empty/config/locales/en.yml +5 -0
  1095. data/test/stub/rails_apps/2.2/empty/config/routes.rb +43 -0
  1096. data/test/stub/rails_apps/2.2/empty/doc/README_FOR_APP +5 -0
  1097. data/test/stub/rails_apps/2.2/empty/public/404.html +30 -0
  1098. data/test/stub/rails_apps/2.2/empty/public/422.html +30 -0
  1099. data/test/stub/rails_apps/2.2/empty/public/500.html +33 -0
  1100. data/test/stub/rails_apps/2.2/empty/public/dispatch.cgi +10 -0
  1101. data/test/stub/rails_apps/2.2/empty/public/dispatch.fcgi +24 -0
  1102. data/test/stub/rails_apps/2.2/empty/public/dispatch.rb +10 -0
  1103. data/test/stub/rails_apps/2.2/empty/public/favicon.ico +0 -0
  1104. data/test/stub/rails_apps/2.2/empty/public/images/rails.png +0 -0
  1105. data/test/stub/rails_apps/2.2/empty/public/robots.txt +5 -0
  1106. data/test/stub/rails_apps/2.2/empty/script/about +4 -0
  1107. data/test/stub/rails_apps/2.2/empty/script/console +3 -0
  1108. data/test/stub/rails_apps/2.2/empty/script/dbconsole +3 -0
  1109. data/test/stub/rails_apps/2.2/empty/script/destroy +3 -0
  1110. data/test/stub/rails_apps/2.2/empty/script/generate +3 -0
  1111. data/test/stub/rails_apps/2.2/empty/script/performance/benchmarker +3 -0
  1112. data/test/stub/rails_apps/2.2/empty/script/performance/profiler +3 -0
  1113. data/test/stub/rails_apps/2.2/empty/script/performance/request +3 -0
  1114. data/test/stub/rails_apps/2.2/empty/script/plugin +3 -0
  1115. data/test/stub/rails_apps/2.2/empty/script/process/inspector +3 -0
  1116. data/test/stub/rails_apps/2.2/empty/script/process/reaper +3 -0
  1117. data/test/stub/rails_apps/2.2/empty/script/process/spawner +3 -0
  1118. data/test/stub/rails_apps/2.2/empty/script/runner +3 -0
  1119. data/test/stub/rails_apps/2.2/empty/script/server +3 -0
  1120. data/test/stub/rails_apps/2.2/empty/test/performance/browsing_test.rb +9 -0
  1121. data/test/stub/rails_apps/2.2/empty/test/test_helper.rb +38 -0
  1122. data/test/stub/rails_apps/2.3/empty/Rakefile +10 -0
  1123. data/test/stub/rails_apps/2.3/empty/app/controllers/application_controller.rb +10 -0
  1124. data/test/stub/rails_apps/2.3/empty/app/helpers/application_helper.rb +3 -0
  1125. data/test/stub/rails_apps/2.3/empty/config/boot.rb +110 -0
  1126. data/test/stub/rails_apps/2.3/empty/config/database.yml +31 -0
  1127. data/test/stub/rails_apps/2.3/empty/config/environment.rb +41 -0
  1128. data/test/stub/rails_apps/2.3/empty/config/environments/development.rb +17 -0
  1129. data/test/stub/rails_apps/2.3/empty/config/environments/production.rb +28 -0
  1130. data/test/stub/rails_apps/2.3/empty/config/environments/staging.rb +28 -0
  1131. data/test/stub/rails_apps/2.3/empty/config/environments/test.rb +28 -0
  1132. data/test/stub/rails_apps/2.3/empty/config/initializers/backtrace_silencers.rb +7 -0
  1133. data/test/stub/rails_apps/2.3/empty/config/initializers/inflections.rb +10 -0
  1134. data/test/stub/rails_apps/2.3/empty/config/initializers/mime_types.rb +5 -0
  1135. data/test/stub/rails_apps/2.3/empty/config/initializers/new_rails_defaults.rb +21 -0
  1136. data/test/stub/rails_apps/2.3/empty/config/initializers/session_store.rb +15 -0
  1137. data/test/stub/rails_apps/2.3/empty/config/locales/en.yml +5 -0
  1138. data/test/stub/rails_apps/2.3/empty/config/routes.rb +43 -0
  1139. data/test/stub/rails_apps/2.3/empty/db/seeds.rb +7 -0
  1140. data/test/stub/rails_apps/2.3/empty/doc/README_FOR_APP +2 -0
  1141. data/test/stub/rails_apps/2.3/empty/public/404.html +30 -0
  1142. data/test/stub/rails_apps/2.3/empty/public/422.html +30 -0
  1143. data/test/stub/rails_apps/2.3/empty/public/500.html +30 -0
  1144. data/test/stub/rails_apps/2.3/empty/public/favicon.ico +0 -0
  1145. data/test/stub/rails_apps/2.3/empty/public/images/rails.png +0 -0
  1146. data/test/stub/rails_apps/2.3/empty/public/robots.txt +5 -0
  1147. data/test/stub/rails_apps/2.3/empty/script/about +4 -0
  1148. data/test/stub/rails_apps/2.3/empty/script/console +3 -0
  1149. data/test/stub/rails_apps/2.3/empty/script/dbconsole +3 -0
  1150. data/test/stub/rails_apps/2.3/empty/script/destroy +3 -0
  1151. data/test/stub/rails_apps/2.3/empty/script/generate +3 -0
  1152. data/test/stub/rails_apps/2.3/empty/script/performance/benchmarker +3 -0
  1153. data/test/stub/rails_apps/2.3/empty/script/performance/profiler +3 -0
  1154. data/test/stub/rails_apps/2.3/empty/script/plugin +3 -0
  1155. data/test/stub/rails_apps/2.3/empty/script/runner +3 -0
  1156. data/test/stub/rails_apps/2.3/empty/script/server +3 -0
  1157. data/test/stub/rails_apps/2.3/empty/test/performance/browsing_test.rb +9 -0
  1158. data/test/stub/rails_apps/2.3/empty/test/test_helper.rb +38 -0
  1159. data/test/stub/rails_apps/2.3/foobar/Rakefile +10 -0
  1160. data/test/stub/rails_apps/{foobar/app/controllers/application.rb → 2.3/foobar/app/controllers/application_controller.rb} +0 -0
  1161. data/test/stub/rails_apps/{foobar → 2.3/foobar}/app/controllers/bar_controller_1.rb +0 -0
  1162. data/test/stub/rails_apps/{foobar → 2.3/foobar}/app/controllers/bar_controller_2.rb +0 -0
  1163. data/test/stub/rails_apps/{foobar → 2.3/foobar}/app/controllers/foo_controller.rb +0 -0
  1164. data/test/stub/rails_apps/2.3/foobar/app/helpers/application_helper.rb +3 -0
  1165. data/test/stub/rails_apps/2.3/foobar/config/boot.rb +110 -0
  1166. data/test/stub/rails_apps/{foobar → 2.3/foobar}/config/database.yml +0 -0
  1167. data/test/stub/rails_apps/{foobar → 2.3/foobar}/config/environment.rb +1 -1
  1168. data/test/stub/rails_apps/2.3/foobar/config/environments/development.rb +17 -0
  1169. data/test/stub/rails_apps/2.3/foobar/config/environments/production.rb +18 -0
  1170. data/test/stub/rails_apps/2.3/foobar/config/environments/staging.rb +18 -0
  1171. data/test/stub/rails_apps/{mycook → 2.3/foobar}/config/initializers/inflections.rb +0 -0
  1172. data/test/stub/rails_apps/2.3/foobar/config/initializers/mime_types.rb +5 -0
  1173. data/test/stub/rails_apps/2.3/foobar/config/routes.rb +35 -0
  1174. data/test/stub/rails_apps/2.3/foobar/script/about +3 -0
  1175. data/test/stub/rails_apps/2.3/foobar/script/console +3 -0
  1176. data/test/stub/rails_apps/2.3/foobar/script/dbconsole +3 -0
  1177. data/test/stub/rails_apps/2.3/foobar/script/destroy +3 -0
  1178. data/test/stub/rails_apps/2.3/foobar/script/generate +3 -0
  1179. data/test/stub/rails_apps/2.3/foobar/script/performance/benchmarker +3 -0
  1180. data/test/stub/rails_apps/2.3/foobar/script/performance/profiler +3 -0
  1181. data/test/stub/rails_apps/2.3/foobar/script/performance/request +3 -0
  1182. data/test/stub/rails_apps/2.3/foobar/script/plugin +3 -0
  1183. data/test/stub/rails_apps/2.3/foobar/script/process/inspector +3 -0
  1184. data/test/stub/rails_apps/2.3/foobar/script/process/reaper +3 -0
  1185. data/test/stub/rails_apps/2.3/foobar/script/process/spawner +3 -0
  1186. data/test/stub/rails_apps/2.3/foobar/script/runner +3 -0
  1187. data/test/stub/rails_apps/2.3/foobar/script/server +3 -0
  1188. data/test/stub/rails_apps/2.3/mycook/Rakefile +10 -0
  1189. data/test/stub/rails_apps/{mycook/app/controllers/application.rb → 2.3/mycook/app/controllers/application_controller.rb} +0 -0
  1190. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/controllers/recipes_controller.rb +0 -0
  1191. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/controllers/uploads_controller.rb +0 -0
  1192. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/controllers/welcome_controller.rb +0 -0
  1193. data/test/stub/rails_apps/2.3/mycook/app/helpers/application_helper.rb +3 -0
  1194. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/layouts/default.rhtml +0 -0
  1195. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/recipes/create.rhtml +0 -0
  1196. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/recipes/index.rhtml +0 -0
  1197. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/recipes/new.rhtml +0 -0
  1198. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/uploads/index.rhtml +0 -0
  1199. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/uploads/new.html.erb +0 -0
  1200. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/welcome/cached.rhtml +0 -0
  1201. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/welcome/index.rhtml +0 -0
  1202. data/test/stub/rails_apps/2.3/mycook/config/boot.rb +110 -0
  1203. data/test/stub/rails_apps/{mycook → 2.3/mycook}/config/database.yml +0 -0
  1204. data/test/stub/rails_apps/{mycook → 2.3/mycook}/config/environment.rb +1 -1
  1205. data/test/stub/rails_apps/2.3/mycook/config/environments/development.rb +18 -0
  1206. data/test/stub/rails_apps/{mycook → 2.3/mycook}/config/environments/production.rb +0 -0
  1207. data/test/stub/rails_apps/2.3/mycook/config/initializers/inflections.rb +10 -0
  1208. data/test/stub/rails_apps/2.3/mycook/config/initializers/mime_types.rb +5 -0
  1209. data/test/stub/rails_apps/{mycook → 2.3/mycook}/config/routes.rb +0 -0
  1210. data/test/stub/rails_apps/{mycook → 2.3/mycook}/log/useless.txt +0 -0
  1211. data/test/stub/rails_apps/2.3/mycook/public/404.html +30 -0
  1212. data/test/stub/rails_apps/2.3/mycook/public/422.html +30 -0
  1213. data/test/stub/rails_apps/2.3/mycook/public/500.html +30 -0
  1214. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/dispatch.cgi +0 -0
  1215. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/dispatch.fcgi +0 -0
  1216. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/dispatch.rb +1 -1
  1217. data/test/stub/rails_apps/2.3/mycook/public/favicon.ico +0 -0
  1218. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/images/angrywizard.gif +0 -0
  1219. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/images/cookbook.gif +0 -0
  1220. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/images/header.png +0 -0
  1221. data/test/stub/rails_apps/2.3/mycook/public/images/rails.png +0 -0
  1222. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/application.js +0 -0
  1223. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/controls.js +73 -73
  1224. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/dragdrop.js +166 -165
  1225. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/effects.js +174 -166
  1226. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/prototype.js +362 -267
  1227. data/test/stub/rails_apps/2.3/mycook/public/robots.txt +5 -0
  1228. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/uploads.html +0 -0
  1229. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/welcome/cached.html +0 -0
  1230. data/test/stub/rails_apps/2.3/mycook/script/about +3 -0
  1231. data/test/stub/rails_apps/2.3/mycook/script/console +3 -0
  1232. data/test/stub/rails_apps/2.3/mycook/script/dbconsole +3 -0
  1233. data/test/stub/rails_apps/2.3/mycook/script/destroy +3 -0
  1234. data/test/stub/rails_apps/2.3/mycook/script/generate +3 -0
  1235. data/test/stub/rails_apps/2.3/mycook/script/performance/benchmarker +3 -0
  1236. data/test/stub/rails_apps/2.3/mycook/script/performance/profiler +3 -0
  1237. data/test/stub/rails_apps/2.3/mycook/script/performance/request +3 -0
  1238. data/test/stub/rails_apps/2.3/mycook/script/plugin +3 -0
  1239. data/test/stub/rails_apps/2.3/mycook/script/process/inspector +3 -0
  1240. data/test/stub/rails_apps/2.3/mycook/script/process/reaper +3 -0
  1241. data/test/stub/rails_apps/2.3/mycook/script/process/spawner +3 -0
  1242. data/test/stub/rails_apps/2.3/mycook/script/runner +3 -0
  1243. data/test/stub/rails_apps/2.3/mycook/script/server +3 -0
  1244. data/test/stub/rails_apps/{mycook → 2.3/mycook}/sites/some.site/public/uploads.html +0 -0
  1245. data/test/stub/rails_apps/{mycook → 2.3/mycook}/sites/some.site/public/welcome/cached.html +0 -0
  1246. data/test/stub/rails_apps/{mycook → 2.3/mycook}/tmp/cache/useless.txt +0 -0
  1247. data/test/stub/rails_apps/{mycook → 2.3/mycook}/tmp/pids/useless.txt +0 -0
  1248. data/test/stub/rails_apps/{mycook → 2.3/mycook}/tmp/sessions/useless.txt +0 -0
  1249. data/test/stub/rails_apps/{mycook → 2.3/mycook}/tmp/sockets/useless.txt +0 -0
  1250. data/test/stub/rails_apps/3.0/empty/Gemfile +22 -0
  1251. data/test/stub/rails_apps/3.0/empty/Rakefile +10 -0
  1252. data/test/stub/rails_apps/3.0/empty/app/controllers/application_controller.rb +4 -0
  1253. data/test/stub/rails_apps/3.0/empty/app/helpers/application_helper.rb +2 -0
  1254. data/test/stub/rails_apps/3.0/empty/app/views/layouts/application.html.erb +14 -0
  1255. data/test/stub/rails_apps/3.0/empty/config.ru +4 -0
  1256. data/test/stub/rails_apps/3.0/empty/config/application.rb +48 -0
  1257. data/test/stub/rails_apps/3.0/empty/config/boot.rb +13 -0
  1258. data/test/stub/rails_apps/3.0/empty/config/database.yml +22 -0
  1259. data/test/stub/rails_apps/3.0/empty/config/environment.rb +5 -0
  1260. data/test/stub/rails_apps/3.0/empty/config/environments/development.rb +19 -0
  1261. data/test/stub/rails_apps/3.0/empty/config/environments/production.rb +48 -0
  1262. data/test/stub/rails_apps/3.0/empty/config/environments/test.rb +32 -0
  1263. data/test/stub/rails_apps/3.0/empty/config/initializers/backtrace_silencers.rb +7 -0
  1264. data/test/stub/rails_apps/3.0/empty/config/initializers/inflections.rb +10 -0
  1265. data/test/stub/rails_apps/3.0/empty/config/initializers/mime_types.rb +5 -0
  1266. data/test/stub/rails_apps/3.0/empty/config/initializers/passenger.rb +1 -0
  1267. data/test/stub/rails_apps/3.0/empty/config/initializers/secret_token.rb +7 -0
  1268. data/test/stub/rails_apps/3.0/empty/config/initializers/session_store.rb +8 -0
  1269. data/test/stub/rails_apps/3.0/empty/config/locales/en.yml +5 -0
  1270. data/test/stub/rails_apps/3.0/empty/config/routes.rb +58 -0
  1271. data/test/stub/rails_apps/3.0/empty/db/seeds.rb +7 -0
  1272. data/test/stub/rails_apps/3.0/empty/doc/README_FOR_APP +2 -0
  1273. data/test/stub/rails_apps/3.0/empty/log/development.log +3 -0
  1274. data/test/stub/rails_apps/3.0/empty/public/404.html +26 -0
  1275. data/test/stub/rails_apps/3.0/empty/public/422.html +26 -0
  1276. data/test/stub/rails_apps/3.0/empty/public/500.html +26 -0
  1277. data/test/stub/rails_apps/3.0/empty/public/favicon.ico +0 -0
  1278. data/test/stub/rails_apps/3.0/empty/public/index.html +279 -0
  1279. data/test/stub/rails_apps/3.0/empty/public/robots.txt +5 -0
  1280. data/test/stub/rails_apps/3.0/empty/script/rails +9 -0
  1281. data/test/stub/rails_apps/3.0/empty/test/performance/browsing_test.rb +9 -0
  1282. data/test/stub/rails_apps/3.0/empty/test/test_helper.rb +13 -0
  1283. data/test/stub/spawn_server.rb +4 -2
  1284. data/test/stub/vendor_rails/minimal/actionpack/lib/action_controller.rb +3 -0
  1285. data/test/stub/vendor_rails/minimal/railties/lib/initializer.rb +7 -2
  1286. data/test/support/apache2_controller.rb +10 -2
  1287. data/test/support/nginx_controller.rb +3 -2
  1288. data/test/support/test_helper.rb +282 -46
  1289. data/test/{support → tut}/tut.h +6 -0
  1290. data/test/{support → tut}/tut_reporter.h +0 -0
  1291. metadata +824 -266
  1292. data/benchmark/ApplicationPool.cpp +0 -52
  1293. data/benchmark/accept_vs_socketpair_vs_named_pipes.rb +0 -126
  1294. data/benchmark/dispatcher.rb +0 -42
  1295. data/benchmark/overhead_of_password_checking.rb +0 -81
  1296. data/benchmark/socket_connections_vs_persistent_pipe.rb +0 -99
  1297. data/benchmark/unix_sockets_vs_pipes.rb +0 -83
  1298. data/ext/boost/LICENSE.TXT +0 -23
  1299. data/ext/boost/VERSION.TXT +0 -1
  1300. data/ext/boost/detail/sp_counted_base.hpp +0 -81
  1301. data/ext/boost/src/pthread/exceptions.cpp +0 -146
  1302. data/ext/boost/src/win32/exceptions.cpp +0 -124
  1303. data/ext/boost/src/win32/thread.cpp +0 -629
  1304. data/ext/boost/src/win32/timeconv.inl +0 -130
  1305. data/ext/boost/src/win32/tss_dll.cpp +0 -72
  1306. data/ext/boost/src/win32/tss_pe.cpp +0 -269
  1307. data/ext/boost/thread/pthread/thread.hpp +0 -339
  1308. data/ext/boost/thread/pthread/tss.hpp +0 -103
  1309. data/ext/common/Application.h +0 -511
  1310. data/ext/common/ApplicationPoolServer.h +0 -794
  1311. data/ext/common/ApplicationPoolServerExecutable.cpp +0 -743
  1312. data/ext/common/ApplicationPoolStatusReporter.h +0 -336
  1313. data/ext/common/DummySpawnManager.h +0 -108
  1314. data/ext/common/StandardApplicationPool.h +0 -821
  1315. data/ext/common/SystemTime.h +0 -88
  1316. data/lib/phusion_passenger/admin_tools/control_process.rb +0 -150
  1317. data/lib/phusion_passenger/railz/application_spawner.rb +0 -463
  1318. data/lib/phusion_passenger/templates/invalid_app_root.html.erb +0 -9
  1319. data/test/ApplicationPoolServerTest.cpp +0 -114
  1320. data/test/ApplicationPoolServer_ApplicationPoolTest.cpp +0 -33
  1321. data/test/ApplicationPoolTest.cpp +0 -599
  1322. data/test/MessageChannelTest.cpp +0 -320
  1323. data/test/SpawnManagerTest.cpp +0 -64
  1324. data/test/StandardApplicationPoolTest.cpp +0 -27
  1325. data/test/StaticStringTest.cpp +0 -51
  1326. data/test/UtilsTest.cpp +0 -257
  1327. data/test/ruby/rails/application_spawner_spec.rb +0 -159
  1328. data/test/ruby/rails/framework_spawner_spec.rb +0 -133
  1329. data/test/ruby/rails/minimal_spawner_spec.rb +0 -93
  1330. data/test/ruby/rails/spawner_error_handling_spec.rb +0 -107
  1331. data/test/ruby/rails/spawner_privilege_lowering_spec.rb +0 -97
  1332. data/test/ruby/spawn_server_spec.rb +0 -26
  1333. data/test/stub/MessageServer.dSYM/Contents/Info.plist +0 -25
  1334. data/test/stub/MessageServer.dSYM/Contents/Resources/DWARF/MessageServer +0 -0
  1335. data/test/support/Support.cpp +0 -84
  1336. data/test/support/Support.h +0 -118
  1337. data/test/support/config.rb +0 -38
  1338. data/test/support/run_rspec_tests.rb +0 -10
@@ -1,4 +1,4 @@
1
- #include "tut.h"
1
+ #include "TestSupport.h"
2
2
  #include "HttpStatusExtractor.h"
3
3
 
4
4
  using namespace Passenger;
@@ -0,0 +1,398 @@
1
+ #include "TestSupport.h"
2
+ #include "Utils/IOUtils.h"
3
+ #include <sys/types.h>
4
+ #include <cerrno>
5
+ #include <string>
6
+
7
+ using namespace Passenger;
8
+ using namespace std;
9
+
10
+ namespace tut {
11
+ static ssize_t writevResult;
12
+ static int writevErrno;
13
+ static int writevCalled;
14
+ static string writevData;
15
+
16
+ static ssize_t writev_mock(int fildes, const struct iovec *iov, int iovcnt) {
17
+ if (writevResult >= 0) {
18
+ string data;
19
+ for (int i = 0; i < iovcnt && data.size() < (size_t) writevResult; i++) {
20
+ data.append(
21
+ (const char *) iov[i].iov_base,
22
+ iov[i].iov_len);
23
+ }
24
+ data.resize(writevResult);
25
+ writevData.append(data);
26
+ }
27
+ writevCalled++;
28
+ errno = writevErrno;
29
+ return writevResult;
30
+ }
31
+
32
+ struct IOUtilsTest {
33
+ string restBuffer;
34
+
35
+ IOUtilsTest() {
36
+ writevResult = 0;
37
+ writevErrno = 0;
38
+ writevCalled = 0;
39
+ writevData.clear();
40
+ setWritevFunction(writev_mock);
41
+ }
42
+
43
+ ~IOUtilsTest() {
44
+ setWritevFunction(NULL);
45
+ }
46
+ };
47
+
48
+ DEFINE_TEST_GROUP(IOUtilsTest);
49
+
50
+ /***** Test gatheredWrite() with empty input rest buffer *****/
51
+
52
+ TEST_METHOD(1) {
53
+ // Test complete write of a single data buffer.
54
+ StaticString data = "hello world";
55
+ writevResult = data.size();
56
+ ensure_equals(gatheredWrite(0, &data, 1, restBuffer), writevResult);
57
+ ensure_equals(writevData, "hello world");
58
+ ensure(restBuffer.empty());
59
+ }
60
+
61
+ TEST_METHOD(2) {
62
+ // Test complete write of multiple data buffers.
63
+ StaticString data[] = { "hello ", "world", "!!!!!!" };
64
+ writevResult = strlen("hello world!!!!!!");
65
+ ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
66
+ ensure_equals(writevData, "hello world!!!!!!");
67
+ ensure(restBuffer.empty());
68
+ }
69
+
70
+ TEST_METHOD(3) {
71
+ // Test partial write of a single data buffer.
72
+ StaticString data = "hello world";
73
+ writevResult = 3;
74
+ ensure_equals(gatheredWrite(0, &data, 1, restBuffer), writevResult);
75
+ ensure_equals(writevData, "hel");
76
+ ensure_equals(restBuffer, "lo world");
77
+ }
78
+
79
+ TEST_METHOD(4) {
80
+ // Test partial write of multiple data buffers:
81
+ // first buffer is partially written.
82
+ StaticString data[] = { "hello ", "world", "!!!!!!" };
83
+ writevResult = 2;
84
+ ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
85
+ ensure_equals(writevData, "he");
86
+ ensure_equals(restBuffer, "llo world!!!!!!");
87
+ }
88
+
89
+ TEST_METHOD(5) {
90
+ // Test partial write of multiple data buffers:
91
+ // first buffer is completely written.
92
+ StaticString data[] = { "hello ", "world", "!!!!!!" };
93
+ writevResult = 6;
94
+ ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
95
+ ensure_equals(writevData, "hello ");
96
+ ensure_equals(restBuffer, "world!!!!!!");
97
+ }
98
+
99
+ TEST_METHOD(6) {
100
+ // Test partial write of multiple data buffers:
101
+ // non-first buffer is partially written.
102
+ StaticString data[] = { "hello ", "world", "!!!!!!" };
103
+ writevResult = 8;
104
+ ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
105
+ ensure_equals(writevData, "hello wo");
106
+ ensure_equals(restBuffer, "rld!!!!!!");
107
+ }
108
+
109
+ TEST_METHOD(7) {
110
+ // Test partial write of multiple data buffers:
111
+ // non-first buffer is completely written.
112
+ StaticString data[] = { "hello ", "world", "!!!!!!" };
113
+ writevResult = 11;
114
+ ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
115
+ ensure_equals(writevData, "hello world");
116
+ ensure_equals(restBuffer, "!!!!!!");
117
+ }
118
+
119
+ TEST_METHOD(8) {
120
+ // Test failed write of a single data buffer: blocking error.
121
+ StaticString data = "hello world";
122
+ writevResult = -1;
123
+ writevErrno = EAGAIN;
124
+ ensure_equals(gatheredWrite(0, &data, 1, restBuffer), 0);
125
+ ensure_equals(restBuffer, "hello world");
126
+ }
127
+
128
+ TEST_METHOD(9) {
129
+ // Test failed write of a single data buffer: other error.
130
+ StaticString data = "hello world";
131
+ writevResult = -1;
132
+ writevErrno = EBADF;
133
+ ssize_t ret = gatheredWrite(0, &data, 1, restBuffer);
134
+ int e = errno;
135
+ ensure_equals(ret, -1);
136
+ ensure_equals(e, EBADF);
137
+ ensure_equals("Rest buffer remains untouched", restBuffer, "");
138
+ }
139
+
140
+ TEST_METHOD(10) {
141
+ // Test failed write of multiple data buffers: blocking error.
142
+ StaticString data[] = { "hello ", "world", "!!!" };
143
+ writevResult = -1;
144
+ writevErrno = EAGAIN;
145
+ ensure_equals(gatheredWrite(0, data, 3, restBuffer), 0);
146
+ ensure_equals(restBuffer, "hello world!!!");
147
+ }
148
+
149
+ TEST_METHOD(11) {
150
+ // Test failed write of multiple data buffers: other error.
151
+ StaticString data[] = { "hello ", "world", "!!!" };
152
+ writevResult = -1;
153
+ writevErrno = EBADF;
154
+ ssize_t ret = gatheredWrite(0, data, 3, restBuffer);
155
+ int e = errno;
156
+ ensure_equals(ret, -1);
157
+ ensure_equals(e, EBADF);
158
+ ensure_equals("Rest buffer remains untouched", restBuffer, "");
159
+ }
160
+
161
+ TEST_METHOD(12) {
162
+ // Test writing nothing.
163
+ StaticString data[] = { "", "", "" };
164
+ ssize_t ret = gatheredWrite(0, data, 3, restBuffer);
165
+ int e = errno;
166
+ ensure_equals(ret, 0);
167
+ ensure_equals(e, 0);
168
+ ensure_equals(writevCalled, 0);
169
+ ensure_equals(restBuffer, "");
170
+ }
171
+
172
+ TEST_METHOD(13) {
173
+ // Test writing multiple buffers where some are empty.
174
+ StaticString data[] = { "hello ", "", "world" };
175
+ writevResult = strlen("hello world");
176
+ ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
177
+ ensure_equals(writevData, "hello world");
178
+ ensure_equals(restBuffer, "");
179
+ }
180
+
181
+ /***** Test gatheredWrite() with non-empty input rest buffer *****/
182
+
183
+ TEST_METHOD(15) {
184
+ // Test complete write with a single data buffer.
185
+ restBuffer = "oh ";
186
+ StaticString data = "hello world";
187
+ writevResult = restBuffer.size() + data.size();
188
+ ensure_equals(gatheredWrite(0, &data, 1, restBuffer), writevResult);
189
+ ensure_equals(writevData, "oh hello world");
190
+ ensure(restBuffer.empty());
191
+ }
192
+
193
+ TEST_METHOD(16) {
194
+ // Test complete write with multiple data buffers.
195
+ restBuffer = "oh ";
196
+ StaticString data[] = { "hello ", "world", "!!!" };
197
+ writevResult = strlen("oh hello world!!!");
198
+ ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
199
+ ensure_equals(writevData, "oh hello world!!!");
200
+ ensure(restBuffer.empty());
201
+ }
202
+
203
+ TEST_METHOD(17) {
204
+ // Test partial write of a single data buffer.
205
+ StaticString data = "hello world";
206
+ writevResult = 3;
207
+ ensure_equals(gatheredWrite(0, &data, 1, restBuffer), writevResult);
208
+ ensure_equals(writevData, "hel");
209
+ ensure_equals(restBuffer, "lo world");
210
+ }
211
+
212
+ TEST_METHOD(18) {
213
+ // Test partial write of multiple data buffers:
214
+ // rest buffer is partially written.
215
+ restBuffer = "oh ";
216
+ StaticString data[] = { "hello ", "world", "!!!" };
217
+ writevResult = 2;
218
+ ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
219
+ ensure_equals(writevData, "oh");
220
+ ensure_equals(restBuffer, " hello world!!!");
221
+ }
222
+
223
+ TEST_METHOD(19) {
224
+ // Test partial write of multiple data buffers:
225
+ // rest buffer is completely written.
226
+ restBuffer = "oh ";
227
+ StaticString data[] = { "hello ", "world", "!!!" };
228
+ writevResult = strlen("oh ");
229
+ ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
230
+ ensure_equals(writevData, "oh ");
231
+ ensure_equals(restBuffer, "hello world!!!");
232
+ }
233
+
234
+ TEST_METHOD(20) {
235
+ // Test partial write of multiple data buffers:
236
+ // first buffer is partially written.
237
+ restBuffer = "oh ";
238
+ StaticString data[] = { "hello ", "world", "!!!" };
239
+ writevResult = strlen("oh h");
240
+ ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
241
+ ensure_equals(writevData, "oh h");
242
+ ensure_equals(restBuffer, "ello world!!!");
243
+ }
244
+
245
+ TEST_METHOD(21) {
246
+ // Test partial write of multiple data buffers:
247
+ // first buffer is completely written.
248
+ restBuffer = "oh ";
249
+ StaticString data[] = { "hello ", "world", "!!!" };
250
+ writevResult = strlen("oh hello ");
251
+ ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
252
+ ensure_equals(writevData, "oh hello ");
253
+ ensure_equals(restBuffer, "world!!!");
254
+ }
255
+
256
+ TEST_METHOD(22) {
257
+ // Test partial write of multiple data buffers:
258
+ // non-first buffer is partially written.
259
+ restBuffer = "oh ";
260
+ StaticString data[] = { "hello ", "world", "!!!" };
261
+ writevResult = strlen("oh hello wo");
262
+ ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
263
+ ensure_equals(writevData, "oh hello wo");
264
+ ensure_equals(restBuffer, "rld!!!");
265
+ }
266
+
267
+ TEST_METHOD(23) {
268
+ // Test partial write of multiple data buffers:
269
+ // non-first buffer is completely written.
270
+ restBuffer = "oh ";
271
+ StaticString data[] = { "hello ", "world", "!!!" };
272
+ writevResult = strlen("oh hello world");
273
+ ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
274
+ ensure_equals(writevData, "oh hello world");
275
+ ensure_equals(restBuffer, "!!!");
276
+ }
277
+
278
+ TEST_METHOD(24) {
279
+ // Test failed write of a single data buffer: blocking error.
280
+ restBuffer = "oh ";
281
+ StaticString data = "hello world";
282
+ writevResult = -1;
283
+ writevErrno = EAGAIN;
284
+ ensure_equals(gatheredWrite(0, &data, 1, restBuffer), 0);
285
+ ensure_equals(restBuffer, "oh hello world");
286
+ }
287
+
288
+ TEST_METHOD(25) {
289
+ // Test failed write of a single data buffer: other error.
290
+ restBuffer = "oh ";
291
+ StaticString data = "hello world";
292
+ writevResult = -1;
293
+ writevErrno = EBADF;
294
+ ssize_t ret = gatheredWrite(0, &data, 1, restBuffer);
295
+ int e = errno;
296
+ ensure_equals(ret, -1);
297
+ ensure_equals(e, EBADF);
298
+ ensure_equals("Rest buffer remains untouched", restBuffer, "oh ");
299
+ }
300
+
301
+ TEST_METHOD(26) {
302
+ // Test failed write of multiple data buffers: blocking error.
303
+ restBuffer = "oh ";
304
+ StaticString data[] = { "hello ", "world", "!!!" };
305
+ writevResult = -1;
306
+ writevErrno = EAGAIN;
307
+ ensure_equals(gatheredWrite(0, data, 3, restBuffer), 0);
308
+ ensure_equals(restBuffer, "oh hello world!!!");
309
+ }
310
+
311
+ TEST_METHOD(27) {
312
+ // Test failed write of multiple data buffers: other error.
313
+ restBuffer = "oh ";
314
+ StaticString data[] = { "hello ", "world", "!!!" };
315
+ writevResult = -1;
316
+ writevErrno = EBADF;
317
+ ssize_t ret = gatheredWrite(0, data, 3, restBuffer);
318
+ int e = errno;
319
+ ensure_equals(ret, -1);
320
+ ensure_equals(e, EBADF);
321
+ ensure_equals("Rest buffer remains untouched", restBuffer, "oh ");
322
+ }
323
+
324
+ TEST_METHOD(28) {
325
+ // Test writing multiple buffers that are all empty.
326
+ restBuffer = "oh ";
327
+ StaticString data[] = { "", "", "" };
328
+ writevResult = 3;
329
+ ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
330
+ ensure_equals(writevData, "oh ");
331
+ ensure_equals(restBuffer, "");
332
+ }
333
+
334
+ TEST_METHOD(29) {
335
+ // Test writing multiple buffers where one is empty.
336
+ restBuffer = "oh ";
337
+ StaticString data[] = { "hello ", "", "world" };
338
+ writevResult = strlen("oh hello world");
339
+ ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
340
+ ensure_equals(writevData, "oh hello world");
341
+ ensure_equals(restBuffer, "");
342
+ }
343
+
344
+
345
+ /***** Test gatheredWrite() blocking version *****/
346
+
347
+ TEST_METHOD(35) {
348
+ // It doesn't call writev() if requested to send 0 bytes.
349
+ StaticString data[2] = { "", "" };
350
+ gatheredWrite(0, data, 2);
351
+ ensure_equals(writevCalled, 0);
352
+ }
353
+
354
+ TEST_METHOD(36) {
355
+ // Test sending all data in a single writev() call.
356
+ StaticString data[] = { "hello", "my", "world" };
357
+ writevResult = strlen("hellomyworld");
358
+ gatheredWrite(0, data, 3);
359
+ ensure_equals(writevData, "hellomyworld");
360
+ ensure_equals(writevCalled, 1);
361
+ }
362
+
363
+ TEST_METHOD(42) {
364
+ // Test writing byte-by-byte.
365
+ StaticString data[] = { "hello", "my", "world", "!!" };
366
+ writevResult = 1;
367
+ gatheredWrite(0, data, 4);
368
+ ensure_equals(writevCalled, (int) strlen("hellomyworld!!"));
369
+ ensure_equals(writevData, "hellomyworld!!");
370
+ }
371
+
372
+ TEST_METHOD(43) {
373
+ // Test writev() writing in chunks of 2 bytes.
374
+ StaticString data[] = { "hello", "my", "world", "!!" };
375
+ writevResult = 2;
376
+ gatheredWrite(0, data, 4);
377
+ ensure_equals(writevCalled, (int) strlen("hellomyworld!!") / 2);
378
+ ensure_equals(writevData, "hellomyworld!!");
379
+ }
380
+
381
+ static ssize_t writev_mock_44(int fildes, const struct iovec *iov, int iovcnt) {
382
+ if (writevCalled == 3) {
383
+ // Have the last call return 2 instead of 4.
384
+ writevResult = 2;
385
+ }
386
+ return writev_mock(fildes, iov, iovcnt);
387
+ }
388
+
389
+ TEST_METHOD(44) {
390
+ // Test writev() writing in chunks of 4 bytes.
391
+ setWritevFunction(writev_mock_44);
392
+ StaticString data[] = { "hello", "my", "world", "!!" };
393
+ writevResult = 4;
394
+ gatheredWrite(0, data, 4);
395
+ ensure_equals(writevCalled, 4);
396
+ ensure_equals(writevData, "hellomyworld!!");
397
+ }
398
+ }
@@ -0,0 +1,914 @@
1
+ #include "TestSupport.h"
2
+ #include "Logging.h"
3
+ #include "MessageClient.h"
4
+ #include "LoggingAgent/LoggingServer.h"
5
+
6
+ #include <boost/bind.hpp>
7
+ #include <boost/shared_ptr.hpp>
8
+ #include <oxt/thread.hpp>
9
+ #include <set>
10
+
11
+ using namespace Passenger;
12
+ using namespace std;
13
+ using namespace oxt;
14
+
15
+ namespace tut {
16
+ struct LoggingTest {
17
+ static const unsigned long long YESTERDAY = 1263299017000000ull; // January 12, 2009, 12:23:37 UTC
18
+ static const unsigned long long TODAY = 1263385422000000ull; // January 13, 2009, 12:23:42 UTC
19
+ static const unsigned long long TOMORROW = 1263471822000000ull; // January 14, 2009, 12:23:42 UTC
20
+ #define FOOBAR_MD5 "3858f62230ac3c915f300c664312c63f"
21
+ #define LOCALHOST_MD5 "421aa90e079fa326b6494f812ad13e79"
22
+ #define REMOTEHOST_MD5 "2c18e486683a3db1e645ad8523223b72"
23
+ #define FOOBAR_LOCALHOST_PREFIX FOOBAR_MD5 "/" LOCALHOST_MD5
24
+ #define FOOBAR_REMOTEHOST_PREFIX FOOBAR_MD5 "/" REMOTEHOST_MD5
25
+ #define TODAY_TXN_ID "cjb8n-abcd"
26
+ #define TODAY_TIMESTAMP_STR "cftz90m3k0"
27
+
28
+ ServerInstanceDirPtr serverInstanceDir;
29
+ ServerInstanceDir::GenerationPtr generation;
30
+ string socketFilename;
31
+ string socketAddress;
32
+ string loggingDir;
33
+ AccountsDatabasePtr accountsDatabase;
34
+ ev::dynamic_loop eventLoop;
35
+ FileDescriptor serverFd;
36
+ LoggingServerPtr server;
37
+ shared_ptr<oxt::thread> serverThread;
38
+ AnalyticsLoggerPtr logger, logger2, logger3, logger4;
39
+
40
+ LoggingTest() {
41
+ createServerInstanceDirAndGeneration(serverInstanceDir, generation);
42
+ socketFilename = generation->getPath() + "/logging.socket";
43
+ socketAddress = "unix:" + socketFilename;
44
+ loggingDir = generation->getPath() + "/logs";
45
+ accountsDatabase = ptr(new AccountsDatabase());
46
+ accountsDatabase->add("test", "1234", false);
47
+ setLogLevel(-1);
48
+
49
+ startLoggingServer();
50
+ logger = ptr(new AnalyticsLogger(socketAddress, "test", "1234",
51
+ "localhost"));
52
+ logger2 = ptr(new AnalyticsLogger(socketAddress, "test", "1234",
53
+ "localhost"));
54
+ logger3 = ptr(new AnalyticsLogger(socketAddress, "test", "1234",
55
+ "localhost"));
56
+ logger4 = ptr(new AnalyticsLogger(socketAddress, "test", "1234",
57
+ "localhost"));
58
+ }
59
+
60
+ ~LoggingTest() {
61
+ stopLoggingServer();
62
+ SystemTime::releaseAll();
63
+ setLogLevel(0);
64
+ }
65
+
66
+ void startLoggingServer(const function<void ()> &initFunc = function<void ()>()) {
67
+ serverFd = createUnixServer(socketFilename.c_str());
68
+ server = ptr(new LoggingServer(eventLoop,
69
+ serverFd, accountsDatabase, loggingDir));
70
+ if (initFunc) {
71
+ initFunc();
72
+ }
73
+ serverThread = ptr(new oxt::thread(
74
+ boost::bind(&LoggingTest::runLoop, this)
75
+ ));
76
+ }
77
+
78
+ void stopLoggingServer(bool destroy = true) {
79
+ if (serverThread != NULL) {
80
+ MessageClient client;
81
+ client.connect(socketAddress, "test", "1234");
82
+ client.write("exit", "immediately", NULL);
83
+ joinLoggingServer(destroy);
84
+ }
85
+ }
86
+
87
+ void joinLoggingServer(bool destroy = true) {
88
+ serverThread->join();
89
+ serverThread.reset();
90
+ if (destroy) {
91
+ server.reset();
92
+ }
93
+ unlink(socketFilename.c_str());
94
+ }
95
+
96
+ void runLoop() {
97
+ eventLoop.loop();
98
+ serverFd.close();
99
+ }
100
+
101
+ string timestampString(unsigned long long timestamp) {
102
+ char str[2 * sizeof(unsigned long long) + 1];
103
+ integerToHexatri<unsigned long long>(timestamp, str);
104
+ return str;
105
+ }
106
+
107
+ MessageClient createConnection(bool sendInitCommand = true) {
108
+ MessageClient client;
109
+ vector<string> args;
110
+ client.connect(socketAddress, "test", "1234");
111
+ if (sendInitCommand) {
112
+ client.write("init", "localhost", NULL);
113
+ client.read(args);
114
+ }
115
+ return client;
116
+ }
117
+
118
+ void setChangeNotifier(const ChangeNotifierPtr &notifier) {
119
+ server->setChangeNotifier(notifier);
120
+ }
121
+
122
+
123
+ class MyChangeNotifier: public ChangeNotifier {
124
+ public:
125
+ boost::mutex lock;
126
+ AtomicInt added;
127
+ set<DataStoreId> changes;
128
+
129
+ MyChangeNotifier(struct ev_loop *loop)
130
+ : ChangeNotifier(loop)
131
+ { }
132
+
133
+ virtual void addClient(const FileDescriptor &fd) {
134
+ added = added + 1;
135
+ }
136
+
137
+ virtual void changed(const DataStoreId &dataStoreId) {
138
+ lock_guard<boost::mutex> l(lock);
139
+ changes.insert(dataStoreId);
140
+ }
141
+ };
142
+
143
+ typedef shared_ptr<MyChangeNotifier> MyChangeNotifierPtr;
144
+ };
145
+
146
+ DEFINE_TEST_GROUP(LoggingTest);
147
+
148
+
149
+ /*********** Logging interface tests ***********/
150
+
151
+ TEST_METHOD(1) {
152
+ // Test logging of new transaction.
153
+ SystemTime::forceAll(YESTERDAY);
154
+
155
+ AnalyticsLogPtr log = logger->newTransaction("foobar");
156
+ log->message("hello");
157
+ log->message("world");
158
+ log->flushToDiskAfterClose(true);
159
+
160
+ ensure(!logger->isNull());
161
+ ensure(!log->isNull());
162
+
163
+ log.reset();
164
+
165
+ string data = readAll(loggingDir + "/1/" FOOBAR_LOCALHOST_PREFIX "/requests/2010/01/12/12/log.txt");
166
+ ensure(data.find("hello\n") != string::npos);
167
+ ensure(data.find("world\n") != string::npos);
168
+ }
169
+
170
+ TEST_METHOD(2) {
171
+ // Test logging of existing transaction.
172
+ SystemTime::forceAll(YESTERDAY);
173
+
174
+ AnalyticsLogPtr log = logger->newTransaction("foobar");
175
+ log->message("message 1");
176
+ log->flushToDiskAfterClose(true);
177
+
178
+ AnalyticsLogPtr log2 = logger2->continueTransaction(log->getTxnId(),
179
+ log->getGroupName(), log->getCategory());
180
+ log2->message("message 2");
181
+ log2->flushToDiskAfterClose(true);
182
+
183
+ log.reset();
184
+ log2.reset();
185
+
186
+ string data = readAll(loggingDir + "/1/" FOOBAR_LOCALHOST_PREFIX "/requests/2010/01/12/12/log.txt");
187
+ ensure("(1)", data.find("message 1\n") != string::npos);
188
+ ensure("(2)", data.find("message 2\n") != string::npos);
189
+ }
190
+
191
+ TEST_METHOD(3) {
192
+ // Test logging with different points in time.
193
+ SystemTime::forceAll(YESTERDAY);
194
+ AnalyticsLogPtr log = logger->newTransaction("foobar");
195
+ log->message("message 1");
196
+ SystemTime::forceAll(TODAY);
197
+ log->message("message 2");
198
+ log->flushToDiskAfterClose(true);
199
+
200
+ SystemTime::forceAll(TOMORROW);
201
+ AnalyticsLogPtr log2 = logger2->continueTransaction(log->getTxnId(),
202
+ log->getGroupName(), log->getCategory());
203
+ log2->message("message 3");
204
+ log2->flushToDiskAfterClose(true);
205
+
206
+ AnalyticsLogPtr log3 = logger3->newTransaction("foobar");
207
+ log3->message("message 4");
208
+ log3->flushToDiskAfterClose(true);
209
+
210
+ log.reset();
211
+ log2.reset();
212
+ log3.reset();
213
+
214
+ string yesterdayData = readAll(loggingDir + "/1/" FOOBAR_LOCALHOST_PREFIX "/requests/2010/01/12/12/log.txt");
215
+ string tomorrowData = readAll(loggingDir + "/1/" FOOBAR_LOCALHOST_PREFIX "/requests/2010/01/14/12/log.txt");
216
+ ensure("(1)", yesterdayData.find(timestampString(YESTERDAY) + " 1 message 1\n") != string::npos);
217
+ ensure("(2)", yesterdayData.find(timestampString(TODAY) + " 2 message 2\n") != string::npos);
218
+ ensure("(3)", yesterdayData.find(timestampString(TOMORROW) + " 4 message 3\n") != string::npos);
219
+ ensure("(4)", tomorrowData.find(timestampString(TOMORROW) + " 1 message 4\n") != string::npos);
220
+ }
221
+
222
+ TEST_METHOD(4) {
223
+ // newTransaction() and continueTransaction() write an ATTACH message
224
+ // to the log file, while AnalyticsLogPtr writes a DETACH message upon
225
+ // destruction.
226
+ SystemTime::forceAll(YESTERDAY);
227
+ AnalyticsLogPtr log = logger->newTransaction("foobar");
228
+
229
+ SystemTime::forceAll(TODAY);
230
+ AnalyticsLogPtr log2 = logger2->continueTransaction(log->getTxnId(),
231
+ log->getGroupName(), log->getCategory());
232
+ log2->flushToDiskAfterClose(true);
233
+ log2.reset();
234
+
235
+ SystemTime::forceAll(TOMORROW);
236
+ log->flushToDiskAfterClose(true);
237
+ log.reset();
238
+
239
+ string data = readAll(loggingDir + "/1/" FOOBAR_LOCALHOST_PREFIX "/requests/2010/01/12/12/log.txt");
240
+ ensure("(1)", data.find(timestampString(YESTERDAY) + " 0 ATTACH\n") != string::npos);
241
+ ensure("(2)", data.find(timestampString(TODAY) + " 1 ATTACH\n") != string::npos);
242
+ ensure("(3)", data.find(timestampString(TODAY) + " 2 DETACH\n") != string::npos);
243
+ ensure("(4)", data.find(timestampString(TOMORROW) + " 3 DETACH\n") != string::npos);
244
+ }
245
+
246
+ TEST_METHOD(5) {
247
+ // newTransaction() generates a new ID, while continueTransaction()
248
+ // reuses the ID.
249
+ AnalyticsLogPtr log = logger->newTransaction("foobar");
250
+ AnalyticsLogPtr log2 = logger2->newTransaction("foobar");
251
+ AnalyticsLogPtr log3 = logger3->continueTransaction(log->getTxnId(),
252
+ log->getGroupName(), log->getCategory());
253
+ AnalyticsLogPtr log4 = logger4->continueTransaction(log2->getTxnId(),
254
+ log2->getGroupName(), log2->getCategory());
255
+
256
+ ensure_equals(log->getTxnId(), log3->getTxnId());
257
+ ensure_equals(log2->getTxnId(), log4->getTxnId());
258
+ ensure(log->getTxnId() != log2->getTxnId());
259
+ }
260
+
261
+ TEST_METHOD(6) {
262
+ // An empty AnalyticsLog doesn't do anything.
263
+ AnalyticsLog log;
264
+ ensure(log.isNull());
265
+ log.message("hello world");
266
+ ensure_equals(getFileType(loggingDir), FT_NONEXISTANT);
267
+ }
268
+
269
+ TEST_METHOD(7) {
270
+ // An empty AnalyticsLogger doesn't do anything.
271
+ AnalyticsLogger logger;
272
+ ensure(logger.isNull());
273
+
274
+ AnalyticsLogPtr log = logger.newTransaction("foo");
275
+ ensure(log->isNull());
276
+ log->message("hello world");
277
+ ensure_equals(getFileType(loggingDir), FT_NONEXISTANT);
278
+ }
279
+
280
+ TEST_METHOD(8) {
281
+ // It creates a file group_name.txt under the group directory.
282
+ AnalyticsLogPtr log = logger->newTransaction("foobar");
283
+ log->flushToDiskAfterClose(true);
284
+ log.reset();
285
+ string data = readAll(loggingDir + "/1/" FOOBAR_MD5 "/group_name.txt");
286
+ ensure_equals(data, "foobar");
287
+ }
288
+
289
+ TEST_METHOD(9) {
290
+ // It creates a file node_name.txt under the node directory.
291
+ AnalyticsLogPtr log = logger->newTransaction("foobar");
292
+ log->flushToDiskAfterClose(true);
293
+ log.reset();
294
+ string data = readAll(loggingDir + "/1/" FOOBAR_LOCALHOST_PREFIX "/node_name.txt");
295
+ ensure_equals(data, "localhost");
296
+ }
297
+
298
+ TEST_METHOD(10) {
299
+ // newTransaction() reestablishes the connection to the logging
300
+ // server if the logging server crashed and was restarted
301
+ SystemTime::forceAll(TODAY);
302
+
303
+ logger->newTransaction("foobar");
304
+ stopLoggingServer();
305
+ startLoggingServer();
306
+
307
+ AnalyticsLogPtr log = logger->newTransaction("foobar");
308
+ log->message("hello");
309
+ log->flushToDiskAfterClose(true);
310
+ log.reset();
311
+
312
+ string data = readAll(loggingDir + "/1/" FOOBAR_LOCALHOST_PREFIX "/requests/2010/01/13/12/log.txt");
313
+ ensure("(1)", data.find("hello\n") != string::npos);
314
+ }
315
+
316
+ TEST_METHOD(11) {
317
+ // newTransaction() does not reconnect to the server for a short
318
+ // period of time if connecting failed
319
+ logger->setReconnectTimeout(60 * 1000000);
320
+ logger->setMaxConnectTries(1);
321
+
322
+ SystemTime::forceAll(TODAY);
323
+ stopLoggingServer();
324
+ ensure(logger->newTransaction("foobar")->isNull());
325
+
326
+ SystemTime::forceAll(TODAY + 30 * 1000000);
327
+ startLoggingServer();
328
+ ensure(logger->newTransaction("foobar")->isNull());
329
+
330
+ SystemTime::forceAll(TODAY + 61 * 1000000);
331
+ ensure(!logger->newTransaction("foobar")->isNull());
332
+ }
333
+
334
+ TEST_METHOD(12) {
335
+ // continueTransaction() reestablishes the connection to the logging
336
+ // server if the logging server crashed and was restarted
337
+ SystemTime::forceAll(TODAY);
338
+
339
+ AnalyticsLogPtr log = logger->newTransaction("foobar");
340
+ logger2->continueTransaction(log->getTxnId(), "foobar");
341
+ stopLoggingServer();
342
+ startLoggingServer();
343
+
344
+ AnalyticsLogPtr log2 = logger2->continueTransaction(log->getTxnId(), "foobar");
345
+ log2->message("hello");
346
+ log2->flushToDiskAfterClose(true);
347
+ log2.reset();
348
+
349
+ string data = readAll(loggingDir + "/1/" FOOBAR_LOCALHOST_PREFIX "/requests/2010/01/13/12/log.txt");
350
+ ensure("(1)", data.find("hello\n") != string::npos);
351
+ }
352
+
353
+ TEST_METHOD(13) {
354
+ // continueTransaction() does not reconnect to the server for a short
355
+ // period of time if connecting failed
356
+ logger->setReconnectTimeout(60 * 1000000);
357
+ logger->setMaxConnectTries(1);
358
+ logger2->setReconnectTimeout(60 * 1000000);
359
+ logger2->setMaxConnectTries(1);
360
+
361
+ SystemTime::forceAll(TODAY);
362
+ AnalyticsLogPtr log = logger->newTransaction("foobar");
363
+ logger2->continueTransaction(log->getTxnId(), "foobar");
364
+ stopLoggingServer();
365
+ ensure(logger2->continueTransaction(log->getTxnId(), "foobar")->isNull());
366
+
367
+ SystemTime::forceAll(TODAY + 30 * 1000000);
368
+ startLoggingServer();
369
+ ensure(logger2->continueTransaction(log->getTxnId(), "foobar")->isNull());
370
+
371
+ SystemTime::forceAll(TODAY + 61 * 1000000);
372
+ ensure(!logger2->continueTransaction(log->getTxnId(), "foobar")->isNull());
373
+ }
374
+
375
+ TEST_METHOD(14) {
376
+ // If a client disconnects from the logging server then all its
377
+ // transactions that are no longer referenced and have crash protection enabled
378
+ // will be closed and written to to the sink.
379
+ MessageClient client1 = createConnection();
380
+ MessageClient client2 = createConnection();
381
+ MessageClient client3 = createConnection();
382
+ vector<string> args;
383
+ string filename = loggingDir + "/1/" FOOBAR_LOCALHOST_PREFIX "/requests/2010/01/13/12/log.txt";
384
+
385
+ SystemTime::forceAll(TODAY);
386
+
387
+ client1.write("openTransaction",
388
+ TODAY_TXN_ID, "foobar", "", "requests", TODAY_TIMESTAMP_STR,
389
+ "", "true", NULL);
390
+ client2.write("openTransaction",
391
+ TODAY_TXN_ID, "foobar", "", "requests", TODAY_TIMESTAMP_STR,
392
+ "", "true", NULL);
393
+ client2.write("flush", NULL);
394
+ client2.read(args);
395
+ client2.disconnect();
396
+
397
+ SHOULD_NEVER_HAPPEN(100,
398
+ result = fileExists(filename) && !readAll(filename).empty();
399
+ );
400
+ client1.disconnect();
401
+ client3.write("flush", NULL);
402
+ client3.read(args);
403
+ EVENTUALLY(5,
404
+ result = fileExists(filename) && !readAll(filename).empty();
405
+ );
406
+ }
407
+
408
+ TEST_METHOD(15) {
409
+ // If a client disconnects from the logging server then all its
410
+ // transactions that are no longer referenced and don't have crash
411
+ // protection enabled will be closed and discarded.
412
+ MessageClient client1 = createConnection();
413
+ MessageClient client2 = createConnection();
414
+ MessageClient client3 = createConnection();
415
+ vector<string> args;
416
+ string filename = loggingDir + "/1/" FOOBAR_LOCALHOST_PREFIX "/requests/2010/01/13/12/log.txt";
417
+
418
+ SystemTime::forceAll(TODAY);
419
+
420
+ client1.write("openTransaction",
421
+ TODAY_TXN_ID, "foobar", "", "requests", TODAY_TIMESTAMP_STR,
422
+ "", "false", NULL);
423
+ client2.write("openTransaction",
424
+ TODAY_TXN_ID, "foobar", "", "requests", TODAY_TIMESTAMP_STR,
425
+ "", "false", NULL);
426
+ client2.write("flush", NULL);
427
+ client2.read(args);
428
+ client2.disconnect();
429
+ client1.disconnect();
430
+ client3.write("flush", NULL);
431
+ client3.read(args);
432
+ SHOULD_NEVER_HAPPEN(500,
433
+ result = fileExists(filename) && !readAll(filename).empty();
434
+ );
435
+ }
436
+
437
+ TEST_METHOD(16) {
438
+ // Upon server shutdown, all transaction that have crash protection enabled
439
+ // will be closed and written to to the sink.
440
+ MessageClient client1 = createConnection();
441
+ MessageClient client2 = createConnection();
442
+ vector<string> args;
443
+ string filename = loggingDir + "/1/" FOOBAR_LOCALHOST_PREFIX "/requests/2010/01/13/12/log.txt";
444
+
445
+ SystemTime::forceAll(TODAY);
446
+
447
+ client1.write("openTransaction",
448
+ TODAY_TXN_ID, "foobar", "", "requests", TODAY_TIMESTAMP_STR,
449
+ "", "true", NULL);
450
+ client2.write("openTransaction",
451
+ TODAY_TXN_ID, "foobar", "", "requests", TODAY_TIMESTAMP_STR,
452
+ "", "true", NULL);
453
+ client2.write("flush", NULL);
454
+ client2.read(args);
455
+
456
+ stopLoggingServer();
457
+ EVENTUALLY(5,
458
+ result = fileExists(filename) && !readAll(filename).empty();
459
+ );
460
+ }
461
+
462
+ TEST_METHOD(17) {
463
+ // Upon server shutdown, all transaction that don't have crash protection
464
+ // enabled will be discarded.
465
+ MessageClient client1 = createConnection();
466
+ MessageClient client2 = createConnection();
467
+ vector<string> args;
468
+ string filename = loggingDir + "/1/" FOOBAR_LOCALHOST_PREFIX "/requests/2010/01/13/12/log.txt";
469
+
470
+ SystemTime::forceAll(TODAY);
471
+
472
+ client1.write("openTransaction",
473
+ TODAY_TXN_ID, "foobar", "", "requests", TODAY_TIMESTAMP_STR,
474
+ "", "false", NULL);
475
+ client2.write("openTransaction",
476
+ TODAY_TXN_ID, "foobar", "", "requests", TODAY_TIMESTAMP_STR,
477
+ "", "false", NULL);
478
+ client2.write("flush", NULL);
479
+ client2.read(args);
480
+
481
+ stopLoggingServer();
482
+ SHOULD_NEVER_HAPPEN(200,
483
+ result = fileExists(filename) && !readAll(filename).empty();
484
+ );
485
+ }
486
+
487
+ TEST_METHOD(18) {
488
+ // Test DataStoreId
489
+ {
490
+ // Empty construction.
491
+ DataStoreId id;
492
+ ensure_equals(id.getGroupName(), "");
493
+ ensure_equals(id.getNodeName(), "");
494
+ ensure_equals(id.getCategory(), "");
495
+ }
496
+ {
497
+ // Normal construction.
498
+ DataStoreId id("ab", "cd", "ef");
499
+ ensure_equals(id.getGroupName(), "ab");
500
+ ensure_equals(id.getNodeName(), "cd");
501
+ ensure_equals(id.getCategory(), "ef");
502
+ }
503
+ {
504
+ // Copy constructor.
505
+ DataStoreId id("ab", "cd", "ef");
506
+ DataStoreId id2(id);
507
+ ensure_equals(id2.getGroupName(), "ab");
508
+ ensure_equals(id2.getNodeName(), "cd");
509
+ ensure_equals(id2.getCategory(), "ef");
510
+ }
511
+ {
512
+ // Assignment operator.
513
+ DataStoreId id("ab", "cd", "ef");
514
+ DataStoreId id2;
515
+ id2 = id;
516
+ ensure_equals(id2.getGroupName(), "ab");
517
+ ensure_equals(id2.getNodeName(), "cd");
518
+ ensure_equals(id2.getCategory(), "ef");
519
+
520
+ DataStoreId id3("gh", "ij", "kl");
521
+ id3 = id;
522
+ ensure_equals(id3.getGroupName(), "ab");
523
+ ensure_equals(id3.getNodeName(), "cd");
524
+ ensure_equals(id3.getCategory(), "ef");
525
+ }
526
+ {
527
+ // < operator
528
+ DataStoreId id, id2;
529
+ ensure(!(id < id2));
530
+
531
+ id = DataStoreId("ab", "cd", "ef");
532
+ id2 = DataStoreId("ab", "cd", "ef");
533
+ ensure(!(id < id2));
534
+
535
+ id = DataStoreId("ab", "cd", "ef");
536
+ id2 = DataStoreId("bb", "cd", "ef");
537
+ ensure(id < id2);
538
+
539
+ id = DataStoreId("ab", "cd", "ef");
540
+ id2 = DataStoreId();
541
+ ensure(id2 < id);
542
+
543
+ id = DataStoreId();
544
+ id2 = DataStoreId("ab", "cd", "ef");
545
+ ensure(id < id2);
546
+ }
547
+ {
548
+ // == operator
549
+ ensure(DataStoreId() == DataStoreId());
550
+ ensure(DataStoreId("ab", "cd", "ef") == DataStoreId("ab", "cd", "ef"));
551
+ ensure(!(DataStoreId("ab", "cd", "ef") == DataStoreId()));
552
+ ensure(!(DataStoreId("ab", "cd", "ef") == DataStoreId("ab", "cd", "e")));
553
+ ensure(!(DataStoreId("ab", "cd", "ef") == DataStoreId("ab", "c", "ef")));
554
+ ensure(!(DataStoreId("ab", "cd", "ef") == DataStoreId("a", "cd", "ef")));
555
+ }
556
+ }
557
+
558
+ TEST_METHOD(19) {
559
+ // getLastPos() works
560
+ SystemTime::forceAll(YESTERDAY);
561
+
562
+ AnalyticsLogPtr log = logger->newTransaction("foobar");
563
+ log->message("hello world");
564
+ log->flushToDiskAfterClose(true);
565
+ log.reset();
566
+
567
+ SystemTime::forceAll(TODAY);
568
+
569
+ log = logger->newTransaction("foobar");
570
+ log->message("hello world");
571
+ log->flushToDiskAfterClose(true);
572
+ log.reset();
573
+
574
+ stopLoggingServer(false);
575
+
576
+ string filename = loggingDir + "/1/" FOOBAR_LOCALHOST_PREFIX "/requests/2010/01/13/12/log.txt";
577
+ struct stat buf;
578
+ ensure_equals(stat(filename.c_str(), &buf), 0);
579
+ string lastPos = server->getLastPos("foobar", "localhost", "requests");
580
+ ensure_equals(lastPos, "2010/01/13/12/" + toString(buf.st_size));
581
+ }
582
+
583
+ TEST_METHOD(20) {
584
+ // getLastPos() returns the empty string if log.txt or if one of
585
+ // the subdirectories are missing.
586
+ SystemTime::forceAll(YESTERDAY);
587
+
588
+ AnalyticsLogPtr log = logger->newTransaction("foobar");
589
+ log->message("hello world");
590
+ log->flushToDiskAfterClose(true);
591
+ log.reset();
592
+
593
+ stopLoggingServer(false);
594
+
595
+ string filename = loggingDir + "/1/" FOOBAR_LOCALHOST_PREFIX "/requests/2010/01/12/12/log.txt";
596
+ unlink(filename.c_str());
597
+
598
+ string lastPos = server->getLastPos("foobar", "localhost", "requests");
599
+ ensure_equals(lastPos, "");
600
+
601
+ lastPos = server->getLastPos("baz", "localhost", "requests");
602
+ ensure_equals(lastPos, "");
603
+ }
604
+
605
+ TEST_METHOD(21) {
606
+ // The server temporarily buffers data in memory.
607
+ SystemTime::forceAll(YESTERDAY);
608
+
609
+ AnalyticsLogPtr log = logger->newTransaction("foobar");
610
+ log->message("hello world");
611
+ log.reset();
612
+
613
+ // Give server some time to process these commands.
614
+ usleep(20000);
615
+
616
+ string filename = loggingDir + "/1/" FOOBAR_LOCALHOST_PREFIX "/requests/2010/01/12/12/log.txt";
617
+ struct stat buf;
618
+ ensure_equals(stat(filename.c_str(), &buf), 0);
619
+ ensure_equals(buf.st_size, (off_t) 0);
620
+ }
621
+
622
+ TEST_METHOD(22) {
623
+ // The destructor flushes all data.
624
+ SystemTime::forceAll(YESTERDAY);
625
+
626
+ AnalyticsLogPtr log = logger->newTransaction("foobar");
627
+ log->message("hello world");
628
+ log.reset();
629
+ stopLoggingServer();
630
+
631
+ string filename = loggingDir + "/1/" FOOBAR_LOCALHOST_PREFIX "/requests/2010/01/12/12/log.txt";
632
+ struct stat buf;
633
+ ensure_equals(stat(filename.c_str(), &buf), 0);
634
+ ensure(buf.st_size > 0);
635
+ }
636
+
637
+ TEST_METHOD(23) {
638
+ // The 'flush' command flushes all data.
639
+ SystemTime::forceAll(YESTERDAY);
640
+
641
+ AnalyticsLogPtr log = logger->newTransaction("foobar");
642
+ log->message("hello world");
643
+ log.reset();
644
+
645
+ vector<string> args;
646
+ MessageChannel channel(logger->getConnection());
647
+ channel.write("flush", NULL);
648
+ ensure(channel.read(args));
649
+ ensure_equals(args.size(), 1u);
650
+ ensure_equals(args[0], "ok");
651
+
652
+ string filename = loggingDir + "/1/" FOOBAR_LOCALHOST_PREFIX "/requests/2010/01/12/12/log.txt";
653
+ struct stat buf;
654
+ ensure_equals(stat(filename.c_str(), &buf), 0);
655
+ ensure(buf.st_size > 0);
656
+ }
657
+
658
+ TEST_METHOD(24) {
659
+ // A transaction's data is not written out by the server
660
+ // until the transaction is fully closed.
661
+ SystemTime::forceAll(YESTERDAY);
662
+ vector<string> args;
663
+
664
+ AnalyticsLogPtr log = logger->newTransaction("foobar");
665
+ log->message("hello world");
666
+
667
+ AnalyticsLogPtr log2 = logger2->continueTransaction(log->getTxnId(),
668
+ log->getGroupName(), log->getCategory());
669
+ log2->message("message 2");
670
+ log2.reset();
671
+
672
+ MessageChannel channel(logger->getConnection());
673
+ channel.write("flush", NULL);
674
+ ensure(channel.read(args));
675
+
676
+ channel = MessageChannel(logger2->getConnection());
677
+ channel.write("flush", NULL);
678
+ ensure(channel.read(args));
679
+
680
+ string filename = loggingDir + "/1/" FOOBAR_LOCALHOST_PREFIX "/requests/2010/01/12/12/log.txt";
681
+ struct stat buf;
682
+ ensure_equals(stat(filename.c_str(), &buf), 0);
683
+ ensure_equals(buf.st_size, (off_t) 0);
684
+ }
685
+
686
+ TEST_METHOD(25) {
687
+ // The 'exit' command causes the logging server to exit some time after
688
+ // the last client has disconnected. New clients are still accepted
689
+ // as long as the server hasn't exited.
690
+ SystemTime::forceAll(YESTERDAY);
691
+ vector<string> args;
692
+
693
+ MessageClient client = createConnection();
694
+
695
+ MessageClient client2 = createConnection();
696
+ client2.write("exit", NULL);
697
+ ensure("(1)", client2.read(args));
698
+ ensure_equals(args.size(), 1u);
699
+ ensure_equals(args[0], "Passed security");
700
+ ensure("(2)", client2.read(args));
701
+ ensure_equals(args.size(), 1u);
702
+ ensure_equals(args[0], "exit command received");
703
+ client2.disconnect();
704
+
705
+ // Not exited yet: there is still a client.
706
+ client2 = createConnection();
707
+ client2.write("ping", NULL);
708
+ ensure("(3)", client2.read(args));
709
+ client2.disconnect();
710
+
711
+ client.disconnect();
712
+ setLogLevel(-2);
713
+ usleep(25000); // Give server some time to process the connection closes.
714
+
715
+ // No clients now, but we can still connect because the timeout
716
+ // hasn't passed yet.
717
+ SystemTime::forceAll(YESTERDAY + 1000000);
718
+ SHOULD_NEVER_HAPPEN(250,
719
+ try {
720
+ close(connectToUnixServer(socketFilename));
721
+ result = false;
722
+ } catch (const SystemException &) {
723
+ result = true;
724
+ }
725
+ );
726
+
727
+ usleep(50000); // Give server some time to process the connection closes.
728
+
729
+ // It'll be gone in a few seconds.
730
+ SystemTime::forceAll(YESTERDAY + 1000000 + 5000000);
731
+ usleep(100000); // Give server some time to run the timer.
732
+ try {
733
+ close(connectToUnixServer(socketFilename));
734
+ fail("(4)");
735
+ } catch (const SystemException &) {
736
+ // Success
737
+ }
738
+
739
+ joinLoggingServer();
740
+ }
741
+
742
+ TEST_METHOD(26) {
743
+ // The 'exit semi-gracefully' command causes the logging server to
744
+ // refuse new clients while exiting some time after the last client has
745
+ // disconnected.
746
+ SystemTime::forceAll(YESTERDAY);
747
+ vector<string> args;
748
+
749
+ MessageClient client = createConnection();
750
+
751
+ MessageClient client2 = createConnection();
752
+ client2.write("exit", "semi-gracefully", NULL);
753
+ client2.disconnect();
754
+
755
+ // New connections are refused.
756
+ client2 = createConnection();
757
+ ensure("(1)", !client2.read(args));
758
+
759
+ client.disconnect();
760
+ setLogLevel(-2);
761
+ usleep(50000); // Give server some time to process the connection closes.
762
+
763
+ // It'll be gone in a few seconds.
764
+ SystemTime::forceAll(YESTERDAY + 1000000 + 5000000);
765
+ usleep(100000); // Give server some time to run the timer.
766
+ try {
767
+ close(connectToUnixServer(socketFilename));
768
+ fail("(2)");
769
+ } catch (const SystemException &) {
770
+ // Success
771
+ }
772
+
773
+ joinLoggingServer();
774
+ }
775
+
776
+ TEST_METHOD(27) {
777
+ // The 'exit immediately' command causes the logging server to
778
+ // immediately exit. Open transactions are not automatically
779
+ // closed and written out, even those with crash protection
780
+ // turned on.
781
+ SystemTime::forceAll(YESTERDAY);
782
+
783
+ AnalyticsLogPtr log = logger->newTransaction("foobar");
784
+ log->message("hello world");
785
+ log.reset();
786
+
787
+ MessageClient client = createConnection();
788
+ client.write("exit", "immediately", NULL);
789
+ client.disconnect();
790
+
791
+ // Assertion: the following doesn't block.
792
+ joinLoggingServer();
793
+ }
794
+
795
+ TEST_METHOD(28) {
796
+ // AnalyticsLogger treats a server that's semi-gracefully exiting as
797
+ // one that's refusing connections.
798
+ SystemTime::forceAll(YESTERDAY);
799
+
800
+ MessageClient client = createConnection();
801
+ client.write("exit", "semi-gracefully", NULL);
802
+ client.disconnect();
803
+
804
+ logger->setMaxConnectTries(1);
805
+ AnalyticsLogPtr log = logger->newTransaction("foobar");
806
+ ensure(log->isNull());
807
+ }
808
+
809
+ TEST_METHOD(30) {
810
+ // The "watchChanges" command causes the server to detach the
811
+ // client and to pass it to the change notifier.
812
+ MyChangeNotifierPtr notifier(new MyChangeNotifier(eventLoop));
813
+ stopLoggingServer();
814
+ startLoggingServer(boost::bind(&LoggingTest::setChangeNotifier, this, notifier));
815
+
816
+ vector<string> args;
817
+ MessageClient client = createConnection(false);
818
+ client.write("watchChanges", NULL, NULL);
819
+ ensure(client.read(args));
820
+ EVENTUALLY(1,
821
+ result = notifier->added == 1;
822
+ );
823
+ // MyChangeNotifier doesn't store the client file descriptor
824
+ // so should be closed.
825
+ ensure(!client.read(args));
826
+ }
827
+
828
+ TEST_METHOD(31) {
829
+ // The server notifies the given ChangeNotifier with the
830
+ // appropriate changes whenever a log file sink is flushed.
831
+ MyChangeNotifierPtr notifier(new MyChangeNotifier(eventLoop));
832
+ stopLoggingServer();
833
+ startLoggingServer(boost::bind(&LoggingTest::setChangeNotifier, this, notifier));
834
+
835
+ AnalyticsLogPtr log = logger->newTransaction("foo", "requests");
836
+ log->message("hello world");
837
+ log.reset();
838
+
839
+ log = logger->newTransaction("bar", "requests");
840
+ log->message("hello world");
841
+ log.reset();
842
+
843
+ SHOULD_NEVER_HAPPEN(100,
844
+ lock_guard<boost::mutex> l(notifier->lock);
845
+ result = !notifier->changes.empty();
846
+ );
847
+
848
+ MessageChannel channel(logger->getConnection());
849
+ vector<string> args;
850
+ channel.write("flush", NULL);
851
+ ensure("(1)", channel.read(args));
852
+
853
+ EVENTUALLY(1,
854
+ lock_guard<boost::mutex> l(notifier->lock);
855
+ result = notifier->changes.size() == 2;
856
+ );
857
+ unique_lock<boost::mutex> l(notifier->lock);
858
+ ensure("(2)",
859
+ notifier->changes.find(DataStoreId("foo", "localhost", "requests")) !=
860
+ notifier->changes.end());
861
+ ensure("(3)",
862
+ notifier->changes.find(DataStoreId("bar", "localhost", "requests")) !=
863
+ notifier->changes.end());
864
+ notifier->changes.clear();
865
+ l.unlock();
866
+
867
+
868
+ log = logger->newTransaction("baz", "exceptions");
869
+ log->message("hello world");
870
+ log.reset();
871
+
872
+ channel.write("flush", NULL);
873
+ ensure("(4)", channel.read(args));
874
+
875
+ log = logger->newTransaction("bazz", "exceptions");
876
+ log->message("hello world");
877
+ log.reset();
878
+
879
+ EVENTUALLY(1,
880
+ lock_guard<boost::mutex> l(notifier->lock);
881
+ result = notifier->changes.size() == 1;
882
+ );
883
+ l.lock();
884
+ ensure("(5)",
885
+ notifier->changes.find(DataStoreId("baz", "localhost", "exceptions")) !=
886
+ notifier->changes.end());
887
+ l.unlock();
888
+ SHOULD_NEVER_HAPPEN(100,
889
+ lock_guard<boost::mutex> l(notifier->lock);
890
+ result = notifier->changes.size() != 1;
891
+ );
892
+ }
893
+
894
+ TEST_METHOD(32) {
895
+ // One can supply a custom node name per openTransaction command.
896
+ MessageClient client1 = createConnection();
897
+ vector<string> args;
898
+ string filename = loggingDir + "/1/" FOOBAR_REMOTEHOST_PREFIX "/requests/2010/01/13/12/log.txt";
899
+
900
+ SystemTime::forceAll(TODAY);
901
+
902
+ client1.write("openTransaction",
903
+ TODAY_TXN_ID, "foobar", "remote", "requests", TODAY_TIMESTAMP_STR,
904
+ "", "true", NULL);
905
+ client1.write("closeTransaction", TODAY_TXN_ID, TODAY_TIMESTAMP_STR, NULL);
906
+ client1.write("flush", NULL);
907
+ client1.read(args);
908
+ client1.disconnect();
909
+
910
+ ensure(fileExists(filename));
911
+ }
912
+
913
+ /************************************/
914
+ }