fluentd 0.14.4-x64-mingw32

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of fluentd might be problematic. Click here for more details.

Files changed (328) hide show
  1. checksums.yaml +7 -0
  2. data/.github/ISSUE_TEMPLATE.md +6 -0
  3. data/.gitignore +26 -0
  4. data/.travis.yml +45 -0
  5. data/AUTHORS +2 -0
  6. data/CONTRIBUTING.md +35 -0
  7. data/COPYING +14 -0
  8. data/ChangeLog +276 -0
  9. data/Gemfile +9 -0
  10. data/README.md +51 -0
  11. data/Rakefile +53 -0
  12. data/Vagrantfile +17 -0
  13. data/appveyor.yml +41 -0
  14. data/bin/fluent-debug +5 -0
  15. data/example/copy_roundrobin.conf +39 -0
  16. data/example/filter_stdout.conf +22 -0
  17. data/example/in_forward.conf +11 -0
  18. data/example/in_http.conf +14 -0
  19. data/example/in_out_forward.conf +17 -0
  20. data/example/in_syslog.conf +15 -0
  21. data/example/in_tail.conf +14 -0
  22. data/example/in_tcp.conf +13 -0
  23. data/example/in_udp.conf +13 -0
  24. data/example/multi_filters.conf +61 -0
  25. data/example/out_buffered_null.conf +32 -0
  26. data/example/out_copy.conf +20 -0
  27. data/example/out_file.conf +13 -0
  28. data/example/out_forward.conf +35 -0
  29. data/example/out_forward_buf_file.conf +23 -0
  30. data/example/v0_12_filter.conf +78 -0
  31. data/example/v1_literal_example.conf +36 -0
  32. data/fluent.conf +139 -0
  33. data/fluentd.gemspec +51 -0
  34. data/lib/fluent/agent.rb +194 -0
  35. data/lib/fluent/command/bundler_injection.rb +45 -0
  36. data/lib/fluent/command/cat.rb +319 -0
  37. data/lib/fluent/command/debug.rb +102 -0
  38. data/lib/fluent/command/fluentd.rb +273 -0
  39. data/lib/fluent/compat/call_super_mixin.rb +67 -0
  40. data/lib/fluent/compat/exec_util.rb +129 -0
  41. data/lib/fluent/compat/file_util.rb +54 -0
  42. data/lib/fluent/compat/filter.rb +68 -0
  43. data/lib/fluent/compat/formatter.rb +111 -0
  44. data/lib/fluent/compat/formatter_utils.rb +85 -0
  45. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  46. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  47. data/lib/fluent/compat/input.rb +49 -0
  48. data/lib/fluent/compat/output.rb +677 -0
  49. data/lib/fluent/compat/output_chain.rb +60 -0
  50. data/lib/fluent/compat/parser.rb +180 -0
  51. data/lib/fluent/compat/parser_utils.rb +40 -0
  52. data/lib/fluent/compat/propagate_default.rb +62 -0
  53. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  54. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  55. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  56. data/lib/fluent/compat/socket_util.rb +165 -0
  57. data/lib/fluent/compat/string_util.rb +34 -0
  58. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  59. data/lib/fluent/compat/type_converter.rb +90 -0
  60. data/lib/fluent/config.rb +56 -0
  61. data/lib/fluent/config/basic_parser.rb +123 -0
  62. data/lib/fluent/config/configure_proxy.rb +366 -0
  63. data/lib/fluent/config/dsl.rb +149 -0
  64. data/lib/fluent/config/element.rb +218 -0
  65. data/lib/fluent/config/error.rb +26 -0
  66. data/lib/fluent/config/literal_parser.rb +251 -0
  67. data/lib/fluent/config/parser.rb +107 -0
  68. data/lib/fluent/config/section.rb +212 -0
  69. data/lib/fluent/config/types.rb +136 -0
  70. data/lib/fluent/config/v1_parser.rb +190 -0
  71. data/lib/fluent/configurable.rb +176 -0
  72. data/lib/fluent/daemon.rb +15 -0
  73. data/lib/fluent/engine.rb +220 -0
  74. data/lib/fluent/env.rb +27 -0
  75. data/lib/fluent/event.rb +287 -0
  76. data/lib/fluent/event_router.rb +259 -0
  77. data/lib/fluent/filter.rb +21 -0
  78. data/lib/fluent/formatter.rb +23 -0
  79. data/lib/fluent/input.rb +21 -0
  80. data/lib/fluent/label.rb +38 -0
  81. data/lib/fluent/load.rb +36 -0
  82. data/lib/fluent/log.rb +445 -0
  83. data/lib/fluent/match.rb +141 -0
  84. data/lib/fluent/mixin.rb +31 -0
  85. data/lib/fluent/msgpack_factory.rb +62 -0
  86. data/lib/fluent/output.rb +26 -0
  87. data/lib/fluent/output_chain.rb +23 -0
  88. data/lib/fluent/parser.rb +23 -0
  89. data/lib/fluent/plugin.rb +161 -0
  90. data/lib/fluent/plugin/bare_output.rb +63 -0
  91. data/lib/fluent/plugin/base.rb +130 -0
  92. data/lib/fluent/plugin/buf_file.rb +154 -0
  93. data/lib/fluent/plugin/buf_memory.rb +34 -0
  94. data/lib/fluent/plugin/buffer.rb +603 -0
  95. data/lib/fluent/plugin/buffer/chunk.rb +160 -0
  96. data/lib/fluent/plugin/buffer/file_chunk.rb +323 -0
  97. data/lib/fluent/plugin/buffer/memory_chunk.rb +90 -0
  98. data/lib/fluent/plugin/exec_util.rb +22 -0
  99. data/lib/fluent/plugin/file_util.rb +22 -0
  100. data/lib/fluent/plugin/file_wrapper.rb +120 -0
  101. data/lib/fluent/plugin/filter.rb +93 -0
  102. data/lib/fluent/plugin/filter_grep.rb +75 -0
  103. data/lib/fluent/plugin/filter_record_transformer.rb +342 -0
  104. data/lib/fluent/plugin/filter_stdout.rb +53 -0
  105. data/lib/fluent/plugin/formatter.rb +45 -0
  106. data/lib/fluent/plugin/formatter_csv.rb +47 -0
  107. data/lib/fluent/plugin/formatter_hash.rb +29 -0
  108. data/lib/fluent/plugin/formatter_json.rb +44 -0
  109. data/lib/fluent/plugin/formatter_ltsv.rb +41 -0
  110. data/lib/fluent/plugin/formatter_msgpack.rb +29 -0
  111. data/lib/fluent/plugin/formatter_out_file.rb +78 -0
  112. data/lib/fluent/plugin/formatter_single_value.rb +34 -0
  113. data/lib/fluent/plugin/formatter_stdout.rb +74 -0
  114. data/lib/fluent/plugin/in_debug_agent.rb +64 -0
  115. data/lib/fluent/plugin/in_dummy.rb +135 -0
  116. data/lib/fluent/plugin/in_exec.rb +149 -0
  117. data/lib/fluent/plugin/in_forward.rb +366 -0
  118. data/lib/fluent/plugin/in_gc_stat.rb +52 -0
  119. data/lib/fluent/plugin/in_http.rb +422 -0
  120. data/lib/fluent/plugin/in_monitor_agent.rb +401 -0
  121. data/lib/fluent/plugin/in_object_space.rb +90 -0
  122. data/lib/fluent/plugin/in_syslog.rb +204 -0
  123. data/lib/fluent/plugin/in_tail.rb +838 -0
  124. data/lib/fluent/plugin/in_tcp.rb +41 -0
  125. data/lib/fluent/plugin/in_udp.rb +37 -0
  126. data/lib/fluent/plugin/in_unix.rb +201 -0
  127. data/lib/fluent/plugin/input.rb +33 -0
  128. data/lib/fluent/plugin/multi_output.rb +95 -0
  129. data/lib/fluent/plugin/out_buffered_null.rb +59 -0
  130. data/lib/fluent/plugin/out_buffered_stdout.rb +70 -0
  131. data/lib/fluent/plugin/out_copy.rb +42 -0
  132. data/lib/fluent/plugin/out_exec.rb +114 -0
  133. data/lib/fluent/plugin/out_exec_filter.rb +393 -0
  134. data/lib/fluent/plugin/out_file.rb +167 -0
  135. data/lib/fluent/plugin/out_forward.rb +646 -0
  136. data/lib/fluent/plugin/out_null.rb +27 -0
  137. data/lib/fluent/plugin/out_relabel.rb +28 -0
  138. data/lib/fluent/plugin/out_roundrobin.rb +80 -0
  139. data/lib/fluent/plugin/out_stdout.rb +48 -0
  140. data/lib/fluent/plugin/out_stream.rb +130 -0
  141. data/lib/fluent/plugin/output.rb +1020 -0
  142. data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
  143. data/lib/fluent/plugin/parser.rb +175 -0
  144. data/lib/fluent/plugin/parser_apache.rb +28 -0
  145. data/lib/fluent/plugin/parser_apache2.rb +84 -0
  146. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  147. data/lib/fluent/plugin/parser_csv.rb +33 -0
  148. data/lib/fluent/plugin/parser_json.rb +79 -0
  149. data/lib/fluent/plugin/parser_ltsv.rb +50 -0
  150. data/lib/fluent/plugin/parser_multiline.rb +104 -0
  151. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  152. data/lib/fluent/plugin/parser_none.rb +36 -0
  153. data/lib/fluent/plugin/parser_regexp.rb +73 -0
  154. data/lib/fluent/plugin/parser_syslog.rb +82 -0
  155. data/lib/fluent/plugin/parser_tsv.rb +37 -0
  156. data/lib/fluent/plugin/socket_util.rb +22 -0
  157. data/lib/fluent/plugin/storage.rb +84 -0
  158. data/lib/fluent/plugin/storage_local.rb +132 -0
  159. data/lib/fluent/plugin/string_util.rb +22 -0
  160. data/lib/fluent/plugin_helper.rb +42 -0
  161. data/lib/fluent/plugin_helper/child_process.rb +298 -0
  162. data/lib/fluent/plugin_helper/compat_parameters.rb +224 -0
  163. data/lib/fluent/plugin_helper/event_emitter.rb +80 -0
  164. data/lib/fluent/plugin_helper/event_loop.rb +118 -0
  165. data/lib/fluent/plugin_helper/formatter.rb +149 -0
  166. data/lib/fluent/plugin_helper/inject.rb +125 -0
  167. data/lib/fluent/plugin_helper/parser.rb +147 -0
  168. data/lib/fluent/plugin_helper/retry_state.rb +177 -0
  169. data/lib/fluent/plugin_helper/storage.rb +331 -0
  170. data/lib/fluent/plugin_helper/thread.rb +147 -0
  171. data/lib/fluent/plugin_helper/timer.rb +90 -0
  172. data/lib/fluent/plugin_id.rb +63 -0
  173. data/lib/fluent/process.rb +504 -0
  174. data/lib/fluent/registry.rb +99 -0
  175. data/lib/fluent/root_agent.rb +314 -0
  176. data/lib/fluent/rpc.rb +94 -0
  177. data/lib/fluent/supervisor.rb +680 -0
  178. data/lib/fluent/system_config.rb +122 -0
  179. data/lib/fluent/test.rb +56 -0
  180. data/lib/fluent/test/base.rb +85 -0
  181. data/lib/fluent/test/driver/base.rb +179 -0
  182. data/lib/fluent/test/driver/base_owned.rb +70 -0
  183. data/lib/fluent/test/driver/base_owner.rb +125 -0
  184. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  185. data/lib/fluent/test/driver/filter.rb +57 -0
  186. data/lib/fluent/test/driver/formatter.rb +30 -0
  187. data/lib/fluent/test/driver/input.rb +31 -0
  188. data/lib/fluent/test/driver/multi_output.rb +52 -0
  189. data/lib/fluent/test/driver/output.rb +76 -0
  190. data/lib/fluent/test/driver/parser.rb +30 -0
  191. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  192. data/lib/fluent/test/filter_test.rb +77 -0
  193. data/lib/fluent/test/formatter_test.rb +65 -0
  194. data/lib/fluent/test/helpers.rb +79 -0
  195. data/lib/fluent/test/input_test.rb +172 -0
  196. data/lib/fluent/test/log.rb +73 -0
  197. data/lib/fluent/test/output_test.rb +156 -0
  198. data/lib/fluent/test/parser_test.rb +70 -0
  199. data/lib/fluent/time.rb +175 -0
  200. data/lib/fluent/timezone.rb +133 -0
  201. data/lib/fluent/unique_id.rb +39 -0
  202. data/lib/fluent/version.rb +21 -0
  203. data/lib/fluent/winsvc.rb +71 -0
  204. data/test/compat/test_calls_super.rb +166 -0
  205. data/test/compat/test_parser.rb +82 -0
  206. data/test/config/assertions.rb +42 -0
  207. data/test/config/test_config_parser.rb +507 -0
  208. data/test/config/test_configurable.rb +1194 -0
  209. data/test/config/test_configure_proxy.rb +386 -0
  210. data/test/config/test_dsl.rb +415 -0
  211. data/test/config/test_element.rb +403 -0
  212. data/test/config/test_literal_parser.rb +297 -0
  213. data/test/config/test_section.rb +184 -0
  214. data/test/config/test_system_config.rb +120 -0
  215. data/test/config/test_types.rb +171 -0
  216. data/test/helper.rb +119 -0
  217. data/test/plugin/data/2010/01/20100102-030405.log +0 -0
  218. data/test/plugin/data/2010/01/20100102-030406.log +0 -0
  219. data/test/plugin/data/2010/01/20100102.log +0 -0
  220. data/test/plugin/data/log/bar +0 -0
  221. data/test/plugin/data/log/foo/bar.log +0 -0
  222. data/test/plugin/data/log/test.log +0 -0
  223. data/test/plugin/test_bare_output.rb +118 -0
  224. data/test/plugin/test_base.rb +75 -0
  225. data/test/plugin/test_buf_file.rb +571 -0
  226. data/test/plugin/test_buf_memory.rb +42 -0
  227. data/test/plugin/test_buffer.rb +1200 -0
  228. data/test/plugin/test_buffer_chunk.rb +168 -0
  229. data/test/plugin/test_buffer_file_chunk.rb +771 -0
  230. data/test/plugin/test_buffer_memory_chunk.rb +265 -0
  231. data/test/plugin/test_file_util.rb +96 -0
  232. data/test/plugin/test_filter.rb +353 -0
  233. data/test/plugin/test_filter_grep.rb +119 -0
  234. data/test/plugin/test_filter_record_transformer.rb +600 -0
  235. data/test/plugin/test_filter_stdout.rb +211 -0
  236. data/test/plugin/test_formatter_csv.rb +94 -0
  237. data/test/plugin/test_formatter_json.rb +30 -0
  238. data/test/plugin/test_formatter_ltsv.rb +52 -0
  239. data/test/plugin/test_formatter_msgpack.rb +28 -0
  240. data/test/plugin/test_formatter_out_file.rb +95 -0
  241. data/test/plugin/test_formatter_single_value.rb +38 -0
  242. data/test/plugin/test_in_debug_agent.rb +28 -0
  243. data/test/plugin/test_in_dummy.rb +188 -0
  244. data/test/plugin/test_in_exec.rb +133 -0
  245. data/test/plugin/test_in_forward.rb +635 -0
  246. data/test/plugin/test_in_gc_stat.rb +39 -0
  247. data/test/plugin/test_in_http.rb +442 -0
  248. data/test/plugin/test_in_monitor_agent.rb +329 -0
  249. data/test/plugin/test_in_object_space.rb +64 -0
  250. data/test/plugin/test_in_syslog.rb +205 -0
  251. data/test/plugin/test_in_tail.rb +1001 -0
  252. data/test/plugin/test_in_tcp.rb +102 -0
  253. data/test/plugin/test_in_udp.rb +121 -0
  254. data/test/plugin/test_in_unix.rb +126 -0
  255. data/test/plugin/test_input.rb +122 -0
  256. data/test/plugin/test_multi_output.rb +180 -0
  257. data/test/plugin/test_out_buffered_null.rb +79 -0
  258. data/test/plugin/test_out_buffered_stdout.rb +122 -0
  259. data/test/plugin/test_out_copy.rb +160 -0
  260. data/test/plugin/test_out_exec.rb +155 -0
  261. data/test/plugin/test_out_exec_filter.rb +262 -0
  262. data/test/plugin/test_out_file.rb +383 -0
  263. data/test/plugin/test_out_forward.rb +590 -0
  264. data/test/plugin/test_out_null.rb +29 -0
  265. data/test/plugin/test_out_relabel.rb +28 -0
  266. data/test/plugin/test_out_roundrobin.rb +146 -0
  267. data/test/plugin/test_out_stdout.rb +92 -0
  268. data/test/plugin/test_out_stream.rb +93 -0
  269. data/test/plugin/test_output.rb +568 -0
  270. data/test/plugin/test_output_as_buffered.rb +1604 -0
  271. data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
  272. data/test/plugin/test_output_as_buffered_retries.rb +839 -0
  273. data/test/plugin/test_output_as_buffered_secondary.rb +817 -0
  274. data/test/plugin/test_output_as_standard.rb +374 -0
  275. data/test/plugin/test_owned_by.rb +35 -0
  276. data/test/plugin/test_parser_apache.rb +42 -0
  277. data/test/plugin/test_parser_apache2.rb +38 -0
  278. data/test/plugin/test_parser_apache_error.rb +45 -0
  279. data/test/plugin/test_parser_base.rb +32 -0
  280. data/test/plugin/test_parser_csv.rb +104 -0
  281. data/test/plugin/test_parser_json.rb +107 -0
  282. data/test/plugin/test_parser_labeled_tsv.rb +129 -0
  283. data/test/plugin/test_parser_multiline.rb +100 -0
  284. data/test/plugin/test_parser_nginx.rb +48 -0
  285. data/test/plugin/test_parser_none.rb +53 -0
  286. data/test/plugin/test_parser_regexp.rb +277 -0
  287. data/test/plugin/test_parser_syslog.rb +66 -0
  288. data/test/plugin/test_parser_time.rb +46 -0
  289. data/test/plugin/test_parser_tsv.rb +121 -0
  290. data/test/plugin/test_storage.rb +167 -0
  291. data/test/plugin/test_storage_local.rb +8 -0
  292. data/test/plugin/test_string_util.rb +26 -0
  293. data/test/plugin_helper/test_child_process.rb +608 -0
  294. data/test/plugin_helper/test_compat_parameters.rb +242 -0
  295. data/test/plugin_helper/test_event_emitter.rb +51 -0
  296. data/test/plugin_helper/test_event_loop.rb +52 -0
  297. data/test/plugin_helper/test_formatter.rb +252 -0
  298. data/test/plugin_helper/test_inject.rb +487 -0
  299. data/test/plugin_helper/test_parser.rb +263 -0
  300. data/test/plugin_helper/test_retry_state.rb +399 -0
  301. data/test/plugin_helper/test_storage.rb +521 -0
  302. data/test/plugin_helper/test_thread.rb +164 -0
  303. data/test/plugin_helper/test_timer.rb +131 -0
  304. data/test/scripts/exec_script.rb +32 -0
  305. data/test/scripts/fluent/plugin/formatter_known.rb +8 -0
  306. data/test/scripts/fluent/plugin/out_test.rb +81 -0
  307. data/test/scripts/fluent/plugin/out_test2.rb +80 -0
  308. data/test/scripts/fluent/plugin/parser_known.rb +4 -0
  309. data/test/test_config.rb +179 -0
  310. data/test/test_configdsl.rb +148 -0
  311. data/test/test_event.rb +329 -0
  312. data/test/test_event_router.rb +331 -0
  313. data/test/test_event_time.rb +184 -0
  314. data/test/test_filter.rb +121 -0
  315. data/test/test_formatter.rb +319 -0
  316. data/test/test_input.rb +31 -0
  317. data/test/test_log.rb +572 -0
  318. data/test/test_match.rb +137 -0
  319. data/test/test_mixin.rb +351 -0
  320. data/test/test_output.rb +214 -0
  321. data/test/test_plugin_classes.rb +136 -0
  322. data/test/test_plugin_helper.rb +81 -0
  323. data/test/test_process.rb +48 -0
  324. data/test/test_root_agent.rb +278 -0
  325. data/test/test_supervisor.rb +339 -0
  326. data/test/test_time_formatter.rb +186 -0
  327. data/test/test_unique_id.rb +47 -0
  328. metadata +823 -0
@@ -0,0 +1,521 @@
1
+ require_relative '../helper'
2
+ require 'fluent/plugin_helper/storage'
3
+ require 'fluent/plugin/base'
4
+
5
+ class ExampleStorage < Fluent::Plugin::Storage
6
+ Fluent::Plugin.register_storage('example', self)
7
+
8
+ attr_reader :data, :saved, :load_times, :save_times
9
+
10
+ def initialize
11
+ super
12
+ @data = {}
13
+ @saved = {}
14
+ @load_times = 0
15
+ @save_times = 0
16
+ end
17
+ def load
18
+ @data ||= {}
19
+ @load_times += 1
20
+ end
21
+ def save
22
+ @saved = @data.dup
23
+ @save_times += 1
24
+ end
25
+ def get(key)
26
+ @data[key]
27
+ end
28
+ def fetch(key, defval)
29
+ @data.fetch(key, defval)
30
+ end
31
+ def put(key, value)
32
+ @data[key] = value
33
+ end
34
+ def delete(key)
35
+ @data.delete(key)
36
+ end
37
+ def update(key, &block)
38
+ @data[key] = block.call(@data[key])
39
+ end
40
+ def close
41
+ @data = {}
42
+ super
43
+ end
44
+ def terminate
45
+ @saved = {}
46
+ @load_times = @save_times = 0
47
+ super
48
+ end
49
+ end
50
+
51
+ class Example2Storage < ExampleStorage
52
+ Fluent::Plugin.register_storage('ex2', self)
53
+ config_param :dummy_path, :string, default: 'dummy'
54
+ end
55
+ class Example3Storage < ExampleStorage
56
+ Fluent::Plugin.register_storage('ex3', self)
57
+ def synchronized?
58
+ true
59
+ end
60
+ end
61
+ class Example4Storage < ExampleStorage
62
+ Fluent::Plugin.register_storage('ex4', self)
63
+ def persistent_always?
64
+ true
65
+ end
66
+ def synchronized?
67
+ true
68
+ end
69
+ end
70
+
71
+ class StorageHelperTest < Test::Unit::TestCase
72
+ class Dummy < Fluent::Plugin::TestBase
73
+ helpers :storage
74
+ end
75
+
76
+ class Dummy2 < Fluent::Plugin::TestBase
77
+ helpers :storage
78
+ config_section :storage do
79
+ config_set_default :@type, 'ex2'
80
+ config_set_default :dummy_path, '/tmp/yay'
81
+ end
82
+ end
83
+
84
+ setup do
85
+ @d = nil
86
+ end
87
+
88
+ teardown do
89
+ if @d
90
+ @d.stop unless @d.stopped?
91
+ @d.shutdown unless @d.shutdown?
92
+ @d.close unless @d.closed?
93
+ @d.terminate unless @d.terminated?
94
+ end
95
+ end
96
+
97
+ test 'can be initialized without any storages at first' do
98
+ d = Dummy.new
99
+ assert_equal 0, d._storages.size
100
+ end
101
+
102
+ test 'can override default configuration parameters, but not overwrite whole definition' do
103
+ d = Dummy.new
104
+ d.configure(config_element())
105
+ assert_equal [], d.storage_configs
106
+
107
+ d = Dummy2.new
108
+ d.configure(config_element('ROOT', '', {}, [config_element('storage', '', {}, [])]))
109
+ assert_raise NoMethodError do
110
+ d.storage
111
+ end
112
+ assert_equal 1, d.storage_configs.size
113
+ assert_equal 'ex2', d.storage_configs.first[:@type]
114
+ assert_equal '/tmp/yay', d.storage_configs.first.dummy_path
115
+ end
116
+
117
+ test 'creates instance of type specified by conf, or default_type if @type is missing in conf' do
118
+ d = Dummy2.new
119
+ d.configure(config_element())
120
+ i = d.storage_create(conf: config_element('format', '', {'@type' => 'example'}), default_type: 'ex2')
121
+ assert{ i.is_a?(Fluent::PluginHelper::Storage::SynchronizeWrapper) && i.instance_eval{ @storage }.is_a?(ExampleStorage) }
122
+
123
+ d = Dummy2.new
124
+ d.configure(config_element())
125
+ i = d.storage_create(conf: nil, default_type: 'ex2')
126
+ assert{ i.is_a?(Fluent::PluginHelper::Storage::SynchronizeWrapper) && i.instance_eval{ @storage }.is_a?(Example2Storage) }
127
+ end
128
+
129
+ test 'raises config error if config section is specified, but @type is not specified' do
130
+ d = Dummy2.new
131
+ d.configure(config_element())
132
+ assert_raise Fluent::ConfigError.new("@type is required in <storage>") do
133
+ d.storage_create(conf: config_element('storage', '', {}), default_type: 'ex2')
134
+ end
135
+ end
136
+
137
+ test 'can be configured without storage sections' do
138
+ d = Dummy.new
139
+ assert_nothing_raised do
140
+ d.configure(config_element())
141
+ end
142
+ assert_equal 0, d._storages.size
143
+ end
144
+
145
+ test 'can be configured with a storage section' do
146
+ d = Dummy.new
147
+ conf = config_element('ROOT', '', {}, [
148
+ config_element('storage', '', {'@type' => 'example'})
149
+ ])
150
+ assert_nothing_raised do
151
+ d.configure(conf)
152
+ end
153
+ assert_equal 1, d._storages.size
154
+ assert{ d._storages.values.all?{ |s| !s.running } }
155
+ end
156
+
157
+ test 'can be configured with 2 or more storage sections with different usages with each other' do
158
+ d = Dummy.new
159
+ conf = config_element('ROOT', '', {}, [
160
+ config_element('storage', 'default', {'@type' => 'example'}),
161
+ config_element('storage', 'extra', {'@type' => 'ex2', 'dummy_path' => 'v'}),
162
+ ])
163
+ assert_nothing_raised do
164
+ d.configure(conf)
165
+ end
166
+ assert_equal 2, d._storages.size
167
+ assert{ d._storages.values.all?{ |s| !s.running } }
168
+ end
169
+
170
+ test 'cannot be configured with 2 storage sections with same usage' do
171
+ d = Dummy.new
172
+ conf = config_element('ROOT', '', {}, [
173
+ config_element('storage', 'default', {'@type' => 'example'}),
174
+ config_element('storage', 'extra', {'@type' => 'ex2', 'dummy_path' => 'v'}),
175
+ config_element('storage', 'extra', {'@type' => 'ex2', 'dummy_path' => 'v2'}),
176
+ ])
177
+ assert_raises Fluent::ConfigError do
178
+ d.configure(conf)
179
+ end
180
+ end
181
+
182
+ test 'creates a storage plugin instance which is already configured without usage' do
183
+ @d = d = Dummy.new
184
+ conf = config_element('ROOT', '', {}, [
185
+ config_element('storage', '', {'@type' => 'example'})
186
+ ])
187
+ d.configure(conf)
188
+ d.start
189
+
190
+ s = d.storage_create
191
+ assert{ s.implementation.is_a? ExampleStorage }
192
+ end
193
+
194
+ test 'creates a storage plugin instance which is already configured with usage' do
195
+ @d = d = Dummy.new
196
+ conf = config_element('ROOT', '', {}, [
197
+ config_element('storage', 'mydata', {'@type' => 'example'})
198
+ ])
199
+ d.configure(conf)
200
+ d.start
201
+
202
+ s = d.storage_create(usage: 'mydata')
203
+ assert{ s.implementation.is_a? ExampleStorage }
204
+ end
205
+
206
+ test 'creates a storage plugin without configurations' do
207
+ @d = d = Dummy.new
208
+ d.configure(config_element())
209
+ d.start
210
+
211
+ s = d.storage_create(usage: 'mydata', type: 'example', conf: config_element('storage', 'mydata'))
212
+ assert{ s.implementation.is_a? ExampleStorage }
213
+ end
214
+
215
+ test 'creates 2 or more storage plugin instances' do
216
+ @d = d = Dummy.new
217
+ conf = config_element('ROOT', '', {}, [
218
+ config_element('storage', 'mydata', {'@type' => 'example'}),
219
+ config_element('storage', 'secret', {'@type' => 'ex2', 'dummy_path' => 'yay!'}),
220
+ ])
221
+ d.configure(conf)
222
+ d.start
223
+
224
+ s1 = d.storage_create(usage: 'mydata')
225
+ s2 = d.storage_create(usage: 'secret')
226
+ assert{ s1.implementation.is_a? ExampleStorage }
227
+ assert{ s2.implementation.is_a? Example2Storage }
228
+ assert_equal 'yay!', s2.implementation.dummy_path
229
+ end
230
+
231
+ test 'creates wrapped instances for non-synchronized plugin in default' do # and check operations
232
+ @d = d = Dummy.new
233
+ conf = config_element('ROOT', '', {}, [
234
+ config_element('storage', 'mydata', {'@type' => 'example'})
235
+ ])
236
+ d.configure(conf)
237
+ d.start
238
+
239
+ s = d.storage_create(usage: 'mydata')
240
+ assert !s.implementation.synchronized?
241
+ assert{ s.is_a? Fluent::PluginHelper::Storage::SynchronizeWrapper }
242
+ assert s.synchronized?
243
+ assert s.autosave
244
+ assert s.save_at_shutdown
245
+
246
+ assert_nil s.get('key')
247
+ assert_equal 'value', s.put('key', 'value')
248
+ assert_equal 'value', s.fetch('key', 'v1')
249
+ assert_equal 'v2', s.update('key'){|v| v[0] + '2' }
250
+ assert_equal 'v2', s.get('key')
251
+ assert_equal 'v2', s.delete('key')
252
+ end
253
+
254
+ test 'creates wrapped instances for non-persistent plugins when configured as persistent' do # and check operations
255
+ @d = d = Dummy.new
256
+ conf = config_element('ROOT', '', {}, [
257
+ config_element('storage', 'mydata', {'@type' => 'example', 'persistent' => 'true'})
258
+ ])
259
+ d.configure(conf)
260
+ d.start
261
+
262
+ s = d.storage_create(usage: 'mydata')
263
+ assert !s.implementation.persistent_always?
264
+ assert{ s.is_a? Fluent::PluginHelper::Storage::PersistentWrapper }
265
+ assert s.persistent
266
+ assert s.persistent_always?
267
+ assert s.synchronized?
268
+ assert !s.autosave
269
+ assert s.save_at_shutdown
270
+
271
+ assert_nil s.get('key')
272
+ assert_equal 'value', s.put('key', 'value')
273
+ assert_equal 'value', s.fetch('key', 'v1')
274
+ assert_equal 'v2', s.update('key'){|v| v[0] + '2' }
275
+ assert_equal 'v2', s.get('key')
276
+ assert_equal 'v2', s.delete('key')
277
+ end
278
+
279
+ test 'creates bare instances for synchronized plugin in default' do
280
+ @d = d = Dummy.new
281
+ conf = config_element('ROOT', '', {}, [
282
+ config_element('storage', 'mydata', {'@type' => 'ex3'})
283
+ ])
284
+ d.configure(conf)
285
+ d.start
286
+
287
+ s = d.storage_create(usage: 'mydata')
288
+ assert s.implementation.synchronized?
289
+ assert{ s.is_a? Example3Storage }
290
+ assert s.synchronized?
291
+ end
292
+
293
+ test 'creates bare instances for persistent-always plugin when configured as persistent' do
294
+ @d = d = Dummy.new
295
+ conf = config_element('ROOT', '', {}, [
296
+ config_element('storage', 'mydata', {'@type' => 'ex4', 'persistent' => 'true'})
297
+ ])
298
+ d.configure(conf)
299
+ d.start
300
+
301
+ s = d.storage_create(usage: 'mydata')
302
+ assert s.implementation.persistent_always?
303
+ assert{ s.is_a? Example4Storage }
304
+ assert s.persistent
305
+ assert s.persistent_always?
306
+ assert s.synchronized?
307
+ end
308
+
309
+ test 'does not execute timer if autosave is not specified' do
310
+ @d = d = Dummy.new
311
+ conf = config_element('ROOT', '', {}, [
312
+ config_element('storage', 'mydata', {'@type' => 'example', 'autosave' => 'false'})
313
+ ])
314
+ d.configure(conf)
315
+ d.start
316
+
317
+ d.storage_create(usage: 'mydata')
318
+ assert_equal 0, d._timers.size
319
+ end
320
+
321
+ test 'executes timer if autosave is specified and plugin is not persistent' do
322
+ @d = d = Dummy.new
323
+ conf = config_element('ROOT', '', {}, [
324
+ config_element('storage', 'mydata', {'@type' => 'example', 'autosave_interval' => '1s', 'persistent' => 'false'})
325
+ ])
326
+ d.configure(conf)
327
+ d.start
328
+
329
+ d.storage_create(usage: 'mydata')
330
+ assert_equal 1, d._timers.size
331
+ end
332
+
333
+ test 'executes timer for autosave, which calls #save periodically' do
334
+ @d = d = Dummy.new
335
+ conf = config_element('ROOT', '', {}, [
336
+ config_element('storage', 'mydata', {'@type' => 'example', 'autosave_interval' => '1s', 'persistent' => 'false'})
337
+ ])
338
+ d.configure(conf)
339
+ d.start
340
+
341
+ s = d.storage_create(usage: 'mydata')
342
+ assert_equal 1, d._timers.size
343
+ timeout = Time.now + 3
344
+ while Time.now < timeout
345
+ s.put('k', 'v')
346
+ sleep 0.2
347
+ end
348
+
349
+ d.stop
350
+ assert{ s.implementation.save_times > 0 }
351
+ end
352
+
353
+ test 'saves data for each operations if plugin storage is configured as persistent, and wrapped' do
354
+ @d = d = Dummy.new
355
+ conf = config_element('ROOT', '', {}, [
356
+ config_element('storage', 'mydata', {'@type' => 'example', 'persistent' => 'true'})
357
+ ])
358
+ d.configure(conf)
359
+ d.start
360
+ s = d.storage_create(usage: 'mydata')
361
+ assert_equal 1, s.implementation.load_times
362
+ assert_equal 0, s.implementation.save_times
363
+
364
+ s.get('k1')
365
+ assert_equal 2, s.implementation.load_times
366
+ assert_equal 0, s.implementation.save_times
367
+
368
+ s.put('k1', 'v1')
369
+ assert_equal 3, s.implementation.load_times
370
+ assert_equal 1, s.implementation.save_times
371
+
372
+ s.fetch('k2', 'v2')
373
+ assert_equal 4, s.implementation.load_times
374
+ assert_equal 1, s.implementation.save_times
375
+
376
+ s.delete('k1')
377
+ assert_equal 5, s.implementation.load_times
378
+ assert_equal 2, s.implementation.save_times
379
+ end
380
+
381
+ test 'stops timer for autosave by #stop, calls #save by #shutdown if save_at_shutdown is specified' do
382
+ @d = d = Dummy.new
383
+ conf = config_element('ROOT', '', {}, [
384
+ config_element('storage', 'mydata', {'@type' => 'example', 'save_at_shutdown' => 'true'})
385
+ ])
386
+ d.configure(conf)
387
+
388
+ assert !d.timer_running?
389
+
390
+ d.start
391
+
392
+ assert d.timer_running?
393
+
394
+ s = d.storage_create(usage: 'mydata')
395
+ assert s.autosave
396
+ assert_equal 1, d._timers.size
397
+
398
+ d.stop
399
+
400
+ assert !d.timer_running?
401
+
402
+ assert_equal 1, s.implementation.load_times
403
+ assert_equal 0, s.implementation.save_times
404
+
405
+ d.before_shutdown
406
+
407
+ d.shutdown
408
+
409
+ assert_equal 1, s.implementation.load_times
410
+ assert_equal 1, s.implementation.save_times
411
+ end
412
+
413
+ test 'calls #close and #terminate for all plugin instances by #close/#shutdown' do
414
+ @d = d = Dummy.new
415
+ conf = config_element('ROOT', '', {}, [
416
+ config_element('storage', 'mydata', {'@type' => 'example', 'autosave' => 'false', 'save_at_shutdown' => 'true'})
417
+ ])
418
+ d.configure(conf)
419
+ d.start
420
+ s = d.storage_create(usage: 'mydata')
421
+
422
+ s.put('k1', 'v1')
423
+ s.put('k2', 2)
424
+ s.put('k3', true)
425
+
426
+ d.stop
427
+
428
+ assert_equal 3, s.implementation.data.size
429
+ assert_equal 0, s.implementation.saved.size
430
+
431
+ d.shutdown
432
+
433
+ assert_equal 3, s.implementation.data.size
434
+ assert_equal 3, s.implementation.saved.size
435
+
436
+ d.close
437
+
438
+ assert_equal 0, s.implementation.data.size
439
+ assert_equal 3, s.implementation.saved.size
440
+
441
+ d.shutdown
442
+
443
+ assert_equal 0, s.implementation.data.size
444
+ assert_equal 0, s.implementation.saved.size
445
+ end
446
+
447
+ test 'calls lifecycle methods for all plugin instances via owner plugin' do
448
+ @d = d = Dummy.new
449
+ conf = config_element('ROOT', '', {}, [ config_element('storage', '', {'@type' => 'example'}), config_element('storage', 'e2', {'@type' => 'example'}) ])
450
+ d.configure(conf)
451
+ d.start
452
+
453
+ i1 = d.storage_create(usage: '')
454
+ i2 = d.storage_create(usage: 'e2')
455
+ i3 = d.storage_create(usage: 'e3', type: 'ex2')
456
+
457
+ assert i1.started?
458
+ assert i2.started?
459
+ assert i3.started?
460
+
461
+ assert !i1.stopped?
462
+ assert !i2.stopped?
463
+ assert !i3.stopped?
464
+
465
+ d.stop
466
+
467
+ assert i1.stopped?
468
+ assert i2.stopped?
469
+ assert i3.stopped?
470
+
471
+ assert !i1.before_shutdown?
472
+ assert !i2.before_shutdown?
473
+ assert !i3.before_shutdown?
474
+
475
+ d.before_shutdown
476
+
477
+ assert i1.before_shutdown?
478
+ assert i2.before_shutdown?
479
+ assert i3.before_shutdown?
480
+
481
+ assert !i1.shutdown?
482
+ assert !i2.shutdown?
483
+ assert !i3.shutdown?
484
+
485
+ d.shutdown
486
+
487
+ assert i1.shutdown?
488
+ assert i2.shutdown?
489
+ assert i3.shutdown?
490
+
491
+ assert !i1.after_shutdown?
492
+ assert !i2.after_shutdown?
493
+ assert !i3.after_shutdown?
494
+
495
+ d.after_shutdown
496
+
497
+ assert i1.after_shutdown?
498
+ assert i2.after_shutdown?
499
+ assert i3.after_shutdown?
500
+
501
+ assert !i1.closed?
502
+ assert !i2.closed?
503
+ assert !i3.closed?
504
+
505
+ d.close
506
+
507
+ assert i1.closed?
508
+ assert i2.closed?
509
+ assert i3.closed?
510
+
511
+ assert !i1.terminated?
512
+ assert !i2.terminated?
513
+ assert !i3.terminated?
514
+
515
+ d.terminate
516
+
517
+ assert i1.terminated?
518
+ assert i2.terminated?
519
+ assert i3.terminated?
520
+ end
521
+ end