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,147 @@
1
+
2
+ # Bob Bob
3
+ # Alice desk lab
4
+ # | | |
5
+ # *1 |-----INVITE----------->| |
6
+ # *2 |<----180---------------| Bob hears desk phone |
7
+ # | | ringing from lab but |
8
+ # | | isn't REGISTERed yet |
9
+ # | | |
10
+ # | |<--fetch dialog state --|
11
+ # | |---response ----------->|
12
+ # *3/4 |<-----INVITE with Replaces/200/ACK--------------|
13
+ # *5/6 |------CANCEL/200------>| |
14
+ # *7 |<-----487--------------| |
15
+ # |------ACK------------->| |
16
+ # | | |
17
+ # | | |
18
+
19
+ require 'driven_sip_test_case'
20
+ require 'custom_message'
21
+
22
+ class TestInviteReplace < DrivenSipTestCase
23
+
24
+ def setup
25
+ SipperConfigurator[:ControllerPath] = nil
26
+ super
27
+ str = <<-EOF
28
+
29
+ require 'sip_test_driver_controller'
30
+
31
+ module TestInviteReplace_SipInline
32
+ class BobLabAndDeskController < SIP::SipTestDriverController
33
+
34
+ transaction_usage :use_transactions=>true
35
+
36
+ session_timer 1500
37
+
38
+ def interested?(req)
39
+ !req[:replaces]
40
+ end
41
+
42
+ def on_invite(bob_session1)
43
+ bob_session1.name = "bob_session1"
44
+ bob_session1.respond_with(180)
45
+ bob_session2 = create_udp_session(SipperConfigurator[:LocalSipperIP], SipperConfigurator[:LocalTestPort])
46
+ bob_session2.name = "bob_session2"
47
+ r = bob_session2.create_initial_request("invite", "sip:nasir@sipper.com", :p_session_record=>"msg-info")
48
+ r.replaces = bob_session1.call_id
49
+ r.replaces["from-tag"] = bob_session1.local_tag
50
+ r.replaces["to-tag"] = bob_session1.remote_tag
51
+ r.replaces["early-only"] = ''
52
+ bob_session2.send(r)
53
+ logd("Sent a new Invite with replaces from " + name)
54
+ end
55
+
56
+
57
+ def on_success_res(bob_session2)
58
+ logd("Received response in "+name)
59
+ bob_session2.create_and_send_ack
60
+ bob_session2.invalidate(true)
61
+ end
62
+
63
+ def on_cancel(bob_session1)
64
+ logd("Received cancel request in #{name}")
65
+ bob_session1.invalidate(true)
66
+ end
67
+ end
68
+
69
+
70
+
71
+
72
+ class AliceController < SIP::SipTestDriverController
73
+ transaction_usage :use_transactions=>true
74
+ session_timer 500
75
+
76
+
77
+ def interested?(req)
78
+ req[:replaces]
79
+ end
80
+
81
+ def start
82
+ alice_session1 = create_udp_session(SipperConfigurator[:LocalSipperIP], SipperConfigurator[:LocalTestPort])
83
+ alice_session1.name = "alice_session1"
84
+ alice_session1.request_with('INVITE', 'sip:nasir@sipper.com', :p_session_record=>"msg-info" )
85
+ logd("Sent a new Invite from " +name)
86
+ end
87
+
88
+ def on_invite(alice_session2)
89
+ alice_session2.name = "alice_session2"
90
+ if alice_session2.irequest[:replaces] != nil
91
+ r = alice_session2.irequest
92
+ callid = r.replaces.header_value
93
+ localtag = r.replaces["to-tag"]
94
+ remotetag = r.replaces["from-tag"]
95
+ alice_session1 = SessionManager.find_session(callid, localtag, remotetag)
96
+ alice_session1.post_custom_message(CustomMessage.new)
97
+ end
98
+ alice_session2.respond_with(200)
99
+ end
100
+
101
+ def on_custom_msg(alice_session1, msg)
102
+ logd("Received Custom message in "+ name)
103
+ alice_session1.create_and_send_cancel_when_ready
104
+ end
105
+
106
+ def on_failure_res(alice_session1)
107
+ logd("Received failure response in "+ name)
108
+ alice_session1.invalidate(true)
109
+ end
110
+
111
+ def on_ack(alice_session2)
112
+ logd("Received ACK in "+ name)
113
+ alice_session2.invalidate
114
+ alice_session2.flow_completed_for("TestInviteReplace")
115
+ end
116
+
117
+ end
118
+ end
119
+ EOF
120
+ define_controller_from(str)
121
+ set_controller("TestInviteReplace_SipInline::AliceController")
122
+ end
123
+
124
+
125
+ def test_invite_replace
126
+ # alice_session1
127
+ self.expected_flow = ["> INVITE","< 100", "< 180", "> CANCEL", "< 200", "< 487", "> ACK"]
128
+ start_controller
129
+ verify_call_flow(:out, 0)
130
+
131
+
132
+ # bob_session1
133
+ self.expected_flow = ["< INVITE","> 100", "> 180", "< CANCEL", "> 200", "> 487", "< ACK"]
134
+ verify_call_flow(:in, 0)
135
+
136
+ # bob_session2
137
+ self.expected_flow = ["> INVITE", "< 100", "< 200", "> ACK"]
138
+ verify_call_flow(:out, 1)
139
+
140
+ # alice_session2
141
+ self.expected_flow = ["< INVITE", "> 100", "> 200", "< ACK"]
142
+ verify_call_flow(:in, 1)
143
+ end
144
+
145
+ end
146
+
147
+
@@ -0,0 +1,90 @@
1
+
2
+ require 'driven_sip_test_case'
3
+
4
+ class TestInviteRetransmission < DrivenSipTestCase
5
+
6
+ def setup
7
+ super
8
+ str = <<-EOF
9
+ #----- Txn Handler--------
10
+ require 'transaction/state_machine_wrapper'
11
+
12
+ class IstTxnHandler
13
+
14
+ def before_invite(txn)
15
+ def before_invite(txn)
16
+ SIP::Transaction::SM_PROCEED
17
+ end
18
+ txn.__consume_msg(true)
19
+ SIP::Transaction::SM_PROCEED_NO_ACTION
20
+ end
21
+
22
+ end
23
+ #------------------------
24
+
25
+
26
+ #------ Controllers -----
27
+
28
+ require 'sip_test_driver_controller'
29
+
30
+ module SipInline
31
+ class UasIstRetransController < SIP::SipTestDriverController
32
+
33
+ transaction_usage :use_transactions=>true
34
+ transaction_handlers :Ist=>IstTxnHandler
35
+
36
+ def on_invite(session)
37
+ logd("Received INVITE in #{name}")
38
+ session.do_record("First_Invite")
39
+ session.schedule_timer_for("sending_200", #{@grty*4})
40
+ end
41
+
42
+ def on_timer(session, task)
43
+ logd("Timer invoked in #{name}")
44
+ session.respond_with(200)
45
+ end
46
+
47
+ def on_ack(session)
48
+ session.invalidate(true)
49
+ session.flow_completed_for("TestInviteRetransmission")
50
+ end
51
+
52
+ def order
53
+ 0
54
+ end
55
+ end
56
+
57
+ class UacIstRetransController < SIP::SipTestDriverController
58
+ transaction_usage :use_transactions=>true
59
+ transaction_timers :t1=>#{@grty*2}
60
+
61
+ def start
62
+ r = Request.create_initial("invite", "sip:nasir@sipper.com", :p_session_record=>"msg-info")
63
+ u = create_udp_session(SipperConfigurator[:LocalSipperIP], SipperConfigurator[:LocalTestPort])
64
+ u.send(r)
65
+ logd("Sent a new INVITE from #{name}")
66
+ end
67
+
68
+ def on_success_res(session)
69
+ logd("Received response in #{name}")
70
+ session.create_and_send_ack
71
+ session.invalidate(true)
72
+ end
73
+
74
+ end
75
+ end
76
+ EOF
77
+ define_controller_from(str)
78
+ set_controller("SipInline::UacIstRetransController")
79
+ end
80
+
81
+
82
+ def test_invite_retrans
83
+ self.expected_flow = ["> INVITE {2,}", "< 200", "> ACK"]
84
+ start_controller
85
+ verify_call_flow(:out)
86
+ self.expected_flow = ["< INVITE", "! First_Invite", "< INVITE {0,}", "> 200", "< INVITE {0,}", "< ACK"]
87
+ verify_call_flow(:in)
88
+ end
89
+
90
+ end
@@ -0,0 +1,208 @@
1
+ require 'sip_test_case'
2
+ require 'transaction/invite_server_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
+
11
+ class TestInviteServerTransaction < SipTestCase
12
+
13
+ def setup
14
+ super
15
+ @t = SipMockTester::MockTimeTransport.new
16
+ @tu = SipMockTester::Tu.new
17
+ end
18
+
19
+ def test_initial_state
20
+ ist = SIP::Transaction::InviteServerTransaction.new(@tu, nil, nil, @t, nil)
21
+ assert_equal("IstMap.Initial", ist.state)
22
+ end
23
+
24
+ # invite in initial state
25
+ def test_invite_initial
26
+ ist = SIP::Transaction::InviteServerTransaction.new(@tu, nil, nil, @t, nil)
27
+ ist.txn_received SipMockTester::MockRequest.new("INVITE")
28
+ assert_equal("IstMap.Proceeding", ist.state)
29
+ assert_equal(1, @t.msg.length)
30
+ assert(ist.consume?)
31
+ end
32
+
33
+ # sending provisional in proceeding
34
+ def test_proceeding_provisional
35
+ ist = SIP::Transaction::InviteServerTransaction.new(@tu, nil, nil, @t, nil)
36
+ ist.txn_received SipMockTester::MockRequest.new("INVITE") # now in proceeding
37
+ r = SipMockTester::MockResponse.new(180)
38
+ ist.txn_send r
39
+ assert_equal("IstMap.Proceeding", ist.state)
40
+ assert_equal(2, @t.msg.length)
41
+ end
42
+
43
+ # invite comes in proceeding after just 100 trying being sent
44
+ def test_proceeding_invite1
45
+ t = SipMockTester::MockMsgTransport.new
46
+ ist = SIP::Transaction::InviteServerTransaction.new(@tu, nil, nil, t, nil)
47
+ i = SipMockTester::MockRequest.new("INVITE")
48
+ ist.txn_received(i) # now in proceeding
49
+ assert(ist.consume?)
50
+ ist.txn_received(i) # invite retrasmission
51
+ assert(!ist.consume?)
52
+ assert_equal(2, t.msg.length)
53
+ t.msg.each {|m| assert_match(/100/, m) }
54
+ end
55
+
56
+ # invite retrans comes in proceeding after 100 and 180 being sent
57
+ def test_proceeding_invite1
58
+ ist, t, i = _send_initial_invite_with_msg_transport
59
+ assert(ist.consume?)
60
+ r = SipMockTester::MockResponse.new(180)
61
+ ist.txn_send r
62
+ ist.txn_received(i) # invite retrasmission
63
+ assert(!ist.consume?)
64
+ assert_equal(3, t.msg.length)
65
+ assert_match(/100/, t.msg[0])
66
+ assert_equal(180, t.msg[1])
67
+ assert_equal(180, t.msg[2])
68
+ end
69
+
70
+ def test_success_final_proceeding_finished
71
+ ist, t, i = _send_initial_invite_with_msg_transport
72
+ ist.tz = 100
73
+ r = SipMockTester::MockResponse.new(200)
74
+ ist.txn_send r # should now be in Finished state
75
+ assert_equal("IstMap.Finished", ist.state)
76
+ ist.txn_received(i)
77
+ assert(!ist.consume?)
78
+ c = SipMockTester::MockRequest.new("CANCEL")
79
+ ist.cancel_received(c, nil)
80
+ assert(ist.consume?)
81
+ sleep 0.2
82
+ assert_equal("IstMap.Terminated", ist.state)
83
+ end
84
+
85
+ # note: the timers are set to defaults, even if the timers are fired during the
86
+ # course of the test the message will be retransmitted by this isolated Txn to
87
+ # the isolated transport here.
88
+ def test_non_sucess_final_proceeding
89
+ ist, t, i = _send_initial_invite_with_msg_transport
90
+ r = SipMockTester::MockResponse.new(400)
91
+ ist.txn_send r # should now be in Completed state
92
+ assert_equal("IstMap.Completed", ist.state)
93
+ ist.txn_received(i)
94
+ assert(!ist.consume?)
95
+ assert_equal(3, t.msg.length)
96
+ assert_match(/100/, t.msg[0])
97
+ assert_equal(400, t.msg[1])
98
+ assert_equal(400, t.msg[2])
99
+ end
100
+
101
+
102
+ def test_non_success_final_with_timers_proceeding
103
+ ist, t, i = _send_initial_invite_with_msg_transport
104
+ ist.tg = 50
105
+ ist.th = 1000
106
+ ist.t4 = 200
107
+ r = SipMockTester::MockResponse.new(400)
108
+ ist.txn_send r # should now be in Completed state
109
+ assert_equal("IstMap.Completed", ist.state)
110
+ assert_equal(2, t.msg.length)
111
+ assert_match(/100/, t.msg[0])
112
+ assert_equal(400, t.msg[1])
113
+ sleep 0.5 # next retrans at min(150*2, 200) t=350
114
+ #assert_equal(5, t.msg.length)
115
+ assert_equal(400, t.msg[2])
116
+ assert_equal(400, t.msg[3])
117
+ assert_equal(400, t.msg[4])
118
+ sleep 1 # timer H should have fired by now.
119
+ assert_equal("IstMap.Terminated", ist.state)
120
+ end
121
+
122
+ def test_cancel_proceeding
123
+ ist, t, i = _send_initial_invite_with_msg_transport
124
+ c = SipMockTester::MockRequest.new("CANCEL")
125
+ ist.cancel_received(c, nil)
126
+ assert(ist.consume?)
127
+ assert_equal(2, t.msg.length)
128
+ assert_match(/100/, t.msg[0])
129
+ assert_match(/487/, t.msg[1])
130
+ assert_equal("IstMap.Completed", ist.state)
131
+ end
132
+
133
+ def test_ack
134
+ ist, t, i = _send_initial_invite_with_msg_transport
135
+ r = SipMockTester::MockResponse.new(400)
136
+ ist.txn_send r # should now be in Completed state
137
+ a = SipMockTester::MockRequest.new("ACK")
138
+ ist.txn_received(a)
139
+ assert(!ist.consume?)
140
+ assert_equal("IstMap.Confirmed", ist.state)
141
+ end
142
+
143
+ def test_completed_invite
144
+ ist, t, i = _send_initial_invite_with_msg_transport
145
+ r = SipMockTester::MockResponse.new(400)
146
+ ist.txn_send r # should now be in Completed state
147
+ ist.txn_received(i)
148
+ assert_equal(3, t.msg.length)
149
+ assert_match(/100/, t.msg[0])
150
+ assert_equal(400, t.msg[1])
151
+ assert_equal(400, t.msg[2])
152
+ assert(!ist.consume?)
153
+ a = SipMockTester::MockRequest.new("ACK")
154
+ ist.txn_received(a)
155
+ assert(!ist.consume?)
156
+ assert_equal("IstMap.Confirmed", ist.state)
157
+ end
158
+
159
+
160
+ def test_confirmed_with_timer_I
161
+ ist, t, i = _send_initial_invite_with_msg_transport
162
+ r = SipMockTester::MockResponse.new(400)
163
+ ist.txn_send r # should now be in Completed state
164
+ a = SipMockTester::MockRequest.new("ACK")
165
+ ist.ti = 100
166
+ ist.txn_received(a)
167
+ assert_equal("IstMap.Confirmed", ist.state)
168
+ ist.txn_received(i)
169
+ assert(!ist.consume?)
170
+ sleep 0.5 # though timer I is 100, we sleep for more to eotsoc
171
+ assert_equal(3, t.msg.length)
172
+ assert_match(/100/, t.msg[0])
173
+ assert_equal(400, t.msg[1])
174
+ assert_equal(400, t.msg[2])
175
+ assert_equal("IstMap.Terminated", ist.state)
176
+ end
177
+
178
+ def test_wrong_state
179
+ t = SipMockTester::MockMsgTransport.new
180
+ ist = SIP::Transaction::InviteServerTransaction.new(@tu, nil, nil, t, nil)
181
+ i = SipMockTester::MockRequest.new("INVITE")
182
+ ist.txn_received(i) # now in proceeding
183
+ r = SipMockTester::MockResponse.new(400)
184
+ ist.txn_send r # should now be in Completed state
185
+ assert_nil(@tu.txn)
186
+ ist.txn_send r # illegal to send a new response from here
187
+ assert_equal(ist, @tu.txn)
188
+ @tu.txn = nil
189
+ a = SipMockTester::MockRequest.new("ACK")
190
+ ist.txn_received(a)
191
+ assert_equal("IstMap.Confirmed", ist.state)
192
+ ist.txn_received(a)
193
+ assert_nil(@tu.txn)
194
+ ist.txn_send r # illegal to send a new response from here
195
+ assert_equal(ist, @tu.txn)
196
+ end
197
+
198
+
199
+ def _send_initial_invite_with_msg_transport
200
+ t = SipMockTester::MockMsgTransport.new
201
+ ist = SIP::Transaction::InviteServerTransaction.new(@tu, nil, nil, t, nil)
202
+ i = SipMockTester::MockRequest.new("INVITE")
203
+ ist.txn_received(i) # now in proceeding
204
+ [ist, t, i]
205
+ end
206
+
207
+ private :_send_initial_invite_with_msg_transport
208
+ end
@@ -0,0 +1,79 @@
1
+
2
+ require 'driven_sip_test_case'
3
+
4
+
5
+ class TestLowerCseq < DrivenSipTestCase
6
+
7
+ def setup
8
+ @orig_compliance = SipperConfigurator[:ProtocolCompliance]
9
+ SipperConfigurator[:ProtocolCompliance]='strict'
10
+ super
11
+ str = <<-EOF
12
+
13
+ require 'sip_test_driver_controller'
14
+
15
+ module SipInline
16
+ class UasLowerCseqController < SIP::SipTestDriverController
17
+
18
+ transaction_usage :use_transactions=>true
19
+ session_timer #{@grty*5}
20
+
21
+ def on_invite(session)
22
+ session.respond_with(200)
23
+ end
24
+
25
+ def on_ack(session)
26
+ session.invalidate
27
+ session.flow_completed_for("TestLowerCseq")
28
+ end
29
+
30
+ def order
31
+ 0
32
+ end
33
+ end
34
+
35
+ class UacLowerCseqController < SIP::SipTestDriverController
36
+
37
+ transaction_usage :use_transactions=>false
38
+
39
+ def start
40
+ u = create_udp_session(SipperConfigurator[:LocalSipperIP], SipperConfigurator[:LocalTestPort])
41
+ u.request_with("invite", "sip:nasir@sipper.com", :p_session_record=>"msg-info")
42
+ logd("Sent a new INVITE from "+name)
43
+ end
44
+
45
+ def on_success_res(session)
46
+ session.request_with('ack')
47
+ logd("sent ACK now creating an INVITE")
48
+ r = session.create_subsequent_request("invite")
49
+ r.cseq = "1 INVITE"
50
+ session.send(r)
51
+ end
52
+
53
+ def on_failure_res(session)
54
+ session.request_with("ack")
55
+ session.invalidate(true)
56
+ end
57
+
58
+ end
59
+ end
60
+ EOF
61
+ define_controller_from(str)
62
+ set_controller("SipInline::UacLowerCseqController")
63
+ end
64
+
65
+
66
+ def test_reinvite
67
+ self.expected_flow = ["> INVITE", "< 100", "< 200", "> ACK", "> INVITE", "< 100","< 500", "> ACK"]
68
+ start_controller
69
+ verify_call_flow(:out)
70
+ self.expected_flow = ["< INVITE", "> 100", "> 200", "< ACK", "< INVITE", "> 100","> 500", "< ACK"]
71
+ verify_call_flow(:in)
72
+ end
73
+
74
+ def teardown
75
+ SipperConfigurator[:ProtocolCompliance] = @orig_compliance
76
+ super
77
+ end
78
+
79
+ end