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.
- checksums.yaml +8 -8
- checksums.yaml.gz.asc +7 -7
- data.tar.gz.asc +7 -7
- data/.editorconfig +10 -0
- data/CHANGELOG +21 -0
- data/build/agents.rb +2 -2
- data/build/apache2.rb +6 -5
- data/build/common_library.rb +22 -7
- data/build/cxx_tests.rb +0 -3
- data/build/misc.rb +1 -1
- data/dev/parse_file_descriptor_log +119 -0
- data/doc/CloudLicensingConfiguration.html +387 -0
- data/doc/Design and Architecture.html +2430 -0
- data/doc/Packaging.html +488 -0
- data/doc/Security of user switching support.html +1833 -0
- data/doc/ServerOptimizationGuide.html +659 -0
- data/doc/ServerOptimizationGuide.txt.md +8 -0
- data/doc/Users guide Apache.html +9116 -0
- data/doc/Users guide Apache.idmap.txt +6 -2
- data/doc/Users guide Apache.txt +26 -7
- data/doc/Users guide Nginx.html +9025 -0
- data/doc/Users guide Nginx.idmap.txt +7 -3
- data/doc/Users guide Nginx.txt +29 -6
- data/doc/Users guide Standalone.html +3983 -0
- data/doc/Users guide.html +1748 -0
- data/doc/users_guide_snippets/installation.txt +4 -4
- data/ext/apache2/Configuration.cpp +16 -5
- data/ext/apache2/Configuration.hpp +4 -2
- data/ext/apache2/Hooks.cpp +44 -19
- data/ext/boost/libs/thread/src/pthread/once.cpp +2 -0
- data/ext/boost/libs/thread/src/pthread/once_atomic.cpp +6 -0
- data/ext/common/AgentsStarter.h +3 -2
- data/ext/common/ApplicationPool2/DirectSpawner.h +14 -4
- data/ext/common/ApplicationPool2/DummySpawner.h +12 -7
- data/ext/common/ApplicationPool2/Implementation.cpp +1 -1
- data/ext/common/ApplicationPool2/Process.h +2 -1
- data/ext/common/ApplicationPool2/Session.h +6 -6
- data/ext/common/ApplicationPool2/SmartSpawner.h +19 -4
- data/ext/common/ApplicationPool2/Socket.h +59 -27
- data/ext/common/ApplicationPool2/Spawner.h +2 -2
- data/ext/common/BackgroundEventLoop.cpp +6 -1
- data/ext/common/Constants.h +1 -1
- data/ext/common/EventedClient.h +1 -1
- data/ext/common/EventedServer.h +2 -2
- data/ext/common/FileDescriptor.h +25 -6
- data/ext/common/Logging.cpp +107 -52
- data/ext/common/Logging.h +146 -19
- data/ext/common/MessageClient.h +2 -2
- data/ext/common/MessageServer.h +3 -2
- data/ext/common/RandomGenerator.h +8 -7
- data/ext/common/SafeLibev.h +5 -1
- data/ext/common/ServerKit/AcceptLoadBalancer.h +9 -4
- data/ext/common/ServerKit/FdSinkChannel.h +5 -2
- data/ext/common/ServerKit/FdSourceChannel.h +5 -2
- data/ext/common/ServerKit/FileBufferedChannel.h +2 -0
- data/ext/common/ServerKit/FileBufferedFdSinkChannel.h +7 -2
- data/ext/common/ServerKit/HttpServer.h +6 -0
- data/ext/common/ServerKit/Server.h +40 -3
- data/ext/common/StaticString.h +20 -0
- data/ext/common/UnionStation/Connection.h +3 -1
- data/ext/common/UnionStation/Core.h +6 -4
- data/ext/common/Utils.cpp +4 -3
- data/ext/common/Utils/DateParsing.h +19 -5
- data/ext/common/Utils/FastStringStream.h +183 -0
- data/ext/common/Utils/IOUtils.cpp +47 -28
- data/ext/common/Utils/IOUtils.h +56 -12
- data/ext/common/Utils/MessagePassing.h +3 -3
- data/ext/common/Utils/ProcessMetricsCollector.h +2 -2
- data/ext/common/Utils/ScopeGuard.h +16 -5
- data/ext/common/Utils/SpeedMeter.h +2 -2
- data/ext/common/Utils/StrIntUtils.cpp +6 -6
- data/ext/common/Utils/StrIntUtils.h +2 -1
- data/ext/common/agents/Base.cpp +56 -4
- data/ext/common/agents/Base.h +2 -1
- data/ext/common/agents/HelperAgent/AdminServer.h +122 -11
- data/ext/common/agents/HelperAgent/Main.cpp +16 -5
- data/ext/common/agents/HelperAgent/OptionParser.h +7 -1
- data/ext/common/agents/HelperAgent/RequestHandler.h +1 -1
- data/ext/common/agents/HelperAgent/RequestHandler/Hooks.cpp +10 -1
- data/ext/common/agents/HelperAgent/RequestHandler/Request.h +8 -0
- data/ext/common/agents/HelperAgent/RequestHandler/TurboCaching.h +4 -3
- data/ext/common/agents/LoggingAgent/AdminServer.h +57 -11
- data/ext/common/agents/LoggingAgent/LoggingServer.h +3 -3
- data/ext/common/agents/LoggingAgent/Main.cpp +11 -3
- data/ext/common/agents/Watchdog/AdminServer.h +53 -11
- data/ext/common/agents/Watchdog/AgentWatcher.cpp +3 -3
- data/ext/common/agents/Watchdog/Main.cpp +13 -6
- data/ext/libeio/ecb.h +1 -1
- data/ext/libev/ev.c +13 -1
- data/ext/libev/ev.h +3 -0
- data/ext/nginx/Configuration.c +28 -6
- data/ext/nginx/Configuration.h +2 -1
- data/ext/nginx/ngx_http_passenger_module.c +5 -4
- data/ext/oxt/dynamic_thread_group.hpp +38 -5
- data/lib/phusion_passenger.rb +1 -1
- data/lib/phusion_passenger/common_library.rb +9 -5
- data/lib/phusion_passenger/config/reopen_logs_command.rb +2 -2
- data/lib/phusion_passenger/packaging.rb +23 -37
- data/passenger.gemspec +21 -21
- metadata +4 -453
- metadata.gz.asc +7 -7
- data/.gitignore +0 -68
- data/.travis.yml +0 -16
- data/Gemfile +0 -17
- data/Gemfile.lock +0 -39
- data/Vagrantfile +0 -54
- data/debian.template/README.Debian +0 -15
- data/debian.template/changelog +0 -316
- data/debian.template/compat +0 -1
- data/debian.template/control.erb +0 -91
- data/debian.template/copyright +0 -385
- data/debian.template/libapache2-mod-passenger.install +0 -3
- data/debian.template/libapache2-mod-passenger.postinst +0 -36
- data/debian.template/libapache2-mod-passenger.prerm +0 -15
- data/debian.template/locations.ini.erb +0 -14
- data/debian.template/passenger-dev.install.erb +0 -3
- data/debian.template/passenger-doc.install.erb +0 -2
- data/debian.template/passenger.conf +0 -6
- data/debian.template/passenger.docs +0 -4
- data/debian.template/passenger.install.erb +0 -14
- data/debian.template/passenger.load +0 -3
- data/debian.template/passenger.manpages +0 -3
- data/debian.template/patches/series +0 -0
- data/debian.template/rules.erb +0 -76
- data/debian.template/source/format +0 -1
- data/ext/common/EventedBufferedInput.h +0 -458
- data/packaging/rpm/LICENSE.txt +0 -19
- data/packaging/rpm/Makefile +0 -13
- data/packaging/rpm/README.md +0 -41
- data/packaging/rpm/Vagrantfile +0 -38
- data/packaging/rpm/Vagrantfile.centos +0 -30
- data/packaging/rpm/build +0 -170
- data/packaging/rpm/create_project +0 -41
- data/packaging/rpm/git_update +0 -88
- data/packaging/rpm/image/Dockerfile +0 -37
- data/packaging/rpm/image/Gemfile +0 -3
- data/packaging/rpm/image/Gemfile.lock +0 -12
- data/packaging/rpm/image/RPM-GPG-KEY-amazon-ga +0 -19
- data/packaging/rpm/image/amazon2014-i386.cfg +0 -96
- data/packaging/rpm/image/amazon2014-x86_64.cfg +0 -96
- data/packaging/rpm/image/site-defaults.cfg +0 -168
- data/packaging/rpm/internal/build_tasks.rb +0 -238
- data/packaging/rpm/internal/dummygpg +0 -11
- data/packaging/rpm/internal/exec_build +0 -42
- data/packaging/rpm/internal/get_distro_arch +0 -14
- data/packaging/rpm/internal/get_distro_id +0 -10
- data/packaging/rpm/internal/git_update +0 -27
- data/packaging/rpm/internal/inituidgid +0 -17
- data/packaging/rpm/internal/my_init +0 -344
- data/packaging/rpm/internal/python27 +0 -3
- data/packaging/rpm/internal/repo_update +0 -46
- data/packaging/rpm/internal/setuser +0 -26
- data/packaging/rpm/internal/tracking_helper +0 -40
- data/packaging/rpm/jenkins_release +0 -99
- data/packaging/rpm/lib/build_tasks_support.rb +0 -402
- data/packaging/rpm/lib/preprocessor.rb +0 -341
- data/packaging/rpm/nginx_spec/404.html +0 -119
- data/packaging/rpm/nginx_spec/50x.html +0 -119
- data/packaging/rpm/nginx_spec/index.html +0 -116
- data/packaging/rpm/nginx_spec/nginx-auto-cc-gcc.patch +0 -13
- data/packaging/rpm/nginx_spec/nginx-logo.png +0 -0
- data/packaging/rpm/nginx_spec/nginx-upgrade +0 -13
- data/packaging/rpm/nginx_spec/nginx-upgrade.8 +0 -151
- data/packaging/rpm/nginx_spec/nginx.conf +0 -131
- data/packaging/rpm/nginx_spec/nginx.init +0 -144
- data/packaging/rpm/nginx_spec/nginx.logrotate +0 -13
- data/packaging/rpm/nginx_spec/nginx.service +0 -15
- data/packaging/rpm/nginx_spec/nginx.spec.template +0 -560
- data/packaging/rpm/nginx_spec/nginx.sysconfig +0 -4
- data/packaging/rpm/nginx_spec/passenger.conf +0 -9
- data/packaging/rpm/nginx_spec/poweredby.png +0 -0
- data/packaging/rpm/passenger_spec/apache-passenger.conf.in +0 -26
- data/packaging/rpm/passenger_spec/config.json +0 -30
- data/packaging/rpm/passenger_spec/passenger.logrotate +0 -7
- data/packaging/rpm/passenger_spec/passenger.spec.template +0 -478
- data/packaging/rpm/passenger_spec/passenger_dynamic_thread_group.patch +0 -16
- data/packaging/rpm/passenger_spec/passenger_tests_default_config_example.patch +0 -44
- data/packaging/rpm/passenger_spec/rubygem-passenger-4.0.18-GLIBC_HAVE_LONG_LONG.patch +0 -21
- data/packaging/rpm/repo_update +0 -114
- data/packaging/rpm/setup-system +0 -61
- data/packaging/rpm/shell +0 -10
- data/test/.rspec +0 -4
- data/test/config.json.example +0 -42
- data/test/config.json.rpm-automation +0 -15
- data/test/config.json.travis +0 -15
- data/test/config.json.vagrant +0 -30
- data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +0 -124
- data/test/cxx/ApplicationPool2/OptionsTest.cpp +0 -30
- data/test/cxx/ApplicationPool2/PoolTest.cpp +0 -2062
- data/test/cxx/ApplicationPool2/ProcessTest.cpp +0 -130
- data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +0 -243
- data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +0 -823
- data/test/cxx/BufferedIOTest.cpp +0 -364
- data/test/cxx/CachedFileStatTest.cpp +0 -402
- data/test/cxx/CxxTestMain.cpp +0 -181
- data/test/cxx/DataStructures/LStringTest.cpp +0 -275
- data/test/cxx/DataStructures/StringKeyTableTest.cpp +0 -199
- data/test/cxx/DateParsingTest.cpp +0 -75
- data/test/cxx/DechunkerTest.cpp +0 -250
- data/test/cxx/EventedBufferedInputTest.cpp +0 -758
- data/test/cxx/EventedClientTest.cpp +0 -523
- data/test/cxx/FileChangeCheckerTest.cpp +0 -331
- data/test/cxx/FileDescriptorTest.cpp +0 -69
- data/test/cxx/FilterSupportTest.cpp +0 -433
- data/test/cxx/IOUtilsTest.cpp +0 -861
- data/test/cxx/MemoryKit/MbufTest.cpp +0 -213
- data/test/cxx/MessageIOTest.cpp +0 -360
- data/test/cxx/MessagePassingTest.cpp +0 -81
- data/test/cxx/MessageReadersWritersTest.cpp +0 -576
- data/test/cxx/MessageServerTest.cpp +0 -393
- data/test/cxx/ProcessMetricsCollectorTest.cpp +0 -123
- data/test/cxx/RequestHandlerTest.cpp +0 -1463
- data/test/cxx/ResponseCacheTest.cpp +0 -322
- data/test/cxx/ServerKit/ChannelTest.cpp +0 -1467
- data/test/cxx/ServerKit/CookieUtilsTest.cpp +0 -274
- data/test/cxx/ServerKit/FileBufferedChannelTest.cpp +0 -992
- data/test/cxx/ServerKit/HeaderTableTest.cpp +0 -177
- data/test/cxx/ServerKit/HttpServerTest.cpp +0 -1580
- data/test/cxx/ServerKit/ServerTest.cpp +0 -408
- data/test/cxx/StaticStringTest.cpp +0 -220
- data/test/cxx/StringMapTest.cpp +0 -131
- data/test/cxx/SystemTimeTest.cpp +0 -37
- data/test/cxx/TemplateTest.cpp +0 -118
- data/test/cxx/TestSupport.cpp +0 -207
- data/test/cxx/TestSupport.h +0 -333
- data/test/cxx/UnionStationTest.cpp +0 -741
- data/test/cxx/Utils/StrIntUtilsTest.cpp +0 -39
- data/test/cxx/UtilsTest.cpp +0 -672
- data/test/cxx/VariantMapTest.cpp +0 -191
- data/test/gdbinit.example +0 -34
- data/test/integration_tests/apache2_tests.rb +0 -585
- data/test/integration_tests/downloaded_binaries_tests.rb +0 -185
- data/test/integration_tests/native_packaging_spec.rb +0 -368
- data/test/integration_tests/nginx_tests.rb +0 -402
- data/test/integration_tests/shared/example_webapp_tests.rb +0 -289
- data/test/integration_tests/source_packaging_test.rb +0 -201
- data/test/integration_tests/spec_helper.rb +0 -22
- data/test/integration_tests/standalone_tests.rb +0 -392
- data/test/node/line_reader_spec.js +0 -338
- data/test/node/spec_helper.js +0 -65
- data/test/oxt/backtrace_test.cpp +0 -88
- data/test/oxt/counter.hpp +0 -55
- data/test/oxt/dynamic_thread_group_test.cpp +0 -131
- data/test/oxt/oxt_test_main.cpp +0 -27
- data/test/oxt/spin_lock_test.cpp +0 -59
- data/test/oxt/syscall_interruption_test.cpp +0 -39
- data/test/ruby/debug_logging_spec.rb +0 -145
- data/test/ruby/message_channel_spec.rb +0 -196
- data/test/ruby/rack/loader_spec.rb +0 -42
- data/test/ruby/rack/preloader_spec.rb +0 -48
- data/test/ruby/rails3.0/loader_spec.rb +0 -26
- data/test/ruby/rails3.0/preloader_spec.rb +0 -32
- data/test/ruby/rails3.1/loader_spec.rb +0 -26
- data/test/ruby/rails3.1/preloader_spec.rb +0 -32
- data/test/ruby/rails3.2/loader_spec.rb +0 -26
- data/test/ruby/rails3.2/preloader_spec.rb +0 -32
- data/test/ruby/rails4.0/loader_spec.rb +0 -28
- data/test/ruby/rails4.0/preloader_spec.rb +0 -34
- data/test/ruby/rails4.1/loader_spec.rb +0 -28
- data/test/ruby/rails4.1/preloader_spec.rb +0 -34
- data/test/ruby/request_handler_spec.rb +0 -747
- data/test/ruby/shared/loader_sharedspec.rb +0 -247
- data/test/ruby/shared/rails/union_station_extensions_sharedspec.rb +0 -357
- data/test/ruby/shared/ruby_loader_sharedspec.rb +0 -55
- data/test/ruby/spec_helper.rb +0 -114
- data/test/ruby/standalone/runtime_installer_spec.rb +0 -402
- data/test/ruby/union_station_spec.rb +0 -288
- data/test/ruby/utils/file_system_watcher_spec.rb +0 -229
- data/test/ruby/utils/hosts_file_parser.rb +0 -258
- data/test/ruby/utils/tee_input_spec.rb +0 -235
- data/test/ruby/utils/unseekable_socket_spec.rb +0 -66
- data/test/ruby/utils_spec.rb +0 -41
- data/test/stub/apache2/httpd.conf.erb +0 -122
- data/test/stub/apache2/mime.types +0 -748
- data/test/stub/garbage1.dat +0 -0
- data/test/stub/garbage2.dat +0 -0
- data/test/stub/garbage3.dat +0 -0
- data/test/stub/http_request.yml +0 -23
- data/test/stub/index.html +0 -1
- data/test/stub/nginx/koi-utf +0 -109
- data/test/stub/nginx/koi-win +0 -103
- data/test/stub/nginx/mime.types +0 -70
- data/test/stub/nginx/nginx.conf.erb +0 -70
- data/test/stub/nginx/win-utf +0 -126
- data/test/stub/node/app.js +0 -133
- data/test/stub/node/public/.gitignore +0 -0
- data/test/stub/node/tmp/.gitignore +0 -0
- data/test/stub/rack/config.ru +0 -95
- data/test/stub/rack/library.rb +0 -16
- data/test/stub/rack/public/.gitignore +0 -0
- data/test/stub/rack/start.rb +0 -52
- data/test/stub/rack/tmp/.gitignore +0 -0
- data/test/stub/rails3.0/.gitignore +0 -4
- data/test/stub/rails3.0/Gemfile +0 -22
- data/test/stub/rails3.0/Gemfile.lock +0 -80
- data/test/stub/rails3.0/Rakefile +0 -10
- data/test/stub/rails3.0/app/controllers/application_controller.rb +0 -4
- data/test/stub/rails3.0/app/helpers/application_helper.rb +0 -2
- data/test/stub/rails3.0/app/views/layouts/application.html.erb +0 -14
- data/test/stub/rails3.0/config.ru +0 -4
- data/test/stub/rails3.0/config/application.rb +0 -48
- data/test/stub/rails3.0/config/boot.rb +0 -13
- data/test/stub/rails3.0/config/database.yml +0 -22
- data/test/stub/rails3.0/config/environment.rb +0 -5
- data/test/stub/rails3.0/config/environments/development.rb +0 -19
- data/test/stub/rails3.0/config/environments/production.rb +0 -48
- data/test/stub/rails3.0/config/environments/test.rb +0 -32
- data/test/stub/rails3.0/config/initializers/backtrace_silencers.rb +0 -7
- data/test/stub/rails3.0/config/initializers/inflections.rb +0 -10
- data/test/stub/rails3.0/config/initializers/mime_types.rb +0 -5
- data/test/stub/rails3.0/config/initializers/passenger.rb +0 -2
- data/test/stub/rails3.0/config/initializers/secret_token.rb +0 -7
- data/test/stub/rails3.0/config/initializers/session_store.rb +0 -8
- data/test/stub/rails3.0/config/locales/en.yml +0 -5
- data/test/stub/rails3.0/config/routes.rb +0 -58
- data/test/stub/rails3.0/db/seeds.rb +0 -7
- data/test/stub/rails3.0/doc/README_FOR_APP +0 -2
- data/test/stub/rails3.0/lib/tasks/.gitkeep +0 -0
- data/test/stub/rails3.0/log/.gitignore +0 -0
- data/test/stub/rails3.0/public/404.html +0 -26
- data/test/stub/rails3.0/public/422.html +0 -26
- data/test/stub/rails3.0/public/500.html +0 -26
- data/test/stub/rails3.0/public/favicon.ico +0 -0
- data/test/stub/rails3.0/public/index.html +0 -279
- data/test/stub/rails3.0/public/robots.txt +0 -5
- data/test/stub/rails3.0/public/stylesheets/.gitkeep +0 -0
- data/test/stub/rails3.0/script/rails +0 -9
- data/test/stub/rails3.0/test/performance/browsing_test.rb +0 -9
- data/test/stub/rails3.0/test/test_helper.rb +0 -13
- data/test/stub/rails3.0/vendor/plugins/.gitkeep +0 -0
- data/test/stub/rails3.1/.gitignore +0 -15
- data/test/stub/rails3.1/Gemfile +0 -37
- data/test/stub/rails3.1/Gemfile.lock +0 -115
- data/test/stub/rails3.1/README +0 -261
- data/test/stub/rails3.1/Rakefile +0 -7
- data/test/stub/rails3.1/app/assets/images/rails.png +0 -0
- data/test/stub/rails3.1/app/assets/stylesheets/application.css +0 -7
- data/test/stub/rails3.1/app/controllers/application_controller.rb +0 -3
- data/test/stub/rails3.1/app/helpers/application_helper.rb +0 -2
- data/test/stub/rails3.1/app/mailers/.gitkeep +0 -0
- data/test/stub/rails3.1/app/models/.gitkeep +0 -0
- data/test/stub/rails3.1/app/views/layouts/application.html.erb +0 -14
- data/test/stub/rails3.1/config.ru +0 -4
- data/test/stub/rails3.1/config/application.rb +0 -48
- data/test/stub/rails3.1/config/boot.rb +0 -6
- data/test/stub/rails3.1/config/database.yml +0 -25
- data/test/stub/rails3.1/config/environment.rb +0 -5
- data/test/stub/rails3.1/config/environments/development.rb +0 -30
- data/test/stub/rails3.1/config/environments/production.rb +0 -60
- data/test/stub/rails3.1/config/environments/test.rb +0 -39
- data/test/stub/rails3.1/config/initializers/backtrace_silencers.rb +0 -7
- data/test/stub/rails3.1/config/initializers/inflections.rb +0 -10
- data/test/stub/rails3.1/config/initializers/mime_types.rb +0 -5
- data/test/stub/rails3.1/config/initializers/passenger.rb +0 -2
- data/test/stub/rails3.1/config/initializers/secret_token.rb +0 -7
- data/test/stub/rails3.1/config/initializers/session_store.rb +0 -8
- data/test/stub/rails3.1/config/initializers/wrap_parameters.rb +0 -14
- data/test/stub/rails3.1/config/locales/en.yml +0 -5
- data/test/stub/rails3.1/config/routes.rb +0 -58
- data/test/stub/rails3.1/db/seeds.rb +0 -7
- data/test/stub/rails3.1/doc/README_FOR_APP +0 -2
- data/test/stub/rails3.1/lib/assets/.gitkeep +0 -0
- data/test/stub/rails3.1/lib/tasks/.gitkeep +0 -0
- data/test/stub/rails3.1/log/.gitkeep +0 -0
- data/test/stub/rails3.1/public/404.html +0 -26
- data/test/stub/rails3.1/public/422.html +0 -26
- data/test/stub/rails3.1/public/500.html +0 -26
- data/test/stub/rails3.1/public/favicon.ico +0 -0
- data/test/stub/rails3.1/public/index.html +0 -241
- data/test/stub/rails3.1/public/robots.txt +0 -5
- data/test/stub/rails3.1/script/rails +0 -6
- data/test/stub/rails3.1/test/fixtures/.gitkeep +0 -0
- data/test/stub/rails3.1/test/functional/.gitkeep +0 -0
- data/test/stub/rails3.1/test/integration/.gitkeep +0 -0
- data/test/stub/rails3.1/test/performance/browsing_test.rb +0 -12
- data/test/stub/rails3.1/test/test_helper.rb +0 -13
- data/test/stub/rails3.1/test/unit/.gitkeep +0 -0
- data/test/stub/rails3.1/vendor/assets/stylesheets/.gitkeep +0 -0
- data/test/stub/rails3.1/vendor/plugins/.gitkeep +0 -0
- data/test/stub/rails3.2/.gitignore +0 -15
- data/test/stub/rails3.2/Gemfile +0 -39
- data/test/stub/rails3.2/Gemfile.lock +0 -113
- data/test/stub/rails3.2/Rakefile +0 -7
- data/test/stub/rails3.2/app/assets/images/rails.png +0 -0
- data/test/stub/rails3.2/app/assets/stylesheets/application.css +0 -13
- data/test/stub/rails3.2/app/controllers/application_controller.rb +0 -3
- data/test/stub/rails3.2/app/helpers/application_helper.rb +0 -2
- data/test/stub/rails3.2/app/mailers/.gitkeep +0 -0
- data/test/stub/rails3.2/app/models/.gitkeep +0 -0
- data/test/stub/rails3.2/app/views/layouts/application.html.erb +0 -14
- data/test/stub/rails3.2/config.ru +0 -4
- data/test/stub/rails3.2/config/application.rb +0 -62
- data/test/stub/rails3.2/config/boot.rb +0 -6
- data/test/stub/rails3.2/config/database.yml +0 -25
- data/test/stub/rails3.2/config/environment.rb +0 -5
- data/test/stub/rails3.2/config/environments/development.rb +0 -37
- data/test/stub/rails3.2/config/environments/production.rb +0 -67
- data/test/stub/rails3.2/config/environments/test.rb +0 -37
- data/test/stub/rails3.2/config/initializers/backtrace_silencers.rb +0 -7
- data/test/stub/rails3.2/config/initializers/inflections.rb +0 -15
- data/test/stub/rails3.2/config/initializers/mime_types.rb +0 -5
- data/test/stub/rails3.2/config/initializers/passenger.rb +0 -2
- data/test/stub/rails3.2/config/initializers/secret_token.rb +0 -7
- data/test/stub/rails3.2/config/initializers/session_store.rb +0 -8
- data/test/stub/rails3.2/config/initializers/wrap_parameters.rb +0 -14
- data/test/stub/rails3.2/config/locales/en.yml +0 -5
- data/test/stub/rails3.2/config/routes.rb +0 -58
- data/test/stub/rails3.2/db/seeds.rb +0 -7
- data/test/stub/rails3.2/doc/README_FOR_APP +0 -2
- data/test/stub/rails3.2/lib/assets/.gitkeep +0 -0
- data/test/stub/rails3.2/lib/tasks/.gitkeep +0 -0
- data/test/stub/rails3.2/log/.gitkeep +0 -0
- data/test/stub/rails3.2/public/404.html +0 -26
- data/test/stub/rails3.2/public/422.html +0 -26
- data/test/stub/rails3.2/public/500.html +0 -25
- data/test/stub/rails3.2/public/favicon.ico +0 -0
- data/test/stub/rails3.2/public/index.html +0 -241
- data/test/stub/rails3.2/public/robots.txt +0 -5
- data/test/stub/rails3.2/script/rails +0 -6
- data/test/stub/rails3.2/test/fixtures/.gitkeep +0 -0
- data/test/stub/rails3.2/test/functional/.gitkeep +0 -0
- data/test/stub/rails3.2/test/integration/.gitkeep +0 -0
- data/test/stub/rails3.2/test/performance/browsing_test.rb +0 -12
- data/test/stub/rails3.2/test/test_helper.rb +0 -13
- data/test/stub/rails3.2/test/unit/.gitkeep +0 -0
- data/test/stub/rails3.2/vendor/assets/stylesheets/.gitkeep +0 -0
- data/test/stub/rails3.2/vendor/plugins/.gitkeep +0 -0
- data/test/stub/rails4.0/.gitignore +0 -16
- data/test/stub/rails4.0/Gemfile +0 -45
- data/test/stub/rails4.0/Gemfile.lock +0 -126
- data/test/stub/rails4.0/README.rdoc +0 -28
- data/test/stub/rails4.0/Rakefile +0 -6
- data/test/stub/rails4.0/app/assets/images/.keep +0 -0
- data/test/stub/rails4.0/app/assets/javascripts/application.js +0 -16
- data/test/stub/rails4.0/app/assets/stylesheets/application.css +0 -13
- data/test/stub/rails4.0/app/controllers/application_controller.rb +0 -5
- data/test/stub/rails4.0/app/controllers/concerns/.keep +0 -0
- data/test/stub/rails4.0/app/helpers/application_helper.rb +0 -2
- data/test/stub/rails4.0/app/mailers/.keep +0 -0
- data/test/stub/rails4.0/app/models/.keep +0 -0
- data/test/stub/rails4.0/app/models/concerns/.keep +0 -0
- data/test/stub/rails4.0/app/views/layouts/application.html.erb +0 -14
- data/test/stub/rails4.0/bin/bundle +0 -3
- data/test/stub/rails4.0/bin/rails +0 -4
- data/test/stub/rails4.0/bin/rake +0 -4
- data/test/stub/rails4.0/config.ru +0 -4
- data/test/stub/rails4.0/config/application.rb +0 -23
- data/test/stub/rails4.0/config/boot.rb +0 -4
- data/test/stub/rails4.0/config/database.yml +0 -25
- data/test/stub/rails4.0/config/environment.rb +0 -5
- data/test/stub/rails4.0/config/environments/development.rb +0 -29
- data/test/stub/rails4.0/config/environments/production.rb +0 -80
- data/test/stub/rails4.0/config/environments/test.rb +0 -36
- data/test/stub/rails4.0/config/initializers/backtrace_silencers.rb +0 -7
- data/test/stub/rails4.0/config/initializers/filter_parameter_logging.rb +0 -4
- data/test/stub/rails4.0/config/initializers/inflections.rb +0 -16
- data/test/stub/rails4.0/config/initializers/mime_types.rb +0 -5
- data/test/stub/rails4.0/config/initializers/passenger.rb +0 -2
- data/test/stub/rails4.0/config/initializers/secret_token.rb +0 -12
- data/test/stub/rails4.0/config/initializers/session_store.rb +0 -3
- data/test/stub/rails4.0/config/initializers/wrap_parameters.rb +0 -14
- data/test/stub/rails4.0/config/locales/en.yml +0 -23
- data/test/stub/rails4.0/config/routes.rb +0 -57
- data/test/stub/rails4.0/db/seeds.rb +0 -7
- data/test/stub/rails4.0/lib/assets/.keep +0 -0
- data/test/stub/rails4.0/lib/tasks/.keep +0 -0
- data/test/stub/rails4.0/log/.keep +0 -0
- data/test/stub/rails4.0/public/404.html +0 -58
- data/test/stub/rails4.0/public/422.html +0 -58
- data/test/stub/rails4.0/public/500.html +0 -57
- data/test/stub/rails4.0/public/favicon.ico +0 -0
- data/test/stub/rails4.0/public/robots.txt +0 -5
- data/test/stub/rails4.0/test/controllers/.keep +0 -0
- data/test/stub/rails4.0/test/fixtures/.keep +0 -0
- data/test/stub/rails4.0/test/helpers/.keep +0 -0
- data/test/stub/rails4.0/test/integration/.keep +0 -0
- data/test/stub/rails4.0/test/mailers/.keep +0 -0
- data/test/stub/rails4.0/test/models/.keep +0 -0
- data/test/stub/rails4.0/test/test_helper.rb +0 -15
- data/test/stub/rails4.0/vendor/assets/javascripts/.keep +0 -0
- data/test/stub/rails4.0/vendor/assets/stylesheets/.keep +0 -0
- data/test/stub/rails4.1/.gitignore +0 -16
- data/test/stub/rails4.1/Gemfile +0 -45
- data/test/stub/rails4.1/Gemfile.lock +0 -129
- data/test/stub/rails4.1/README.rdoc +0 -28
- data/test/stub/rails4.1/Rakefile +0 -6
- data/test/stub/rails4.1/app/assets/images/.keep +0 -0
- data/test/stub/rails4.1/app/assets/javascripts/application.js +0 -16
- data/test/stub/rails4.1/app/assets/stylesheets/application.css +0 -13
- data/test/stub/rails4.1/app/controllers/application_controller.rb +0 -5
- data/test/stub/rails4.1/app/controllers/concerns/.keep +0 -0
- data/test/stub/rails4.1/app/helpers/application_helper.rb +0 -2
- data/test/stub/rails4.1/app/mailers/.keep +0 -0
- data/test/stub/rails4.1/app/models/.keep +0 -0
- data/test/stub/rails4.1/app/models/concerns/.keep +0 -0
- data/test/stub/rails4.1/app/views/layouts/application.html.erb +0 -14
- data/test/stub/rails4.1/bin/bundle +0 -3
- data/test/stub/rails4.1/bin/rails +0 -4
- data/test/stub/rails4.1/bin/rake +0 -4
- data/test/stub/rails4.1/config.ru +0 -4
- data/test/stub/rails4.1/config/application.rb +0 -23
- data/test/stub/rails4.1/config/boot.rb +0 -4
- data/test/stub/rails4.1/config/database.yml +0 -25
- data/test/stub/rails4.1/config/environment.rb +0 -5
- data/test/stub/rails4.1/config/environments/development.rb +0 -29
- data/test/stub/rails4.1/config/environments/production.rb +0 -80
- data/test/stub/rails4.1/config/environments/test.rb +0 -36
- data/test/stub/rails4.1/config/initializers/backtrace_silencers.rb +0 -7
- data/test/stub/rails4.1/config/initializers/filter_parameter_logging.rb +0 -4
- data/test/stub/rails4.1/config/initializers/inflections.rb +0 -16
- data/test/stub/rails4.1/config/initializers/mime_types.rb +0 -5
- data/test/stub/rails4.1/config/initializers/passenger.rb +0 -5
- data/test/stub/rails4.1/config/initializers/secret_token.rb +0 -12
- data/test/stub/rails4.1/config/initializers/session_store.rb +0 -3
- data/test/stub/rails4.1/config/initializers/wrap_parameters.rb +0 -14
- data/test/stub/rails4.1/config/locales/en.yml +0 -23
- data/test/stub/rails4.1/config/routes.rb +0 -57
- data/test/stub/rails4.1/db/seeds.rb +0 -7
- data/test/stub/rails4.1/lib/assets/.keep +0 -0
- data/test/stub/rails4.1/lib/tasks/.keep +0 -0
- data/test/stub/rails4.1/log/.keep +0 -0
- data/test/stub/rails4.1/public/404.html +0 -58
- data/test/stub/rails4.1/public/422.html +0 -58
- data/test/stub/rails4.1/public/500.html +0 -57
- data/test/stub/rails4.1/public/favicon.ico +0 -0
- data/test/stub/rails4.1/public/robots.txt +0 -5
- data/test/stub/rails4.1/test/controllers/.keep +0 -0
- data/test/stub/rails4.1/test/fixtures/.keep +0 -0
- data/test/stub/rails4.1/test/helpers/.keep +0 -0
- data/test/stub/rails4.1/test/integration/.keep +0 -0
- data/test/stub/rails4.1/test/mailers/.keep +0 -0
- data/test/stub/rails4.1/test/models/.keep +0 -0
- data/test/stub/rails4.1/test/test_helper.rb +0 -15
- data/test/stub/rails4.1/vendor/assets/javascripts/.keep +0 -0
- data/test/stub/rails4.1/vendor/assets/stylesheets/.keep +0 -0
- data/test/stub/start_error.pl +0 -24
- data/test/stub/upload_data.txt +0 -494
- data/test/stub/wsgi/passenger_wsgi.py +0 -212
- data/test/stub/wsgi/public/.gitignore +0 -0
- data/test/stub/wsgi/tmp/.gitignore +0 -0
- data/test/support/allocate_memory.c +0 -14
- data/test/support/apache2_controller.rb +0 -258
- data/test/support/multipart.rb +0 -62
- data/test/support/nginx_controller.rb +0 -97
- data/test/support/placebo-preloader.rb +0 -88
- data/test/support/test_helper.rb +0 -455
- data/test/support/valgrind.h +0 -2539
- data/test/tut/tut.h +0 -1310
- data/test/tut/tut_reporter.h +0 -256
- data/test/valgrind-osx.supp +0 -7
data/test/cxx/IOUtilsTest.cpp
DELETED
@@ -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
|
-
}
|