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.
Files changed (326) hide show
  1. data/sipper/README.rb +26 -0
  2. data/sipper/b2bua_controller.rb +163 -0
  3. data/sipper/b2bua_session_mixin.rb +24 -0
  4. data/sipper/base_controller.rb +425 -0
  5. data/sipper/bin/common.rb +42 -0
  6. data/sipper/bin/generate.rb +70 -0
  7. data/sipper/bin/project.rb +44 -0
  8. data/sipper/bin/run.rb +85 -0
  9. data/sipper/bin/run_smoke.rb +8 -0
  10. data/sipper/config/log4r.xml +71 -0
  11. data/sipper/controller_class_loader.rb +29 -0
  12. data/sipper/controller_selector.rb +119 -0
  13. data/sipper/controllers/invite_controller.rb +30 -0
  14. data/sipper/controllers/order.yaml +3 -0
  15. data/sipper/custom_message.rb +4 -0
  16. data/sipper/detached_session.rb +11 -0
  17. data/sipper/docs/manual.txt +1621 -0
  18. data/sipper/generators/README +12 -0
  19. data/sipper/generators/gen_controller.rb +228 -0
  20. data/sipper/generators/gen_project.rb +45 -0
  21. data/sipper/generators/gen_test.rb +72 -0
  22. data/sipper/generators/project_template_dir/Rakefile +56 -0
  23. data/sipper/generators/project_template_dir/config/sipper.cfg +31 -0
  24. data/sipper/generators/project_template_dir/controllers/README.txt +2 -0
  25. data/sipper/generators/project_template_dir/dot_sipper.proj +2 -0
  26. data/sipper/generators/project_template_dir/logs/README.txt +2 -0
  27. data/sipper/generators/project_template_dir/tests/README.txt +2 -0
  28. data/sipper/lib/smc/statemap.rb +194 -0
  29. data/sipper/logs/dialog_info_store +0 -0
  30. data/sipper/logs/r.cmd +6 -0
  31. data/sipper/logs/r.sh +6 -0
  32. data/sipper/media/sipper_media_client.rb +268 -0
  33. data/sipper/media/sipper_media_event.rb +43 -0
  34. data/sipper/media/sipper_media_manager.rb +145 -0
  35. data/sipper/media/sipper_media_proxy.rb +60 -0
  36. data/sipper/media/sipper_offer_answer.rb +285 -0
  37. data/sipper/message.rb +512 -0
  38. data/sipper/modified_pattern_formatter.rb +119 -0
  39. data/sipper/proxy_controller.rb +143 -0
  40. data/sipper/registration.rb +52 -0
  41. data/sipper/request.rb +109 -0
  42. data/sipper/response.rb +123 -0
  43. data/sipper/ruby_ext/module.rb +27 -0
  44. data/sipper/ruby_ext/mutable_class.rb +17 -0
  45. data/sipper/ruby_ext/object.rb +38 -0
  46. data/sipper/ruby_ext/pqueue.rb +190 -0
  47. data/sipper/ruby_ext/snapshot.rb +201 -0
  48. data/sipper/ruby_ext/string.rb +18 -0
  49. data/sipper/ruby_ext/time.rb +9 -0
  50. data/sipper/run/run_sipper1.rb +28 -0
  51. data/sipper/run/run_sipper2.rb +56 -0
  52. data/sipper/sdp/sdp.rb +257 -0
  53. data/sipper/sdp/sdp_generator.rb +131 -0
  54. data/sipper/sdp/sdp_parser.rb +136 -0
  55. data/sipper/session.rb +1952 -0
  56. data/sipper/session_manager.rb +170 -0
  57. data/sipper/session_recorder.rb +190 -0
  58. data/sipper/session_state/DialogState.sm +54 -0
  59. data/sipper/session_state/DialogState_sm.rb +337 -0
  60. data/sipper/session_state/dialog_routes.rb +141 -0
  61. data/sipper/sip_headers/header.rb +632 -0
  62. data/sipper/sip_headers/sipuri.rb +352 -0
  63. data/sipper/sip_logger.rb +65 -0
  64. data/sipper/sip_message_router.rb +231 -0
  65. data/sipper/sip_test_driver_controller.rb +10 -0
  66. data/sipper/sipper.rb +329 -0
  67. data/sipper/sipper_assertions.rb +21 -0
  68. data/sipper/sipper_configurator.rb +376 -0
  69. data/sipper/sipper_http/sipper_http_request_dispatcher.rb +71 -0
  70. data/sipper/sipper_http/sipper_http_response.rb +25 -0
  71. data/sipper/stray_message_manager.rb +40 -0
  72. data/sipper/test_completion_signaling_helper.rb +77 -0
  73. data/sipper/transaction/Ict.sm +59 -0
  74. data/sipper/transaction/Ict_sm.rb +430 -0
  75. data/sipper/transaction/Ist.sm +74 -0
  76. data/sipper/transaction/Ist_sm.rb +460 -0
  77. data/sipper/transaction/Nict.sm +51 -0
  78. data/sipper/transaction/Nict_sm.rb +325 -0
  79. data/sipper/transaction/Nist.sm +59 -0
  80. data/sipper/transaction/Nist_sm.rb +356 -0
  81. data/sipper/transaction/invite_client_transaction.rb +274 -0
  82. data/sipper/transaction/invite_server_transaction.rb +319 -0
  83. data/sipper/transaction/non_invite_client_transaction.rb +230 -0
  84. data/sipper/transaction/non_invite_server_transaction.rb +263 -0
  85. data/sipper/transaction/state_machine_wrapper.rb +58 -0
  86. data/sipper/transaction/transaction.rb +212 -0
  87. data/sipper/transport/base_transport.rb +84 -0
  88. data/sipper/transport/rel_unrel.rb +19 -0
  89. data/sipper/transport/transport_and_route_resolver.rb +67 -0
  90. data/sipper/transport/udp_transport.rb +156 -0
  91. data/sipper/transport_manager.rb +33 -0
  92. data/sipper/udp_session.rb +17 -0
  93. data/sipper/util/command_element.rb +62 -0
  94. data/sipper/util/compact_converter.rb +50 -0
  95. data/sipper/util/counter.rb +26 -0
  96. data/sipper/util/digest/digest_authorizer.rb +204 -0
  97. data/sipper/util/expectation_parser.rb +164 -0
  98. data/sipper/util/locator.rb +31 -0
  99. data/sipper/util/message_fill.rb +58 -0
  100. data/sipper/util/persistence/ps_sipper_map.rb +63 -0
  101. data/sipper/util/persistence/sipper_map.rb +41 -0
  102. data/sipper/util/sipper_util.rb +305 -0
  103. data/sipper/util/timer/sip_timer_helper.rb +26 -0
  104. data/sipper/util/timer/timer_manager.rb +80 -0
  105. data/sipper/util/timer/timer_task.rb +56 -0
  106. data/sipper/util/validations.rb +44 -0
  107. data/sipper/version.rb +10 -0
  108. data/sipper_test/_test_media_uas.rb +79 -0
  109. data/sipper_test/base_test_case.rb +31 -0
  110. data/sipper_test/c_134.txt +7 -0
  111. data/sipper_test/driven_sip_test_case.rb +96 -0
  112. data/sipper_test/gold.txt +10 -0
  113. data/sipper_test/gold_res.txt +8 -0
  114. data/sipper_test/gold_sub.txt +9 -0
  115. data/sipper_test/hello_sipper.au +0 -0
  116. data/sipper_test/in_sipper.au +0 -0
  117. data/sipper_test/nonrr_proxy.rb +17 -0
  118. data/sipper_test/order_tests.yaml +4 -0
  119. data/sipper_test/rake_res.txt +399 -0
  120. data/sipper_test/rr_proxy.rb +17 -0
  121. data/sipper_test/run_test.cmd +94 -0
  122. data/sipper_test/sip_test_case.rb +104 -0
  123. data/sipper_test/test2xx_retransmission.rb +80 -0
  124. data/sipper_test/test2xx_retransmission_with_limit.rb +81 -0
  125. data/sipper_test/test2xx_retransmission_with_nist.rb +91 -0
  126. data/sipper_test/test2xx_retransmission_with_txns.rb +94 -0
  127. data/sipper_test/test_address_header.rb +66 -0
  128. data/sipper_test/test_b2bua1.rb +130 -0
  129. data/sipper_test/test_b2bua2.rb +120 -0
  130. data/sipper_test/test_b2bua3.rb +160 -0
  131. data/sipper_test/test_b2bua4.rb +130 -0
  132. data/sipper_test/test_base_controller.rb +110 -0
  133. data/sipper_test/test_base_transport.rb +37 -0
  134. data/sipper_test/test_cancel.rb +21 -0
  135. data/sipper_test/test_cancel_after2xx.rb +81 -0
  136. data/sipper_test/test_cancel_retransmission.rb +105 -0
  137. data/sipper_test/test_cancel_with481.rb +83 -0
  138. data/sipper_test/test_cancel_with487.rb +70 -0
  139. data/sipper_test/test_cancel_with_ist_without_nist.rb +99 -0
  140. data/sipper_test/test_cancel_with_nist.rb +84 -0
  141. data/sipper_test/test_cancel_without487.rb +77 -0
  142. data/sipper_test/test_command_element.rb +38 -0
  143. data/sipper_test/test_compact_converter.rb +33 -0
  144. data/sipper_test/test_controller_class_loader.rb +37 -0
  145. data/sipper_test/test_controller_selector.rb +53 -0
  146. data/sipper_test/test_controller_using_compact_headers.rb +74 -0
  147. data/sipper_test/test_controller_using_header_order.rb +85 -0
  148. data/sipper_test/test_controller_using_ict.rb +64 -0
  149. data/sipper_test/test_controller_using_ict_with_non_success.rb +72 -0
  150. data/sipper_test/test_controller_using_ict_with_tcbh.rb +24 -0
  151. data/sipper_test/test_controller_using_ict_with_tcbh_no_action.rb +24 -0
  152. data/sipper_test/test_controller_using_ist.rb +70 -0
  153. data/sipper_test/test_controller_using_ist_with_tcbh.rb +24 -0
  154. data/sipper_test/test_controller_using_nict.rb +115 -0
  155. data/sipper_test/test_controller_using_nict_with_tcbh.rb +24 -0
  156. data/sipper_test/test_controller_using_nist.rb +63 -0
  157. data/sipper_test/test_controller_using_pre_existing_rs0.rb +73 -0
  158. data/sipper_test/test_controller_using_pre_existing_rs1.rb +75 -0
  159. data/sipper_test/test_controller_using_pre_existing_rs2.rb +71 -0
  160. data/sipper_test/test_controller_using_route_set.rb +86 -0
  161. data/sipper_test/test_controller_with_sdp.rb +80 -0
  162. data/sipper_test/test_controllers/cancel/order.yaml +2 -0
  163. data/sipper_test/test_controllers/cancel/uac_cancel_controller.rb +35 -0
  164. data/sipper_test/test_controllers/cancel/uas_cancel_controller.rb +25 -0
  165. data/sipper_test/test_controllers/class_loading/ordered/first_ordered_controller.rb +5 -0
  166. data/sipper_test/test_controllers/class_loading/ordered/order.yaml +3 -0
  167. data/sipper_test/test_controllers/class_loading/ordered/recond_ordered_controller.rb +6 -0
  168. data/sipper_test/test_controllers/class_loading/ordered/second_ordered_controller.rb +6 -0
  169. data/sipper_test/test_controllers/class_loading/unordered/first_unordered_controller.rb +7 -0
  170. data/sipper_test/test_controllers/class_loading/unordered/second_unordered_controller.rb +6 -0
  171. data/sipper_test/test_controllers/ctrl_trhandler/lib/transport_filters/my_transport_handler.rb +22 -0
  172. data/sipper_test/test_controllers/ctrl_trhandler/uac_tr_handler_controller.rb +27 -0
  173. data/sipper_test/test_controllers/ctrl_trhandler/uas_tr_handler_controller.rb +21 -0
  174. data/sipper_test/test_controllers/ete/order.yaml +1 -0
  175. data/sipper_test/test_controllers/ete/uac_controller.rb +39 -0
  176. data/sipper_test/test_controllers/ete/uas_controller.rb +34 -0
  177. data/sipper_test/test_controllers/extensions/extension_uac_controller.rb +24 -0
  178. data/sipper_test/test_controllers/extensions/extension_uas_controller.rb +35 -0
  179. data/sipper_test/test_controllers/extensions/lib/sipper_extensions/my_from_extension.rb +16 -0
  180. data/sipper_test/test_controllers/ict_tcbh/lib/transaction_handlers/app_ict_handler.rb +23 -0
  181. data/sipper_test/test_controllers/ict_tcbh/uac_ict_tcbh_controller.rb +27 -0
  182. data/sipper_test/test_controllers/ict_tcbh/uac_ict_tcbh_no_action_controller.rb +28 -0
  183. data/sipper_test/test_controllers/ict_tcbh/uas_ict_tcbh_controller.rb +29 -0
  184. data/sipper_test/test_controllers/ict_tcbh/uas_ict_tcbh_no_action_controller.rb +31 -0
  185. data/sipper_test/test_controllers/ist_tcbh/lib/app_ist_handler.rb +13 -0
  186. data/sipper_test/test_controllers/ist_tcbh/uac_ist_tcbh_controller.rb +22 -0
  187. data/sipper_test/test_controllers/ist_tcbh/uas_ist_tcbh_controller.rb +31 -0
  188. data/sipper_test/test_controllers/multi_trhandlers/lib/transport_filters/in_order.yaml +2 -0
  189. data/sipper_test/test_controllers/multi_trhandlers/lib/transport_filters/my_transport_handler1.rb +21 -0
  190. data/sipper_test/test_controllers/multi_trhandlers/lib/transport_filters/my_transport_handler2.rb +21 -0
  191. data/sipper_test/test_controllers/multi_trhandlers/lib/transport_filters/out_order.yaml +2 -0
  192. data/sipper_test/test_controllers/multi_trhandlers/uac_multi_tr_handler_controller.rb +27 -0
  193. data/sipper_test/test_controllers/multi_trhandlers/uas_multi_tr_handler_controller.rb +29 -0
  194. data/sipper_test/test_controllers/multiple/lib/blank_test.rb +2 -0
  195. data/sipper_test/test_controllers/multiple/uac_info_controller.rb +21 -0
  196. data/sipper_test/test_controllers/multiple/uac_msg_controller.rb +20 -0
  197. data/sipper_test/test_controllers/multiple/uas_info_controller.rb +15 -0
  198. data/sipper_test/test_controllers/multiple/uas_msg_controller.rb +14 -0
  199. data/sipper_test/test_controllers/nict_tcbh/lib/transaction_handlers/app_nict_handler.rb +13 -0
  200. data/sipper_test/test_controllers/nict_tcbh/uac_nict_tcbh_controller.rb +26 -0
  201. data/sipper_test/test_controllers/nict_tcbh/uas_nict_tcbh_controller.rb +20 -0
  202. data/sipper_test/test_controllers/state_machine_based/lib/CreditControl.sm +43 -0
  203. data/sipper_test/test_controllers/state_machine_based/lib/CreditControl_sm.rb +194 -0
  204. data/sipper_test/test_controllers/state_machine_based/order.yaml +1 -0
  205. data/sipper_test/test_controllers/state_machine_based/uac_message_controller.rb +34 -0
  206. data/sipper_test/test_controllers/state_machine_based/uas_message_controller.rb +44 -0
  207. data/sipper_test/test_controllers/stray_message/lib/sipper_extensions/my_stray_handler.rb +9 -0
  208. data/sipper_test/test_controllers/stray_message/stray_uac_controller.rb +24 -0
  209. data/sipper_test/test_controllers/stray_message/stray_uas_controller.rb +31 -0
  210. data/sipper_test/test_controllers/string/order.yaml +1 -0
  211. data/sipper_test/test_controllers/string/uac_controller.rb +29 -0
  212. data/sipper_test/test_controllers/string/uas_controller.rb +22 -0
  213. data/sipper_test/test_controllers/test_controller.rb +24 -0
  214. data/sipper_test/test_detached_session1.rb +78 -0
  215. data/sipper_test/test_dialog_routes.rb +139 -0
  216. data/sipper_test/test_digest_challenge1.rb +89 -0
  217. data/sipper_test/test_digest_challenge2.rb +90 -0
  218. data/sipper_test/test_dynamic_parse.rb +249 -0
  219. data/sipper_test/test_empty_sdp.rb +89 -0
  220. data/sipper_test/test_ete.rb +37 -0
  221. data/sipper_test/test_expectation_parser.rb +76 -0
  222. data/sipper_test/test_extensions.rb +28 -0
  223. data/sipper_test/test_freeze.rb +81 -0
  224. data/sipper_test/test_generated.rb +90 -0
  225. data/sipper_test/test_header_parameters.rb +75 -0
  226. data/sipper_test/test_header_parse.rb +141 -0
  227. data/sipper_test/test_http_client1.rb +84 -0
  228. data/sipper_test/test_http_client2.rb +90 -0
  229. data/sipper_test/test_ict_with_timeout.rb +62 -0
  230. data/sipper_test/test_in_dialog_request.rb +61 -0
  231. data/sipper_test/test_inline_controller.rb +67 -0
  232. data/sipper_test/test_invite_client_transaction.rb +272 -0
  233. data/sipper_test/test_invite_replace.rb +147 -0
  234. data/sipper_test/test_invite_retransmission.rb +90 -0
  235. data/sipper_test/test_invite_server_transaction.rb +208 -0
  236. data/sipper_test/test_lower_cseq.rb +79 -0
  237. data/sipper_test/test_media.rb +52 -0
  238. data/sipper_test/test_message.rb +392 -0
  239. data/sipper_test/test_method_specific_response_handling.rb +81 -0
  240. data/sipper_test/test_multi_homed1.rb +127 -0
  241. data/sipper_test/test_multi_homed2.rb +109 -0
  242. data/sipper_test/test_multi_homed_duplicate.rb +87 -0
  243. data/sipper_test/test_multi_homed_with_detached.rb +88 -0
  244. data/sipper_test/test_multiple.rb +49 -0
  245. data/sipper_test/test_multiple_contacts.rb +89 -0
  246. data/sipper_test/test_non2xx_retransmission_with_ist.rb +87 -0
  247. data/sipper_test/test_non_invite_client_transaction.rb +210 -0
  248. data/sipper_test/test_non_invite_retransmission.rb +91 -0
  249. data/sipper_test/test_non_invite_server_transaction.rb +202 -0
  250. data/sipper_test/test_offer_answer_prack.rb +103 -0
  251. data/sipper_test/test_pickup.rb +258 -0
  252. data/sipper_test/test_prack.rb +105 -0
  253. data/sipper_test/test_prack_store_and_dispatch.rb +101 -0
  254. data/sipper_test/test_prack_timer.rb +105 -0
  255. data/sipper_test/test_ps_sipper_map.rb +56 -0
  256. data/sipper_test/test_re_invite_uas_ongoing_ict.rb +81 -0
  257. data/sipper_test/test_re_invite_uas_ongoing_ist.rb +84 -0
  258. data/sipper_test/test_re_invite_with_ongoing_ict.rb +101 -0
  259. data/sipper_test/test_re_invite_with_ongoing_ist.rb +89 -0
  260. data/sipper_test/test_recorder_swap.rb +157 -0
  261. data/sipper_test/test_refer.rb +121 -0
  262. data/sipper_test/test_registeration_clearing.rb +97 -0
  263. data/sipper_test/test_registrar.rb +109 -0
  264. data/sipper_test/test_registration_controller.rb +73 -0
  265. data/sipper_test/test_registration_timeout.rb +90 -0
  266. data/sipper_test/test_remote_controller.rb +39 -0
  267. data/sipper_test/test_remote_target_update_on2xx.rb +140 -0
  268. data/sipper_test/test_request.rb +106 -0
  269. data/sipper_test/test_response.rb +40 -0
  270. data/sipper_test/test_response_without_to_tag.rb +92 -0
  271. data/sipper_test/test_rport.rb +88 -0
  272. data/sipper_test/test_sdp.rb +91 -0
  273. data/sipper_test/test_sdp_parser.rb +145 -0
  274. data/sipper_test/test_session.rb +276 -0
  275. data/sipper_test/test_session_callback_handler.rb +68 -0
  276. data/sipper_test/test_session_lifetime.rb +66 -0
  277. data/sipper_test/test_session_manager.rb +141 -0
  278. data/sipper_test/test_session_recorder.rb +145 -0
  279. data/sipper_test/test_session_state_user_defined.rb +84 -0
  280. data/sipper_test/test_session_states.rb +91 -0
  281. data/sipper_test/test_simple_dialog_state.rb +86 -0
  282. data/sipper_test/test_simple_re_invite.rb +86 -0
  283. data/sipper_test/test_sip_uri.rb +234 -0
  284. data/sipper_test/test_sipper_util.rb +45 -0
  285. data/sipper_test/test_smc_controller.rb +17 -0
  286. data/sipper_test/test_smoke.rb +80 -0
  287. data/sipper_test/test_stray.rb +28 -0
  288. data/sipper_test/test_stray_inline.rb +89 -0
  289. data/sipper_test/test_stray_res_acked.rb +103 -0
  290. data/sipper_test/test_stray_respond.rb +104 -0
  291. data/sipper_test/test_stray_retry.rb +92 -0
  292. data/sipper_test/test_stray_retry_failure.rb +93 -0
  293. data/sipper_test/test_stray_retry_initial.rb +100 -0
  294. data/sipper_test/test_strict_router_with_angled.rb +84 -0
  295. data/sipper_test/test_string_record.rb +31 -0
  296. data/sipper_test/test_subscribe_notify.rb +141 -0
  297. data/sipper_test/test_subscribe_notify_client_timeout.rb +158 -0
  298. data/sipper_test/test_subscribe_notify_dialog.rb +146 -0
  299. data/sipper_test/test_subscribe_notify_expires.rb +155 -0
  300. data/sipper_test/test_subscribe_notify_multiple_subscription.rb +157 -0
  301. data/sipper_test/test_subscribe_notify_server_timeout.rb +144 -0
  302. data/sipper_test/test_subsequent_unsent.rb +88 -0
  303. data/sipper_test/test_target_refresh_proxy_detached.rb +128 -0
  304. data/sipper_test/test_target_refresh_proxy_udp.rb +130 -0
  305. data/sipper_test/test_target_refresh_rr_proxy_udp.rb +133 -0
  306. data/sipper_test/test_target_refresh_with_new_port.rb +158 -0
  307. data/sipper_test/test_target_refresh_with_proxy1.rb +113 -0
  308. data/sipper_test/test_target_refresh_with_rr_update_proxy.rb +145 -0
  309. data/sipper_test/test_target_refresh_with_update_proxy.rb +144 -0
  310. data/sipper_test/test_target_refresh_with_update_proxy2.rb +139 -0
  311. data/sipper_test/test_timer_manager.rb +71 -0
  312. data/sipper_test/test_timer_task.rb +60 -0
  313. data/sipper_test/test_transport_handler.rb +19 -0
  314. data/sipper_test/test_transport_multi_handler.rb +18 -0
  315. data/sipper_test/test_udp_transport.rb +119 -0
  316. data/sipper_test/test_unparsed.rb +70 -0
  317. data/sipper_test/test_validations.rb +69 -0
  318. data/sipper_test/test_with_rr_proxy.rb +111 -0
  319. data/sipper_test/testmediacontroller.rb +71 -0
  320. data/sipper_test/tracing.rb +23 -0
  321. data/sipper_test/transaction_test_helper.rb +176 -0
  322. data/sipper_test/transport_filters.rb +26 -0
  323. data/sipper_test/ts_sipper.rb +91 -0
  324. data/sipper_test/ts_smoke.rb +3 -0
  325. data/sipper_test/tt.cmd +20 -0
  326. metadata +455 -0
@@ -0,0 +1,89 @@
1
+
2
+ require 'driven_sip_test_case'
3
+
4
+
5
+ class TestMultipleContacts < DrivenSipTestCase
6
+
7
+ def setup
8
+ super
9
+ str = <<-EOF
10
+
11
+ require 'sip_test_driver_controller'
12
+
13
+ module SipInline
14
+ class UasMcController < SIP::SipTestDriverController
15
+
16
+ transaction_usage :use_transactions=>true
17
+
18
+ def on_invite(session)
19
+ session.do_record(session.irequest.contacts[0])
20
+ session.do_record(session.irequest.contacts[1])
21
+ r = session.create_response(200)
22
+ r.contact = "sip:xyz@sipper.com"
23
+ r.contact.expires='500'
24
+ r.add_contact("mailto:xyz@sipper.com")
25
+ r.contacts[1].expires='400'
26
+ session.send r
27
+ logd("Received INVITE sent a 200 from "+name)
28
+ end
29
+
30
+ def on_ack(session)
31
+ session.request_with("bye")
32
+ end
33
+
34
+ def on_success_res(session)
35
+ session.invalidate(true)
36
+ session.flow_completed_for("TestMultipleContacts")
37
+ end
38
+
39
+ def order
40
+ 0
41
+ end
42
+
43
+ end
44
+
45
+ class UacMcController < SIP::SipTestDriverController
46
+
47
+ transaction_usage :use_transactions=>true
48
+
49
+ def start
50
+ u = create_udp_session(SipperConfigurator[:LocalSipperIP], SipperConfigurator[:LocalTestPort])
51
+ r = u.create_initial_request("invite", "sip:nasir@sipper.com", :p_session_record=>"msg-info")
52
+ r.contact = "sip:abc@sipper.com"
53
+ r.contact.expires="500"
54
+ r.add_contact("<mailto:abc@sipper.com>;expires=400")
55
+
56
+ r.sdp = SDP::SdpGenerator.make_no_media_sdp
57
+ u.send(r)
58
+ logd("Sent a new INVITE from "+name)
59
+ end
60
+
61
+
62
+ def on_success_res(session)
63
+ session.do_record(session.iresponse.contacts[0])
64
+ session.do_record(session.iresponse.contacts[1])
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
+ end
78
+
79
+
80
+ def test_smoke_controllers
81
+ start_named_controller("SipInline::UacMcController")
82
+ self.expected_flow = ["> INVITE", "< 100", "< 200", "! <sip:xyz@sipper.com>;expires=500","! <mailto:xyz@sipper.com>;expires=400", "> ACK", "< BYE", "> 200"]
83
+ verify_call_flow(:out)
84
+ self.expected_flow = ["< INVITE", "> 100", "! <sip:abc@sipper.com>;expires=500","! <mailto:abc@sipper.com>;expires=400", "> 200", "< ACK", "> BYE", "< 200"]
85
+ verify_call_flow(:in)
86
+ end
87
+
88
+
89
+ end
@@ -0,0 +1,87 @@
1
+
2
+ require 'driven_sip_test_case'
3
+
4
+ # On INVITE send a 4xx response and the UAC Ctx shall send an automatic ACK
5
+ # this ACK is dropped because of a specialized transport filter and so UAS
6
+ # shall retransmist the 4xx response on Timer G. This time the ACK generated
7
+ # by the UAC Ctx (ACK retransmission) is duly received at the UAS and the test
8
+ # ends.
9
+ class TestNon2xxRetransmissionWithIst < DrivenSipTestCase
10
+
11
+ def setup
12
+ super
13
+ Transport::BaseTransport.clear_all_filters
14
+ str = <<-EOF
15
+
16
+ #-------- Transport Filters------------
17
+
18
+ require 'transport/base_transport'
19
+ module TransportHandlerForTestNon2xxModule
20
+ class MyInTransportHandler < Transport::TransportIngressFilter
21
+ def do_filter(msg)
22
+ if msg =~ /ACK/
23
+ # redefine the method
24
+ def do_filter(msg)
25
+ msg
26
+ end
27
+ return nil
28
+ else
29
+ msg
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+
36
+ #--------- Controllers ---------------
37
+
38
+ require 'sip_test_driver_controller'
39
+
40
+ module SipInline
41
+ class UasNon2xxController < SIP::SipTestDriverController
42
+
43
+ transaction_usage :use_transactions=>true
44
+ transaction_timers :t1=>#{@grty*2}
45
+ session_timer #{@grty*10}
46
+
47
+ def on_invite(session)
48
+ logd("Received INVITE in #{name}")
49
+ session.respond_with(404)
50
+ session.invalidate
51
+ session.flow_completed_for("TestNon2xxRetransmissionWithIst")
52
+ end
53
+
54
+
55
+ def order
56
+ 0
57
+ end
58
+ end
59
+
60
+ class UacNon2xxController < SIP::SipTestDriverController
61
+ transaction_usage :use_transactions=>true
62
+ session_timer #{@grty*8}
63
+ def start
64
+ r = Request.create_initial("invite", "sip:nasir@sipper.com", :p_session_record=>"msg-info")
65
+ u = create_udp_session(SipperConfigurator[:LocalSipperIP], SipperConfigurator[:LocalTestPort])
66
+ u.send(r)
67
+ logd("Sent a new INVITE from " + name)
68
+ u.invalidate
69
+ end
70
+
71
+ end
72
+ end
73
+ EOF
74
+ define_controller_from(str)
75
+ set_controller("SipInline::UacNon2xxController")
76
+ end
77
+
78
+
79
+ def test_2xx_retransmissions
80
+ self.expected_flow = ["> INVITE","< 100", "< 404", "> ACK", "< 404", "> ACK"]
81
+ start_controller
82
+ verify_call_flow(:out)
83
+ self.expected_flow = ["< INVITE", "> 100", "> 404 {2,2}", "< ACK"]
84
+ verify_call_flow(:in)
85
+ end
86
+
87
+ end
@@ -0,0 +1,210 @@
1
+
2
+ require 'sip_test_case'
3
+ require 'transaction/non_invite_client_transaction'
4
+ require 'request'
5
+ require 'response'
6
+ require 'sipper_configurator'
7
+ require 'util/locator'
8
+ require 'transport/rel_unrel'
9
+ require 'transaction_test_helper'
10
+
11
+ # SipTestCase because it starts sipper.
12
+ class TestNonInviteClientTransaction < SipTestCase
13
+
14
+ def setup
15
+ super
16
+ @t = SipMockTester::MockTimeTransport.new
17
+ @tu = SipMockTester::Tu.new
18
+ end
19
+
20
+
21
+ def test_initial_state
22
+ nict = SIP::Transaction::NonInviteClientTransaction.new(@tu, nil, nil, @t, nil)
23
+ assert_equal("NictMap.Initial", nict.state)
24
+ end
25
+
26
+
27
+ # default timer E is 500 ms
28
+ def test_default_timerE
29
+ nict = SIP::Transaction::NonInviteClientTransaction.new(@tu, nil, nil, @t, nil)
30
+ nict.txn_send SipMockTester::MockRequest.new("INFO")
31
+ sleep 5
32
+ _assert_deltas(@t, 500, 4)
33
+ end
34
+
35
+ def test_override_T1
36
+ nict = SIP::Transaction::NonInviteClientTransaction.new(@tu, nil, nil, @t, nil)
37
+ nict.t1 = @grty*2
38
+ nict.txn_send SipMockTester::MockRequest.new("INFO")
39
+ sleep((@grty*200)/1000.0) # 2 sec for 50 msec grty
40
+ _assert_deltas(@t, @grty*2, 4)
41
+ end
42
+
43
+
44
+ def test_timerE_F
45
+ nict = SIP::Transaction::NonInviteClientTransaction.new(@tu, nil, nil, @t, nil)
46
+ nict.t1 = @grty*2
47
+ nict.t2 = @grty*4
48
+ nict.tf = @grty*25
49
+ nict.txn_send SipMockTester::MockRequest.new("INFO")
50
+ assert_equal("NictMap.Trying", nict.state)
51
+ sleep((@grty*35)/1000.0) # 1.5 secs
52
+ assert(@t.msg.length >= 6) # at least 6
53
+ assert_equal("NictMap.Terminated", nict.state) # as timer F would have fired by now
54
+ end
55
+
56
+
57
+ def test_provisional
58
+ nict = SIP::Transaction::NonInviteClientTransaction.new(@tu, nil, nil, @t, nil)
59
+ nict.t1 = @grty*2
60
+ nict.t2 = @grty*10
61
+ nict.txn_send SipMockTester::MockRequest.new("INFO")
62
+ nict.txn_received SipMockTester::MockResponse.new(100)
63
+ assert_equal(1, @t.msg.length)
64
+ assert_equal("NictMap.Proceeding", nict.state)
65
+ assert(nict.consume?)
66
+ sleep((@grty*18)/1000.0)
67
+ assert_equal(3, @t.msg.length)
68
+ # now once in proceeding state a provisional should keep you here
69
+ nict.txn_received SipMockTester::MockResponse.new(100)
70
+ assert_equal("NictMap.Proceeding", nict.state)
71
+ assert(nict.consume?)
72
+ end
73
+
74
+ def test_timerF_with_reliable
75
+ @t.extend(SIP::Transport::ReliableTransport)
76
+ nict = SIP::Transaction::NonInviteClientTransaction.new(@tu, nil, nil, @t, nil)
77
+ nict.t1 = @grty #50
78
+ nict.txn_send SipMockTester::MockRequest.new("INFO")
79
+ sleep((@grty*70)/1000.0)
80
+ assert_equal(1, @t.msg.length)
81
+ end
82
+
83
+
84
+ def test_final_in_trying
85
+ nict = SIP::Transaction::NonInviteClientTransaction.new(@tu, nil, nil, @t, nil)
86
+ nict.t1 = @grty*2 #100
87
+ nict.tk = @grty*20 #1000
88
+ nict.txn_send SipMockTester::MockRequest.new("INFO")
89
+ nict.txn_received SipMockTester::MockResponse.new(200)
90
+ assert(nict.consume?)
91
+ sleep((@grty*4)/1000.0) # see after twice timer E
92
+ assert_equal(1, @t.msg.length) # no retrans
93
+ assert_equal("NictMap.Completed", nict.state)
94
+ nict.txn_received SipMockTester::MockResponse.new(200) # a 2xx retrans
95
+ assert(!nict.consume?)
96
+ assert_equal("NictMap.Completed", nict.state)
97
+ sleep((@grty*20)/1000.0) # sleep one full sec
98
+ assert_equal("NictMap.Terminated", nict.state)
99
+ end
100
+
101
+ def test_final_in_proceeding
102
+ nict = SIP::Transaction::NonInviteClientTransaction.new(@tu, nil, nil, @t, nil)
103
+ nict.t1 = @grty*2 #100
104
+ nict.tk = @grty*20 #1000
105
+ nict.txn_send SipMockTester::MockRequest.new("INFO")
106
+ nict.txn_received SipMockTester::MockResponse.new(100)
107
+ assert(nict.consume?)
108
+ assert_equal("NictMap.Proceeding", nict.state)
109
+ sleep((@grty*4)/1000.0) # see after twice timer E
110
+ assert(@t.msg.length>1) # some retrans
111
+ nict.txn_received SipMockTester::MockResponse.new(200)
112
+ msg_so_far = @t.msg.length
113
+ assert(nict.consume?)
114
+ sleep((@grty*4)/1000.0) # see further after twice timer E
115
+ assert_equal(msg_so_far, @t.msg.length) # no further retrans
116
+ assert_equal("NictMap.Completed", nict.state)
117
+ nict.txn_received SipMockTester::MockResponse.new(200) # a 2xx retrans
118
+ assert(!nict.consume?)
119
+ sleep((@grty*4)/1000.0) # see further after twice timer E
120
+ assert_equal(msg_so_far, @t.msg.length) # no further retrans
121
+ assert_equal("NictMap.Completed", nict.state)
122
+ sleep((@grty*15)/1000.0) # sleep further till termination
123
+ assert_equal("NictMap.Terminated", nict.state)
124
+ end
125
+
126
+
127
+ def test_trans_exception1
128
+ tu = SipMockTester::Tu.new
129
+ t = SipMockTester::ExceptionalTransportOnNthAttempt.new(1)
130
+ nict = SIP::Transaction::NonInviteClientTransaction.new(tu, nil, nil, t, nil)
131
+ assert_equal("NictMap.Initial", nict.state)
132
+ nict.txn_send SipMockTester::MockRequest.new("INFO")
133
+ assert_equal("NictMap.Terminated", nict.state)
134
+ assert_equal(nict, tu.txn)
135
+ end
136
+
137
+ def test_trans_exception2
138
+ tu = SipMockTester::Tu.new
139
+ t = SipMockTester::ExceptionalTransportOnNthAttempt.new(2)
140
+ nict = SIP::Transaction::NonInviteClientTransaction.new(tu, nil, nil, t, nil)
141
+ nict.te = @grty*2
142
+ assert_equal("NictMap.Initial", nict.state)
143
+ nict.txn_send SipMockTester::MockRequest.new("INFO")
144
+ assert_equal("NictMap.Trying", nict.state)
145
+ assert_nil(tu.txn)
146
+ sleep((@grty*4)/1000.0) # sleep twice timer E
147
+ assert_equal("NictMap.Terminated", nict.state)
148
+ assert_equal(nict, tu.txn)
149
+ end
150
+
151
+
152
+ # default, proceed with no change
153
+ def test_txn_handler1
154
+ tcbh = SipMockTester::Tcbh1.new
155
+ nict = SIP::Transaction::NonInviteClientTransaction.new(@tu, nil, tcbh, @t, nil)
156
+ nict.txn_send SipMockTester::MockRequest.new("INFO")
157
+ assert_equal("NictMap.Trying", nict.state)
158
+ assert_equal("NictMap.Initial", tcbh.states[0]) # before
159
+ assert_equal("NictMap.Trying", tcbh.states[1]) # after
160
+ assert_equal(1, @t.msg.length)
161
+ end
162
+
163
+
164
+ # state change but no action masker
165
+ def test_txn_handler2
166
+ tcbh = SipMockTester::Tcbh2.new
167
+ nict = SIP::Transaction::NonInviteClientTransaction.new(@tu, nil, tcbh, @t, nil)
168
+ nict.txn_send SipMockTester::MockRequest.new("MESSAGE")
169
+ assert_equal("NictMap.Trying", nict.state)
170
+ assert_equal(0, @t.msg.length)
171
+ end
172
+
173
+ # do not proceed
174
+ def test_txn_handler3
175
+ tcbh = SipMockTester::Tcbh3.new
176
+ nict = SIP::Transaction::NonInviteClientTransaction.new(@tu, nil, tcbh, @t, nil)
177
+ nict.txn_send SipMockTester::MockRequest.new("INFO")
178
+ assert_equal("NictMap.Initial", nict.state)
179
+ assert_equal(0, @t.msg.length)
180
+ assert(tcbh.txn.is_a?(SIP::Transaction::NonInviteClientTransaction))
181
+ end
182
+
183
+ # illegal state test
184
+ def test_txn_handler4
185
+ tcbh = SipMockTester::Tcbh4.new
186
+ nict = SIP::Transaction::NonInviteClientTransaction.new(@tu, nil, tcbh, @t, nil)
187
+ nict.txn_send SipMockTester::MockRequest.new("INFO")
188
+ assert_equal("NictMap.Trying", nict.state)
189
+ assert_equal(1, @t.msg.length)
190
+ assert_nil(tcbh.txn)
191
+ nict.txn_send SipMockTester::MockRequest.new("MESSAGE") # you cannot send a request in Calling.
192
+ assert(tcbh.txn.is_a?(SIP::Transaction::NonInviteClientTransaction))
193
+ assert_equal("NictMap.Trying", nict.state)
194
+ end
195
+
196
+ def _assert_deltas(t, delta, times)
197
+ 1.upto(times-1) do |x|
198
+ # as it is +/- for both timers, and allowing for an error factor of 1 so 3.0
199
+ assert_in_delta(t.msg[x-1]+delta, t.msg[x], SIP::Locator[:Sth].granularity * 3.0) # as it is +/- for both timers
200
+ delta *= 2
201
+ end
202
+ rescue Test::Unit::AssertionFailedError
203
+ t.msg.each {|m| print "#{m},"}
204
+ puts
205
+ raise
206
+ end
207
+
208
+ private :_assert_deltas
209
+ end
210
+
@@ -0,0 +1,91 @@
1
+
2
+ require 'driven_sip_test_case'
3
+
4
+ class TestNonInviteRetransmission < DrivenSipTestCase
5
+
6
+ def setup_once
7
+ super
8
+ tid = nil
9
+ str = <<-EOF
10
+
11
+ #----- Txn Handler--------
12
+ require 'transaction/state_machine_wrapper'
13
+
14
+
15
+ class NistTxnHandler
16
+
17
+ def before_request(txn)
18
+ txn.__consume_msg(true)
19
+ SIP::Transaction::SM_PROCEED_NO_ACTION
20
+ end
21
+
22
+ end
23
+ #------------------------
24
+
25
+
26
+ #------ Controllers -----
27
+ require 'sip_test_driver_controller'
28
+ module SipInline
29
+
30
+ class UasNist1Controller < SIP::SipTestDriverController
31
+
32
+ transaction_usage :use_transactions=>true
33
+ transaction_handlers :Nist=>NistTxnHandler
34
+
35
+ def on_info(session)
36
+ if tid = session['nist_txn_id']
37
+ if tid == session.irequest.transaction.object_id
38
+ logd("Received INFO in #{name} sending 200 with txn " + tid.to_s)
39
+ session.respond_with(200)
40
+ else
41
+ session.do_record("Error")
42
+ logd("Received INFO in #{name} txn is not correct " + tid.to_s)
43
+ end
44
+ session.invalidate(true)
45
+ else
46
+ session['nist_txn_id'] = session.irequest.transaction.object_id
47
+ logd("Received INFO in #{name} saving txn_id " + session['nist_txn_id'].to_s )
48
+ end
49
+ end
50
+
51
+
52
+ def order
53
+ 0
54
+ end
55
+
56
+ end
57
+
58
+ class UacNict1Controller < SIP::SipTestDriverController
59
+
60
+ transaction_usage :use_transactions=>true
61
+
62
+ def start
63
+ r = Request.create_initial("info", "sip:nasir@sipper.com", :p_session_record=>"msg-info")
64
+ u = create_udp_session(SipperConfigurator[:LocalSipperIP], SipperConfigurator[:LocalTestPort])
65
+ u.send(r)
66
+ logd("Sent a new INFO from #{name}")
67
+ end
68
+
69
+
70
+ def on_success_res(session)
71
+ logd("Received response in #{name}")
72
+ session.invalidate(true)
73
+ session.flow_completed_for("TestNonInviteRetransmission")
74
+ end
75
+ end
76
+
77
+ end
78
+ EOF
79
+ define_controller_from(str)
80
+ end
81
+
82
+
83
+ def test_nict_retrans
84
+ self.expected_flow = ["> INFO {2,}", "< 200"]
85
+ start_named_controller("SipInline::UacNict1Controller")
86
+ verify_call_flow(:out)
87
+ self.expected_flow = ["< INFO {2,}", "> 200"] # one retrans
88
+ verify_call_flow(:in)
89
+ end
90
+
91
+ end