passenger 5.0.4 → 5.0.5

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 (550) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.editorconfig +10 -0
  5. data/CHANGELOG +21 -0
  6. data/build/agents.rb +2 -2
  7. data/build/apache2.rb +6 -5
  8. data/build/common_library.rb +22 -7
  9. data/build/cxx_tests.rb +0 -3
  10. data/build/misc.rb +1 -1
  11. data/dev/parse_file_descriptor_log +119 -0
  12. data/doc/CloudLicensingConfiguration.html +387 -0
  13. data/doc/Design and Architecture.html +2430 -0
  14. data/doc/Packaging.html +488 -0
  15. data/doc/Security of user switching support.html +1833 -0
  16. data/doc/ServerOptimizationGuide.html +659 -0
  17. data/doc/ServerOptimizationGuide.txt.md +8 -0
  18. data/doc/Users guide Apache.html +9116 -0
  19. data/doc/Users guide Apache.idmap.txt +6 -2
  20. data/doc/Users guide Apache.txt +26 -7
  21. data/doc/Users guide Nginx.html +9025 -0
  22. data/doc/Users guide Nginx.idmap.txt +7 -3
  23. data/doc/Users guide Nginx.txt +29 -6
  24. data/doc/Users guide Standalone.html +3983 -0
  25. data/doc/Users guide.html +1748 -0
  26. data/doc/users_guide_snippets/installation.txt +4 -4
  27. data/ext/apache2/Configuration.cpp +16 -5
  28. data/ext/apache2/Configuration.hpp +4 -2
  29. data/ext/apache2/Hooks.cpp +44 -19
  30. data/ext/boost/libs/thread/src/pthread/once.cpp +2 -0
  31. data/ext/boost/libs/thread/src/pthread/once_atomic.cpp +6 -0
  32. data/ext/common/AgentsStarter.h +3 -2
  33. data/ext/common/ApplicationPool2/DirectSpawner.h +14 -4
  34. data/ext/common/ApplicationPool2/DummySpawner.h +12 -7
  35. data/ext/common/ApplicationPool2/Implementation.cpp +1 -1
  36. data/ext/common/ApplicationPool2/Process.h +2 -1
  37. data/ext/common/ApplicationPool2/Session.h +6 -6
  38. data/ext/common/ApplicationPool2/SmartSpawner.h +19 -4
  39. data/ext/common/ApplicationPool2/Socket.h +59 -27
  40. data/ext/common/ApplicationPool2/Spawner.h +2 -2
  41. data/ext/common/BackgroundEventLoop.cpp +6 -1
  42. data/ext/common/Constants.h +1 -1
  43. data/ext/common/EventedClient.h +1 -1
  44. data/ext/common/EventedServer.h +2 -2
  45. data/ext/common/FileDescriptor.h +25 -6
  46. data/ext/common/Logging.cpp +107 -52
  47. data/ext/common/Logging.h +146 -19
  48. data/ext/common/MessageClient.h +2 -2
  49. data/ext/common/MessageServer.h +3 -2
  50. data/ext/common/RandomGenerator.h +8 -7
  51. data/ext/common/SafeLibev.h +5 -1
  52. data/ext/common/ServerKit/AcceptLoadBalancer.h +9 -4
  53. data/ext/common/ServerKit/FdSinkChannel.h +5 -2
  54. data/ext/common/ServerKit/FdSourceChannel.h +5 -2
  55. data/ext/common/ServerKit/FileBufferedChannel.h +2 -0
  56. data/ext/common/ServerKit/FileBufferedFdSinkChannel.h +7 -2
  57. data/ext/common/ServerKit/HttpServer.h +6 -0
  58. data/ext/common/ServerKit/Server.h +40 -3
  59. data/ext/common/StaticString.h +20 -0
  60. data/ext/common/UnionStation/Connection.h +3 -1
  61. data/ext/common/UnionStation/Core.h +6 -4
  62. data/ext/common/Utils.cpp +4 -3
  63. data/ext/common/Utils/DateParsing.h +19 -5
  64. data/ext/common/Utils/FastStringStream.h +183 -0
  65. data/ext/common/Utils/IOUtils.cpp +47 -28
  66. data/ext/common/Utils/IOUtils.h +56 -12
  67. data/ext/common/Utils/MessagePassing.h +3 -3
  68. data/ext/common/Utils/ProcessMetricsCollector.h +2 -2
  69. data/ext/common/Utils/ScopeGuard.h +16 -5
  70. data/ext/common/Utils/SpeedMeter.h +2 -2
  71. data/ext/common/Utils/StrIntUtils.cpp +6 -6
  72. data/ext/common/Utils/StrIntUtils.h +2 -1
  73. data/ext/common/agents/Base.cpp +56 -4
  74. data/ext/common/agents/Base.h +2 -1
  75. data/ext/common/agents/HelperAgent/AdminServer.h +122 -11
  76. data/ext/common/agents/HelperAgent/Main.cpp +16 -5
  77. data/ext/common/agents/HelperAgent/OptionParser.h +7 -1
  78. data/ext/common/agents/HelperAgent/RequestHandler.h +1 -1
  79. data/ext/common/agents/HelperAgent/RequestHandler/Hooks.cpp +10 -1
  80. data/ext/common/agents/HelperAgent/RequestHandler/Request.h +8 -0
  81. data/ext/common/agents/HelperAgent/RequestHandler/TurboCaching.h +4 -3
  82. data/ext/common/agents/LoggingAgent/AdminServer.h +57 -11
  83. data/ext/common/agents/LoggingAgent/LoggingServer.h +3 -3
  84. data/ext/common/agents/LoggingAgent/Main.cpp +11 -3
  85. data/ext/common/agents/Watchdog/AdminServer.h +53 -11
  86. data/ext/common/agents/Watchdog/AgentWatcher.cpp +3 -3
  87. data/ext/common/agents/Watchdog/Main.cpp +13 -6
  88. data/ext/libeio/ecb.h +1 -1
  89. data/ext/libev/ev.c +13 -1
  90. data/ext/libev/ev.h +3 -0
  91. data/ext/nginx/Configuration.c +28 -6
  92. data/ext/nginx/Configuration.h +2 -1
  93. data/ext/nginx/ngx_http_passenger_module.c +5 -4
  94. data/ext/oxt/dynamic_thread_group.hpp +38 -5
  95. data/lib/phusion_passenger.rb +1 -1
  96. data/lib/phusion_passenger/common_library.rb +9 -5
  97. data/lib/phusion_passenger/config/reopen_logs_command.rb +2 -2
  98. data/lib/phusion_passenger/packaging.rb +23 -37
  99. data/passenger.gemspec +21 -21
  100. metadata +4 -453
  101. metadata.gz.asc +7 -7
  102. data/.gitignore +0 -68
  103. data/.travis.yml +0 -16
  104. data/Gemfile +0 -17
  105. data/Gemfile.lock +0 -39
  106. data/Vagrantfile +0 -54
  107. data/debian.template/README.Debian +0 -15
  108. data/debian.template/changelog +0 -316
  109. data/debian.template/compat +0 -1
  110. data/debian.template/control.erb +0 -91
  111. data/debian.template/copyright +0 -385
  112. data/debian.template/libapache2-mod-passenger.install +0 -3
  113. data/debian.template/libapache2-mod-passenger.postinst +0 -36
  114. data/debian.template/libapache2-mod-passenger.prerm +0 -15
  115. data/debian.template/locations.ini.erb +0 -14
  116. data/debian.template/passenger-dev.install.erb +0 -3
  117. data/debian.template/passenger-doc.install.erb +0 -2
  118. data/debian.template/passenger.conf +0 -6
  119. data/debian.template/passenger.docs +0 -4
  120. data/debian.template/passenger.install.erb +0 -14
  121. data/debian.template/passenger.load +0 -3
  122. data/debian.template/passenger.manpages +0 -3
  123. data/debian.template/patches/series +0 -0
  124. data/debian.template/rules.erb +0 -76
  125. data/debian.template/source/format +0 -1
  126. data/ext/common/EventedBufferedInput.h +0 -458
  127. data/packaging/rpm/LICENSE.txt +0 -19
  128. data/packaging/rpm/Makefile +0 -13
  129. data/packaging/rpm/README.md +0 -41
  130. data/packaging/rpm/Vagrantfile +0 -38
  131. data/packaging/rpm/Vagrantfile.centos +0 -30
  132. data/packaging/rpm/build +0 -170
  133. data/packaging/rpm/create_project +0 -41
  134. data/packaging/rpm/git_update +0 -88
  135. data/packaging/rpm/image/Dockerfile +0 -37
  136. data/packaging/rpm/image/Gemfile +0 -3
  137. data/packaging/rpm/image/Gemfile.lock +0 -12
  138. data/packaging/rpm/image/RPM-GPG-KEY-amazon-ga +0 -19
  139. data/packaging/rpm/image/amazon2014-i386.cfg +0 -96
  140. data/packaging/rpm/image/amazon2014-x86_64.cfg +0 -96
  141. data/packaging/rpm/image/site-defaults.cfg +0 -168
  142. data/packaging/rpm/internal/build_tasks.rb +0 -238
  143. data/packaging/rpm/internal/dummygpg +0 -11
  144. data/packaging/rpm/internal/exec_build +0 -42
  145. data/packaging/rpm/internal/get_distro_arch +0 -14
  146. data/packaging/rpm/internal/get_distro_id +0 -10
  147. data/packaging/rpm/internal/git_update +0 -27
  148. data/packaging/rpm/internal/inituidgid +0 -17
  149. data/packaging/rpm/internal/my_init +0 -344
  150. data/packaging/rpm/internal/python27 +0 -3
  151. data/packaging/rpm/internal/repo_update +0 -46
  152. data/packaging/rpm/internal/setuser +0 -26
  153. data/packaging/rpm/internal/tracking_helper +0 -40
  154. data/packaging/rpm/jenkins_release +0 -99
  155. data/packaging/rpm/lib/build_tasks_support.rb +0 -402
  156. data/packaging/rpm/lib/preprocessor.rb +0 -341
  157. data/packaging/rpm/nginx_spec/404.html +0 -119
  158. data/packaging/rpm/nginx_spec/50x.html +0 -119
  159. data/packaging/rpm/nginx_spec/index.html +0 -116
  160. data/packaging/rpm/nginx_spec/nginx-auto-cc-gcc.patch +0 -13
  161. data/packaging/rpm/nginx_spec/nginx-logo.png +0 -0
  162. data/packaging/rpm/nginx_spec/nginx-upgrade +0 -13
  163. data/packaging/rpm/nginx_spec/nginx-upgrade.8 +0 -151
  164. data/packaging/rpm/nginx_spec/nginx.conf +0 -131
  165. data/packaging/rpm/nginx_spec/nginx.init +0 -144
  166. data/packaging/rpm/nginx_spec/nginx.logrotate +0 -13
  167. data/packaging/rpm/nginx_spec/nginx.service +0 -15
  168. data/packaging/rpm/nginx_spec/nginx.spec.template +0 -560
  169. data/packaging/rpm/nginx_spec/nginx.sysconfig +0 -4
  170. data/packaging/rpm/nginx_spec/passenger.conf +0 -9
  171. data/packaging/rpm/nginx_spec/poweredby.png +0 -0
  172. data/packaging/rpm/passenger_spec/apache-passenger.conf.in +0 -26
  173. data/packaging/rpm/passenger_spec/config.json +0 -30
  174. data/packaging/rpm/passenger_spec/passenger.logrotate +0 -7
  175. data/packaging/rpm/passenger_spec/passenger.spec.template +0 -478
  176. data/packaging/rpm/passenger_spec/passenger_dynamic_thread_group.patch +0 -16
  177. data/packaging/rpm/passenger_spec/passenger_tests_default_config_example.patch +0 -44
  178. data/packaging/rpm/passenger_spec/rubygem-passenger-4.0.18-GLIBC_HAVE_LONG_LONG.patch +0 -21
  179. data/packaging/rpm/repo_update +0 -114
  180. data/packaging/rpm/setup-system +0 -61
  181. data/packaging/rpm/shell +0 -10
  182. data/test/.rspec +0 -4
  183. data/test/config.json.example +0 -42
  184. data/test/config.json.rpm-automation +0 -15
  185. data/test/config.json.travis +0 -15
  186. data/test/config.json.vagrant +0 -30
  187. data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +0 -124
  188. data/test/cxx/ApplicationPool2/OptionsTest.cpp +0 -30
  189. data/test/cxx/ApplicationPool2/PoolTest.cpp +0 -2062
  190. data/test/cxx/ApplicationPool2/ProcessTest.cpp +0 -130
  191. data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +0 -243
  192. data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +0 -823
  193. data/test/cxx/BufferedIOTest.cpp +0 -364
  194. data/test/cxx/CachedFileStatTest.cpp +0 -402
  195. data/test/cxx/CxxTestMain.cpp +0 -181
  196. data/test/cxx/DataStructures/LStringTest.cpp +0 -275
  197. data/test/cxx/DataStructures/StringKeyTableTest.cpp +0 -199
  198. data/test/cxx/DateParsingTest.cpp +0 -75
  199. data/test/cxx/DechunkerTest.cpp +0 -250
  200. data/test/cxx/EventedBufferedInputTest.cpp +0 -758
  201. data/test/cxx/EventedClientTest.cpp +0 -523
  202. data/test/cxx/FileChangeCheckerTest.cpp +0 -331
  203. data/test/cxx/FileDescriptorTest.cpp +0 -69
  204. data/test/cxx/FilterSupportTest.cpp +0 -433
  205. data/test/cxx/IOUtilsTest.cpp +0 -861
  206. data/test/cxx/MemoryKit/MbufTest.cpp +0 -213
  207. data/test/cxx/MessageIOTest.cpp +0 -360
  208. data/test/cxx/MessagePassingTest.cpp +0 -81
  209. data/test/cxx/MessageReadersWritersTest.cpp +0 -576
  210. data/test/cxx/MessageServerTest.cpp +0 -393
  211. data/test/cxx/ProcessMetricsCollectorTest.cpp +0 -123
  212. data/test/cxx/RequestHandlerTest.cpp +0 -1463
  213. data/test/cxx/ResponseCacheTest.cpp +0 -322
  214. data/test/cxx/ServerKit/ChannelTest.cpp +0 -1467
  215. data/test/cxx/ServerKit/CookieUtilsTest.cpp +0 -274
  216. data/test/cxx/ServerKit/FileBufferedChannelTest.cpp +0 -992
  217. data/test/cxx/ServerKit/HeaderTableTest.cpp +0 -177
  218. data/test/cxx/ServerKit/HttpServerTest.cpp +0 -1580
  219. data/test/cxx/ServerKit/ServerTest.cpp +0 -408
  220. data/test/cxx/StaticStringTest.cpp +0 -220
  221. data/test/cxx/StringMapTest.cpp +0 -131
  222. data/test/cxx/SystemTimeTest.cpp +0 -37
  223. data/test/cxx/TemplateTest.cpp +0 -118
  224. data/test/cxx/TestSupport.cpp +0 -207
  225. data/test/cxx/TestSupport.h +0 -333
  226. data/test/cxx/UnionStationTest.cpp +0 -741
  227. data/test/cxx/Utils/StrIntUtilsTest.cpp +0 -39
  228. data/test/cxx/UtilsTest.cpp +0 -672
  229. data/test/cxx/VariantMapTest.cpp +0 -191
  230. data/test/gdbinit.example +0 -34
  231. data/test/integration_tests/apache2_tests.rb +0 -585
  232. data/test/integration_tests/downloaded_binaries_tests.rb +0 -185
  233. data/test/integration_tests/native_packaging_spec.rb +0 -368
  234. data/test/integration_tests/nginx_tests.rb +0 -402
  235. data/test/integration_tests/shared/example_webapp_tests.rb +0 -289
  236. data/test/integration_tests/source_packaging_test.rb +0 -201
  237. data/test/integration_tests/spec_helper.rb +0 -22
  238. data/test/integration_tests/standalone_tests.rb +0 -392
  239. data/test/node/line_reader_spec.js +0 -338
  240. data/test/node/spec_helper.js +0 -65
  241. data/test/oxt/backtrace_test.cpp +0 -88
  242. data/test/oxt/counter.hpp +0 -55
  243. data/test/oxt/dynamic_thread_group_test.cpp +0 -131
  244. data/test/oxt/oxt_test_main.cpp +0 -27
  245. data/test/oxt/spin_lock_test.cpp +0 -59
  246. data/test/oxt/syscall_interruption_test.cpp +0 -39
  247. data/test/ruby/debug_logging_spec.rb +0 -145
  248. data/test/ruby/message_channel_spec.rb +0 -196
  249. data/test/ruby/rack/loader_spec.rb +0 -42
  250. data/test/ruby/rack/preloader_spec.rb +0 -48
  251. data/test/ruby/rails3.0/loader_spec.rb +0 -26
  252. data/test/ruby/rails3.0/preloader_spec.rb +0 -32
  253. data/test/ruby/rails3.1/loader_spec.rb +0 -26
  254. data/test/ruby/rails3.1/preloader_spec.rb +0 -32
  255. data/test/ruby/rails3.2/loader_spec.rb +0 -26
  256. data/test/ruby/rails3.2/preloader_spec.rb +0 -32
  257. data/test/ruby/rails4.0/loader_spec.rb +0 -28
  258. data/test/ruby/rails4.0/preloader_spec.rb +0 -34
  259. data/test/ruby/rails4.1/loader_spec.rb +0 -28
  260. data/test/ruby/rails4.1/preloader_spec.rb +0 -34
  261. data/test/ruby/request_handler_spec.rb +0 -747
  262. data/test/ruby/shared/loader_sharedspec.rb +0 -247
  263. data/test/ruby/shared/rails/union_station_extensions_sharedspec.rb +0 -357
  264. data/test/ruby/shared/ruby_loader_sharedspec.rb +0 -55
  265. data/test/ruby/spec_helper.rb +0 -114
  266. data/test/ruby/standalone/runtime_installer_spec.rb +0 -402
  267. data/test/ruby/union_station_spec.rb +0 -288
  268. data/test/ruby/utils/file_system_watcher_spec.rb +0 -229
  269. data/test/ruby/utils/hosts_file_parser.rb +0 -258
  270. data/test/ruby/utils/tee_input_spec.rb +0 -235
  271. data/test/ruby/utils/unseekable_socket_spec.rb +0 -66
  272. data/test/ruby/utils_spec.rb +0 -41
  273. data/test/stub/apache2/httpd.conf.erb +0 -122
  274. data/test/stub/apache2/mime.types +0 -748
  275. data/test/stub/garbage1.dat +0 -0
  276. data/test/stub/garbage2.dat +0 -0
  277. data/test/stub/garbage3.dat +0 -0
  278. data/test/stub/http_request.yml +0 -23
  279. data/test/stub/index.html +0 -1
  280. data/test/stub/nginx/koi-utf +0 -109
  281. data/test/stub/nginx/koi-win +0 -103
  282. data/test/stub/nginx/mime.types +0 -70
  283. data/test/stub/nginx/nginx.conf.erb +0 -70
  284. data/test/stub/nginx/win-utf +0 -126
  285. data/test/stub/node/app.js +0 -133
  286. data/test/stub/node/public/.gitignore +0 -0
  287. data/test/stub/node/tmp/.gitignore +0 -0
  288. data/test/stub/rack/config.ru +0 -95
  289. data/test/stub/rack/library.rb +0 -16
  290. data/test/stub/rack/public/.gitignore +0 -0
  291. data/test/stub/rack/start.rb +0 -52
  292. data/test/stub/rack/tmp/.gitignore +0 -0
  293. data/test/stub/rails3.0/.gitignore +0 -4
  294. data/test/stub/rails3.0/Gemfile +0 -22
  295. data/test/stub/rails3.0/Gemfile.lock +0 -80
  296. data/test/stub/rails3.0/Rakefile +0 -10
  297. data/test/stub/rails3.0/app/controllers/application_controller.rb +0 -4
  298. data/test/stub/rails3.0/app/helpers/application_helper.rb +0 -2
  299. data/test/stub/rails3.0/app/views/layouts/application.html.erb +0 -14
  300. data/test/stub/rails3.0/config.ru +0 -4
  301. data/test/stub/rails3.0/config/application.rb +0 -48
  302. data/test/stub/rails3.0/config/boot.rb +0 -13
  303. data/test/stub/rails3.0/config/database.yml +0 -22
  304. data/test/stub/rails3.0/config/environment.rb +0 -5
  305. data/test/stub/rails3.0/config/environments/development.rb +0 -19
  306. data/test/stub/rails3.0/config/environments/production.rb +0 -48
  307. data/test/stub/rails3.0/config/environments/test.rb +0 -32
  308. data/test/stub/rails3.0/config/initializers/backtrace_silencers.rb +0 -7
  309. data/test/stub/rails3.0/config/initializers/inflections.rb +0 -10
  310. data/test/stub/rails3.0/config/initializers/mime_types.rb +0 -5
  311. data/test/stub/rails3.0/config/initializers/passenger.rb +0 -2
  312. data/test/stub/rails3.0/config/initializers/secret_token.rb +0 -7
  313. data/test/stub/rails3.0/config/initializers/session_store.rb +0 -8
  314. data/test/stub/rails3.0/config/locales/en.yml +0 -5
  315. data/test/stub/rails3.0/config/routes.rb +0 -58
  316. data/test/stub/rails3.0/db/seeds.rb +0 -7
  317. data/test/stub/rails3.0/doc/README_FOR_APP +0 -2
  318. data/test/stub/rails3.0/lib/tasks/.gitkeep +0 -0
  319. data/test/stub/rails3.0/log/.gitignore +0 -0
  320. data/test/stub/rails3.0/public/404.html +0 -26
  321. data/test/stub/rails3.0/public/422.html +0 -26
  322. data/test/stub/rails3.0/public/500.html +0 -26
  323. data/test/stub/rails3.0/public/favicon.ico +0 -0
  324. data/test/stub/rails3.0/public/index.html +0 -279
  325. data/test/stub/rails3.0/public/robots.txt +0 -5
  326. data/test/stub/rails3.0/public/stylesheets/.gitkeep +0 -0
  327. data/test/stub/rails3.0/script/rails +0 -9
  328. data/test/stub/rails3.0/test/performance/browsing_test.rb +0 -9
  329. data/test/stub/rails3.0/test/test_helper.rb +0 -13
  330. data/test/stub/rails3.0/vendor/plugins/.gitkeep +0 -0
  331. data/test/stub/rails3.1/.gitignore +0 -15
  332. data/test/stub/rails3.1/Gemfile +0 -37
  333. data/test/stub/rails3.1/Gemfile.lock +0 -115
  334. data/test/stub/rails3.1/README +0 -261
  335. data/test/stub/rails3.1/Rakefile +0 -7
  336. data/test/stub/rails3.1/app/assets/images/rails.png +0 -0
  337. data/test/stub/rails3.1/app/assets/stylesheets/application.css +0 -7
  338. data/test/stub/rails3.1/app/controllers/application_controller.rb +0 -3
  339. data/test/stub/rails3.1/app/helpers/application_helper.rb +0 -2
  340. data/test/stub/rails3.1/app/mailers/.gitkeep +0 -0
  341. data/test/stub/rails3.1/app/models/.gitkeep +0 -0
  342. data/test/stub/rails3.1/app/views/layouts/application.html.erb +0 -14
  343. data/test/stub/rails3.1/config.ru +0 -4
  344. data/test/stub/rails3.1/config/application.rb +0 -48
  345. data/test/stub/rails3.1/config/boot.rb +0 -6
  346. data/test/stub/rails3.1/config/database.yml +0 -25
  347. data/test/stub/rails3.1/config/environment.rb +0 -5
  348. data/test/stub/rails3.1/config/environments/development.rb +0 -30
  349. data/test/stub/rails3.1/config/environments/production.rb +0 -60
  350. data/test/stub/rails3.1/config/environments/test.rb +0 -39
  351. data/test/stub/rails3.1/config/initializers/backtrace_silencers.rb +0 -7
  352. data/test/stub/rails3.1/config/initializers/inflections.rb +0 -10
  353. data/test/stub/rails3.1/config/initializers/mime_types.rb +0 -5
  354. data/test/stub/rails3.1/config/initializers/passenger.rb +0 -2
  355. data/test/stub/rails3.1/config/initializers/secret_token.rb +0 -7
  356. data/test/stub/rails3.1/config/initializers/session_store.rb +0 -8
  357. data/test/stub/rails3.1/config/initializers/wrap_parameters.rb +0 -14
  358. data/test/stub/rails3.1/config/locales/en.yml +0 -5
  359. data/test/stub/rails3.1/config/routes.rb +0 -58
  360. data/test/stub/rails3.1/db/seeds.rb +0 -7
  361. data/test/stub/rails3.1/doc/README_FOR_APP +0 -2
  362. data/test/stub/rails3.1/lib/assets/.gitkeep +0 -0
  363. data/test/stub/rails3.1/lib/tasks/.gitkeep +0 -0
  364. data/test/stub/rails3.1/log/.gitkeep +0 -0
  365. data/test/stub/rails3.1/public/404.html +0 -26
  366. data/test/stub/rails3.1/public/422.html +0 -26
  367. data/test/stub/rails3.1/public/500.html +0 -26
  368. data/test/stub/rails3.1/public/favicon.ico +0 -0
  369. data/test/stub/rails3.1/public/index.html +0 -241
  370. data/test/stub/rails3.1/public/robots.txt +0 -5
  371. data/test/stub/rails3.1/script/rails +0 -6
  372. data/test/stub/rails3.1/test/fixtures/.gitkeep +0 -0
  373. data/test/stub/rails3.1/test/functional/.gitkeep +0 -0
  374. data/test/stub/rails3.1/test/integration/.gitkeep +0 -0
  375. data/test/stub/rails3.1/test/performance/browsing_test.rb +0 -12
  376. data/test/stub/rails3.1/test/test_helper.rb +0 -13
  377. data/test/stub/rails3.1/test/unit/.gitkeep +0 -0
  378. data/test/stub/rails3.1/vendor/assets/stylesheets/.gitkeep +0 -0
  379. data/test/stub/rails3.1/vendor/plugins/.gitkeep +0 -0
  380. data/test/stub/rails3.2/.gitignore +0 -15
  381. data/test/stub/rails3.2/Gemfile +0 -39
  382. data/test/stub/rails3.2/Gemfile.lock +0 -113
  383. data/test/stub/rails3.2/Rakefile +0 -7
  384. data/test/stub/rails3.2/app/assets/images/rails.png +0 -0
  385. data/test/stub/rails3.2/app/assets/stylesheets/application.css +0 -13
  386. data/test/stub/rails3.2/app/controllers/application_controller.rb +0 -3
  387. data/test/stub/rails3.2/app/helpers/application_helper.rb +0 -2
  388. data/test/stub/rails3.2/app/mailers/.gitkeep +0 -0
  389. data/test/stub/rails3.2/app/models/.gitkeep +0 -0
  390. data/test/stub/rails3.2/app/views/layouts/application.html.erb +0 -14
  391. data/test/stub/rails3.2/config.ru +0 -4
  392. data/test/stub/rails3.2/config/application.rb +0 -62
  393. data/test/stub/rails3.2/config/boot.rb +0 -6
  394. data/test/stub/rails3.2/config/database.yml +0 -25
  395. data/test/stub/rails3.2/config/environment.rb +0 -5
  396. data/test/stub/rails3.2/config/environments/development.rb +0 -37
  397. data/test/stub/rails3.2/config/environments/production.rb +0 -67
  398. data/test/stub/rails3.2/config/environments/test.rb +0 -37
  399. data/test/stub/rails3.2/config/initializers/backtrace_silencers.rb +0 -7
  400. data/test/stub/rails3.2/config/initializers/inflections.rb +0 -15
  401. data/test/stub/rails3.2/config/initializers/mime_types.rb +0 -5
  402. data/test/stub/rails3.2/config/initializers/passenger.rb +0 -2
  403. data/test/stub/rails3.2/config/initializers/secret_token.rb +0 -7
  404. data/test/stub/rails3.2/config/initializers/session_store.rb +0 -8
  405. data/test/stub/rails3.2/config/initializers/wrap_parameters.rb +0 -14
  406. data/test/stub/rails3.2/config/locales/en.yml +0 -5
  407. data/test/stub/rails3.2/config/routes.rb +0 -58
  408. data/test/stub/rails3.2/db/seeds.rb +0 -7
  409. data/test/stub/rails3.2/doc/README_FOR_APP +0 -2
  410. data/test/stub/rails3.2/lib/assets/.gitkeep +0 -0
  411. data/test/stub/rails3.2/lib/tasks/.gitkeep +0 -0
  412. data/test/stub/rails3.2/log/.gitkeep +0 -0
  413. data/test/stub/rails3.2/public/404.html +0 -26
  414. data/test/stub/rails3.2/public/422.html +0 -26
  415. data/test/stub/rails3.2/public/500.html +0 -25
  416. data/test/stub/rails3.2/public/favicon.ico +0 -0
  417. data/test/stub/rails3.2/public/index.html +0 -241
  418. data/test/stub/rails3.2/public/robots.txt +0 -5
  419. data/test/stub/rails3.2/script/rails +0 -6
  420. data/test/stub/rails3.2/test/fixtures/.gitkeep +0 -0
  421. data/test/stub/rails3.2/test/functional/.gitkeep +0 -0
  422. data/test/stub/rails3.2/test/integration/.gitkeep +0 -0
  423. data/test/stub/rails3.2/test/performance/browsing_test.rb +0 -12
  424. data/test/stub/rails3.2/test/test_helper.rb +0 -13
  425. data/test/stub/rails3.2/test/unit/.gitkeep +0 -0
  426. data/test/stub/rails3.2/vendor/assets/stylesheets/.gitkeep +0 -0
  427. data/test/stub/rails3.2/vendor/plugins/.gitkeep +0 -0
  428. data/test/stub/rails4.0/.gitignore +0 -16
  429. data/test/stub/rails4.0/Gemfile +0 -45
  430. data/test/stub/rails4.0/Gemfile.lock +0 -126
  431. data/test/stub/rails4.0/README.rdoc +0 -28
  432. data/test/stub/rails4.0/Rakefile +0 -6
  433. data/test/stub/rails4.0/app/assets/images/.keep +0 -0
  434. data/test/stub/rails4.0/app/assets/javascripts/application.js +0 -16
  435. data/test/stub/rails4.0/app/assets/stylesheets/application.css +0 -13
  436. data/test/stub/rails4.0/app/controllers/application_controller.rb +0 -5
  437. data/test/stub/rails4.0/app/controllers/concerns/.keep +0 -0
  438. data/test/stub/rails4.0/app/helpers/application_helper.rb +0 -2
  439. data/test/stub/rails4.0/app/mailers/.keep +0 -0
  440. data/test/stub/rails4.0/app/models/.keep +0 -0
  441. data/test/stub/rails4.0/app/models/concerns/.keep +0 -0
  442. data/test/stub/rails4.0/app/views/layouts/application.html.erb +0 -14
  443. data/test/stub/rails4.0/bin/bundle +0 -3
  444. data/test/stub/rails4.0/bin/rails +0 -4
  445. data/test/stub/rails4.0/bin/rake +0 -4
  446. data/test/stub/rails4.0/config.ru +0 -4
  447. data/test/stub/rails4.0/config/application.rb +0 -23
  448. data/test/stub/rails4.0/config/boot.rb +0 -4
  449. data/test/stub/rails4.0/config/database.yml +0 -25
  450. data/test/stub/rails4.0/config/environment.rb +0 -5
  451. data/test/stub/rails4.0/config/environments/development.rb +0 -29
  452. data/test/stub/rails4.0/config/environments/production.rb +0 -80
  453. data/test/stub/rails4.0/config/environments/test.rb +0 -36
  454. data/test/stub/rails4.0/config/initializers/backtrace_silencers.rb +0 -7
  455. data/test/stub/rails4.0/config/initializers/filter_parameter_logging.rb +0 -4
  456. data/test/stub/rails4.0/config/initializers/inflections.rb +0 -16
  457. data/test/stub/rails4.0/config/initializers/mime_types.rb +0 -5
  458. data/test/stub/rails4.0/config/initializers/passenger.rb +0 -2
  459. data/test/stub/rails4.0/config/initializers/secret_token.rb +0 -12
  460. data/test/stub/rails4.0/config/initializers/session_store.rb +0 -3
  461. data/test/stub/rails4.0/config/initializers/wrap_parameters.rb +0 -14
  462. data/test/stub/rails4.0/config/locales/en.yml +0 -23
  463. data/test/stub/rails4.0/config/routes.rb +0 -57
  464. data/test/stub/rails4.0/db/seeds.rb +0 -7
  465. data/test/stub/rails4.0/lib/assets/.keep +0 -0
  466. data/test/stub/rails4.0/lib/tasks/.keep +0 -0
  467. data/test/stub/rails4.0/log/.keep +0 -0
  468. data/test/stub/rails4.0/public/404.html +0 -58
  469. data/test/stub/rails4.0/public/422.html +0 -58
  470. data/test/stub/rails4.0/public/500.html +0 -57
  471. data/test/stub/rails4.0/public/favicon.ico +0 -0
  472. data/test/stub/rails4.0/public/robots.txt +0 -5
  473. data/test/stub/rails4.0/test/controllers/.keep +0 -0
  474. data/test/stub/rails4.0/test/fixtures/.keep +0 -0
  475. data/test/stub/rails4.0/test/helpers/.keep +0 -0
  476. data/test/stub/rails4.0/test/integration/.keep +0 -0
  477. data/test/stub/rails4.0/test/mailers/.keep +0 -0
  478. data/test/stub/rails4.0/test/models/.keep +0 -0
  479. data/test/stub/rails4.0/test/test_helper.rb +0 -15
  480. data/test/stub/rails4.0/vendor/assets/javascripts/.keep +0 -0
  481. data/test/stub/rails4.0/vendor/assets/stylesheets/.keep +0 -0
  482. data/test/stub/rails4.1/.gitignore +0 -16
  483. data/test/stub/rails4.1/Gemfile +0 -45
  484. data/test/stub/rails4.1/Gemfile.lock +0 -129
  485. data/test/stub/rails4.1/README.rdoc +0 -28
  486. data/test/stub/rails4.1/Rakefile +0 -6
  487. data/test/stub/rails4.1/app/assets/images/.keep +0 -0
  488. data/test/stub/rails4.1/app/assets/javascripts/application.js +0 -16
  489. data/test/stub/rails4.1/app/assets/stylesheets/application.css +0 -13
  490. data/test/stub/rails4.1/app/controllers/application_controller.rb +0 -5
  491. data/test/stub/rails4.1/app/controllers/concerns/.keep +0 -0
  492. data/test/stub/rails4.1/app/helpers/application_helper.rb +0 -2
  493. data/test/stub/rails4.1/app/mailers/.keep +0 -0
  494. data/test/stub/rails4.1/app/models/.keep +0 -0
  495. data/test/stub/rails4.1/app/models/concerns/.keep +0 -0
  496. data/test/stub/rails4.1/app/views/layouts/application.html.erb +0 -14
  497. data/test/stub/rails4.1/bin/bundle +0 -3
  498. data/test/stub/rails4.1/bin/rails +0 -4
  499. data/test/stub/rails4.1/bin/rake +0 -4
  500. data/test/stub/rails4.1/config.ru +0 -4
  501. data/test/stub/rails4.1/config/application.rb +0 -23
  502. data/test/stub/rails4.1/config/boot.rb +0 -4
  503. data/test/stub/rails4.1/config/database.yml +0 -25
  504. data/test/stub/rails4.1/config/environment.rb +0 -5
  505. data/test/stub/rails4.1/config/environments/development.rb +0 -29
  506. data/test/stub/rails4.1/config/environments/production.rb +0 -80
  507. data/test/stub/rails4.1/config/environments/test.rb +0 -36
  508. data/test/stub/rails4.1/config/initializers/backtrace_silencers.rb +0 -7
  509. data/test/stub/rails4.1/config/initializers/filter_parameter_logging.rb +0 -4
  510. data/test/stub/rails4.1/config/initializers/inflections.rb +0 -16
  511. data/test/stub/rails4.1/config/initializers/mime_types.rb +0 -5
  512. data/test/stub/rails4.1/config/initializers/passenger.rb +0 -5
  513. data/test/stub/rails4.1/config/initializers/secret_token.rb +0 -12
  514. data/test/stub/rails4.1/config/initializers/session_store.rb +0 -3
  515. data/test/stub/rails4.1/config/initializers/wrap_parameters.rb +0 -14
  516. data/test/stub/rails4.1/config/locales/en.yml +0 -23
  517. data/test/stub/rails4.1/config/routes.rb +0 -57
  518. data/test/stub/rails4.1/db/seeds.rb +0 -7
  519. data/test/stub/rails4.1/lib/assets/.keep +0 -0
  520. data/test/stub/rails4.1/lib/tasks/.keep +0 -0
  521. data/test/stub/rails4.1/log/.keep +0 -0
  522. data/test/stub/rails4.1/public/404.html +0 -58
  523. data/test/stub/rails4.1/public/422.html +0 -58
  524. data/test/stub/rails4.1/public/500.html +0 -57
  525. data/test/stub/rails4.1/public/favicon.ico +0 -0
  526. data/test/stub/rails4.1/public/robots.txt +0 -5
  527. data/test/stub/rails4.1/test/controllers/.keep +0 -0
  528. data/test/stub/rails4.1/test/fixtures/.keep +0 -0
  529. data/test/stub/rails4.1/test/helpers/.keep +0 -0
  530. data/test/stub/rails4.1/test/integration/.keep +0 -0
  531. data/test/stub/rails4.1/test/mailers/.keep +0 -0
  532. data/test/stub/rails4.1/test/models/.keep +0 -0
  533. data/test/stub/rails4.1/test/test_helper.rb +0 -15
  534. data/test/stub/rails4.1/vendor/assets/javascripts/.keep +0 -0
  535. data/test/stub/rails4.1/vendor/assets/stylesheets/.keep +0 -0
  536. data/test/stub/start_error.pl +0 -24
  537. data/test/stub/upload_data.txt +0 -494
  538. data/test/stub/wsgi/passenger_wsgi.py +0 -212
  539. data/test/stub/wsgi/public/.gitignore +0 -0
  540. data/test/stub/wsgi/tmp/.gitignore +0 -0
  541. data/test/support/allocate_memory.c +0 -14
  542. data/test/support/apache2_controller.rb +0 -258
  543. data/test/support/multipart.rb +0 -62
  544. data/test/support/nginx_controller.rb +0 -97
  545. data/test/support/placebo-preloader.rb +0 -88
  546. data/test/support/test_helper.rb +0 -455
  547. data/test/support/valgrind.h +0 -2539
  548. data/test/tut/tut.h +0 -1310
  549. data/test/tut/tut_reporter.h +0 -256
  550. data/test/valgrind-osx.supp +0 -7
@@ -1,861 +0,0 @@
1
- #include "TestSupport.h"
2
- #include <Utils/IOUtils.h>
3
- #include <Utils/SystemTime.h>
4
- #include <oxt/system_calls.hpp>
5
- #include <boost/bind.hpp>
6
- #include <sys/types.h>
7
- #include <cerrno>
8
- #include <string>
9
-
10
- using namespace Passenger;
11
- using namespace std;
12
- using namespace boost;
13
- using namespace oxt;
14
-
15
- namespace tut {
16
- static ssize_t writevResult;
17
- static int writevErrno;
18
- static int writevCalled;
19
- static string writevData;
20
-
21
- static ssize_t writev_mock(int fildes, const struct iovec *iov, int iovcnt) {
22
- if (writevResult >= 0) {
23
- string data;
24
- for (int i = 0; i < iovcnt && data.size() < (size_t) writevResult; i++) {
25
- data.append(
26
- (const char *) iov[i].iov_base,
27
- iov[i].iov_len);
28
- }
29
- data.resize(writevResult);
30
- writevData.append(data);
31
- }
32
- writevCalled++;
33
- errno = writevErrno;
34
- return writevResult;
35
- }
36
-
37
- struct IOUtilsTest {
38
- string restBuffer;
39
-
40
- IOUtilsTest() {
41
- writevResult = 0;
42
- writevErrno = 0;
43
- writevCalled = 0;
44
- writevData.clear();
45
- setWritevFunction(writev_mock);
46
- }
47
-
48
- ~IOUtilsTest() {
49
- setWritevFunction(NULL);
50
- }
51
-
52
- Pipe createNonBlockingPipe() {
53
- Pipe p = createPipe();
54
- setNonBlocking(p.second);
55
- return p;
56
- }
57
-
58
- static void writeDataAfterSomeTime(int fd, unsigned int sleepTimeInUsec) {
59
- try {
60
- syscalls::usleep(sleepTimeInUsec);
61
- syscalls::write(fd, "hi", 2);
62
- } catch (const boost::thread_interrupted &) {
63
- // Do nothing.
64
- }
65
- }
66
-
67
- static void writeDataSlowly(int fd, unsigned int bytesToWrite, unsigned int bytesPerSec) {
68
- try {
69
- for (unsigned i = 0; i < bytesToWrite && !this_thread::interruption_requested(); i++) {
70
- syscalls::write(fd, "x", 1);
71
- syscalls::usleep(1000000 / bytesPerSec);
72
- }
73
- } catch (const boost::thread_interrupted &) {
74
- // Do nothing.
75
- }
76
- }
77
-
78
- static void readDataAfterSomeTime(int fd, unsigned int sleepTimeInUsec) {
79
- try {
80
- char buf[1024 * 8];
81
- syscalls::usleep(sleepTimeInUsec);
82
- syscalls::read(fd, buf, sizeof(buf));
83
- } catch (const boost::thread_interrupted &) {
84
- // Do nothing.
85
- }
86
- }
87
-
88
- static void readDataSlowly(int fd, int bytesToRead, int bytesPerSec) {
89
- try {
90
- unsigned long long start = SystemTime::getUsec();
91
- unsigned long long deadline = start +
92
- (bytesToRead * 1000000.0 / bytesPerSec);
93
- int alreadyRead = 0;
94
-
95
- while (alreadyRead < bytesToRead && !this_thread::interruption_requested()) {
96
- unsigned long long elapsed = SystemTime::getUsec();
97
- double progress = (elapsed - start) / (double) (deadline - start);
98
- int shouldHaveRead = progress * bytesToRead;
99
- int shouldNowRead = shouldHaveRead - alreadyRead;
100
-
101
- if (shouldNowRead > 0) {
102
- char *buf = new char[shouldNowRead];
103
- ssize_t ret = syscalls::read(fd, buf, shouldNowRead);
104
- int e = errno;
105
- delete buf;
106
- if (ret == -1) {
107
- throw SystemException("read error", e);
108
- } else if (ret == 0) {
109
- break;
110
- }
111
- alreadyRead += ret;
112
- }
113
- syscalls::usleep(1000);
114
- }
115
- } catch (const boost::thread_interrupted &) {
116
- // Do nothing.
117
- }
118
- }
119
- };
120
-
121
- DEFINE_TEST_GROUP_WITH_LIMIT(IOUtilsTest, 100);
122
-
123
- /***** Test gatheredWrite() with empty input rest buffer *****/
124
-
125
- TEST_METHOD(1) {
126
- // Test complete write of a single data buffer.
127
- StaticString data = "hello world";
128
- writevResult = data.size();
129
- ensure_equals(gatheredWrite(0, &data, 1, restBuffer), writevResult);
130
- ensure_equals(writevData, "hello world");
131
- ensure(restBuffer.empty());
132
- }
133
-
134
- TEST_METHOD(2) {
135
- // Test complete write of multiple data buffers.
136
- StaticString data[] = { "hello ", "world", "!!!!!!" };
137
- writevResult = strlen("hello world!!!!!!");
138
- ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
139
- ensure_equals(writevData, "hello world!!!!!!");
140
- ensure(restBuffer.empty());
141
- }
142
-
143
- TEST_METHOD(3) {
144
- // Test partial write of a single data buffer.
145
- StaticString data = "hello world";
146
- writevResult = 3;
147
- ensure_equals(gatheredWrite(0, &data, 1, restBuffer), writevResult);
148
- ensure_equals(writevData, "hel");
149
- ensure_equals(restBuffer, "lo world");
150
- }
151
-
152
- TEST_METHOD(4) {
153
- // Test partial write of multiple data buffers:
154
- // first buffer is partially written.
155
- StaticString data[] = { "hello ", "world", "!!!!!!" };
156
- writevResult = 2;
157
- ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
158
- ensure_equals(writevData, "he");
159
- ensure_equals(restBuffer, "llo world!!!!!!");
160
- }
161
-
162
- TEST_METHOD(5) {
163
- // Test partial write of multiple data buffers:
164
- // first buffer is completely written.
165
- StaticString data[] = { "hello ", "world", "!!!!!!" };
166
- writevResult = 6;
167
- ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
168
- ensure_equals(writevData, "hello ");
169
- ensure_equals(restBuffer, "world!!!!!!");
170
- }
171
-
172
- TEST_METHOD(6) {
173
- // Test partial write of multiple data buffers:
174
- // non-first buffer is partially written.
175
- StaticString data[] = { "hello ", "world", "!!!!!!" };
176
- writevResult = 8;
177
- ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
178
- ensure_equals(writevData, "hello wo");
179
- ensure_equals(restBuffer, "rld!!!!!!");
180
- }
181
-
182
- TEST_METHOD(7) {
183
- // Test partial write of multiple data buffers:
184
- // non-first buffer is completely written.
185
- StaticString data[] = { "hello ", "world", "!!!!!!" };
186
- writevResult = 11;
187
- ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
188
- ensure_equals(writevData, "hello world");
189
- ensure_equals(restBuffer, "!!!!!!");
190
- }
191
-
192
- TEST_METHOD(8) {
193
- // Test failed write of a single data buffer: blocking error.
194
- StaticString data = "hello world";
195
- writevResult = -1;
196
- writevErrno = EAGAIN;
197
- ensure_equals(gatheredWrite(0, &data, 1, restBuffer), 0);
198
- ensure_equals(restBuffer, "hello world");
199
- }
200
-
201
- TEST_METHOD(9) {
202
- // Test failed write of a single data buffer: other error.
203
- StaticString data = "hello world";
204
- writevResult = -1;
205
- writevErrno = EBADF;
206
- ssize_t ret = gatheredWrite(0, &data, 1, restBuffer);
207
- int e = errno;
208
- ensure_equals(ret, -1);
209
- ensure_equals(e, EBADF);
210
- ensure_equals("Rest buffer remains untouched", restBuffer, "");
211
- }
212
-
213
- TEST_METHOD(10) {
214
- // Test failed write of multiple data buffers: blocking error.
215
- StaticString data[] = { "hello ", "world", "!!!" };
216
- writevResult = -1;
217
- writevErrno = EAGAIN;
218
- ensure_equals(gatheredWrite(0, data, 3, restBuffer), 0);
219
- ensure_equals(restBuffer, "hello world!!!");
220
- }
221
-
222
- TEST_METHOD(11) {
223
- // Test failed write of multiple data buffers: other error.
224
- StaticString data[] = { "hello ", "world", "!!!" };
225
- writevResult = -1;
226
- writevErrno = EBADF;
227
- ssize_t ret = gatheredWrite(0, data, 3, restBuffer);
228
- int e = errno;
229
- ensure_equals(ret, -1);
230
- ensure_equals(e, EBADF);
231
- ensure_equals("Rest buffer remains untouched", restBuffer, "");
232
- }
233
-
234
- TEST_METHOD(12) {
235
- // Test writing nothing.
236
- StaticString data[] = { "", "", "" };
237
- ssize_t ret = gatheredWrite(0, data, 3, restBuffer);
238
- int e = errno;
239
- ensure_equals(ret, 0);
240
- ensure_equals(e, 0);
241
- ensure_equals(writevCalled, 0);
242
- ensure_equals(restBuffer, "");
243
- }
244
-
245
- TEST_METHOD(13) {
246
- // Test writing multiple buffers where some are empty.
247
- StaticString data[] = { "hello ", "", "world" };
248
- writevResult = strlen("hello world");
249
- ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
250
- ensure_equals(writevData, "hello world");
251
- ensure_equals(restBuffer, "");
252
- }
253
-
254
- /***** Test gatheredWrite() with non-empty input rest buffer *****/
255
-
256
- TEST_METHOD(15) {
257
- // Test complete write with a single data buffer.
258
- restBuffer = "oh ";
259
- StaticString data = "hello world";
260
- writevResult = restBuffer.size() + data.size();
261
- ensure_equals(gatheredWrite(0, &data, 1, restBuffer), writevResult);
262
- ensure_equals(writevData, "oh hello world");
263
- ensure(restBuffer.empty());
264
- }
265
-
266
- TEST_METHOD(16) {
267
- // Test complete write with multiple data buffers.
268
- restBuffer = "oh ";
269
- StaticString data[] = { "hello ", "world", "!!!" };
270
- writevResult = strlen("oh hello world!!!");
271
- ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
272
- ensure_equals(writevData, "oh hello world!!!");
273
- ensure(restBuffer.empty());
274
- }
275
-
276
- TEST_METHOD(17) {
277
- // Test partial write of a single data buffer.
278
- StaticString data = "hello world";
279
- writevResult = 3;
280
- ensure_equals(gatheredWrite(0, &data, 1, restBuffer), writevResult);
281
- ensure_equals(writevData, "hel");
282
- ensure_equals(restBuffer, "lo world");
283
- }
284
-
285
- TEST_METHOD(18) {
286
- // Test partial write of multiple data buffers:
287
- // rest buffer is partially written.
288
- restBuffer = "oh ";
289
- StaticString data[] = { "hello ", "world", "!!!" };
290
- writevResult = 2;
291
- ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
292
- ensure_equals(writevData, "oh");
293
- ensure_equals(restBuffer, " hello world!!!");
294
- }
295
-
296
- TEST_METHOD(19) {
297
- // Test partial write of multiple data buffers:
298
- // rest buffer is completely written.
299
- restBuffer = "oh ";
300
- StaticString data[] = { "hello ", "world", "!!!" };
301
- writevResult = strlen("oh ");
302
- ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
303
- ensure_equals(writevData, "oh ");
304
- ensure_equals(restBuffer, "hello world!!!");
305
- }
306
-
307
- TEST_METHOD(20) {
308
- // Test partial write of multiple data buffers:
309
- // first buffer is partially written.
310
- restBuffer = "oh ";
311
- StaticString data[] = { "hello ", "world", "!!!" };
312
- writevResult = strlen("oh h");
313
- ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
314
- ensure_equals(writevData, "oh h");
315
- ensure_equals(restBuffer, "ello world!!!");
316
- }
317
-
318
- TEST_METHOD(21) {
319
- // Test partial write of multiple data buffers:
320
- // first buffer is completely written.
321
- restBuffer = "oh ";
322
- StaticString data[] = { "hello ", "world", "!!!" };
323
- writevResult = strlen("oh hello ");
324
- ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
325
- ensure_equals(writevData, "oh hello ");
326
- ensure_equals(restBuffer, "world!!!");
327
- }
328
-
329
- TEST_METHOD(22) {
330
- // Test partial write of multiple data buffers:
331
- // non-first buffer is partially written.
332
- restBuffer = "oh ";
333
- StaticString data[] = { "hello ", "world", "!!!" };
334
- writevResult = strlen("oh hello wo");
335
- ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
336
- ensure_equals(writevData, "oh hello wo");
337
- ensure_equals(restBuffer, "rld!!!");
338
- }
339
-
340
- TEST_METHOD(23) {
341
- // Test partial write of multiple data buffers:
342
- // non-first buffer is completely written.
343
- restBuffer = "oh ";
344
- StaticString data[] = { "hello ", "world", "!!!" };
345
- writevResult = strlen("oh hello world");
346
- ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
347
- ensure_equals(writevData, "oh hello world");
348
- ensure_equals(restBuffer, "!!!");
349
- }
350
-
351
- TEST_METHOD(24) {
352
- // Test failed write of a single data buffer: blocking error.
353
- restBuffer = "oh ";
354
- StaticString data = "hello world";
355
- writevResult = -1;
356
- writevErrno = EAGAIN;
357
- ensure_equals(gatheredWrite(0, &data, 1, restBuffer), 0);
358
- ensure_equals(restBuffer, "oh hello world");
359
- }
360
-
361
- TEST_METHOD(25) {
362
- // Test failed write of a single data buffer: other error.
363
- restBuffer = "oh ";
364
- StaticString data = "hello world";
365
- writevResult = -1;
366
- writevErrno = EBADF;
367
- ssize_t ret = gatheredWrite(0, &data, 1, restBuffer);
368
- int e = errno;
369
- ensure_equals(ret, -1);
370
- ensure_equals(e, EBADF);
371
- ensure_equals("Rest buffer remains untouched", restBuffer, "oh ");
372
- }
373
-
374
- TEST_METHOD(26) {
375
- // Test failed write of multiple data buffers: blocking error.
376
- restBuffer = "oh ";
377
- StaticString data[] = { "hello ", "world", "!!!" };
378
- writevResult = -1;
379
- writevErrno = EAGAIN;
380
- ensure_equals(gatheredWrite(0, data, 3, restBuffer), 0);
381
- ensure_equals(restBuffer, "oh hello world!!!");
382
- }
383
-
384
- TEST_METHOD(27) {
385
- // Test failed write of multiple data buffers: other error.
386
- restBuffer = "oh ";
387
- StaticString data[] = { "hello ", "world", "!!!" };
388
- writevResult = -1;
389
- writevErrno = EBADF;
390
- ssize_t ret = gatheredWrite(0, data, 3, restBuffer);
391
- int e = errno;
392
- ensure_equals(ret, -1);
393
- ensure_equals(e, EBADF);
394
- ensure_equals("Rest buffer remains untouched", restBuffer, "oh ");
395
- }
396
-
397
- TEST_METHOD(28) {
398
- // Test writing multiple buffers that are all empty.
399
- restBuffer = "oh ";
400
- StaticString data[] = { "", "", "" };
401
- writevResult = 3;
402
- ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
403
- ensure_equals(writevData, "oh ");
404
- ensure_equals(restBuffer, "");
405
- }
406
-
407
- TEST_METHOD(29) {
408
- // Test writing multiple buffers where one is empty.
409
- restBuffer = "oh ";
410
- StaticString data[] = { "hello ", "", "world" };
411
- writevResult = strlen("oh hello world");
412
- ensure_equals(gatheredWrite(0, data, 3, restBuffer), writevResult);
413
- ensure_equals(writevData, "oh hello world");
414
- ensure_equals(restBuffer, "");
415
- }
416
-
417
-
418
- /***** Test gatheredWrite() blocking version *****/
419
-
420
- TEST_METHOD(35) {
421
- // It doesn't call writev() if requested to send 0 bytes.
422
- StaticString data[2] = { "", "" };
423
- gatheredWrite(0, data, 2);
424
- ensure_equals(writevCalled, 0);
425
- }
426
-
427
- TEST_METHOD(36) {
428
- // Test sending all data in a single writev() call.
429
- StaticString data[] = { "hello", "my", "world" };
430
- writevResult = strlen("hellomyworld");
431
- gatheredWrite(0, data, 3);
432
- ensure_equals(writevData, "hellomyworld");
433
- ensure_equals(writevCalled, 1);
434
- }
435
-
436
- TEST_METHOD(42) {
437
- // Test writing byte-by-byte.
438
- StaticString data[] = { "hello", "my", "world", "!!" };
439
- writevResult = 1;
440
- gatheredWrite(0, data, 4);
441
- ensure_equals(writevCalled, (int) strlen("hellomyworld!!"));
442
- ensure_equals(writevData, "hellomyworld!!");
443
- }
444
-
445
- TEST_METHOD(43) {
446
- // Test writev() writing in chunks of 2 bytes.
447
- StaticString data[] = { "hello", "my", "world", "!!" };
448
- writevResult = 2;
449
- gatheredWrite(0, data, 4);
450
- ensure_equals(writevCalled, (int) strlen("hellomyworld!!") / 2);
451
- ensure_equals(writevData, "hellomyworld!!");
452
- }
453
-
454
- static ssize_t writev_mock_44(int fildes, const struct iovec *iov, int iovcnt) {
455
- if (writevCalled == 3) {
456
- // Have the last call return 2 instead of 4.
457
- writevResult = 2;
458
- }
459
- return writev_mock(fildes, iov, iovcnt);
460
- }
461
-
462
- TEST_METHOD(44) {
463
- // Test writev() writing in chunks of 4 bytes.
464
- setWritevFunction(writev_mock_44);
465
- StaticString data[] = { "hello", "my", "world", "!!" };
466
- writevResult = 4;
467
- gatheredWrite(0, data, 4);
468
- ensure_equals(writevCalled, 4);
469
- ensure_equals(writevData, "hellomyworld!!");
470
- }
471
-
472
- TEST_METHOD(45) {
473
- // Test writev() timeout support.
474
- setWritevFunction(NULL);
475
- Pipe p = createPipe();
476
- unsigned long long startTime = SystemTime::getUsec();
477
- unsigned long long timeout = 30000;
478
- char data1[1024], data2[1024];
479
- StaticString data[] = {
480
- StaticString(data1, sizeof(data1) - 1),
481
- StaticString(data2, sizeof(data2) - 1)
482
- };
483
- memset(data1, 'x', sizeof(data1));
484
- memset(data2, 'y', sizeof(data2));
485
-
486
- try {
487
- for (int i = 0; i < 1024; i++) {
488
- gatheredWrite(p[1], data, 2, &timeout);
489
- }
490
- fail("TimeoutException expected");
491
- } catch (const TimeoutException &) {
492
- unsigned long long elapsed = SystemTime::getUsec() - startTime;
493
- ensure("At least 29 msec have passed", elapsed >= 29000);
494
- ensure("At most 95 msec have passed", elapsed <= 95000);
495
- ensure(timeout <= 2000);
496
- }
497
- }
498
-
499
- /***** Test waitUntilReadable() *****/
500
-
501
- TEST_METHOD(50) {
502
- // waitUntilReadable() waits for the specified timeout if no data is readable.
503
- Pipe p = createPipe();
504
- unsigned long long timeout = 25000;
505
- ensure("No data is available", !waitUntilReadable(p.first, &timeout));
506
- ensure("The passed time is deducted from the timeout", timeout < 5000);
507
- }
508
-
509
- TEST_METHOD(51) {
510
- // waitUntilReadable() waits for less than the specified timeout if data
511
- // is not available immediately but still available before the timeout.
512
- Pipe p = createPipe();
513
- TempThread thr(boost::bind(&writeDataAfterSomeTime, p.second, 35000));
514
-
515
- unsigned long long timeout = 1000000;
516
- ensure("Data is available", waitUntilReadable(p.first, &timeout));
517
- ensure("At least 35 msec passed.", timeout <= 1000000 - 35000);
518
- ensure("At most 70 msec passed.", timeout >= 1000000 - 70000); // depends on system scheduler though
519
- }
520
-
521
- TEST_METHOD(52) {
522
- // waitUntilReadable() returns immediately if timeout is 0.
523
- Pipe p = createPipe();
524
- unsigned long long timeout = 0;
525
- ensure("No data is available", !waitUntilReadable(p.first, &timeout));
526
- ensure_equals("Timeout is not modified", timeout, 0u);
527
-
528
- write(p.second, "hi", 2);
529
- ensure("Data is available", waitUntilReadable(p.first, &timeout));
530
- ensure_equals("Timeout is not modified", timeout, 0u);
531
- }
532
-
533
- TEST_METHOD(53) {
534
- // waitUntilReadable() returns immediately if there's data immediately available.
535
- Pipe p = createPipe();
536
- unsigned long long timeout = 100000;
537
- write(p.second, "hi", 2);
538
- ensure("Data is available", waitUntilReadable(p.first, &timeout));
539
- ensure("Timeout is not modified", timeout >= 100000 - 5000);
540
- }
541
-
542
- /***** Test readExact() *****/
543
-
544
- TEST_METHOD(54) {
545
- // readExact() throws TimeoutException if no data is received within the timeout.
546
- Pipe p = createPipe();
547
- unsigned long long timeout = 50000;
548
- char buf;
549
- try {
550
- readExact(p.first, &buf, 1, &timeout);
551
- fail("No TimeoutException thrown.");
552
- } catch (const TimeoutException &) {
553
- ensure("The passed time is deducted from timeout", timeout < 5000);
554
- }
555
- }
556
-
557
- TEST_METHOD(55) {
558
- // readExact() throws TimeoutException if not enough data is received within the timeout.
559
- Pipe p = createPipe();
560
- unsigned long long timeout = 20000;
561
- char buf[100];
562
-
563
- TempThread thr(boost::bind(&writeDataSlowly, p.second, sizeof(buf), 1));
564
-
565
- try {
566
- readExact(p.first, &buf, sizeof(buf), &timeout);
567
- fail("No TimeoutException thrown.");
568
- } catch (const TimeoutException &) {
569
- ensure("The passed time is deducted from timeout", timeout < 5000);
570
- }
571
- }
572
-
573
- TEST_METHOD(56) {
574
- // readExact() throws TimeoutException if timeout is 0 and no data is immediately available.
575
- Pipe p = createPipe();
576
- unsigned long long timeout = 0;
577
- char buf;
578
- try {
579
- readExact(p.first, &buf, 1, &timeout);
580
- fail("No TimeoutException thrown.");
581
- } catch (const TimeoutException &) {
582
- ensure_equals("Timeout unchanged", timeout, 0u);
583
- }
584
- }
585
-
586
- TEST_METHOD(57) {
587
- // readExact() throws TimeoutException if timeout is 0 and not enough data is
588
- // immediately available.
589
- Pipe p = createPipe();
590
- unsigned long long timeout = 0;
591
- write(p.second, "hi", 2);
592
- try {
593
- char buf[100];
594
- readExact(p.first, &buf, sizeof(buf), &timeout);
595
- fail("No TimeoutException thrown.");
596
- } catch (const TimeoutException &) {
597
- ensure_equals("Timeout is unchanged", timeout, 0u);
598
- }
599
- }
600
-
601
- TEST_METHOD(58) {
602
- // readExact() deducts the amount of time spent on waiting from the timeout variable.
603
- Pipe p = createPipe();
604
- unsigned long long timeout = 100000;
605
- char buf[3];
606
-
607
- // Spawn a thread that writes 100 bytes per second, i.e. each byte takes 10 msec.
608
- TempThread thr(boost::bind(&writeDataSlowly, p.second, 1000, 100));
609
-
610
- // We read 3 bytes.
611
- ensure_equals(readExact(p.first, &buf, sizeof(buf), &timeout), 3u);
612
- ensure("Should have taken at least 20 msec", timeout <= 100000 - 20000);
613
- #ifdef __FreeBSD__
614
- // Stupid timer resolution on FreeBSD...
615
- ensure("Should have taken at most 95 msec", timeout >= 100000 - 95000);
616
- #else
617
- ensure("Should have taken at most 50 msec", timeout >= 100000 - 40000);
618
- #endif
619
- }
620
-
621
- TEST_METHOD(59) {
622
- // readExact() does not wait and does not modify the timeout variable if there's
623
- // immediately enough data available.
624
- Pipe p = createPipe();
625
- unsigned long long timeout = 100000;
626
- char buf[2];
627
-
628
- write(p.second, "hi", 2);
629
- ensure_equals(readExact(p.first, &buf, 2, &timeout), 2u);
630
- ensure("Timeout not modified", timeout >= 95000);
631
- }
632
-
633
- /***** Test waitUntilWritable() *****/
634
-
635
- TEST_METHOD(60) {
636
- // waitUntilWritable() waits for the specified timeout if no data is writable.
637
- Pipe p = createNonBlockingPipe();
638
- writeUntilFull(p.second);
639
- unsigned long long timeout = 25000;
640
- ensure("Socket did not become writable", !waitUntilWritable(p.second, &timeout));
641
- ensure("The passed time is deducted from the timeout", timeout < 5000);
642
- }
643
-
644
- TEST_METHOD(61) {
645
- // waitUntilWritable() waits for less than the specified timeout if the fd
646
- // is not immediately writable but still writable before the timeout.
647
- Pipe p = createNonBlockingPipe();
648
- writeUntilFull(p.second);
649
- TempThread thr(boost::bind(&readDataAfterSomeTime, p.first, 35000));
650
-
651
- unsigned long long timeout = 1000000;
652
- ensure("Socket became writable", waitUntilWritable(p.second, &timeout));
653
- ensure("At least 35 msec passed.", timeout <= 1000000 - 35000);
654
- ensure("At most 70 msec passed.", timeout >= 1000000 - 70000); // depends on system scheduler though
655
- }
656
-
657
- TEST_METHOD(62) {
658
- // waitUntilWritable() returns immediately if timeout is 0.
659
- Pipe p = createNonBlockingPipe();
660
- writeUntilFull(p.second);
661
- unsigned long long timeout = 0;
662
- ensure("Socket is not writable", !waitUntilWritable(p.second, &timeout));
663
- ensure_equals("Timeout is not modified", timeout, 0u);
664
-
665
- char buf[1024 * 8];
666
- read(p.first, buf, sizeof(buf));
667
- ensure("Socket became writable", waitUntilWritable(p.second, &timeout));
668
- ensure_equals("Timeout is not modified", timeout, 0u);
669
- }
670
-
671
- TEST_METHOD(63) {
672
- // waitUntilWritable() returns immediately if the fd is immediately writable.
673
- Pipe p = createNonBlockingPipe();
674
- writeUntilFull(p.second);
675
- unsigned long long timeout = 100000;
676
- char buf[1024 * 8];
677
- read(p.first, buf, sizeof(buf));
678
- ensure("Socket became writable", waitUntilWritable(p.second, &timeout));
679
- ensure("Timeout is not modified", timeout >= 100000 - 5000);
680
- }
681
-
682
- /***** Test readExact() *****/
683
-
684
- TEST_METHOD(64) {
685
- // writeExact() throws TimeoutException if fd does not become writable within the timeout.
686
- Pipe p = createNonBlockingPipe();
687
- writeUntilFull(p.second);
688
- unsigned long long timeout = 50000;
689
- try {
690
- writeExact(p.second, "x", 1, &timeout);
691
- fail("No TimeoutException thrown.");
692
- } catch (const TimeoutException &) {
693
- ensure("The passed time is deducted from timeout", timeout < 5000);
694
- }
695
- }
696
-
697
- TEST_METHOD(65) {
698
- // writeExact() throws TimeoutException if not enough data is written within the timeout.
699
- Pipe p = createNonBlockingPipe();
700
- writeUntilFull(p.second);
701
- unsigned long long timeout = 20000;
702
- char buf[1024 * 3];
703
-
704
- TempThread thr(boost::bind(&readDataSlowly, p.first, sizeof(buf), 512));
705
-
706
- try {
707
- writeExact(p.second, "x", 1, &timeout);
708
- fail("No TimeoutException thrown.");
709
- } catch (const TimeoutException &) {
710
- ensure("The passed time is deducted from timeout", timeout < 5000);
711
- }
712
- }
713
-
714
- TEST_METHOD(66) {
715
- // writeExact() throws TimeoutException if timeout is 0 and the fd is not immediately writable.
716
- Pipe p = createNonBlockingPipe();
717
- writeUntilFull(p.second);
718
- unsigned long long timeout = 0;
719
- try {
720
- writeExact(p.second, "x", 1, &timeout);
721
- fail("No TimeoutException thrown.");
722
- } catch (const TimeoutException &) {
723
- ensure_equals("Timeout unchanged", timeout, 0u);
724
- }
725
- }
726
-
727
- TEST_METHOD(67) {
728
- // writeExact() throws TimeoutException if timeout is 0 not enough data could be written immediately.
729
- Pipe p = createNonBlockingPipe();
730
- writeUntilFull(p.second);
731
- unsigned long long timeout = 0;
732
-
733
- char buf[1024];
734
- read(p.first, buf, sizeof(buf));
735
-
736
- char buf2[1024 * 8];
737
- memset(buf2, 0, sizeof(buf2));
738
-
739
- try {
740
- writeExact(p.second, buf2, sizeof(buf2), &timeout);
741
- fail("No TimeoutException thrown.");
742
- } catch (const TimeoutException &) {
743
- ensure_equals("Timeout is unchanged", timeout, 0u);
744
- }
745
- }
746
-
747
- TEST_METHOD(68) {
748
- // readExact() deducts the amount of time spent on waiting from the timeout variable.
749
- Pipe p = createNonBlockingPipe();
750
- unsigned long long timeout = 100000;
751
-
752
- // Spawn a thread that reads 200000 bytes in 35 msec.
753
- TempThread thr(boost::bind(&readDataSlowly, p.first, 5714286, 5714286));
754
-
755
- // We write 200000 bytes.
756
- char buf[200000];
757
- writeExact(p.second, &buf, sizeof(buf), &timeout);
758
- ensure("Should have taken at least 20 msec", timeout <= 100000 - 20000);
759
- ensure("Should have taken at most 95 msec", timeout >= 100000 - 95000);
760
- }
761
-
762
- TEST_METHOD(69) {
763
- // writeExact() does not wait and does not modify the timeout variable if
764
- // all data can be written immediately.
765
- Pipe p = createNonBlockingPipe();
766
- unsigned long long timeout = 100000;
767
- char buf[1024];
768
- writeExact(p.second, buf, sizeof(buf), &timeout);
769
- ensure("Timeout not modified", timeout >= 95000);
770
- }
771
-
772
- /***** Test getSocketAddressType() *****/
773
-
774
- TEST_METHOD(70) {
775
- ensure_equals(getSocketAddressType(""), SAT_UNKNOWN);
776
- ensure_equals(getSocketAddressType("/foo.socket"), SAT_UNKNOWN);
777
- ensure_equals(getSocketAddressType("unix:"), SAT_UNKNOWN);
778
- ensure_equals(getSocketAddressType("unix:/"), SAT_UNIX);
779
- ensure_equals(getSocketAddressType("unix:/foo.socket"), SAT_UNIX);
780
- ensure_equals(getSocketAddressType("tcp:"), SAT_UNKNOWN);
781
- ensure_equals(getSocketAddressType("tcp://"), SAT_UNKNOWN);
782
- // Doesn't check whether it contains port
783
- ensure_equals(getSocketAddressType("tcp://127.0.0.1"), SAT_TCP);
784
- ensure_equals(getSocketAddressType("tcp://127.0.0.1:80"), SAT_TCP);
785
- }
786
-
787
- TEST_METHOD(71) {
788
- ensure_equals(parseUnixSocketAddress("unix:/foo.socket"), "/foo.socket");
789
- try {
790
- parseUnixSocketAddress("unix:");
791
- fail("ArgumentException expected");
792
- } catch (const ArgumentException &e) {
793
- // Pass.
794
- }
795
- }
796
-
797
- TEST_METHOD(72) {
798
- string host;
799
- unsigned short port;
800
-
801
- parseTcpSocketAddress("tcp://127.0.0.1:80", host, port);
802
- ensure_equals(host, "127.0.0.1");
803
- ensure_equals(port, 80);
804
-
805
- try {
806
- parseTcpSocketAddress("tcp://", host, port);
807
- fail("ArgumentException expected");
808
- } catch (const ArgumentException &e) {
809
- // Pass.
810
- }
811
- }
812
-
813
- /***** Test readFileDescriptor() and writeFileDescriptor() *****/
814
-
815
- TEST_METHOD(80) {
816
- // Test whether it works.
817
- SocketPair sockets = createUnixSocketPair();
818
- Pipe pipes = createPipe();
819
- writeFileDescriptor(sockets[0], pipes[1]);
820
- FileDescriptor fd(readFileDescriptor(sockets[1]));
821
- writeExact(fd, "hello");
822
- char buf[6];
823
- ensure_equals(readExact(pipes[0], buf, 5), 5u);
824
- buf[5] = '\0';
825
- ensure_equals(StaticString(buf), "hello");
826
- }
827
-
828
- TEST_METHOD(81) {
829
- // Test whether timeout works.
830
- SocketPair sockets = createUnixSocketPair();
831
- Pipe pipes = createPipe();
832
-
833
- unsigned long long timeout = 30000;
834
- unsigned long long startTime = SystemTime::getUsec();
835
- try {
836
- FileDescriptor fd(readFileDescriptor(sockets[0], &timeout));
837
- fail("TimeoutException expected");
838
- } catch (const TimeoutException &) {
839
- unsigned long long elapsed = SystemTime::getUsec() - startTime;
840
- ensure("readFileDescriptor() timed out after at least 29 msec",
841
- elapsed >= 29000);
842
- ensure("readFileDescriptor() timed out after at most 95 msec",
843
- elapsed <= 95000);
844
- ensure(timeout <= 2000);
845
- }
846
-
847
- writeUntilFull(sockets[0]);
848
-
849
- startTime = SystemTime::getUsec();
850
- timeout = 30000;
851
- try {
852
- writeFileDescriptor(sockets[0], pipes[0], &timeout);
853
- fail("TimeoutException expected");
854
- } catch (const TimeoutException &) {
855
- unsigned long long elapsed = SystemTime::getUsec() - startTime;
856
- ensure("writeFileDescriptor() timed out after 30 msec",
857
- elapsed >= 29000 && elapsed <= 95000);
858
- ensure(timeout <= 2000);
859
- }
860
- }
861
- }