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,18 @@
1
+ require 'util/sipper_util'
2
+ require 'sip_headers/header'
3
+ require 'ruby_ext/module'
4
+
5
+ class String
6
+
7
+ # extension to read class names from a string containing class definitions
8
+ def all_class_names
9
+ mod = Module.new
10
+ mod.module_eval(self)
11
+ mod.all_class_names
12
+ end
13
+
14
+ def int?
15
+ /^-?\d+$/ === self
16
+ end
17
+
18
+ end
@@ -0,0 +1,9 @@
1
+
2
+ class Time
3
+
4
+ # currentTimeMillis
5
+ def self.ctm
6
+ Time.now.to_f*1000
7
+ end
8
+
9
+ end
@@ -0,0 +1,28 @@
1
+ $:.unshift File.join(File.dirname(__FILE__),"..")
2
+
3
+ require 'sipper'
4
+ require 'monitor'
5
+
6
+ class RunSipper1
7
+
8
+ def initialize(file=nil)
9
+ @cfile = file
10
+ end
11
+
12
+ def run
13
+ Thread.current[:name] = "MainThread"
14
+ SipperConfigurator[:ControllerPath] = :file_given if @cfile
15
+ #Signal.trap("INT") { puts; exit }
16
+ s = SIP::Sipper.new()
17
+ t = s.start
18
+ if @cfile
19
+ cname = s.load_controller(IO.readlines(@cfile).join)
20
+ s.start_controller_unless_sol(cname)
21
+ end
22
+ Signal.trap("INT") { puts; s.stop; exit }
23
+ loop do
24
+ t.join(3)
25
+ end
26
+ end
27
+
28
+ end
@@ -0,0 +1,56 @@
1
+ $:.unshift File.join(File.dirname(__FILE__),"..")
2
+
3
+ require 'sipper'
4
+
5
+
6
+
7
+ Thread.current[:name] = "MainThread"
8
+
9
+
10
+ s = SIP::Sipper.new(
11
+ :Ips=>[SipperConfigurator[:LocalSipperIP]], # though not required to mention as default is same
12
+ :Ports=>[5060],
13
+ :ControllerPath=>nil
14
+ )
15
+ SipperConfigurator[:ProtocolCompliance] = 'strict'
16
+ trap("INT"){ s.stop }
17
+ t = s.start
18
+
19
+ # dynamically load controller
20
+ str = <<-EOF
21
+ require 'base_controller'
22
+ require 'sip_test_driver_controller'
23
+ module MyControllers
24
+ class SimpleController < SIP::BaseController
25
+ def start
26
+ r = Request.create_initial("info", "sip:nasir@codepresso.com", :allow=>"INVITE", :require=>"100rel")
27
+ r.add_allow("BYE").push_allow("OPTIONS")
28
+ r.add_require("dialog")
29
+ r.format_as_separate_headers_for_mv(:allow, :require)
30
+ u = create_udp_session(SipperConfigurator[:LocalSipperIP], SipperConfigurator[:LocalTestPort])
31
+ u.send(r)
32
+ end
33
+ end
34
+
35
+ class UasMsgController < SIP::SipTestDriverController
36
+ session_timer 100
37
+ def on_message(session)
38
+ session.local_tag = 5
39
+ r = session.create_response(200, "OK")
40
+ session.send(r)
41
+ end
42
+
43
+ def on_cleanup(session)
44
+ session.invalidate
45
+ session.flow_completed_for("TestRemoteController")
46
+ end
47
+
48
+ def order
49
+ 0
50
+ end
51
+ end
52
+ end
53
+ EOF
54
+ s.load_controller( str )
55
+ s.start_controller( "MyControllers::SimpleController")
56
+ t.join
@@ -0,0 +1,257 @@
1
+ =begin
2
+
3
+ RFC 4566
4
+
5
+ Session description
6
+ v= (protocol version)
7
+ o= (originator and session identifier)
8
+ s= (session name)
9
+ i=* (session information)
10
+ u=* (URI of description)
11
+ e=* (email address)
12
+ p=* (phone number)
13
+ c=* (connection information -- not required if included in
14
+ all media)
15
+ b=* (zero or more bandwidth information lines)
16
+ One or more time descriptions ("t=" and "r=" lines; see below)
17
+ z=* (time zone adjustments)
18
+ k=* (encryption key)
19
+ a=* (zero or more session attribute lines)
20
+ Zero or more media descriptions
21
+
22
+ Time description
23
+ t= (time the session is active)
24
+ r=* (zero or more repeat times)
25
+
26
+ Media description, if present
27
+ m= (media name and transport address)
28
+ i=* (media title)
29
+ c=* (connection information -- optional if included at
30
+ session level)
31
+ b=* (zero or more bandwidth information lines)
32
+ k=* (encryption key)
33
+ a=* (zero or more media attribute lines)
34
+
35
+
36
+
37
+ Example -
38
+ v=0
39
+ o=jdoe 2890844526 2890842807 IN IP4 10.47.16.5
40
+ s=SDP Seminar
41
+ i=A Seminar on the session description protocol
42
+ u=http://www.example.com/seminars/sdp.pdf
43
+ e=j.doe@example.com (Jane Doe)
44
+ c=IN IP4 224.2.17.12/127
45
+ t=2873397496 2873404696
46
+ a=recvonly
47
+ m=audio 49170 RTP/AVP 0
48
+ m=video 51372 RTP/AVP 99
49
+ a=rtpmap:99 h263-1998/90000
50
+
51
+ =end
52
+ module SDP
53
+
54
+ class Sdp
55
+
56
+ def session_lines=(h)
57
+ @sa = h
58
+ end
59
+
60
+ # media lines are an ordered array
61
+ # where each media line is an array member
62
+ # modeled as a hash
63
+ def add_media_lines(h)
64
+ @ma ||= []
65
+ @ma << h
66
+ end
67
+
68
+ def remove_media_line_at(k)
69
+ @ma.delete_at(k)
70
+ end
71
+
72
+ # a=xxx
73
+ def add_media_attribute_at(k, attr)
74
+ raise ArgumentError, "We have #{@ma.length} media lines" if @ma.length <= k
75
+ if @ma[k][:a].nil?
76
+ @ma[k][:a] = attr
77
+ else
78
+ @ma[k][:a] << "||" << attr
79
+ end
80
+ end
81
+
82
+ def remove_media_attribute_at(k, attr)
83
+ raise ArgumentError, "We have #{@ma.length} media lines" if @ma.length <= k
84
+ unless @ma[k][:a].nil?
85
+ @ma[k][:a] = (@ma[k][:a].split("||").reject {|v| v == attr }).join("||")
86
+ end
87
+ end
88
+
89
+ def get_media_attributes_at(k)
90
+ raise ArgumentError, "We have #{@ma.length} media lines" if @ma.length <= k
91
+ @ma[k][:a].split("||")
92
+ end
93
+
94
+ def session_lines
95
+ @sa
96
+ end
97
+
98
+ def media_lines
99
+ @ma
100
+ end
101
+
102
+ def media_lines=(val)
103
+ @ma = val
104
+ end
105
+
106
+ def format_sdp(separator="\r\n")
107
+ sdp = ""
108
+
109
+ # session lines
110
+ [ :v, :o, :s, :i, :u, :e, :p, :c, :b, :z, :k, :t, :r, :a].each do |attr|
111
+ unless self.session_lines[attr].nil?
112
+ self.session_lines[attr].split("||").each do |v|
113
+ sdp << sprintf("%s=%s%s", attr.to_s, v, separator)
114
+ end
115
+ end
116
+ end
117
+
118
+ # media lines
119
+ if media_lines
120
+ media_lines.each do |ma|
121
+ [ :m, :i, :c, :b, :k, :a ].each do |attr|
122
+ unless ma[attr].nil?
123
+ ma[attr].split("||").each do |v|
124
+ sdp << sprintf("%s=%s%s", attr.to_s, v, separator)
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
130
+ return sdp
131
+ end
132
+
133
+ def to_s
134
+ format_sdp
135
+ end
136
+
137
+ def get_owner_version
138
+ return @sa[:o].split(" ")[2].to_i
139
+ end
140
+
141
+ def set_owner_version(inVersion)
142
+ vals = @sa[:o].split(" ")
143
+ vals[2] = inVersion.to_s
144
+ @sa[:o] = vals.join(" ")
145
+ end
146
+ def increment_owner_version
147
+ vals = @sa[:o].split(" ")
148
+ vals[2] = (vals[2].to_i + 1).to_s
149
+ @sa[:o] = vals.join(" ")
150
+ end
151
+
152
+ def clone
153
+ ret = Sdp.new
154
+
155
+ [ :v, :o, :s, :i, :u, :e, :p, :c, :b, :z, :k, :t, :r, :a].each do |attr|
156
+ unless @sa[attr].nil?
157
+ ret.session_lines = {} unless ret.session_lines
158
+ ret.session_lines[attr] = @sa[attr]
159
+ end
160
+ end
161
+
162
+ # media lines
163
+ if @ma
164
+ ret.media_lines = []
165
+ @ma.each do |ma|
166
+ currattr = {}
167
+ [ :m, :i, :c, :b, :k, :a ].each do |attr|
168
+ unless ma[attr].nil?
169
+ currattr[attr] = ma[attr]
170
+ end
171
+ end
172
+ ret.media_lines << currattr
173
+ end
174
+ end
175
+
176
+ return ret
177
+ end
178
+ end
179
+
180
+ def SDP.check_codec_in_media(media, codec)
181
+ return media[:m].split(" ")[3..-1].include?("0") if codec == "G711U"
182
+ return media[:m].split(" ")[3..-1].include?("8") if codec == "G711A"
183
+ if codec == "DTMF"
184
+ media[:a].split("||").each do |val|
185
+ return true if val.include?("telephone-event")
186
+ end
187
+ end
188
+
189
+ return nil
190
+ end
191
+
192
+ def SDP.get_codecs_in_media(media)
193
+ codec = []
194
+
195
+ codecnums = media[:m].split(" ")[3..-1]
196
+
197
+ codec << "G711U" if codecnums.include?("0")
198
+ codec << "G711A" if codecnums.include?("8")
199
+
200
+ media[:a].split("||").each do |val|
201
+ codec << "DTMF" if val.include?("telephone-event")
202
+ end
203
+
204
+ return codec
205
+ end
206
+
207
+ def SDP.get_media_status(media)
208
+ retStatus = "sendrecv"
209
+ media[:a].split("||").each do |val|
210
+ retStatus = "inactive" if val == "inactive"
211
+ retStatus = "sendrecv" if val == "sendrecv"
212
+ retStatus = "recvonly" if val == "recvonly"
213
+ retStatus = "sendonly" if val == "sendonly"
214
+ end
215
+
216
+ return retStatus
217
+ end
218
+
219
+ def SDP.get_answer_status(status)
220
+ return "inactive" if status == "inactive"
221
+ return "recvonly" if status == "sendonly"
222
+ return "sendrecv" if status == "sendrecv"
223
+ return "sendonly" if status == "recvonly"
224
+ return "sendrecv"
225
+ end
226
+
227
+ def SDP.is_media_equal(media1, media2)
228
+ return false if media1[:m] != media2[:m]
229
+ return false if SDP.get_media_status(media1) != SDP.get_media_status(media2)
230
+ return true
231
+ end
232
+
233
+ def SDP.set_media_type(media, intype)
234
+ vals = media[:m].split(" ")
235
+ vals[0] = intype
236
+ media[:m] = vals.join(" ")
237
+ end
238
+
239
+ def SDP.get_media_type(media)
240
+ return media[:m].split(" ")[0]
241
+ end
242
+
243
+ def SDP.set_media_transport(media, transport)
244
+ vals = media[:m].split(" ")
245
+ vals[2] = transport
246
+ media[:m] = vals.join(" ")
247
+ end
248
+
249
+ def SDP.get_media_transport(media)
250
+ return media[:m].split(" ")[2]
251
+ end
252
+
253
+ def SDP.copy_media_type_transport(media1, media2)
254
+ SDP.set_media_type(media2, SDP.get_media_type(media1))
255
+ SDP.set_media_transport(media2, SDP.get_media_transport(media1))
256
+ end
257
+ end
@@ -0,0 +1,131 @@
1
+ require 'sdp/sdp'
2
+ require 'sipper_configurator'
3
+
4
+
5
+ module SDP
6
+ class SdpGenerator
7
+
8
+ # v=0
9
+ # o=<username> <sess-id> <sess-version> <nettype> <addrtype>
10
+ # <unicast-address>
11
+ # e.g. o=jdoe 2890844526 2890842807 IN IP4 10.47.16.5
12
+ #
13
+ # s=<session name>
14
+ # s=SDP Seminar
15
+ #
16
+ # c=<nettype> <addrtype> <connection-address>
17
+ # c=IN IP4 192.168.1.2
18
+ #
19
+ # t=<start-time> <stop-time>
20
+ # To convert these values to UNIX time, subtract
21
+ # decimal 2208988800.
22
+
23
+
24
+
25
+
26
+ def self.make_no_media_sdp(session_hash=nil, ip = nil)
27
+ sdp = SDP::Sdp.new
28
+ sdp.session_lines = session_hash || {}
29
+
30
+ if sdp.session_lines[:v].nil?
31
+ sdp.session_lines[:v] = "0"
32
+ end
33
+
34
+ ip = SipperConfigurator[:LocalSipperIP] unless ip
35
+
36
+ if sdp.session_lines[:o].nil?
37
+ tm = Time.new.tv_sec
38
+ sdp.session_lines[:o] =
39
+ sprintf("nkhan %s %s IN IP4 %s", tm, tm, ip)
40
+ end
41
+ if sdp.session_lines[:s].nil?
42
+ sdp.session_lines[:s] = "Sipper Session"
43
+ end
44
+ if sdp.session_lines[:c].nil?
45
+ sdp.session_lines[:c] =
46
+ sprintf("IN IP4 %s", ip)
47
+ end
48
+ if sdp.session_lines[:t].nil?
49
+ sdp.session_lines[:t] = (Time.new.tv_sec + 2208988800).to_s + " 0"
50
+ end
51
+ sdp
52
+ end
53
+
54
+ def self.make_sdp_media(ip, port, codecs, status)
55
+ h = {}
56
+ ma = []
57
+
58
+ h[:c] = sprintf("IN IP4 %s", ip.to_s.chomp) if ip
59
+ if codecs.include?('G711U')
60
+ h[:m] = sprintf("audio %s RTP/AVP 0", port.to_s.chomp)
61
+ ma << 'rtpmap:0 PCMU/8000'
62
+ end
63
+ if codecs.include?('G711A')
64
+ if h[:m]
65
+ h[:m] << " 8"
66
+ else
67
+ h[:m] = sprintf("audio %s RTP/AVP 8", port.to_s.chomp)
68
+ end
69
+ ma << 'rtpmap:8 PCMA/8000'
70
+ end
71
+ if codecs.include?('DTMF')
72
+ if h[:m]
73
+ h[:m] << " 101"
74
+ else
75
+ h[:m] = sprintf("audio %s RTP/AVP 101", port.to_s.chomp)
76
+ end
77
+ ma << 'rtpmap:101 telephone-event/8000'
78
+ end
79
+
80
+ unless h[:m]
81
+ h[:m] = sprintf("audio 0 RTP/AVP 0", port.to_s.chomp)
82
+ ma << 'rtpmap:0 PCMU/8000'
83
+ end
84
+
85
+ ma << status
86
+
87
+ ma.each do |a|
88
+ unless h[:a]
89
+ h[:a] = a
90
+ else
91
+ h[:a] << "||" << a
92
+ end
93
+ end
94
+
95
+ return h
96
+ end
97
+
98
+ def self.make_sdp(session_hash, ip, port, codecs, type)
99
+ sdp = make_no_media_sdp(session_hash, ip)
100
+ h = {}
101
+ ma = []
102
+ if codecs.include?('G711U')
103
+ h[:m] = sprintf("audio %s RTP/AVP 0", port.to_s.chomp)
104
+ ma << 'rtpmap:0 PCMU/8000'
105
+ end
106
+ if codecs.include?('G711A')
107
+ if h[:m]
108
+ h[:m] << " 8"
109
+ else
110
+ h[:m] = sprintf("audio %s RTP/AVP 8", port.to_s.chomp)
111
+ end
112
+ ma << 'rtpmap:8 PCMA/8000'
113
+ end
114
+ if codecs.include?('DTMF')
115
+ if h[:m]
116
+ h[:m] << " 101"
117
+ else
118
+ h[:m] = sprintf("audio %s RTP/AVP 101", port.to_s.chomp)
119
+ end
120
+ ma << 'rtpmap:101 telephone-event/8000'
121
+ end
122
+ sdp.add_media_lines(h)
123
+ sdp.add_media_attribute_at(0, type.downcase) if type
124
+ ma.each do |a|
125
+ sdp.add_media_attribute_at(0, a)
126
+ end
127
+ sdp
128
+ end
129
+
130
+ end # class
131
+ end