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,84 @@
1
+
2
+ require 'driven_sip_test_case'
3
+
4
+
5
+ class TestHttpClient1 < DrivenSipTestCase
6
+
7
+ def setup
8
+ super
9
+ str = <<-EOF
10
+
11
+ require 'sip_test_driver_controller'
12
+
13
+ module SipInline
14
+ class UasHttpController < SIP::SipTestDriverController
15
+
16
+ transaction_usage :use_transactions=>true
17
+
18
+ def on_invite(session)
19
+ session.send_http_get_to('http://www.example.com/index.html')
20
+ end
21
+
22
+
23
+ def on_http_res(session)
24
+
25
+ res = session.create_response(200)
26
+ res.set_body session.ihttp_response.body.split(/\r|\n\r|\n/), 'text/xml'
27
+ session.send res
28
+ logd("Received INVITE sent a 200 from "+name)
29
+ end
30
+
31
+ def on_ack(session)
32
+ session.request_with("bye")
33
+ end
34
+
35
+ def on_success_res(session)
36
+ session.invalidate(true)
37
+ session.flow_completed_for("TestHttpClient1")
38
+ end
39
+
40
+ def order
41
+ 0
42
+ end
43
+
44
+ end
45
+
46
+ class UacHttpController < SIP::SipTestDriverController
47
+
48
+ transaction_usage :use_transactions=>true
49
+
50
+ def start
51
+ r = Request.create_initial("invite", "sip:nasir@sipper.com", :p_session_record=>"msg-info")
52
+ u = create_udp_session(SipperConfigurator[:LocalSipperIP], SipperConfigurator[:LocalTestPort])
53
+ u.send(r)
54
+ logd("Sent a new INVITE from "+name)
55
+ end
56
+
57
+
58
+ def on_success_res(session)
59
+ session.request_with('ACK')
60
+ end
61
+
62
+ def on_bye(session)
63
+ session.respond_with(200)
64
+ session.invalidate(true)
65
+ end
66
+
67
+ end
68
+ end
69
+ EOF
70
+ define_controller_from(str)
71
+ set_controller("SipInline::UacHttpController")
72
+ end
73
+
74
+
75
+ def test_smoke_controllers
76
+ self.expected_flow = ["> INVITE", "< 100", "< 200", "> ACK", "< BYE", "> 200"]
77
+ start_controller
78
+ verify_call_flow(:out)
79
+ self.expected_flow = ["< INVITE", "> 100", "> 200", "< ACK", "> BYE", "< 200"]
80
+ verify_call_flow(:in)
81
+ end
82
+
83
+
84
+ end
@@ -0,0 +1,90 @@
1
+
2
+
3
+ require 'driven_sip_test_case'
4
+
5
+ # In order to run this test properly, run a goblet enabled system
6
+ # separately on localhost
7
+ # Then uncomment the send_post call and comment the direct respond_with
8
+ # method.
9
+ class TestHttpClient2 < DrivenSipTestCase
10
+
11
+ def setup
12
+ super
13
+ str = <<-EOF
14
+
15
+ require 'sip_test_driver_controller'
16
+
17
+ module SipInline
18
+ class UasHttpController2 < SIP::SipTestDriverController
19
+
20
+ transaction_usage :use_transactions=>true
21
+
22
+ def on_invite(session)
23
+ #session.send_http_post_to('http://localhost:3000/config/add_new_key',
24
+ # 'key'=>'UnitTest1', 'desc'=>'test description', 'dtype'=>'string', 'commit'=>'submit')
25
+ session.respond_with(200)
26
+ end
27
+
28
+
29
+ def on_http_res(session)
30
+
31
+ res = session.create_response(200)
32
+ res.set_body session.ihttp_response.body.split(/\r|\n\r|\n/), 'text/xml'
33
+ session.send res
34
+ logd("Received INVITE sent a 200 from "+name)
35
+ end
36
+
37
+ def on_ack(session)
38
+ session.request_with("bye")
39
+ end
40
+
41
+ def on_success_res(session)
42
+ session.invalidate(true)
43
+ session.flow_completed_for("TestHttpClient2")
44
+ end
45
+
46
+ def order
47
+ 0
48
+ end
49
+
50
+ end
51
+
52
+ class UacHttpController2 < SIP::SipTestDriverController
53
+
54
+ transaction_usage :use_transactions=>true
55
+
56
+ def start
57
+ r = Request.create_initial("invite", "sip:nasir@sipper.com", :p_session_record=>"msg-info")
58
+ u = create_udp_session(SipperConfigurator[:LocalSipperIP], SipperConfigurator[:LocalTestPort])
59
+ u.send(r)
60
+ logd("Sent a new INVITE from "+name)
61
+ end
62
+
63
+
64
+ def on_success_res(session)
65
+ session.request_with('ACK')
66
+ end
67
+
68
+ def on_bye(session)
69
+ session.respond_with(200)
70
+ session.invalidate(true)
71
+ end
72
+
73
+ end
74
+ end
75
+ EOF
76
+ define_controller_from(str)
77
+ set_controller("SipInline::UacHttpController2")
78
+ end
79
+
80
+
81
+ def test_smoke_controllers
82
+ self.expected_flow = ["> INVITE", "< 100", "< 200", "> ACK", "< BYE", "> 200"]
83
+ start_controller
84
+ verify_call_flow(:out)
85
+ self.expected_flow = ["< INVITE", "> 100", "> 200", "< ACK", "> BYE", "< 200"]
86
+ verify_call_flow(:in)
87
+ end
88
+
89
+
90
+ end
@@ -0,0 +1,62 @@
1
+ require 'driven_sip_test_case'
2
+
3
+ class TestIctWithTimeout < DrivenSipTestCase
4
+
5
+ def setup
6
+ super
7
+ str = <<-EOF
8
+ require 'sip_test_driver_controller'
9
+
10
+ module SipInline
11
+
12
+ class UasIctTimeoutController < SIP::SipTestDriverController
13
+
14
+ def on_invite(session)
15
+ logd("Received INVITE in #{name} not doing anything")
16
+ if session['count']
17
+ session['count'] = session['count']+1
18
+ session.invalidate if session['count']==7
19
+ else
20
+ session['count'] = 1
21
+ end
22
+ end
23
+
24
+ def order
25
+ 0
26
+ end
27
+ end
28
+
29
+ class UacIctTimeoutController < SIP::SipTestDriverController
30
+
31
+ transaction_usage :use_transactions=>false, :use_ict=>true
32
+ transaction_timers :t1=>100, :tb=>7000
33
+ def start
34
+ r = Request.create_initial("invite", "sip:nasir@sipper.com", :p_session_record=>"msg-info")
35
+ u = create_udp_session(SipperConfigurator[:LocalSipperIP], SipperConfigurator[:LocalTestPort])
36
+ u.send(r)
37
+ logd("Sent a new INVITE from #{name}")
38
+ end
39
+
40
+ def on_failure_res(session)
41
+ logd("Received response in #{name}")
42
+ session.invalidate
43
+ session.flow_completed_for("TestIctWithTimeout")
44
+ end
45
+
46
+ end
47
+ end
48
+ EOF
49
+ define_controller_from(str)
50
+ set_controller("SipInline::UacIctTimeoutController")
51
+ end
52
+
53
+
54
+ def test_ict_controllers
55
+ self.expected_flow = ["> INVITE {6,7}", "< 408"] # transcation timeout
56
+ start_controller
57
+ verify_call_flow(:out)
58
+ self.expected_flow = ["< INVITE {6,7}"]
59
+ verify_call_flow(:in)
60
+ end
61
+
62
+ end
@@ -0,0 +1,61 @@
1
+ require 'driven_sip_test_case'
2
+
3
+ class TestInDialogRequest < DrivenSipTestCase
4
+
5
+ def setup
6
+ super
7
+ str = <<-EOF
8
+ require 'sip_test_driver_controller'
9
+ module SipInDialog
10
+ class UasInviteController < SIP::SipTestDriverController
11
+ def on_invite(session)
12
+ logd("Received INVITE in #{name}")
13
+ session.local_tag = 5 #todo differentiate automatically on the same container somehow
14
+ r = session.create_response(200, "OK")
15
+ session.send(r)
16
+ end
17
+
18
+ def on_ack(session)
19
+ logd("Received ACK in #{name}")
20
+ session.invalidate
21
+ session.flow_completed_for("TestInDialogRequest")
22
+ end
23
+
24
+ def order
25
+ 0
26
+ end
27
+ end
28
+
29
+ class UacInviteController < SIP::SipTestDriverController
30
+ def start
31
+ r = Request.create_initial("invite", "sip:nasir@sipper.com", :p_session_record=>"msg-info")
32
+ u = create_udp_session(SipperConfigurator[:LocalSipperIP], SipperConfigurator[:LocalTestPort])
33
+ #todo this MUST be fixed, this coudl easily be forgotten
34
+ u.record_io = yield if block_given?
35
+ u.send(r)
36
+ logd("Sent a new request from #{name}")
37
+ end
38
+
39
+ def on_success_res(session)
40
+ logd("Received response in #{name}")
41
+ session.send(session.create_subsequent_request("ack"))
42
+ session.invalidate
43
+ end
44
+ end
45
+ end
46
+ EOF
47
+ define_controller_from(str)
48
+ set_controller("SipInDialog::UacInviteController")
49
+ end
50
+
51
+
52
+ def test_indialog_controllers
53
+ self.expected_flow = ["> INVITE", "< 200", "> ACK"]
54
+ start_controller
55
+ verify_call_flow(:out)
56
+ self.expected_flow = ["< INVITE", "> 200", "< ACK"]
57
+ verify_call_flow(:in)
58
+ end
59
+
60
+ end
61
+
@@ -0,0 +1,67 @@
1
+ require 'driven_sip_test_case'
2
+
3
+ class TestInlineController < DrivenSipTestCase
4
+
5
+ def setup
6
+ super
7
+ str = <<-EOF
8
+ require 'sip_test_driver_controller'
9
+ module TestInlineController_SipInline
10
+ class UasMsgController < SIP::SipTestDriverController
11
+ def on_message(session)
12
+ logd("Received MESSAGE in #{name}")
13
+ session.local_tag = 5 #todo differentiate automatically on the same container somehow
14
+ r = session.create_response(200, "OK")
15
+ session.send(r)
16
+ session.invalidate
17
+ end
18
+
19
+ def order
20
+ 0
21
+ end
22
+ end
23
+ class UacMsgController < SIP::SipTestDriverController
24
+ def start
25
+ r = Request.create_initial("message", "sip:nasir@sipper.com", :p_session_record=>"msg-info")
26
+ u = create_udp_session(SipperConfigurator[:LocalSipperIP], SipperConfigurator[:LocalTestPort])
27
+ #todo this MUST be fixed, this coudl easily be forgotten
28
+ u.record_io = yield if block_given?
29
+ u.send(r)
30
+ logd("Sent a new request from #{name}")
31
+ end
32
+
33
+ def on_success_res(session)
34
+ logd("Received response in #{name}")
35
+ session.schedule_timer_for("invalidate_timer", 100)
36
+ end
37
+
38
+ def on_timer(session, task)
39
+ logd("Timer invoked in #{name}")
40
+ session.invalidate
41
+ session.flow_completed_for("TestInlineController")
42
+ end
43
+
44
+ end
45
+ end
46
+ EOF
47
+ define_controller_from(str)
48
+ set_controller("TestInlineController_SipInline::UacMsgController")
49
+ end
50
+
51
+ def test_inline_controllers_with_stringio
52
+ self.expected_flow = ["> MESSAGE", "< 200"]
53
+ start_controller(true)
54
+ verify_call_flow(:out)
55
+ self.expected_flow = ["< MESSAGE", "> 200"]
56
+ verify_call_flow(:in)
57
+ end
58
+
59
+ def test_inline_controllers
60
+ self.expected_flow = ["> MESSAGE", "< 200"]
61
+ start_controller
62
+ verify_call_flow(:out)
63
+ self.expected_flow = ["< MESSAGE", "> 200"]
64
+ verify_call_flow(:in)
65
+ end
66
+
67
+ end
@@ -0,0 +1,272 @@
1
+ require 'sip_test_case'
2
+ require 'transaction/invite_client_transaction'
3
+ require 'request'
4
+ require 'response'
5
+ require 'sipper_configurator'
6
+ require 'util/locator'
7
+ require 'transport/rel_unrel'
8
+ require 'transaction_test_helper'
9
+
10
+ # SipTestCase because it starts sipper.
11
+ class TestInviteClientTransaction < SipTestCase
12
+
13
+ def setup
14
+ super
15
+ @t = SipMockTester::MockTimeTransport.new
16
+ @tu = SipMockTester::Tu.new
17
+ end
18
+
19
+
20
+ def test_initial_state
21
+ ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, @t, nil)
22
+ assert_equal("IctMap.Initial", ict.state)
23
+ end
24
+
25
+
26
+ # default timer A is 500 ms
27
+ def test_default_timerA
28
+ ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, @t, nil)
29
+ ict.txn_send SipMockTester::MockRequest.new("INVITE")
30
+ sleep 5
31
+ _assert_deltas(@t, 500, 4)
32
+ end
33
+
34
+ def test_override_T1
35
+ ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, @t, nil) {self.t1 = 100}
36
+ ict.txn_send SipMockTester::MockRequest.new("INVITE")
37
+ sleep 2 # you should have invites at [0, 100, 300, 700] -> 0.7 sec
38
+ _assert_deltas(@t, 100, 4)
39
+ end
40
+
41
+ def test_override_timerA
42
+ ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, @t, nil) {self.ta = 100}
43
+ ict.txn_send SipMockTester::MockRequest.new("INVITE")
44
+ sleep 2 # you should have invites at [0, 100, 300, 700] -> 0.7 sec
45
+ _assert_deltas(@t, 100, 4)
46
+ end
47
+
48
+
49
+ def test_default_timerB
50
+ ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, @t, nil) {self.t1 = 100}
51
+ ict.txn_send SipMockTester::MockRequest.new("INVITE")
52
+ assert_equal("IctMap.Calling", ict.state)
53
+ sleep 8 # 64*t1 is when it will terminate
54
+ _assert_deltas(@t, 100, 7)
55
+ assert_equal("IctMap.Terminated", ict.state) # as timer B would have fired by now
56
+ end
57
+
58
+ def test_override_timerB
59
+ ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, @t, nil) {self.tb = 100}
60
+ ict.txn_send SipMockTester::MockRequest.new("INVITE")
61
+ sleep 0.5
62
+ assert_equal("IctMap.Terminated", ict.state)
63
+ end
64
+
65
+ def test_provisional
66
+ ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, @t, nil) { self.t1=100 }
67
+ ict.txn_send SipMockTester::MockRequest.new("INVITE")
68
+ ict.txn_received SipMockTester::MockResponse.new(100)
69
+ assert_equal(1, @t.msg.length)
70
+ assert_equal("IctMap.Proceeding", ict.state)
71
+ assert(ict.consume?)
72
+ sleep 0.5
73
+ assert_equal(1, @t.msg.length) # still not retransmit because provisional stops retransmit.
74
+ # now once in proceeding state a provisional should keep you here
75
+ ict.txn_received SipMockTester::MockResponse.new(100)
76
+ assert_equal("IctMap.Proceeding", ict.state)
77
+ assert(ict.consume?)
78
+ end
79
+
80
+
81
+ def test_invite_ack
82
+ ict, res = _send_inv_recv_res_send_ack false
83
+ assert_match("INVITE", @tm.msg[0])
84
+ assert_match("ACK", @tm.msg[1])
85
+ assert_match("Via: SIP/2.0/UDP 127.0.0.1:5060;branch=z9hG4bK-1-0-1", @tm.msg[1]) # ACK Via
86
+ assert_match("Cseq: 1 ACK", @tm.msg[1])
87
+ assert_match("To: Sut <sip:sut@127.0.0.1:5061>;tag=123", @tm.msg[1])
88
+ assert_no_match(/tag=123/, @tm.msg[0])
89
+ assert_match("To: Sut <sip:sut@127.0.0.1:5061>", @tm.msg[0])
90
+ assert(ict.consume?)
91
+ assert_equal("IctMap.Completed", @ict.state)
92
+ # resend the 400 response
93
+ ict.txn_received(res)
94
+ assert_equal("IctMap.Completed", @ict.state)
95
+ assert_match("ACK", @tm.msg[2])
96
+ assert(!ict.consume?)
97
+ end
98
+
99
+ def test_invite_ack_in_proceeding
100
+ ict, res = _send_inv_recv_res_send_ack true
101
+ end
102
+
103
+ def test_override_timerD
104
+ orig = SipperConfigurator[:TransactionTimers]
105
+ SipperConfigurator[:TransactionTimers] = { :td=>400 }
106
+ _send_inv_recv_res_send_ack false
107
+ SipperConfigurator[:TransactionTimers] = orig
108
+ assert_equal("IctMap.Completed", @ict.state)
109
+ sleep 1
110
+ assert_equal("IctMap.Terminated", @ict.state)
111
+ end
112
+
113
+ def test_success_final
114
+ ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, @t, nil)
115
+ ict.txn_send SipMockTester::MockRequest.new("INVITE")
116
+ ict.txn_received SipMockTester::MockResponse.new(180)
117
+ assert_equal(1, @t.msg.length)
118
+ assert_equal("IctMap.Proceeding", ict.state)
119
+ assert(ict.consume?)
120
+ ict.txn_received SipMockTester::MockResponse.new(200)
121
+ assert_equal("IctMap.Terminated", ict.state)
122
+ assert(ict.consume?)
123
+
124
+ # before prov.
125
+ ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, @t, nil)
126
+ ict.txn_send SipMockTester::MockRequest.new("INVITE")
127
+ assert_equal("IctMap.Calling", ict.state)
128
+ ict.txn_received SipMockTester::MockResponse.new(200)
129
+ assert_equal("IctMap.Terminated", ict.state)
130
+ assert(ict.consume?)
131
+ end
132
+
133
+ def test_trans_exception
134
+ t = SipMockTester::ExceptionalTransportOnNthAttempt.new(1)
135
+ ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, t, nil)
136
+ assert_equal("IctMap.Initial", ict.state)
137
+ ict.txn_send SipMockTester::MockRequest.new("INVITE")
138
+ assert_equal("IctMap.Terminated", ict.state)
139
+ end
140
+
141
+ def test_trans_exception_on_retransmit
142
+ t = SipMockTester::ExceptionalTransportOnNthAttempt.new(2)
143
+ ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, t, nil)
144
+ assert_equal("IctMap.Initial", ict.state)
145
+ ict.txn_send SipMockTester::MockRequest.new("INVITE")
146
+ assert_equal("IctMap.Calling", ict.state)
147
+ sleep 1
148
+ assert_equal("IctMap.Terminated", ict.state)
149
+ end
150
+
151
+ def test_trans_exception_with_tu
152
+ t = SipMockTester::ExceptionalTransportOnNthAttempt.new(1)
153
+ assert_nil(@tu.txn)
154
+ ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, t, nil)
155
+ assert_equal("IctMap.Initial", ict.state)
156
+ ict.txn_send SipMockTester::MockRequest.new("INVITE")
157
+ assert_equal("IctMap.Terminated", ict.state)
158
+ assert_equal(ict, @tu.txn)
159
+ end
160
+
161
+ def test_no_timerA_reliable
162
+ ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, @t, nil) {self.t1 = 100}
163
+ rt = @t.dup # make the
164
+ rt.extend(SIP::Transport::ReliableTransport) # transport reliable
165
+ ict.txn_send SipMockTester::MockRequest.new("INVITE")
166
+ sleep 2
167
+ assert(1, rt.msg.length) # no retransmission with realiable trans
168
+ end
169
+
170
+ def test_timerB_with_reliable
171
+ ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, nil, @t, nil) {self.tb = 100}
172
+ rt = @t.dup # make the
173
+ rt.extend(SIP::Transport::ReliableTransport) # transport reliable
174
+ ict.txn_send SipMockTester::MockRequest.new("INVITE")
175
+ sleep 0.5
176
+ assert_equal("IctMap.Terminated", ict.state)
177
+ end
178
+
179
+ def test_timerD_with_reliable
180
+ _send_inv_recv_res_send_ack(false, true) # since timer D is run for 0 time it should be instantanous
181
+ sleep 0.5 # just giving some time for transcation to cleanup.
182
+ assert_equal("IctMap.Terminated", @ict.state)
183
+ end
184
+
185
+ # default, proceed with no change
186
+ def test_txn_handler1
187
+ tcbh = SipMockTester::Tcbh1.new
188
+ ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, tcbh, @t, nil)
189
+ ict.txn_send SipMockTester::MockRequest.new("INVITE")
190
+ assert_equal("IctMap.Calling", ict.state)
191
+ assert_equal("IctMap.Initial", tcbh.states[0]) # before
192
+ assert_equal("IctMap.Calling", tcbh.states[1]) # after
193
+ assert_equal(1, @t.msg.length)
194
+ end
195
+
196
+ # state change but no action masker
197
+ def test_txn_handler2
198
+ tcbh = SipMockTester::Tcbh2.new
199
+ ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, tcbh, @t, nil)
200
+ ict.txn_send SipMockTester::MockRequest.new("INVITE")
201
+ assert_equal("IctMap.Calling", ict.state)
202
+ assert_equal(0, @t.msg.length)
203
+ end
204
+
205
+ # do not proceed
206
+ def test_txn_handler3
207
+ tcbh = SipMockTester::Tcbh3.new
208
+ ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, tcbh, @t, nil)
209
+ ict.txn_send SipMockTester::MockRequest.new("INVITE")
210
+ assert_equal("IctMap.Initial", ict.state)
211
+ assert_equal(0, @t.msg.length)
212
+ assert(tcbh.txn.is_a?(SIP::Transaction::InviteClientTransaction))
213
+ end
214
+
215
+ # illegal state test
216
+ def test_txn_handler4
217
+ tcbh = SipMockTester::Tcbh4.new
218
+ ict = SIP::Transaction::InviteClientTransaction.new(@tu, nil, tcbh, @t, nil)
219
+ ict.txn_send SipMockTester::MockRequest.new("INVITE")
220
+ assert_equal("IctMap.Calling", ict.state)
221
+ assert_equal(1, @t.msg.length)
222
+ assert_nil(tcbh.txn)
223
+ ict.txn_send SipMockTester::MockRequest.new("INVITE") # you cannot send an INVITE in Calling.
224
+ assert(tcbh.txn.is_a?(SIP::Transaction::InviteClientTransaction))
225
+ assert_equal("IctMap.Calling", ict.state)
226
+ end
227
+
228
+ def _assert_deltas(t, delta, times)
229
+ 1.upto(times-1) do |x|
230
+ # as it is +/- for both timers, and allowing for an error factor of 1 so 3.0
231
+ assert_in_delta(t.msg[x-1]+delta, t.msg[x], SIP::Locator[:Sth].granularity * 3.0)
232
+ delta *= 2
233
+ end
234
+ rescue Test::Unit::AssertionFailedError
235
+ t.msg.each {|m| print "#{m},"}
236
+ puts
237
+ raise
238
+ end
239
+
240
+ def _send_inv_recv_res_send_ack(provisional, reliable=false)
241
+ t = SipMockTester::MockMsgTransport.new
242
+ if reliable
243
+ @tm = t.dup
244
+ @tm.extend(SIP::Transport::ReliableTransport)
245
+ else
246
+ @tm = t
247
+ end
248
+
249
+ inv = Request.create_initial("invite", "sip:nasir@sipper.com")
250
+ inv.max_forwards = "70"
251
+ inv.call_id = "1-234@sipper.com"
252
+ inv.via = "SIP/2.0/UDP 127.0.0.1:5060;branch=z9hG4bK-1-0-1"
253
+ inv.from = "Sipper <sip:sipper@127.0.0.1:5060>;tag=1"
254
+ inv.to = "Sut <sip:sut@127.0.0.1:5061>"
255
+ inv.cseq = "1 INVITE"
256
+ @ict = SIP::Transaction::InviteClientTransaction.new(SipMockTester::Tu.new, nil, nil, @tm, nil)
257
+
258
+ @ict.txn_send inv
259
+
260
+ if provisional
261
+ @ict.txn_received SipMockTester::MockResponse.new(183)
262
+ assert_equal("IctMap.Proceeding", @ict.state)
263
+ end
264
+ res = Response.create(400, "Bad Request")
265
+ res.copy_from(inv, :from, :call_id, :cseq, :via, :to)
266
+ res.to = inv.to.to_s + ";tag=123"
267
+ @ict.txn_received(res)
268
+ [@ict, res]
269
+ end
270
+
271
+ private :_assert_deltas, :_send_inv_recv_res_send_ack
272
+ end