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
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
|
|
2
|
+
require 'driven_sip_test_case'
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class TestHttpClient1 < DrivenSipTestCase
|
|
6
|
+
|
|
7
|
+
def setup
|
|
8
|
+
super
|
|
9
|
+
str = <<-EOF
|
|
10
|
+
|
|
11
|
+
require 'sip_test_driver_controller'
|
|
12
|
+
|
|
13
|
+
module SipInline
|
|
14
|
+
class UasHttpController < SIP::SipTestDriverController
|
|
15
|
+
|
|
16
|
+
transaction_usage :use_transactions=>true
|
|
17
|
+
|
|
18
|
+
def on_invite(session)
|
|
19
|
+
session.send_http_get_to('http://www.example.com/index.html')
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def on_http_res(session)
|
|
24
|
+
|
|
25
|
+
res = session.create_response(200)
|
|
26
|
+
res.set_body session.ihttp_response.body.split(/\r|\n\r|\n/), 'text/xml'
|
|
27
|
+
session.send res
|
|
28
|
+
logd("Received INVITE sent a 200 from "+name)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def on_ack(session)
|
|
32
|
+
session.request_with("bye")
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def on_success_res(session)
|
|
36
|
+
session.invalidate(true)
|
|
37
|
+
session.flow_completed_for("TestHttpClient1")
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def order
|
|
41
|
+
0
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
class UacHttpController < SIP::SipTestDriverController
|
|
47
|
+
|
|
48
|
+
transaction_usage :use_transactions=>true
|
|
49
|
+
|
|
50
|
+
def start
|
|
51
|
+
r = Request.create_initial("invite", "sip:nasir@sipper.com", :p_session_record=>"msg-info")
|
|
52
|
+
u = create_udp_session(SipperConfigurator[:LocalSipperIP], SipperConfigurator[:LocalTestPort])
|
|
53
|
+
u.send(r)
|
|
54
|
+
logd("Sent a new INVITE from "+name)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def on_success_res(session)
|
|
59
|
+
session.request_with('ACK')
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def on_bye(session)
|
|
63
|
+
session.respond_with(200)
|
|
64
|
+
session.invalidate(true)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
EOF
|
|
70
|
+
define_controller_from(str)
|
|
71
|
+
set_controller("SipInline::UacHttpController")
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def test_smoke_controllers
|
|
76
|
+
self.expected_flow = ["> INVITE", "< 100", "< 200", "> ACK", "< BYE", "> 200"]
|
|
77
|
+
start_controller
|
|
78
|
+
verify_call_flow(:out)
|
|
79
|
+
self.expected_flow = ["< INVITE", "> 100", "> 200", "< ACK", "> BYE", "< 200"]
|
|
80
|
+
verify_call_flow(:in)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
end
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
require 'driven_sip_test_case'
|
|
4
|
+
|
|
5
|
+
# In order to run this test properly, run a goblet enabled system
|
|
6
|
+
# separately on localhost
|
|
7
|
+
# Then uncomment the send_post call and comment the direct respond_with
|
|
8
|
+
# method.
|
|
9
|
+
class TestHttpClient2 < DrivenSipTestCase
|
|
10
|
+
|
|
11
|
+
def setup
|
|
12
|
+
super
|
|
13
|
+
str = <<-EOF
|
|
14
|
+
|
|
15
|
+
require 'sip_test_driver_controller'
|
|
16
|
+
|
|
17
|
+
module SipInline
|
|
18
|
+
class UasHttpController2 < SIP::SipTestDriverController
|
|
19
|
+
|
|
20
|
+
transaction_usage :use_transactions=>true
|
|
21
|
+
|
|
22
|
+
def on_invite(session)
|
|
23
|
+
#session.send_http_post_to('http://localhost:3000/config/add_new_key',
|
|
24
|
+
# 'key'=>'UnitTest1', 'desc'=>'test description', 'dtype'=>'string', 'commit'=>'submit')
|
|
25
|
+
session.respond_with(200)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def on_http_res(session)
|
|
30
|
+
|
|
31
|
+
res = session.create_response(200)
|
|
32
|
+
res.set_body session.ihttp_response.body.split(/\r|\n\r|\n/), 'text/xml'
|
|
33
|
+
session.send res
|
|
34
|
+
logd("Received INVITE sent a 200 from "+name)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def on_ack(session)
|
|
38
|
+
session.request_with("bye")
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def on_success_res(session)
|
|
42
|
+
session.invalidate(true)
|
|
43
|
+
session.flow_completed_for("TestHttpClient2")
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def order
|
|
47
|
+
0
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
class UacHttpController2 < SIP::SipTestDriverController
|
|
53
|
+
|
|
54
|
+
transaction_usage :use_transactions=>true
|
|
55
|
+
|
|
56
|
+
def start
|
|
57
|
+
r = Request.create_initial("invite", "sip:nasir@sipper.com", :p_session_record=>"msg-info")
|
|
58
|
+
u = create_udp_session(SipperConfigurator[:LocalSipperIP], SipperConfigurator[:LocalTestPort])
|
|
59
|
+
u.send(r)
|
|
60
|
+
logd("Sent a new INVITE from "+name)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def on_success_res(session)
|
|
65
|
+
session.request_with('ACK')
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def on_bye(session)
|
|
69
|
+
session.respond_with(200)
|
|
70
|
+
session.invalidate(true)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
EOF
|
|
76
|
+
define_controller_from(str)
|
|
77
|
+
set_controller("SipInline::UacHttpController2")
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def test_smoke_controllers
|
|
82
|
+
self.expected_flow = ["> INVITE", "< 100", "< 200", "> ACK", "< BYE", "> 200"]
|
|
83
|
+
start_controller
|
|
84
|
+
verify_call_flow(:out)
|
|
85
|
+
self.expected_flow = ["< INVITE", "> 100", "> 200", "< ACK", "> BYE", "< 200"]
|
|
86
|
+
verify_call_flow(:in)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
require 'driven_sip_test_case'
|
|
2
|
+
|
|
3
|
+
class TestIctWithTimeout < DrivenSipTestCase
|
|
4
|
+
|
|
5
|
+
def setup
|
|
6
|
+
super
|
|
7
|
+
str = <<-EOF
|
|
8
|
+
require 'sip_test_driver_controller'
|
|
9
|
+
|
|
10
|
+
module SipInline
|
|
11
|
+
|
|
12
|
+
class UasIctTimeoutController < SIP::SipTestDriverController
|
|
13
|
+
|
|
14
|
+
def on_invite(session)
|
|
15
|
+
logd("Received INVITE in #{name} not doing anything")
|
|
16
|
+
if session['count']
|
|
17
|
+
session['count'] = session['count']+1
|
|
18
|
+
session.invalidate if session['count']==7
|
|
19
|
+
else
|
|
20
|
+
session['count'] = 1
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def order
|
|
25
|
+
0
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
class UacIctTimeoutController < SIP::SipTestDriverController
|
|
30
|
+
|
|
31
|
+
transaction_usage :use_transactions=>false, :use_ict=>true
|
|
32
|
+
transaction_timers :t1=>100, :tb=>7000
|
|
33
|
+
def start
|
|
34
|
+
r = Request.create_initial("invite", "sip:nasir@sipper.com", :p_session_record=>"msg-info")
|
|
35
|
+
u = create_udp_session(SipperConfigurator[:LocalSipperIP], SipperConfigurator[:LocalTestPort])
|
|
36
|
+
u.send(r)
|
|
37
|
+
logd("Sent a new INVITE from #{name}")
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def on_failure_res(session)
|
|
41
|
+
logd("Received response in #{name}")
|
|
42
|
+
session.invalidate
|
|
43
|
+
session.flow_completed_for("TestIctWithTimeout")
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
EOF
|
|
49
|
+
define_controller_from(str)
|
|
50
|
+
set_controller("SipInline::UacIctTimeoutController")
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def test_ict_controllers
|
|
55
|
+
self.expected_flow = ["> INVITE {6,7}", "< 408"] # transcation timeout
|
|
56
|
+
start_controller
|
|
57
|
+
verify_call_flow(:out)
|
|
58
|
+
self.expected_flow = ["< INVITE {6,7}"]
|
|
59
|
+
verify_call_flow(:in)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'driven_sip_test_case'
|
|
2
|
+
|
|
3
|
+
class TestInDialogRequest < DrivenSipTestCase
|
|
4
|
+
|
|
5
|
+
def setup
|
|
6
|
+
super
|
|
7
|
+
str = <<-EOF
|
|
8
|
+
require 'sip_test_driver_controller'
|
|
9
|
+
module SipInDialog
|
|
10
|
+
class UasInviteController < SIP::SipTestDriverController
|
|
11
|
+
def on_invite(session)
|
|
12
|
+
logd("Received INVITE in #{name}")
|
|
13
|
+
session.local_tag = 5 #todo differentiate automatically on the same container somehow
|
|
14
|
+
r = session.create_response(200, "OK")
|
|
15
|
+
session.send(r)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def on_ack(session)
|
|
19
|
+
logd("Received ACK in #{name}")
|
|
20
|
+
session.invalidate
|
|
21
|
+
session.flow_completed_for("TestInDialogRequest")
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def order
|
|
25
|
+
0
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
class UacInviteController < SIP::SipTestDriverController
|
|
30
|
+
def start
|
|
31
|
+
r = Request.create_initial("invite", "sip:nasir@sipper.com", :p_session_record=>"msg-info")
|
|
32
|
+
u = create_udp_session(SipperConfigurator[:LocalSipperIP], SipperConfigurator[:LocalTestPort])
|
|
33
|
+
#todo this MUST be fixed, this coudl easily be forgotten
|
|
34
|
+
u.record_io = yield if block_given?
|
|
35
|
+
u.send(r)
|
|
36
|
+
logd("Sent a new request from #{name}")
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def on_success_res(session)
|
|
40
|
+
logd("Received response in #{name}")
|
|
41
|
+
session.send(session.create_subsequent_request("ack"))
|
|
42
|
+
session.invalidate
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
EOF
|
|
47
|
+
define_controller_from(str)
|
|
48
|
+
set_controller("SipInDialog::UacInviteController")
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def test_indialog_controllers
|
|
53
|
+
self.expected_flow = ["> INVITE", "< 200", "> ACK"]
|
|
54
|
+
start_controller
|
|
55
|
+
verify_call_flow(:out)
|
|
56
|
+
self.expected_flow = ["< INVITE", "> 200", "< ACK"]
|
|
57
|
+
verify_call_flow(:in)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
end
|
|
61
|
+
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
require 'driven_sip_test_case'
|
|
2
|
+
|
|
3
|
+
class TestInlineController < DrivenSipTestCase
|
|
4
|
+
|
|
5
|
+
def setup
|
|
6
|
+
super
|
|
7
|
+
str = <<-EOF
|
|
8
|
+
require 'sip_test_driver_controller'
|
|
9
|
+
module TestInlineController_SipInline
|
|
10
|
+
class UasMsgController < SIP::SipTestDriverController
|
|
11
|
+
def on_message(session)
|
|
12
|
+
logd("Received MESSAGE in #{name}")
|
|
13
|
+
session.local_tag = 5 #todo differentiate automatically on the same container somehow
|
|
14
|
+
r = session.create_response(200, "OK")
|
|
15
|
+
session.send(r)
|
|
16
|
+
session.invalidate
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def order
|
|
20
|
+
0
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
class UacMsgController < SIP::SipTestDriverController
|
|
24
|
+
def start
|
|
25
|
+
r = Request.create_initial("message", "sip:nasir@sipper.com", :p_session_record=>"msg-info")
|
|
26
|
+
u = create_udp_session(SipperConfigurator[:LocalSipperIP], SipperConfigurator[:LocalTestPort])
|
|
27
|
+
#todo this MUST be fixed, this coudl easily be forgotten
|
|
28
|
+
u.record_io = yield if block_given?
|
|
29
|
+
u.send(r)
|
|
30
|
+
logd("Sent a new request from #{name}")
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def on_success_res(session)
|
|
34
|
+
logd("Received response in #{name}")
|
|
35
|
+
session.schedule_timer_for("invalidate_timer", 100)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def on_timer(session, task)
|
|
39
|
+
logd("Timer invoked in #{name}")
|
|
40
|
+
session.invalidate
|
|
41
|
+
session.flow_completed_for("TestInlineController")
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
EOF
|
|
47
|
+
define_controller_from(str)
|
|
48
|
+
set_controller("TestInlineController_SipInline::UacMsgController")
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def test_inline_controllers_with_stringio
|
|
52
|
+
self.expected_flow = ["> MESSAGE", "< 200"]
|
|
53
|
+
start_controller(true)
|
|
54
|
+
verify_call_flow(:out)
|
|
55
|
+
self.expected_flow = ["< MESSAGE", "> 200"]
|
|
56
|
+
verify_call_flow(:in)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def test_inline_controllers
|
|
60
|
+
self.expected_flow = ["> MESSAGE", "< 200"]
|
|
61
|
+
start_controller
|
|
62
|
+
verify_call_flow(:out)
|
|
63
|
+
self.expected_flow = ["< MESSAGE", "> 200"]
|
|
64
|
+
verify_call_flow(:in)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
require 'sip_test_case'
|
|
2
|
+
require 'transaction/invite_client_transaction'
|
|
3
|
+
require 'request'
|
|
4
|
+
require 'response'
|
|
5
|
+
require 'sipper_configurator'
|
|
6
|
+
require 'util/locator'
|
|
7
|
+
require 'transport/rel_unrel'
|
|
8
|
+
require 'transaction_test_helper'
|
|
9
|
+
|
|
10
|
+
# SipTestCase because it starts sipper.
|
|
11
|
+
class TestInviteClientTransaction < SipTestCase
|
|
12
|
+
|
|
13
|
+
def setup
|
|
14
|
+
super
|
|
15
|
+
@t = SipMockTester::MockTimeTransport.new
|
|
16
|
+
@tu = SipMockTester::Tu.new
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def test_initial_state
|
|
21
|
+
ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, @t, nil)
|
|
22
|
+
assert_equal("IctMap.Initial", ict.state)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
# default timer A is 500 ms
|
|
27
|
+
def test_default_timerA
|
|
28
|
+
ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, @t, nil)
|
|
29
|
+
ict.txn_send SipMockTester::MockRequest.new("INVITE")
|
|
30
|
+
sleep 5
|
|
31
|
+
_assert_deltas(@t, 500, 4)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def test_override_T1
|
|
35
|
+
ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, @t, nil) {self.t1 = 100}
|
|
36
|
+
ict.txn_send SipMockTester::MockRequest.new("INVITE")
|
|
37
|
+
sleep 2 # you should have invites at [0, 100, 300, 700] -> 0.7 sec
|
|
38
|
+
_assert_deltas(@t, 100, 4)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def test_override_timerA
|
|
42
|
+
ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, @t, nil) {self.ta = 100}
|
|
43
|
+
ict.txn_send SipMockTester::MockRequest.new("INVITE")
|
|
44
|
+
sleep 2 # you should have invites at [0, 100, 300, 700] -> 0.7 sec
|
|
45
|
+
_assert_deltas(@t, 100, 4)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def test_default_timerB
|
|
50
|
+
ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, @t, nil) {self.t1 = 100}
|
|
51
|
+
ict.txn_send SipMockTester::MockRequest.new("INVITE")
|
|
52
|
+
assert_equal("IctMap.Calling", ict.state)
|
|
53
|
+
sleep 8 # 64*t1 is when it will terminate
|
|
54
|
+
_assert_deltas(@t, 100, 7)
|
|
55
|
+
assert_equal("IctMap.Terminated", ict.state) # as timer B would have fired by now
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def test_override_timerB
|
|
59
|
+
ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, @t, nil) {self.tb = 100}
|
|
60
|
+
ict.txn_send SipMockTester::MockRequest.new("INVITE")
|
|
61
|
+
sleep 0.5
|
|
62
|
+
assert_equal("IctMap.Terminated", ict.state)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def test_provisional
|
|
66
|
+
ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, @t, nil) { self.t1=100 }
|
|
67
|
+
ict.txn_send SipMockTester::MockRequest.new("INVITE")
|
|
68
|
+
ict.txn_received SipMockTester::MockResponse.new(100)
|
|
69
|
+
assert_equal(1, @t.msg.length)
|
|
70
|
+
assert_equal("IctMap.Proceeding", ict.state)
|
|
71
|
+
assert(ict.consume?)
|
|
72
|
+
sleep 0.5
|
|
73
|
+
assert_equal(1, @t.msg.length) # still not retransmit because provisional stops retransmit.
|
|
74
|
+
# now once in proceeding state a provisional should keep you here
|
|
75
|
+
ict.txn_received SipMockTester::MockResponse.new(100)
|
|
76
|
+
assert_equal("IctMap.Proceeding", ict.state)
|
|
77
|
+
assert(ict.consume?)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def test_invite_ack
|
|
82
|
+
ict, res = _send_inv_recv_res_send_ack false
|
|
83
|
+
assert_match("INVITE", @tm.msg[0])
|
|
84
|
+
assert_match("ACK", @tm.msg[1])
|
|
85
|
+
assert_match("Via: SIP/2.0/UDP 127.0.0.1:5060;branch=z9hG4bK-1-0-1", @tm.msg[1]) # ACK Via
|
|
86
|
+
assert_match("Cseq: 1 ACK", @tm.msg[1])
|
|
87
|
+
assert_match("To: Sut <sip:sut@127.0.0.1:5061>;tag=123", @tm.msg[1])
|
|
88
|
+
assert_no_match(/tag=123/, @tm.msg[0])
|
|
89
|
+
assert_match("To: Sut <sip:sut@127.0.0.1:5061>", @tm.msg[0])
|
|
90
|
+
assert(ict.consume?)
|
|
91
|
+
assert_equal("IctMap.Completed", @ict.state)
|
|
92
|
+
# resend the 400 response
|
|
93
|
+
ict.txn_received(res)
|
|
94
|
+
assert_equal("IctMap.Completed", @ict.state)
|
|
95
|
+
assert_match("ACK", @tm.msg[2])
|
|
96
|
+
assert(!ict.consume?)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def test_invite_ack_in_proceeding
|
|
100
|
+
ict, res = _send_inv_recv_res_send_ack true
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def test_override_timerD
|
|
104
|
+
orig = SipperConfigurator[:TransactionTimers]
|
|
105
|
+
SipperConfigurator[:TransactionTimers] = { :td=>400 }
|
|
106
|
+
_send_inv_recv_res_send_ack false
|
|
107
|
+
SipperConfigurator[:TransactionTimers] = orig
|
|
108
|
+
assert_equal("IctMap.Completed", @ict.state)
|
|
109
|
+
sleep 1
|
|
110
|
+
assert_equal("IctMap.Terminated", @ict.state)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def test_success_final
|
|
114
|
+
ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, @t, nil)
|
|
115
|
+
ict.txn_send SipMockTester::MockRequest.new("INVITE")
|
|
116
|
+
ict.txn_received SipMockTester::MockResponse.new(180)
|
|
117
|
+
assert_equal(1, @t.msg.length)
|
|
118
|
+
assert_equal("IctMap.Proceeding", ict.state)
|
|
119
|
+
assert(ict.consume?)
|
|
120
|
+
ict.txn_received SipMockTester::MockResponse.new(200)
|
|
121
|
+
assert_equal("IctMap.Terminated", ict.state)
|
|
122
|
+
assert(ict.consume?)
|
|
123
|
+
|
|
124
|
+
# before prov.
|
|
125
|
+
ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, @t, nil)
|
|
126
|
+
ict.txn_send SipMockTester::MockRequest.new("INVITE")
|
|
127
|
+
assert_equal("IctMap.Calling", ict.state)
|
|
128
|
+
ict.txn_received SipMockTester::MockResponse.new(200)
|
|
129
|
+
assert_equal("IctMap.Terminated", ict.state)
|
|
130
|
+
assert(ict.consume?)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def test_trans_exception
|
|
134
|
+
t = SipMockTester::ExceptionalTransportOnNthAttempt.new(1)
|
|
135
|
+
ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, t, nil)
|
|
136
|
+
assert_equal("IctMap.Initial", ict.state)
|
|
137
|
+
ict.txn_send SipMockTester::MockRequest.new("INVITE")
|
|
138
|
+
assert_equal("IctMap.Terminated", ict.state)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def test_trans_exception_on_retransmit
|
|
142
|
+
t = SipMockTester::ExceptionalTransportOnNthAttempt.new(2)
|
|
143
|
+
ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, t, nil)
|
|
144
|
+
assert_equal("IctMap.Initial", ict.state)
|
|
145
|
+
ict.txn_send SipMockTester::MockRequest.new("INVITE")
|
|
146
|
+
assert_equal("IctMap.Calling", ict.state)
|
|
147
|
+
sleep 1
|
|
148
|
+
assert_equal("IctMap.Terminated", ict.state)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def test_trans_exception_with_tu
|
|
152
|
+
t = SipMockTester::ExceptionalTransportOnNthAttempt.new(1)
|
|
153
|
+
assert_nil(@tu.txn)
|
|
154
|
+
ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, t, nil)
|
|
155
|
+
assert_equal("IctMap.Initial", ict.state)
|
|
156
|
+
ict.txn_send SipMockTester::MockRequest.new("INVITE")
|
|
157
|
+
assert_equal("IctMap.Terminated", ict.state)
|
|
158
|
+
assert_equal(ict, @tu.txn)
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def test_no_timerA_reliable
|
|
162
|
+
ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, @t, nil) {self.t1 = 100}
|
|
163
|
+
rt = @t.dup # make the
|
|
164
|
+
rt.extend(SIP::Transport::ReliableTransport) # transport reliable
|
|
165
|
+
ict.txn_send SipMockTester::MockRequest.new("INVITE")
|
|
166
|
+
sleep 2
|
|
167
|
+
assert(1, rt.msg.length) # no retransmission with realiable trans
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def test_timerB_with_reliable
|
|
171
|
+
ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, @t, nil) {self.tb = 100}
|
|
172
|
+
rt = @t.dup # make the
|
|
173
|
+
rt.extend(SIP::Transport::ReliableTransport) # transport reliable
|
|
174
|
+
ict.txn_send SipMockTester::MockRequest.new("INVITE")
|
|
175
|
+
sleep 0.5
|
|
176
|
+
assert_equal("IctMap.Terminated", ict.state)
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
def test_timerD_with_reliable
|
|
180
|
+
_send_inv_recv_res_send_ack(false, true) # since timer D is run for 0 time it should be instantanous
|
|
181
|
+
sleep 0.5 # just giving some time for transcation to cleanup.
|
|
182
|
+
assert_equal("IctMap.Terminated", @ict.state)
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
# default, proceed with no change
|
|
186
|
+
def test_txn_handler1
|
|
187
|
+
tcbh = SipMockTester::Tcbh1.new
|
|
188
|
+
ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, tcbh, @t, nil)
|
|
189
|
+
ict.txn_send SipMockTester::MockRequest.new("INVITE")
|
|
190
|
+
assert_equal("IctMap.Calling", ict.state)
|
|
191
|
+
assert_equal("IctMap.Initial", tcbh.states[0]) # before
|
|
192
|
+
assert_equal("IctMap.Calling", tcbh.states[1]) # after
|
|
193
|
+
assert_equal(1, @t.msg.length)
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
# state change but no action masker
|
|
197
|
+
def test_txn_handler2
|
|
198
|
+
tcbh = SipMockTester::Tcbh2.new
|
|
199
|
+
ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, tcbh, @t, nil)
|
|
200
|
+
ict.txn_send SipMockTester::MockRequest.new("INVITE")
|
|
201
|
+
assert_equal("IctMap.Calling", ict.state)
|
|
202
|
+
assert_equal(0, @t.msg.length)
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# do not proceed
|
|
206
|
+
def test_txn_handler3
|
|
207
|
+
tcbh = SipMockTester::Tcbh3.new
|
|
208
|
+
ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, tcbh, @t, nil)
|
|
209
|
+
ict.txn_send SipMockTester::MockRequest.new("INVITE")
|
|
210
|
+
assert_equal("IctMap.Initial", ict.state)
|
|
211
|
+
assert_equal(0, @t.msg.length)
|
|
212
|
+
assert(tcbh.txn.is_a?(SIP::Transaction::InviteClientTransaction))
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
# illegal state test
|
|
216
|
+
def test_txn_handler4
|
|
217
|
+
tcbh = SipMockTester::Tcbh4.new
|
|
218
|
+
ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, tcbh, @t, nil)
|
|
219
|
+
ict.txn_send SipMockTester::MockRequest.new("INVITE")
|
|
220
|
+
assert_equal("IctMap.Calling", ict.state)
|
|
221
|
+
assert_equal(1, @t.msg.length)
|
|
222
|
+
assert_nil(tcbh.txn)
|
|
223
|
+
ict.txn_send SipMockTester::MockRequest.new("INVITE") # you cannot send an INVITE in Calling.
|
|
224
|
+
assert(tcbh.txn.is_a?(SIP::Transaction::InviteClientTransaction))
|
|
225
|
+
assert_equal("IctMap.Calling", ict.state)
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
def _assert_deltas(t, delta, times)
|
|
229
|
+
1.upto(times-1) do |x|
|
|
230
|
+
# as it is +/- for both timers, and allowing for an error factor of 1 so 3.0
|
|
231
|
+
assert_in_delta(t.msg[x-1]+delta, t.msg[x], SIP::Locator[:Sth].granularity * 3.0)
|
|
232
|
+
delta *= 2
|
|
233
|
+
end
|
|
234
|
+
rescue Test::Unit::AssertionFailedError
|
|
235
|
+
t.msg.each {|m| print "#{m},"}
|
|
236
|
+
puts
|
|
237
|
+
raise
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
def _send_inv_recv_res_send_ack(provisional, reliable=false)
|
|
241
|
+
t = SipMockTester::MockMsgTransport.new
|
|
242
|
+
if reliable
|
|
243
|
+
@tm = t.dup
|
|
244
|
+
@tm.extend(SIP::Transport::ReliableTransport)
|
|
245
|
+
else
|
|
246
|
+
@tm = t
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
inv = Request.create_initial("invite", "sip:nasir@sipper.com")
|
|
250
|
+
inv.max_forwards = "70"
|
|
251
|
+
inv.call_id = "1-234@sipper.com"
|
|
252
|
+
inv.via = "SIP/2.0/UDP 127.0.0.1:5060;branch=z9hG4bK-1-0-1"
|
|
253
|
+
inv.from = "Sipper <sip:sipper@127.0.0.1:5060>;tag=1"
|
|
254
|
+
inv.to = "Sut <sip:sut@127.0.0.1:5061>"
|
|
255
|
+
inv.cseq = "1 INVITE"
|
|
256
|
+
@ict = SIP::Transaction::InviteClientTransaction.new(SipMockTester::Tu.new, nil, nil, @tm, nil)
|
|
257
|
+
|
|
258
|
+
@ict.txn_send inv
|
|
259
|
+
|
|
260
|
+
if provisional
|
|
261
|
+
@ict.txn_received SipMockTester::MockResponse.new(183)
|
|
262
|
+
assert_equal("IctMap.Proceeding", @ict.state)
|
|
263
|
+
end
|
|
264
|
+
res = Response.create(400, "Bad Request")
|
|
265
|
+
res.copy_from(inv, :from, :call_id, :cseq, :via, :to)
|
|
266
|
+
res.to = inv.to.to_s + ";tag=123"
|
|
267
|
+
@ict.txn_received(res)
|
|
268
|
+
[@ict, res]
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
private :_assert_deltas, :_send_inv_recv_res_send_ack
|
|
272
|
+
end
|