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,26 @@
1
+ # == Sipper API documentation
2
+ # ----
3
+ # = What is Sipper?
4
+ #
5
+ # SIPr pronounced as Sipper is a SIP application testing framework that enables the developer
6
+ # and tester write new and complex test cases with extreme ease.
7
+ # While SIP applications are becoming more and more complex and feature rich the test tools have
8
+ # not been able to keep pace with them.
9
+ # Sipper was developed out of the necessity to test ever evolving SIP protocol and
10
+ # multi-faceted applications spanning SIP and Web.
11
+ # As new APIs for SIP application development made writing SIP applications accessible, we felt that
12
+ # writing tests for them, which are the cornerstone of agile development processes, should be even
13
+ # simpler. Sipper is our solution to that problem.
14
+ # Sipper is ideally suited for for feature, interop, regression, acceptance and field simulation.
15
+ # It has Servlet style API that ranges from extremely simple to very feature
16
+ # rich and powerful.
17
+ # While on one hand you can write simple test cases and controllers with very few lines of scripts,
18
+ # you can go further down the API depth and progressively control any aspect of SIP stack.
19
+ #
20
+ # == Getting started
21
+ # The best place to get started on Sipper is to read the first few chapters of the Sipper book,
22
+ # freely available from the Sipper website, also refer to FAQs when in doubt, if you need help
23
+ # with a test case of Sipper syntax then join the community at Sipper mailing list. All of these
24
+ # are accesible from http://sipper.agnity.com
25
+ #
26
+
@@ -0,0 +1,163 @@
1
+ require 'base_controller'
2
+
3
+ module SIP
4
+
5
+ class B2buaController < SIP::BaseController
6
+
7
+ # Gets or creates a peer b2bua leg (session). The session passed in as the
8
+ # argument becomes the anchor leg which is the main leg.
9
+ def get_or_create_peer_session(session, rip=SipperConfigurator[:DefaultRIP],
10
+ rp=SipperConfigurator[:DefaultRP] )
11
+ peer = get_peer_session(session)
12
+ peer = create_peer_session(session, rip, rp) unless peer
13
+ session.offer_answer = nil
14
+ peer.offer_answer = nil
15
+ peer
16
+ end
17
+
18
+ def create_peer_session(session, rip=SipperConfigurator[:DefaultRIP],
19
+ rp=SipperConfigurator[:DefaultRP] )
20
+ # todo take care of TCP
21
+ peer = create_udp_session(rip, rp)
22
+ session[:_sipper_b2b_peer] = peer
23
+ peer[:_sipper_b2b_peer] = session
24
+ peer.use_b2b_session_lock_from(session)
25
+ peer
26
+ end
27
+
28
+ def get_peer_session(session)
29
+ session[:_sipper_b2b_peer]
30
+ end
31
+
32
+
33
+ # While linking the two sessions to create a b2bua the first
34
+ # argument is treated as the main or anchor leg.
35
+ def link_sessions(session1, session2)
36
+ unlink_session(session1, session1[:_sipper_b2b_peer]) if session1[:_sipper_b2b_peer]
37
+ session1[:_sipper_b2b_peer] = session2
38
+ session2[:_sipper_b2b_peer] = session1
39
+ session2.use_b2b_session_lock_from(session1)
40
+ end
41
+
42
+ # Unlinking removes the b2bua association.
43
+ def unlink_sessions(session1, session2)
44
+ if session1.b2b_anchor_leg?
45
+ anchor_leg = session1
46
+ peer_leg = session2
47
+ else
48
+ anchor_leg = session2
49
+ peer_leg = session1
50
+ end
51
+ anchor_leg[:_sipper_b2b_peer] = nil
52
+ peer_leg[:_sipper_b2b_peer] = nil
53
+ peer_leg.revert_to_local_session_lock
54
+ end
55
+
56
+
57
+ # Creates the b2bua request based on the original request. Also creates the
58
+ # peer session if it does not already exist.
59
+ def create_b2bua_request(session, orig_request=session.irequest, rip=SipperConfigurator[:DefaultRIP],
60
+ rp=SipperConfigurator[:DefaultRP])
61
+ peer_session = get_or_create_peer_session(session, rip, rp)
62
+ if peer_session.initial_state?
63
+ r = peer_session.create_initial_request(orig_request.method, orig_request.uri)
64
+ r.copy_from(orig_request, :from, :to, :route, :content, :content_type)
65
+ r.from.tag = "3"
66
+ else
67
+ if(orig_request.method == "CANCEL")
68
+ r = peer_session.create_cancel
69
+ elsif(orig_request.method == "ACK")
70
+ r = peer_session.create_ack
71
+ else
72
+ r = peer_session.create_subsequent_request(orig_request.method)
73
+ end
74
+ r.copy_from(orig_request, :content, :content_type)
75
+ end
76
+ return r
77
+ end
78
+
79
+
80
+ # Creates a b2bua response based on an original response.
81
+ # If there is no peer session then this fails.
82
+ def create_b2bua_response(session, orig_response=session.iresponse)
83
+ peer_session = get_peer_session(session)
84
+ if peer_session
85
+ r = peer_session.create_response(orig_response.code)
86
+ r.copy_from(orig_response, :content, :content_type)
87
+ return r
88
+ else
89
+ logw("No peer session found, cannot create the response")
90
+ raise "Unable to create response"
91
+ end
92
+ end
93
+
94
+ # Invalidates this b2bua sessions.
95
+ def invalidate_sessions(session, flag=true)
96
+ peer_session = get_peer_session(session)
97
+ peer_session.invalidate(flag) if peer_session
98
+ session.invalidate(flag)
99
+ end
100
+
101
+
102
+ # Transparently passes / relays the request given a peer session
103
+ # exists.
104
+ def relay_request(session)
105
+ peer_session = get_peer_session(session)
106
+ if peer_session
107
+ r = create_b2bua_request(session)
108
+ peer_session.send(r)
109
+ else
110
+ logw("No peer session found, cannot relay the request")
111
+ raise "Unable to relay the request"
112
+ end
113
+ end
114
+
115
+ # Transparently passes / relays the response given a peer session
116
+ # exists.
117
+ def relay_response(session)
118
+ peer_session = get_peer_session(session)
119
+ if peer_session
120
+ r = create_b2bua_response(session)
121
+ peer_session.send(r)
122
+ else
123
+ logw("No peer session found, cannot relay the response")
124
+ raise "Unable to relay the response"
125
+ end
126
+ end
127
+
128
+
129
+ # Marks this b2bua as transparent which allows the relaying of requests and
130
+ # responses between legs without any controller involvement.
131
+ def go_transparent(session, state=true)
132
+ session[:_sipper_b2b_transparent] = state
133
+ peer_session = get_peer_session(session)
134
+ peer_session[:_sipper_b2b_transparent] = state if peer_session
135
+ end
136
+
137
+
138
+ # if there exists a peer session then we transparently send the request as a b2bua
139
+ # if transparent flag is on.
140
+ def on_request(session)
141
+ peer_session = get_peer_session(session)
142
+ if peer_session && session[:_sipper_b2b_transparent]
143
+ peer_session.request_with(session.irequest.method)
144
+ else
145
+ super
146
+ end
147
+ end
148
+
149
+
150
+ # if there exists a peer session then we transparently pass the response as a b2bua
151
+ # if transparent flag is true
152
+ def on_response(session)
153
+ peer_session = get_peer_session(session)
154
+ if peer_session && session[:_sipper_b2b_transparent]
155
+ peer_session.respond_with(session.iresponse.code)
156
+ else
157
+ super
158
+ end
159
+ end
160
+
161
+
162
+ end
163
+ end
@@ -0,0 +1,24 @@
1
+ module B2buaSessionMixin
2
+ # Used exclusively for setting of a common b2bua lock to avoid deadlocks.
3
+ def use_b2b_session_lock_from(orig_session)
4
+ @sq_lock = orig_session._get_sq_lock
5
+ @non_anchor_leg = true
6
+ end
7
+
8
+ def revert_to_local_session_lock
9
+ if @non_anchor_leg
10
+ @sq_lock = ["free"]
11
+ @sq_lock.extend(MonitorMixin)
12
+ @non_anchor_leg = false
13
+ end
14
+ end
15
+
16
+ def b2b_anchor_leg?
17
+ if @non_anchor_leg
18
+ false
19
+ else
20
+ true
21
+ end
22
+ end
23
+
24
+ end
@@ -0,0 +1,425 @@
1
+ # Here is where a lot of magic will happen, this will enable a lot of
2
+ # controller functionality
3
+
4
+ require 'sip_logger'
5
+ require 'util/sipper_util'
6
+ require 'response'
7
+ require 'request'
8
+ require 'session'
9
+ require 'detached_session'
10
+ require 'util/locator'
11
+
12
+ module SIP
13
+ class BaseController
14
+ include SipLogger
15
+
16
+ # civ set for each individual controllers
17
+ @sol = false
18
+ @tr_usage = nil
19
+ @tr_timers = nil
20
+ @sess_timer = nil
21
+ @tr_handlers = nil
22
+ @sess_timer = nil
23
+ @sess_limit = nil
24
+ @t2xx_usage = nil
25
+ @t1xx_retran_usage = nil
26
+ @t2xx_timers = nil
27
+ @t1xx_timers = nil
28
+ @header_order = nil
29
+ @pre_existing_rs = nil
30
+ @compact_headers = nil
31
+ @session_record = nil
32
+
33
+ def self.start_on_load(val)
34
+ @sol = SipperUtil.boolify(val)
35
+ end
36
+
37
+ def self.start_on_load?
38
+ @sol
39
+ end
40
+
41
+ # The transaction usage hash setting is like a modifier in the
42
+ # controller. The setting is exactly same as the configuration setting
43
+ # eg transaction_usage :use_transactions=>true, :use_ict=>false, :use_nict=>true
44
+ #
45
+ def self.transaction_usage(hash)
46
+ @tr_usage = hash
47
+ end
48
+
49
+ def self.get_transaction_usage
50
+ @tr_usage
51
+ end
52
+
53
+ # The transaction timers can be set at the controller level which override the
54
+ # default timer configuration. Eg. usage
55
+ # transaction_timers :t1=>100, :ta=200
56
+ # Here the modifier is setting the T1 timer value to 100 msec and TimerA to 200 msec.
57
+ def self.transaction_timers(hash)
58
+ @tr_timers = hash
59
+ end
60
+
61
+ def self.get_transaction_timers
62
+ @tr_timers
63
+ end
64
+
65
+ # value can be msg-info or msg-debug
66
+ def self.session_record(val)
67
+ @session_record = val.to_s
68
+ end
69
+
70
+ def self.get_session_record
71
+ @session_record
72
+ end
73
+
74
+ # transaction_handlers :Ict=>MyIctHandler, :Nict=>MyNictHandler, :Base=>CatchAllHandler
75
+ def self.transaction_handlers(hash)
76
+ @tr_handlers = hash
77
+ end
78
+
79
+ def self.get_transaction_handlers
80
+ @tr_handlers
81
+ end
82
+
83
+
84
+ # The session timer for session invalidation, the default is taken from the configuration
85
+ # :SessionTimer
86
+ def self.session_timer(val)
87
+ @sess_timer = val
88
+ end
89
+
90
+ def self.get_session_timer
91
+ @sess_timer
92
+ end
93
+
94
+ # the upper limit of session lifetime, defaults to :SessionLimit from configuration.
95
+ def self.session_limit(val)
96
+ @sess_limit = val
97
+ end
98
+
99
+ def self.get_session_limit
100
+ @sess_limit
101
+ end
102
+
103
+ def self.t2xx_usage(val)
104
+ @t2xx_usage = val
105
+ end
106
+
107
+ def self.get_t2xx_usage
108
+ @t2xx_usage
109
+ end
110
+
111
+ def self.t1xx_retran_usage(val)
112
+ @t1xx_retran_usage = val
113
+ end
114
+
115
+ def self.get_t1xx_retran_usage
116
+ @t1xx_retran_usage
117
+ end
118
+
119
+ # the hash of 3 timer values that affect 2xx retransmissions for UAS
120
+ # i.e {:Start=>100, :Cap=>400, :Limit=>1600} that roughly
121
+ # correspond with T1, T2 and 64*T1 respectively, which are also the
122
+ # defaults. The argument hash doesnt have to be all the three values
123
+ # but any that are required to be overridden.
124
+ def self.t2xx_timers(hash)
125
+ @t2xx_timers = hash
126
+ end
127
+
128
+ def self.get_t2xx_timers
129
+ @t2xx_timers
130
+ end
131
+
132
+ def self.t1xx_timers(hash)
133
+ @t1xx_timers = hash
134
+ end
135
+
136
+ def self.get_t1xx_timers
137
+ @t1xx_timers
138
+ end
139
+
140
+
141
+ def self.header_order(*arr)
142
+ if arr[0].is_a?(Array)
143
+ @header_order = arr[0]
144
+ else
145
+ @header_order = arr
146
+ end
147
+ end
148
+
149
+ def self.get_header_order
150
+ @header_order
151
+ end
152
+
153
+ # Directive for setting compact headers for outgoing requests for
154
+ # this controller. The headers can be defined by their sipper symbols
155
+ # like :call_id and :via or you can chose to have :all_possible in which
156
+ # Sipper use compact form for all headers that have a compact form.
157
+ def self.use_compact_headers(*arr)
158
+ if arr[0].is_a?(Array)
159
+ @compact_headers = arr[0]
160
+ else
161
+ @compact_headers = arr
162
+ end
163
+ end
164
+
165
+ def self.get_compact_headers
166
+ @compact_headers
167
+ end
168
+
169
+ # Directive for setting the prexisting route set at the controller level.
170
+ def self.pre_existing_route_set(*arr)
171
+ if arr[0].is_a?(Array)
172
+ @pre_existing_rs = arr[0]
173
+ else
174
+ @pre_existing_rs = arr
175
+ end
176
+ end
177
+
178
+ def self.get_pre_existing_route_set
179
+ @pre_existing_rs
180
+ end
181
+ #---------------------------------------------------------------------------
182
+
183
+
184
+ def name
185
+ self.class.name
186
+ end
187
+
188
+ def logi(m)
189
+ SipLogger['siplog::sip_basecontroller'].info("[#{name}] "+m)
190
+ end
191
+
192
+ def logd(m)
193
+ SipLogger['siplog::sip_basecontroller'].debug("[#{name}] "+m)
194
+ end
195
+
196
+ def logw(m)
197
+ SipLogger['siplog::sip_basecontroller'].warn("[#{name}] "+m)
198
+ end
199
+
200
+ def loge(m)
201
+ SipLogger['siplog::sip_basecontroller'].error("[#{name}] "+m)
202
+ end
203
+
204
+ def logf(m)
205
+ SipLogger['siplog::sip_basecontroller'].fatal("[#{name}] "+m)
206
+ end
207
+
208
+ # start method
209
+
210
+ def start
211
+ logd("Nothing to start")
212
+ return false
213
+ end
214
+
215
+ # Response handling
216
+
217
+ def on_response(session)
218
+ case session.iresponse.code
219
+ when 100
220
+ on_trying_res(session)
221
+ when 101..199
222
+ on_provisional_res(session)
223
+ when 200..299
224
+ on_success_res(session)
225
+ when 300..399
226
+ on_redirect_res(session)
227
+ when 400..699
228
+ on_failure_res(session)
229
+ else
230
+ unknown_response(code)
231
+ end
232
+ end
233
+
234
+
235
+ def on_trying_res(session)
236
+ request_specific_response_dispatch(session, "on_trying_res")
237
+ end
238
+
239
+ def on_provisional_res(session)
240
+ request_specific_response_dispatch(session, "on_provisional_res")
241
+ end
242
+
243
+ def on_success_res(session)
244
+ request_specific_response_dispatch(session, "on_success_res")
245
+ end
246
+
247
+ def on_failure_res(session)
248
+ request_specific_response_dispatch(session, "on_failure_res")
249
+ end
250
+
251
+ def on_redirect_res(session)
252
+ request_specific_response_dispatch(session, "on_redirect_res")
253
+ end
254
+
255
+ def on_custom_msg(session, custom_msg)
256
+ end
257
+
258
+ def unknown_response(code)
259
+ loge("I do not handle response with code #{code}")
260
+ end
261
+
262
+ # response_method is the string "on_success_res" etc.
263
+ def request_specific_response_dispatch(session, response_method)
264
+ request_m = session.iresponse.get_request_method.downcase
265
+ handler = (sprintf("%s_for_%s", response_method, request_m)).to_sym
266
+
267
+ self.send(handler, session) if self.respond_to?(handler)
268
+ end
269
+
270
+ # Request handling
271
+ #
272
+
273
+
274
+ #- Interestingly the benchmark for direct call, m.call and send are
275
+ # user system total real
276
+ # 4.726000 0.000000 4.726000 ( 4.757000)
277
+ # 6.810000 0.030000 6.840000 ( 6.870000)
278
+ # 5.027000 0.000000 5.027000 ( 5.027000)
279
+ # So I am continuing with send mechanism
280
+ # But perhaps it is still OK to return a boolean from here as we may use it
281
+ # for some other purposes.
282
+ def on_request(session)
283
+ logd("In base_controller on_request for call #{session.call_id}")
284
+ m = ("on_" + session.irequest.method.downcase).to_sym
285
+ return self.send(m, session)
286
+ end
287
+
288
+
289
+ def on_media_event(session)
290
+ if session.imedia_event.class == Media::SmReply
291
+ self.on_media_reply(session)
292
+ else
293
+ case session.imedia_event.event
294
+ when 'AUDIOSTARTED'
295
+ self.on_media_audio_started(session)
296
+ when 'AUDIOSTOPPED'
297
+ self.on_media_audio_stopped(session)
298
+ when 'DTMFRECEIVED'
299
+ self.on_media_dtmf_received(session)
300
+ end
301
+ end
302
+ end
303
+
304
+ def on_http_res(session)
305
+ end
306
+
307
+ def on_media_audio_started(session)
308
+ end
309
+
310
+ def on_media_audio_stopped(session)
311
+ end
312
+
313
+ def on_media_dtmf_received(session)
314
+ end
315
+
316
+
317
+ def unknown_request(m)
318
+ logw("I do not handle request with method #{m}")
319
+ return false
320
+ end
321
+
322
+ def method_missing(m, *a)
323
+ unknown_request( m )
324
+ end
325
+
326
+ def on_timer(session, task)
327
+ end
328
+
329
+ # --- Session callbacks -----
330
+ def no_ack_received(session)
331
+ end
332
+
333
+ def no_prack_received(session)
334
+ end
335
+
336
+ def session_being_invalidated_ok_to_proceed?(session)
337
+ true
338
+ end
339
+ # -------------------------
340
+
341
+
342
+ def create_session
343
+ _create_session(DetachedSession, nil, nil, nil)
344
+ end
345
+
346
+ def create_udp_session(rip=nil, rp=nil, rs=nil)
347
+ _create_session(UdpSession, rip, rp, rs)
348
+ end
349
+
350
+ def create_tcp_session(rip, rp)
351
+ end
352
+
353
+ def create_tls_session(rip, rp)
354
+ end
355
+
356
+ def create_sctp_session
357
+ end
358
+
359
+ def _create_session(type, rip, rp, rs)
360
+ rs ||= self.class.get_pre_existing_route_set
361
+ s = type.new(rip, rp, rs, self.class.get_session_limit, self.specified_transport)
362
+ s.controller = self
363
+ s.set_transaction_usage self.class.get_transaction_usage #set controller wide usage
364
+ s.set_transaction_timers(:Base, self.class.get_transaction_timers) #set controller wide timers
365
+ s.set_session_timer(self.class.get_session_timer)
366
+ s.set_session_limit(self.class.get_session_limit) # redundant as already set in init
367
+ s.set_transaction_handlers(self.class.get_transaction_handlers)
368
+ s.set_t2xx_retrans_usage(self.class.get_t2xx_usage)
369
+ s.set_t1xx_retrans_usage(self.class.get_t1xx_retran_usage)
370
+ s.set_t2xx_retrans_timers(self.class.get_t2xx_timers)
371
+ s.set_t1xx_retrans_timers(self.class.get_t1xx_timers)
372
+ s.set_header_order(self.class.get_header_order)
373
+ s.set_compact_headers(self.class.get_compact_headers)
374
+ s.set_session_record(self.class.get_session_record)
375
+ return s
376
+ end
377
+
378
+
379
+ # enables chaining by detecting interest early
380
+ def interested?(initial_request)
381
+ if self.respond_to?(("on_" + initial_request.method.downcase).to_sym)
382
+ logd("Yes I #{name} is interested")
383
+ return true
384
+ else
385
+ logd("No I #{name} is not interested")
386
+ return false
387
+ end
388
+ end
389
+
390
+ # Returns a transport specified for the controller in the form
391
+ # [ip, port, transport] where transport is optional and if
392
+ # present can be "UDP" or "TCP".
393
+ # While sending the message, this preferred transport will be used
394
+ # and on receiving the controller will be invoked only if the message
395
+ # is received on this transport.
396
+ # Defining controllers can thus control which transport they are bound
397
+ # to. If not present a default transport, based upon the transport
398
+ # selection procedure is assigned to the controller.
399
+ def specified_transport
400
+ nil
401
+ end
402
+
403
+ # returns an integer indicating the position in order array as used in
404
+ # controller selection. -1 indicates to disregard this value. This if present
405
+ # supercedes the order.yaml. This allows for ordering inline controllers.
406
+ def order
407
+ -1
408
+ end
409
+
410
+ def registration_store
411
+ SIP::Locator[:RegistrationStore]
412
+ end
413
+
414
+
415
+ # The dialog info store, keeps track of AOR => ["call_id;local_tag;remote_tag",..]
416
+ # for the AOR belonging to the UA.
417
+ def dialog_store
418
+ SIP::Locator[:DialogInfoStore]
419
+ end
420
+
421
+ private :_create_session
422
+
423
+ end
424
+
425
+ end