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,10 @@
1
+ require 'base_controller'
2
+ require 'udp_session'
3
+
4
+ module SIP
5
+
6
+ class SipTestDriverController < BaseController
7
+
8
+ end
9
+
10
+ end
@@ -0,0 +1,329 @@
1
+ require 'sipper_configurator'
2
+
3
+ Dir[File.join(File.dirname(__FILE__), 'lib/**/*.rb')].each {|l| load l}
4
+ $:.unshift File.join(SipperConfigurator[:SipperBasePath],"sipper","lib")
5
+ $:.unshift File.join(SipperConfigurator[:SipperBasePath],"sipper","lib", "smc")
6
+
7
+ require 'statemap'
8
+
9
+ require 'util/sipper_util'
10
+ require 'ruby_ext/object'
11
+ require 'ruby_ext/string'
12
+ require 'sip_logger'
13
+ require 'transport/base_transport'
14
+ require 'transport/udp_transport'
15
+ require 'sip_message_router'
16
+ require 'transport_manager'
17
+ require 'controller_selector'
18
+ require 'controller_class_loader'
19
+ require 'util/locator'
20
+ require 'test_completion_signaling_helper'
21
+ require 'util/timer/timer_manager'
22
+ require 'util/timer/sip_timer_helper'
23
+ require 'util/persistence/ps_sipper_map'
24
+ require 'version'
25
+ require 'message'
26
+ require 'request'
27
+ require 'response'
28
+ require 'fileutils'
29
+ require 'custom_message'
30
+
31
+ require 'socket'
32
+ require 'monitor'
33
+ require 'drb/drb'
34
+
35
+ require 'base_controller'
36
+ require 'sip_test_driver_controller'
37
+ require 'bin/common'
38
+
39
+ require 'media/sipper_media_proxy'
40
+ require 'media/sipper_media_manager'
41
+
42
+ require 'sipper_http/sipper_http_request_dispatcher'
43
+
44
+ module SIP
45
+ class Sipper
46
+ include SipLogger
47
+
48
+ attr_reader :running
49
+
50
+ def initialize( config={} )
51
+ if RUBY_PLATFORM =~ /mswin/
52
+ SipperConfigurator[:SipperPlatformRecordingSeparator] = "\r\n"
53
+ elsif
54
+ RUBY_PLATFORM =~ /linux/
55
+ SipperConfigurator[:SipperPlatformRecordingSeparator] = "\n"
56
+ end
57
+
58
+ # If user has provided the file from the command line using -c
59
+ # option then we should not try to load controllers from the
60
+ # controlle path, this further ensures that even in project settings
61
+
62
+ file_given = true if SipperConfigurator[:ControllerPath] == :file_given
63
+ SipperUtil::Common.set_environment()
64
+ SipperConfigurator[:ControllerPath] = :file_given if file_given
65
+ if config[:Ips]
66
+ ips = config[:Ips]
67
+ else
68
+ SipperConfigurator[:LocalSipperIP] = "127.0.0.1" unless SipperConfigurator[:LocalSipperIP]
69
+ if SipperConfigurator[:LocalSipperIP].class == Array
70
+ ips = SipperConfigurator[:LocalSipperIP]
71
+ else
72
+ ips = [SipperConfigurator[:LocalSipperIP]]
73
+ end
74
+ end
75
+
76
+ if config[:Ports]
77
+ ports = config[:Ports]
78
+ else
79
+ SipperConfigurator[:LocalSipperPort] = 5060 unless SipperConfigurator[:LocalSipperPort]
80
+ if SipperConfigurator[:LocalSipperPort].class == Array
81
+ ports = SipperConfigurator[:LocalSipperPort]
82
+ else
83
+ ports = [SipperConfigurator[:LocalSipperPort]]
84
+ end
85
+ end
86
+
87
+ # check for asymmetrical config
88
+ diff = ips.length - ports.length
89
+
90
+ if diff > 0
91
+ diff.times do
92
+ ports << ports[-1]
93
+ end
94
+ elsif diff < 0
95
+ pdiff = -1 * diff
96
+ pdiff.times do
97
+ ips << ips[-1]
98
+ end
99
+ end
100
+
101
+ # Make sure ip port tuples are unique
102
+ if ips.length > 1
103
+ tuples = []
104
+ ips.each_with_index do |ip, i|
105
+ tuples << [ip, ports[i]]
106
+ end
107
+ tuples.uniq!
108
+ ips = []
109
+ ports = []
110
+ tuples.each do |t|
111
+ ips << t[0]
112
+ ports << t[1]
113
+ end
114
+ end
115
+
116
+
117
+ SipperConfigurator[:ControllerPath] ||= config[:ControllerPath]
118
+
119
+ SipperConfigurator[:DefaultRIP] ||= "127.0.0.1"
120
+ SipperConfigurator[:DefaultRP] ||= 5060
121
+
122
+ #default_cp = File.join(SipperConfigurator[:SipperBasePath], "sipper", "controllers")
123
+ #SipperConfigurator[:ControllerPath] ||= default_cp
124
+ @q = Queue.new # the message queue
125
+ SIP::Locator[:Tm] = TransportManager.new
126
+
127
+ # Each transport uses the same queue
128
+ ports.length.times do |i|
129
+ SIP::Locator[:Tm].add_transport(::Transport::UdpTransport.instance(ips[i]?ips[i]:ips[0], ports[i], @q))
130
+ #logi("Created the transport #{ips[i]?ips[i]:ips[0]}, #{ports[i]}")
131
+ end
132
+ logi("Added #{ports.length} transports to transport manager")
133
+ SipperConfigurator[:NumThreads] ||= config[:NumThreads] || 5
134
+ @smr = SipMessageRouter.new(@q, SipperConfigurator[:NumThreads])
135
+ @running = false
136
+ if SipperConfigurator[:TimerGranularity]
137
+ @tm = SIP::TimerManager.new(@q, SipperConfigurator[:TimerGranularity])
138
+ else
139
+ @tm = SIP::TimerManager.new(@q)
140
+ end
141
+
142
+ if SipperConfigurator[:SipperMedia]
143
+ SIP::Locator[:Smd] = Media::SipperMediaProxy.new
144
+ Media::SipperMediaManager.instance.set_queue(@q)
145
+ end
146
+
147
+ # Location service store / for registrar
148
+ SIP::Locator[:RegistrationStore] = SipperUtil::Persistence::PsSipperMap.new("registration_store")
149
+
150
+ # Location service store / for dialog store
151
+ SIP::Locator[:DialogInfoStore] = SipperUtil::Persistence::PsSipperMap.new("dialog_info_store")
152
+
153
+ # Sipper HTTP Client
154
+ SIP::Locator[:HttpRequestDispatcher] = SipperHttpRequestDispatcher.new(@q, SipperConfigurator[:HttpClientThreads])
155
+
156
+ SIP::Locator[:Sipper] = self
157
+
158
+ # NK
159
+ Thread.abort_on_exception = true
160
+
161
  end
162
+
163
+
164
+
165
+
166
+ def start
167
+ if SipperConfigurator[:TestManagerName]
168
+ if (Socket.gethostbyname(Socket.gethostname) == Socket.gethostbyname(SipperConfigurator[:TestManagerName]))
169
+ DRb.start_service("druby://#{SipperConfigurator[:TestManagerName]}:#{SipperConfigurator[:TestManagerPort]}", SIP::TcshProxy.new)
170
+ else
171
+ DRb.start_service
172
+ end
173
+ logd("Starting the client DRb service")
174
+ end
175
+ @tm.start # starting the timer manager
176
+
177
+
178
+ # Timer helper
179
+ SIP::Locator[:Sth] = SIP::SipTimerHelper.new(@tm)
180
+
181
+ SIP::ControllerClassLoader.clear_all # start from a clean slate
182
+ if SipperConfigurator[:ControllerPath] && SipperConfigurator[:ControllerPath] != :file_given
183
+ cdir = Dir.new(SipperConfigurator[:ControllerPath])
184
+ SipperConfigurator[:ControllerLibPath] ||= File.join(SipperConfigurator[:ControllerPath], "lib")
185
+ $:.unshift SipperConfigurator[:ControllerLibPath] # now transaction_handlers can be required in controllers
186
+ Dir["#{SipperConfigurator[:ControllerLibPath]}/transport_filters/*.rb"].each{|x| load x } # load all filters
187
+ Dir["#{SipperConfigurator[:ControllerLibPath]}/transport_filters/*.yaml"].each do |o|
188
+ if o=~/in_order.yaml/
189
+ ::Transport::BaseTransport.in_order = SipperUtil.load_yaml(o)
190
+ elsif o=~/out_order.yaml/
191
+ ::Transport::BaseTransport.out_order = SipperUtil.load_yaml(o)
192
+ end
193
+ end
194
+ # Now loading the extensions
195
+ Dir["#{SipperConfigurator[:ControllerLibPath]}/sipper_extensions/*.rb"].each{|x| require x }
196
+ end
197
+ SIP::Locator[:Cs] = SIP::ControllerSelector.new(cdir)
198
+ t = Thread.new do
199
+ SIP::Locator[:Tm].transports.each do |tr|
200
+ tr.start_transport
201
+ #logi("Started the transport #{tr}")
202
+ end
203
+
204
+ @smr.start
205
+ sleep(rand(1)) until @smr.running
206
+
207
+ SIP::Locator[:Cs].get_controllers.each_with_index do |c, i|
208
+ if c.class.start_on_load?
209
+ Thread.new do
210
+ Thread.current[:name] = "StarterThread-"+i.to_s
211
+ logd("Starting controller #{c.name}")
212
+ c.start
213
+ end
214
+ end
215
+ end
216
+ logi("Sipper now started. Server version #{SIP::VERSION::STRING}")
217
+
218
+ @smr.tg.list.each {|th| th.join} #law of demeter VVV
219
+
220
+ end
221
+
222
+ # now start the http client request dispatcher
223
+ SIP::Locator[:HttpRequestDispatcher].start
224
+ @running = true
225
+
226
+ if SipperConfigurator[:GobletRelease]
227
+ $:.unshift File.join(File.dirname(__FILE__),"..", "goblet")
228
+ require 'management/sipper_config_manager'
229
+ @scm_server = Goblet::Management::SipperConfigManager.new.start
230
+ # run the rails web server
231
+ require SipperConfigurator[:SipperBasePath] + '/goblet/web/goblet_console/config/boot'
232
+ #Thread.new do
233
+ require 'commands/server'
234
+ #end
235
+ end
236
+
237
+ if x = SipperConfigurator[:SipperRunFor]
238
+ Thread.new do
239
+ sleep x
240
+ exit
241
+ end
242
+ end
243
+
244
+ return t
245
+ end
246
+
247
+ # Load a controller at runtime whose definition is given in the string.
248
+ # eg.
249
+ # str = <<-EOF
250
+ # require 'base_controller'
251
+ # module MyControllers
252
+ # class SimpleController < SIP::BaseController
253
+ # def start
254
+ # r = Request.create_initial("message", "sip:nasir@codepresso.com")
255
+ # u = create_udp_session("127.0.0.1", 5066)
256
+ # u.send(r)
257
+ # end
258
+ # end
259
+ # end
260
+ # EOF
261
+ # load_controller( str )
262
+ # You would typically do this from within a test case or simple cases
263
+ # where you do not need to define a controller in a specified controller
264
+ # location.
265
+ def load_controller(str)
266
+ _check_running
267
+ SIP::Locator[:Cs].load_controller_from_string( str )
268
+ end
269
+
270
+ def start_controller(name)
271
+ cs = SIP::Locator[:Cs].get_controller(name)
272
+ if cs
273
+ cs.start
274
+ else
275
+ raise ArgumentError, "Unknown controller #{name} cannot start"
276
+ end
277
+ end
278
+
279
+ def start_named_controller(name)
280
+ start_controller(name)
281
+ end
282
+
283
+ def start_controller_unless_sol(name)
284
+ cs = SIP::Locator[:Cs].get_controller(name)
285
+ if cs
286
+ cs.start unless cs.class.start_on_load?
287
+ else
288
+ raise ArgumentError, "Unknown controller #{name} cannot start"
289
+ end
290
+ end
291
+
292
+
293
+ def _check_running
294
+ raise RuntimeError, "Sipper not running" unless @running
295
+ end
296
+
297
+ def reload_libs
298
+ Dir[File.join(File.dirname(__FILE__), 'lib/**/*.rb')].each {|l| load l}
299
+ end
300
+
301
+ # todo have a nice stopping, graceful using shutdown hook
302
+ def stop
303
+ SIP::Locator[:Tm].transports.each do |t|
304
+ t.stop_transport
305
+ logi("Stopped the transport #{t}")
306
+ end
307
+ @smr.stop
308
+ logi("Stopped the SIP Message Router")
309
+ @tm.stop
310
+ # stop the DRb server on this node
311
+ DRb.stop_service
312
+ @running = false
313
+ SipperConfigurator[:ControllerLibPath] = nil
314
+ @q.clear
315
+ @q = nil
316
+ ::Transport::BaseTransport.clear_all_filters
317
+
318
+ if SipperConfigurator[:GobletRelease]
319
+ @scm_server.shutdown if @scm_server
320
+ end
321
+ if SipperConfigurator[:PrintHeapOnExit]
322
+ a = Hash.new(0)
323
+ ObjectSpace.each_object(Object) {|x| a[x.class.name] += 1}
324
+ a.each {|k,v| puts "#{k} #{v}" }
325
+ end
326
+ end
327
+
328
+ private :_check_running
329
+ end
330
+ end
@@ -0,0 +1,21 @@
1
+ require 'session_recorder'
2
+ require 'sipper_configurator'
3
+ require 'util/sipper_util'
4
+ require 'test/unit'
5
+
6
+ module SipperAssertions
7
+
8
+ def assert_header_value_in_recording_equals(recording_row, header_name, expected, msg=nil)
9
+ a = recording_row.split(SipperConfigurator[:SipperPlatformRecordingSeparator])
10
+ regx = Regexp.new(SipperUtil.headerize(header_name))
11
+ h = a.find {|v| v =~ regx}
12
+ v = SipperUtil.header_value(h)
13
+ assert_equal(expected, v, msg)
14
+ end
15
+
16
+ def assert_uri_in_recording_equals(recording_row, expected, msg=nil)
17
+ a = recording_row.split(SipperConfigurator[:SipperPlatformRecordingSeparator])
18
+ assert_equal(expected, a[0], msg)
19
+ end
20
+
21
+ end
@@ -0,0 +1,376 @@
1
+ require 'yaml'
2
+
3
+ class SipperConfigurator
4
+ @@comment_str = <<-EOF
5
+ # Paths that can be set are
6
+ #
7
+ # :LogPath:
8
+ # Here is where Sipper creates the log files, default is
9
+ # log directory under the project directory
10
+ #
11
+ # :ConfigPath:
12
+ # This is where the Sipper reads the configuration files from,
13
+ # the default is config directory
14
+ #
15
+ # :ControllerPath:
16
+ # The place where sipper loads the controllers, the default is
17
+ # the controllers directory under project.
18
+ #
19
+ # :SessionRecordPath:
20
+ # Place where transient session recording takes place. Default is
21
+ # same as the log directory.
22
+ #
23
+ # :ControllerLibPath:
24
+ # This is where you may keep any libraries specific to controller
25
+ # (defaults to controller/lib but can be anything if set)
26
+ #
27
+ # :PStorePath:
28
+ # This is where PsSipperMap class will store the data, the default
29
+ # is same as the log location.
30
+ #
31
+ # Configuration values are -
32
+ #
33
+ # :LocalSipperIP:
34
+ # IP (or name) where the default local Sipper
35
+ # instance is going to run. This will
36
+ # also be used by the local run of tests. Of
37
+ # course you can start the Sipper instance on any
38
+ # other IP by providing that IP in the Sipper
39
+ # initialization.
40
+ #
41
+ # :LocalSipperPort:
42
+ # Port where default Sipper instance will listen
43
+ # for incoming messages.
44
+ #
45
+ # :LocalTestPort:
46
+ # Port where the Sipper that is running the SipTestCase,
47
+ # DrivenSipTestCase and all the tests that are derived
48
+ # from them is run. By default when running under a
49
+ # project this is same as :LocalSipperPort
50
+ #
51
+ # :DefaultRIP:
52
+ # Default remote IP configured for the installation.
53
+ # You can of course create a bound session to any
54
+ # IP address you choose at runtime.
55
+ #
56
+ # :DefaultRP:
57
+ # Default remote port configured for this installation.
58
+ # You can of course create a bound session to any
59
+ # port you choose at runtime.
60
+ #
61
+ # :SessionRecord:
62
+ # default false values can be 'msg-info' and
63
+ # 'msg-debug'
64
+ #
65
+ # :ProtocolCompliance:
66
+ # 'strict' or 'lax'
67
+ #
68
+ # :NumThreads:
69
+ # number of worker threads
70
+ #
71
+ # :SipperRunFor:
72
+ # number of seconds after which Sipper will automatically exit
73
+ # this is useful when you fork a Sipper process for some testing
74
+ # but then do not have a reference to stop it.
75
+ #
76
+ # :PrintHeapOnExit:
77
+ # if defined then sipper on exit prints heap.
78
+ #
79
+ # :WaitSecondsForTestCompletion:
80
+ # seconds that the test should wait
81
+ # for signaling to end
82
+ #
83
+ # :TestManagerName:
84
+ # name/ip of the test server where the test
85
+ # case is running, this is used when
86
+ # the UAC or UAS is running on a separate
87
+ # server and it is required to
88
+ # co-ordinate the test completion using the
89
+ # completion signaling.
90
+ #
91
+ # :TestManagerPort:
92
+ # Drb port where the test server is
93
+ # listening for requests.
94
+ # Both Manager configuration are not required
95
+ # for locally running tests and UAS/UACs.
96
+ # The test server IP and Port is where the DRb
97
+ # server will be running for remote test
98
+ # signaling.
99
+ #
100
+ # :EnableRecordingLock:
101
+ # is a boolean which if set makes use of file locking
102
+ # mechanism to synchronize between recording writing
103
+ # and reading. If your tests and
104
+ # controllers are local then with this you can make
105
+ # sure that recordings are written first before being
106
+ # read. This is anyway an option if you
107
+ # are not using DrivenSipTestCase and
108
+ # SipTestDriverController, which do this synchronization
109
+ # using distributed locking and conditional variables.
110
+ #
111
+ # :TimerGranularity:
112
+ # the ms value of platform timer granularity, default
113
+ # is 50ms. This is the maximum error +/- that shall be
114
+ # there in any timer. This error could surface
115
+ # when there are very few sparse timers in the system.
116
+ # For a reasonably loaded system the timer granularity
117
+ # does not add any significant error.
118
+ #
119
+ # :TransactionTimers:
120
+ # a hash of timer values, can have all the base timer
121
+ # constants :t1, :t2, :t4 and even
122
+ # specific timers like :ta (timerA), tb, tc, td etc
123
+ # in which case they override their
124
+ # dependence on t1 etc. eg. {:t1=>400, :ta=>200, :tb=>32000}
125
+ # the default values of these
126
+ # timers of not specified here is taken from transaction.rb
127
+ #
128
+ # :SessionTxnUsage:
129
+ # a hash of boolean values for each type of transactions.
130
+ # The values of the hash can be
131
+ # :use_transactions => boolean, :use_ict => boolean etc.
132
+ # Specific type of transactions override the generic
133
+ # transaction setting. So if the setting is
134
+ # {:use_transactions => true} then the Session will use
135
+ # transactions of all types. if the setting is
136
+ # {:use_transactions => false, :use_ict=> true} then the
137
+ # Session will use only Invite Client Transactions.
138
+ # There is default setting only for :use_transactions and it
139
+ # is "true". So in the absence of any configuration the
140
+ # Session will use types of transactions.
141
+ # Note these individual configuration values can be
142
+ # changed on a Session by Session or even
143
+ # request by request basis by setting them on the Session
144
+ # by the method of same name as
145
+ # the setting. [ e.g my_session.use_ict(true) ]
146
+ #
147
+ # :SessionTimer:
148
+ # the default session invalidation timer. This timer
149
+ # is used when the invalidate is
150
+ # called without the force parameter, the session is
151
+ # actually invalidated after this
152
+ # time. This configuration is the default value of the
153
+ # timer. This can be overridden
154
+ # at the controller level or even session level.
155
+ #
156
+ # :SessionLimit:
157
+ # in the session_being_invalidated_ok_to_proceed?()
158
+ # callback the controller can
159
+ # return false which will give the session a new lease
160
+ # of life for the time that is equal to the current
161
+ # value of session timer. This extension has an upper
162
+ # limit roughly equal to :SessionLimit. "Roughly"
163
+ # because if the session has lived
164
+ # for time x, the session timer is x' and the
165
+ # :SessionLimit is set for y where
166
+ # y > x but x + x' > y then the session will not
167
+ # re-schedule but invalidate.
168
+ # In other words if the increment is such that it
169
+ # will increase the lifetime beyond
170
+ # :SessionLimit then it is not re-scheduled.
171
+ #
172
+ # :T2xxUsage:
173
+ # a boolean which indicates if the UAS session shall
174
+ # retransmit the 2xx or not.
175
+ # The default value is true.
176
+ #
177
+ # :T2xxTimers:
178
+ # a hash of three values that can be used to configure
179
+ # the behavior of the 2xx retransmission from the UAS.
180
+ # The 3 values are :Start, :Cap, :Limit
181
+ # 1> :Start is the starting value of the 2xx
182
+ # retransmission timer [13.3.1.4] for UAS
183
+ # If not configured this defaults to T1 constant defined
184
+ # in Transaction class.
185
+ # This doubles until it reaches :Cap.
186
+ # 2> :Cap is the valsue at which the doubling of
187
+ # :T2xxRetransStart timer value stops. This
188
+ # defaults to T2 defined in the Transaction class.
189
+ # 3> :Limit is is when the UAS shall abandon the 2xx
190
+ # retransmissions if the ACK does not come.
191
+ # This defaults to 64*T1.
192
+ # e.g :T2xxRetrans = {:Start=>100, :Cap=>400, :Limit=>16000}
193
+ #
194
+ # :T1xxTimers:
195
+ # a hash of two values that can be used to configure
196
+ # the behavior of the reliable 1xx retransmissions from the UAS.
197
+ # The 2 values are :Start and :Limit
198
+ # 1> :Start is the starting value of the 1xx
199
+ # retransmission timer for UAS
200
+ # If not configured this defaults to T1 constant defined
201
+ # in Transaction class.
202
+ # This doubles for each retransmission.
203
+ # 2> :Limit is is when the UAS shall abandon the 1xx
204
+ # retransmissions if the PRACK does not come.
205
+ # This defaults to 64*T1.
206
+ # e.g :T1xxRetrans = {:Start=>100, :Limit=>16000}
207
+ #
208
+ # :TargetRefreshMethods:
209
+ # list(array) of methods that can update the remote target.
210
+ #
211
+ # :DialogCreatingMethods:
212
+ # list(array) of dialog creating methods in SIP
213
+ #
214
+ #
215
+ # :ShowSessionIdInMessages:
216
+ # if set adds the session Id of the session from where a
217
+ # message is sent out, in the message as a special header
218
+ # P-Sipper-Session.
219
+ #
220
+ # :PreExistingRouteSet:
221
+ # list(array) of Route headers to be used as
222
+ # default preloaded route
223
+ #
224
+ # :DigestSalt:
225
+ # A configurable secret key for generating
226
+ # nonce / cnonce values
227
+ #
228
+ # :SipperMedia:
229
+ # If set to true the Sipper media library is available
230
+ # for use.
231
+ #
232
+ # :SipperMediaDefaultControlPort:
233
+ # The default port where SipperMedia main process
234
+ # shall listen for control requests
235
+ #
236
+ # :SipperMediaProcessReuse
237
+ # This flag controls whether to shutdown and launch the SipperMedia if
238
+ # SipperMedia process is running. Default value is false
239
+ #
240
+ # :SipperPersistentStore:
241
+ # Can take value as "file" or "db", in case the value is file
242
+ # the built in file based persistent store is used while if
243
+ # the value is db then the configured database is used for
244
+ # for persistence needs. The persistent store is used by all
245
+ # users of SipperMap API. The default is "file"
246
+ #
247
+ # :SipperPlatformRecordingSeparator:
248
+ # Platform independent recording separator. Can be CR+LF for windows
249
+ # while only LF for Linux. It is set automatically in sipper.rb.
250
+ #
251
+ # :GobletRelease:
252
+ # Set to true only if this release is a Goblet release, which is the enhanced
253
+ # platform with a number of supporting libraries.
254
+ #
255
+ # :GobletConfigPort:
256
+ # The port at which Goblet config manager is listening for Goblet config commands
257
+ # the default value of this port is 4681. Used only if the release is a Goblet
258
+ # release.
259
+ #
260
+ # :HttpClientThreads
261
+ # Number of HTTP Client threads that will be used for asynchronous
262
+ # http request sending and response processing.
263
+ #
264
+ EOF
265
+
266
+ def SipperConfigurator.all_keys()
267
+ keys = []
268
+ cmt_str = @@comment_str
269
+ while (x=(cmt_str =~/# :[A-Za-z0-9].*:/)) do
270
+ key = cmt_str.match(/# :[A-Za-z0-9].*:/)[0]
271
+ keys << key[2..-1]
272
+ cmt_str = cmt_str[x+key.length .. -1]
273
+ end
274
+ keys
275
+ end
276
+
277
+ # ignore the first comment as that does not match the key
278
+ def SipperConfigurator.all_comments()
279
+ @@comment_str.split(/# :[A-Za-z0-9].*:/)
280
+ end
281
+
282
+
283
+
284
+ @@cfg_hash = {}
285
+
286
+ def SipperConfigurator.[](key)
287
+ @@cfg_hash[key]
288
+ end
289
+
290
+ def SipperConfigurator.[]=(key, val)
291
+ @@cfg_hash[key] = val
292
+ end
293
+
294
+ def SipperConfigurator.add_key_description(key, desc)
295
+ unless @@cfg_hash[key.to_sym].nil?
296
+ return false
297
+ end
298
+ @@comment_str << " # :" << key << ":\n # " << desc << "\n #\n"
299
+ end
300
+
301
+
302
+ def SipperConfigurator.write_yaml_file(file)
303
+ io = File.new(file, "w+")
304
+ io.write(@@comment_str)
305
+ io.write " # -------------------------------------------------------"
306
+ io.write(YAML::dump(@@cfg_hash))
307
+ io.flush
308
+ ensure
309
+ io.close if io
310
+ end
311
+
312
+
313
+ def SipperConfigurator.load_yaml_file(file)
314
+ begin
315
+ lsip = lspo = rsip = rspo = nil
316
+ io = File.new(file, "r")
317
+ @@comment_str = ""
318
+ io.each do |line|
319
+ if line =~ /# ----/
320
+ break
321
+ else
322
+ @@comment_str << line
323
+ end
324
+ end
325
+ obj = YAML::load(io)
326
+ if obj.class == Hash
327
+ if SipperConfigurator[:CommandlineBitmask]
328
+ lsip = SipperConfigurator[:LocalSipperIP] if ((SipperConfigurator[:CommandlineBitmask] | 8) == SipperConfigurator[:CommandlineBitmask])
329
+ lspo = SipperConfigurator[:LocalSipperPort] if ((SipperConfigurator[:CommandlineBitmask] | 4) == SipperConfigurator[:CommandlineBitmask])
330
+ rsip = SipperConfigurator[:DefaultRIP] if ((SipperConfigurator[:CommandlineBitmask] | 2) == SipperConfigurator[:CommandlineBitmask])
331
+ rspo = SipperConfigurator[:DefaultRP] if ((SipperConfigurator[:CommandlineBitmask] | 1) == SipperConfigurator[:CommandlineBitmask])
332
+ end
333
+ @@cfg_hash = @@cfg_hash.merge(obj)
334
+ SipperConfigurator[:LocalSipperIP] = lsip if lsip
335
+ SipperConfigurator[:LocalSipperPort] = lspo if lspo
336
+ SipperConfigurator[:DefaultRIP] = rsip if rsip
337
+ SipperConfigurator[:DefaultRP] = rspo if rspo
338
+ else
339
+ msg = "Object read from file #{file} is not a configuration"
340
+ raise TypeError, msg
341
+ end
342
+ rescue IOError
343
+ msg = "#{file} is not a proper file"
344
+ raise TypeError, msg
345
+ ensure
346
+ io.close if io
347
+ end
348
+ end
349
+
350
+ end
351
+
352
+ # Defaults
353
+ SipperConfigurator[:ProtocolCompliance] = 'strict'
354
+ SipperConfigurator[:SipperBasePath] = ENV['SIPPER_HOME']
355
+ SipperConfigurator[:WaitSecondsForTestCompletion] = 10
356
+ SipperConfigurator[:TestManagerName] = nil
357
+ SipperConfigurator[:TestManagerPort] = nil
358
+ SipperConfigurator[:EnableRecordingLock] = false
359
+ SipperConfigurator[:PrintHeapOnExit] = false
360
+ SipperConfigurator[:TransactionTimers] = {}
361
+ SipperConfigurator[:SessionTxnUsage] = {:use_transactions=>false} #todo make it true later
362
+ SipperConfigurator[:SessionTimer] = 60000 # 50 msec for tests set in driven_sip_test_case, one minute for production
363
+ SipperConfigurator[:SessionLimit] = 60000 # one hour default
364
+ SipperConfigurator[:T2xxUsage] = false # todo make it true
365
+ SipperConfigurator[:TimerGranularity] = 70 # in milliseconds, default is 50 if not defined
366
+ SipperConfigurator[:TargetRefreshMethods] = ['INVITE', 'SUBSCRIBE', 'UPDATE', 'NOTIFY', 'REFER']
367
+ SipperConfigurator[:DialogCreatingMethods] = ['INVITE', 'SUBSCRIBE', 'NOTIFY', 'REFER']
368
+ SipperConfigurator[:PrintHeapOnExit] = false
369
+ SipperConfigurator[:SipperMedia] = false
370
+ SipperConfigurator[:SipperMediaDefaultControlPort] = 4680
371
+ SipperConfigurator[:SipperMediaProcessReuse] = false
372
+ SipperConfigurator[:GobletRelease] = false
373
+ SipperConfigurator[:GobletConfigPort] = 4681 if SipperConfigurator[:GobletRelease]
374
+ SipperConfigurator[:CommandlineBitmask] = 0
375
+ SipperConfigurator[:HttpClientThreads] = 5
376
+ SipperConfigurator[:ShowSessionIdInMessages] = true