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,12 @@
1
+ Usage for gen_controller is -
2
+ gen_controller.rb <name_of_controller_class> "String of call flow"
3
+ e.g gen_controller.rb MyController "> INVITE, < 200, > ACK"
4
+ The generated controller can be run using the run/run_sipper1 script passing it this
5
+ generated controller as in run_sipper1.rb -c <proper_path_to my_controller.rb>
6
+
7
+ Usage for gen_test is -
8
+ gen_test.rb <name_of_test_class> "String of call flow"
9
+ e.g gen_test.rb MyTest "> INVITE, < 200, > ACK"
10
+ The generated test class can be run standalone as ruby -I <path to sipper_test> my_test.rb
11
+ If it is a UAS then it will wait for 180 seconds for getting a request before failing the test.
12
+ This is part of generated code, which can be modified.
@@ -0,0 +1,228 @@
1
+ #todo have a rake task
2
+ #todo look for ruby code formatter
3
+
4
+ $:.unshift File.join(File.dirname(__FILE__),"..")
5
+
6
+ require 'fileutils'
7
+ require 'util/sipper_util'
8
+ require 'util/expectation_parser'
9
+ require 'util/command_element'
10
+
11
+ module SIP
12
+ module Generators
13
+ class GenController
14
+
15
+ def initialize(cname, flow_str, ctype="SIP::BaseController")
16
+ if cname =~ /^[A-Z]/
17
+ _cname = cname
18
+ else
19
+ _cname = SipperUtil.classify(cname)
20
+ end
21
+
22
+ if _cname =~ /Controller$/
23
+ @gen_class_name = _cname
24
+ else
25
+ @gen_class_name = _cname + "Controller"
26
+ end
27
+ @gen_file_name = SipperUtil.filify(@gen_class_name)
28
+ @flow_str = flow_str
29
+ @ctype = ctype
30
+
31
+ @d_in = SipperUtil::ExpectationElement::Directions[0] # < inward
32
+ @d_out = SipperUtil::ExpectationElement::Directions[1] # > outward
33
+ @d_n = SipperUtil::ExpectationElement::Directions[2] # ! neutral
34
+ @d_c = SipperUtil::ExpectationElement::Directions[3] # @ command
35
+
36
+ #mod_flow_str = flow_str.gsub(/\{(.*?)\}/, '') # remove {...} for controller
37
+ mod_flow_str = SipperUtil.make_expectation_parsable(flow_str)
38
+ @flow = mod_flow_str.split("%").map {|str| str.strip}.map do |e|
39
+ if e.index(@d_c) == 0
40
+ SipperUtil::CommandElement.new(e)
41
+ else
42
+ SipperUtil::ExpectationElement.new(e)
43
+ end
44
+ end
45
+
46
+
47
+ @current_method = ["start"] # you always start at start()
48
+ @method_code = {"start" => ""}
49
+ @method_code_lines = {"start" => 0}
50
+ @processing_under_state_check = false
51
+ end
52
+
53
+ def generate_controller(write_to_file=false, dir = nil)
54
+ @str = "# FLOW : #{@flow_str}\n#\n"
55
+ @str << "require \'base_controller\'\n\n"
56
+ @str << sprintf("class %s < %s \n\n", @gen_class_name, @ctype)
57
+ @str << " # change the directive below to true to enable transaction usage.\n"
58
+ @str << " # If you do that then make sure that your controller is also \n"
59
+ @str << " # transaction aware. i.e does not try send ACK to non-2xx responses,\n"
60
+ @str << " # does not send 100 Trying response etc.\n\n"
61
+ @str << " transaction_usage :use_transactions=>false\n\n"
62
+ if @ctype == "SIP::BaseController"
63
+ @str << " # change the directive below to true to start after loading.\n"
64
+ @str << " start_on_load false\n\n"
65
+ end
66
+
67
+ @str << " def initialize\n"
68
+ @str << " logd('Controller created')\n end\n\n"
69
+ @method_code["start"] << " def start\n"
70
+ @method_code["start"] << " session = create_udp_session(SipperConfigurator[:DefaultRIP], SipperConfigurator[:DefaultRP])\n"
71
+ @flow.each do |e|
72
+ if e.direction == @d_in # have a new method defined for each incoming and repeat outgoing
73
+ @current_method = []
74
+ e.messages.each do |m|
75
+ k = m.sub(/^\d../, m[0,1]+"xx")
76
+ _get_message(k);
77
+ @current_method << k
78
+ end
79
+ elsif e.direction == @d_out
80
+ @current_method.each do |c_method|
81
+ # if there is a "|" condition for sending then generate a warning.
82
+ puts "Warning: Sending optional messages is not permitted, taking #{e.messages[0]} only." if e.messages.length>1
83
+ _send_message(e.messages[0], c_method)
84
+ end
85
+ elsif e.direction == @d_n # neutral
86
+ @current_method.each do |c_method|
87
+ puts "Warning: Logging optional messages is not permitted, taking #{e.messages[0]} only." if e.messages.length>1
88
+ _log_message(e.messages[0], c_method)
89
+ end
90
+ elsif e.direction == @d_c # command
91
+ @current_method.each do |c_method|
92
+ _command(e.command_str, c_method)
93
+ end
94
+ if e.command == "set_timer"
95
+ unless @method_code["timer"]
96
+ @method_code["timer"] = " def on_timer(session, task)\n"
97
+ else
98
+ @method_code["timer"] << " end\n" # closing end for if tid
99
+ end
100
+ @method_code["timer"] << " if task.tid == \"#{e.command_id}\"\n"
101
+ @current_method = ["timer"]
102
+ end
103
+ end
104
+ end
105
+
106
+ @current_method.each do |m|
107
+ @method_code[m] << " session.invalidate(true)\n"
108
+ if @ctype == "SIP::SipTestDriverController"
109
+ test_name = @gen_class_name.sub(/Controller/,"") # by convention the "Controller" is appended to named test
110
+ @method_code[m] << " session.flow_completed_for('#{test_name}')\n"
111
+ end
112
+ end
113
+ _close_all_methods
114
+
115
+ @str << "end\n" # close class
116
+ if write_to_file
117
+ if dir
118
+ f = File.join(dir, @gen_file_name)
119
+ else
120
+ f = @gen_file_name
121
+ end
122
+ cfile = File.new(f, "w")
123
+ cfile << @str
124
+ cfile.close
125
+ end
126
+ @str
127
+ end
128
+
129
+ def _get_message(msg)
130
+ unless @method_code[msg]
131
+ @method_code_lines[msg] = 0
132
+ @processing_under_state_check = false
133
+ case msg
134
+ when /^[A-Z]/
135
+ @method_code[msg] = " def on_#{msg.downcase}(session)\n"
136
+ when /^100/
137
+ @method_code[msg] = " def on_trying_res(session)\n"
138
+ when /^1/
139
+ @method_code[msg] = " def on_provisional_res(session)\n"
140
+ when /^2/
141
+ @method_code[msg] = " def on_success_res(session)\n"
142
+ when /^3/
143
+ @method_code[msg] = " def on_redirect_res(session)\n"
144
+ else
145
+ @method_code[msg] = " def on_failure_res(session)\n"
146
+ end
147
+ else
148
+ # method already exists, now just add the if/else check for
149
+ # state.
150
+ _add_state_check_for(msg)
151
+ @processing_under_state_check = true
152
+ end
153
+ end
154
+
155
+
156
+ def _send_message(msg, method)
157
+ sp = self._spacing
158
+ if msg =~ /^[A-Z]/
159
+ @method_code[method] << "#{sp}session.request_with('#{msg}'"
160
+ if method == "start"
161
+ @method_code[method] << ", 'sip:nasir@sipper.com')"
162
+ else
163
+ @method_code[method] << ")"
164
+ end
165
+ @method_code[method] << "\n"
166
+ else
167
+ @method_code[method] << "#{sp}session.respond_with(#{msg})\n"
168
+ end
169
+ end
170
+
171
+ def _log_message(msg, method)
172
+ sp = self._spacing
173
+ @method_code[method] << "#{sp}session.do_record('#{msg}')\n"
174
+ end
175
+
176
+ def _command(cmd, method)
177
+ sp = self._spacing
178
+ @method_code[method] << "#{sp}#{cmd}\n"
179
+ end
180
+
181
+ def _spacing
182
+ sp = " "
183
+ if @processing_under_state_check
184
+ sp = " "*6
185
+ else
186
+ sp = " "*4
187
+ end
188
+ return sp
189
+ end
190
+
191
+ def _add_state_check_for(msg)
192
+ count = 0
193
+ cond_str = "session['#{msg.downcase}']"
194
+ code_arr = @method_code[msg].split("\n")
195
+ if @method_code[msg].index(cond_str)
196
+ count = @method_code[msg].scan(cond_str+ " = ").length # count session['info'] = n
197
+ code_arr.insert(-1, " #{cond_str} = #{count + 1}\n")
198
+ code_arr.insert(-1, " elsif #{cond_str} == #{count+1}\n")
199
+ else
200
+ code_arr.insert(1, " if !#{cond_str}")
201
+ code_arr[2] = " " + code_arr[2] if code_arr[2] # re-format current message line
202
+ code_arr.insert(-1, " #{cond_str} = 1")
203
+ code_arr.insert(-1, " elsif #{cond_str} == 1\n")
204
+ end
205
+ @method_code[msg] = code_arr.join("\n")
206
+ end
207
+
208
+
209
+
210
+ def _close_method(msg)
211
+ @method_code[msg] << "\n end\n" if @method_code[msg].index("if session['")
212
+ @method_code[msg] << " end\n" if msg == "timer"
213
+ @method_code[msg] << " end\n\n"
214
+ @str << @method_code[msg]
215
+ end
216
+
217
+ def _close_all_methods
218
+ @method_code.each_key {|k| _close_method(k)}
219
+ end
220
+
221
+ end
222
+ end
223
+ end
224
+
225
+ if $PROGRAM_NAME == __FILE__
226
+ g = SIP::Generators::GenController.new(ARGV[0], ARGV[1])
227
+ g.generate_controller(true)
228
+ end
@@ -0,0 +1,45 @@
1
+
2
+ $:.unshift File.join(File.dirname(__FILE__),"..")
3
+
4
+ require 'fileutils'
5
+ require 'util/sipper_util'
6
+ require 'sipper_configurator'
7
+
8
+
9
+ module SIP
10
+ module Generators
11
+ class GenProject
12
+ def initialize(projname, override=false)
13
+ if override
14
+ FileUtils.mkdir_p projname
15
+ else
16
+ FileUtils.mkdir projname
17
+ end
18
+ dir = File.join(File.dirname(__FILE__), 'project_template_dir')
19
+ Dir.glob(dir+"/**/*").each do |f|
20
+ n = f.split("project_template_dir/")[1]
21
+ entity = File.join(projname, n)
22
+ if File.directory?(f)
23
+ puts "Creating ...... directory #{entity}"
24
+ FileUtils.mkdir_p(entity)
25
+ else
26
+ puts "Creating ...... file #{entity}"
27
+ FileUtils.cp(f, entity)
28
+ end
29
+ end
30
+ FileUtils.mv(File.join(projname,"dot_sipper.proj"), File.join(projname, ".sipper.proj"))
31
+ # now create the config for the project
32
+ # log4r file
33
+ FileUtils.cp File.join(File.dirname(__FILE__), "..", "config", "log4r.xml"), File.join(projname, "config")
34
+
35
+ # Now set the project specific configuration
36
+ proj_dir = File.join(Dir.pwd, projname)
37
+ SipperConfigurator[:LogPath] = File.join(proj_dir, "logs")
38
+ SipperConfigurator[:ConfigPath] = cfd = File.join(proj_dir, "config")
39
+ SipperConfigurator[:ControllerPath] = File.join(proj_dir, "controllers")
40
+ SipperConfigurator.write_yaml_file(File.join(SipperConfigurator[:ConfigPath], "sipper.cfg"))
41
+ end
42
+ end
43
+ end
44
+ end
45
+
@@ -0,0 +1,72 @@
1
+ require 'generators/gen_controller'
2
+ require 'facets/core/string/first_char'
3
+ require 'util/sipper_util'
4
+
5
+ module SIP
6
+ module Generators
7
+ class GenTest
8
+ def initialize(tname, flow_str)
9
+ @gen_class_name = SipperUtil.classify(tname)
10
+ @gen_file_name = SipperUtil.filify(@gen_class_name)
11
+ @flow_str = flow_str
12
+ mod_flow_str = SipperUtil.make_expectation_parsable(flow_str)
13
+ @flow = mod_flow_str.split("%").map {|str| str.strip}
14
+ @direction = "neutral"
15
+ case @flow[0].first_char(1)
16
+ when SipperUtil::ExpectationElement::Directions[0]
17
+ @direction = "in"
18
+ when SipperUtil::ExpectationElement::Directions[1]
19
+ @direction = "out"
20
+ else
21
+ @direction = "neutral"
22
+ end
23
+ @flow_msg_only = @flow.reject {|x| x.first_char(1) == "@"}
24
+ end
25
+
26
+ def generate_test(write_to_file=false, dir = nil)
27
+ @str = "$:.unshift File.join(ENV['SIPPER_HOME'],'sipper_test')\n"
28
+ @str << "require \'driven_sip_test_case\'\n\n"
29
+ @str << sprintf("class %s < DrivenSipTestCase \n\n", @gen_class_name)
30
+ @str << " def self.description\n"
31
+ @str << " \"Callflow is #{@flow_str}\" \n"
32
+ @str << " end\n\n"
33
+ @str << " def setup\n"
34
+ @str << " super\n"
35
+ @str << " SipperConfigurator[:SessionRecord]='msg-info'\n"
36
+ @str << " SipperConfigurator[:WaitSecondsForTestCompletion] = 180\n"
37
+ controller_code = Generators::GenController.new(@gen_class_name+"Controller", @flow_str, "SIP::SipTestDriverController").generate_controller(false)
38
+ @str << " str = <<-EOF\n"
39
+ @str << controller_code
40
+ @str << " EOF\n"
41
+ @str << " define_controller_from(str)\n"
42
+ @str << " set_controller('#{@gen_class_name}"+"Controller"+"')\n"
43
+ @str << " end\n\n"
44
+ @str << " def test_case_1\n"
45
+ @str << " self.expected_flow = "
46
+ @str << SipperUtil.print_arr(@flow_msg_only) + "\n"
47
+ @str << " start_controller\n"
48
+ @str << " verify_call_flow(:" + @direction +")\n"
49
+ @str << " end\n"
50
+ @str << "end\n" # close class
51
+
52
+ if write_to_file
53
+ if dir
54
+ f = File.join(dir, @gen_file_name)
55
+ else
56
+ f = @gen_file_name
57
+ end
58
+ cfile = File.new(f, "w")
59
+ cfile << @str
60
+ cfile.close
61
+ end
62
+ @str
63
+ end
64
+
65
+ end
66
+ end
67
+ end
68
+
69
+ if $PROGRAM_NAME == __FILE__
70
+ g = SIP::Generators::GenTest.new(ARGV[0], ARGV[1])
71
+ g.generate_test
72
+ end
@@ -0,0 +1,56 @@
1
+
2
+ require 'rake/clean'
3
+ require 'rake/testtask'
4
+ require 'yaml'
5
+
6
+ CLEAN.include("logs/*.log")
7
+ CLEAN.include("logs/*._in")
8
+ CLEAN.include("logs/*._out")
9
+ CLEAN.include("logs/precall*")
10
+ CLEAN.include("logs/.Test*")
11
+
12
+ task :default => [:my_test]
13
+
14
+ desc "Run all unit tests"
15
+ Rake::TestTask.new(:test) do |t|
16
+ t.libs << "tests"
17
+ t.test_files=
18
+ Dir.glob("tests/*.rb")
19
+ t.verbose = true
20
+ end
21
+
22
+ # order_tests.yaml file should be present
23
+ # in the tests directory for this ordering
24
+ # of tests to work. If not found then we
25
+ # default to built in test run task
26
+ desc "Run all unit tests in order"
27
+ task :my_test do
28
+ require 'test/unit/ui/console/testrunner'
29
+ require 'test/unit'
30
+ Test::Unit.run = true
31
+ path = File.join("tests", "order_tests.yaml")
32
+ if File.exists?(path)
33
+ a = File.open(path) {|yf| YAML::load(yf)}
34
+ else
35
+ begin
36
+ Rake::Task["test"].execute
37
+ exit
38
+ rescue ArgumentError
39
+ Rake::Task["test"].execute nil
40
+ exit
41
+ end
42
+ end
43
+ c = Dir.glob("tests/*.rb")
44
+ b = c.map {|f| f[6..-1]} # remove "tests/"
45
+ path = File.join("tests", "order_tests.yaml")
46
+ if File.exists?(path)
47
+ a = File.open(path) {|yf| YAML::load(yf)}
48
+ else
49
+ a = []
50
+ end
51
+ test_files = a + (b - a)
52
+ test_files.each do |tf|
53
+ load "tests/"+tf
54
+ Test::Unit::UI::Console::TestRunner.run(::Kernel.const_get(tf[0..-4].split("_").map! {|x| x.capitalize}.join))
55
+ end
56
+ end
@@ -0,0 +1,31 @@
1
+ ---
2
+ :LocalSipperIP: 127.0.0.1
3
+ :LocalSipperPort: 5060
4
+ :DefaultRIP: 127.0.0.1
5
+ :DefaultRP: 5060
6
+ :LocalTestPort: 5066
7
+ :SessionLimit: 60000
8
+ :PrintHeapOnExit: false
9
+ :ProtocolCompliance: strict
10
+ :T2xxUsage: false
11
+ :TransactionTimers: {}
12
+
13
+ :TimerGranularity: 70
14
+ :SessionTxnUsage:
15
+ :use_transactions: false
16
+ :WaitSecondsForTestCompletion: 10
17
+ :TargetRefreshMethods:
18
+ - INVITE
19
+ - SUBSCRIBE
20
+ - UPDATE
21
+ - NOTIFY
22
+ - REFER
23
+ :TestManagerName:
24
+ :DialogCreatingMethods:
25
+ - INVITE
26
+ - SUBSCRIBE
27
+ - NOTIFY
28
+ - REFER
29
+ :SessionTimer: 60000
30
+ :TestManagerPort:
31
+ :EnableRecordingLock: false