Sipper 1.1.3

Sign up to get free protection for your applications and to get access to all the features.
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