trema 0.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 (560) hide show
  1. data/.mono.rant +4107 -0
  2. data/.rspec +1 -0
  3. data/.yardopts +4 -0
  4. data/Doxyfile +1679 -0
  5. data/GPL2 +339 -0
  6. data/Gemfile +22 -0
  7. data/Gemfile.lock +71 -0
  8. data/README.md +135 -0
  9. data/Rakefile +140 -0
  10. data/Rantfile +834 -0
  11. data/VERSION +1 -0
  12. data/build.rb +32 -0
  13. data/cruise.rb +389 -0
  14. data/features/example.dumper.feature +87 -0
  15. data/features/example.learning_switch.feature +39 -0
  16. data/features/example.list_switches.feature +38 -0
  17. data/features/example.message.echo_reply.feature +26 -0
  18. data/features/example.message.echo_request.feature +25 -0
  19. data/features/example.message.features_request.feature +84 -0
  20. data/features/example.message.hello.feature +25 -0
  21. data/features/example.message.set_config.feature +27 -0
  22. data/features/example.multi_learning_switch.feature +135 -0
  23. data/features/example.packetin_filter_config.feature +91 -0
  24. data/features/example.repeater_hub.feature +49 -0
  25. data/features/example.switch_monitor.feature +39 -0
  26. data/features/packetin_filter.feature +49 -0
  27. data/features/step_definitions/kill_steps.rb +30 -0
  28. data/features/step_definitions/log_steps.rb +90 -0
  29. data/features/step_definitions/misc_steps.rb +64 -0
  30. data/features/step_definitions/off_steps.rb +30 -0
  31. data/features/step_definitions/run_steps.rb +91 -0
  32. data/features/step_definitions/send_packets_steps.rb +42 -0
  33. data/features/step_definitions/show_stats_steps.rb +43 -0
  34. data/features/step_definitions/stats_steps.rb +39 -0
  35. data/features/support/env.rb +75 -0
  36. data/features/support/hooks.rb +8 -0
  37. data/features/switch_manager.feature +35 -0
  38. data/features/trema-config.feature +68 -0
  39. data/features/trema.dump_flows.feature +25 -0
  40. data/features/trema.feature +25 -0
  41. data/features/trema.kill.feature +53 -0
  42. data/features/trema.killall.feature +30 -0
  43. data/features/trema.reset_stats.feature +14 -0
  44. data/features/trema.run.feature +46 -0
  45. data/features/trema.send_packets.feature +56 -0
  46. data/features/trema.show_stats.feature +67 -0
  47. data/features/tutorial.hello_trema.feature +27 -0
  48. data/features/tutorial.packet_in.feature +47 -0
  49. data/features/tutorial.switch_info.feature +55 -0
  50. data/ruby/.gitignore +4 -0
  51. data/ruby/blocker.rb +78 -0
  52. data/ruby/extconf.rb +71 -0
  53. data/ruby/sub-process.rb +291 -0
  54. data/ruby/trema/action-common.c +60 -0
  55. data/ruby/trema/action-common.h +42 -0
  56. data/ruby/trema/action-enqueue.c +161 -0
  57. data/ruby/trema/action-enqueue.h +40 -0
  58. data/ruby/trema/action-output.c +169 -0
  59. data/ruby/trema/action-output.h +42 -0
  60. data/ruby/trema/action-set-dl-dst.c +131 -0
  61. data/ruby/trema/action-set-dl-dst.h +44 -0
  62. data/ruby/trema/action-set-dl-src.c +131 -0
  63. data/ruby/trema/action-set-dl-src.h +44 -0
  64. data/ruby/trema/action-set-nw-dst.c +135 -0
  65. data/ruby/trema/action-set-nw-dst.h +42 -0
  66. data/ruby/trema/action-set-nw-src.c +140 -0
  67. data/ruby/trema/action-set-nw-src.h +42 -0
  68. data/ruby/trema/action-set-nw-tos.c +124 -0
  69. data/ruby/trema/action-set-nw-tos.h +42 -0
  70. data/ruby/trema/action-set-tp-dst.c +122 -0
  71. data/ruby/trema/action-set-tp-dst.h +42 -0
  72. data/ruby/trema/action-set-tp-src.c +124 -0
  73. data/ruby/trema/action-set-tp-src.h +42 -0
  74. data/ruby/trema/action-set-vlan-pcp.c +128 -0
  75. data/ruby/trema/action-set-vlan-pcp.h +42 -0
  76. data/ruby/trema/action-set-vlan-vid.c +125 -0
  77. data/ruby/trema/action-set-vlan-vid.h +42 -0
  78. data/ruby/trema/action-strip-vlan.c +81 -0
  79. data/ruby/trema/action-strip-vlan.h +42 -0
  80. data/ruby/trema/action-vendor.c +121 -0
  81. data/ruby/trema/action-vendor.h +42 -0
  82. data/ruby/trema/aggregate-stats-reply.rb +70 -0
  83. data/ruby/trema/app.rb +112 -0
  84. data/ruby/trema/barrier-reply.c +99 -0
  85. data/ruby/trema/barrier-reply.h +46 -0
  86. data/ruby/trema/barrier-request.c +108 -0
  87. data/ruby/trema/barrier-request.h +44 -0
  88. data/ruby/trema/cli.rb +269 -0
  89. data/ruby/trema/command.rb +40 -0
  90. data/ruby/trema/command/dump_flows.rb +62 -0
  91. data/ruby/trema/command/kill.rb +71 -0
  92. data/ruby/trema/command/killall.rb +56 -0
  93. data/ruby/trema/command/reset_stats.rb +61 -0
  94. data/ruby/trema/command/ruby.rb +55 -0
  95. data/ruby/trema/command/run.rb +120 -0
  96. data/ruby/trema/command/send_packets.rb +130 -0
  97. data/ruby/trema/command/shell.rb +61 -0
  98. data/ruby/trema/command/show_stats.rb +84 -0
  99. data/ruby/trema/command/usage.rb +61 -0
  100. data/ruby/trema/command/version.rb +39 -0
  101. data/ruby/trema/controller.c +595 -0
  102. data/ruby/trema/controller.h +44 -0
  103. data/ruby/trema/controller.rb +81 -0
  104. data/ruby/trema/daemon.rb +167 -0
  105. data/ruby/trema/dsl.rb +34 -0
  106. data/ruby/trema/dsl/configuration.rb +153 -0
  107. data/ruby/trema/dsl/context.rb +71 -0
  108. data/ruby/trema/dsl/link.rb +41 -0
  109. data/ruby/trema/dsl/parser.rb +70 -0
  110. data/ruby/trema/dsl/run.rb +49 -0
  111. data/ruby/trema/dsl/runner.rb +165 -0
  112. data/ruby/trema/dsl/stanza.rb +53 -0
  113. data/ruby/trema/dsl/switch.rb +78 -0
  114. data/ruby/trema/dsl/syntax-error.rb +33 -0
  115. data/ruby/trema/dsl/syntax.rb +109 -0
  116. data/ruby/trema/dsl/vhost.rb +108 -0
  117. data/ruby/trema/dsl/vswitch.rb +47 -0
  118. data/ruby/trema/echo-reply.c +107 -0
  119. data/ruby/trema/echo-reply.h +42 -0
  120. data/ruby/trema/echo-request.c +140 -0
  121. data/ruby/trema/echo-request.h +42 -0
  122. data/ruby/trema/error.c +253 -0
  123. data/ruby/trema/error.h +44 -0
  124. data/ruby/trema/exact-match.rb +36 -0
  125. data/ruby/trema/executables.rb +95 -0
  126. data/ruby/trema/features-reply.c +238 -0
  127. data/ruby/trema/features-reply.h +60 -0
  128. data/ruby/trema/features-request.c +109 -0
  129. data/ruby/trema/features-request.h +44 -0
  130. data/ruby/trema/flow-removed.c +275 -0
  131. data/ruby/trema/flow-removed.h +46 -0
  132. data/ruby/trema/flow-stats-reply.rb +109 -0
  133. data/ruby/trema/flow.rb +56 -0
  134. data/ruby/trema/get-config-reply.c +159 -0
  135. data/ruby/trema/get-config-reply.h +52 -0
  136. data/ruby/trema/get-config-request.c +107 -0
  137. data/ruby/trema/get-config-request.h +44 -0
  138. data/ruby/trema/hello.c +110 -0
  139. data/ruby/trema/hello.h +44 -0
  140. data/ruby/trema/host.rb +257 -0
  141. data/ruby/trema/ip.rb +101 -0
  142. data/ruby/trema/link.rb +176 -0
  143. data/ruby/trema/list-switches-reply.c +46 -0
  144. data/ruby/trema/list-switches-reply.h +40 -0
  145. data/ruby/trema/logger.c +162 -0
  146. data/ruby/trema/logger.h +44 -0
  147. data/ruby/trema/mac.rb +151 -0
  148. data/ruby/trema/match.c +594 -0
  149. data/ruby/trema/match.h +36 -0
  150. data/ruby/trema/monkey-patch/integer.rb +35 -0
  151. data/ruby/trema/monkey-patch/integer/base-conversions.rb +36 -0
  152. data/ruby/trema/monkey-patch/integer/ranges.rb +51 -0
  153. data/ruby/trema/monkey-patch/module.rb +33 -0
  154. data/ruby/trema/monkey-patch/module/deprecation.rb +41 -0
  155. data/ruby/trema/monkey-patch/string.rb +33 -0
  156. data/ruby/trema/monkey-patch/string/inflectors.rb +54 -0
  157. data/ruby/trema/network-component.rb +153 -0
  158. data/ruby/trema/ofctl.rb +62 -0
  159. data/ruby/trema/open-vswitch.rb +154 -0
  160. data/ruby/trema/openflow-error.c +191 -0
  161. data/ruby/trema/openflow-error.h +53 -0
  162. data/ruby/trema/openflow-switch.rb +88 -0
  163. data/ruby/trema/ordered-hash.rb +74 -0
  164. data/ruby/trema/packet-queue.rb +178 -0
  165. data/ruby/trema/packet_in.c +736 -0
  166. data/ruby/trema/packet_in.h +46 -0
  167. data/ruby/trema/packetin-filter.rb +126 -0
  168. data/ruby/trema/path.rb +135 -0
  169. data/ruby/trema/phost.rb +69 -0
  170. data/ruby/trema/port-mod.c +226 -0
  171. data/ruby/trema/port-mod.h +36 -0
  172. data/ruby/trema/port-stats-reply.rb +111 -0
  173. data/ruby/trema/port-status.c +156 -0
  174. data/ruby/trema/port-status.h +45 -0
  175. data/ruby/trema/port.c +295 -0
  176. data/ruby/trema/port.h +47 -0
  177. data/ruby/trema/process.rb +76 -0
  178. data/ruby/trema/queue-get-config-reply.c +200 -0
  179. data/ruby/trema/queue-get-config-reply.h +47 -0
  180. data/ruby/trema/queue-get-config-request.c +141 -0
  181. data/ruby/trema/queue-get-config-request.h +44 -0
  182. data/ruby/trema/queue-stats-reply.rb +78 -0
  183. data/ruby/trema/set-config.c +171 -0
  184. data/ruby/trema/set-config.h +44 -0
  185. data/ruby/trema/shell.rb +39 -0
  186. data/ruby/trema/shell/down.rb +39 -0
  187. data/ruby/trema/shell/killall.rb +40 -0
  188. data/ruby/trema/shell/link.rb +61 -0
  189. data/ruby/trema/shell/reset_stats.rb +50 -0
  190. data/ruby/trema/shell/run.rb +67 -0
  191. data/ruby/trema/shell/send_packets.rb +42 -0
  192. data/ruby/trema/shell/show_stats.rb +49 -0
  193. data/ruby/trema/shell/up.rb +43 -0
  194. data/ruby/trema/shell/vhost.rb +44 -0
  195. data/ruby/trema/shell/vswitch.rb +49 -0
  196. data/ruby/trema/stats-helper.rb +65 -0
  197. data/ruby/trema/stats-reply.c +483 -0
  198. data/ruby/trema/stats-reply.h +53 -0
  199. data/ruby/trema/stats-request.c +634 -0
  200. data/ruby/trema/stats-request.h +42 -0
  201. data/ruby/trema/switch-daemon.rb +74 -0
  202. data/ruby/trema/switch-disconnected.c +40 -0
  203. data/ruby/trema/switch-disconnected.h +38 -0
  204. data/ruby/trema/switch-manager.rb +121 -0
  205. data/ruby/trema/switch.rb +37 -0
  206. data/ruby/trema/table-stats-reply.rb +87 -0
  207. data/ruby/trema/timers.rb +97 -0
  208. data/ruby/trema/trema.c +122 -0
  209. data/ruby/trema/tremashark.rb +39 -0
  210. data/ruby/trema/util.rb +84 -0
  211. data/ruby/trema/vendor-request.c +193 -0
  212. data/ruby/trema/vendor-request.h +44 -0
  213. data/ruby/trema/vendor-stats-reply.rb +62 -0
  214. data/ruby/trema/vendor.c +152 -0
  215. data/ruby/trema/vendor.h +52 -0
  216. data/ruby/trema/version.rb +30 -0
  217. data/spec/spec_helper.rb +153 -0
  218. data/spec/support/openflow-message.rb +94 -0
  219. data/spec/trema/action-enqueue_spec.rb +100 -0
  220. data/spec/trema/action-output_spec.rb +116 -0
  221. data/spec/trema/action-set-dl-dst_spec.rb +95 -0
  222. data/spec/trema/action-set-dl-src_spec.rb +92 -0
  223. data/spec/trema/action-set-nw-dst_spec.rb +96 -0
  224. data/spec/trema/action-set-nw-src_spec.rb +97 -0
  225. data/spec/trema/action-set-nw-tos_spec.rb +88 -0
  226. data/spec/trema/action-set-tp-dst_spec.rb +88 -0
  227. data/spec/trema/action-set-tp-src_spec.rb +88 -0
  228. data/spec/trema/action-set-vlan-pcp_spec.rb +91 -0
  229. data/spec/trema/action-set-vlan-vid_spec.rb +91 -0
  230. data/spec/trema/action-strip-vlan_spec.rb +57 -0
  231. data/spec/trema/action-vendor_spec.rb +90 -0
  232. data/spec/trema/app_spec.rb +90 -0
  233. data/spec/trema/barrier-reply_spec.rb +45 -0
  234. data/spec/trema/barrier-request_spec.rb +83 -0
  235. data/spec/trema/cli_spec.rb +160 -0
  236. data/spec/trema/controller_spec.rb +100 -0
  237. data/spec/trema/dsl/configuration_spec.rb +122 -0
  238. data/spec/trema/dsl/link_spec.rb +54 -0
  239. data/spec/trema/dsl/run_spec.rb +78 -0
  240. data/spec/trema/dsl/runner_spec.rb +239 -0
  241. data/spec/trema/dsl/switch_spec.rb +77 -0
  242. data/spec/trema/dsl/syntax_spec.rb +121 -0
  243. data/spec/trema/dsl/vhost_spec.rb +148 -0
  244. data/spec/trema/dsl/vswitch_spec.rb +90 -0
  245. data/spec/trema/echo-reply_spec.rb +49 -0
  246. data/spec/trema/echo-request_spec.rb +75 -0
  247. data/spec/trema/error_spec.rb +142 -0
  248. data/spec/trema/executables_spec.rb +75 -0
  249. data/spec/trema/features-reply_spec.rb +57 -0
  250. data/spec/trema/features-request_spec.rb +66 -0
  251. data/spec/trema/flow-removed_spec.rb +146 -0
  252. data/spec/trema/get-config-reply_spec.rb +43 -0
  253. data/spec/trema/get-config-request_spec.rb +82 -0
  254. data/spec/trema/hello_spec.rb +49 -0
  255. data/spec/trema/host_spec.rb +193 -0
  256. data/spec/trema/link_spec.rb +64 -0
  257. data/spec/trema/list-switches-reply_spec.rb +48 -0
  258. data/spec/trema/logger_spec.rb +48 -0
  259. data/spec/trema/mac_spec.rb +115 -0
  260. data/spec/trema/match_spec.rb +113 -0
  261. data/spec/trema/open-vswitch_spec.rb +123 -0
  262. data/spec/trema/openflow-error_spec.rb +141 -0
  263. data/spec/trema/openflow-switch_spec.rb +56 -0
  264. data/spec/trema/packet-in_spec.rb +168 -0
  265. data/spec/trema/packet-out_spec.rb +128 -0
  266. data/spec/trema/packetin-filter_spec.rb +41 -0
  267. data/spec/trema/port-mod_spec.rb +101 -0
  268. data/spec/trema/port-status_spec.rb +108 -0
  269. data/spec/trema/port_spec.rb +61 -0
  270. data/spec/trema/process_spec.rb +71 -0
  271. data/spec/trema/queue-get-config-reply_spec.rb +66 -0
  272. data/spec/trema/queue-get-config-request_spec.rb +69 -0
  273. data/spec/trema/set-config_spec.rb +80 -0
  274. data/spec/trema/shell/vhost_spec.rb +57 -0
  275. data/spec/trema/shell/vswitch_spec.rb +89 -0
  276. data/spec/trema/stats-reply_spec.rb +306 -0
  277. data/spec/trema/stats-request_spec.rb +151 -0
  278. data/spec/trema/switch-disconnected_spec.rb +58 -0
  279. data/spec/trema/switch-manager_spec.rb +43 -0
  280. data/spec/trema/tremashark_spec.rb +41 -0
  281. data/spec/trema/util_spec.rb +93 -0
  282. data/spec/trema/vendor-request_spec.rb +79 -0
  283. data/src/examples/cbench_switch/README +21 -0
  284. data/src/examples/cbench_switch/cbench-switch.rb +39 -0
  285. data/src/examples/cbench_switch/cbench_switch.c +68 -0
  286. data/src/examples/dumper/dumper.c +370 -0
  287. data/src/examples/dumper/dumper.conf +7 -0
  288. data/src/examples/dumper/dumper.rb +196 -0
  289. data/src/examples/hello_trema/README +13 -0
  290. data/src/examples/hello_trema/hello_trema.c +51 -0
  291. data/src/examples/hello_trema/hello_trema.conf +3 -0
  292. data/src/examples/hello_trema/hello_trema.rb +35 -0
  293. data/src/examples/learning_switch/README +15 -0
  294. data/src/examples/learning_switch/fdb.rb +112 -0
  295. data/src/examples/learning_switch/learning-switch.rb +88 -0
  296. data/src/examples/learning_switch/learning_switch.c +236 -0
  297. data/src/examples/learning_switch/learning_switch.conf +18 -0
  298. data/src/examples/list_switches/README +19 -0
  299. data/src/examples/list_switches/list-switches.rb +45 -0
  300. data/src/examples/list_switches/list_switches.c +81 -0
  301. data/src/examples/list_switches/list_switches.conf +15 -0
  302. data/src/examples/match_compare/match-compare.conf +30 -0
  303. data/src/examples/match_compare/match-compare.rb +99 -0
  304. data/src/examples/multi_learning_switch/README +14 -0
  305. data/src/examples/multi_learning_switch/multi-learning-switch.rb +96 -0
  306. data/src/examples/multi_learning_switch/multi_learning_switch.c +296 -0
  307. data/src/examples/multi_learning_switch/multi_learning_switch.conf +17 -0
  308. data/src/examples/openflow_message/README +11 -0
  309. data/src/examples/openflow_message/echo-reply.rb +59 -0
  310. data/src/examples/openflow_message/echo-request.rb +58 -0
  311. data/src/examples/openflow_message/echo_reply.c +70 -0
  312. data/src/examples/openflow_message/echo_request.c +70 -0
  313. data/src/examples/openflow_message/example.rb +63 -0
  314. data/src/examples/openflow_message/features-request.rb +97 -0
  315. data/src/examples/openflow_message/features_request.c +168 -0
  316. data/src/examples/openflow_message/hello.c +70 -0
  317. data/src/examples/openflow_message/hello.rb +58 -0
  318. data/src/examples/openflow_message/set-config.rb +59 -0
  319. data/src/examples/openflow_message/set_config.c +70 -0
  320. data/src/examples/packet_in/README +15 -0
  321. data/src/examples/packet_in/packet_in.c +55 -0
  322. data/src/examples/packet_in/packet_in.conf +15 -0
  323. data/src/examples/packet_in/packet_in.rb +34 -0
  324. data/src/examples/packetin_filter_config/README +12 -0
  325. data/src/examples/packetin_filter_config/add_filter.c +73 -0
  326. data/src/examples/packetin_filter_config/delete_filter.c +65 -0
  327. data/src/examples/packetin_filter_config/delete_filter_strict.c +75 -0
  328. data/src/examples/packetin_filter_config/dump_filter.c +65 -0
  329. data/src/examples/packetin_filter_config/dump_filter_strict.c +75 -0
  330. data/src/examples/packetin_filter_config/packetin_filter_config.c +134 -0
  331. data/src/examples/packetin_filter_config/packetin_filter_config.conf +7 -0
  332. data/src/examples/packetin_filter_config/utils.c +102 -0
  333. data/src/examples/packetin_filter_config/utils.h +42 -0
  334. data/src/examples/repeater_hub/README +8 -0
  335. data/src/examples/repeater_hub/repeater-hub.rb +43 -0
  336. data/src/examples/repeater_hub/repeater-hub_spec.rb +156 -0
  337. data/src/examples/repeater_hub/repeater_hub.c +83 -0
  338. data/src/examples/repeater_hub/repeater_hub.conf +28 -0
  339. data/src/examples/switch_info/README +13 -0
  340. data/src/examples/switch_info/switch_info.c +80 -0
  341. data/src/examples/switch_info/switch_info.conf +3 -0
  342. data/src/examples/switch_info/switch_info.rb +46 -0
  343. data/src/examples/switch_monitor/switch-monitor.conf +3 -0
  344. data/src/examples/switch_monitor/switch-monitor.rb +58 -0
  345. data/src/examples/switch_monitor/switch_monitor.c +154 -0
  346. data/src/examples/traffic_monitor/counter.c +74 -0
  347. data/src/examples/traffic_monitor/counter.h +48 -0
  348. data/src/examples/traffic_monitor/counter.rb +46 -0
  349. data/src/examples/traffic_monitor/fdb.c +76 -0
  350. data/src/examples/traffic_monitor/fdb.h +50 -0
  351. data/src/examples/traffic_monitor/fdb.rb +44 -0
  352. data/src/examples/traffic_monitor/traffic-monitor.rb +100 -0
  353. data/src/examples/traffic_monitor/traffic_monitor.c +163 -0
  354. data/src/examples/traffic_monitor/traffic_monitor.conf +16 -0
  355. data/src/lib/arp.h +61 -0
  356. data/src/lib/bool.h +49 -0
  357. data/src/lib/buffer.c +305 -0
  358. data/src/lib/buffer.h +56 -0
  359. data/src/lib/byteorder.c +547 -0
  360. data/src/lib/byteorder.h +110 -0
  361. data/src/lib/checks.h +42 -0
  362. data/src/lib/daemon.c +302 -0
  363. data/src/lib/daemon.h +42 -0
  364. data/src/lib/doubly_linked_list.c +281 -0
  365. data/src/lib/doubly_linked_list.h +88 -0
  366. data/src/lib/ether.c +48 -0
  367. data/src/lib/ether.h +94 -0
  368. data/src/lib/etherip.h +46 -0
  369. data/src/lib/event_handler.c +389 -0
  370. data/src/lib/event_handler.h +64 -0
  371. data/src/lib/hash_table.c +417 -0
  372. data/src/lib/hash_table.h +138 -0
  373. data/src/lib/icmp.h +74 -0
  374. data/src/lib/igmp.h +50 -0
  375. data/src/lib/ipv4.h +50 -0
  376. data/src/lib/linked_list.c +199 -0
  377. data/src/lib/linked_list.h +84 -0
  378. data/src/lib/log.c +402 -0
  379. data/src/lib/log.h +78 -0
  380. data/src/lib/match.h +84 -0
  381. data/src/lib/match_table.c +608 -0
  382. data/src/lib/match_table.h +51 -0
  383. data/src/lib/message_queue.c +143 -0
  384. data/src/lib/message_queue.h +61 -0
  385. data/src/lib/messenger.c +1714 -0
  386. data/src/lib/messenger.h +145 -0
  387. data/src/lib/openflow_application_interface.c +1673 -0
  388. data/src/lib/openflow_application_interface.h +329 -0
  389. data/src/lib/openflow_message.c +4051 -0
  390. data/src/lib/openflow_message.h +288 -0
  391. data/src/lib/openflow_service_interface.h +59 -0
  392. data/src/lib/packet_info.c +230 -0
  393. data/src/lib/packet_info.h +209 -0
  394. data/src/lib/packet_parser.c +502 -0
  395. data/src/lib/packetin_filter_interface.c +294 -0
  396. data/src/lib/packetin_filter_interface.h +127 -0
  397. data/src/lib/persistent_storage.c +480 -0
  398. data/src/lib/persistent_storage.h +46 -0
  399. data/src/lib/stat.c +213 -0
  400. data/src/lib/stat.h +44 -0
  401. data/src/lib/tcp.h +67 -0
  402. data/src/lib/timer.c +350 -0
  403. data/src/lib/timer.h +53 -0
  404. data/src/lib/trema.c +710 -0
  405. data/src/lib/trema.h +79 -0
  406. data/src/lib/trema_private.c +177 -0
  407. data/src/lib/trema_private.h +60 -0
  408. data/src/lib/trema_wrapper.c +56 -0
  409. data/src/lib/trema_wrapper.h +64 -0
  410. data/src/lib/udp.h +43 -0
  411. data/src/lib/utility.c +515 -0
  412. data/src/lib/utility.h +67 -0
  413. data/src/lib/wrapper.c +100 -0
  414. data/src/lib/wrapper.h +76 -0
  415. data/src/packetin_filter/README +17 -0
  416. data/src/packetin_filter/packetin_filter.c +575 -0
  417. data/src/switch_manager/README +20 -0
  418. data/src/switch_manager/cookie_table.c +292 -0
  419. data/src/switch_manager/cookie_table.h +72 -0
  420. data/src/switch_manager/dpid_table.c +110 -0
  421. data/src/switch_manager/dpid_table.h +46 -0
  422. data/src/switch_manager/management_interface.h +44 -0
  423. data/src/switch_manager/ofpmsg_recv.c +482 -0
  424. data/src/switch_manager/ofpmsg_recv.h +42 -0
  425. data/src/switch_manager/ofpmsg_send.c +235 -0
  426. data/src/switch_manager/ofpmsg_send.h +50 -0
  427. data/src/switch_manager/secure_channel_listener.c +281 -0
  428. data/src/switch_manager/secure_channel_listener.h +42 -0
  429. data/src/switch_manager/secure_channel_receiver.c +126 -0
  430. data/src/switch_manager/secure_channel_receiver.h +43 -0
  431. data/src/switch_manager/secure_channel_sender.c +126 -0
  432. data/src/switch_manager/secure_channel_sender.h +43 -0
  433. data/src/switch_manager/service_interface.c +181 -0
  434. data/src/switch_manager/service_interface.h +46 -0
  435. data/src/switch_manager/switch.c +538 -0
  436. data/src/switch_manager/switch.h +51 -0
  437. data/src/switch_manager/switch_manager.c +448 -0
  438. data/src/switch_manager/switch_manager.h +63 -0
  439. data/src/switch_manager/switchinfo.h +72 -0
  440. data/src/switch_manager/xid_table.c +184 -0
  441. data/src/switch_manager/xid_table.h +56 -0
  442. data/src/tremashark/README +78 -0
  443. data/src/tremashark/packet_capture.c +357 -0
  444. data/src/tremashark/pcap_private.h +47 -0
  445. data/src/tremashark/pcap_queue.c +197 -0
  446. data/src/tremashark/pcap_queue.h +58 -0
  447. data/src/tremashark/plugin/.gitignore +6 -0
  448. data/src/tremashark/plugin/packet-trema/.gitignore +5 -0
  449. data/src/tremashark/plugin/packet-trema/Makefile +77 -0
  450. data/src/tremashark/plugin/packet-trema/Makefile.am +110 -0
  451. data/src/tremashark/plugin/packet-trema/Makefile.common +31 -0
  452. data/src/tremashark/plugin/packet-trema/moduleinfo.h +41 -0
  453. data/src/tremashark/plugin/packet-trema/packet-trema.c +1659 -0
  454. data/src/tremashark/plugin/packet-trema/plugin.c +31 -0
  455. data/src/tremashark/plugin/user_dlts +2 -0
  456. data/src/tremashark/queue.c +168 -0
  457. data/src/tremashark/queue.h +60 -0
  458. data/src/tremashark/stdin_relay.c +257 -0
  459. data/src/tremashark/syslog_relay.c +247 -0
  460. data/src/tremashark/tremashark.c +556 -0
  461. data/trema +93 -0
  462. data/trema-config +61 -0
  463. data/unittests/buffer_stubs.c +74 -0
  464. data/unittests/cmockery_trema.c +123 -0
  465. data/unittests/cmockery_trema.h +96 -0
  466. data/unittests/lib/buffer_test.c +370 -0
  467. data/unittests/lib/byteorder_test.c +1717 -0
  468. data/unittests/lib/daemon_test.c +664 -0
  469. data/unittests/lib/doubly_linked_list_test.c +346 -0
  470. data/unittests/lib/ether_test.c +127 -0
  471. data/unittests/lib/hash_table_test.c +278 -0
  472. data/unittests/lib/linked_list_test.c +343 -0
  473. data/unittests/lib/log_test.c +459 -0
  474. data/unittests/lib/match_table_test.c +1509 -0
  475. data/unittests/lib/message_queue_test.c +379 -0
  476. data/unittests/lib/messenger_test.c +438 -0
  477. data/unittests/lib/openflow_application_interface_test.c +3488 -0
  478. data/unittests/lib/openflow_message_test.c +7337 -0
  479. data/unittests/lib/packet_info_test.c +544 -0
  480. data/unittests/lib/packet_parser_test.c +703 -0
  481. data/unittests/lib/packetin_filter_interface_test.c +723 -0
  482. data/unittests/lib/persistent_storage_test.c +802 -0
  483. data/unittests/lib/stat_test.c +291 -0
  484. data/unittests/lib/test_packets/arp_rep.cap +0 -0
  485. data/unittests/lib/test_packets/arp_req.cap +0 -0
  486. data/unittests/lib/test_packets/icmp_echo_rep.cap +0 -0
  487. data/unittests/lib/test_packets/icmp_echo_req.cap +0 -0
  488. data/unittests/lib/test_packets/igmp_query_v2.cap +0 -0
  489. data/unittests/lib/test_packets/ipx.cap +0 -0
  490. data/unittests/lib/test_packets/lldp.cap +0 -0
  491. data/unittests/lib/test_packets/lldp_over_ip.cap +0 -0
  492. data/unittests/lib/test_packets/tcp.cap +0 -0
  493. data/unittests/lib/test_packets/tcp_syn.cap +0 -0
  494. data/unittests/lib/test_packets/udp.cap +0 -0
  495. data/unittests/lib/test_packets/udp_frag_head.cap +0 -0
  496. data/unittests/lib/test_packets/udp_frag_next.cap +0 -0
  497. data/unittests/lib/test_packets/vtag_icmp_echo_rep.cap +0 -0
  498. data/unittests/lib/test_packets/vtag_icmp_echo_req.cap +0 -0
  499. data/unittests/lib/timer_test.c +248 -0
  500. data/unittests/lib/trema_private_test.c +323 -0
  501. data/unittests/lib/trema_test.c +985 -0
  502. data/unittests/lib/utility_test.c +628 -0
  503. data/unittests/lib/wrapper_test.c +201 -0
  504. data/unittests/packetin_filter/packetin_filter_test.c +477 -0
  505. data/unittests/switch_manager/switch_manager_test.c +1178 -0
  506. data/unittests/wrapper_stubs.c +39 -0
  507. data/vendor/.gitignore +6 -0
  508. data/vendor/README +30 -0
  509. data/vendor/cmockery-20110428.tar.gz +0 -0
  510. data/vendor/oflops-0.03.tar.gz +0 -0
  511. data/vendor/oflops_no_snmp+1.0.0.patch +340 -0
  512. data/vendor/openflow-1.0.0.tar.gz +0 -0
  513. data/vendor/openflow.git.tar.gz +0 -0
  514. data/vendor/openvswitch-1.2.2.tar.gz +0 -0
  515. data/vendor/ruby-ifconfig-1.2/COPYING +340 -0
  516. data/vendor/ruby-ifconfig-1.2/Changelog +16 -0
  517. data/vendor/ruby-ifconfig-1.2/INSTALL +239 -0
  518. data/vendor/ruby-ifconfig-1.2/README +38 -0
  519. data/vendor/ruby-ifconfig-1.2/Rakefile +14 -0
  520. data/vendor/ruby-ifconfig-1.2/TODO +8 -0
  521. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/darwin.txt +17 -0
  522. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/dragonflybsd.txt +10 -0
  523. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/dragonflybsd_netstat.txt +14 -0
  524. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/freebsd.txt +17 -0
  525. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/freebsd_netstat.txt +24 -0
  526. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/linux.txt +60 -0
  527. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/linux_ethernet.txt +20 -0
  528. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/netbsd.txt +10 -0
  529. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/openbsd.txt +36 -0
  530. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/sunos.txt +10 -0
  531. data/vendor/ruby-ifconfig-1.2/lib/ifconfig.rb +71 -0
  532. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/ifconfig.rb +72 -0
  533. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/interface_types.rb +69 -0
  534. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/network_types.rb +3 -0
  535. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/ifconfig.rb +84 -0
  536. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/interface_types.rb +130 -0
  537. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/network_types.rb +49 -0
  538. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/ifconfig.rb +43 -0
  539. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/interface_types.rb +112 -0
  540. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/network_types.rb +55 -0
  541. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/ifconfig.rb +38 -0
  542. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/interface_types.rb +77 -0
  543. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/network_types.rb +4 -0
  544. data/vendor/ruby-ifconfig-1.2/setup.rb +1306 -0
  545. data/vendor/ruby-ifconfig-1.2/test/test_bsd.rb +35 -0
  546. data/vendor/ruby-ifconfig-1.2/test/test_darwin.rb +33 -0
  547. data/vendor/ruby-ifconfig-1.2/test/test_dragonflybsd.rb +35 -0
  548. data/vendor/ruby-ifconfig-1.2/test/test_helper.rb +4 -0
  549. data/vendor/ruby-ifconfig-1.2/test/test_linux.rb +31 -0
  550. data/vendor/ruby-ifconfig-1.2/test/test_netbsd.rb +33 -0
  551. data/vendor/ruby-ifconfig-1.2/test/test_openbsd.rb +33 -0
  552. data/vendor/ruby-ifconfig-1.2/test/test_sunos.rb +35 -0
  553. data/vendor/ruby-ifconfig-1.2/test/unit/tc_darwin.rb +40 -0
  554. data/vendor/ruby-ifconfig-1.2/test/unit/tc_dragonflybsd.rb +39 -0
  555. data/vendor/ruby-ifconfig-1.2/test/unit/tc_freebsd.rb +40 -0
  556. data/vendor/ruby-ifconfig-1.2/test/unit/tc_linux.rb +49 -0
  557. data/vendor/ruby-ifconfig-1.2/test/unit/tc_netbsd.rb +39 -0
  558. data/vendor/ruby-ifconfig-1.2/test/unit/tc_openbsd.rb +39 -0
  559. data/vendor/ruby-ifconfig-1.2/test/unit/tc_sunos.rb +44 -0
  560. metadata +856 -0
@@ -0,0 +1,379 @@
1
+ /*
2
+ * Unit tests for message queue.
3
+ *
4
+ * Author: SUGYO Kazushi
5
+ *
6
+ * Copyright (C) 2012 NEC Corporation
7
+ *
8
+ * This program is free software; you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License, version 2, as
10
+ * published by the Free Software Foundation.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License along
18
+ * with this program; if not, write to the Free Software Foundation, Inc.,
19
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
+ */
21
+
22
+
23
+ #include <stdio.h>
24
+ #include <stdlib.h>
25
+ #include <string.h>
26
+ #include "checks.h"
27
+ #include "cmockery_trema.h"
28
+ #include "log.h"
29
+ #include "message_queue.h"
30
+ #include "wrapper.h"
31
+
32
+
33
+ /*************************************************************************
34
+ * Helper.
35
+ *************************************************************************/
36
+
37
+ // Setup and teardown function.
38
+
39
+ static void ( *original_die )( const char *format, ... );
40
+
41
+ static void
42
+ mock_die( const char *format, ... ) {
43
+ UNUSED( format );
44
+ mock_assert( false, "mock_die", __FILE__, __LINE__ ); } // Hoaxes gcov.
45
+
46
+
47
+ static void
48
+ setup() {
49
+ original_die = die;
50
+ die = mock_die;
51
+ }
52
+
53
+
54
+ static void
55
+ teardown() {
56
+ die = original_die;
57
+ }
58
+
59
+
60
+ /*************************************************************************
61
+ * create and delete tests.
62
+ *************************************************************************/
63
+
64
+ static void
65
+ test_create_and_delete_message_queue() {
66
+ message_queue *queue = create_message_queue();
67
+ assert_true( queue != NULL );
68
+ assert_int_equal( queue->length, 0 );
69
+
70
+ assert_true( delete_message_queue( queue ) );
71
+ }
72
+
73
+
74
+ static void
75
+ test_delete_message_queue_if_queue_is_not_created() {
76
+ message_queue *queue = NULL;
77
+ expect_assert_failure( delete_message_queue( queue ) );
78
+ }
79
+
80
+
81
+ static void
82
+ test_enqueue_and_delete_message_queue() {
83
+ message_queue *queue = create_message_queue();
84
+ assert_true( queue != NULL );
85
+ assert_int_equal( queue->length, 0 );
86
+
87
+ buffer *buf = alloc_buffer();
88
+ assert_true( enqueue_message( queue, buf ) );
89
+ assert_int_equal( queue->length, 1 );
90
+
91
+ assert_true( delete_message_queue( queue ) );
92
+ }
93
+
94
+
95
+ /*************************************************************************
96
+ * enqeue and dequeue tests.
97
+ *************************************************************************/
98
+
99
+ static void
100
+ test_enqueue_and_dequeue_message_queue() {
101
+ message_queue *queue = create_message_queue();
102
+ assert_true( queue != NULL );
103
+
104
+ buffer *enq_buf = alloc_buffer();
105
+ assert_true( enqueue_message( queue, enq_buf ) );
106
+ assert_int_equal( queue->length, 1 );
107
+
108
+ buffer *deq_buf = dequeue_message( queue );
109
+ assert_true( deq_buf == enq_buf );
110
+ free_buffer( deq_buf );
111
+ assert_int_equal( queue->length, 0 );
112
+
113
+ deq_buf = dequeue_message( queue );
114
+ assert_true( deq_buf == NULL );
115
+ assert_int_equal( queue->length, 0 );
116
+
117
+ assert_true( delete_message_queue( queue ) );
118
+ }
119
+
120
+
121
+ static void
122
+ test_multiple_queueing() {
123
+ message_queue *queue = create_message_queue();
124
+ assert_true( queue != NULL );
125
+
126
+ buffer *first_buf = alloc_buffer();
127
+ assert_true( enqueue_message( queue, first_buf ) );
128
+ assert_int_equal( queue->length, 1 );
129
+
130
+ buffer *deq_buf = dequeue_message( queue );
131
+ assert_true( deq_buf == first_buf );
132
+ free_buffer( deq_buf );
133
+ assert_int_equal( queue->length, 0 );
134
+
135
+
136
+ first_buf = alloc_buffer();
137
+ assert_true( enqueue_message( queue, first_buf ) );
138
+ assert_int_equal( queue->length, 1 );
139
+ buffer *second_buf = alloc_buffer();
140
+ assert_true( enqueue_message( queue, second_buf ) );
141
+ assert_int_equal( queue->length, 2 );
142
+
143
+ deq_buf = dequeue_message( queue );
144
+ assert_true( deq_buf == first_buf );
145
+ free_buffer( deq_buf );
146
+ assert_int_equal( queue->length, 1 );
147
+
148
+ buffer *third_buf = alloc_buffer();
149
+ assert_true( enqueue_message( queue, third_buf ) );
150
+ assert_int_equal( queue->length, 2 );
151
+ buffer *fourth_buf = alloc_buffer();
152
+ assert_true( enqueue_message( queue, fourth_buf ) );
153
+ assert_int_equal( queue->length, 3 );
154
+
155
+ deq_buf = dequeue_message( queue );
156
+ assert_true( deq_buf == second_buf );
157
+ free_buffer( deq_buf );
158
+ assert_int_equal( queue->length, 2 );
159
+ deq_buf = dequeue_message( queue );
160
+ assert_true( deq_buf == third_buf );
161
+ free_buffer( deq_buf );
162
+ assert_int_equal( queue->length, 1 );
163
+ deq_buf = dequeue_message( queue );
164
+ assert_true( deq_buf == fourth_buf );
165
+ free_buffer( deq_buf );
166
+ assert_int_equal( queue->length, 0 );
167
+
168
+
169
+ assert_true( delete_message_queue( queue ) );
170
+ }
171
+
172
+
173
+ static void
174
+ test_enqueue_message_if_queue_is_not_created() {
175
+ message_queue *queue = NULL;
176
+ buffer *enq_buf = alloc_buffer();
177
+ expect_assert_failure( enqueue_message( queue, enq_buf ) );
178
+ free_buffer( enq_buf );
179
+ }
180
+
181
+
182
+ static void
183
+ test_enqueue_message_if_message_is_NULL() {
184
+ message_queue *queue = create_message_queue();
185
+ assert_true( queue != NULL );
186
+ assert_int_equal( queue->length, 0 );
187
+
188
+ expect_assert_failure( enqueue_message( queue, NULL ) );
189
+
190
+ assert_true( delete_message_queue( queue ) );
191
+ }
192
+
193
+
194
+ static void
195
+ test_dequeue_message_if_queue_is_not_created() {
196
+ message_queue *queue = NULL;
197
+ expect_assert_failure( dequeue_message( queue ) );
198
+ }
199
+
200
+
201
+ /*************************************************************************
202
+ * peek tests.
203
+ *************************************************************************/
204
+
205
+ static void
206
+ test_peek_message() {
207
+ message_queue *queue = create_message_queue();
208
+ assert_true( queue != NULL );
209
+
210
+ buffer *peek_buf = peek_message( queue );
211
+ assert_true( peek_buf == NULL );
212
+
213
+ buffer *first_buf = alloc_buffer();
214
+ assert_true( enqueue_message( queue, first_buf ) );
215
+ assert_int_equal( queue->length, 1 );
216
+ buffer *second_buf = alloc_buffer();
217
+ assert_true( enqueue_message( queue, second_buf ) );
218
+ assert_int_equal( queue->length, 2 );
219
+ buffer *third_buf = alloc_buffer();
220
+ assert_true( enqueue_message( queue, third_buf ) );
221
+ assert_int_equal( queue->length, 3 );
222
+
223
+ peek_buf = peek_message( queue );
224
+ assert_true( peek_buf == first_buf );
225
+ buffer *deq_buf = dequeue_message( queue );
226
+ assert_true( deq_buf == first_buf );
227
+ free_buffer( deq_buf );
228
+ assert_int_equal( queue->length, 2 );
229
+
230
+ peek_buf = peek_message( queue );
231
+ assert_true( peek_buf == second_buf );
232
+ deq_buf = dequeue_message( queue );
233
+ assert_true( deq_buf == second_buf );
234
+ free_buffer( deq_buf );
235
+ assert_int_equal( queue->length, 1 );
236
+
237
+ peek_buf = peek_message( queue );
238
+ assert_true( peek_buf == third_buf );
239
+ deq_buf = dequeue_message( queue );
240
+ assert_true( deq_buf == third_buf );
241
+ free_buffer( deq_buf );
242
+ assert_int_equal( queue->length, 0 );
243
+
244
+ peek_buf = peek_message( queue );
245
+ assert_true( peek_buf == NULL );
246
+ deq_buf = dequeue_message( queue );
247
+ assert_true( deq_buf == NULL );
248
+ assert_int_equal( queue->length, 0 );
249
+
250
+ assert_true( delete_message_queue( queue ) );
251
+ }
252
+
253
+
254
+ static void
255
+ test_peek_message_if_queue_is_not_created() {
256
+ message_queue *queue = NULL;
257
+ expect_assert_failure( peek_message( queue ) );
258
+ }
259
+
260
+
261
+ /*************************************************************************
262
+ * foreach_message_queue tests.
263
+ *************************************************************************/
264
+
265
+
266
+ static int count = 0;
267
+
268
+ static void
269
+ test_foreach_message_queue_helper( buffer *message, void *user_data ) {
270
+ const char *str = message->data;
271
+ assert_string_equal( ( char * ) user_data, "user_data" );
272
+ switch ( ++count ) {
273
+ case 1:
274
+ assert_string_equal( str, "second_buffer" );
275
+ break;
276
+ case 2:
277
+ assert_string_equal( str, "third_buffer" );
278
+ break;
279
+ default:
280
+ assert_true( false );
281
+ break;
282
+ }
283
+ }
284
+
285
+
286
+ static void
287
+ append_string( buffer *buf, const char *str ) {
288
+ char *text = append_back_buffer( buf, strlen( str ) + 1 );
289
+ strcpy( text, str );
290
+ }
291
+
292
+
293
+ static void
294
+ test_foreach_message_queue() {
295
+ message_queue *queue = create_message_queue();
296
+ assert_true( queue != NULL );
297
+
298
+ buffer *first_buf = alloc_buffer();
299
+ append_string( first_buf, "first_buffer" );
300
+ assert_true( enqueue_message( queue, first_buf ) );
301
+ assert_int_equal( queue->length, 1 );
302
+ buffer *second_buf = alloc_buffer();
303
+ append_string( second_buf, "second_buffer" );
304
+ assert_true( enqueue_message( queue, second_buf ) );
305
+ assert_int_equal( queue->length, 2 );
306
+ buffer *third_buf = alloc_buffer();
307
+ append_string( third_buf, "third_buffer" );
308
+ assert_true( enqueue_message( queue, third_buf ) );
309
+ assert_int_equal( queue->length, 3 );
310
+
311
+ buffer *deq_buf = dequeue_message( queue );
312
+ assert_true( deq_buf == first_buf );
313
+
314
+ char *user_data = xstrdup( "user_data" );
315
+ count = 0;
316
+
317
+ foreach_message_queue( queue, test_foreach_message_queue_helper, user_data );
318
+
319
+ assert_int_equal( count, 2 );
320
+
321
+ xfree( user_data );
322
+ assert_true( delete_message_queue( queue ) );
323
+ }
324
+
325
+
326
+ static void
327
+ test_foreach_message_queue_if_queue_is_empty_helper( buffer *message, void *user_data ) {
328
+ UNUSED( message );
329
+ UNUSED( user_data );
330
+ assert_true( false );
331
+ }
332
+
333
+
334
+ static void
335
+ test_foreach_message_queue_if_queue_is_empty() {
336
+ message_queue *queue = create_message_queue();
337
+ assert_true( queue != NULL );
338
+
339
+ char *user_data = xstrdup( "user_data" );
340
+ foreach_message_queue( queue, test_foreach_message_queue_if_queue_is_empty_helper, user_data );
341
+
342
+ assert_int_equal( count, 2 );
343
+
344
+ xfree( user_data );
345
+ assert_true( delete_message_queue( queue ) );
346
+ }
347
+
348
+
349
+ /*************************************************************************
350
+ * Run tests.
351
+ *************************************************************************/
352
+
353
+ int
354
+ main() {
355
+ const UnitTest tests[] = {
356
+ unit_test_setup_teardown( test_create_and_delete_message_queue, setup, teardown ),
357
+ unit_test_setup_teardown( test_delete_message_queue_if_queue_is_not_created, setup, teardown ),
358
+ unit_test_setup_teardown( test_enqueue_and_delete_message_queue, setup, teardown ),
359
+ unit_test_setup_teardown( test_enqueue_and_dequeue_message_queue, setup, teardown ),
360
+ unit_test_setup_teardown( test_multiple_queueing, setup, teardown ),
361
+ unit_test_setup_teardown( test_enqueue_message_if_queue_is_not_created, setup, teardown ),
362
+ unit_test_setup_teardown( test_enqueue_message_if_message_is_NULL, setup, teardown ),
363
+ unit_test_setup_teardown( test_dequeue_message_if_queue_is_not_created, setup, teardown ),
364
+ unit_test_setup_teardown( test_peek_message, setup, teardown ),
365
+ unit_test_setup_teardown( test_peek_message_if_queue_is_not_created, setup, teardown ),
366
+ unit_test_setup_teardown( test_foreach_message_queue, setup, teardown ),
367
+ unit_test_setup_teardown( test_foreach_message_queue_if_queue_is_empty, setup, teardown ),
368
+ };
369
+
370
+ return run_tests( tests );
371
+ }
372
+
373
+
374
+ /*
375
+ * Local variables:
376
+ * c-basic-offset: 2
377
+ * indent-tabs-mode: nil
378
+ * End:
379
+ */
@@ -0,0 +1,438 @@
1
+ /*
2
+ * Unit tests for Trema messenger.
3
+ *
4
+ * Author: Toshio Koide
5
+ *
6
+ * Copyright (C) 2008-2012 NEC Corporation
7
+ *
8
+ * This program is free software; you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License, version 2, as
10
+ * published by the Free Software Foundation.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License along
18
+ * with this program; if not, write to the Free Software Foundation, Inc.,
19
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
+ */
21
+
22
+
23
+ #include <arpa/inet.h>
24
+ #include <errno.h>
25
+ #include <linux/limits.h>
26
+ #include <stdio.h>
27
+ #include <stdlib.h>
28
+ #include <sys/socket.h>
29
+ #include <sys/types.h>
30
+ #include <sys/un.h>
31
+ #include <time.h>
32
+ #include <unistd.h>
33
+ #include "checks.h"
34
+ #include "cmockery_trema.h"
35
+ #include "doubly_linked_list.h"
36
+ #include "hash_table.h"
37
+ #include "event_handler.h"
38
+ #include "messenger.h"
39
+ #include "timer.h"
40
+ #include "wrapper.h"
41
+
42
+
43
+ #define static extern
44
+
45
+
46
+ enum {
47
+ MESSAGE_TYPE_NOTIFY,
48
+ MESSAGE_TYPE_REQUEST,
49
+ MESSAGE_TYPE_REPLY,
50
+ };
51
+
52
+ typedef struct message_buffer {
53
+ void *buffer;
54
+ size_t data_length;
55
+ size_t size;
56
+ } message_buffer;
57
+
58
+ typedef struct messenger_socket {
59
+ int fd;
60
+ } messenger_socket;
61
+
62
+ typedef struct messenger_context {
63
+ uint32_t transaction_id;
64
+ int life_count;
65
+ void *user_data;
66
+ } messenger_context;
67
+
68
+ typedef struct receive_queue_callback {
69
+ void *function;
70
+ uint8_t message_type;
71
+ } receive_queue_callback;
72
+
73
+ typedef struct receive_queue {
74
+ char service_name[ MESSENGER_SERVICE_NAME_LENGTH ];
75
+ dlist_element *message_callbacks;
76
+ int listen_socket;
77
+ struct sockaddr_un listen_addr;
78
+ dlist_element *client_sockets;
79
+ message_buffer *buffer;
80
+ } receive_queue;
81
+
82
+ typedef struct send_queue {
83
+ char service_name[ MESSENGER_SERVICE_NAME_LENGTH ];
84
+ int server_socket;
85
+ int refused_count;
86
+ struct timespec reconnect_at;
87
+ struct sockaddr_un server_addr;
88
+ message_buffer *buffer;
89
+ } send_queue;
90
+
91
+
92
+ static void send_dump_message( uint16_t dump_type, const char *service_name, const void *data, uint32_t data_len );
93
+
94
+ static bool run_once( void );
95
+
96
+ static void on_accept( int fd, receive_queue *queue );
97
+ static void on_recv( int fd, receive_queue *queue );
98
+ static void on_send( int fd, send_queue *queue );
99
+
100
+ static receive_queue *create_receive_queue( const char *service_name );
101
+ static void delete_all_receive_queues( void );
102
+ static void delete_receive_queue( void *service_name, void *queue, void *user_data );
103
+ static int pull_from_recv_queue( receive_queue *queue, uint8_t *message_type, uint16_t *tag, void *data, size_t *len, size_t maxlen );
104
+ static void set_recv_queue_fd_set( fd_set *read_set );
105
+ static void check_recv_queue_fd_isset( fd_set *read_set );
106
+ static void add_recv_queue_client_fd( receive_queue *queue, int fd );
107
+ static int del_recv_queue_client_fd( receive_queue *queue, int fd );
108
+ static void call_message_callbacks( receive_queue *rq, const uint8_t message_type, const uint16_t tag, void *data, size_t len );
109
+
110
+ static send_queue *create_send_queue( const char *service_name );
111
+ static int send_queue_connect( send_queue *queue );
112
+ static void delete_all_send_queues( void );
113
+ static void delete_send_queue( send_queue *sq );
114
+ static void number_of_send_queue( int *connected_count, int *sending_count, int *reconnecting_count, int *closed_count );
115
+ static bool push_message_to_send_queue( const char *service_name, const uint8_t message_type, const uint16_t tag, const void *data, size_t len );
116
+ static void set_send_queue_fd_set( fd_set *read_set, fd_set *write_set );
117
+ static void check_send_queue_fd_isset( fd_set *read_set, fd_set *write_set );
118
+
119
+ static message_buffer *create_message_buffer( size_t size );
120
+ static bool write_message_buffer( message_buffer *buf, const void *data, size_t len );
121
+ static void truncate_message_buffer( message_buffer *buf, size_t len );
122
+ static void free_message_buffer( message_buffer *buf );
123
+ static size_t message_buffer_remain_bytes( message_buffer *buf );
124
+
125
+ static void delete_timer_callbacks( void );
126
+
127
+ static messenger_context* insert_context( void *user_data );
128
+ static messenger_context* get_context( uint32_t transaction_id );
129
+ static void delete_context( messenger_context *context );
130
+ static void delete_context_db( void );
131
+ static void age_context_db( void * );
132
+
133
+ static const uint32_t messenger_buffer_length;
134
+
135
+ static char socket_directory[ PATH_MAX ];
136
+ static bool running;
137
+ static bool initialized;
138
+ static bool finalized;
139
+ static hash_table *receive_queues;
140
+ static hash_table *send_queues;
141
+ static hash_table *context_db;
142
+ static dlist_element *timer_callbacks;
143
+ static char *_dump_service_name;
144
+ static char *_dump_app_name;
145
+ static uint32_t last_transaction_id;
146
+
147
+
148
+
149
+ #undef static
150
+
151
+
152
+ #define SERVICE_NAME1 "test1"
153
+ #define SERVICE_NAME2 "test2"
154
+ #define MESSAGE1 "message1"
155
+ #define MESSAGE2 "message2"
156
+ #define MESSAGE_TYPE1 1234
157
+ #define DUMP_SERVICE_NAME "dump"
158
+ #define DUMP_APP_NAME "appname"
159
+ #define TAG1 1
160
+ #define TAG2 2
161
+ #define CONTEXT_DATA "context data"
162
+
163
+
164
+ /********************************************************************************
165
+ * Mocks.
166
+ ********************************************************************************/
167
+
168
+ void
169
+ mock_execute_timer_events( int *next_timeout_usec ) {
170
+ UNUSED( next_timeout_usec );
171
+ // Do nothing.
172
+ }
173
+
174
+
175
+ bool
176
+ mock_add_periodic_event_callback( const time_t seconds, void ( *callback )( void *user_data ), void *user_data ) {
177
+ UNUSED( seconds );
178
+ UNUSED( callback );
179
+ UNUSED( user_data );
180
+ return true;
181
+ }
182
+
183
+
184
+ static bool fail_mock_socket = false;
185
+ int
186
+ mock_socket( int domain, int type, int protocol ) {
187
+ return fail_mock_socket ? -1 : socket( domain, type, protocol );
188
+ }
189
+
190
+
191
+ static bool fail_mock_bind = false;
192
+ int
193
+ mock_bind( int sockfd, const struct sockaddr *addr, socklen_t addrlen ) {
194
+ return fail_mock_bind ? -1 : bind( sockfd, addr, addrlen );
195
+ }
196
+
197
+
198
+ static bool fail_mock_listen = false;
199
+ int
200
+ mock_listen( int sockfd, int backlog ) {
201
+ return fail_mock_listen ? -1 :listen( sockfd, backlog );
202
+ }
203
+
204
+
205
+ static bool fail_mock_close = false;
206
+ int
207
+ mock_close( int fd ) {
208
+ return fail_mock_close ? -1 : close( fd );
209
+ }
210
+
211
+
212
+ static bool fail_mock_connect = false;
213
+ int
214
+ mock_connect( int sockfd, const struct sockaddr *addr, socklen_t addrlen ) {
215
+ return fail_mock_connect ? -1 : connect( sockfd, addr, addrlen );
216
+ }
217
+
218
+
219
+ static bool fail_mock_select = false;
220
+ int
221
+ mock_select( int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout ) {
222
+ return fail_mock_select ? -1 : select( nfds, readfds, writefds, exceptfds, timeout );
223
+ }
224
+
225
+
226
+ static bool fail_mock_accept = false;
227
+ int
228
+ mock_accept( int sockfd, struct sockaddr *addr, socklen_t *addrlen ) {
229
+ return fail_mock_accept ? -1 : accept( sockfd, addr, addrlen );
230
+ }
231
+
232
+
233
+ static bool fail_mock_recv = false;
234
+ ssize_t
235
+ mock_recv( int sockfd, void *buf, size_t len, int flags ) {
236
+ return fail_mock_recv ? -1 : recv( sockfd, buf, len, flags );
237
+ }
238
+
239
+
240
+ static bool fail_mock_send = false;
241
+ ssize_t
242
+ mock_send( int sockfd, const void *buf, size_t len, int flags ) {
243
+ return fail_mock_send ? -1 : send( sockfd, buf, len, flags );
244
+ }
245
+
246
+
247
+ int
248
+ mock_setsockopt( int s, int level, int optname, const void *optval, socklen_t optlen ) {
249
+ UNUSED( s );
250
+ UNUSED( level );
251
+ UNUSED( optname );
252
+ UNUSED( optval );
253
+ UNUSED( optlen );
254
+ return 0;
255
+ }
256
+
257
+
258
+ int
259
+ mock_clock_gettime( clockid_t clk_id, struct timespec *tp ) {
260
+ UNUSED( clk_id );
261
+ UNUSED( tp );
262
+
263
+ return ( int ) mock();
264
+ }
265
+
266
+
267
+ void
268
+ mock_die( char *format, ... ) {
269
+ UNUSED( format );
270
+ }
271
+
272
+
273
+ void
274
+ mock_error( char *format, ... ) {
275
+ UNUSED( format );
276
+ }
277
+
278
+
279
+ void
280
+ mock_debug( char *format, ... ) {
281
+ UNUSED( format );
282
+ }
283
+
284
+
285
+ void
286
+ mock_warn( char *format, ... ) {
287
+ UNUSED( format );
288
+ }
289
+
290
+
291
+ /********************************************************************************
292
+ * Callbacks.
293
+ ********************************************************************************/
294
+
295
+ void
296
+ message_requested_callback( const messenger_context_handle *handle, uint16_t tag, void *data, size_t len ) {
297
+ assert_true( handle != NULL );
298
+ assert_int_equal( tag, TAG1 );
299
+ assert_string_equal( data, MESSAGE1 );
300
+ assert_int_equal( ( int ) len, strlen( MESSAGE1 ) + 1 );
301
+ assert_true( send_reply_message( handle, TAG2, MESSAGE2, strlen( MESSAGE2 ) + 1 ) );
302
+ }
303
+
304
+
305
+ void
306
+ message_replied_callback( uint16_t tag, void *data, size_t len, void *user_data ) {
307
+ assert_int_equal( tag, TAG2 );
308
+ assert_string_equal( data, MESSAGE2 );
309
+ assert_int_equal( ( int ) len, strlen( MESSAGE2 ) + 1 );
310
+ assert_string_equal( user_data, CONTEXT_DATA );
311
+ xfree( user_data );
312
+
313
+ stop_event_handler();
314
+ assert_true( stop_messenger() );
315
+ }
316
+
317
+
318
+ /********************************************************************************
319
+ * Helpers.
320
+ ********************************************************************************/
321
+
322
+ static void
323
+ reset_messenger() {
324
+ initialized = false;
325
+ finalized = false;
326
+
327
+ execute_timer_events = mock_execute_timer_events;
328
+ }
329
+
330
+
331
+ /********************************************************************************
332
+ * Init and finalize messenger tests.
333
+ ********************************************************************************/
334
+
335
+ static void
336
+ test_init_and_finalize() {
337
+ assert_true( init_messenger( "/tmp" ) );
338
+ assert_true( finalize_messenger() );
339
+ }
340
+
341
+
342
+ static void
343
+ test_init_twice() {
344
+ assert_true( init_messenger( "/tmp" ) );
345
+ assert_true( init_messenger( "/tmp" ) );
346
+
347
+ finalize_messenger();
348
+ }
349
+
350
+
351
+ static void
352
+ test_finalize_twice() {
353
+ init_messenger( "/tmp" );
354
+
355
+ assert_true( finalize_messenger() );
356
+ assert_false( finalize_messenger() );
357
+ }
358
+
359
+
360
+ static void
361
+ test_finalize_without_init() {
362
+ assert_false( finalize_messenger() );
363
+ }
364
+
365
+
366
+ /********************************************************************************
367
+ * Message callback tests.
368
+ ********************************************************************************/
369
+
370
+ static void
371
+ callback_hello( uint16_t tag, void *data, size_t len ) {
372
+ check_expected( tag );
373
+ check_expected( data );
374
+ check_expected( len );
375
+
376
+ stop_event_handler();
377
+ stop_messenger();
378
+ }
379
+
380
+
381
+ static void
382
+ test_send_then_message_received_callback_is_called() {
383
+ init_messenger( "/tmp" );
384
+
385
+ const char service_name[] = "Say HELLO";
386
+
387
+ expect_value( callback_hello, tag, 43556 );
388
+ expect_string( callback_hello, data, "HELLO" );
389
+ expect_value( callback_hello, len, 6 );
390
+
391
+ add_message_received_callback( service_name, callback_hello );
392
+ send_message( service_name, 43556, "HELLO", strlen( "HELLO" ) + 1 );
393
+ start_messenger();
394
+ start_event_handler();
395
+
396
+ delete_message_received_callback( service_name, callback_hello );
397
+ delete_send_queue( lookup_hash_entry( send_queues, service_name ) );
398
+
399
+ finalize_messenger();
400
+ }
401
+
402
+
403
+ /********************************************************************************
404
+ * Run tests.
405
+ ********************************************************************************/
406
+
407
+ int
408
+ main() {
409
+ const UnitTest tests[] = {
410
+ // init and finalize messenger tests.
411
+ unit_test_setup_teardown( test_init_and_finalize,
412
+ reset_messenger,
413
+ reset_messenger ),
414
+ unit_test_setup_teardown( test_init_twice,
415
+ reset_messenger,
416
+ reset_messenger ),
417
+ unit_test_setup_teardown( test_finalize_twice,
418
+ reset_messenger,
419
+ reset_messenger ),
420
+ unit_test_setup_teardown( test_finalize_without_init,
421
+ reset_messenger,
422
+ reset_messenger ),
423
+
424
+ // Message callback tests.
425
+ unit_test_setup_teardown( test_send_then_message_received_callback_is_called,
426
+ reset_messenger,
427
+ reset_messenger ),
428
+ };
429
+ return run_tests( tests );
430
+ }
431
+
432
+
433
+ /*
434
+ * Local variables:
435
+ * c-basic-offset: 2
436
+ * indent-tabs-mode: nil
437
+ * End:
438
+ */