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,276 @@
1
+ require 'sip_test_case'
2
+ require 'flexmock'
3
+
4
+
5
+ class TestSession < SipTestCase
6
+
7
+ include FlexMock::TestCase
8
+
9
+ def setup
10
+ super
11
+ @sid = SipperConfigurator[:ShowSessionIdInMessages]
12
+ SipperConfigurator[:ShowSessionIdInMessages] = false
13
+ ip = "127.0.0.1"
14
+ port = 5060
15
+ @rip = ip
16
+ @rp = port+1
17
+ @t1 = Transport::UdpTransport.instance(ip, port)
18
+ @t1.start_transport
19
+ @s = Session.new @t1, @rip, @rp
20
+ end
21
+
22
+ def test_new
23
+ assert_equal(@t1, @s.transport)
24
+ assert_equal(@rp, @s.rp)
25
+ end
26
+
27
+ def test_bad_new
28
+ #assert_raise(ArgumentError) {Session.new nil, @rip, @rp}
29
+ #assert_raise(ArgumentError) {Session.new @t1, nil, @rp}
30
+ #assert_raise(ArgumentError) {Session.new @t1, @rip, nil}
31
+ end
32
+
33
+ def test_attr
34
+ assert_nil(@s[:key])
35
+ @s[:key] = "hello"
36
+ assert_equal("hello", @s[:key])
37
+ @s[:key] = "bye"
38
+ assert_equal("bye", @s[:key])
39
+ end
40
+
41
+
42
+
43
+ def test_subsequent_first
44
+ assert_raise(RuntimeError){@s.create_subsequent_request("bye")}
45
+ end
46
+
47
+ def test_response_first
48
+ assert_raise(RuntimeError){@s.create_response(200, "OK")}
49
+ end
50
+
51
+ def test_mock_send
52
+ send_initial_using_mock_transport
53
+ assert_equal("Sipper <sip:sipper@127.0.0.1:5060>;tag=2", @s.local_uri)
54
+ assert_equal("Sut <sip:sut@127.0.0.1:5061>", @s.remote_uri)
55
+
56
+ r = Response.new(200)
57
+ r.from = "sip:sipper@codepresso.com"
58
+ r.contact = "sip:sipper@codepresso.com"
59
+ r.to = "sip:goblet@codepresso.com"
60
+ r.cseq = "1 MESSAGE"
61
+ @s.send(r)
62
+ assert_equal("<sip:goblet@codepresso.com>", @s.local_uri)
63
+ assert_equal("<sip:sipper@codepresso.com>", @s.remote_uri)
64
+
65
+ # commenting it as we can have a nil transport now
66
+ #@s.transport = nil
67
+ #assert_raise(StandardError) {@s.send(r)}
68
+
69
+ r = "Hello"
70
+ assert_raise(ArgumentError) {@s.send(r)}
71
+ end
72
+
73
+ def test_send_msg
74
+ ex = []
75
+ ex << File.new(File.join(File.dirname(__FILE__), "gold.txt")).readlines.map{|x| x.sub(/_PID_/, Process.pid.to_s ).chomp}.sort
76
+ ex[0].insert(0,"")
77
+ ex << File.new(File.join(File.dirname(__FILE__), "gold_res.txt")).readlines.map{|x| x.sub(/_PID_/, Process.pid.to_s ).chomp}.sort
78
+ ex[1].insert(0,"")
79
+ ex << File.new(File.join(File.dirname(__FILE__), "gold_sub.txt")).readlines.map{|x| x.sub(/_PID_/, Process.pid.to_s ).chomp}.sort
80
+ ex[2].insert(0,"")
81
+ r = Request.create_initial("invite", "sip:nasir@agnity.com", :p_asserted_identity=>"sip:nina@home.com")
82
+ r.test_header = "test"
83
+ r.test_header = nil
84
+ r.via = "SIP/2.0/UDP 127.0.0.1:5061;branch=z9hG4bK-1-0-1"
85
+ th2 = Thread.new do
86
+ s = UDPSocket.new
87
+ s.bind(@rip, @rp)
88
+ (0..2).each do |i|
89
+ IO.select([s])
90
+ x = s.recvfrom_nonblock(1500)[0]
91
+ assert_equal(ex[i], x.split("\n").map{|y| y.strip}.sort)
92
+ end
93
+ s.close
94
+ end
95
+ @s.send(r)
96
+ assert_not_nil(@s.call_id)
97
+ assert_not_nil(@s.our_contact)
98
+ _res = @s.create_response(200, "OK", r)
99
+ _res.via = "SIP/2.0/UDP 127.0.0.1:5061;branch=z9hG4bK-1-0-1"
100
+ @s.send _res
101
+ _req = @s.create_subsequent_request("update")
102
+ _req.via = "SIP/2.0/UDP 127.0.0.1:5060;branch=z9hG4bK-2-0-2"
103
+ @s.send _req
104
+ th2.join
105
+ end
106
+
107
+
108
+ def test_create_subsequent
109
+ assert_raise(RuntimeError) {@s.create_subsequent_request("invite")}
110
+ send_initial_using_mock_transport
111
+ k = @s.local_cseq
112
+ r = @s.create_subsequent_request("info")
113
+ assert_equal(k+1, @s.local_cseq )
114
+ assert_equal("INFO", r.method)
115
+ end
116
+
117
+ def test_response
118
+ send_initial_using_mock_transport
119
+ assert_raise(RuntimeError) {@s.create_response(200, "OK")}
120
+ rq = @s.create_subsequent_request("info")
121
+ rs = @s.create_response(200, "OK", rq)
122
+ [:call_id, :cseq, :via, :from].each do |m|
123
+ assert_equal(rq.send(m), rs.send(m), "was testing #{m}")
124
+ end
125
+ end
126
+
127
+ def test_non_sip
128
+ assert_raise(ArgumentError) {@s.send("hello")}
129
+ assert_raise(ArgumentError) {@s.send(Message.new)}
130
+ end
131
+
132
+ def test_receive_request
133
+ r = Request.new("invite", "sip:nasir@sipper.com", :call_id => "1-3332@127.0.0.1",
134
+ :contact => "<sip:127.0.0.1:5060;transport=UDP>",
135
+ :cseq => "1 INVITE", :from => "Sipper <sip:sipper@127.0.0.1:5060>;tag=1",
136
+ :to => "Sut <sip:sut@127.0.0.1:5061>",
137
+ :via => "SIP/2.0/UDP 127.0.0.1:5060;branch=z9hG4bK-1-0-1",
138
+ :max_forwards => "70")
139
+ c = FlexMock.new
140
+ c.should_receive(:on_request).with_any_args.and_return(true)
141
+ c.should_receive(:name).and_return("TestSessionController")
142
+ @s.controller = c
143
+ assert_nothing_raised { @s.on_message(r) }
144
+ assert_equal(r, @s.irequest)
145
+ assert_equal("1", @s.remote_tag)
146
+ assert_equal(r.to.to_s, @s.local_uri)
147
+ assert_equal(r.from.to_s, @s.remote_uri)
148
+ assert_equal("sip:127.0.0.1:5060;transport=UDP", @s.remote_target)
149
+ end
150
+
151
+ def test_receive_response
152
+ r = _create_dummy_response
153
+ assert_nothing_raised { @s.on_message(r) }
154
+ assert_equal(r, @s.iresponse)
155
+ assert_equal("sip:127.0.0.1:5060;transport=UDP", @s.remote_target)
156
+ end
157
+
158
+ def test_receive_wrong_sent_by_response
159
+ orig = SipperConfigurator[:ProtocolCompliance]
160
+ SipperConfigurator[:ProtocolCompliance] = 'strict'
161
+ r = _create_dummy_response
162
+ r.via = "SIP/2.0/UDP 127.0.0.1:5061;branch=z9hG4bK-1-0-1" # change port
163
+ @s.on_message(r)
164
+ assert_nil(@s.iresponse)
165
+ r.via = "SIP/2.0/UDP 127.0.0.2:5060;branch=z9hG4bK-1-0-1" # change ip
166
+ @s.on_message(r)
167
+ assert_nil(@s.iresponse)
168
+ r.via = "SIP/2.0/UDP 127.0.0.1:5060;branch=z9hG4bK-1-0-1" # change port
169
+ @s.on_message(r)
170
+ assert_equal(r, @s.iresponse) # verify correct
171
+ SipperConfigurator[:ProtocolCompliance] = orig
172
+ end
173
+
174
+
175
+ def test_invalidate
176
+ SessionManager.clean_all
177
+ send_initial_using_mock_transport
178
+ assert_equal(@s, SessionManager.find_session(@s.call_id, @s.local_tag, @remote_tag))
179
+ @s.invalidate(true)
180
+ assert_nil(SessionManager.find_session(@s.call_id, @s.local_tag, @remote_tag))
181
+ end
182
+
183
+ def test_record
184
+ assert_nothing_raised {
185
+ @s.do_record("test message")
186
+ @s.invalidate(true)
187
+ }
188
+ end
189
+
190
+ def test_cancel_creation
191
+ assert_raise(RuntimeError) { @s.create_cancel }
192
+ send_initial_using_mock_transport
193
+ c = nil
194
+ assert_nothing_raised { c = @s.create_cancel }
195
+ assert_equal("CANCEL", c.method)
196
+ assert_equal(@s.call_id, c.call_id.to_s)
197
+ assert_equal(@s.our_contact, c.contact.to_s)
198
+ assert_equal("sip:nasir@sipper.com", c.uri.to_s)
199
+ end
200
+
201
+ def test_send_cancel_on_response
202
+ send_initial_using_mock_transport
203
+ @s.set_session_record("msg-info")
204
+ @s.create_and_send_cancel_when_ready
205
+ @s.do_record("cancel created but not sent")
206
+ r = _create_dummy_response
207
+ @s.on_message(r)
208
+ @s.invalidate(true)
209
+ #todo DRY
210
+ neutral_files = Dir.glob(File.join(SipperConfigurator[:SessionRecordPath], "*_neutral")).sort
211
+ recording = SessionRecorder.load(neutral_files[0]).get_recording
212
+ record_idx = 0
213
+ expectation = ["! cancel_created_but_not_sent", "< 180", "> CANCEL"]
214
+ expectation.each do |msg|
215
+ assert_equal(msg, recording[record_idx])
216
+ record_idx += 1
217
+ end
218
+ end
219
+
220
+ def test_transaction_config
221
+ orig = SipperConfigurator[:SessionTxnUsage]
222
+ SipperConfigurator[:SessionTxnUsage] = {:use_transactions=>false}
223
+ s = Session.new @t1, @rip, @rp
224
+ assert_equal(false, s.use_transactions)
225
+ SipperConfigurator[:SessionTxnUsage] = {:use_transactions=>true}
226
+ s = Session.new @t1, @rip, @rp
227
+ assert(s.use_transactions)
228
+ SipperConfigurator[:SessionTxnUsage] = {:use_transactions=>true, :use_ict=>false, :use_nict=>true, :use_ist=>false, :use_nist=>true}
229
+ s = Session.new @t1, @rip, @rp
230
+ assert(!s.use_ict)
231
+ assert(s.use_nict)
232
+ assert(!s.use_ist)
233
+ assert(s.use_nist)
234
+ SipperConfigurator[:SessionTxnUsage] = orig # restore config
235
+ end
236
+
237
+ def _create_dummy_response
238
+ r = Response.new(180, "Ringing",
239
+ :call_id => "1-3332@127.0.0.1",
240
+ :contact => "<sip:127.0.0.1:5060;transport=UDP>",
241
+ :cseq => "1 INVITE", :from => "Sipper <sip:sipper@127.0.0.1:5060> ;tag=1",
242
+ :to => "Sut <sip:sut@127.0.0.1:5061>",
243
+ :via => "SIP/2.0/UDP 127.0.0.1:5060;branch=z9hG4bK-1-0-1")
244
+ c = FlexMock.new
245
+ c.should_receive(:on_response).with_any_args.and_return(true)
246
+ c.should_receive(:name).and_return("TestSessionController")
247
+ c.should_receive(:specified_transport).and_return(nil)
248
+ @s.controller = c
249
+ r
250
+ end
251
+
252
+ def send_initial_using_mock_transport
253
+ # method, r-uri...
254
+ r = Request.create_initial("invite", "sip:nasir@sipper.com", :p_asserted_identity=>"sip:nina@home.com")
255
+ r.via = "SIP/2.0/UDP 127.0.0.1:5060;branch=z9hG4bK-1-0-1"
256
+ t = FlexMock.new
257
+ t.should_receive(:send).with_any_args
258
+ t.should_receive(:ip).and_return("127.0.0.1")
259
+ t.should_receive(:port).and_return("5060")
260
+ t.should_receive(:tid).and_return("UDP")
261
+ @s.transport = t
262
+ @s.send(r)
263
+ end
264
+
265
+
266
+ def teardown
267
+ @t1.stop_transport if @t1.running
268
+ SipperUtil::Counter.instance.reset
269
+ Dir.glob(File.join(SipperConfigurator[:SessionRecordPath], "*_neutral")).each {|f| File.delete(f)}
270
+ SipperConfigurator[:ShowSessionIdInMessages] = @sid
271
+ super
272
+ end
273
+
274
+ private :send_initial_using_mock_transport, :_create_dummy_response
275
+
276
+ end
@@ -0,0 +1,68 @@
1
+ require 'driven_sip_test_case'
2
+
3
+ class TestSessionCallbackHandler < DrivenSipTestCase
4
+
5
+ def setup
6
+ super
7
+ str = <<-EOF
8
+ require 'sip_test_driver_controller'
9
+ module SipInline
10
+ class UasScbhController < SIP::SipTestDriverController
11
+ def on_invite(session)
12
+ logd("Received INVITE in #{name}")
13
+ session.local_tag = 5 #todo differentiate automatically on the same container somehow
14
+ r = session.create_response(200, "OK")
15
+ session.send(r)
16
+ session.invalidate
17
+ end
18
+
19
+ def order
20
+ 0
21
+ end
22
+ end
23
+ class UacScbhController < SIP::SipTestDriverController
24
+
25
+ session_timer 500
26
+
27
+ def start
28
+ r = Request.create_initial("invite", "sip:nasir@sipper.com", :p_session_record=>"msg-info")
29
+ u = create_udp_session(SipperConfigurator[:LocalSipperIP], SipperConfigurator[:LocalTestPort])
30
+ u.send(r)
31
+ logd("Sent a new INVITE from #{name}")
32
+ end
33
+
34
+ def on_success_res(session)
35
+ logd("Received response in #{name}")
36
+ # session.session_timer = 200 (alternatively used the directive)
37
+ session.invalidate
38
+ session.flow_completed_for("TestSessionCallbackHandler")
39
+ end
40
+
41
+ def session_being_invalidated_ok_to_proceed?(session)
42
+ if session['once']
43
+ return true
44
+ else
45
+ session['once'] = true
46
+ session.session_timer = 200
47
+ session.do_record("InvalidateHandler")
48
+ return false
49
+ end
50
+ end
51
+
52
+ end
53
+ end
54
+ EOF
55
+ define_controller_from(str)
56
+ set_controller("SipInline::UacScbhController")
57
+ end
58
+
59
+
60
+ def test_scbh_controller
61
+ self.expected_flow = ["> INVITE", "< 200", "! InvalidateHandler"]
62
+ start_controller
63
+ verify_call_flow(:out)
64
+ self.expected_flow = ["< INVITE", "> 200"]
65
+ verify_call_flow(:in)
66
+ end
67
+
68
+ end
@@ -0,0 +1,66 @@
1
+ require 'driven_sip_test_case'
2
+
3
+ class TestSessionLifetime < DrivenSipTestCase
4
+
5
+ def setup
6
+ super
7
+ str = <<-EOF
8
+ require 'sip_test_driver_controller'
9
+
10
+ module SipInline
11
+
12
+ class UasSltController < SIP::SipTestDriverController
13
+ def on_invite(session)
14
+ logd("Received INVITE in #{name}")
15
+ session.local_tag = 5
16
+ r = session.create_response(200, "OK")
17
+ session.send(r)
18
+ session.invalidate
19
+ end
20
+
21
+ def order
22
+ 0
23
+ end
24
+ end
25
+
26
+
27
+ class UacSltController < SIP::SipTestDriverController
28
+
29
+ session_timer 70
30
+ session_limit 240
31
+
32
+ def start
33
+ r = Request.create_initial("invite", "sip:nasir@sipper.com", :p_session_record=>"msg-info")
34
+ u = create_udp_session(SipperConfigurator[:LocalSipperIP], SipperConfigurator[:LocalTestPort])
35
+ u.send(r)
36
+ logd("Sent a new INVITE from #{name}")
37
+ end
38
+
39
+ def on_success_res(session)
40
+ logd("Received response in #{name}")
41
+ session.invalidate
42
+ session.flow_completed_for("TestSessionLifetime")
43
+ end
44
+
45
+ def session_being_invalidated_ok_to_proceed?(session)
46
+ session.do_record("Life")
47
+ return false
48
+ end
49
+
50
+ end
51
+ end
52
+ EOF
53
+ define_controller_from(str)
54
+ set_controller("SipInline::UacSltController")
55
+ end
56
+
57
+
58
+ def test_slt_controller
59
+ self.expected_flow = ["> INVITE", "< 200", "! Life {3,3}"]
60
+ start_controller
61
+ verify_call_flow(:out)
62
+ self.expected_flow = ["< INVITE", "> 200"]
63
+ verify_call_flow(:in)
64
+ end
65
+
66
+ end
@@ -0,0 +1,141 @@
1
+ $:.unshift File.join(File.dirname(__FILE__),"..","sipper")
2
+
3
+ require 'session_manager'
4
+ require 'test/unit'
5
+
6
+
7
+ class TestSessionManager < Test::Unit::TestCase
8
+
9
+ def setup
10
+ @s = Session.new("tp", "ip", "port")
11
+ end
12
+
13
+ # REQ> 100<
14
+ def test_find_initial_request_out_on_trying_in
15
+ assert_nil(@s.session_map)
16
+ initial_request_out
17
+ s = SessionManager.find_session("my_call_id", "2345", nil)
18
+ assert_equal(@s, s)
19
+ assert_equal(:half, @s.session_map)
20
+ end
21
+
22
+ # REQ> 180< CANCEL>
23
+ def test_find_initial_request_out_on_ringing
24
+ initial_request_out
25
+ # now 180 received with To tag
26
+ s = SessionManager.find_session("my_call_id", "2345", "6789")
27
+ assert_equal(@s, s)
28
+ assert_equal(:half, @s.session_map)
29
+ # now a CANCEL goes
30
+ s = SessionManager.find_session("my_call_id", "2345", nil)
31
+ assert_equal(@s, s)
32
+ assert_equal(:half, @s.session_map)
33
+ end
34
+
35
+ # REQ> <200
36
+ def test_find_initial_request_out_on_success
37
+ initial_request_out
38
+ # now 200 received with To tag
39
+ s = SessionManager.find_session("my_call_id", "2345", "6789", true)
40
+ @s.session_key = "|2345|my_call_id|6789|"
41
+ @s.session_map = :full
42
+ assert_equal(@s, s)
43
+ assert_equal(:full, s.session_map)
44
+
45
+ assert(s=SessionManager.find_session("my_call_id", "2345", nil)) # as we are not removing from HDM
46
+ assert_equal("|2345|my_call_id||", s.half_dialog_key)
47
+ #assert_nil SessionManager.find_session("my_call_id", nil, "6789")
48
+ end
49
+
50
+ # SUB> NOT< 2xx<
51
+ def test_find_subscribe_out_notify_in_success_in
52
+ initial_request_out
53
+ # now receive NOTIFY before 2xx
54
+ s = SessionManager.find_session("my_call_id", "2345", "6789", false)
55
+ @s.session_key = "|2345|my_call_id|6789|"
56
+ @s.session_map = :full
57
+ assert_equal(@s, s)
58
+ assert_equal(:full, s.session_map)
59
+ # but we should still find it in half map
60
+ assert_equal @s, SessionManager.find_session("my_call_id", "2345", nil)
61
+ # and now comes 2xx
62
+ s = SessionManager.find_session("my_call_id", "2345", "6789", true)
63
+ assert_equal(@s, s)
64
+ assert_equal(:full, s.session_map)
65
+ assert(s=SessionManager.find_session("my_call_id", "2345", nil)) # as we are not removing from HDM
66
+ assert_equal("|2345|my_call_id||", s.half_dialog_key)
67
+ end
68
+
69
+ # REQ< 100>
70
+ def test_initial_request_in_trying_out
71
+ initial_request_in_trying_out
72
+ s = SessionManager.find_session("my_call_id", nil, "1234")
73
+ assert_equal(@s, s)
74
+ assert_equal(:half, s.session_map)
75
+ end
76
+
77
+ # REQ< 100> 2xx>
78
+ def test_initial_request_in_trying_out_final_out
79
+ initial_request_in_trying_out
80
+ s = SessionManager.find_session("my_call_id", nil, "1234")
81
+ s.local_tag = "2345"
82
+ SessionManager.add_session s, true
83
+ s = SessionManager.find_session("my_call_id", "2345", "1234")
84
+ assert_equal(@s, s)
85
+ assert_equal(:full, s.session_map)
86
+ assert_equal("|2345|my_call_id|1234|", s.session_key)
87
+ # half map should not have it anymore
88
+ assert_nil SessionManager.find_session("my_call_id", nil, "2345")
89
+ # as also the other half
90
+ assert_nil SessionManager.find_session("my_call_id", "1234", nil)
91
+ end
92
+
93
+
94
+ def test_remove
95
+ assert_nil SessionManager.find_session("my_call_id", nil, "1234")
96
+ SessionManager.remove_session @s
97
+ SessionManager.remove_session @s # seeing nothing untoward happens
98
+ setup
99
+ initial_request_in_trying_out
100
+ assert_equal @s, SessionManager.find_session("my_call_id", nil, "1234")
101
+ SessionManager.remove_session @s
102
+ assert_nil SessionManager.find_session("my_call_id", nil, "1234")
103
+ # try to remove it again
104
+ SessionManager.remove_session @s
105
+ assert_nil SessionManager.find_session("my_call_id", nil, "1234")
106
+ # setup again
107
+ setup
108
+ initial_request_in_trying_out
109
+ @s.session_map = nil
110
+ SessionManager.remove_session @s
111
+ # will not remove as we botched the session_map
112
+ assert_equal @s, SessionManager.find_session("my_call_id", nil, "1234")
113
+ end
114
+
115
+ def test_clean_all
116
+ initial_request_in_trying_out
117
+ assert_equal @s, SessionManager.find_session("my_call_id", nil, "1234")
118
+ SessionManager.clean_all
119
+ assert_nil SessionManager.find_session("my_call_id", nil, "1234")
120
+ end
121
+
122
+
123
+ def initial_request_out
124
+ @s.local_tag = "2345"
125
+ @s.call_id = "my_call_id"
126
+ # Add on simple request going out
127
+ SessionManager.add_session @s
128
+ end
129
+
130
+ def initial_request_in_trying_out
131
+ @s.remote_tag = "1234"
132
+ @s.call_id = "my_call_id"
133
+ # Add on trying response going out
134
+ SessionManager.add_session @s
135
+ end
136
+
137
+
138
+ def teardown
139
+ SessionManager.clean_all
140
+ end
141
+ end