passenger 3.0.21 → 3.9.1.beta
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.
- data/DEVELOPERS.TXT +4 -10
- data/NEWS +19 -27
- data/Rakefile +20 -19
- data/bin/passenger +3 -2
- data/bin/passenger-config +35 -5
- data/bin/passenger-install-apache2-module +12 -12
- data/bin/passenger-install-nginx-module +55 -38
- data/bin/passenger-memory-stats +3 -1
- data/bin/passenger-status +7 -35
- data/build/agents.rb +107 -21
- data/build/apache2.rb +11 -46
- data/build/basics.rb +61 -9
- data/build/common_library.rb +59 -142
- data/build/cxx_tests.rb +111 -110
- data/build/documentation.rb +33 -0
- data/build/misc.rb +30 -12
- data/build/nginx.rb +10 -39
- data/build/oxt_tests.rb +1 -0
- data/build/ruby_extension.rb +1 -5
- data/build/test_basics.rb +3 -2
- data/dev/copy_boost_headers.rb +2 -1
- data/doc/Architectural overview.html +49 -90
- data/doc/DebuggingAndStressTesting.txt.md +49 -0
- data/doc/Packaging.txt.md +254 -0
- data/doc/Security of user switching support.html +35 -66
- data/doc/Users guide Apache.html +588 -758
- data/doc/Users guide Apache.idmap.txt +253 -136
- data/doc/Users guide Apache.txt +154 -109
- data/doc/Users guide Nginx.html +544 -660
- data/doc/Users guide Nginx.idmap.txt +179 -91
- data/doc/Users guide Nginx.txt +192 -118
- data/doc/Users guide Standalone.html +65 -48
- data/doc/Users guide Standalone.idmap.txt +10 -2
- data/doc/Users guide Standalone.txt +4 -0
- data/doc/images/glyphicons-halflings-white.png +0 -0
- data/doc/images/glyphicons-halflings.png +0 -0
- data/doc/images/phusion_banner_small.png +0 -0
- data/doc/images/{smart-lv2.png → smart.png} +0 -0
- data/doc/images/{smart-lv2.svg → smart.svg} +0 -0
- data/doc/templates/bootstrap.min.css +397 -0
- data/doc/templates/markdown.html.erb +117 -0
- data/doc/users_guide_snippets/analysis_and_system_maintenance.txt +2 -1
- data/doc/users_guide_snippets/appendix_c_spawning_methods.txt +26 -48
- data/doc/users_guide_snippets/passenger_spawn_method.txt +18 -30
- data/doc/users_guide_snippets/support_information.txt +30 -0
- data/ext/apache2/Bucket.cpp +9 -26
- data/ext/apache2/Bucket.h +13 -10
- data/ext/apache2/Configuration.cpp +70 -58
- data/ext/apache2/Configuration.hpp +19 -47
- data/ext/apache2/DirectoryMapper.h +7 -7
- data/ext/apache2/Hooks.cpp +150 -313
- data/ext/boost/algorithm/string/detail/case_conv.hpp +4 -2
- data/ext/boost/algorithm/string/detail/find_format.hpp +20 -20
- data/ext/boost/algorithm/string/detail/find_format_all.hpp +23 -23
- data/ext/boost/algorithm/string/detail/find_format_store.hpp +2 -2
- data/ext/boost/algorithm/string/detail/formatter.hpp +25 -0
- data/ext/boost/algorithm/string/formatter.hpp +20 -3
- data/ext/boost/assert.hpp +85 -4
- data/ext/boost/bind/bind.hpp +1 -1
- data/ext/boost/concept/detail/backward_compatibility.hpp +1 -1
- data/ext/boost/concept_check.hpp +140 -64
- data/ext/boost/config.hpp +1 -1
- data/ext/boost/config/auto_link.hpp +8 -6
- data/ext/boost/config/compiler/borland.hpp +12 -2
- data/ext/boost/config/compiler/clang.hpp +89 -30
- data/ext/boost/config/compiler/codegear.hpp +3 -2
- data/ext/boost/config/compiler/common_edg.hpp +7 -5
- data/ext/boost/config/compiler/cray.hpp +61 -0
- data/ext/boost/config/compiler/digitalmars.hpp +9 -1
- data/ext/boost/config/compiler/gcc.hpp +33 -24
- data/ext/boost/config/compiler/gcc_xml.hpp +4 -0
- data/ext/boost/config/compiler/hp_acc.hpp +12 -1
- data/ext/boost/config/compiler/intel.hpp +78 -4
- data/ext/boost/config/compiler/metrowerks.hpp +4 -1
- data/ext/boost/config/compiler/mpw.hpp +4 -1
- data/ext/boost/config/compiler/nvcc.hpp +8 -66
- data/ext/boost/config/compiler/pathscale.hpp +80 -0
- data/ext/boost/config/compiler/pgi.hpp +5 -5
- data/ext/boost/config/compiler/sunpro_cc.hpp +4 -1
- data/ext/boost/config/compiler/vacpp.hpp +37 -13
- data/ext/boost/config/compiler/visualc.hpp +24 -11
- data/ext/boost/config/platform/bsd.hpp +1 -1
- data/ext/boost/config/platform/cray.hpp +18 -0
- data/ext/boost/config/platform/cygwin.hpp +10 -0
- data/ext/boost/config/platform/linux.hpp +5 -0
- data/ext/boost/config/platform/macos.hpp +5 -4
- data/ext/boost/config/platform/symbian.hpp +5 -2
- data/ext/boost/config/platform/vms.hpp +25 -0
- data/ext/boost/config/platform/win32.hpp +7 -1
- data/ext/boost/config/select_compiler_config.hpp +8 -25
- data/ext/boost/config/select_platform_config.hpp +8 -1
- data/ext/boost/config/select_stdlib_config.hpp +9 -1
- data/ext/boost/config/stdlib/dinkumware.hpp +6 -9
- data/ext/boost/config/stdlib/libcomo.hpp +1 -4
- data/ext/boost/config/stdlib/libcpp.hpp +36 -0
- data/ext/boost/config/stdlib/libstdcpp3.hpp +37 -11
- data/ext/boost/config/stdlib/modena.hpp +1 -4
- data/ext/boost/config/stdlib/msl.hpp +1 -4
- data/ext/boost/config/stdlib/roguewave.hpp +9 -6
- data/ext/boost/config/stdlib/sgi.hpp +12 -4
- data/ext/boost/config/stdlib/stlport.hpp +11 -4
- data/ext/boost/config/stdlib/vacpp.hpp +11 -4
- data/ext/boost/config/suffix.hpp +71 -6
- data/ext/boost/config/warning_disable.hpp +1 -1
- data/ext/boost/container/container_fwd.hpp +177 -0
- data/ext/boost/cstdint.hpp +17 -12
- data/ext/boost/current_function.hpp +2 -1
- data/ext/boost/date_time/c_time.hpp +17 -1
- data/ext/boost/date_time/compiler_config.hpp +13 -15
- data/ext/boost/date_time/date_formatting.hpp +7 -1
- data/ext/boost/date_time/filetime_functions.hpp +4 -4
- data/ext/boost/date_time/gregorian_calendar.ipp +2 -2
- data/ext/boost/date_time/strings_from_facet.hpp +3 -3
- data/ext/boost/date_time/time_facet.hpp +101 -101
- data/ext/boost/detail/endian.hpp +4 -2
- data/ext/boost/detail/fenv.hpp +74 -0
- data/ext/boost/detail/sp_typeinfo.hpp +6 -0
- data/ext/boost/exception/detail/clone_current_exception.hpp +47 -0
- data/ext/boost/exception/detail/exception_ptr.hpp +194 -122
- data/ext/boost/exception/detail/type_info.hpp +3 -3
- data/ext/boost/exception/diagnostic_information.hpp +37 -21
- data/ext/boost/exception/exception.hpp +21 -1
- data/ext/boost/exception/info.hpp +0 -1
- data/ext/boost/function.hpp +2 -2
- data/ext/boost/function/function_base.hpp +15 -9
- data/ext/boost/function/function_template.hpp +26 -48
- data/ext/boost/integer_fwd.hpp +0 -16
- data/ext/boost/integer_traits.hpp +2 -2
- data/ext/boost/iterator.hpp +1 -1
- data/ext/boost/iterator/iterator_adaptor.hpp +1 -7
- data/ext/boost/iterator/iterator_facade.hpp +13 -13
- data/ext/boost/iterator/transform_iterator.hpp +5 -20
- data/ext/boost/lexical_cast.hpp +1655 -673
- data/ext/boost/math/policies/policy.hpp +982 -0
- data/ext/boost/math/special_functions/detail/fp_traits.hpp +570 -0
- data/ext/boost/math/special_functions/detail/round_fwd.hpp +80 -0
- data/ext/boost/math/special_functions/fpclassify.hpp +533 -0
- data/ext/boost/math/special_functions/math_fwd.hpp +1070 -0
- data/ext/boost/math/special_functions/sign.hpp +145 -0
- data/ext/boost/math/tools/config.hpp +321 -0
- data/ext/boost/math/tools/promotion.hpp +150 -0
- data/ext/boost/math/tools/real_cast.hpp +29 -0
- data/ext/boost/math/tools/user.hpp +97 -0
- data/ext/boost/move/move.hpp +1222 -0
- data/ext/boost/mpl/O1_size.hpp +40 -0
- data/ext/boost/mpl/O1_size_fwd.hpp +24 -0
- data/ext/boost/mpl/advance.hpp +76 -0
- data/ext/boost/mpl/advance_fwd.hpp +28 -0
- data/ext/boost/mpl/at.hpp +52 -0
- data/ext/boost/mpl/at_fwd.hpp +24 -0
- data/ext/boost/mpl/aux_/O1_size_impl.hpp +87 -0
- data/ext/boost/mpl/aux_/advance_backward.hpp +128 -0
- data/ext/boost/mpl/aux_/advance_forward.hpp +127 -0
- data/ext/boost/mpl/aux_/arithmetic_op.hpp +92 -0
- data/ext/boost/mpl/aux_/at_impl.hpp +45 -0
- data/ext/boost/mpl/aux_/begin_end_impl.hpp +101 -0
- data/ext/boost/mpl/aux_/clear_impl.hpp +35 -0
- data/ext/boost/mpl/aux_/comparison_op.hpp +83 -0
- data/ext/boost/mpl/aux_/config/forwarding.hpp +27 -0
- data/ext/boost/mpl/aux_/config/typeof.hpp +38 -0
- data/ext/boost/mpl/aux_/contains_impl.hpp +61 -0
- data/ext/boost/mpl/aux_/find_if_pred.hpp +31 -0
- data/ext/boost/mpl/aux_/fold_impl.hpp +43 -0
- data/ext/boost/mpl/aux_/has_begin.hpp +23 -0
- data/ext/boost/mpl/aux_/has_size.hpp +23 -0
- data/ext/boost/mpl/aux_/has_tag.hpp +23 -0
- data/ext/boost/mpl/aux_/inserter_algorithm.hpp +159 -0
- data/ext/boost/mpl/aux_/is_msvc_eti_arg.hpp +64 -0
- data/ext/boost/mpl/aux_/iter_apply.hpp +47 -0
- data/ext/boost/mpl/aux_/iter_fold_if_impl.hpp +210 -0
- data/ext/boost/mpl/aux_/iter_fold_impl.hpp +42 -0
- data/ext/boost/mpl/aux_/lambda_spec.hpp +49 -0
- data/ext/boost/mpl/aux_/largest_int.hpp +63 -0
- data/ext/boost/mpl/aux_/msvc_eti_base.hpp +77 -0
- data/ext/boost/mpl/aux_/msvc_type.hpp +62 -0
- data/ext/boost/mpl/aux_/numeric_cast_utils.hpp +77 -0
- data/ext/boost/mpl/aux_/numeric_op.hpp +315 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/advance_backward.hpp +97 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/advance_forward.hpp +97 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/equal_to.hpp +94 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/fold_impl.hpp +180 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/greater.hpp +94 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/greater_equal.hpp +94 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/iter_fold_if_impl.hpp +133 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/iter_fold_impl.hpp +180 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/less.hpp +94 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/less_equal.hpp +94 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/list.hpp +323 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/minus.hpp +146 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/not_equal_to.hpp +94 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/plus.hpp +146 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/reverse_fold_impl.hpp +231 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/times.hpp +146 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/vector.hpp +323 -0
- data/ext/boost/mpl/aux_/preprocessor/default_params.hpp +67 -0
- data/ext/boost/mpl/aux_/push_back_impl.hpp +70 -0
- data/ext/boost/mpl/aux_/push_front_impl.hpp +71 -0
- data/ext/boost/mpl/aux_/reverse_fold_impl.hpp +44 -0
- data/ext/boost/mpl/aux_/size_impl.hpp +52 -0
- data/ext/boost/mpl/aux_/traits_lambda_spec.hpp +63 -0
- data/ext/boost/mpl/back_fwd.hpp +24 -0
- data/ext/boost/mpl/back_inserter.hpp +34 -0
- data/ext/boost/mpl/begin_end.hpp +57 -0
- data/ext/boost/mpl/begin_end_fwd.hpp +27 -0
- data/ext/boost/mpl/clear.hpp +39 -0
- data/ext/boost/mpl/clear_fwd.hpp +24 -0
- data/ext/boost/mpl/comparison.hpp +24 -0
- data/ext/boost/mpl/contains.hpp +41 -0
- data/ext/boost/mpl/contains_fwd.hpp +25 -0
- data/ext/boost/mpl/deref.hpp +41 -0
- data/ext/boost/mpl/distance.hpp +78 -0
- data/ext/boost/mpl/distance_fwd.hpp +28 -0
- data/ext/boost/mpl/empty_fwd.hpp +24 -0
- data/ext/boost/mpl/equal_to.hpp +21 -0
- data/ext/boost/mpl/find.hpp +38 -0
- data/ext/boost/mpl/find_if.hpp +50 -0
- data/ext/boost/mpl/fold.hpp +48 -0
- data/ext/boost/mpl/front_fwd.hpp +24 -0
- data/ext/boost/mpl/front_inserter.hpp +33 -0
- data/ext/boost/mpl/greater.hpp +21 -0
- data/ext/boost/mpl/greater_equal.hpp +21 -0
- data/ext/boost/mpl/inserter.hpp +32 -0
- data/ext/boost/mpl/iter_fold.hpp +49 -0
- data/ext/boost/mpl/iter_fold_if.hpp +117 -0
- data/ext/boost/mpl/iterator_range.hpp +42 -0
- data/ext/boost/mpl/iterator_tags.hpp +27 -0
- data/ext/boost/mpl/less.hpp +21 -0
- data/ext/boost/mpl/less_equal.hpp +21 -0
- data/ext/boost/mpl/limits/list.hpp +21 -0
- data/ext/boost/mpl/limits/vector.hpp +21 -0
- data/ext/boost/mpl/list.hpp +57 -0
- data/ext/boost/mpl/list/aux_/O1_size.hpp +33 -0
- data/ext/boost/mpl/list/aux_/begin_end.hpp +44 -0
- data/ext/boost/mpl/list/aux_/clear.hpp +34 -0
- data/ext/boost/mpl/list/aux_/empty.hpp +34 -0
- data/ext/boost/mpl/list/aux_/front.hpp +33 -0
- data/ext/boost/mpl/list/aux_/include_preprocessed.hpp +35 -0
- data/ext/boost/mpl/list/aux_/item.hpp +55 -0
- data/ext/boost/mpl/list/aux_/iterator.hpp +76 -0
- data/ext/boost/mpl/list/aux_/pop_front.hpp +34 -0
- data/ext/boost/mpl/list/aux_/preprocessed/plain/list10.hpp +149 -0
- data/ext/boost/mpl/list/aux_/preprocessed/plain/list20.hpp +169 -0
- data/ext/boost/mpl/list/aux_/push_back.hpp +36 -0
- data/ext/boost/mpl/list/aux_/push_front.hpp +39 -0
- data/ext/boost/mpl/list/aux_/size.hpp +33 -0
- data/ext/boost/mpl/list/aux_/tag.hpp +24 -0
- data/ext/boost/mpl/list/list0.hpp +42 -0
- data/ext/boost/mpl/list/list10.hpp +43 -0
- data/ext/boost/mpl/list/list20.hpp +43 -0
- data/ext/boost/mpl/long.hpp +22 -0
- data/ext/boost/mpl/long_fwd.hpp +27 -0
- data/ext/boost/mpl/minus.hpp +21 -0
- data/ext/boost/mpl/multiplies.hpp +53 -0
- data/ext/boost/mpl/negate.hpp +81 -0
- data/ext/boost/mpl/not_equal_to.hpp +21 -0
- data/ext/boost/mpl/numeric_cast.hpp +41 -0
- data/ext/boost/mpl/pair.hpp +70 -0
- data/ext/boost/mpl/plus.hpp +21 -0
- data/ext/boost/mpl/pop_back_fwd.hpp +24 -0
- data/ext/boost/mpl/pop_front_fwd.hpp +24 -0
- data/ext/boost/mpl/prior.hpp +19 -0
- data/ext/boost/mpl/push_back.hpp +53 -0
- data/ext/boost/mpl/push_back_fwd.hpp +24 -0
- data/ext/boost/mpl/push_front.hpp +52 -0
- data/ext/boost/mpl/push_front_fwd.hpp +24 -0
- data/ext/boost/mpl/remove_if.hpp +83 -0
- data/ext/boost/mpl/reverse_fold.hpp +50 -0
- data/ext/boost/mpl/same_as.hpp +55 -0
- data/ext/boost/mpl/sequence_tag.hpp +124 -0
- data/ext/boost/mpl/sequence_tag_fwd.hpp +26 -0
- data/ext/boost/mpl/size.hpp +42 -0
- data/ext/boost/mpl/size_fwd.hpp +24 -0
- data/ext/boost/mpl/tag.hpp +52 -0
- data/ext/boost/mpl/times.hpp +21 -0
- data/ext/boost/mpl/vector.hpp +57 -0
- data/ext/boost/mpl/vector/aux_/O1_size.hpp +56 -0
- data/ext/boost/mpl/vector/aux_/at.hpp +116 -0
- data/ext/boost/mpl/vector/aux_/back.hpp +59 -0
- data/ext/boost/mpl/vector/aux_/begin_end.hpp +49 -0
- data/ext/boost/mpl/vector/aux_/clear.hpp +55 -0
- data/ext/boost/mpl/vector/aux_/empty.hpp +68 -0
- data/ext/boost/mpl/vector/aux_/front.hpp +56 -0
- data/ext/boost/mpl/vector/aux_/include_preprocessed.hpp +55 -0
- data/ext/boost/mpl/vector/aux_/item.hpp +103 -0
- data/ext/boost/mpl/vector/aux_/iterator.hpp +130 -0
- data/ext/boost/mpl/vector/aux_/pop_back.hpp +40 -0
- data/ext/boost/mpl/vector/aux_/pop_front.hpp +40 -0
- data/ext/boost/mpl/vector/aux_/preprocessed/plain/vector10.hpp +829 -0
- data/ext/boost/mpl/vector/aux_/preprocessed/plain/vector20.hpp +1144 -0
- data/ext/boost/mpl/vector/aux_/preprocessed/typeof_based/vector10.hpp +139 -0
- data/ext/boost/mpl/vector/aux_/preprocessed/typeof_based/vector20.hpp +159 -0
- data/ext/boost/mpl/vector/aux_/push_back.hpp +40 -0
- data/ext/boost/mpl/vector/aux_/push_front.hpp +40 -0
- data/ext/boost/mpl/vector/aux_/size.hpp +49 -0
- data/ext/boost/mpl/vector/aux_/tag.hpp +32 -0
- data/ext/boost/mpl/vector/aux_/vector0.hpp +52 -0
- data/ext/boost/mpl/vector/vector0.hpp +34 -0
- data/ext/boost/mpl/vector/vector10.hpp +45 -0
- data/ext/boost/mpl/vector/vector20.hpp +45 -0
- data/ext/boost/none.hpp +1 -1
- data/ext/boost/numeric/conversion/bounds.hpp +24 -0
- data/ext/boost/numeric/conversion/cast.hpp +61 -0
- data/ext/boost/numeric/conversion/conversion_traits.hpp +39 -0
- data/ext/boost/numeric/conversion/converter.hpp +68 -0
- data/ext/boost/numeric/conversion/converter_policies.hpp +186 -0
- data/ext/boost/numeric/conversion/detail/bounds.hpp +58 -0
- data/ext/boost/numeric/conversion/detail/conversion_traits.hpp +97 -0
- data/ext/boost/numeric/conversion/detail/converter.hpp +602 -0
- data/ext/boost/numeric/conversion/detail/int_float_mixture.hpp +72 -0
- data/ext/boost/numeric/conversion/detail/is_subranged.hpp +234 -0
- data/ext/boost/numeric/conversion/detail/meta.hpp +120 -0
- data/ext/boost/numeric/conversion/detail/numeric_cast_traits.hpp +138 -0
- data/ext/boost/numeric/conversion/detail/preprocessed/numeric_cast_traits_common.hpp +1741 -0
- data/ext/boost/numeric/conversion/detail/preprocessed/numeric_cast_traits_long_long.hpp +347 -0
- data/ext/boost/numeric/conversion/detail/sign_mixture.hpp +72 -0
- data/ext/boost/numeric/conversion/detail/udt_builtin_mixture.hpp +69 -0
- data/ext/boost/numeric/conversion/int_float_mixture_enum.hpp +29 -0
- data/ext/boost/numeric/conversion/numeric_cast_traits.hpp +31 -0
- data/ext/boost/numeric/conversion/sign_mixture_enum.hpp +29 -0
- data/ext/boost/numeric/conversion/udt_builtin_mixture_enum.hpp +26 -0
- data/ext/boost/operators.hpp +3 -1
- data/ext/boost/optional/optional.hpp +146 -79
- data/ext/boost/optional/optional_fwd.hpp +8 -1
- data/ext/boost/preprocessor/cat.hpp +2 -2
- data/ext/boost/preprocessor/config/config.hpp +39 -4
- data/ext/boost/preprocessor/facilities/intercept.hpp +277 -0
- data/ext/boost/preprocessor/facilities/overload.hpp +25 -0
- data/ext/boost/preprocessor/iteration/detail/iter/forward1.hpp +3 -3
- data/ext/boost/preprocessor/iteration/iterate.hpp +3 -3
- data/ext/boost/preprocessor/punctuation/paren.hpp +23 -0
- data/ext/boost/preprocessor/repetition/enum_shifted_params.hpp +44 -0
- data/ext/boost/preprocessor/seq/cat.hpp +5 -4
- data/ext/boost/preprocessor/seq/size.hpp +0 -1
- data/ext/boost/preprocessor/tuple/eat.hpp +83 -34
- data/ext/boost/preprocessor/tuple/elem.hpp +161 -355
- data/ext/boost/preprocessor/tuple/rem.hpp +110 -48
- data/ext/boost/preprocessor/tuple/to_list.hpp +90 -36
- data/ext/boost/preprocessor/variadic/elem.hpp +94 -0
- data/ext/boost/preprocessor/variadic/size.hpp +30 -0
- data/ext/boost/range/begin.hpp +17 -6
- data/ext/boost/range/concepts.hpp +37 -2
- data/ext/boost/range/detail/safe_bool.hpp +72 -0
- data/ext/boost/range/end.hpp +14 -9
- data/ext/boost/range/iterator_range_core.hpp +120 -12
- data/ext/boost/range/size.hpp +21 -5
- data/ext/boost/smart_ptr/detail/shared_count.hpp +88 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +3 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_aix.hpp +142 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +9 -0
- data/ext/boost/smart_ptr/detail/sp_counted_impl.hpp +10 -2
- data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +5 -1
- data/ext/boost/smart_ptr/detail/spinlock.hpp +4 -1
- data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +20 -3
- data/ext/boost/smart_ptr/detail/spinlock_pool.hpp +4 -0
- data/ext/boost/smart_ptr/make_shared.hpp +591 -22
- data/ext/boost/smart_ptr/shared_array.hpp +29 -1
- data/ext/boost/smart_ptr/shared_ptr.hpp +29 -13
- data/ext/boost/smart_ptr/weak_ptr.hpp +24 -12
- data/ext/boost/src/pthread/once.cpp +9 -7
- data/ext/boost/src/pthread/thread.cpp +32 -28
- data/ext/boost/src/pthread/timeconv.inl +4 -5
- data/ext/boost/src/tss_null.cpp +5 -1
- data/ext/boost/static_assert.hpp +8 -2
- data/ext/boost/thread/detail/config.hpp +19 -4
- data/ext/boost/thread/detail/move.hpp +11 -5
- data/ext/boost/thread/detail/thread.hpp +59 -43
- data/ext/boost/thread/exceptions.hpp +9 -9
- data/ext/boost/thread/future.hpp +150 -82
- data/ext/boost/thread/locks.hpp +101 -60
- data/ext/boost/thread/pthread/condition_variable.hpp +79 -32
- data/ext/boost/thread/pthread/condition_variable_fwd.hpp +12 -3
- data/ext/boost/thread/pthread/mutex.hpp +17 -14
- data/ext/boost/thread/pthread/once.hpp +3 -4
- data/ext/boost/thread/pthread/pthread_mutex_scoped_lock.hpp +12 -2
- data/ext/boost/thread/pthread/recursive_mutex.hpp +19 -19
- data/ext/boost/thread/pthread/shared_mutex.hpp +13 -13
- data/ext/boost/thread/pthread/thread_data.hpp +40 -12
- data/ext/boost/thread/thread_time.hpp +5 -0
- data/ext/boost/throw_exception.hpp +1 -1
- data/ext/boost/token_functions.hpp +34 -10
- data/ext/boost/type_traits/add_rvalue_reference.hpp +66 -0
- data/ext/boost/type_traits/alignment_of.hpp +1 -1
- data/ext/boost/type_traits/detail/bool_trait_def.hpp +26 -3
- data/ext/boost/type_traits/detail/bool_trait_undef.hpp +3 -2
- data/ext/boost/type_traits/detail/cv_traits_impl.hpp +1 -1
- data/ext/boost/type_traits/detail/size_t_trait_def.hpp +6 -4
- data/ext/boost/type_traits/detail/type_trait_def.hpp +8 -2
- data/ext/boost/type_traits/function_traits.hpp +1 -1
- data/ext/boost/type_traits/has_nothrow_constructor.hpp +53 -0
- data/ext/boost/type_traits/has_nothrow_copy.hpp +19 -5
- data/ext/boost/type_traits/has_trivial_constructor.hpp +51 -0
- data/ext/boost/type_traits/has_trivial_copy.hpp +20 -5
- data/ext/boost/type_traits/has_trivial_destructor.hpp +12 -5
- data/ext/boost/type_traits/intrinsics.hpp +119 -71
- data/ext/boost/type_traits/is_const.hpp +5 -5
- data/ext/boost/type_traits/is_convertible.hpp +14 -13
- data/ext/boost/type_traits/is_enum.hpp +1 -1
- data/ext/boost/type_traits/is_floating_point.hpp +27 -0
- data/ext/boost/type_traits/is_function.hpp +3 -3
- data/ext/boost/type_traits/is_fundamental.hpp +1 -1
- data/ext/boost/type_traits/is_member_function_pointer.hpp +2 -2
- data/ext/boost/type_traits/is_member_pointer.hpp +2 -2
- data/ext/boost/type_traits/is_pod.hpp +11 -3
- data/ext/boost/type_traits/is_pointer.hpp +2 -2
- data/ext/boost/type_traits/is_signed.hpp +8 -3
- data/ext/boost/type_traits/is_union.hpp +8 -0
- data/ext/boost/type_traits/is_unsigned.hpp +9 -4
- data/ext/boost/type_traits/is_volatile.hpp +5 -5
- data/ext/boost/type_traits/remove_cv.hpp +4 -3
- data/ext/boost/type_traits/remove_pointer.hpp +51 -2
- data/ext/boost/type_traits/remove_reference.hpp +2 -2
- data/ext/boost/type_traits/type_with_alignment.hpp +8 -2
- data/ext/boost/utility/declval.hpp +44 -0
- data/ext/boost/utility/detail/in_place_factory_prefix.hpp +36 -0
- data/ext/boost/utility/detail/in_place_factory_suffix.hpp +23 -0
- data/ext/boost/utility/detail/result_of_iterate.hpp +142 -0
- data/ext/boost/utility/in_place_factory.hpp +88 -0
- data/ext/boost/utility/result_of.hpp +103 -0
- data/ext/boost/utility/swap.hpp +55 -0
- data/ext/common/AnsiColorConstants.h +36 -0
- data/ext/common/ApplicationPool2/Common.h +87 -0
- data/ext/common/ApplicationPool2/ComponentInfo.h +53 -0
- data/ext/common/ApplicationPool2/Group.h +648 -0
- data/ext/common/ApplicationPool2/Implementation.cpp +580 -0
- data/ext/common/ApplicationPool2/Options.h +576 -0
- data/ext/common/ApplicationPool2/PipeWatcher.h +61 -0
- data/ext/common/ApplicationPool2/Pool.h +1181 -0
- data/ext/common/ApplicationPool2/Process.h +425 -0
- data/ext/common/ApplicationPool2/README.md +96 -0
- data/ext/common/ApplicationPool2/Session.h +158 -0
- data/ext/common/ApplicationPool2/Socket.h +246 -0
- data/ext/common/ApplicationPool2/Spawner.h +2212 -0
- data/ext/common/ApplicationPool2/SuperGroup.h +749 -0
- data/ext/common/BackgroundEventLoop.cpp +129 -0
- data/ext/common/BackgroundEventLoop.h +61 -0
- data/ext/common/Constants.h +3 -1
- data/ext/common/EventedBufferedInput.h +331 -0
- data/ext/common/EventedMessageServer.h +17 -34
- data/ext/common/EventedServer.h +2 -2
- data/ext/common/Exceptions.h +71 -19
- data/ext/common/FileDescriptor.h +8 -6
- data/ext/common/HttpConstants.h +167 -0
- data/ext/common/IniFile.h +24 -0
- data/ext/common/Logging.h +62 -849
- data/ext/common/MessageReadersWriters.h +19 -0
- data/ext/common/MessageServer.h +11 -14
- data/ext/common/MultiLibeio.cpp +198 -0
- data/ext/common/MultiLibeio.h +67 -0
- data/ext/common/ResourceLocator.h +24 -41
- data/ext/common/SafeLibev.h +186 -14
- data/ext/common/StaticString.h +23 -3
- data/ext/common/UnionStation.h +972 -0
- data/ext/common/Utils.cpp +168 -24
- data/ext/common/Utils.h +25 -3
- data/ext/common/Utils/CachedFileStat.hpp +4 -3
- data/ext/common/Utils/FileChangeChecker.h +2 -2
- data/ext/common/Utils/HashMap.h +50 -0
- data/ext/common/Utils/IOUtils.cpp +229 -68
- data/ext/common/Utils/IOUtils.h +134 -3
- data/ext/common/Utils/Lock.h +28 -0
- data/ext/common/Utils/MemoryBarrier.h +52 -0
- data/ext/common/Utils/PriorityQueue.h +54 -0
- data/ext/common/Utils/ProcessMetricsCollector.h +9 -11
- data/ext/common/Utils/ScopeGuard.h +50 -1
- data/ext/common/Utils/SmallVector.h +653 -0
- data/ext/common/Utils/StrIntUtils.cpp +26 -2
- data/ext/common/Utils/StrIntUtils.h +18 -2
- data/ext/common/Utils/StringMap.h +125 -8
- data/ext/common/Utils/Template.h +212 -0
- data/ext/common/Utils/fib.c +699 -0
- data/ext/common/Utils/fib.h +101 -0
- data/ext/common/Utils/fibpriv.h +67 -0
- data/ext/common/Utils/json-forwards.h +249 -0
- data/ext/common/Utils/json.h +1855 -0
- data/ext/common/Utils/jsoncpp.cpp +4230 -0
- data/ext/common/agents/Base.cpp +1126 -0
- data/ext/common/{AgentBase.h → agents/Base.h} +5 -1
- data/ext/common/agents/EnvPrinter.c +16 -0
- data/ext/common/agents/HelperAgent/AgentOptions.h +81 -0
- data/ext/common/{HelperAgent → agents/HelperAgent}/BacktracesServer.h +3 -2
- data/ext/common/agents/HelperAgent/FileBackedPipe.h +732 -0
- data/ext/common/agents/HelperAgent/Main.cpp +497 -0
- data/ext/common/agents/HelperAgent/RequestHandler.cpp +283 -0
- data/ext/common/agents/HelperAgent/RequestHandler.h +2139 -0
- data/ext/common/agents/HelperAgent/ScgiRequestParser.h +451 -0
- data/ext/common/{LoggingAgent → agents/LoggingAgent}/DataStoreId.h +1 -1
- data/ext/common/{LoggingAgent → agents/LoggingAgent}/FilterSupport.cpp +1 -1
- data/ext/common/{LoggingAgent → agents/LoggingAgent}/FilterSupport.h +0 -0
- data/ext/common/{LoggingAgent → agents/LoggingAgent}/LoggingServer.h +18 -16
- data/ext/common/{LoggingAgent → agents/LoggingAgent}/Main.cpp +15 -13
- data/ext/common/{LoggingAgent → agents/LoggingAgent}/RemoteSender.h +6 -6
- data/ext/common/agents/SpawnPreparer.cpp +127 -0
- data/ext/common/{Watchdog.cpp → agents/Watchdog/Main.cpp} +63 -25
- data/ext/libeio/Changes +72 -0
- data/ext/{google/COPYING → libeio/LICENSE} +17 -9
- data/ext/libeio/Makefile.am +15 -0
- data/ext/libeio/Makefile.in +694 -0
- data/ext/libeio/aclocal.m4 +9418 -0
- data/ext/libeio/autogen.sh +3 -0
- data/ext/libeio/config.guess +1501 -0
- data/ext/libeio/config.h.in +136 -0
- data/ext/libeio/config.sub +1705 -0
- data/ext/libeio/configure +14822 -0
- data/ext/libeio/configure.ac +22 -0
- data/ext/libeio/demo.c +194 -0
- data/ext/libeio/ecb.h +457 -0
- data/ext/libeio/eio.c +2816 -0
- data/ext/libeio/eio.h +411 -0
- data/ext/libeio/install-sh +520 -0
- data/ext/libeio/libeio.m4 +211 -0
- data/ext/libeio/ltmain.sh +9636 -0
- data/ext/libeio/missing +376 -0
- data/ext/libeio/xthread.h +166 -0
- data/ext/libev/Changes +125 -7
- data/ext/libev/Makefile.am +5 -3
- data/ext/libev/Makefile.in +209 -120
- data/ext/libev/aclocal.m4 +6027 -4619
- data/ext/libev/autogen.sh +1 -4
- data/ext/libev/config.h.in +11 -7
- data/ext/libev/configure +7312 -14993
- data/ext/libev/configure.ac +12 -5
- data/ext/libev/depcomp +630 -0
- data/ext/libev/ev++.h +48 -32
- data/ext/libev/ev.c +1173 -391
- data/ext/libev/ev.h +315 -181
- data/ext/libev/ev_epoll.c +66 -15
- data/ext/libev/ev_kqueue.c +20 -18
- data/ext/libev/ev_poll.c +27 -23
- data/ext/libev/ev_port.c +39 -19
- data/ext/libev/ev_select.c +23 -17
- data/ext/libev/ev_vars.h +25 -8
- data/ext/libev/ev_win32.c +6 -6
- data/ext/libev/ev_wrap.h +22 -2
- data/ext/libev/event.c +18 -17
- data/ext/libev/event.h +16 -4
- data/ext/libev/libev.m4 +10 -6
- data/ext/libev/ltmain.sh +7353 -5811
- data/ext/nginx/Configuration.c +74 -42
- data/ext/nginx/Configuration.h +3 -5
- data/ext/nginx/ContentHandler.c +26 -83
- data/ext/nginx/ContentHandler.h +1 -1
- data/ext/nginx/config +13 -9
- data/ext/nginx/ngx_http_passenger_module.c +3 -7
- data/ext/oxt/detail/backtrace_enabled.hpp +5 -102
- data/ext/oxt/detail/context.hpp +90 -0
- data/ext/oxt/detail/spin_lock_darwin.hpp +4 -0
- data/ext/oxt/detail/spin_lock_gcc_x86.hpp +4 -0
- data/ext/oxt/detail/spin_lock_pthreads.hpp +14 -0
- data/ext/oxt/detail/tracable_exception_enabled.hpp +2 -2
- data/ext/oxt/dynamic_thread_group.hpp +27 -1
- data/ext/oxt/implementation.cpp +415 -0
- data/ext/oxt/{thread.cpp → initialize.hpp} +13 -6
- data/ext/oxt/macros.hpp +32 -1
- data/ext/oxt/spin_lock.hpp +6 -11
- data/ext/oxt/system_calls.cpp +204 -16
- data/ext/oxt/system_calls.hpp +85 -45
- data/ext/oxt/thread.hpp +13 -117
- data/ext/ruby/passenger_native_support.c +82 -237
- data/helper-scripts/backtrace-sanitizer.rb +114 -0
- data/helper-scripts/classic-rails-loader.rb +135 -0
- data/helper-scripts/classic-rails-preloader.rb +161 -0
- data/helper-scripts/node-loader.js +314 -0
- data/helper-scripts/rack-loader.rb +104 -0
- data/helper-scripts/rack-preloader.rb +132 -0
- data/helper-scripts/wsgi-loader.py +231 -0
- data/helper-scripts/wsgi-preloader.py +1 -0
- data/lib/phusion_passenger.rb +159 -61
- data/lib/phusion_passenger/abstract_installer.rb +182 -87
- data/lib/phusion_passenger/admin_tools/server_instance.rb +25 -19
- data/lib/phusion_passenger/analytics_logger.rb +5 -4
- data/lib/phusion_passenger/classic_rails/{request_handler.rb → thread_handler_extension.rb} +4 -40
- data/lib/phusion_passenger/classic_rails_extensions/init.rb +5 -3
- data/lib/phusion_passenger/common_library.rb +441 -0
- data/lib/phusion_passenger/console_text_template.rb +4 -16
- data/lib/phusion_passenger/constants.rb +1 -8
- data/lib/phusion_passenger/debug_logging.rb +5 -2
- data/lib/phusion_passenger/dependencies.rb +51 -13
- data/lib/phusion_passenger/loader_shared_helpers.rb +318 -0
- data/lib/phusion_passenger/message_channel.rb +3 -47
- data/lib/phusion_passenger/message_client.rb +2 -2
- data/lib/phusion_passenger/native_support.rb +36 -15
- data/lib/phusion_passenger/packaging.rb +8 -11
- data/lib/phusion_passenger/platform_info.rb +25 -17
- data/lib/phusion_passenger/platform_info/apache.rb +10 -7
- data/lib/phusion_passenger/platform_info/binary_compatibility.rb +10 -30
- data/lib/phusion_passenger/platform_info/compiler.rb +93 -34
- data/lib/phusion_passenger/platform_info/ruby.rb +37 -97
- data/lib/phusion_passenger/preloader_shared_helpers.rb +121 -0
- data/lib/phusion_passenger/public_api.rb +1 -4
- data/lib/phusion_passenger/rack/{request_handler.rb → thread_handler_extension.rb} +14 -63
- data/lib/phusion_passenger/rails3_extensions/init.rb +9 -8
- data/lib/phusion_passenger/request_handler.rb +500 -0
- data/lib/phusion_passenger/request_handler/thread_handler.rb +360 -0
- data/lib/phusion_passenger/ruby_core_enhancements.rb +142 -0
- data/lib/phusion_passenger/standalone/command.rb +36 -15
- data/lib/phusion_passenger/standalone/package_runtime_command.rb +16 -8
- data/lib/phusion_passenger/standalone/runtime_installer.rb +169 -72
- data/lib/phusion_passenger/standalone/start_command.rb +44 -39
- data/lib/phusion_passenger/standalone/utils.rb +5 -5
- data/lib/phusion_passenger/utils.rb +35 -914
- data/lib/phusion_passenger/utils/ansi_colors.rb +59 -0
- data/lib/phusion_passenger/utils/file_system_watcher.rb +1 -1
- data/lib/phusion_passenger/utils/robust_interruption.rb +134 -0
- data/lib/phusion_passenger/utils/tee_input.rb +174 -0
- data/lib/phusion_passenger/utils/tmpio.rb +33 -0
- data/lib/phusion_passenger/utils/unseekable_socket.rb +6 -0
- data/resources/mime.types +5 -1
- data/{lib/phusion_passenger/templates → resources}/standalone_default_root/index.html +0 -0
- data/{lib/phusion_passenger → resources}/templates/apache2/apache_must_be_compiled_with_compatible_mpm.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/apache2/config_snippets.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/apache2/deployment_example.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/apache2/no_write_permission_to_passenger_root.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/apache2/possible_solutions_for_compilation_and_installation_problems.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/apache2/run_installer_as_root.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/apache2/welcome.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/error_layout.css +6 -0
- data/resources/templates/error_layout.html.template +89 -0
- data/resources/templates/general_error.html.template +1 -0
- data/resources/templates/general_error_with_html.html.template +1 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/ask_for_extra_configure_flags.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/cannot_write_to_dir.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/config_snippets.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/config_snippets_inserted.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/confirm_extra_configure_flags.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/deployment_example.txt.erb +0 -0
- data/resources/templates/nginx/not_available_when_natively_packaged.txt.erb +8 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/pcre_could_not_be_downloaded.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/pcre_could_not_be_extracted.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/possible_solutions_for_compilation_and_installation_problems.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/query_download_and_install.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/run_installer_as_root.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/welcome.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/standalone/cannot_write_to_dir.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/standalone/config.erb +26 -5
- data/{lib/phusion_passenger → resources}/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/standalone/run_installer_as_root.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/standalone/welcome.txt.erb +0 -0
- data/resources/templates/undisclosed_error.html.template +25 -0
- data/test/config.json.example +42 -0
- data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +86 -0
- data/test/cxx/ApplicationPool2/OptionsTest.cpp +44 -0
- data/test/cxx/ApplicationPool2/PoolTest.cpp +1234 -0
- data/test/cxx/ApplicationPool2/ProcessTest.cpp +131 -0
- data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +229 -0
- data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +744 -0
- data/test/cxx/BufferedIOTest.cpp +7 -7
- data/test/cxx/CxxTestMain.cpp +65 -2
- data/test/cxx/FileBackedPipeTest.cpp +626 -0
- data/test/cxx/FileChangeCheckerTest.cpp +20 -18
- data/test/cxx/FilterSupportTest.cpp +5 -5
- data/test/cxx/IOUtilsTest.cpp +11 -4
- data/test/cxx/MessageReadersWritersTest.cpp +1 -1
- data/test/cxx/MessageServerTest.cpp +31 -30
- data/test/cxx/RequestHandlerTest.cpp +777 -0
- data/test/cxx/ScgiRequestParserTest.cpp +36 -16
- data/test/cxx/ServerInstanceDirTest.cpp +1 -1
- data/test/cxx/StringMapTest.cpp +61 -0
- data/test/cxx/TemplateTest.cpp +118 -0
- data/test/cxx/TestSupport.cpp +25 -68
- data/test/cxx/TestSupport.h +81 -41
- data/test/cxx/{LoggingTest.cpp → UnionStationTest.cpp} +79 -74
- data/test/cxx/UtilsTest.cpp +59 -5
- data/test/integration_tests/apache2_tests.rb +2 -2
- data/test/integration_tests/nginx_tests.rb +1 -1
- data/test/integration_tests/spec_helper.rb +7 -5
- data/test/oxt/oxt_test_main.cpp +2 -0
- data/test/oxt/syscall_interruption_test.cpp +1 -0
- data/test/ruby/classic_rails/loader_spec.rb +48 -0
- data/test/ruby/classic_rails/preloader_spec.rb +54 -0
- data/test/ruby/rack/loader_spec.rb +62 -0
- data/test/ruby/rack/preloader_spec.rb +74 -0
- data/test/ruby/{abstract_request_handler_spec.rb → request_handler_spec.rb} +31 -68
- data/test/ruby/shared/loader_spec.rb +241 -0
- data/test/ruby/shared/rails/analytics_logging_extensions_spec.rb +141 -182
- data/test/ruby/shared/ruby_loader_spec.rb +55 -0
- data/test/ruby/spec_helper.rb +8 -53
- data/test/ruby/utils/file_system_watcher_spec.rb +9 -1
- data/test/ruby/utils_spec.rb +10 -683
- data/test/stub/rack/config.ru +28 -3
- data/test/stub/rack/start.rb +47 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/Rakefile +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/application_controller.rb +0 -2
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/bar_controller_1.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/bar_controller_2.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/foo_controller.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/helpers/application_helper.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/boot.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/database.yml +3 -3
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environment.rb +5 -2
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environments/development.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environments/production.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environments/staging.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/initializers/inflections.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/initializers/mime_types.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/routes.rb +1 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/about +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/console +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/dbconsole +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/destroy +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/generate +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/performance/benchmarker +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/performance/profiler +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/performance/request +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/plugin +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/process/inspector +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/process/reaper +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/process/spawner +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/runner +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/server +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/Gemfile +0 -0
- data/test/stub/rails3.0/Gemfile.lock +80 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/Rakefile +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/app/controllers/application_controller.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/app/helpers/application_helper.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/app/views/layouts/application.html.erb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config.ru +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/application.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/boot.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/database.yml +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environment.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environments/development.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environments/production.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environments/test.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/backtrace_silencers.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/inflections.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/mime_types.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/passenger.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/secret_token.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/session_store.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/locales/en.yml +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/routes.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/db/seeds.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/doc/README_FOR_APP +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/404.html +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/422.html +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/500.html +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/favicon.ico +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/index.html +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/robots.txt +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/script/rails +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/test/performance/browsing_test.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/test/test_helper.rb +0 -0
- data/test/stub/start_error.pl +24 -0
- data/test/stub/wsgi/passenger_wsgi.py +71 -3
- data/test/support/apache2_controller.rb +2 -2
- data/test/support/placebo-preloader.rb +88 -0
- data/test/support/test_helper.rb +1 -14
- data/test/tut/tut.h +11 -4
- metadata +590 -326
- data.tar.gz.asc +0 -12
- data/PACKAGING.TXT +0 -25
- data/build/config.rb +0 -46
- data/ext/apache2/HelperAgent.cpp +0 -364
- data/ext/boost/call_traits.hpp +0 -24
- data/ext/boost/detail/call_traits.hpp +0 -164
- data/ext/common/AbstractSpawnManager.h +0 -110
- data/ext/common/AgentBase.cpp +0 -432
- data/ext/common/ApplicationPool/Client.h +0 -788
- data/ext/common/ApplicationPool/Interface.h +0 -295
- data/ext/common/ApplicationPool/Pool.h +0 -1327
- data/ext/common/ApplicationPool/Server.h +0 -479
- data/ext/common/MessageChannel.h +0 -494
- data/ext/common/PoolOptions.h +0 -518
- data/ext/common/Process.h +0 -253
- data/ext/common/Session.h +0 -436
- data/ext/common/SpawnManager.h +0 -611
- data/ext/google/ChangeLog +0 -167
- data/ext/google/dense_hash_map +0 -310
- data/ext/google/dense_hash_set +0 -287
- data/ext/google/sparse_hash_map +0 -294
- data/ext/google/sparse_hash_set +0 -275
- data/ext/google/sparsehash/densehashtable.h +0 -1062
- data/ext/google/sparsehash/sparseconfig.h +0 -55
- data/ext/google/sparsehash/sparsehashtable.h +0 -1015
- data/ext/google/sparsetable +0 -1468
- data/ext/google/type_traits.h +0 -250
- data/ext/nginx/HelperAgent.cpp +0 -1355
- data/ext/nginx/ScgiRequestParser.h +0 -375
- data/ext/oxt/backtrace.cpp +0 -185
- data/ext/oxt/tracable_exception.cpp +0 -89
- data/helper-scripts/passenger-spawn-server +0 -106
- data/lib/phusion_passenger/abstract_request_handler.rb +0 -766
- data/lib/phusion_passenger/abstract_server.rb +0 -372
- data/lib/phusion_passenger/abstract_server_collection.rb +0 -335
- data/lib/phusion_passenger/app_process.rb +0 -174
- data/lib/phusion_passenger/classic_rails/application_spawner.rb +0 -344
- data/lib/phusion_passenger/classic_rails/framework_spawner.rb +0 -311
- data/lib/phusion_passenger/exceptions.rb +0 -103
- data/lib/phusion_passenger/html_template.rb +0 -107
- data/lib/phusion_passenger/rack/application_spawner.rb +0 -231
- data/lib/phusion_passenger/spawn_manager.rb +0 -359
- data/lib/phusion_passenger/templates/app_exited_during_initialization.html.erb +0 -38
- data/lib/phusion_passenger/templates/app_init_error.html.erb +0 -64
- data/lib/phusion_passenger/templates/database_error.html.erb +0 -66
- data/lib/phusion_passenger/templates/error_layout.html.erb +0 -39
- data/lib/phusion_passenger/templates/framework_init_error.html.erb +0 -39
- data/lib/phusion_passenger/templates/general_error.html.erb +0 -22
- data/lib/phusion_passenger/templates/load_error.html.erb +0 -46
- data/lib/phusion_passenger/templates/version_not_found.html.erb +0 -34
- data/lib/phusion_passenger/utils/rewindable_input.rb +0 -125
- data/lib/phusion_passenger/wsgi/application_spawner.rb +0 -108
- data/test/config.yml.example +0 -41
- data/test/cxx/ApplicationPool_PoolTest.cpp +0 -33
- data/test/cxx/ApplicationPool_PoolTestCases.cpp +0 -1029
- data/test/cxx/ApplicationPool_ServerTest.cpp +0 -308
- data/test/cxx/ApplicationPool_Server_PoolTest.cpp +0 -80
- data/test/cxx/MessageChannelTest.cpp +0 -557
- data/test/cxx/PoolOptionsTest.cpp +0 -116
- data/test/cxx/SpawnManagerTest.cpp +0 -161
- data/test/ruby/abstract_server_collection_spec.rb +0 -247
- data/test/ruby/abstract_server_spec.rb +0 -61
- data/test/ruby/app_process_spec.rb +0 -43
- data/test/ruby/classic_rails/application_spawner_spec.rb +0 -89
- data/test/ruby/classic_rails/framework_spawner_spec.rb +0 -92
- data/test/ruby/rack/application_spawner_spec.rb +0 -116
- data/test/ruby/shared/abstract_server_spec.rb +0 -23
- data/test/ruby/shared/spawners/classic_rails/framework_spawner_spec.rb +0 -38
- data/test/ruby/shared/spawners/classic_rails/lack_of_rails_gem_version_spec.rb +0 -19
- data/test/ruby/shared/spawners/classic_rails/spawner_spec.rb +0 -15
- data/test/ruby/shared/spawners/non_preloading_spawner_spec.rb +0 -27
- data/test/ruby/shared/spawners/preloading_spawner_spec.rb +0 -29
- data/test/ruby/shared/spawners/reload_all_spec.rb +0 -36
- data/test/ruby/shared/spawners/reload_single_spec.rb +0 -52
- data/test/ruby/shared/spawners/spawn_server_spec.rb +0 -28
- data/test/ruby/shared/spawners/spawner_spec.rb +0 -273
- data/test/ruby/shared/utils/pseudo_io_spec.rb +0 -60
- data/test/ruby/spawn_manager_spec.rb +0 -134
- data/test/ruby/wsgi/application_spawner_spec.rb +0 -50
- data/test/stub/message_channel.rb +0 -11
- data/test/stub/message_channel_2.rb +0 -12
- data/test/stub/message_channel_3.rb +0 -19
- data/test/stub/rails_apps/3.0/empty/Gemfile.lock +0 -73
- data/test/stub/spawn_server.rb +0 -22
- metadata.gz.asc +0 -12
@@ -1,308 +0,0 @@
|
|
1
|
-
#include "TestSupport.h"
|
2
|
-
|
3
|
-
#include <boost/bind.hpp>
|
4
|
-
|
5
|
-
#include "ApplicationPool/Pool.h"
|
6
|
-
#include "ApplicationPool/Server.h"
|
7
|
-
#include "ApplicationPool/Client.h"
|
8
|
-
#include "Utils.h"
|
9
|
-
#include <string>
|
10
|
-
#include <cstring>
|
11
|
-
#include <unistd.h>
|
12
|
-
#include <errno.h>
|
13
|
-
|
14
|
-
using namespace Passenger;
|
15
|
-
using namespace Passenger::ApplicationPool;
|
16
|
-
using namespace boost;
|
17
|
-
using namespace std;
|
18
|
-
|
19
|
-
namespace tut {
|
20
|
-
struct ApplicationPool_ServerTest {
|
21
|
-
ServerInstanceDirPtr serverInstanceDir;
|
22
|
-
ServerInstanceDir::GenerationPtr generation;
|
23
|
-
string socketFilename;
|
24
|
-
AccountsDatabasePtr accountsDatabase;
|
25
|
-
AccountPtr clientAccount;
|
26
|
-
shared_ptr<MessageServer> messageServer;
|
27
|
-
shared_ptr<Pool> realPool;
|
28
|
-
shared_ptr<Server> poolServer;
|
29
|
-
shared_ptr<Client> pool, pool2;
|
30
|
-
shared_ptr<oxt::thread> serverThread;
|
31
|
-
|
32
|
-
~ApplicationPool_ServerTest() {
|
33
|
-
if (serverThread != NULL) {
|
34
|
-
serverThread->interrupt_and_join();
|
35
|
-
}
|
36
|
-
}
|
37
|
-
|
38
|
-
void initializePool() {
|
39
|
-
createServerInstanceDirAndGeneration(serverInstanceDir, generation);
|
40
|
-
socketFilename = generation->getPath() + "/socket";
|
41
|
-
accountsDatabase = ptr(new AccountsDatabase());
|
42
|
-
clientAccount = accountsDatabase->add("test", "12345", false);
|
43
|
-
|
44
|
-
messageServer = ptr(new MessageServer(socketFilename, accountsDatabase));
|
45
|
-
realPool = ptr(new Pool("../helper-scripts/passenger-spawn-server", generation));
|
46
|
-
poolServer = ptr(new Server(realPool));
|
47
|
-
messageServer->addHandler(poolServer);
|
48
|
-
serverThread = ptr(new oxt::thread(
|
49
|
-
boost::bind(&MessageServer::mainLoop, messageServer.get())
|
50
|
-
));
|
51
|
-
pool = ptr(new Client());
|
52
|
-
pool2 = ptr(new Client());
|
53
|
-
pool->connect(socketFilename, "test", "12345");
|
54
|
-
pool2->connect(socketFilename, "test", "12345");
|
55
|
-
}
|
56
|
-
|
57
|
-
SessionPtr spawnRackApp() {
|
58
|
-
PoolOptions options("stub/rack");
|
59
|
-
options.appType = "rack";
|
60
|
-
return pool->get(options);
|
61
|
-
}
|
62
|
-
|
63
|
-
|
64
|
-
/* A StringListCreator which not only returns a dummy value, but also
|
65
|
-
* increments a counter each time getItems() is called. */
|
66
|
-
class DummyStringListCreator: public StringListCreator {
|
67
|
-
public:
|
68
|
-
mutable int counter;
|
69
|
-
|
70
|
-
DummyStringListCreator() {
|
71
|
-
counter = 0;
|
72
|
-
}
|
73
|
-
|
74
|
-
virtual const StringListPtr getItems() const {
|
75
|
-
StringListPtr result = ptr(new StringList());
|
76
|
-
counter++;
|
77
|
-
result->push_back("hello");
|
78
|
-
result->push_back("world");
|
79
|
-
return result;
|
80
|
-
}
|
81
|
-
};
|
82
|
-
|
83
|
-
class SlowClient: public Client {
|
84
|
-
private:
|
85
|
-
unsigned int timeToSendUsername;
|
86
|
-
unsigned int timeToSendPassword;
|
87
|
-
|
88
|
-
protected:
|
89
|
-
virtual void sendUsername(MessageChannel &channel, const string &username) {
|
90
|
-
if (timeToSendUsername > 0) {
|
91
|
-
usleep(timeToSendUsername * 1000);
|
92
|
-
}
|
93
|
-
channel.writeScalar(username);
|
94
|
-
}
|
95
|
-
|
96
|
-
virtual void sendPassword(MessageChannel &channel, const StaticString &userSuppliedPassword) {
|
97
|
-
if (timeToSendPassword > 0) {
|
98
|
-
usleep(timeToSendPassword * 1000);
|
99
|
-
}
|
100
|
-
channel.writeScalar(userSuppliedPassword.c_str(), userSuppliedPassword.size());
|
101
|
-
}
|
102
|
-
|
103
|
-
public:
|
104
|
-
SlowClient(unsigned int timeToSendUsername,
|
105
|
-
unsigned int timeToSendPassword)
|
106
|
-
: Client()
|
107
|
-
{
|
108
|
-
this->timeToSendUsername = timeToSendUsername;
|
109
|
-
this->timeToSendPassword = timeToSendPassword;
|
110
|
-
}
|
111
|
-
};
|
112
|
-
};
|
113
|
-
|
114
|
-
DEFINE_TEST_GROUP(ApplicationPool_ServerTest);
|
115
|
-
|
116
|
-
TEST_METHOD(1) {
|
117
|
-
// When calling get() with a PoolOptions object,
|
118
|
-
// options.environmentVariables->getItems() isn't called unless
|
119
|
-
// the pool had to spawn something.
|
120
|
-
initializePool();
|
121
|
-
|
122
|
-
shared_ptr<DummyStringListCreator> strList = ptr(new DummyStringListCreator());
|
123
|
-
PoolOptions options("stub/rack");
|
124
|
-
options.appType = "rack";
|
125
|
-
options.environmentVariables = strList;
|
126
|
-
|
127
|
-
SessionPtr session1 = pool->get(options);
|
128
|
-
session1.reset();
|
129
|
-
ensure_equals("(1)", strList->counter, 1);
|
130
|
-
|
131
|
-
session1 = pool->get(options);
|
132
|
-
session1.reset();
|
133
|
-
ensure_equals("(2)", strList->counter, 1);
|
134
|
-
}
|
135
|
-
|
136
|
-
TEST_METHOD(5) {
|
137
|
-
// get() requires GET rights.
|
138
|
-
initializePool();
|
139
|
-
|
140
|
-
try {
|
141
|
-
clientAccount->setRights(Account::SET_PARAMETERS);
|
142
|
-
spawnRackApp();
|
143
|
-
fail("SecurityException expected");
|
144
|
-
} catch (const SecurityException &e) {
|
145
|
-
// Pass.
|
146
|
-
}
|
147
|
-
|
148
|
-
clientAccount->setRights(Account::GET);
|
149
|
-
spawnRackApp(); // Should not throw SecurityException now.
|
150
|
-
}
|
151
|
-
|
152
|
-
TEST_METHOD(6) {
|
153
|
-
// clear() requires CLEAR rights.
|
154
|
-
initializePool();
|
155
|
-
|
156
|
-
try {
|
157
|
-
clientAccount->setRights(Account::SET_PARAMETERS);
|
158
|
-
pool->clear();
|
159
|
-
fail("SecurityException expected");
|
160
|
-
} catch (const SecurityException &e) {
|
161
|
-
// Pass.
|
162
|
-
}
|
163
|
-
|
164
|
-
clientAccount->setRights(Account::CLEAR);
|
165
|
-
pool->clear(); // Should not throw SecurityException now.
|
166
|
-
}
|
167
|
-
|
168
|
-
TEST_METHOD(7) {
|
169
|
-
// setMaxIdleTime() requires SET_PARAMETERS rights.
|
170
|
-
initializePool();
|
171
|
-
|
172
|
-
try {
|
173
|
-
clientAccount->setRights(Account::GET_PARAMETERS);
|
174
|
-
pool->setMaxIdleTime(60);
|
175
|
-
fail("SecurityException expected");
|
176
|
-
} catch (const SecurityException &e) {
|
177
|
-
// Pass.
|
178
|
-
}
|
179
|
-
|
180
|
-
clientAccount->setRights(Account::SET_PARAMETERS);
|
181
|
-
pool->setMaxIdleTime(60); // Should not throw SecurityException now.
|
182
|
-
}
|
183
|
-
|
184
|
-
TEST_METHOD(8) {
|
185
|
-
// setMax() requires SET_PARAMETERS rights.
|
186
|
-
initializePool();
|
187
|
-
|
188
|
-
try {
|
189
|
-
clientAccount->setRights(Account::GET_PARAMETERS);
|
190
|
-
pool->setMax(60);
|
191
|
-
fail("SecurityException expected");
|
192
|
-
} catch (const SecurityException &e) {
|
193
|
-
// Pass.
|
194
|
-
}
|
195
|
-
|
196
|
-
clientAccount->setRights(Account::SET_PARAMETERS);
|
197
|
-
pool->setMax(60); // Should not throw SecurityException now.
|
198
|
-
}
|
199
|
-
|
200
|
-
TEST_METHOD(9) {
|
201
|
-
// getActive() requires GET_PARAMETERS rights.
|
202
|
-
initializePool();
|
203
|
-
|
204
|
-
try {
|
205
|
-
clientAccount->setRights(Account::SET_PARAMETERS);
|
206
|
-
pool->getActive();
|
207
|
-
fail("SecurityException expected");
|
208
|
-
} catch (const SecurityException &e) {
|
209
|
-
// Pass.
|
210
|
-
}
|
211
|
-
|
212
|
-
clientAccount->setRights(Account::GET_PARAMETERS);
|
213
|
-
pool->getActive(); // Should not throw SecurityException now.
|
214
|
-
}
|
215
|
-
|
216
|
-
TEST_METHOD(10) {
|
217
|
-
// getCount() requires GET_PARAMETERS rights.
|
218
|
-
initializePool();
|
219
|
-
|
220
|
-
try {
|
221
|
-
clientAccount->setRights(Account::SET_PARAMETERS);
|
222
|
-
pool->getCount();
|
223
|
-
fail("SecurityException expected");
|
224
|
-
} catch (const SecurityException &e) {
|
225
|
-
// Pass.
|
226
|
-
}
|
227
|
-
|
228
|
-
clientAccount->setRights(Account::GET_PARAMETERS);
|
229
|
-
pool->getCount(); // Should not throw SecurityException now.
|
230
|
-
}
|
231
|
-
|
232
|
-
TEST_METHOD(11) {
|
233
|
-
// setMaxPerApp() requires SET_PARAMETERS rights.
|
234
|
-
initializePool();
|
235
|
-
|
236
|
-
try {
|
237
|
-
clientAccount->setRights(Account::GET_PARAMETERS);
|
238
|
-
pool->setMaxPerApp(2);
|
239
|
-
fail("SecurityException expected");
|
240
|
-
} catch (const SecurityException &e) {
|
241
|
-
// Pass.
|
242
|
-
}
|
243
|
-
|
244
|
-
clientAccount->setRights(Account::SET_PARAMETERS);
|
245
|
-
pool->setMaxPerApp(2); // Should not throw SecurityException now.
|
246
|
-
}
|
247
|
-
|
248
|
-
TEST_METHOD(12) {
|
249
|
-
// getSpawnServerPid() requires GET_PARAMETERS rights.
|
250
|
-
initializePool();
|
251
|
-
|
252
|
-
try {
|
253
|
-
clientAccount->setRights(Account::SET_PARAMETERS);
|
254
|
-
pool->getSpawnServerPid();
|
255
|
-
fail("SecurityException expected");
|
256
|
-
} catch (const SecurityException &e) {
|
257
|
-
// Pass.
|
258
|
-
}
|
259
|
-
|
260
|
-
clientAccount->setRights(Account::GET_PARAMETERS);
|
261
|
-
pool->getSpawnServerPid(); // Should not throw SecurityException now.
|
262
|
-
}
|
263
|
-
|
264
|
-
TEST_METHOD(13) {
|
265
|
-
// inspect() requires INSPECT_BASIC_INFO rights.
|
266
|
-
initializePool();
|
267
|
-
|
268
|
-
try {
|
269
|
-
clientAccount->setRights(Account::SET_PARAMETERS);
|
270
|
-
pool->inspect();
|
271
|
-
fail("SecurityException expected");
|
272
|
-
} catch (const SecurityException &e) {
|
273
|
-
// Pass.
|
274
|
-
}
|
275
|
-
|
276
|
-
clientAccount->setRights(Account::INSPECT_BASIC_INFO);
|
277
|
-
pool->inspect(); // Should not throw SecurityException now.
|
278
|
-
}
|
279
|
-
|
280
|
-
TEST_METHOD(14) {
|
281
|
-
// toXml() requires INSPECT_BASIC_INFO rights.
|
282
|
-
initializePool();
|
283
|
-
|
284
|
-
try {
|
285
|
-
clientAccount->setRights(Account::SET_PARAMETERS);
|
286
|
-
pool->toXml();
|
287
|
-
fail("SecurityException expected");
|
288
|
-
} catch (const SecurityException &e) {
|
289
|
-
// Pass.
|
290
|
-
}
|
291
|
-
|
292
|
-
clientAccount->setRights(Account::INSPECT_BASIC_INFO);
|
293
|
-
pool->toXml(); // Should not throw SecurityException now.
|
294
|
-
}
|
295
|
-
|
296
|
-
TEST_METHOD(15) {
|
297
|
-
// toXml() only prints private information if the client has the INSPECT_SENSITIVE_INFO right.
|
298
|
-
initializePool();
|
299
|
-
PoolOptions options("stub/rack");
|
300
|
-
options.appType = "rack";
|
301
|
-
pool->get(options);
|
302
|
-
|
303
|
-
clientAccount->setRights(Account::INSPECT_BASIC_INFO);
|
304
|
-
ensure("Does not contain private information", pool->toXml().find("<server_sockets>") == string::npos);
|
305
|
-
clientAccount->setRights(Account::INSPECT_BASIC_INFO | Account::INSPECT_SENSITIVE_INFO);
|
306
|
-
ensure("Contains private information", pool->toXml().find("<server_sockets>") != string::npos);
|
307
|
-
}
|
308
|
-
}
|
@@ -1,80 +0,0 @@
|
|
1
|
-
#include "TestSupport.h"
|
2
|
-
|
3
|
-
#include <string>
|
4
|
-
#include <boost/thread.hpp>
|
5
|
-
#include <boost/shared_ptr.hpp>
|
6
|
-
|
7
|
-
#include "ApplicationPool/Pool.h"
|
8
|
-
#include "ApplicationPool/Server.h"
|
9
|
-
#include "ApplicationPool/Client.h"
|
10
|
-
#include "Utils.h"
|
11
|
-
|
12
|
-
using namespace Passenger;
|
13
|
-
using namespace std;
|
14
|
-
using namespace boost;
|
15
|
-
|
16
|
-
namespace tut {
|
17
|
-
struct ApplicationPool_Server_PoolTest {
|
18
|
-
ServerInstanceDirPtr serverInstanceDir;
|
19
|
-
ServerInstanceDir::GenerationPtr generation;
|
20
|
-
AccountsDatabasePtr accountsDatabase;
|
21
|
-
shared_ptr<MessageServer> messageServer;
|
22
|
-
shared_ptr<ApplicationPool::Pool> realPool;
|
23
|
-
shared_ptr<ApplicationPool::Server> poolServer;
|
24
|
-
shared_ptr<ApplicationPool::Client> pool, pool2;
|
25
|
-
shared_ptr<oxt::thread> serverThread;
|
26
|
-
string socketFilename;
|
27
|
-
|
28
|
-
ApplicationPool_Server_PoolTest() {
|
29
|
-
createServerInstanceDirAndGeneration(serverInstanceDir, generation);
|
30
|
-
socketFilename = generation->getPath() + "/socket";
|
31
|
-
accountsDatabase = ptr(new AccountsDatabase());
|
32
|
-
accountsDatabase->add("test", "12345", false);
|
33
|
-
|
34
|
-
messageServer = ptr(new MessageServer(socketFilename, accountsDatabase));
|
35
|
-
realPool = ptr(new ApplicationPool::Pool("../helper-scripts/passenger-spawn-server", generation));
|
36
|
-
poolServer = ptr(new ApplicationPool::Server(realPool));
|
37
|
-
messageServer->addHandler(poolServer);
|
38
|
-
serverThread = ptr(new oxt::thread(
|
39
|
-
boost::bind(&MessageServer::mainLoop, messageServer.get())
|
40
|
-
));
|
41
|
-
pool = newPoolConnection();
|
42
|
-
pool2 = newPoolConnection();
|
43
|
-
}
|
44
|
-
|
45
|
-
~ApplicationPool_Server_PoolTest() {
|
46
|
-
if (serverThread != NULL) {
|
47
|
-
serverThread->interrupt_and_join();
|
48
|
-
}
|
49
|
-
}
|
50
|
-
|
51
|
-
void reinitializeWithSpawnManager(AbstractSpawnManagerPtr spawnManager) {
|
52
|
-
if (serverThread != NULL) {
|
53
|
-
serverThread->interrupt_and_join();
|
54
|
-
}
|
55
|
-
|
56
|
-
messageServer.reset(); // Wait until the previous instance has removed the socket.
|
57
|
-
messageServer = ptr(new MessageServer(socketFilename, accountsDatabase));
|
58
|
-
realPool = ptr(new ApplicationPool::Pool(spawnManager));
|
59
|
-
poolServer = ptr(new ApplicationPool::Server(realPool));
|
60
|
-
messageServer->addHandler(poolServer);
|
61
|
-
serverThread = ptr(new oxt::thread(
|
62
|
-
boost::bind(&MessageServer::mainLoop, messageServer.get())
|
63
|
-
));
|
64
|
-
pool = newPoolConnection();
|
65
|
-
pool2 = newPoolConnection();
|
66
|
-
}
|
67
|
-
|
68
|
-
shared_ptr<ApplicationPool::Client> newPoolConnection() {
|
69
|
-
shared_ptr<ApplicationPool::Client> p(new ApplicationPool::Client());
|
70
|
-
p->connect(socketFilename, "test", "12345");
|
71
|
-
return p;
|
72
|
-
}
|
73
|
-
};
|
74
|
-
|
75
|
-
DEFINE_TEST_GROUP(ApplicationPool_Server_PoolTest);
|
76
|
-
|
77
|
-
#define USE_TEMPLATE
|
78
|
-
#include "ApplicationPool_PoolTestCases.cpp"
|
79
|
-
}
|
80
|
-
|
@@ -1,557 +0,0 @@
|
|
1
|
-
#include "TestSupport.h"
|
2
|
-
#include "MessageChannel.h"
|
3
|
-
|
4
|
-
#include <boost/thread.hpp>
|
5
|
-
#include <boost/bind.hpp>
|
6
|
-
#include <oxt/thread.hpp>
|
7
|
-
#include <utility>
|
8
|
-
|
9
|
-
#include <cstring>
|
10
|
-
#include <cstdio>
|
11
|
-
|
12
|
-
#include <sys/types.h>
|
13
|
-
#include <sys/wait.h>
|
14
|
-
#include <unistd.h>
|
15
|
-
|
16
|
-
using namespace Passenger;
|
17
|
-
using namespace std;
|
18
|
-
using namespace boost;
|
19
|
-
using namespace oxt;
|
20
|
-
|
21
|
-
namespace tut {
|
22
|
-
struct MessageChannelTest {
|
23
|
-
MessageChannel reader, writer;
|
24
|
-
int p[2];
|
25
|
-
|
26
|
-
MessageChannelTest() {
|
27
|
-
if (pipe(p) != 0) {
|
28
|
-
throw SystemException("Cannot create a pipe", errno);
|
29
|
-
}
|
30
|
-
reader = MessageChannel(p[0]);
|
31
|
-
writer = MessageChannel(p[1]);
|
32
|
-
}
|
33
|
-
|
34
|
-
~MessageChannelTest() {
|
35
|
-
reader.close();
|
36
|
-
writer.close();
|
37
|
-
}
|
38
|
-
|
39
|
-
static void writeDataAfterSomeTime(int fd, unsigned int sleepTimeInMsec) {
|
40
|
-
try {
|
41
|
-
syscalls::usleep(sleepTimeInMsec * 1000);
|
42
|
-
syscalls::write(fd, "hi", 2);
|
43
|
-
} catch (const boost::thread_interrupted &) {
|
44
|
-
// Do nothing.
|
45
|
-
}
|
46
|
-
}
|
47
|
-
|
48
|
-
static void writeDataSlowly(int fd, unsigned int bytesToWrite, unsigned int bytesPerSec) {
|
49
|
-
try {
|
50
|
-
for (unsigned i = 0; i < bytesToWrite && !boost::this_thread::interruption_requested(); i++) {
|
51
|
-
syscalls::write(fd, "x", 1);
|
52
|
-
syscalls::usleep(1000000 / bytesPerSec);
|
53
|
-
}
|
54
|
-
} catch (const boost::thread_interrupted &) {
|
55
|
-
// Do nothing.
|
56
|
-
}
|
57
|
-
}
|
58
|
-
};
|
59
|
-
|
60
|
-
DEFINE_TEST_GROUP(MessageChannelTest);
|
61
|
-
|
62
|
-
TEST_METHOD(1) {
|
63
|
-
// read() should be able to parse a message constructed by write(name, ...).
|
64
|
-
vector<string> args;
|
65
|
-
|
66
|
-
writer.write("hello", "world", "!", NULL);
|
67
|
-
ensure("End of file has not been reached", reader.read(args));
|
68
|
-
ensure_equals("read() returns the same number of arguments as passed to write()", args.size(), 3u);
|
69
|
-
ensure_equals(args[0], "hello");
|
70
|
-
ensure_equals(args[1], "world");
|
71
|
-
ensure_equals(args[2], "!");
|
72
|
-
}
|
73
|
-
|
74
|
-
TEST_METHOD(2) {
|
75
|
-
// read() should be able to parse a message constructed by write(list).
|
76
|
-
list<string> input;
|
77
|
-
vector<string> output;
|
78
|
-
|
79
|
-
input.push_back("hello");
|
80
|
-
input.push_back("world");
|
81
|
-
input.push_back("!");
|
82
|
-
writer.write(input);
|
83
|
-
ensure("End of file has not been reached", reader.read(output));
|
84
|
-
ensure_equals("read() returns the same number of arguments as passed to write()", input.size(), output.size());
|
85
|
-
|
86
|
-
list<string>::const_iterator it;
|
87
|
-
vector<string>::const_iterator it2;
|
88
|
-
for (it = input.begin(), it2 = output.begin(); it != input.end(); it++, it2++) {
|
89
|
-
ensure_equals(*it, *it2);
|
90
|
-
}
|
91
|
-
}
|
92
|
-
|
93
|
-
TEST_METHOD(3) {
|
94
|
-
// write() should be able to properly serialize arguments that contain whitespace.
|
95
|
-
vector<string> args;
|
96
|
-
writer.write("hello", "world with whitespaces", "!!!", NULL);
|
97
|
-
ensure("End of file has not been reached", reader.read(args));
|
98
|
-
ensure_equals(args[1], "world with whitespaces");
|
99
|
-
}
|
100
|
-
|
101
|
-
TEST_METHOD(4) {
|
102
|
-
// read() should be able to read messages constructed by the Ruby implementation.
|
103
|
-
// write() should be able to construct messages that can be read by the Ruby implementation.
|
104
|
-
// Multiple read() and write() calls should work (i.e. the MessageChannel should have stream properties).
|
105
|
-
// End of file should be properly detected.
|
106
|
-
int p1[2], p2[2];
|
107
|
-
pid_t pid;
|
108
|
-
|
109
|
-
pipe(p1);
|
110
|
-
pipe(p2);
|
111
|
-
pid = fork();
|
112
|
-
if (pid == 0) {
|
113
|
-
close(p[0]);
|
114
|
-
close(p[1]);
|
115
|
-
dup2(p1[0], 0);
|
116
|
-
dup2(p2[1], 1);
|
117
|
-
close(p1[0]);
|
118
|
-
close(p1[1]);
|
119
|
-
close(p2[0]);
|
120
|
-
close(p2[1]);
|
121
|
-
execlp("ruby", "ruby", "./stub/message_channel.rb", (char *) 0);
|
122
|
-
perror("Cannot execute ruby");
|
123
|
-
_exit(1);
|
124
|
-
} else {
|
125
|
-
MessageChannel input(p1[1]);
|
126
|
-
MessageChannel output(p2[0]);
|
127
|
-
close(p1[0]);
|
128
|
-
close(p2[1]);
|
129
|
-
|
130
|
-
input.write("hello", "my beautiful", "world", NULL);
|
131
|
-
input.write("you have", "not enough", "minerals", NULL);
|
132
|
-
input.close();
|
133
|
-
|
134
|
-
vector<string> message1, message2, message3;
|
135
|
-
ensure("End of stream has not been reached (1)", output.read(message1));
|
136
|
-
ensure("End of stream has not been reached (2)", output.read(message2));
|
137
|
-
ensure("End of file has been reached", !output.read(message3));
|
138
|
-
output.close();
|
139
|
-
waitpid(pid, NULL, 0);
|
140
|
-
|
141
|
-
ensure_equals("First message is correctly transformed by the mock object",
|
142
|
-
message1.size(), 4u);
|
143
|
-
ensure_equals(message1[0], "hello");
|
144
|
-
ensure_equals(message1[1], "my beautiful");
|
145
|
-
ensure_equals(message1[2], "world");
|
146
|
-
ensure_equals(message1[3], "!!");
|
147
|
-
|
148
|
-
ensure_equals("Second message is correctly transformed by the mock object",
|
149
|
-
message2.size(), 4u);
|
150
|
-
ensure_equals(message2[0], "you have");
|
151
|
-
ensure_equals(message2[1], "not enough");
|
152
|
-
ensure_equals(message2[2], "minerals");
|
153
|
-
ensure_equals(message2[3], "??");
|
154
|
-
}
|
155
|
-
}
|
156
|
-
|
157
|
-
TEST_METHOD(6) {
|
158
|
-
// write(name) should generate a correct message even if there are no additional arguments.
|
159
|
-
writer.write("hello", NULL);
|
160
|
-
vector<string> args;
|
161
|
-
reader.read(args);
|
162
|
-
ensure_equals(args.size(), 1u);
|
163
|
-
ensure_equals(args[0], "hello");
|
164
|
-
}
|
165
|
-
|
166
|
-
TEST_METHOD(7) {
|
167
|
-
// writeFileDescriptor() and receiveFileDescriptor() should work.
|
168
|
-
int s[2], my_pipe[2], fd;
|
169
|
-
socketpair(AF_UNIX, SOCK_STREAM, 0, s);
|
170
|
-
MessageChannel channel1(s[0]);
|
171
|
-
MessageChannel channel2(s[1]);
|
172
|
-
|
173
|
-
pipe(my_pipe);
|
174
|
-
boost::thread thr(bind(
|
175
|
-
&MessageChannel::writeFileDescriptor,
|
176
|
-
&channel1,
|
177
|
-
my_pipe[1],
|
178
|
-
true
|
179
|
-
));
|
180
|
-
fd = channel2.readFileDescriptor();
|
181
|
-
thr.join();
|
182
|
-
|
183
|
-
char buf[5];
|
184
|
-
write(fd, "hello", 5);
|
185
|
-
close(fd);
|
186
|
-
read(my_pipe[0], buf, 5);
|
187
|
-
ensure(memcmp(buf, "hello", 5) == 0);
|
188
|
-
|
189
|
-
close(s[0]);
|
190
|
-
close(s[1]);
|
191
|
-
close(my_pipe[0]);
|
192
|
-
close(my_pipe[1]);
|
193
|
-
}
|
194
|
-
|
195
|
-
TEST_METHOD(8) {
|
196
|
-
// write() should be able to construct a message that consists of only an empty string.
|
197
|
-
// read() should be able to read a message that consists of only an empty string.
|
198
|
-
vector<string> args;
|
199
|
-
|
200
|
-
writer.write("", NULL);
|
201
|
-
reader.read(args);
|
202
|
-
ensure_equals(args.size(), 1u);
|
203
|
-
ensure_equals(args[0], "");
|
204
|
-
}
|
205
|
-
|
206
|
-
TEST_METHOD(9) {
|
207
|
-
// readScalar() should be able to read messages constructed by writeScalar().
|
208
|
-
// This also tests readExact()/writeExact() because readScalar()/writeScalar() uses
|
209
|
-
// them internally.
|
210
|
-
writer.writeScalar("hello\n\r world!!!");
|
211
|
-
writer.writeScalar(" and this is a second message");
|
212
|
-
|
213
|
-
string output;
|
214
|
-
ensure("End of stream has not been reached (1)", reader.readScalar(output));
|
215
|
-
ensure_equals(output, "hello\n\r world!!!");
|
216
|
-
|
217
|
-
ensure("End of stream has not been reached (2)", reader.readScalar(output));
|
218
|
-
ensure_equals(output, " and this is a second message");
|
219
|
-
}
|
220
|
-
|
221
|
-
TEST_METHOD(10) {
|
222
|
-
// writeScalar() should be able to produce messages that are compatible with the Ruby implementation.
|
223
|
-
// readScalar() should be able to read messages produced by the Ruby implementation.
|
224
|
-
int p1[2], p2[2];
|
225
|
-
pid_t pid;
|
226
|
-
|
227
|
-
pipe(p1);
|
228
|
-
pipe(p2);
|
229
|
-
pid = fork();
|
230
|
-
if (pid == 0) {
|
231
|
-
close(p[0]);
|
232
|
-
close(p[1]);
|
233
|
-
dup2(p1[0], 0);
|
234
|
-
dup2(p2[1], 1);
|
235
|
-
close(p1[0]);
|
236
|
-
close(p1[1]);
|
237
|
-
close(p2[0]);
|
238
|
-
close(p2[1]);
|
239
|
-
execlp("ruby", "ruby", "./stub/message_channel_2.rb", (void *) 0);
|
240
|
-
perror("Cannot execute ruby");
|
241
|
-
_exit(1);
|
242
|
-
} else {
|
243
|
-
MessageChannel reader(p2[0]);
|
244
|
-
MessageChannel writer(p1[1]);
|
245
|
-
string output;
|
246
|
-
close(p1[0]);
|
247
|
-
close(p2[1]);
|
248
|
-
|
249
|
-
writer.writeScalar("hello world\n!\r!");
|
250
|
-
ensure("End of file has not yet been reached (1)", reader.readScalar(output));
|
251
|
-
ensure_equals(output, "hello world\n!\r!!!");
|
252
|
-
|
253
|
-
writer.writeScalar("");
|
254
|
-
ensure("End of file has not yet been reached (2)", reader.readScalar(output));
|
255
|
-
ensure_equals(output, "??");
|
256
|
-
writer.close();
|
257
|
-
|
258
|
-
ensure("End of file has been reached", !reader.readScalar(output));
|
259
|
-
reader.close();
|
260
|
-
waitpid(pid, NULL, 0);
|
261
|
-
}
|
262
|
-
}
|
263
|
-
|
264
|
-
TEST_METHOD(11) {
|
265
|
-
// If we send a lot of different messages (including file descriptor passing),
|
266
|
-
// and the other side sends the same stuff back to us, then MessageChannel
|
267
|
-
// should be able to read them all, if done in the correct order.
|
268
|
-
// writeScalar() should be able to produce messages that are compatible with the Ruby implementation.
|
269
|
-
// readScalar() should be able to read messages produced by the Ruby implementation.
|
270
|
-
int fd[2];
|
271
|
-
pid_t pid;
|
272
|
-
|
273
|
-
socketpair(AF_UNIX, SOCK_STREAM, 0, fd);
|
274
|
-
pid = fork();
|
275
|
-
if (pid == 0) {
|
276
|
-
close(p[0]);
|
277
|
-
close(p[1]);
|
278
|
-
dup2(fd[0], 3);
|
279
|
-
close(fd[0]);
|
280
|
-
close(fd[1]);
|
281
|
-
execlp("ruby", "ruby", "./stub/message_channel_3.rb", (void *) 0);
|
282
|
-
perror("Cannot execute ruby");
|
283
|
-
_exit(1);
|
284
|
-
} else {
|
285
|
-
MessageChannel channel(fd[1]);
|
286
|
-
close(fd[0]);
|
287
|
-
|
288
|
-
vector<string> args;
|
289
|
-
string output;
|
290
|
-
int tmp[2];
|
291
|
-
|
292
|
-
channel.write("hello ", "my!", "world", NULL);
|
293
|
-
ensure("End of file has not yet been reached", channel.read(args));
|
294
|
-
ensure_equals(args.size(), 3u);
|
295
|
-
ensure_equals(args[0], "hello ");
|
296
|
-
ensure_equals(args[1], "my!");
|
297
|
-
ensure_equals(args[2], "world");
|
298
|
-
|
299
|
-
channel.writeScalar("testing 123");
|
300
|
-
ensure("End of file has not yet been reached", channel.readScalar(output));
|
301
|
-
ensure_equals(output, "testing 123");
|
302
|
-
|
303
|
-
pipe(tmp);
|
304
|
-
close(tmp[0]);
|
305
|
-
channel.writeFileDescriptor(tmp[1]);
|
306
|
-
close(tmp[1]);
|
307
|
-
int x = channel.readFileDescriptor();
|
308
|
-
close(x);
|
309
|
-
|
310
|
-
channel.write("the end", NULL);
|
311
|
-
ensure("End of file has not yet been reached", channel.read(args));
|
312
|
-
ensure_equals(args.size(), 1u);
|
313
|
-
ensure_equals(args[0], "the end");
|
314
|
-
|
315
|
-
ensure("End of file has been reached", !channel.read(args));
|
316
|
-
channel.close();
|
317
|
-
waitpid(pid, NULL, 0);
|
318
|
-
}
|
319
|
-
}
|
320
|
-
|
321
|
-
TEST_METHOD(12) {
|
322
|
-
// readScalar()/writeScalar() should be able to handle arbitrary binary data.
|
323
|
-
string data;
|
324
|
-
FILE *f = fopen("stub/garbage3.dat", "r");
|
325
|
-
while (!feof(f)) {
|
326
|
-
char buf[1024 * 32];
|
327
|
-
size_t ret = fread(buf, 1, sizeof(buf), f);
|
328
|
-
data.append(buf, ret);
|
329
|
-
}
|
330
|
-
fclose(f);
|
331
|
-
|
332
|
-
pid_t pid = fork();
|
333
|
-
if (pid == 0) {
|
334
|
-
reader.close();
|
335
|
-
writer.writeScalar(data);
|
336
|
-
_exit(0);
|
337
|
-
} else {
|
338
|
-
writer.close();
|
339
|
-
string result;
|
340
|
-
reader.readScalar(result);
|
341
|
-
ensure_equals(result, data);
|
342
|
-
waitpid(pid, NULL, 0);
|
343
|
-
}
|
344
|
-
}
|
345
|
-
|
346
|
-
TEST_METHOD(13) {
|
347
|
-
// Test connected(), fileno() and close().
|
348
|
-
int fd[2];
|
349
|
-
pipe(fd);
|
350
|
-
close(fd[1]);
|
351
|
-
|
352
|
-
MessageChannel channel(fd[0]);
|
353
|
-
ensure(channel.connected());
|
354
|
-
ensure_equals(channel.filenum(), fd[0]);
|
355
|
-
|
356
|
-
channel.close();
|
357
|
-
ensure_equals(channel.filenum(), -1);
|
358
|
-
ensure(!channel.connected());
|
359
|
-
}
|
360
|
-
|
361
|
-
TEST_METHOD(14) {
|
362
|
-
// close() sets the file descriptor to -1 even if closing failed.
|
363
|
-
int fd[2];
|
364
|
-
pipe(fd);
|
365
|
-
close(fd[0]);
|
366
|
-
close(fd[1]);
|
367
|
-
|
368
|
-
MessageChannel channel(fd[0]);
|
369
|
-
bool gotException;
|
370
|
-
try {
|
371
|
-
channel.close();
|
372
|
-
gotException = false;
|
373
|
-
} catch (...) {
|
374
|
-
gotException = true;
|
375
|
-
}
|
376
|
-
if (!gotException) {
|
377
|
-
fail("close() should have failed");
|
378
|
-
}
|
379
|
-
ensure_equals(channel.filenum(), -1);
|
380
|
-
ensure(!channel.connected());
|
381
|
-
}
|
382
|
-
|
383
|
-
TEST_METHOD(25) {
|
384
|
-
// readScalar() doesn't throw SecurityException if maxSize is
|
385
|
-
// given but the available amount of data equals maxSize.
|
386
|
-
string str;
|
387
|
-
writer.writeScalar("hello");
|
388
|
-
reader.readScalar(str, 5);
|
389
|
-
}
|
390
|
-
|
391
|
-
TEST_METHOD(26) {
|
392
|
-
// readScalar() throws SecurityException if there's too much data to read.
|
393
|
-
string str;
|
394
|
-
|
395
|
-
writer.writeScalar("hello");
|
396
|
-
try {
|
397
|
-
reader.readScalar(str, 4);
|
398
|
-
fail("SecurityException expected");
|
399
|
-
} catch (const SecurityException &) {
|
400
|
-
// Pass.
|
401
|
-
}
|
402
|
-
}
|
403
|
-
|
404
|
-
TEST_METHOD(27) {
|
405
|
-
// readScalar() throws TimeoutException if no data was received within the timeout.
|
406
|
-
unsigned long long timeout = 30;
|
407
|
-
string str;
|
408
|
-
try {
|
409
|
-
reader.readScalar(str, 0, &timeout);
|
410
|
-
fail("TimeoutException expected");
|
411
|
-
} catch (const TimeoutException &) {
|
412
|
-
ensure("The passed time is deducted from timeout", timeout < 5);
|
413
|
-
}
|
414
|
-
}
|
415
|
-
|
416
|
-
TEST_METHOD(28) {
|
417
|
-
// readScalar() throws TimeoutException if not enough header data was received
|
418
|
-
// within the timeout.
|
419
|
-
unsigned long long timeout = 30;
|
420
|
-
string str;
|
421
|
-
writeExact(writer.filenum(), "xxx", 3); // A part of a random 32-bit integer header.
|
422
|
-
try {
|
423
|
-
reader.readScalar(str, 0, &timeout);
|
424
|
-
fail("TimeoutException expected");
|
425
|
-
} catch (const TimeoutException &) {
|
426
|
-
ensure("The passed time is deducted from timeout", timeout < 5);
|
427
|
-
}
|
428
|
-
}
|
429
|
-
|
430
|
-
TEST_METHOD(29) {
|
431
|
-
// readScalar() throws TimeoutException if the header data was received but no
|
432
|
-
// body data was received within the timeout.
|
433
|
-
unsigned long long timeout = 30;
|
434
|
-
string str;
|
435
|
-
writer.writeUint32(1024); // Dummy header.
|
436
|
-
try {
|
437
|
-
reader.readScalar(str, 0, &timeout);
|
438
|
-
fail("TimeoutException expected");
|
439
|
-
} catch (const TimeoutException &) {
|
440
|
-
ensure("The passed time is deducted from timeout", timeout < 5);
|
441
|
-
}
|
442
|
-
}
|
443
|
-
|
444
|
-
TEST_METHOD(30) {
|
445
|
-
// readScalar() throws TimeoutException if the header data was received but not
|
446
|
-
// enough body data was received within the timeout.
|
447
|
-
string str;
|
448
|
-
writer.writeUint32(1024); // Dummy header.
|
449
|
-
|
450
|
-
// Write a dummy body at 100 bytes per sec, or 1 byte every 10 msec.
|
451
|
-
// Takes 10 seconds.
|
452
|
-
TempThread thr(boost::bind(&writeDataSlowly, writer.filenum(), 1000, 100));
|
453
|
-
|
454
|
-
unsigned long long timeout = 35;
|
455
|
-
Timer timer;
|
456
|
-
try {
|
457
|
-
reader.readScalar(str, 0, &timeout);
|
458
|
-
fail("TimeoutException expected");
|
459
|
-
} catch (const TimeoutException &) {
|
460
|
-
unsigned long long elapsed = timer.elapsed();
|
461
|
-
ensure("Spent at least 35 msec waiting", elapsed >= 34);
|
462
|
-
ensure("Spent at most 60 msec waiting", elapsed <= 60);
|
463
|
-
ensure("The passed time is deducted from timeout", timeout < 5);
|
464
|
-
}
|
465
|
-
}
|
466
|
-
|
467
|
-
TEST_METHOD(31) {
|
468
|
-
// readScalar() returns if enough data was received within the specified timeout.
|
469
|
-
string str;
|
470
|
-
unsigned long long timeout = 1000;
|
471
|
-
|
472
|
-
writer.writeUint32(250);
|
473
|
-
TempThread thr(boost::bind(&writeDataSlowly, writer.filenum(), 250, 1000));
|
474
|
-
|
475
|
-
reader.readScalar(str, 0, &timeout);
|
476
|
-
ensure("Spent at least 250 msec waiting", timeout <= 1000 - 250);
|
477
|
-
ensure("Spent at most 500 msec waiting", timeout >= 1000 - 500);
|
478
|
-
}
|
479
|
-
|
480
|
-
TEST_METHOD(32) {
|
481
|
-
// Test readUint32() and writeUint32().
|
482
|
-
writer.writeUint32(0);
|
483
|
-
writer.writeUint32(1);
|
484
|
-
writer.writeUint32(1024);
|
485
|
-
writer.writeUint32(3000000000u);
|
486
|
-
|
487
|
-
unsigned int i;
|
488
|
-
ensure(reader.readUint32(i));
|
489
|
-
ensure_equals(i, 0u);
|
490
|
-
ensure(reader.readUint32(i));
|
491
|
-
ensure_equals(i, 1u);
|
492
|
-
ensure(reader.readUint32(i));
|
493
|
-
ensure_equals(i, 1024u);
|
494
|
-
ensure(reader.readUint32(i));
|
495
|
-
ensure_equals(i, 3000000000u);
|
496
|
-
}
|
497
|
-
|
498
|
-
TEST_METHOD(33) {
|
499
|
-
// readUint32() returns false if EOF was reached prematurely.
|
500
|
-
writeExact(writer.filenum(), "x", 1);
|
501
|
-
writer.close();
|
502
|
-
unsigned int i;
|
503
|
-
ensure(!reader.readUint32(i));
|
504
|
-
}
|
505
|
-
|
506
|
-
TEST_METHOD(34) {
|
507
|
-
// readUint32() throws TimeoutException if no data was available within the timeout.
|
508
|
-
unsigned long long timeout = 30;
|
509
|
-
unsigned int i;
|
510
|
-
try {
|
511
|
-
reader.readUint32(i, &timeout);
|
512
|
-
fail("TimeoutException expected");
|
513
|
-
} catch (const TimeoutException &) {
|
514
|
-
ensure("The spent time is deducted from timeout", timeout < 5);
|
515
|
-
}
|
516
|
-
}
|
517
|
-
|
518
|
-
TEST_METHOD(35) {
|
519
|
-
// readUint32() throws TimeoutException if not enough data was available within the timeout.
|
520
|
-
unsigned long long timeout = 30;
|
521
|
-
unsigned int i;
|
522
|
-
writeExact(writer.filenum(), "xx", 2);
|
523
|
-
try {
|
524
|
-
reader.readUint32(i, &timeout);
|
525
|
-
fail("TimeoutException expected");
|
526
|
-
} catch (const TimeoutException &e) {
|
527
|
-
ensure("The spent time is deducted from timeout", timeout < 5);
|
528
|
-
}
|
529
|
-
}
|
530
|
-
|
531
|
-
TEST_METHOD(36) {
|
532
|
-
// readUint32() throws TimeoutException if timeout is 0 and no data
|
533
|
-
// is immediately available.
|
534
|
-
unsigned long long timeout = 0;
|
535
|
-
unsigned int i;
|
536
|
-
try {
|
537
|
-
reader.readUint32(i, &timeout);
|
538
|
-
fail("TimeoutException expected");
|
539
|
-
} catch (const TimeoutException &) {
|
540
|
-
ensure_equals("Timeout is unchanged", timeout, 0u);
|
541
|
-
}
|
542
|
-
}
|
543
|
-
|
544
|
-
TEST_METHOD(37) {
|
545
|
-
// readUint32() throws TimeoutException if timeout is 0 and not enough
|
546
|
-
// data is immediately available.
|
547
|
-
unsigned long long timeout = 0;
|
548
|
-
unsigned int i;
|
549
|
-
writeExact(writer.filenum(), "xx", 2);
|
550
|
-
try {
|
551
|
-
reader.readUint32(i, &timeout);
|
552
|
-
fail("TimeoutException expected");
|
553
|
-
} catch (const TimeoutException &e) {
|
554
|
-
ensure_equals("Timeout unchanged", timeout, 0u);
|
555
|
-
}
|
556
|
-
}
|
557
|
-
}
|