Sipper 1.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/sipper/README.rb +26 -0
- data/sipper/b2bua_controller.rb +163 -0
- data/sipper/b2bua_session_mixin.rb +24 -0
- data/sipper/base_controller.rb +425 -0
- data/sipper/bin/common.rb +42 -0
- data/sipper/bin/generate.rb +70 -0
- data/sipper/bin/project.rb +44 -0
- data/sipper/bin/run.rb +85 -0
- data/sipper/bin/run_smoke.rb +8 -0
- data/sipper/config/log4r.xml +71 -0
- data/sipper/controller_class_loader.rb +29 -0
- data/sipper/controller_selector.rb +119 -0
- data/sipper/controllers/invite_controller.rb +30 -0
- data/sipper/controllers/order.yaml +3 -0
- data/sipper/custom_message.rb +4 -0
- data/sipper/detached_session.rb +11 -0
- data/sipper/docs/manual.txt +1621 -0
- data/sipper/generators/README +12 -0
- data/sipper/generators/gen_controller.rb +228 -0
- data/sipper/generators/gen_project.rb +45 -0
- data/sipper/generators/gen_test.rb +72 -0
- data/sipper/generators/project_template_dir/Rakefile +56 -0
- data/sipper/generators/project_template_dir/config/sipper.cfg +31 -0
- data/sipper/generators/project_template_dir/controllers/README.txt +2 -0
- data/sipper/generators/project_template_dir/dot_sipper.proj +2 -0
- data/sipper/generators/project_template_dir/logs/README.txt +2 -0
- data/sipper/generators/project_template_dir/tests/README.txt +2 -0
- data/sipper/lib/smc/statemap.rb +194 -0
- data/sipper/logs/dialog_info_store +0 -0
- data/sipper/logs/r.cmd +6 -0
- data/sipper/logs/r.sh +6 -0
- data/sipper/media/sipper_media_client.rb +268 -0
- data/sipper/media/sipper_media_event.rb +43 -0
- data/sipper/media/sipper_media_manager.rb +145 -0
- data/sipper/media/sipper_media_proxy.rb +60 -0
- data/sipper/media/sipper_offer_answer.rb +285 -0
- data/sipper/message.rb +512 -0
- data/sipper/modified_pattern_formatter.rb +119 -0
- data/sipper/proxy_controller.rb +143 -0
- data/sipper/registration.rb +52 -0
- data/sipper/request.rb +109 -0
- data/sipper/response.rb +123 -0
- data/sipper/ruby_ext/module.rb +27 -0
- data/sipper/ruby_ext/mutable_class.rb +17 -0
- data/sipper/ruby_ext/object.rb +38 -0
- data/sipper/ruby_ext/pqueue.rb +190 -0
- data/sipper/ruby_ext/snapshot.rb +201 -0
- data/sipper/ruby_ext/string.rb +18 -0
- data/sipper/ruby_ext/time.rb +9 -0
- data/sipper/run/run_sipper1.rb +28 -0
- data/sipper/run/run_sipper2.rb +56 -0
- data/sipper/sdp/sdp.rb +257 -0
- data/sipper/sdp/sdp_generator.rb +131 -0
- data/sipper/sdp/sdp_parser.rb +136 -0
- data/sipper/session.rb +1952 -0
- data/sipper/session_manager.rb +170 -0
- data/sipper/session_recorder.rb +190 -0
- data/sipper/session_state/DialogState.sm +54 -0
- data/sipper/session_state/DialogState_sm.rb +337 -0
- data/sipper/session_state/dialog_routes.rb +141 -0
- data/sipper/sip_headers/header.rb +632 -0
- data/sipper/sip_headers/sipuri.rb +352 -0
- data/sipper/sip_logger.rb +65 -0
- data/sipper/sip_message_router.rb +231 -0
- data/sipper/sip_test_driver_controller.rb +10 -0
- data/sipper/sipper.rb +329 -0
- data/sipper/sipper_assertions.rb +21 -0
- data/sipper/sipper_configurator.rb +376 -0
- data/sipper/sipper_http/sipper_http_request_dispatcher.rb +71 -0
- data/sipper/sipper_http/sipper_http_response.rb +25 -0
- data/sipper/stray_message_manager.rb +40 -0
- data/sipper/test_completion_signaling_helper.rb +77 -0
- data/sipper/transaction/Ict.sm +59 -0
- data/sipper/transaction/Ict_sm.rb +430 -0
- data/sipper/transaction/Ist.sm +74 -0
- data/sipper/transaction/Ist_sm.rb +460 -0
- data/sipper/transaction/Nict.sm +51 -0
- data/sipper/transaction/Nict_sm.rb +325 -0
- data/sipper/transaction/Nist.sm +59 -0
- data/sipper/transaction/Nist_sm.rb +356 -0
- data/sipper/transaction/invite_client_transaction.rb +274 -0
- data/sipper/transaction/invite_server_transaction.rb +319 -0
- data/sipper/transaction/non_invite_client_transaction.rb +230 -0
- data/sipper/transaction/non_invite_server_transaction.rb +263 -0
- data/sipper/transaction/state_machine_wrapper.rb +58 -0
- data/sipper/transaction/transaction.rb +212 -0
- data/sipper/transport/base_transport.rb +84 -0
- data/sipper/transport/rel_unrel.rb +19 -0
- data/sipper/transport/transport_and_route_resolver.rb +67 -0
- data/sipper/transport/udp_transport.rb +156 -0
- data/sipper/transport_manager.rb +33 -0
- data/sipper/udp_session.rb +17 -0
- data/sipper/util/command_element.rb +62 -0
- data/sipper/util/compact_converter.rb +50 -0
- data/sipper/util/counter.rb +26 -0
- data/sipper/util/digest/digest_authorizer.rb +204 -0
- data/sipper/util/expectation_parser.rb +164 -0
- data/sipper/util/locator.rb +31 -0
- data/sipper/util/message_fill.rb +58 -0
- data/sipper/util/persistence/ps_sipper_map.rb +63 -0
- data/sipper/util/persistence/sipper_map.rb +41 -0
- data/sipper/util/sipper_util.rb +305 -0
- data/sipper/util/timer/sip_timer_helper.rb +26 -0
- data/sipper/util/timer/timer_manager.rb +80 -0
- data/sipper/util/timer/timer_task.rb +56 -0
- data/sipper/util/validations.rb +44 -0
- data/sipper/version.rb +10 -0
- data/sipper_test/_test_media_uas.rb +79 -0
- data/sipper_test/base_test_case.rb +31 -0
- data/sipper_test/c_134.txt +7 -0
- data/sipper_test/driven_sip_test_case.rb +96 -0
- data/sipper_test/gold.txt +10 -0
- data/sipper_test/gold_res.txt +8 -0
- data/sipper_test/gold_sub.txt +9 -0
- data/sipper_test/hello_sipper.au +0 -0
- data/sipper_test/in_sipper.au +0 -0
- data/sipper_test/nonrr_proxy.rb +17 -0
- data/sipper_test/order_tests.yaml +4 -0
- data/sipper_test/rake_res.txt +399 -0
- data/sipper_test/rr_proxy.rb +17 -0
- data/sipper_test/run_test.cmd +94 -0
- data/sipper_test/sip_test_case.rb +104 -0
- data/sipper_test/test2xx_retransmission.rb +80 -0
- data/sipper_test/test2xx_retransmission_with_limit.rb +81 -0
- data/sipper_test/test2xx_retransmission_with_nist.rb +91 -0
- data/sipper_test/test2xx_retransmission_with_txns.rb +94 -0
- data/sipper_test/test_address_header.rb +66 -0
- data/sipper_test/test_b2bua1.rb +130 -0
- data/sipper_test/test_b2bua2.rb +120 -0
- data/sipper_test/test_b2bua3.rb +160 -0
- data/sipper_test/test_b2bua4.rb +130 -0
- data/sipper_test/test_base_controller.rb +110 -0
- data/sipper_test/test_base_transport.rb +37 -0
- data/sipper_test/test_cancel.rb +21 -0
- data/sipper_test/test_cancel_after2xx.rb +81 -0
- data/sipper_test/test_cancel_retransmission.rb +105 -0
- data/sipper_test/test_cancel_with481.rb +83 -0
- data/sipper_test/test_cancel_with487.rb +70 -0
- data/sipper_test/test_cancel_with_ist_without_nist.rb +99 -0
- data/sipper_test/test_cancel_with_nist.rb +84 -0
- data/sipper_test/test_cancel_without487.rb +77 -0
- data/sipper_test/test_command_element.rb +38 -0
- data/sipper_test/test_compact_converter.rb +33 -0
- data/sipper_test/test_controller_class_loader.rb +37 -0
- data/sipper_test/test_controller_selector.rb +53 -0
- data/sipper_test/test_controller_using_compact_headers.rb +74 -0
- data/sipper_test/test_controller_using_header_order.rb +85 -0
- data/sipper_test/test_controller_using_ict.rb +64 -0
- data/sipper_test/test_controller_using_ict_with_non_success.rb +72 -0
- data/sipper_test/test_controller_using_ict_with_tcbh.rb +24 -0
- data/sipper_test/test_controller_using_ict_with_tcbh_no_action.rb +24 -0
- data/sipper_test/test_controller_using_ist.rb +70 -0
- data/sipper_test/test_controller_using_ist_with_tcbh.rb +24 -0
- data/sipper_test/test_controller_using_nict.rb +115 -0
- data/sipper_test/test_controller_using_nict_with_tcbh.rb +24 -0
- data/sipper_test/test_controller_using_nist.rb +63 -0
- data/sipper_test/test_controller_using_pre_existing_rs0.rb +73 -0
- data/sipper_test/test_controller_using_pre_existing_rs1.rb +75 -0
- data/sipper_test/test_controller_using_pre_existing_rs2.rb +71 -0
- data/sipper_test/test_controller_using_route_set.rb +86 -0
- data/sipper_test/test_controller_with_sdp.rb +80 -0
- data/sipper_test/test_controllers/cancel/order.yaml +2 -0
- data/sipper_test/test_controllers/cancel/uac_cancel_controller.rb +35 -0
- data/sipper_test/test_controllers/cancel/uas_cancel_controller.rb +25 -0
- data/sipper_test/test_controllers/class_loading/ordered/first_ordered_controller.rb +5 -0
- data/sipper_test/test_controllers/class_loading/ordered/order.yaml +3 -0
- data/sipper_test/test_controllers/class_loading/ordered/recond_ordered_controller.rb +6 -0
- data/sipper_test/test_controllers/class_loading/ordered/second_ordered_controller.rb +6 -0
- data/sipper_test/test_controllers/class_loading/unordered/first_unordered_controller.rb +7 -0
- data/sipper_test/test_controllers/class_loading/unordered/second_unordered_controller.rb +6 -0
- data/sipper_test/test_controllers/ctrl_trhandler/lib/transport_filters/my_transport_handler.rb +22 -0
- data/sipper_test/test_controllers/ctrl_trhandler/uac_tr_handler_controller.rb +27 -0
- data/sipper_test/test_controllers/ctrl_trhandler/uas_tr_handler_controller.rb +21 -0
- data/sipper_test/test_controllers/ete/order.yaml +1 -0
- data/sipper_test/test_controllers/ete/uac_controller.rb +39 -0
- data/sipper_test/test_controllers/ete/uas_controller.rb +34 -0
- data/sipper_test/test_controllers/extensions/extension_uac_controller.rb +24 -0
- data/sipper_test/test_controllers/extensions/extension_uas_controller.rb +35 -0
- data/sipper_test/test_controllers/extensions/lib/sipper_extensions/my_from_extension.rb +16 -0
- data/sipper_test/test_controllers/ict_tcbh/lib/transaction_handlers/app_ict_handler.rb +23 -0
- data/sipper_test/test_controllers/ict_tcbh/uac_ict_tcbh_controller.rb +27 -0
- data/sipper_test/test_controllers/ict_tcbh/uac_ict_tcbh_no_action_controller.rb +28 -0
- data/sipper_test/test_controllers/ict_tcbh/uas_ict_tcbh_controller.rb +29 -0
- data/sipper_test/test_controllers/ict_tcbh/uas_ict_tcbh_no_action_controller.rb +31 -0
- data/sipper_test/test_controllers/ist_tcbh/lib/app_ist_handler.rb +13 -0
- data/sipper_test/test_controllers/ist_tcbh/uac_ist_tcbh_controller.rb +22 -0
- data/sipper_test/test_controllers/ist_tcbh/uas_ist_tcbh_controller.rb +31 -0
- data/sipper_test/test_controllers/multi_trhandlers/lib/transport_filters/in_order.yaml +2 -0
- data/sipper_test/test_controllers/multi_trhandlers/lib/transport_filters/my_transport_handler1.rb +21 -0
- data/sipper_test/test_controllers/multi_trhandlers/lib/transport_filters/my_transport_handler2.rb +21 -0
- data/sipper_test/test_controllers/multi_trhandlers/lib/transport_filters/out_order.yaml +2 -0
- data/sipper_test/test_controllers/multi_trhandlers/uac_multi_tr_handler_controller.rb +27 -0
- data/sipper_test/test_controllers/multi_trhandlers/uas_multi_tr_handler_controller.rb +29 -0
- data/sipper_test/test_controllers/multiple/lib/blank_test.rb +2 -0
- data/sipper_test/test_controllers/multiple/uac_info_controller.rb +21 -0
- data/sipper_test/test_controllers/multiple/uac_msg_controller.rb +20 -0
- data/sipper_test/test_controllers/multiple/uas_info_controller.rb +15 -0
- data/sipper_test/test_controllers/multiple/uas_msg_controller.rb +14 -0
- data/sipper_test/test_controllers/nict_tcbh/lib/transaction_handlers/app_nict_handler.rb +13 -0
- data/sipper_test/test_controllers/nict_tcbh/uac_nict_tcbh_controller.rb +26 -0
- data/sipper_test/test_controllers/nict_tcbh/uas_nict_tcbh_controller.rb +20 -0
- data/sipper_test/test_controllers/state_machine_based/lib/CreditControl.sm +43 -0
- data/sipper_test/test_controllers/state_machine_based/lib/CreditControl_sm.rb +194 -0
- data/sipper_test/test_controllers/state_machine_based/order.yaml +1 -0
- data/sipper_test/test_controllers/state_machine_based/uac_message_controller.rb +34 -0
- data/sipper_test/test_controllers/state_machine_based/uas_message_controller.rb +44 -0
- data/sipper_test/test_controllers/stray_message/lib/sipper_extensions/my_stray_handler.rb +9 -0
- data/sipper_test/test_controllers/stray_message/stray_uac_controller.rb +24 -0
- data/sipper_test/test_controllers/stray_message/stray_uas_controller.rb +31 -0
- data/sipper_test/test_controllers/string/order.yaml +1 -0
- data/sipper_test/test_controllers/string/uac_controller.rb +29 -0
- data/sipper_test/test_controllers/string/uas_controller.rb +22 -0
- data/sipper_test/test_controllers/test_controller.rb +24 -0
- data/sipper_test/test_detached_session1.rb +78 -0
- data/sipper_test/test_dialog_routes.rb +139 -0
- data/sipper_test/test_digest_challenge1.rb +89 -0
- data/sipper_test/test_digest_challenge2.rb +90 -0
- data/sipper_test/test_dynamic_parse.rb +249 -0
- data/sipper_test/test_empty_sdp.rb +89 -0
- data/sipper_test/test_ete.rb +37 -0
- data/sipper_test/test_expectation_parser.rb +76 -0
- data/sipper_test/test_extensions.rb +28 -0
- data/sipper_test/test_freeze.rb +81 -0
- data/sipper_test/test_generated.rb +90 -0
- data/sipper_test/test_header_parameters.rb +75 -0
- data/sipper_test/test_header_parse.rb +141 -0
- data/sipper_test/test_http_client1.rb +84 -0
- data/sipper_test/test_http_client2.rb +90 -0
- data/sipper_test/test_ict_with_timeout.rb +62 -0
- data/sipper_test/test_in_dialog_request.rb +61 -0
- data/sipper_test/test_inline_controller.rb +67 -0
- data/sipper_test/test_invite_client_transaction.rb +272 -0
- data/sipper_test/test_invite_replace.rb +147 -0
- data/sipper_test/test_invite_retransmission.rb +90 -0
- data/sipper_test/test_invite_server_transaction.rb +208 -0
- data/sipper_test/test_lower_cseq.rb +79 -0
- data/sipper_test/test_media.rb +52 -0
- data/sipper_test/test_message.rb +392 -0
- data/sipper_test/test_method_specific_response_handling.rb +81 -0
- data/sipper_test/test_multi_homed1.rb +127 -0
- data/sipper_test/test_multi_homed2.rb +109 -0
- data/sipper_test/test_multi_homed_duplicate.rb +87 -0
- data/sipper_test/test_multi_homed_with_detached.rb +88 -0
- data/sipper_test/test_multiple.rb +49 -0
- data/sipper_test/test_multiple_contacts.rb +89 -0
- data/sipper_test/test_non2xx_retransmission_with_ist.rb +87 -0
- data/sipper_test/test_non_invite_client_transaction.rb +210 -0
- data/sipper_test/test_non_invite_retransmission.rb +91 -0
- data/sipper_test/test_non_invite_server_transaction.rb +202 -0
- data/sipper_test/test_offer_answer_prack.rb +103 -0
- data/sipper_test/test_pickup.rb +258 -0
- data/sipper_test/test_prack.rb +105 -0
- data/sipper_test/test_prack_store_and_dispatch.rb +101 -0
- data/sipper_test/test_prack_timer.rb +105 -0
- data/sipper_test/test_ps_sipper_map.rb +56 -0
- data/sipper_test/test_re_invite_uas_ongoing_ict.rb +81 -0
- data/sipper_test/test_re_invite_uas_ongoing_ist.rb +84 -0
- data/sipper_test/test_re_invite_with_ongoing_ict.rb +101 -0
- data/sipper_test/test_re_invite_with_ongoing_ist.rb +89 -0
- data/sipper_test/test_recorder_swap.rb +157 -0
- data/sipper_test/test_refer.rb +121 -0
- data/sipper_test/test_registeration_clearing.rb +97 -0
- data/sipper_test/test_registrar.rb +109 -0
- data/sipper_test/test_registration_controller.rb +73 -0
- data/sipper_test/test_registration_timeout.rb +90 -0
- data/sipper_test/test_remote_controller.rb +39 -0
- data/sipper_test/test_remote_target_update_on2xx.rb +140 -0
- data/sipper_test/test_request.rb +106 -0
- data/sipper_test/test_response.rb +40 -0
- data/sipper_test/test_response_without_to_tag.rb +92 -0
- data/sipper_test/test_rport.rb +88 -0
- data/sipper_test/test_sdp.rb +91 -0
- data/sipper_test/test_sdp_parser.rb +145 -0
- data/sipper_test/test_session.rb +276 -0
- data/sipper_test/test_session_callback_handler.rb +68 -0
- data/sipper_test/test_session_lifetime.rb +66 -0
- data/sipper_test/test_session_manager.rb +141 -0
- data/sipper_test/test_session_recorder.rb +145 -0
- data/sipper_test/test_session_state_user_defined.rb +84 -0
- data/sipper_test/test_session_states.rb +91 -0
- data/sipper_test/test_simple_dialog_state.rb +86 -0
- data/sipper_test/test_simple_re_invite.rb +86 -0
- data/sipper_test/test_sip_uri.rb +234 -0
- data/sipper_test/test_sipper_util.rb +45 -0
- data/sipper_test/test_smc_controller.rb +17 -0
- data/sipper_test/test_smoke.rb +80 -0
- data/sipper_test/test_stray.rb +28 -0
- data/sipper_test/test_stray_inline.rb +89 -0
- data/sipper_test/test_stray_res_acked.rb +103 -0
- data/sipper_test/test_stray_respond.rb +104 -0
- data/sipper_test/test_stray_retry.rb +92 -0
- data/sipper_test/test_stray_retry_failure.rb +93 -0
- data/sipper_test/test_stray_retry_initial.rb +100 -0
- data/sipper_test/test_strict_router_with_angled.rb +84 -0
- data/sipper_test/test_string_record.rb +31 -0
- data/sipper_test/test_subscribe_notify.rb +141 -0
- data/sipper_test/test_subscribe_notify_client_timeout.rb +158 -0
- data/sipper_test/test_subscribe_notify_dialog.rb +146 -0
- data/sipper_test/test_subscribe_notify_expires.rb +155 -0
- data/sipper_test/test_subscribe_notify_multiple_subscription.rb +157 -0
- data/sipper_test/test_subscribe_notify_server_timeout.rb +144 -0
- data/sipper_test/test_subsequent_unsent.rb +88 -0
- data/sipper_test/test_target_refresh_proxy_detached.rb +128 -0
- data/sipper_test/test_target_refresh_proxy_udp.rb +130 -0
- data/sipper_test/test_target_refresh_rr_proxy_udp.rb +133 -0
- data/sipper_test/test_target_refresh_with_new_port.rb +158 -0
- data/sipper_test/test_target_refresh_with_proxy1.rb +113 -0
- data/sipper_test/test_target_refresh_with_rr_update_proxy.rb +145 -0
- data/sipper_test/test_target_refresh_with_update_proxy.rb +144 -0
- data/sipper_test/test_target_refresh_with_update_proxy2.rb +139 -0
- data/sipper_test/test_timer_manager.rb +71 -0
- data/sipper_test/test_timer_task.rb +60 -0
- data/sipper_test/test_transport_handler.rb +19 -0
- data/sipper_test/test_transport_multi_handler.rb +18 -0
- data/sipper_test/test_udp_transport.rb +119 -0
- data/sipper_test/test_unparsed.rb +70 -0
- data/sipper_test/test_validations.rb +69 -0
- data/sipper_test/test_with_rr_proxy.rb +111 -0
- data/sipper_test/testmediacontroller.rb +71 -0
- data/sipper_test/tracing.rb +23 -0
- data/sipper_test/transaction_test_helper.rb +176 -0
- data/sipper_test/transport_filters.rb +26 -0
- data/sipper_test/ts_sipper.rb +91 -0
- data/sipper_test/ts_smoke.rb +3 -0
- data/sipper_test/tt.cmd +20 -0
- metadata +455 -0
data/sipper/sipper.rb
ADDED
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
require 'sipper_configurator'
|
|
2
|
+
|
|
3
|
+
Dir[File.join(File.dirname(__FILE__), 'lib/**/*.rb')].each {|l| load l}
|
|
4
|
+
$:.unshift File.join(SipperConfigurator[:SipperBasePath],"sipper","lib")
|
|
5
|
+
$:.unshift File.join(SipperConfigurator[:SipperBasePath],"sipper","lib", "smc")
|
|
6
|
+
|
|
7
|
+
require 'statemap'
|
|
8
|
+
|
|
9
|
+
require 'util/sipper_util'
|
|
10
|
+
require 'ruby_ext/object'
|
|
11
|
+
require 'ruby_ext/string'
|
|
12
|
+
require 'sip_logger'
|
|
13
|
+
require 'transport/base_transport'
|
|
14
|
+
require 'transport/udp_transport'
|
|
15
|
+
require 'sip_message_router'
|
|
16
|
+
require 'transport_manager'
|
|
17
|
+
require 'controller_selector'
|
|
18
|
+
require 'controller_class_loader'
|
|
19
|
+
require 'util/locator'
|
|
20
|
+
require 'test_completion_signaling_helper'
|
|
21
|
+
require 'util/timer/timer_manager'
|
|
22
|
+
require 'util/timer/sip_timer_helper'
|
|
23
|
+
require 'util/persistence/ps_sipper_map'
|
|
24
|
+
require 'version'
|
|
25
|
+
require 'message'
|
|
26
|
+
require 'request'
|
|
27
|
+
require 'response'
|
|
28
|
+
require 'fileutils'
|
|
29
|
+
require 'custom_message'
|
|
30
|
+
|
|
31
|
+
require 'socket'
|
|
32
|
+
require 'monitor'
|
|
33
|
+
require 'drb/drb'
|
|
34
|
+
|
|
35
|
+
require 'base_controller'
|
|
36
|
+
require 'sip_test_driver_controller'
|
|
37
|
+
require 'bin/common'
|
|
38
|
+
|
|
39
|
+
require 'media/sipper_media_proxy'
|
|
40
|
+
require 'media/sipper_media_manager'
|
|
41
|
+
|
|
42
|
+
require 'sipper_http/sipper_http_request_dispatcher'
|
|
43
|
+
|
|
44
|
+
module SIP
|
|
45
|
+
class Sipper
|
|
46
|
+
include SipLogger
|
|
47
|
+
|
|
48
|
+
attr_reader :running
|
|
49
|
+
|
|
50
|
+
def initialize( config={} )
|
|
51
|
+
if RUBY_PLATFORM =~ /mswin/
|
|
52
|
+
SipperConfigurator[:SipperPlatformRecordingSeparator] = "\r\n"
|
|
53
|
+
elsif
|
|
54
|
+
RUBY_PLATFORM =~ /linux/
|
|
55
|
+
SipperConfigurator[:SipperPlatformRecordingSeparator] = "\n"
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# If user has provided the file from the command line using -c
|
|
59
|
+
# option then we should not try to load controllers from the
|
|
60
|
+
# controlle path, this further ensures that even in project settings
|
|
61
|
+
|
|
62
|
+
file_given = true if SipperConfigurator[:ControllerPath] == :file_given
|
|
63
|
+
SipperUtil::Common.set_environment()
|
|
64
|
+
SipperConfigurator[:ControllerPath] = :file_given if file_given
|
|
65
|
+
if config[:Ips]
|
|
66
|
+
ips = config[:Ips]
|
|
67
|
+
else
|
|
68
|
+
SipperConfigurator[:LocalSipperIP] = "127.0.0.1" unless SipperConfigurator[:LocalSipperIP]
|
|
69
|
+
if SipperConfigurator[:LocalSipperIP].class == Array
|
|
70
|
+
ips = SipperConfigurator[:LocalSipperIP]
|
|
71
|
+
else
|
|
72
|
+
ips = [SipperConfigurator[:LocalSipperIP]]
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
if config[:Ports]
|
|
77
|
+
ports = config[:Ports]
|
|
78
|
+
else
|
|
79
|
+
SipperConfigurator[:LocalSipperPort] = 5060 unless SipperConfigurator[:LocalSipperPort]
|
|
80
|
+
if SipperConfigurator[:LocalSipperPort].class == Array
|
|
81
|
+
ports = SipperConfigurator[:LocalSipperPort]
|
|
82
|
+
else
|
|
83
|
+
ports = [SipperConfigurator[:LocalSipperPort]]
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# check for asymmetrical config
|
|
88
|
+
diff = ips.length - ports.length
|
|
89
|
+
|
|
90
|
+
if diff > 0
|
|
91
|
+
diff.times do
|
|
92
|
+
ports << ports[-1]
|
|
93
|
+
end
|
|
94
|
+
elsif diff < 0
|
|
95
|
+
pdiff = -1 * diff
|
|
96
|
+
pdiff.times do
|
|
97
|
+
ips << ips[-1]
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Make sure ip port tuples are unique
|
|
102
|
+
if ips.length > 1
|
|
103
|
+
tuples = []
|
|
104
|
+
ips.each_with_index do |ip, i|
|
|
105
|
+
tuples << [ip, ports[i]]
|
|
106
|
+
end
|
|
107
|
+
tuples.uniq!
|
|
108
|
+
ips = []
|
|
109
|
+
ports = []
|
|
110
|
+
tuples.each do |t|
|
|
111
|
+
ips << t[0]
|
|
112
|
+
ports << t[1]
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
SipperConfigurator[:ControllerPath] ||= config[:ControllerPath]
|
|
118
|
+
|
|
119
|
+
SipperConfigurator[:DefaultRIP] ||= "127.0.0.1"
|
|
120
|
+
SipperConfigurator[:DefaultRP] ||= 5060
|
|
121
|
+
|
|
122
|
+
#default_cp = File.join(SipperConfigurator[:SipperBasePath], "sipper", "controllers")
|
|
123
|
+
#SipperConfigurator[:ControllerPath] ||= default_cp
|
|
124
|
+
@q = Queue.new # the message queue
|
|
125
|
+
SIP::Locator[:Tm] = TransportManager.new
|
|
126
|
+
|
|
127
|
+
# Each transport uses the same queue
|
|
128
|
+
ports.length.times do |i|
|
|
129
|
+
SIP::Locator[:Tm].add_transport(::Transport::UdpTransport.instance(ips[i]?ips[i]:ips[0], ports[i], @q))
|
|
130
|
+
#logi("Created the transport #{ips[i]?ips[i]:ips[0]}, #{ports[i]}")
|
|
131
|
+
end
|
|
132
|
+
logi("Added #{ports.length} transports to transport manager")
|
|
133
|
+
SipperConfigurator[:NumThreads] ||= config[:NumThreads] || 5
|
|
134
|
+
@smr = SipMessageRouter.new(@q, SipperConfigurator[:NumThreads])
|
|
135
|
+
@running = false
|
|
136
|
+
if SipperConfigurator[:TimerGranularity]
|
|
137
|
+
@tm = SIP::TimerManager.new(@q, SipperConfigurator[:TimerGranularity])
|
|
138
|
+
else
|
|
139
|
+
@tm = SIP::TimerManager.new(@q)
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
if SipperConfigurator[:SipperMedia]
|
|
143
|
+
SIP::Locator[:Smd] = Media::SipperMediaProxy.new
|
|
144
|
+
Media::SipperMediaManager.instance.set_queue(@q)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# Location service store / for registrar
|
|
148
|
+
SIP::Locator[:RegistrationStore] = SipperUtil::Persistence::PsSipperMap.new("registration_store")
|
|
149
|
+
|
|
150
|
+
# Location service store / for dialog store
|
|
151
|
+
SIP::Locator[:DialogInfoStore] = SipperUtil::Persistence::PsSipperMap.new("dialog_info_store")
|
|
152
|
+
|
|
153
|
+
# Sipper HTTP Client
|
|
154
|
+
SIP::Locator[:HttpRequestDispatcher] = SipperHttpRequestDispatcher.new(@q, SipperConfigurator[:HttpClientThreads])
|
|
155
|
+
|
|
156
|
+
SIP::Locator[:Sipper] = self
|
|
157
|
+
|
|
158
|
+
# NK
|
|
159
|
+
Thread.abort_on_exception = true
|
|
160
|
+
|
|
161
|
end
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def start
|
|
167
|
+
if SipperConfigurator[:TestManagerName]
|
|
168
|
+
if (Socket.gethostbyname(Socket.gethostname) == Socket.gethostbyname(SipperConfigurator[:TestManagerName]))
|
|
169
|
+
DRb.start_service("druby://#{SipperConfigurator[:TestManagerName]}:#{SipperConfigurator[:TestManagerPort]}", SIP::TcshProxy.new)
|
|
170
|
+
else
|
|
171
|
+
DRb.start_service
|
|
172
|
+
end
|
|
173
|
+
logd("Starting the client DRb service")
|
|
174
|
+
end
|
|
175
|
+
@tm.start # starting the timer manager
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
# Timer helper
|
|
179
|
+
SIP::Locator[:Sth] = SIP::SipTimerHelper.new(@tm)
|
|
180
|
+
|
|
181
|
+
SIP::ControllerClassLoader.clear_all # start from a clean slate
|
|
182
|
+
if SipperConfigurator[:ControllerPath] && SipperConfigurator[:ControllerPath] != :file_given
|
|
183
|
+
cdir = Dir.new(SipperConfigurator[:ControllerPath])
|
|
184
|
+
SipperConfigurator[:ControllerLibPath] ||= File.join(SipperConfigurator[:ControllerPath], "lib")
|
|
185
|
+
$:.unshift SipperConfigurator[:ControllerLibPath] # now transaction_handlers can be required in controllers
|
|
186
|
+
Dir["#{SipperConfigurator[:ControllerLibPath]}/transport_filters/*.rb"].each{|x| load x } # load all filters
|
|
187
|
+
Dir["#{SipperConfigurator[:ControllerLibPath]}/transport_filters/*.yaml"].each do |o|
|
|
188
|
+
if o=~/in_order.yaml/
|
|
189
|
+
::Transport::BaseTransport.in_order = SipperUtil.load_yaml(o)
|
|
190
|
+
elsif o=~/out_order.yaml/
|
|
191
|
+
::Transport::BaseTransport.out_order = SipperUtil.load_yaml(o)
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
# Now loading the extensions
|
|
195
|
+
Dir["#{SipperConfigurator[:ControllerLibPath]}/sipper_extensions/*.rb"].each{|x| require x }
|
|
196
|
+
end
|
|
197
|
+
SIP::Locator[:Cs] = SIP::ControllerSelector.new(cdir)
|
|
198
|
+
t = Thread.new do
|
|
199
|
+
SIP::Locator[:Tm].transports.each do |tr|
|
|
200
|
+
tr.start_transport
|
|
201
|
+
#logi("Started the transport #{tr}")
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
@smr.start
|
|
205
|
+
sleep(rand(1)) until @smr.running
|
|
206
|
+
|
|
207
|
+
SIP::Locator[:Cs].get_controllers.each_with_index do |c, i|
|
|
208
|
+
if c.class.start_on_load?
|
|
209
|
+
Thread.new do
|
|
210
|
+
Thread.current[:name] = "StarterThread-"+i.to_s
|
|
211
|
+
logd("Starting controller #{c.name}")
|
|
212
|
+
c.start
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
logi("Sipper now started. Server version #{SIP::VERSION::STRING}")
|
|
217
|
+
|
|
218
|
+
@smr.tg.list.each {|th| th.join} #law of demeter VVV
|
|
219
|
+
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
# now start the http client request dispatcher
|
|
223
|
+
SIP::Locator[:HttpRequestDispatcher].start
|
|
224
|
+
@running = true
|
|
225
|
+
|
|
226
|
+
if SipperConfigurator[:GobletRelease]
|
|
227
|
+
$:.unshift File.join(File.dirname(__FILE__),"..", "goblet")
|
|
228
|
+
require 'management/sipper_config_manager'
|
|
229
|
+
@scm_server = Goblet::Management::SipperConfigManager.new.start
|
|
230
|
+
# run the rails web server
|
|
231
|
+
require SipperConfigurator[:SipperBasePath] + '/goblet/web/goblet_console/config/boot'
|
|
232
|
+
#Thread.new do
|
|
233
|
+
require 'commands/server'
|
|
234
|
+
#end
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
if x = SipperConfigurator[:SipperRunFor]
|
|
238
|
+
Thread.new do
|
|
239
|
+
sleep x
|
|
240
|
+
exit
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
return t
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
# Load a controller at runtime whose definition is given in the string.
|
|
248
|
+
# eg.
|
|
249
|
+
# str = <<-EOF
|
|
250
|
+
# require 'base_controller'
|
|
251
|
+
# module MyControllers
|
|
252
|
+
# class SimpleController < SIP::BaseController
|
|
253
|
+
# def start
|
|
254
|
+
# r = Request.create_initial("message", "sip:nasir@codepresso.com")
|
|
255
|
+
# u = create_udp_session("127.0.0.1", 5066)
|
|
256
|
+
# u.send(r)
|
|
257
|
+
# end
|
|
258
|
+
# end
|
|
259
|
+
# end
|
|
260
|
+
# EOF
|
|
261
|
+
# load_controller( str )
|
|
262
|
+
# You would typically do this from within a test case or simple cases
|
|
263
|
+
# where you do not need to define a controller in a specified controller
|
|
264
|
+
# location.
|
|
265
|
+
def load_controller(str)
|
|
266
|
+
_check_running
|
|
267
|
+
SIP::Locator[:Cs].load_controller_from_string( str )
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
def start_controller(name)
|
|
271
|
+
cs = SIP::Locator[:Cs].get_controller(name)
|
|
272
|
+
if cs
|
|
273
|
+
cs.start
|
|
274
|
+
else
|
|
275
|
+
raise ArgumentError, "Unknown controller #{name} cannot start"
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
def start_named_controller(name)
|
|
280
|
+
start_controller(name)
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
def start_controller_unless_sol(name)
|
|
284
|
+
cs = SIP::Locator[:Cs].get_controller(name)
|
|
285
|
+
if cs
|
|
286
|
+
cs.start unless cs.class.start_on_load?
|
|
287
|
+
else
|
|
288
|
+
raise ArgumentError, "Unknown controller #{name} cannot start"
|
|
289
|
+
end
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
def _check_running
|
|
294
|
+
raise RuntimeError, "Sipper not running" unless @running
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
def reload_libs
|
|
298
|
+
Dir[File.join(File.dirname(__FILE__), 'lib/**/*.rb')].each {|l| load l}
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
# todo have a nice stopping, graceful using shutdown hook
|
|
302
|
+
def stop
|
|
303
|
+
SIP::Locator[:Tm].transports.each do |t|
|
|
304
|
+
t.stop_transport
|
|
305
|
+
logi("Stopped the transport #{t}")
|
|
306
|
+
end
|
|
307
|
+
@smr.stop
|
|
308
|
+
logi("Stopped the SIP Message Router")
|
|
309
|
+
@tm.stop
|
|
310
|
+
# stop the DRb server on this node
|
|
311
|
+
DRb.stop_service
|
|
312
|
+
@running = false
|
|
313
|
+
SipperConfigurator[:ControllerLibPath] = nil
|
|
314
|
+
@q.clear
|
|
315
|
+
@q = nil
|
|
316
|
+
::Transport::BaseTransport.clear_all_filters
|
|
317
|
+
|
|
318
|
+
if SipperConfigurator[:GobletRelease]
|
|
319
|
+
@scm_server.shutdown if @scm_server
|
|
320
|
+
end
|
|
321
|
+
if SipperConfigurator[:PrintHeapOnExit]
|
|
322
|
+
a = Hash.new(0)
|
|
323
|
+
ObjectSpace.each_object(Object) {|x| a[x.class.name] += 1}
|
|
324
|
+
a.each {|k,v| puts "#{k} #{v}" }
|
|
325
|
+
end
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
private :_check_running
|
|
329
|
+
end
|
|
330
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
require 'session_recorder'
|
|
2
|
+
require 'sipper_configurator'
|
|
3
|
+
require 'util/sipper_util'
|
|
4
|
+
require 'test/unit'
|
|
5
|
+
|
|
6
|
+
module SipperAssertions
|
|
7
|
+
|
|
8
|
+
def assert_header_value_in_recording_equals(recording_row, header_name, expected, msg=nil)
|
|
9
|
+
a = recording_row.split(SipperConfigurator[:SipperPlatformRecordingSeparator])
|
|
10
|
+
regx = Regexp.new(SipperUtil.headerize(header_name))
|
|
11
|
+
h = a.find {|v| v =~ regx}
|
|
12
|
+
v = SipperUtil.header_value(h)
|
|
13
|
+
assert_equal(expected, v, msg)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def assert_uri_in_recording_equals(recording_row, expected, msg=nil)
|
|
17
|
+
a = recording_row.split(SipperConfigurator[:SipperPlatformRecordingSeparator])
|
|
18
|
+
assert_equal(expected, a[0], msg)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
require 'yaml'
|
|
2
|
+
|
|
3
|
+
class SipperConfigurator
|
|
4
|
+
@@comment_str = <<-EOF
|
|
5
|
+
# Paths that can be set are
|
|
6
|
+
#
|
|
7
|
+
# :LogPath:
|
|
8
|
+
# Here is where Sipper creates the log files, default is
|
|
9
|
+
# log directory under the project directory
|
|
10
|
+
#
|
|
11
|
+
# :ConfigPath:
|
|
12
|
+
# This is where the Sipper reads the configuration files from,
|
|
13
|
+
# the default is config directory
|
|
14
|
+
#
|
|
15
|
+
# :ControllerPath:
|
|
16
|
+
# The place where sipper loads the controllers, the default is
|
|
17
|
+
# the controllers directory under project.
|
|
18
|
+
#
|
|
19
|
+
# :SessionRecordPath:
|
|
20
|
+
# Place where transient session recording takes place. Default is
|
|
21
|
+
# same as the log directory.
|
|
22
|
+
#
|
|
23
|
+
# :ControllerLibPath:
|
|
24
|
+
# This is where you may keep any libraries specific to controller
|
|
25
|
+
# (defaults to controller/lib but can be anything if set)
|
|
26
|
+
#
|
|
27
|
+
# :PStorePath:
|
|
28
|
+
# This is where PsSipperMap class will store the data, the default
|
|
29
|
+
# is same as the log location.
|
|
30
|
+
#
|
|
31
|
+
# Configuration values are -
|
|
32
|
+
#
|
|
33
|
+
# :LocalSipperIP:
|
|
34
|
+
# IP (or name) where the default local Sipper
|
|
35
|
+
# instance is going to run. This will
|
|
36
|
+
# also be used by the local run of tests. Of
|
|
37
|
+
# course you can start the Sipper instance on any
|
|
38
|
+
# other IP by providing that IP in the Sipper
|
|
39
|
+
# initialization.
|
|
40
|
+
#
|
|
41
|
+
# :LocalSipperPort:
|
|
42
|
+
# Port where default Sipper instance will listen
|
|
43
|
+
# for incoming messages.
|
|
44
|
+
#
|
|
45
|
+
# :LocalTestPort:
|
|
46
|
+
# Port where the Sipper that is running the SipTestCase,
|
|
47
|
+
# DrivenSipTestCase and all the tests that are derived
|
|
48
|
+
# from them is run. By default when running under a
|
|
49
|
+
# project this is same as :LocalSipperPort
|
|
50
|
+
#
|
|
51
|
+
# :DefaultRIP:
|
|
52
|
+
# Default remote IP configured for the installation.
|
|
53
|
+
# You can of course create a bound session to any
|
|
54
|
+
# IP address you choose at runtime.
|
|
55
|
+
#
|
|
56
|
+
# :DefaultRP:
|
|
57
|
+
# Default remote port configured for this installation.
|
|
58
|
+
# You can of course create a bound session to any
|
|
59
|
+
# port you choose at runtime.
|
|
60
|
+
#
|
|
61
|
+
# :SessionRecord:
|
|
62
|
+
# default false values can be 'msg-info' and
|
|
63
|
+
# 'msg-debug'
|
|
64
|
+
#
|
|
65
|
+
# :ProtocolCompliance:
|
|
66
|
+
# 'strict' or 'lax'
|
|
67
|
+
#
|
|
68
|
+
# :NumThreads:
|
|
69
|
+
# number of worker threads
|
|
70
|
+
#
|
|
71
|
+
# :SipperRunFor:
|
|
72
|
+
# number of seconds after which Sipper will automatically exit
|
|
73
|
+
# this is useful when you fork a Sipper process for some testing
|
|
74
|
+
# but then do not have a reference to stop it.
|
|
75
|
+
#
|
|
76
|
+
# :PrintHeapOnExit:
|
|
77
|
+
# if defined then sipper on exit prints heap.
|
|
78
|
+
#
|
|
79
|
+
# :WaitSecondsForTestCompletion:
|
|
80
|
+
# seconds that the test should wait
|
|
81
|
+
# for signaling to end
|
|
82
|
+
#
|
|
83
|
+
# :TestManagerName:
|
|
84
|
+
# name/ip of the test server where the test
|
|
85
|
+
# case is running, this is used when
|
|
86
|
+
# the UAC or UAS is running on a separate
|
|
87
|
+
# server and it is required to
|
|
88
|
+
# co-ordinate the test completion using the
|
|
89
|
+
# completion signaling.
|
|
90
|
+
#
|
|
91
|
+
# :TestManagerPort:
|
|
92
|
+
# Drb port where the test server is
|
|
93
|
+
# listening for requests.
|
|
94
|
+
# Both Manager configuration are not required
|
|
95
|
+
# for locally running tests and UAS/UACs.
|
|
96
|
+
# The test server IP and Port is where the DRb
|
|
97
|
+
# server will be running for remote test
|
|
98
|
+
# signaling.
|
|
99
|
+
#
|
|
100
|
+
# :EnableRecordingLock:
|
|
101
|
+
# is a boolean which if set makes use of file locking
|
|
102
|
+
# mechanism to synchronize between recording writing
|
|
103
|
+
# and reading. If your tests and
|
|
104
|
+
# controllers are local then with this you can make
|
|
105
|
+
# sure that recordings are written first before being
|
|
106
|
+
# read. This is anyway an option if you
|
|
107
|
+
# are not using DrivenSipTestCase and
|
|
108
|
+
# SipTestDriverController, which do this synchronization
|
|
109
|
+
# using distributed locking and conditional variables.
|
|
110
|
+
#
|
|
111
|
+
# :TimerGranularity:
|
|
112
|
+
# the ms value of platform timer granularity, default
|
|
113
|
+
# is 50ms. This is the maximum error +/- that shall be
|
|
114
|
+
# there in any timer. This error could surface
|
|
115
|
+
# when there are very few sparse timers in the system.
|
|
116
|
+
# For a reasonably loaded system the timer granularity
|
|
117
|
+
# does not add any significant error.
|
|
118
|
+
#
|
|
119
|
+
# :TransactionTimers:
|
|
120
|
+
# a hash of timer values, can have all the base timer
|
|
121
|
+
# constants :t1, :t2, :t4 and even
|
|
122
|
+
# specific timers like :ta (timerA), tb, tc, td etc
|
|
123
|
+
# in which case they override their
|
|
124
|
+
# dependence on t1 etc. eg. {:t1=>400, :ta=>200, :tb=>32000}
|
|
125
|
+
# the default values of these
|
|
126
|
+
# timers of not specified here is taken from transaction.rb
|
|
127
|
+
#
|
|
128
|
+
# :SessionTxnUsage:
|
|
129
|
+
# a hash of boolean values for each type of transactions.
|
|
130
|
+
# The values of the hash can be
|
|
131
|
+
# :use_transactions => boolean, :use_ict => boolean etc.
|
|
132
|
+
# Specific type of transactions override the generic
|
|
133
|
+
# transaction setting. So if the setting is
|
|
134
|
+
# {:use_transactions => true} then the Session will use
|
|
135
|
+
# transactions of all types. if the setting is
|
|
136
|
+
# {:use_transactions => false, :use_ict=> true} then the
|
|
137
|
+
# Session will use only Invite Client Transactions.
|
|
138
|
+
# There is default setting only for :use_transactions and it
|
|
139
|
+
# is "true". So in the absence of any configuration the
|
|
140
|
+
# Session will use types of transactions.
|
|
141
|
+
# Note these individual configuration values can be
|
|
142
|
+
# changed on a Session by Session or even
|
|
143
|
+
# request by request basis by setting them on the Session
|
|
144
|
+
# by the method of same name as
|
|
145
|
+
# the setting. [ e.g my_session.use_ict(true) ]
|
|
146
|
+
#
|
|
147
|
+
# :SessionTimer:
|
|
148
|
+
# the default session invalidation timer. This timer
|
|
149
|
+
# is used when the invalidate is
|
|
150
|
+
# called without the force parameter, the session is
|
|
151
|
+
# actually invalidated after this
|
|
152
|
+
# time. This configuration is the default value of the
|
|
153
|
+
# timer. This can be overridden
|
|
154
|
+
# at the controller level or even session level.
|
|
155
|
+
#
|
|
156
|
+
# :SessionLimit:
|
|
157
|
+
# in the session_being_invalidated_ok_to_proceed?()
|
|
158
|
+
# callback the controller can
|
|
159
|
+
# return false which will give the session a new lease
|
|
160
|
+
# of life for the time that is equal to the current
|
|
161
|
+
# value of session timer. This extension has an upper
|
|
162
|
+
# limit roughly equal to :SessionLimit. "Roughly"
|
|
163
|
+
# because if the session has lived
|
|
164
|
+
# for time x, the session timer is x' and the
|
|
165
|
+
# :SessionLimit is set for y where
|
|
166
|
+
# y > x but x + x' > y then the session will not
|
|
167
|
+
# re-schedule but invalidate.
|
|
168
|
+
# In other words if the increment is such that it
|
|
169
|
+
# will increase the lifetime beyond
|
|
170
|
+
# :SessionLimit then it is not re-scheduled.
|
|
171
|
+
#
|
|
172
|
+
# :T2xxUsage:
|
|
173
|
+
# a boolean which indicates if the UAS session shall
|
|
174
|
+
# retransmit the 2xx or not.
|
|
175
|
+
# The default value is true.
|
|
176
|
+
#
|
|
177
|
+
# :T2xxTimers:
|
|
178
|
+
# a hash of three values that can be used to configure
|
|
179
|
+
# the behavior of the 2xx retransmission from the UAS.
|
|
180
|
+
# The 3 values are :Start, :Cap, :Limit
|
|
181
|
+
# 1> :Start is the starting value of the 2xx
|
|
182
|
+
# retransmission timer [13.3.1.4] for UAS
|
|
183
|
+
# If not configured this defaults to T1 constant defined
|
|
184
|
+
# in Transaction class.
|
|
185
|
+
# This doubles until it reaches :Cap.
|
|
186
|
+
# 2> :Cap is the valsue at which the doubling of
|
|
187
|
+
# :T2xxRetransStart timer value stops. This
|
|
188
|
+
# defaults to T2 defined in the Transaction class.
|
|
189
|
+
# 3> :Limit is is when the UAS shall abandon the 2xx
|
|
190
|
+
# retransmissions if the ACK does not come.
|
|
191
|
+
# This defaults to 64*T1.
|
|
192
|
+
# e.g :T2xxRetrans = {:Start=>100, :Cap=>400, :Limit=>16000}
|
|
193
|
+
#
|
|
194
|
+
# :T1xxTimers:
|
|
195
|
+
# a hash of two values that can be used to configure
|
|
196
|
+
# the behavior of the reliable 1xx retransmissions from the UAS.
|
|
197
|
+
# The 2 values are :Start and :Limit
|
|
198
|
+
# 1> :Start is the starting value of the 1xx
|
|
199
|
+
# retransmission timer for UAS
|
|
200
|
+
# If not configured this defaults to T1 constant defined
|
|
201
|
+
# in Transaction class.
|
|
202
|
+
# This doubles for each retransmission.
|
|
203
|
+
# 2> :Limit is is when the UAS shall abandon the 1xx
|
|
204
|
+
# retransmissions if the PRACK does not come.
|
|
205
|
+
# This defaults to 64*T1.
|
|
206
|
+
# e.g :T1xxRetrans = {:Start=>100, :Limit=>16000}
|
|
207
|
+
#
|
|
208
|
+
# :TargetRefreshMethods:
|
|
209
|
+
# list(array) of methods that can update the remote target.
|
|
210
|
+
#
|
|
211
|
+
# :DialogCreatingMethods:
|
|
212
|
+
# list(array) of dialog creating methods in SIP
|
|
213
|
+
#
|
|
214
|
+
#
|
|
215
|
+
# :ShowSessionIdInMessages:
|
|
216
|
+
# if set adds the session Id of the session from where a
|
|
217
|
+
# message is sent out, in the message as a special header
|
|
218
|
+
# P-Sipper-Session.
|
|
219
|
+
#
|
|
220
|
+
# :PreExistingRouteSet:
|
|
221
|
+
# list(array) of Route headers to be used as
|
|
222
|
+
# default preloaded route
|
|
223
|
+
#
|
|
224
|
+
# :DigestSalt:
|
|
225
|
+
# A configurable secret key for generating
|
|
226
|
+
# nonce / cnonce values
|
|
227
|
+
#
|
|
228
|
+
# :SipperMedia:
|
|
229
|
+
# If set to true the Sipper media library is available
|
|
230
|
+
# for use.
|
|
231
|
+
#
|
|
232
|
+
# :SipperMediaDefaultControlPort:
|
|
233
|
+
# The default port where SipperMedia main process
|
|
234
|
+
# shall listen for control requests
|
|
235
|
+
#
|
|
236
|
+
# :SipperMediaProcessReuse
|
|
237
|
+
# This flag controls whether to shutdown and launch the SipperMedia if
|
|
238
|
+
# SipperMedia process is running. Default value is false
|
|
239
|
+
#
|
|
240
|
+
# :SipperPersistentStore:
|
|
241
|
+
# Can take value as "file" or "db", in case the value is file
|
|
242
|
+
# the built in file based persistent store is used while if
|
|
243
|
+
# the value is db then the configured database is used for
|
|
244
|
+
# for persistence needs. The persistent store is used by all
|
|
245
|
+
# users of SipperMap API. The default is "file"
|
|
246
|
+
#
|
|
247
|
+
# :SipperPlatformRecordingSeparator:
|
|
248
|
+
# Platform independent recording separator. Can be CR+LF for windows
|
|
249
|
+
# while only LF for Linux. It is set automatically in sipper.rb.
|
|
250
|
+
#
|
|
251
|
+
# :GobletRelease:
|
|
252
|
+
# Set to true only if this release is a Goblet release, which is the enhanced
|
|
253
|
+
# platform with a number of supporting libraries.
|
|
254
|
+
#
|
|
255
|
+
# :GobletConfigPort:
|
|
256
|
+
# The port at which Goblet config manager is listening for Goblet config commands
|
|
257
|
+
# the default value of this port is 4681. Used only if the release is a Goblet
|
|
258
|
+
# release.
|
|
259
|
+
#
|
|
260
|
+
# :HttpClientThreads
|
|
261
|
+
# Number of HTTP Client threads that will be used for asynchronous
|
|
262
|
+
# http request sending and response processing.
|
|
263
|
+
#
|
|
264
|
+
EOF
|
|
265
|
+
|
|
266
|
+
def SipperConfigurator.all_keys()
|
|
267
|
+
keys = []
|
|
268
|
+
cmt_str = @@comment_str
|
|
269
|
+
while (x=(cmt_str =~/# :[A-Za-z0-9].*:/)) do
|
|
270
|
+
key = cmt_str.match(/# :[A-Za-z0-9].*:/)[0]
|
|
271
|
+
keys << key[2..-1]
|
|
272
|
+
cmt_str = cmt_str[x+key.length .. -1]
|
|
273
|
+
end
|
|
274
|
+
keys
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
# ignore the first comment as that does not match the key
|
|
278
|
+
def SipperConfigurator.all_comments()
|
|
279
|
+
@@comment_str.split(/# :[A-Za-z0-9].*:/)
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
@@cfg_hash = {}
|
|
285
|
+
|
|
286
|
+
def SipperConfigurator.[](key)
|
|
287
|
+
@@cfg_hash[key]
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
def SipperConfigurator.[]=(key, val)
|
|
291
|
+
@@cfg_hash[key] = val
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
def SipperConfigurator.add_key_description(key, desc)
|
|
295
|
+
unless @@cfg_hash[key.to_sym].nil?
|
|
296
|
+
return false
|
|
297
|
+
end
|
|
298
|
+
@@comment_str << " # :" << key << ":\n # " << desc << "\n #\n"
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
def SipperConfigurator.write_yaml_file(file)
|
|
303
|
+
io = File.new(file, "w+")
|
|
304
|
+
io.write(@@comment_str)
|
|
305
|
+
io.write " # -------------------------------------------------------"
|
|
306
|
+
io.write(YAML::dump(@@cfg_hash))
|
|
307
|
+
io.flush
|
|
308
|
+
ensure
|
|
309
|
+
io.close if io
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
def SipperConfigurator.load_yaml_file(file)
|
|
314
|
+
begin
|
|
315
|
+
lsip = lspo = rsip = rspo = nil
|
|
316
|
+
io = File.new(file, "r")
|
|
317
|
+
@@comment_str = ""
|
|
318
|
+
io.each do |line|
|
|
319
|
+
if line =~ /# ----/
|
|
320
|
+
break
|
|
321
|
+
else
|
|
322
|
+
@@comment_str << line
|
|
323
|
+
end
|
|
324
|
+
end
|
|
325
|
+
obj = YAML::load(io)
|
|
326
|
+
if obj.class == Hash
|
|
327
|
+
if SipperConfigurator[:CommandlineBitmask]
|
|
328
|
+
lsip = SipperConfigurator[:LocalSipperIP] if ((SipperConfigurator[:CommandlineBitmask] | 8) == SipperConfigurator[:CommandlineBitmask])
|
|
329
|
+
lspo = SipperConfigurator[:LocalSipperPort] if ((SipperConfigurator[:CommandlineBitmask] | 4) == SipperConfigurator[:CommandlineBitmask])
|
|
330
|
+
rsip = SipperConfigurator[:DefaultRIP] if ((SipperConfigurator[:CommandlineBitmask] | 2) == SipperConfigurator[:CommandlineBitmask])
|
|
331
|
+
rspo = SipperConfigurator[:DefaultRP] if ((SipperConfigurator[:CommandlineBitmask] | 1) == SipperConfigurator[:CommandlineBitmask])
|
|
332
|
+
end
|
|
333
|
+
@@cfg_hash = @@cfg_hash.merge(obj)
|
|
334
|
+
SipperConfigurator[:LocalSipperIP] = lsip if lsip
|
|
335
|
+
SipperConfigurator[:LocalSipperPort] = lspo if lspo
|
|
336
|
+
SipperConfigurator[:DefaultRIP] = rsip if rsip
|
|
337
|
+
SipperConfigurator[:DefaultRP] = rspo if rspo
|
|
338
|
+
else
|
|
339
|
+
msg = "Object read from file #{file} is not a configuration"
|
|
340
|
+
raise TypeError, msg
|
|
341
|
+
end
|
|
342
|
+
rescue IOError
|
|
343
|
+
msg = "#{file} is not a proper file"
|
|
344
|
+
raise TypeError, msg
|
|
345
|
+
ensure
|
|
346
|
+
io.close if io
|
|
347
|
+
end
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
# Defaults
|
|
353
|
+
SipperConfigurator[:ProtocolCompliance] = 'strict'
|
|
354
|
+
SipperConfigurator[:SipperBasePath] = ENV['SIPPER_HOME']
|
|
355
|
+
SipperConfigurator[:WaitSecondsForTestCompletion] = 10
|
|
356
|
+
SipperConfigurator[:TestManagerName] = nil
|
|
357
|
+
SipperConfigurator[:TestManagerPort] = nil
|
|
358
|
+
SipperConfigurator[:EnableRecordingLock] = false
|
|
359
|
+
SipperConfigurator[:PrintHeapOnExit] = false
|
|
360
|
+
SipperConfigurator[:TransactionTimers] = {}
|
|
361
|
+
SipperConfigurator[:SessionTxnUsage] = {:use_transactions=>false} #todo make it true later
|
|
362
|
+
SipperConfigurator[:SessionTimer] = 60000 # 50 msec for tests set in driven_sip_test_case, one minute for production
|
|
363
|
+
SipperConfigurator[:SessionLimit] = 60000 # one hour default
|
|
364
|
+
SipperConfigurator[:T2xxUsage] = false # todo make it true
|
|
365
|
+
SipperConfigurator[:TimerGranularity] = 70 # in milliseconds, default is 50 if not defined
|
|
366
|
+
SipperConfigurator[:TargetRefreshMethods] = ['INVITE', 'SUBSCRIBE', 'UPDATE', 'NOTIFY', 'REFER']
|
|
367
|
+
SipperConfigurator[:DialogCreatingMethods] = ['INVITE', 'SUBSCRIBE', 'NOTIFY', 'REFER']
|
|
368
|
+
SipperConfigurator[:PrintHeapOnExit] = false
|
|
369
|
+
SipperConfigurator[:SipperMedia] = false
|
|
370
|
+
SipperConfigurator[:SipperMediaDefaultControlPort] = 4680
|
|
371
|
+
SipperConfigurator[:SipperMediaProcessReuse] = false
|
|
372
|
+
SipperConfigurator[:GobletRelease] = false
|
|
373
|
+
SipperConfigurator[:GobletConfigPort] = 4681 if SipperConfigurator[:GobletRelease]
|
|
374
|
+
SipperConfigurator[:CommandlineBitmask] = 0
|
|
375
|
+
SipperConfigurator[:HttpClientThreads] = 5
|
|
376
|
+
SipperConfigurator[:ShowSessionIdInMessages] = true
|