trema 0.2.5 → 0.2.6

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 (292) hide show
  1. data/.gitignore +1 -1
  2. data/Doxyfile +1 -1
  3. data/Gemfile +18 -6
  4. data/README.md +112 -5
  5. data/Rakefile +3 -1
  6. data/Rantfile +88 -1
  7. data/bin/trema +248 -0
  8. data/bin/trema-config +59 -0
  9. data/cruise.rb +1 -1
  10. data/features/example.dumper.feature +45 -65
  11. data/features/example.hello_trema.feature +21 -0
  12. data/features/example.learning_switch.feature +26 -28
  13. data/features/example.list_switches.feature +19 -33
  14. data/features/example.message.echo_reply.feature +10 -10
  15. data/features/example.message.echo_request.feature +2 -2
  16. data/features/example.message.features_request.feature +6 -5
  17. data/features/example.message.hello.feature +47 -13
  18. data/features/example.message.set_config.feature +4 -4
  19. data/features/example.message.vendor-action.feature +23 -0
  20. data/features/example.multi_learning_switch.feature +14 -42
  21. data/features/example.packet_in.feature +31 -0
  22. data/features/example.packetin_filter_config.feature +11 -7
  23. data/features/example.patch_panel.feature +29 -0
  24. data/features/example.repeater_hub.feature +43 -40
  25. data/features/example.switch_info.feature +51 -0
  26. data/features/example.switch_monitor.feature +24 -42
  27. data/features/packetin_filter.feature +28 -22
  28. data/features/step_definitions/misc_steps.rb +19 -8
  29. data/features/step_definitions/send_packets_steps.rb +1 -10
  30. data/features/step_definitions/stats_steps.rb +4 -4
  31. data/features/support/env.rb +2 -1
  32. data/features/support/hooks.rb +35 -2
  33. data/features/switch_manager.feature +18 -12
  34. data/features/trema-config.feature +26 -39
  35. data/features/trema.dump_flows.feature +26 -12
  36. data/features/trema.help.feature +26 -0
  37. data/features/trema.kill.feature +39 -41
  38. data/features/trema.killall.feature +23 -23
  39. data/features/trema.reset_stats.feature +50 -10
  40. data/features/trema.run.feature +28 -39
  41. data/features/trema.send_packets.feature +29 -40
  42. data/features/trema.show_stats.feature +30 -33
  43. data/features/trema.up.feature +33 -0
  44. data/features/trema.version.feature +9 -0
  45. data/ruby/extconf.rb +7 -0
  46. data/ruby/trema/aggregate-stats-reply.rb +3 -3
  47. data/ruby/trema/app.rb +5 -1
  48. data/ruby/trema/barrier-request.c +55 -30
  49. data/ruby/trema/cli.rb +8 -8
  50. data/ruby/trema/command.rb +1 -3
  51. data/ruby/trema/command/dump_flows.rb +5 -24
  52. data/ruby/trema/command/kill.rb +31 -36
  53. data/ruby/trema/command/killall.rb +1 -19
  54. data/{features/step_definitions/kill_steps.rb → ruby/trema/command/netns.rb} +13 -5
  55. data/ruby/trema/command/reset_stats.rb +3 -23
  56. data/ruby/trema/command/ruby.rb +2 -19
  57. data/ruby/trema/command/run.rb +6 -27
  58. data/ruby/trema/command/send_packets.rb +6 -90
  59. data/ruby/trema/command/show_stats.rb +21 -40
  60. data/ruby/trema/command/up.rb +5 -26
  61. data/ruby/trema/command/version.rb +1 -5
  62. data/ruby/trema/controller.c +14 -16
  63. data/ruby/trema/custom-switch.rb +56 -0
  64. data/ruby/trema/desc-stats-reply.rb +5 -5
  65. data/ruby/trema/dsl/configuration.rb +4 -0
  66. data/{features/step_definitions/up_steps.rb → ruby/trema/dsl/custom-switch.rb} +18 -4
  67. data/ruby/trema/dsl/netns.rb +78 -0
  68. data/ruby/trema/dsl/parser.rb +2 -0
  69. data/ruby/trema/dsl/runner.rb +8 -0
  70. data/ruby/trema/dsl/syntax.rb +18 -0
  71. data/ruby/trema/echo-reply.h +2 -2
  72. data/ruby/trema/echo-request.c +3 -5
  73. data/ruby/trema/enqueue.rb +2 -2
  74. data/ruby/trema/error.c +3 -3
  75. data/ruby/trema/executables.rb +26 -2
  76. data/ruby/trema/features-request.c +3 -5
  77. data/ruby/trema/flow-removed.c +6 -6
  78. data/ruby/trema/flow-stats-reply.rb +6 -8
  79. data/ruby/trema/flow.rb +12 -1
  80. data/ruby/trema/get-config-request.c +55 -28
  81. data/ruby/trema/hello.c +3 -5
  82. data/ruby/trema/host.rb +8 -0
  83. data/ruby/trema/list-switches-reply.c +1 -1
  84. data/ruby/trema/mac.rb +1 -1
  85. data/ruby/trema/match.c +15 -14
  86. data/ruby/trema/monkey-patch/module/deprecation.rb +0 -2
  87. data/ruby/trema/netns.rb +127 -0
  88. data/ruby/trema/ordered-hash.rb +5 -4
  89. data/ruby/trema/packet-in.c +136 -113
  90. data/ruby/trema/packet-queue.rb +9 -9
  91. data/ruby/trema/packetin-filter.rb +1 -1
  92. data/ruby/trema/phost.rb +16 -7
  93. data/ruby/trema/port-mod.c +6 -5
  94. data/ruby/trema/port-stats-reply.rb +2 -2
  95. data/ruby/trema/process.rb +29 -0
  96. data/ruby/trema/queue-stats-reply.rb +2 -4
  97. data/ruby/trema/send-out-port.rb +5 -3
  98. data/ruby/trema/set-eth-addr.rb +4 -0
  99. data/ruby/trema/set-ip-addr.rb +4 -2
  100. data/ruby/trema/set-ip-dst-addr.rb +2 -1
  101. data/ruby/trema/set-ip-src-addr.rb +2 -1
  102. data/ruby/trema/set-ip-tos.rb +3 -2
  103. data/ruby/trema/set-transport-port.rb +3 -2
  104. data/ruby/trema/set-vlan-priority.rb +3 -2
  105. data/ruby/trema/set-vlan-vid.rb +5 -4
  106. data/ruby/trema/shell/reset_stats.rb +2 -1
  107. data/ruby/trema/shell/run.rb +1 -1
  108. data/ruby/trema/shell/send_packets.rb +1 -1
  109. data/ruby/trema/shell/show_stats.rb +1 -1
  110. data/ruby/trema/stats-helper.rb +3 -3
  111. data/ruby/trema/stats-reply.c +26 -17
  112. data/ruby/trema/stats-request.c +39 -41
  113. data/ruby/trema/switch-daemon.rb +36 -31
  114. data/ruby/trema/switch.c +1 -1
  115. data/ruby/trema/table-stats-reply.rb +1 -1
  116. data/ruby/trema/timers.rb +13 -13
  117. data/ruby/trema/trema.c +3 -3
  118. data/ruby/trema/tremashark.rb +9 -2
  119. data/ruby/trema/util.rb +39 -15
  120. data/ruby/trema/vendor-action.rb +8 -3
  121. data/ruby/trema/vendor-stats-reply.rb +4 -6
  122. data/ruby/trema/vendor.c +1 -1
  123. data/ruby/trema/version.rb +1 -1
  124. data/spec/trema/barrier-request_spec.rb +47 -37
  125. data/spec/trema/controller_spec.rb +1 -0
  126. data/spec/trema/dsl/runner_spec.rb +8 -3
  127. data/spec/trema/dsl/vhost_spec.rb +8 -8
  128. data/spec/trema/echo-request_spec.rb +1 -0
  129. data/spec/trema/features-request_spec.rb +1 -0
  130. data/spec/trema/flow-removed_spec.rb +9 -9
  131. data/spec/trema/get-config-request_spec.rb +51 -39
  132. data/spec/trema/match_spec.rb +1 -1
  133. data/spec/trema/openflow-error_spec.rb +11 -11
  134. data/spec/trema/packet-out_spec.rb +5 -5
  135. data/spec/trema/queue-get-config-reply_spec.rb +1 -1
  136. data/spec/trema/queue-get-config-request_spec.rb +1 -1
  137. data/spec/trema/set-eth-dst-addr_spec.rb +1 -1
  138. data/spec/trema/set-eth-src-addr_spec.rb +1 -1
  139. data/spec/trema/set-ip-dst-addr_spec.rb +1 -0
  140. data/spec/trema/set-ip-src-addr_spec.rb +1 -0
  141. data/spec/trema/set-ip-tos_spec.rb +1 -0
  142. data/spec/trema/set-transport-dst-port_spec.rb +1 -0
  143. data/spec/trema/set-transport-src-port_spec.rb +1 -0
  144. data/spec/trema/set-vlan-priority_spec.rb +1 -0
  145. data/spec/trema/set-vlan-vid_spec.rb +2 -1
  146. data/spec/trema/stats-reply_spec.rb +38 -36
  147. data/spec/trema/stats-request_spec.rb +6 -6
  148. data/spec/trema/strip-vlan-header_spec.rb +1 -0
  149. data/spec/trema/util_spec.rb +3 -2
  150. data/spec/trema/vendor-action_spec.rb +9 -8
  151. data/src/examples/dumper/dumper.c +8 -6
  152. data/src/examples/dumper/dumper.rb +1 -1
  153. data/{features/step_definitions/killall_steps.rb → src/examples/hello_trema/hello-trema.rb} +6 -5
  154. data/src/examples/hello_trema/hello_trema.c +4 -4
  155. data/src/examples/learning_switch/learning_switch.c +1 -1
  156. data/src/examples/list_switches/list_switches.c +2 -2
  157. data/src/examples/match_compare/match-compare.rb +2 -2
  158. data/src/examples/multi_learning_switch/multi-learning-switch.rb +1 -1
  159. data/src/examples/multi_learning_switch/multi_learning_switch.c +3 -3
  160. data/src/examples/openflow_message/README +1 -1
  161. data/src/examples/openflow_message/echo-request.rb +1 -1
  162. data/src/examples/openflow_message/features_request.c +21 -21
  163. data/src/examples/openflow_message/hello.c +1 -3
  164. data/src/examples/openflow_message/hello.rb +9 -24
  165. data/src/examples/{hello_trema/hello_trema.rb → openflow_message/vendor-action.rb} +17 -7
  166. data/src/examples/openflow_message/vendor_action.c +105 -0
  167. data/src/examples/openflow_switch/hello_switch.c +81 -0
  168. data/src/examples/packet_in/packet-in.rb +9 -13
  169. data/src/examples/packetin_filter_config/packetin_filter_config.c +2 -2
  170. data/src/examples/patch_panel/network.conf +14 -0
  171. data/src/examples/patch_panel/patch-panel.conf +1 -0
  172. data/{features/step_definitions/show_stats_steps.rb → src/examples/patch_panel/patch-panel.rb} +29 -13
  173. data/src/examples/switch_info/{switch_info.rb → switch-info.rb} +2 -2
  174. data/src/examples/switch_info/switch_info.c +4 -4
  175. data/src/examples/switch_monitor/switch_monitor.c +3 -3
  176. data/src/examples/traffic_monitor/counter.c +9 -9
  177. data/src/examples/traffic_monitor/fdb.c +9 -9
  178. data/src/lib/arp.h +1 -1
  179. data/src/lib/buffer.c +4 -3
  180. data/src/lib/byteorder.c +31 -5
  181. data/src/lib/byteorder.h +2 -2
  182. data/src/lib/chibach.c +8 -6
  183. data/src/lib/daemon.c +29 -3
  184. data/src/lib/doubly_linked_list.c +6 -1
  185. data/src/lib/ether.c +1 -1
  186. data/src/lib/ether.h +1 -1
  187. data/src/lib/event_handler.c +3 -3
  188. data/src/lib/hash_table.c +1 -1
  189. data/src/lib/linked_list.c +50 -2
  190. data/src/lib/linked_list.h +2 -2
  191. data/src/lib/log.c +122 -22
  192. data/src/lib/log.h +13 -9
  193. data/src/lib/management_interface.c +361 -0
  194. data/src/lib/management_interface.h +42 -0
  195. data/src/lib/management_service_interface.c +104 -0
  196. data/src/lib/management_service_interface.h +136 -0
  197. data/src/lib/match_table.c +5 -5
  198. data/src/lib/message_queue.c +5 -3
  199. data/src/lib/message_queue.h +1 -1
  200. data/src/lib/messenger.c +73 -39
  201. data/src/lib/messenger.h +3 -2
  202. data/src/lib/openflow_application_interface.c +17 -17
  203. data/src/lib/openflow_message.c +175 -23
  204. data/src/lib/openflow_message.h +2 -1
  205. data/src/lib/openflow_switch_interface.c +12 -12
  206. data/src/lib/packet_parser.c +11 -32
  207. data/src/lib/packetin_filter_interface.c +5 -5
  208. data/src/lib/persistent_storage.c +7 -7
  209. data/src/lib/secure_channel.c +6 -6
  210. data/src/lib/secure_channel.h +1 -1
  211. data/src/lib/stat.c +54 -17
  212. data/src/lib/stat.h +9 -0
  213. data/src/lib/timer.c +11 -10
  214. data/src/lib/trema.c +38 -9
  215. data/src/lib/trema.h +1 -0
  216. data/src/lib/trema_private.h +6 -0
  217. data/src/lib/trema_wrapper.c +4 -4
  218. data/src/lib/trema_wrapper.h +10 -10
  219. data/src/lib/utility.c +6 -6
  220. data/src/management/application.c +224 -0
  221. data/src/management/echo.c +185 -0
  222. data/src/management/set_logging_level.c +153 -0
  223. data/src/management/show_stats.c +150 -0
  224. data/src/management/trema_manager +184 -0
  225. data/src/packetin_filter/packetin_filter.c +31 -29
  226. data/src/switch_manager/cookie_table.c +7 -7
  227. data/src/switch_manager/dpid_table.c +3 -3
  228. data/src/switch_manager/dpid_table.h +0 -1
  229. data/src/switch_manager/management_interface.h +0 -1
  230. data/src/switch_manager/ofpmsg_recv.c +3 -3
  231. data/src/switch_manager/ofpmsg_recv.h +0 -1
  232. data/src/switch_manager/ofpmsg_send.c +2 -2
  233. data/src/switch_manager/ofpmsg_send.h +0 -1
  234. data/src/switch_manager/secure_channel_listener.c +2 -2
  235. data/src/switch_manager/secure_channel_receiver.c +2 -2
  236. data/src/switch_manager/secure_channel_receiver.h +0 -1
  237. data/src/switch_manager/secure_channel_sender.c +8 -1
  238. data/src/switch_manager/service_interface.c +5 -4
  239. data/src/switch_manager/switch.c +79 -53
  240. data/src/switch_manager/switch_manager.c +24 -22
  241. data/src/switch_manager/xid_table.c +6 -6
  242. data/src/switch_manager/xid_table.h +0 -1
  243. data/src/tremashark/README +4 -3
  244. data/src/tremashark/packet_capture.c +11 -9
  245. data/src/tremashark/pcap_queue.c +2 -2
  246. data/src/tremashark/pcap_queue.h +2 -2
  247. data/src/tremashark/plugin/packet-trema/Makefile +1 -1
  248. data/src/tremashark/plugin/packet-trema/Makefile.common +1 -1
  249. data/src/tremashark/plugin/packet-trema/packet-trema.c +50 -37
  250. data/src/tremashark/queue.c +5 -4
  251. data/src/tremashark/queue.h +1 -1
  252. data/src/tremashark/stdin_relay.c +10 -8
  253. data/src/tremashark/syslog_relay.c +14 -12
  254. data/src/tremashark/tremashark.c +15 -18
  255. data/trema +2 -96
  256. data/trema-config +2 -52
  257. data/trema.gemspec +12 -1
  258. data/unittests/cmockery_trema.h +14 -13
  259. data/unittests/lib/buffer_test.c +1 -1
  260. data/unittests/lib/byteorder_test.c +108 -25
  261. data/unittests/lib/daemon_test.c +141 -5
  262. data/unittests/lib/doubly_linked_list_test.c +5 -1
  263. data/unittests/lib/ether_test.c +4 -4
  264. data/unittests/lib/hash_table_test.c +5 -3
  265. data/unittests/lib/linked_list_test.c +82 -4
  266. data/unittests/lib/log_test.c +96 -5
  267. data/unittests/lib/management_interface_test.c +240 -0
  268. data/unittests/lib/management_service_interface_test.c +319 -0
  269. data/unittests/lib/message_queue_test.c +6 -2
  270. data/unittests/lib/messenger_test.c +167 -2
  271. data/unittests/lib/openflow_application_interface_test.c +16 -22
  272. data/unittests/lib/openflow_message_test.c +721 -24
  273. data/unittests/lib/packet_info_test.c +2 -2
  274. data/unittests/lib/packet_parser_test.c +15 -16
  275. data/unittests/lib/packetin_filter_interface_test.c +6 -6
  276. data/unittests/lib/persistent_storage_test.c +11 -11
  277. data/unittests/lib/stat_test.c +151 -7
  278. data/unittests/lib/timer_test.c +1 -1
  279. data/unittests/lib/trema_private_test.c +2 -2
  280. data/unittests/lib/trema_test.c +40 -12
  281. data/unittests/lib/utility_test.c +3 -3
  282. data/unittests/lib/wrapper_test.c +3 -3
  283. data/unittests/packetin_filter/packetin_filter_test.c +12 -11
  284. data/unittests/switch_manager/switch_manager_test.c +29 -22
  285. metadata +99 -20
  286. data/features/step_definitions/log_steps.rb +0 -90
  287. data/features/step_definitions/run_steps.rb +0 -91
  288. data/features/trema.feature +0 -27
  289. data/features/tutorial.hello_trema.feature +0 -27
  290. data/features/tutorial.packet_in.feature +0 -47
  291. data/features/tutorial.switch_info.feature +0 -55
  292. data/ruby/trema/command/usage.rb +0 -63
@@ -0,0 +1,240 @@
1
+ /*
2
+ * Unit tests for management_interface.[ch]
3
+ *
4
+ * Author: Yasunobu Chiba
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 <setjmp.h>
24
+ #include <stdarg.h>
25
+ #include <stdint.h>
26
+ #include <stdio.h>
27
+ #include <stdlib.h>
28
+ #include <string.h>
29
+ #include <unistd.h>
30
+ #include "management_interface.h"
31
+ #include "trema.h"
32
+ #include "trema_private.h"
33
+ #include "trema_wrapper.h"
34
+ #include "cmockery_trema.h"
35
+
36
+
37
+ /********************************************************************************
38
+ * Mock functions.
39
+ ********************************************************************************/
40
+
41
+ static void ( *original_error )( const char *format, ... );
42
+ static void ( *original_debug )( const char *format, ... );
43
+ static bool ( *original_add_message_requested_callback )( const char *service_name, void ( *callback )( const messenger_context_handle *handle, uint16_t tag, void *data, size_t len ) );
44
+ static bool ( *original_delete_message_requested_callback )( const char *service_name, void ( *callback )( const messenger_context_handle *handle, uint16_t tag, void *data, size_t len ) );
45
+ static const char *( *original_get_management_service_name )( const char *service_name );
46
+
47
+ static void
48
+ mock_error( const char *format, ... ) {
49
+ va_list args;
50
+ va_start( args, format );
51
+ char message[ 1000 ];
52
+ vsprintf( message, format, args );
53
+ va_end( args );
54
+
55
+ check_expected( message );
56
+ }
57
+
58
+
59
+ static void
60
+ mock_debug( const char *format, ... ) {
61
+ UNUSED( format );
62
+ }
63
+
64
+
65
+ static bool
66
+ mock_add_message_requested_callback( const char *service_name,
67
+ void ( *callback )( const messenger_context_handle *handle, uint16_t tag, void *data, size_t len ) ) {
68
+ UNUSED( callback );
69
+
70
+ check_expected( service_name );
71
+
72
+ return ( bool ) mock();
73
+ }
74
+
75
+
76
+ static bool
77
+ mock_delete_message_requested_callback( const char *service_name,
78
+ void ( *callback )( const messenger_context_handle *handle, uint16_t tag, void *data, size_t len ) ) {
79
+ UNUSED( callback );
80
+
81
+ check_expected( service_name );
82
+
83
+ return ( bool ) mock();
84
+ }
85
+
86
+
87
+ static const char *
88
+ mock_get_management_service_name( const char *service_name ) {
89
+ check_expected( service_name );
90
+
91
+ return ( const char * ) ( intptr_t ) mock();
92
+ }
93
+
94
+
95
+ /********************************************************************************
96
+ * Setup and teardown functions.
97
+ ********************************************************************************/
98
+
99
+ static void
100
+ setup() {
101
+ original_error = error;
102
+ error = mock_error;
103
+ original_debug = debug;
104
+ debug = mock_debug;
105
+ original_add_message_requested_callback= add_message_requested_callback;
106
+ add_message_requested_callback = mock_add_message_requested_callback;
107
+ original_delete_message_requested_callback= delete_message_requested_callback;
108
+ delete_message_requested_callback = mock_delete_message_requested_callback;
109
+ original_get_management_service_name = get_management_service_name;
110
+ get_management_service_name = mock_get_management_service_name;
111
+ }
112
+
113
+
114
+ static void
115
+ teardown() {
116
+ bool *initialized = _get_management_interface_initialized();
117
+ *initialized = false;
118
+
119
+ error = original_error;
120
+ debug = original_debug;
121
+ add_message_requested_callback= original_add_message_requested_callback;
122
+ delete_message_requested_callback= original_delete_message_requested_callback;
123
+ get_management_service_name = original_get_management_service_name;
124
+ }
125
+
126
+
127
+ /********************************************************************************
128
+ * init_management_interface() tests.
129
+ ********************************************************************************/
130
+
131
+ static void
132
+ test_init_management_interface_succeeds() {
133
+ const char service_name[] = "tetris";
134
+ const char management_service_name[] = "tetris.m";
135
+
136
+ set_trema_name( service_name );
137
+
138
+ expect_string( mock_get_management_service_name, service_name, service_name );
139
+ will_return( mock_get_management_service_name, management_service_name );
140
+ expect_string( mock_add_message_requested_callback, service_name, management_service_name );
141
+ will_return( mock_add_message_requested_callback, true );
142
+ expect_string( mock_get_management_service_name, service_name, service_name );
143
+ will_return( mock_get_management_service_name, management_service_name );
144
+
145
+ assert_true( init_management_interface() );
146
+ bool *initialized = _get_management_interface_initialized();
147
+ assert_true( *initialized );
148
+
149
+ _free_trema_name();
150
+ }
151
+
152
+
153
+ static void
154
+ test_init_management_interface_fails_if_already_initialized() {
155
+ const char service_name[] = "tetris";
156
+ const char management_service_name[] = "tetris.m";
157
+
158
+ set_trema_name( service_name );
159
+ expect_string( mock_get_management_service_name, service_name, service_name );
160
+ will_return( mock_get_management_service_name, management_service_name );
161
+ expect_string( mock_add_message_requested_callback, service_name, management_service_name );
162
+ will_return( mock_add_message_requested_callback, true );
163
+ expect_string( mock_get_management_service_name, service_name, service_name );
164
+ will_return( mock_get_management_service_name, management_service_name );
165
+ init_management_interface();
166
+
167
+ expect_string( mock_error, message, "Management interface is already initialized." );
168
+
169
+ assert_false( init_management_interface() );
170
+ bool *initialized = _get_management_interface_initialized();
171
+ assert_true( *initialized );
172
+
173
+ _free_trema_name();
174
+ }
175
+
176
+
177
+ /********************************************************************************
178
+ * finalize_management_interface() tests.
179
+ ********************************************************************************/
180
+
181
+ static void
182
+ test_finalize_management_interface_succeeds() {
183
+ const char service_name[] = "tetris";
184
+ const char management_service_name[] = "tetris.m";
185
+
186
+ set_trema_name( service_name );
187
+ bool *initialized = _get_management_interface_initialized();
188
+ *initialized = true;
189
+
190
+ expect_string( mock_get_management_service_name, service_name, service_name );
191
+ will_return( mock_get_management_service_name, management_service_name );
192
+ expect_string( mock_delete_message_requested_callback, service_name, management_service_name );
193
+ will_return( mock_delete_message_requested_callback, true );
194
+
195
+ assert_true( finalize_management_interface() );
196
+ initialized = _get_management_interface_initialized();
197
+ assert_false( *initialized );
198
+
199
+ _free_trema_name();
200
+ }
201
+
202
+
203
+ static void
204
+ test_finalize_management_interface_fails_if_not_initialized() {
205
+ expect_string( mock_error, message, "Management interface is not initialized yet or already finalized." );
206
+
207
+ assert_false( finalize_management_interface() );
208
+ bool *initialized = _get_management_interface_initialized();
209
+ assert_false( *initialized );
210
+ }
211
+
212
+
213
+ /********************************************************************************
214
+ * Run tests.
215
+ ********************************************************************************/
216
+
217
+ int
218
+ main() {
219
+ const UnitTest tests[] = {
220
+ // init_management_interface() tests.
221
+ unit_test_setup_teardown( test_init_management_interface_succeeds,
222
+ setup, teardown ),
223
+ unit_test_setup_teardown( test_init_management_interface_fails_if_already_initialized,
224
+ setup, teardown ),
225
+ unit_test_setup_teardown( test_finalize_management_interface_succeeds,
226
+ setup, teardown ),
227
+ unit_test_setup_teardown( test_finalize_management_interface_fails_if_not_initialized,
228
+ setup, teardown ),
229
+ };
230
+ setup_leak_detector();
231
+ return run_tests( tests );
232
+ }
233
+
234
+
235
+ /*
236
+ * Local variables:
237
+ * c-basic-offset: 2
238
+ * indent-tabs-mode: nil
239
+ * End:
240
+ */
@@ -0,0 +1,319 @@
1
+ /*
2
+ * Unit tests for management_service_interface.[ch]
3
+ *
4
+ * Author: Yasunobu Chiba
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 <setjmp.h>
24
+ #include <stdarg.h>
25
+ #include <stdint.h>
26
+ #include <stdio.h>
27
+ #include <stdlib.h>
28
+ #include <string.h>
29
+ #include <unistd.h>
30
+ #include "trema.h"
31
+ #include "trema_wrapper.h"
32
+ #include "cmockery_trema.h"
33
+
34
+
35
+ /********************************************************************************
36
+ * Mock functions.
37
+ ********************************************************************************/
38
+
39
+ static void ( *original_die )( const char *format, ... );
40
+ static void ( *original_error )( const char *format, ... );
41
+ static void ( *original_set_management_application_request_handler )( management_application_request_handler callback, void *user_data );
42
+ static bool ( *original_send_reply_message )( const messenger_context_handle *handle, const uint16_t tag, const void *data, size_t length );
43
+
44
+ static void
45
+ mock_die( const char *format, ... ) {
46
+ UNUSED( format );
47
+ mock_assert( false, "mock_die", __FILE__, __LINE__ ); } // Hoaxes gcov.
48
+
49
+
50
+ static void
51
+ mock_error( const char *format, ... ) {
52
+ va_list args;
53
+ va_start( args, format );
54
+ char message[ 1000 ];
55
+ vsprintf( message, format, args );
56
+ va_end( args );
57
+
58
+ check_expected( message );
59
+ }
60
+
61
+
62
+ static void
63
+ mock_set_management_application_request_handler( management_application_request_handler callback, void *user_data ) {
64
+ check_expected( callback );
65
+ check_expected( user_data );
66
+ }
67
+
68
+
69
+ static bool
70
+ mock_send_reply_message( const messenger_context_handle *handle, const uint16_t tag, const void *data, size_t length ) {
71
+ check_expected( handle );
72
+ check_expected( tag );
73
+ check_expected( data );
74
+ check_expected( length );
75
+
76
+ return ( bool ) mock();
77
+ }
78
+
79
+
80
+ /********************************************************************************
81
+ * Setup and teardown functions.
82
+ ********************************************************************************/
83
+
84
+ static void
85
+ setup() {
86
+ original_die = die;
87
+ die = mock_die;
88
+ original_error = error;
89
+ error = mock_error;
90
+ original_set_management_application_request_handler = set_management_application_request_handler;
91
+ set_management_application_request_handler = mock_set_management_application_request_handler;
92
+ original_send_reply_message = send_reply_message;
93
+ send_reply_message = mock_send_reply_message;
94
+ }
95
+
96
+
97
+ static void
98
+ teardown() {
99
+ die = original_die;
100
+ error = original_error;
101
+ set_management_application_request_handler = original_set_management_application_request_handler;
102
+ send_reply_message = original_send_reply_message;
103
+ }
104
+
105
+
106
+ /********************************************************************************
107
+ * get_management_service_name() tests.
108
+ ********************************************************************************/
109
+
110
+ static void
111
+ test_get_management_service_name_succeeds() {
112
+ assert_string_equal( get_management_service_name( "tetris" ), "tetris.m" );
113
+ }
114
+
115
+
116
+ static void
117
+ test_get_management_service_name_fails_if_service_name_is_NULL() {
118
+ expect_assert_failure( get_management_service_name( NULL ) );
119
+ }
120
+
121
+
122
+ static void
123
+ test_get_management_service_name_fails_if_service_name_length_is_zero() {
124
+ expect_assert_failure( get_management_service_name( "" ) );
125
+ }
126
+
127
+
128
+ static void
129
+ test_get_management_service_name_fails_with_too_long_service_name() {
130
+ char service_name[ MESSENGER_SERVICE_NAME_LENGTH ];
131
+ memset( service_name, '\0', MESSENGER_SERVICE_NAME_LENGTH );
132
+ memset( service_name, 'a', MESSENGER_SERVICE_NAME_LENGTH - 1 );
133
+
134
+ expect_assert_failure( get_management_service_name( service_name ) );
135
+ }
136
+
137
+
138
+ /********************************************************************************
139
+ * set_management_application_request_handler() test.
140
+ ********************************************************************************/
141
+
142
+ static void
143
+ test_set_management_application_request_handler_succeeds() {
144
+ management_application_request_handler callback = ( void * ) ( intptr_t ) 0x1;
145
+ void *user_data = ( void * ) ( intptr_t ) 0x2;
146
+
147
+ expect_value( mock_set_management_application_request_handler, callback, callback );
148
+ expect_value( mock_set_management_application_request_handler, user_data, user_data );
149
+ set_management_application_request_handler( callback, user_data );
150
+ }
151
+
152
+
153
+ /********************************************************************************
154
+ * create_management_application_reply() tests.
155
+ ********************************************************************************/
156
+
157
+ static void
158
+ test_create_management_application_reply_succeeds_without_data() {
159
+ uint8_t status = MANAGEMENT_REQUEST_SUCCEEDED;
160
+ uint32_t id = 1;
161
+ void *data = NULL;
162
+ size_t data_length = 0;
163
+
164
+ management_application_reply *reply = create_management_application_reply( status, id, data, data_length );
165
+ assert_int_equal( ntohs( reply->header.type ), MANAGEMENT_APPLICATION_REPLY );
166
+ assert_int_equal( reply->header.status, status );
167
+ assert_int_equal( ntohl( reply->header.length ), offsetof( management_application_reply, data ) );
168
+ assert_int_equal( ntohl( reply->application_id ), id );
169
+
170
+ xfree( reply );
171
+ }
172
+
173
+
174
+ static void
175
+ test_create_management_application_reply_succeeds_with_data() {
176
+ uint8_t status = MANAGEMENT_REQUEST_SUCCEEDED;
177
+ uint32_t id = 1;
178
+ size_t data_length = 128;
179
+ uint8_t data[ data_length ];
180
+
181
+ for ( unsigned int i = 0; i < data_length; i++ ) {
182
+ data[ i ] = ( uint8_t ) i;
183
+ }
184
+
185
+ management_application_reply *reply = create_management_application_reply( status, id, ( void * ) data, data_length );
186
+ assert_int_equal( ntohs( reply->header.type ), MANAGEMENT_APPLICATION_REPLY );
187
+ assert_int_equal( reply->header.status, status );
188
+ assert_int_equal( ntohl( reply->header.length ), offsetof( management_application_reply, data ) + data_length );
189
+ assert_int_equal( ntohl( reply->application_id ), id );
190
+ assert_memory_equal( reply->data, data, data_length );
191
+
192
+ xfree( reply );
193
+ }
194
+
195
+
196
+ /********************************************************************************
197
+ * send_management_application_reply() tests.
198
+ ********************************************************************************/
199
+
200
+ static void
201
+ test_send_management_application_reply_succeeds() {
202
+ uint8_t status = MANAGEMENT_REQUEST_SUCCEEDED;
203
+ uint32_t id = 1;
204
+ size_t data_length = 128;
205
+ uint8_t data[ data_length ];
206
+
207
+ for ( unsigned int i = 0; i < data_length; i++ ) {
208
+ data[ i ] = ( uint8_t ) i;
209
+ }
210
+
211
+ management_application_reply *reply = create_management_application_reply( status, id, ( void * ) data, data_length );
212
+ messenger_context_handle *handle = ( void * ) ( intptr_t ) 0x1;
213
+
214
+ expect_value( mock_send_reply_message, handle, handle );
215
+ expect_value( mock_send_reply_message, tag, MESSENGER_MANAGEMENT_REPLY );
216
+ expect_memory( mock_send_reply_message, data, reply, ( size_t ) ntohl( reply->header.length ) );
217
+ expect_value( mock_send_reply_message, length, ( size_t ) ntohl( reply->header.length ) );
218
+ will_return( mock_send_reply_message, true );
219
+
220
+ assert_true( send_management_application_reply( handle, reply ) );
221
+
222
+ xfree( reply );
223
+ }
224
+
225
+
226
+ static void
227
+ test_send_management_application_reply_fails_without_reply_message() {
228
+ messenger_context_handle *handle = ( void * ) ( intptr_t ) 0x1;
229
+
230
+ expect_string( mock_error, message, "Both context handle and reply message must not be NULL ( handle = 0x1, reply = (nil) )." );
231
+ assert_false( send_management_application_reply( handle, NULL ) );
232
+ }
233
+
234
+
235
+ static void
236
+ test_send_management_application_reply_fails_without_context_handle() {
237
+ messenger_context_handle *handle = NULL;
238
+ management_application_reply *reply = ( void * ) ( intptr_t ) 0x1;
239
+
240
+ expect_string( mock_error, message, "Both context handle and reply message must not be NULL ( handle = (nil), reply = 0x1 )." );
241
+ assert_false( send_management_application_reply( handle, reply ) );
242
+ }
243
+
244
+
245
+ static void
246
+ test_send_management_application_reply_fails_if_send_reply_message_returns_false() {
247
+ uint8_t status = MANAGEMENT_REQUEST_SUCCEEDED;
248
+ uint32_t id = 1;
249
+ size_t data_length = 128;
250
+ uint8_t data[ data_length ];
251
+
252
+ for ( unsigned int i = 0; i < data_length; i++ ) {
253
+ data[ i ] = ( uint8_t ) i;
254
+ }
255
+
256
+ management_application_reply *reply = create_management_application_reply( status, id, ( void * ) data, data_length );
257
+ messenger_context_handle *handle = ( void * ) ( intptr_t ) 0x1;
258
+
259
+ expect_value( mock_send_reply_message, handle, handle );
260
+ expect_value( mock_send_reply_message, tag, MESSENGER_MANAGEMENT_REPLY );
261
+ expect_memory( mock_send_reply_message, data, reply, ( size_t ) ntohl( reply->header.length ) );
262
+ expect_value( mock_send_reply_message, length, ( size_t ) ntohl( reply->header.length ) );
263
+ will_return( mock_send_reply_message, false );
264
+ expect_string( mock_error, message, "Failed to send an application specific management reply." );
265
+
266
+ assert_false( send_management_application_reply( handle, reply ) );
267
+
268
+ xfree( reply );
269
+ }
270
+
271
+
272
+ /********************************************************************************
273
+ * Run tests.
274
+ ********************************************************************************/
275
+
276
+ int
277
+ main() {
278
+ const UnitTest tests[] = {
279
+ // get_management_service_name() tests.
280
+ unit_test_setup_teardown( test_get_management_service_name_succeeds,
281
+ setup, teardown ),
282
+ unit_test_setup_teardown( test_get_management_service_name_fails_if_service_name_is_NULL,
283
+ setup, teardown ),
284
+ unit_test_setup_teardown( test_get_management_service_name_fails_if_service_name_length_is_zero,
285
+ setup, teardown ),
286
+ unit_test_setup_teardown( test_get_management_service_name_fails_with_too_long_service_name,
287
+ setup, teardown ),
288
+
289
+ // set_management_application_request_handler() test.
290
+ unit_test_setup_teardown( test_set_management_application_request_handler_succeeds,
291
+ setup, teardown ),
292
+
293
+ // create_management_application_reply() tests.
294
+ unit_test_setup_teardown( test_create_management_application_reply_succeeds_without_data,
295
+ setup, teardown ),
296
+ unit_test_setup_teardown( test_create_management_application_reply_succeeds_with_data,
297
+ setup, teardown ),
298
+
299
+ // send_management_application_reply() tests.
300
+ unit_test_setup_teardown( test_send_management_application_reply_succeeds,
301
+ setup, teardown ),
302
+ unit_test_setup_teardown( test_send_management_application_reply_fails_without_reply_message,
303
+ setup, teardown ),
304
+ unit_test_setup_teardown( test_send_management_application_reply_fails_without_context_handle,
305
+ setup, teardown ),
306
+ unit_test_setup_teardown( test_send_management_application_reply_fails_if_send_reply_message_returns_false,
307
+ setup, teardown ),
308
+ };
309
+ setup_leak_detector();
310
+ return run_tests( tests );
311
+ }
312
+
313
+
314
+ /*
315
+ * Local variables:
316
+ * c-basic-offset: 2
317
+ * indent-tabs-mode: nil
318
+ * End:
319
+ */