fluentd 1.17.0-x86-mingw32 → 1.18.0-x86-mingw32

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 (278) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +100 -0
  3. data/README.md +1 -0
  4. data/SECURITY.md +2 -2
  5. data/fluent.conf +14 -14
  6. data/lib/fluent/command/cap_ctl.rb +4 -4
  7. data/lib/fluent/command/fluentd.rb +7 -1
  8. data/lib/fluent/compat/call_super_mixin.rb +3 -3
  9. data/lib/fluent/compat/propagate_default.rb +4 -4
  10. data/lib/fluent/config/literal_parser.rb +9 -2
  11. data/lib/fluent/config/yaml_parser/parser.rb +4 -0
  12. data/lib/fluent/engine.rb +49 -33
  13. data/lib/fluent/env.rb +3 -0
  14. data/lib/fluent/event_router.rb +2 -2
  15. data/lib/fluent/log/console_adapter.rb +4 -2
  16. data/lib/fluent/plugin/filter_parser.rb +27 -51
  17. data/lib/fluent/plugin/in_exec.rb +14 -2
  18. data/lib/fluent/plugin/in_http.rb +6 -1
  19. data/lib/fluent/plugin/in_sample.rb +13 -7
  20. data/lib/fluent/plugin/in_syslog.rb +4 -0
  21. data/lib/fluent/plugin/in_tail.rb +65 -23
  22. data/lib/fluent/plugin/in_tcp.rb +4 -0
  23. data/lib/fluent/plugin/in_udp.rb +10 -1
  24. data/lib/fluent/plugin/input.rb +4 -0
  25. data/lib/fluent/plugin/out_buffer.rb +40 -0
  26. data/lib/fluent/plugin/out_copy.rb +1 -1
  27. data/lib/fluent/plugin/out_file.rb +8 -0
  28. data/lib/fluent/plugin/out_http.rb +12 -0
  29. data/lib/fluent/plugin/output.rb +2 -0
  30. data/lib/fluent/plugin/parser_json.rb +4 -12
  31. data/lib/fluent/plugin_helper/cert_option.rb +8 -0
  32. data/lib/fluent/plugin_helper/event_emitter.rb +12 -0
  33. data/lib/fluent/plugin_helper/http_server/server.rb +24 -8
  34. data/lib/fluent/plugin_helper/server.rb +9 -0
  35. data/lib/fluent/root_agent.rb +114 -19
  36. data/lib/fluent/source_only_buffer_agent.rb +102 -0
  37. data/lib/fluent/supervisor.rb +207 -34
  38. data/lib/fluent/system_config.rb +15 -3
  39. data/lib/fluent/version.rb +1 -1
  40. data/templates/new_gem/fluent-plugin.gemspec.erb +6 -5
  41. metadata +24 -483
  42. data/.github/DISCUSSION_TEMPLATE/q-a-japanese.yml +0 -50
  43. data/.github/DISCUSSION_TEMPLATE/q-a.yml +0 -47
  44. data/.github/ISSUE_TEMPLATE/bug_report.yml +0 -71
  45. data/.github/ISSUE_TEMPLATE/config.yml +0 -5
  46. data/.github/ISSUE_TEMPLATE/feature_request.yml +0 -39
  47. data/.github/ISSUE_TEMPLATE.md +0 -17
  48. data/.github/PULL_REQUEST_TEMPLATE.md +0 -14
  49. data/.github/workflows/stale-actions.yml +0 -24
  50. data/.github/workflows/test-ruby-head.yml +0 -31
  51. data/.github/workflows/test.yml +0 -32
  52. data/.gitignore +0 -30
  53. data/Gemfile +0 -9
  54. data/fluentd.gemspec +0 -62
  55. data/test/command/test_binlog_reader.rb +0 -362
  56. data/test/command/test_ca_generate.rb +0 -70
  57. data/test/command/test_cap_ctl.rb +0 -100
  58. data/test/command/test_cat.rb +0 -128
  59. data/test/command/test_ctl.rb +0 -56
  60. data/test/command/test_fluentd.rb +0 -1291
  61. data/test/command/test_plugin_config_formatter.rb +0 -397
  62. data/test/command/test_plugin_generator.rb +0 -109
  63. data/test/compat/test_calls_super.rb +0 -166
  64. data/test/compat/test_parser.rb +0 -92
  65. data/test/config/assertions.rb +0 -42
  66. data/test/config/test_config_parser.rb +0 -551
  67. data/test/config/test_configurable.rb +0 -1784
  68. data/test/config/test_configure_proxy.rb +0 -604
  69. data/test/config/test_dsl.rb +0 -415
  70. data/test/config/test_element.rb +0 -518
  71. data/test/config/test_literal_parser.rb +0 -309
  72. data/test/config/test_plugin_configuration.rb +0 -56
  73. data/test/config/test_section.rb +0 -191
  74. data/test/config/test_system_config.rb +0 -195
  75. data/test/config/test_types.rb +0 -408
  76. data/test/counter/test_client.rb +0 -563
  77. data/test/counter/test_error.rb +0 -44
  78. data/test/counter/test_mutex_hash.rb +0 -179
  79. data/test/counter/test_server.rb +0 -589
  80. data/test/counter/test_store.rb +0 -258
  81. data/test/counter/test_validator.rb +0 -137
  82. data/test/helper.rb +0 -155
  83. data/test/helpers/fuzzy_assert.rb +0 -89
  84. data/test/helpers/process_extenstion.rb +0 -33
  85. data/test/log/test_console_adapter.rb +0 -117
  86. data/test/plugin/data/2010/01/20100102-030405.log +0 -0
  87. data/test/plugin/data/2010/01/20100102-030406.log +0 -0
  88. data/test/plugin/data/2010/01/20100102.log +0 -0
  89. data/test/plugin/data/log/bar +0 -0
  90. data/test/plugin/data/log/foo/bar.log +0 -0
  91. data/test/plugin/data/log/foo/bar2 +0 -0
  92. data/test/plugin/data/log/test.log +0 -0
  93. data/test/plugin/data/log_numeric/01.log +0 -0
  94. data/test/plugin/data/log_numeric/02.log +0 -0
  95. data/test/plugin/data/log_numeric/12.log +0 -0
  96. data/test/plugin/data/log_numeric/14.log +0 -0
  97. data/test/plugin/data/sd_file/config +0 -11
  98. data/test/plugin/data/sd_file/config.json +0 -17
  99. data/test/plugin/data/sd_file/config.yaml +0 -11
  100. data/test/plugin/data/sd_file/config.yml +0 -11
  101. data/test/plugin/data/sd_file/invalid_config.yml +0 -7
  102. data/test/plugin/in_tail/test_fifo.rb +0 -121
  103. data/test/plugin/in_tail/test_io_handler.rb +0 -150
  104. data/test/plugin/in_tail/test_position_file.rb +0 -346
  105. data/test/plugin/out_forward/test_ack_handler.rb +0 -140
  106. data/test/plugin/out_forward/test_connection_manager.rb +0 -145
  107. data/test/plugin/out_forward/test_handshake_protocol.rb +0 -112
  108. data/test/plugin/out_forward/test_load_balancer.rb +0 -106
  109. data/test/plugin/out_forward/test_socket_cache.rb +0 -174
  110. data/test/plugin/test_bare_output.rb +0 -131
  111. data/test/plugin/test_base.rb +0 -247
  112. data/test/plugin/test_buf_file.rb +0 -1314
  113. data/test/plugin/test_buf_file_single.rb +0 -898
  114. data/test/plugin/test_buf_memory.rb +0 -42
  115. data/test/plugin/test_buffer.rb +0 -1493
  116. data/test/plugin/test_buffer_chunk.rb +0 -209
  117. data/test/plugin/test_buffer_file_chunk.rb +0 -871
  118. data/test/plugin/test_buffer_file_single_chunk.rb +0 -611
  119. data/test/plugin/test_buffer_memory_chunk.rb +0 -339
  120. data/test/plugin/test_compressable.rb +0 -87
  121. data/test/plugin/test_file_util.rb +0 -96
  122. data/test/plugin/test_filter.rb +0 -368
  123. data/test/plugin/test_filter_grep.rb +0 -697
  124. data/test/plugin/test_filter_parser.rb +0 -731
  125. data/test/plugin/test_filter_record_transformer.rb +0 -577
  126. data/test/plugin/test_filter_stdout.rb +0 -207
  127. data/test/plugin/test_formatter_csv.rb +0 -136
  128. data/test/plugin/test_formatter_hash.rb +0 -38
  129. data/test/plugin/test_formatter_json.rb +0 -61
  130. data/test/plugin/test_formatter_ltsv.rb +0 -70
  131. data/test/plugin/test_formatter_msgpack.rb +0 -28
  132. data/test/plugin/test_formatter_out_file.rb +0 -116
  133. data/test/plugin/test_formatter_single_value.rb +0 -44
  134. data/test/plugin/test_formatter_tsv.rb +0 -76
  135. data/test/plugin/test_in_debug_agent.rb +0 -49
  136. data/test/plugin/test_in_exec.rb +0 -261
  137. data/test/plugin/test_in_forward.rb +0 -1178
  138. data/test/plugin/test_in_gc_stat.rb +0 -62
  139. data/test/plugin/test_in_http.rb +0 -1124
  140. data/test/plugin/test_in_monitor_agent.rb +0 -922
  141. data/test/plugin/test_in_object_space.rb +0 -66
  142. data/test/plugin/test_in_sample.rb +0 -190
  143. data/test/plugin/test_in_syslog.rb +0 -505
  144. data/test/plugin/test_in_tail.rb +0 -3429
  145. data/test/plugin/test_in_tcp.rb +0 -328
  146. data/test/plugin/test_in_udp.rb +0 -296
  147. data/test/plugin/test_in_unix.rb +0 -181
  148. data/test/plugin/test_input.rb +0 -137
  149. data/test/plugin/test_metadata.rb +0 -89
  150. data/test/plugin/test_metrics.rb +0 -294
  151. data/test/plugin/test_metrics_local.rb +0 -96
  152. data/test/plugin/test_multi_output.rb +0 -204
  153. data/test/plugin/test_out_copy.rb +0 -308
  154. data/test/plugin/test_out_exec.rb +0 -312
  155. data/test/plugin/test_out_exec_filter.rb +0 -606
  156. data/test/plugin/test_out_file.rb +0 -1038
  157. data/test/plugin/test_out_forward.rb +0 -1349
  158. data/test/plugin/test_out_http.rb +0 -557
  159. data/test/plugin/test_out_null.rb +0 -105
  160. data/test/plugin/test_out_relabel.rb +0 -28
  161. data/test/plugin/test_out_roundrobin.rb +0 -146
  162. data/test/plugin/test_out_secondary_file.rb +0 -458
  163. data/test/plugin/test_out_stdout.rb +0 -205
  164. data/test/plugin/test_out_stream.rb +0 -103
  165. data/test/plugin/test_output.rb +0 -1334
  166. data/test/plugin/test_output_as_buffered.rb +0 -2024
  167. data/test/plugin/test_output_as_buffered_backup.rb +0 -363
  168. data/test/plugin/test_output_as_buffered_compress.rb +0 -179
  169. data/test/plugin/test_output_as_buffered_overflow.rb +0 -250
  170. data/test/plugin/test_output_as_buffered_retries.rb +0 -966
  171. data/test/plugin/test_output_as_buffered_secondary.rb +0 -882
  172. data/test/plugin/test_output_as_standard.rb +0 -374
  173. data/test/plugin/test_owned_by.rb +0 -34
  174. data/test/plugin/test_parser.rb +0 -399
  175. data/test/plugin/test_parser_apache.rb +0 -42
  176. data/test/plugin/test_parser_apache2.rb +0 -47
  177. data/test/plugin/test_parser_apache_error.rb +0 -45
  178. data/test/plugin/test_parser_csv.rb +0 -200
  179. data/test/plugin/test_parser_json.rb +0 -244
  180. data/test/plugin/test_parser_labeled_tsv.rb +0 -160
  181. data/test/plugin/test_parser_msgpack.rb +0 -127
  182. data/test/plugin/test_parser_multiline.rb +0 -111
  183. data/test/plugin/test_parser_nginx.rb +0 -88
  184. data/test/plugin/test_parser_none.rb +0 -52
  185. data/test/plugin/test_parser_regexp.rb +0 -284
  186. data/test/plugin/test_parser_syslog.rb +0 -650
  187. data/test/plugin/test_parser_tsv.rb +0 -122
  188. data/test/plugin/test_sd_file.rb +0 -228
  189. data/test/plugin/test_sd_srv.rb +0 -230
  190. data/test/plugin/test_storage.rb +0 -166
  191. data/test/plugin/test_storage_local.rb +0 -335
  192. data/test/plugin/test_string_util.rb +0 -26
  193. data/test/plugin_helper/data/cert/cert-key.pem +0 -27
  194. data/test/plugin_helper/data/cert/cert-with-CRLF.pem +0 -19
  195. data/test/plugin_helper/data/cert/cert-with-no-newline.pem +0 -19
  196. data/test/plugin_helper/data/cert/cert.pem +0 -19
  197. data/test/plugin_helper/data/cert/cert_chains/ca-cert-key.pem +0 -27
  198. data/test/plugin_helper/data/cert/cert_chains/ca-cert.pem +0 -20
  199. data/test/plugin_helper/data/cert/cert_chains/cert-key.pem +0 -27
  200. data/test/plugin_helper/data/cert/cert_chains/cert.pem +0 -40
  201. data/test/plugin_helper/data/cert/empty.pem +0 -0
  202. data/test/plugin_helper/data/cert/generate_cert.rb +0 -125
  203. data/test/plugin_helper/data/cert/with_ca/ca-cert-key-pass.pem +0 -30
  204. data/test/plugin_helper/data/cert/with_ca/ca-cert-key.pem +0 -27
  205. data/test/plugin_helper/data/cert/with_ca/ca-cert-pass.pem +0 -20
  206. data/test/plugin_helper/data/cert/with_ca/ca-cert.pem +0 -20
  207. data/test/plugin_helper/data/cert/with_ca/cert-key-pass.pem +0 -30
  208. data/test/plugin_helper/data/cert/with_ca/cert-key.pem +0 -27
  209. data/test/plugin_helper/data/cert/with_ca/cert-pass.pem +0 -21
  210. data/test/plugin_helper/data/cert/with_ca/cert.pem +0 -21
  211. data/test/plugin_helper/data/cert/without_ca/cert-key-pass.pem +0 -30
  212. data/test/plugin_helper/data/cert/without_ca/cert-key.pem +0 -27
  213. data/test/plugin_helper/data/cert/without_ca/cert-pass.pem +0 -20
  214. data/test/plugin_helper/data/cert/without_ca/cert.pem +0 -20
  215. data/test/plugin_helper/http_server/test_app.rb +0 -65
  216. data/test/plugin_helper/http_server/test_route.rb +0 -32
  217. data/test/plugin_helper/service_discovery/test_manager.rb +0 -93
  218. data/test/plugin_helper/service_discovery/test_round_robin_balancer.rb +0 -21
  219. data/test/plugin_helper/test_cert_option.rb +0 -25
  220. data/test/plugin_helper/test_child_process.rb +0 -862
  221. data/test/plugin_helper/test_compat_parameters.rb +0 -358
  222. data/test/plugin_helper/test_event_emitter.rb +0 -80
  223. data/test/plugin_helper/test_event_loop.rb +0 -52
  224. data/test/plugin_helper/test_extract.rb +0 -194
  225. data/test/plugin_helper/test_formatter.rb +0 -255
  226. data/test/plugin_helper/test_http_server_helper.rb +0 -372
  227. data/test/plugin_helper/test_inject.rb +0 -561
  228. data/test/plugin_helper/test_metrics.rb +0 -137
  229. data/test/plugin_helper/test_parser.rb +0 -264
  230. data/test/plugin_helper/test_record_accessor.rb +0 -238
  231. data/test/plugin_helper/test_retry_state.rb +0 -1006
  232. data/test/plugin_helper/test_server.rb +0 -1895
  233. data/test/plugin_helper/test_service_discovery.rb +0 -165
  234. data/test/plugin_helper/test_socket.rb +0 -146
  235. data/test/plugin_helper/test_storage.rb +0 -542
  236. data/test/plugin_helper/test_thread.rb +0 -164
  237. data/test/plugin_helper/test_timer.rb +0 -130
  238. data/test/scripts/exec_script.rb +0 -32
  239. data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +0 -7
  240. data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +0 -7
  241. data/test/scripts/fluent/plugin/formatter_known.rb +0 -8
  242. data/test/scripts/fluent/plugin/out_test.rb +0 -81
  243. data/test/scripts/fluent/plugin/out_test2.rb +0 -80
  244. data/test/scripts/fluent/plugin/parser_known.rb +0 -4
  245. data/test/test_capability.rb +0 -74
  246. data/test/test_clock.rb +0 -164
  247. data/test/test_config.rb +0 -369
  248. data/test/test_configdsl.rb +0 -148
  249. data/test/test_daemonizer.rb +0 -91
  250. data/test/test_engine.rb +0 -203
  251. data/test/test_event.rb +0 -531
  252. data/test/test_event_router.rb +0 -348
  253. data/test/test_event_time.rb +0 -199
  254. data/test/test_file_wrapper.rb +0 -53
  255. data/test/test_filter.rb +0 -121
  256. data/test/test_fluent_log_event_router.rb +0 -99
  257. data/test/test_formatter.rb +0 -369
  258. data/test/test_input.rb +0 -31
  259. data/test/test_log.rb +0 -1076
  260. data/test/test_match.rb +0 -148
  261. data/test/test_mixin.rb +0 -351
  262. data/test/test_msgpack_factory.rb +0 -50
  263. data/test/test_oj_options.rb +0 -55
  264. data/test/test_output.rb +0 -278
  265. data/test/test_plugin.rb +0 -251
  266. data/test/test_plugin_classes.rb +0 -370
  267. data/test/test_plugin_helper.rb +0 -81
  268. data/test/test_plugin_id.rb +0 -119
  269. data/test/test_process.rb +0 -14
  270. data/test/test_root_agent.rb +0 -951
  271. data/test/test_static_config_analysis.rb +0 -177
  272. data/test/test_supervisor.rb +0 -821
  273. data/test/test_test_drivers.rb +0 -136
  274. data/test/test_time_formatter.rb +0 -301
  275. data/test/test_time_parser.rb +0 -362
  276. data/test/test_tls.rb +0 -65
  277. data/test/test_unique_id.rb +0 -47
  278. data/test/test_variable_store.rb +0 -65
@@ -1,542 +0,0 @@
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 be configured with hash' do
103
- d = Dummy.new
104
- d.configure(config_element())
105
- conf = { '@type' => 'example' }
106
- assert_nothing_raised do
107
- d.storage_create(conf: conf)
108
- end
109
- end
110
-
111
- test 'can override default configuration parameters, but not overwrite whole definition' do
112
- d = Dummy.new
113
- d.configure(config_element())
114
- assert_equal 1, d.storage_configs.size
115
- assert_equal 'local', d.storage_configs.first[:@type]
116
-
117
- d = Dummy2.new
118
- d.configure(config_element('ROOT', '', {}, [config_element('storage', '', {}, [])]))
119
- assert_raise NoMethodError do
120
- d.storage
121
- end
122
- assert_equal 1, d.storage_configs.size
123
- assert_equal 'ex2', d.storage_configs.first[:@type]
124
- assert_equal '/tmp/yay', d.storage_configs.first.dummy_path
125
- end
126
-
127
- test 'creates instance of type specified by conf, or default_type if @type is missing in conf' do
128
- d = Dummy2.new
129
- d.configure(config_element())
130
- i = d.storage_create(conf: config_element('format', '', {'@type' => 'example'}), default_type: 'ex2')
131
- assert{ i.is_a?(Fluent::PluginHelper::Storage::SynchronizeWrapper) && i.instance_eval{ @storage }.is_a?(ExampleStorage) }
132
-
133
- d = Dummy2.new
134
- d.configure(config_element())
135
- i = d.storage_create(conf: nil, default_type: 'ex2')
136
- assert{ i.is_a?(Fluent::PluginHelper::Storage::SynchronizeWrapper) && i.instance_eval{ @storage }.is_a?(Example2Storage) }
137
- end
138
-
139
- test 'raises config error if config section is specified, but @type is not specified' do
140
- d = Dummy2.new
141
- d.configure(config_element())
142
- assert_raise Fluent::ConfigError.new("@type is required in <storage>") do
143
- d.storage_create(conf: config_element('storage', 'foo', {}), default_type: 'ex2')
144
- end
145
- end
146
-
147
- test 'raises config error if config argument has invalid characters' do
148
- d = Dummy.new
149
- assert_raise Fluent::ConfigError.new("Argument in <storage ARG> uses invalid characters: 'yaa y'") do
150
- d.configure(config_element('root', '', {}, [config_element('storage', 'yaa y', {'@type' => 'local'})]))
151
- end
152
- d.configure(config_element())
153
- assert_raise Fluent::ConfigError.new("Argument in <storage ARG> uses invalid characters: 'a,b'") do
154
- d.storage_create(usage: 'a,b', type: 'local')
155
- end
156
- end
157
-
158
- test 'can be configured without storage sections' do
159
- d = Dummy.new
160
- assert_nothing_raised do
161
- d.configure(config_element())
162
- end
163
- assert_equal 1, d._storages.size
164
- end
165
-
166
- test 'can be configured with a storage section' do
167
- d = Dummy.new
168
- conf = config_element('ROOT', '', {}, [
169
- config_element('storage', '', {'@type' => 'example'})
170
- ])
171
- assert_nothing_raised do
172
- d.configure(conf)
173
- end
174
- assert_equal 1, d._storages.size
175
- assert{ d._storages.values.all?{ |s| !s.running } }
176
- end
177
-
178
- test 'can be configured with 2 or more storage sections with different usages with each other' do
179
- d = Dummy.new
180
- conf = config_element('ROOT', '', {}, [
181
- config_element('storage', 'default', {'@type' => 'example'}),
182
- config_element('storage', 'extra', {'@type' => 'ex2', 'dummy_path' => 'v'}),
183
- ])
184
- assert_nothing_raised do
185
- d.configure(conf)
186
- end
187
- assert_equal 2, d._storages.size
188
- assert{ d._storages.values.all?{ |s| !s.running } }
189
- end
190
-
191
- test 'cannot be configured with 2 storage sections with same usage' do
192
- d = Dummy.new
193
- conf = config_element('ROOT', '', {}, [
194
- config_element('storage', 'default', {'@type' => 'example'}),
195
- config_element('storage', 'extra', {'@type' => 'ex2', 'dummy_path' => 'v'}),
196
- config_element('storage', 'extra', {'@type' => 'ex2', 'dummy_path' => 'v2'}),
197
- ])
198
- assert_raises Fluent::ConfigError do
199
- d.configure(conf)
200
- end
201
- end
202
-
203
- test 'creates a storage plugin instance which is already configured without usage' do
204
- @d = d = Dummy.new
205
- conf = config_element('ROOT', '', {}, [
206
- config_element('storage', '', {'@type' => 'example'})
207
- ])
208
- d.configure(conf)
209
- d.start
210
-
211
- s = d.storage_create
212
- assert{ s.implementation.is_a? ExampleStorage }
213
- end
214
-
215
- test 'creates a storage plugin instance which is already configured with usage' do
216
- @d = d = Dummy.new
217
- conf = config_element('ROOT', '', {}, [
218
- config_element('storage', 'mydata', {'@type' => 'example'})
219
- ])
220
- d.configure(conf)
221
- d.start
222
-
223
- s = d.storage_create(usage: 'mydata')
224
- assert{ s.implementation.is_a? ExampleStorage }
225
- end
226
-
227
- test 'creates a storage plugin without configurations' do
228
- @d = d = Dummy.new
229
- d.configure(config_element())
230
- d.start
231
-
232
- s = d.storage_create(usage: 'mydata', type: 'example', conf: config_element('storage', 'mydata'))
233
- assert{ s.implementation.is_a? ExampleStorage }
234
- end
235
-
236
- test 'creates 2 or more storage plugin instances' do
237
- @d = d = Dummy.new
238
- conf = config_element('ROOT', '', {}, [
239
- config_element('storage', 'mydata', {'@type' => 'example'}),
240
- config_element('storage', 'secret', {'@type' => 'ex2', 'dummy_path' => 'yay!'}),
241
- ])
242
- d.configure(conf)
243
- d.start
244
-
245
- s1 = d.storage_create(usage: 'mydata')
246
- s2 = d.storage_create(usage: 'secret')
247
- assert{ s1.implementation.is_a? ExampleStorage }
248
- assert{ s2.implementation.is_a? Example2Storage }
249
- assert_equal 'yay!', s2.implementation.dummy_path
250
- end
251
-
252
- test 'creates wrapped instances for non-synchronized plugin in default' do # and check operations
253
- @d = d = Dummy.new
254
- conf = config_element('ROOT', '', {}, [
255
- config_element('storage', 'mydata', {'@type' => 'example'})
256
- ])
257
- d.configure(conf)
258
- d.start
259
-
260
- s = d.storage_create(usage: 'mydata')
261
- assert !s.implementation.synchronized?
262
- assert{ s.is_a? Fluent::PluginHelper::Storage::SynchronizeWrapper }
263
- assert s.synchronized?
264
- assert s.autosave
265
- assert s.save_at_shutdown
266
-
267
- assert_nil s.get('key')
268
- assert_equal 'value', s.put('key', 'value')
269
- assert_equal 'value', s.fetch('key', 'v1')
270
- assert_equal 'v2', s.update('key'){|v| v[0] + '2' }
271
- assert_equal 'v2', s.get('key')
272
- assert_equal 'v2', s.delete('key')
273
- end
274
-
275
- test 'creates wrapped instances for non-persistent plugins when configured as persistent' do # and check operations
276
- @d = d = Dummy.new
277
- conf = config_element('ROOT', '', {}, [
278
- config_element('storage', 'mydata', {'@type' => 'example', 'persistent' => 'true'})
279
- ])
280
- d.configure(conf)
281
- d.start
282
-
283
- s = d.storage_create(usage: 'mydata')
284
- assert !s.implementation.persistent_always?
285
- assert{ s.is_a? Fluent::PluginHelper::Storage::PersistentWrapper }
286
- assert s.persistent
287
- assert s.persistent_always?
288
- assert s.synchronized?
289
- assert !s.autosave
290
- assert s.save_at_shutdown
291
-
292
- assert_nil s.get('key')
293
- assert_equal 'value', s.put('key', 'value')
294
- assert_equal 'value', s.fetch('key', 'v1')
295
- assert_equal 'v2', s.update('key'){|v| v[0] + '2' }
296
- assert_equal 'v2', s.get('key')
297
- assert_equal 'v2', s.delete('key')
298
- end
299
-
300
- test 'creates bare instances for synchronized plugin in default' do
301
- @d = d = Dummy.new
302
- conf = config_element('ROOT', '', {}, [
303
- config_element('storage', 'mydata', {'@type' => 'ex3'})
304
- ])
305
- d.configure(conf)
306
- d.start
307
-
308
- s = d.storage_create(usage: 'mydata')
309
- assert s.implementation.synchronized?
310
- assert{ s.is_a? Example3Storage }
311
- assert s.synchronized?
312
- end
313
-
314
- test 'creates bare instances for persistent-always plugin when configured as persistent' do
315
- @d = d = Dummy.new
316
- conf = config_element('ROOT', '', {}, [
317
- config_element('storage', 'mydata', {'@type' => 'ex4', 'persistent' => 'true'})
318
- ])
319
- d.configure(conf)
320
- d.start
321
-
322
- s = d.storage_create(usage: 'mydata')
323
- assert s.implementation.persistent_always?
324
- assert{ s.is_a? Example4Storage }
325
- assert s.persistent
326
- assert s.persistent_always?
327
- assert s.synchronized?
328
- end
329
-
330
- test 'does not execute timer if autosave is not specified' do
331
- @d = d = Dummy.new
332
- conf = config_element('ROOT', '', {}, [
333
- config_element('storage', 'mydata', {'@type' => 'example', 'autosave' => 'false'})
334
- ])
335
- d.configure(conf)
336
- d.start
337
-
338
- d.storage_create(usage: 'mydata')
339
- assert_equal 0, d._timers.size
340
- end
341
-
342
- test 'executes timer if autosave is specified and plugin is not persistent' do
343
- @d = d = Dummy.new
344
- conf = config_element('ROOT', '', {}, [
345
- config_element('storage', 'mydata', {'@type' => 'example', 'autosave_interval' => '1s', 'persistent' => 'false'})
346
- ])
347
- d.configure(conf)
348
- d.start
349
-
350
- d.storage_create(usage: 'mydata')
351
- assert_equal 1, d._timers.size
352
- end
353
-
354
- test 'executes timer for autosave, which calls #save periodically' do
355
- @d = d = Dummy.new
356
- conf = config_element('ROOT', '', {}, [
357
- config_element('storage', 'mydata', {'@type' => 'example', 'autosave_interval' => '1s', 'persistent' => 'false'})
358
- ])
359
- d.configure(conf)
360
- d.start
361
-
362
- s = d.storage_create(usage: 'mydata')
363
- assert_equal 1, d._timers.size
364
- timeout = Time.now + 3
365
- while Time.now < timeout
366
- s.put('k', 'v')
367
- sleep 0.2
368
- end
369
-
370
- d.stop
371
- assert{ s.implementation.save_times > 0 }
372
- end
373
-
374
- test 'saves data for each operations if plugin storage is configured as persistent, and wrapped' do
375
- @d = d = Dummy.new
376
- conf = config_element('ROOT', '', {}, [
377
- config_element('storage', 'mydata', {'@type' => 'example', 'persistent' => 'true'})
378
- ])
379
- d.configure(conf)
380
- d.start
381
- s = d.storage_create(usage: 'mydata')
382
- assert_equal 1, s.implementation.load_times
383
- assert_equal 0, s.implementation.save_times
384
-
385
- s.get('k1')
386
- assert_equal 2, s.implementation.load_times
387
- assert_equal 0, s.implementation.save_times
388
-
389
- s.put('k1', 'v1')
390
- assert_equal 3, s.implementation.load_times
391
- assert_equal 1, s.implementation.save_times
392
-
393
- s.fetch('k2', 'v2')
394
- assert_equal 4, s.implementation.load_times
395
- assert_equal 1, s.implementation.save_times
396
-
397
- s.delete('k1')
398
- assert_equal 5, s.implementation.load_times
399
- assert_equal 2, s.implementation.save_times
400
- end
401
-
402
- test 'stops timer for autosave by #stop, calls #save by #shutdown if save_at_shutdown is specified' do
403
- @d = d = Dummy.new
404
- conf = config_element('ROOT', '', {}, [
405
- config_element('storage', 'mydata', {'@type' => 'example', 'save_at_shutdown' => 'true'})
406
- ])
407
- d.configure(conf)
408
-
409
- assert !d.timer_running?
410
-
411
- d.start
412
-
413
- assert d.timer_running?
414
-
415
- s = d.storage_create(usage: 'mydata')
416
- assert s.autosave
417
- assert_equal 1, d._timers.size
418
-
419
- d.stop
420
-
421
- assert !d.timer_running?
422
-
423
- assert_equal 1, s.implementation.load_times
424
- assert_equal 0, s.implementation.save_times
425
-
426
- d.before_shutdown
427
-
428
- d.shutdown
429
-
430
- assert_equal 1, s.implementation.load_times
431
- assert_equal 1, s.implementation.save_times
432
- end
433
-
434
- test 'calls #close and #terminate for all plugin instances by #close/#shutdown' do
435
- @d = d = Dummy.new
436
- conf = config_element('ROOT', '', {}, [
437
- config_element('storage', 'mydata', {'@type' => 'example', 'autosave' => 'false', 'save_at_shutdown' => 'true'})
438
- ])
439
- d.configure(conf)
440
- d.start
441
- s = d.storage_create(usage: 'mydata')
442
-
443
- s.put('k1', 'v1')
444
- s.put('k2', 2)
445
- s.put('k3', true)
446
-
447
- d.stop
448
-
449
- assert_equal 3, s.implementation.data.size
450
- assert_equal 0, s.implementation.saved.size
451
-
452
- d.shutdown
453
-
454
- assert_equal 3, s.implementation.data.size
455
- assert_equal 3, s.implementation.saved.size
456
-
457
- d.close
458
-
459
- assert_equal 0, s.implementation.data.size
460
- assert_equal 3, s.implementation.saved.size
461
-
462
- d.shutdown
463
-
464
- assert_equal 0, s.implementation.data.size
465
- assert_equal 0, s.implementation.saved.size
466
- end
467
-
468
- test 'calls lifecycle methods for all plugin instances via owner plugin' do
469
- @d = d = Dummy.new
470
- conf = config_element('ROOT', '', {}, [ config_element('storage', '', {'@type' => 'example'}), config_element('storage', 'e2', {'@type' => 'example'}) ])
471
- d.configure(conf)
472
- d.start
473
-
474
- i1 = d.storage_create(usage: '')
475
- i2 = d.storage_create(usage: 'e2')
476
- i3 = d.storage_create(usage: 'e3', type: 'ex2')
477
-
478
- assert i1.started?
479
- assert i2.started?
480
- assert i3.started?
481
-
482
- assert !i1.stopped?
483
- assert !i2.stopped?
484
- assert !i3.stopped?
485
-
486
- d.stop
487
-
488
- assert i1.stopped?
489
- assert i2.stopped?
490
- assert i3.stopped?
491
-
492
- assert !i1.before_shutdown?
493
- assert !i2.before_shutdown?
494
- assert !i3.before_shutdown?
495
-
496
- d.before_shutdown
497
-
498
- assert i1.before_shutdown?
499
- assert i2.before_shutdown?
500
- assert i3.before_shutdown?
501
-
502
- assert !i1.shutdown?
503
- assert !i2.shutdown?
504
- assert !i3.shutdown?
505
-
506
- d.shutdown
507
-
508
- assert i1.shutdown?
509
- assert i2.shutdown?
510
- assert i3.shutdown?
511
-
512
- assert !i1.after_shutdown?
513
- assert !i2.after_shutdown?
514
- assert !i3.after_shutdown?
515
-
516
- d.after_shutdown
517
-
518
- assert i1.after_shutdown?
519
- assert i2.after_shutdown?
520
- assert i3.after_shutdown?
521
-
522
- assert !i1.closed?
523
- assert !i2.closed?
524
- assert !i3.closed?
525
-
526
- d.close
527
-
528
- assert i1.closed?
529
- assert i2.closed?
530
- assert i3.closed?
531
-
532
- assert !i1.terminated?
533
- assert !i2.terminated?
534
- assert !i3.terminated?
535
-
536
- d.terminate
537
-
538
- assert i1.terminated?
539
- assert i2.terminated?
540
- assert i3.terminated?
541
- end
542
- end
@@ -1,164 +0,0 @@
1
- require_relative '../helper'
2
- require 'fluent/plugin_helper/thread'
3
- require 'fluent/plugin/base'
4
- require 'timeout'
5
-
6
- class ThreadTest < Test::Unit::TestCase
7
- class Dummy < Fluent::Plugin::TestBase
8
- helpers :thread
9
- def configure(conf)
10
- super
11
- @_thread_wait_seconds = 0.1
12
- self
13
- end
14
- end
15
-
16
- test 'can be instantiated to be able to create threads' do
17
- d1 = Dummy.new
18
- assert d1.respond_to?(:thread_current_running?)
19
- assert d1.respond_to?(:thread_create)
20
- assert d1.respond_to?(:_threads)
21
- assert !d1.thread_current_running?
22
- assert d1._threads.empty?
23
- end
24
-
25
- test 'can be configured' do
26
- d1 = Dummy.new
27
- assert_nothing_raised do
28
- d1.configure(config_element())
29
- end
30
- assert d1.plugin_id
31
- assert d1.log
32
- end
33
-
34
- test 'can create thread after prepared' do
35
- d1 = Dummy.new
36
- d1.configure(config_element())
37
- d1.start
38
-
39
- m1 = Mutex.new
40
- m2 = Mutex.new
41
-
42
- m1.lock
43
- thread_run = false
44
-
45
- Timeout.timeout(10) do
46
- t = d1.thread_create(:test1) do
47
- m2.lock
48
-
49
- assert !d1._threads.empty? # this must be true always
50
- assert d1.thread_current_running?
51
-
52
- thread_run = true
53
- m2.unlock
54
- m1.lock
55
- end
56
- Thread.pass until m2.locked? || thread_run
57
-
58
- m2.lock; m2.unlock
59
- assert_equal 1, d1._threads.size
60
-
61
- assert_equal :test1, t[:_fluentd_plugin_helper_thread_title]
62
- assert t[:_fluentd_plugin_helper_thread_running]
63
- assert !d1._threads.empty?
64
-
65
- m1.unlock
66
-
67
- while t[:_fluentd_plugin_helper_thread_running]
68
- Thread.pass
69
- end
70
- end
71
-
72
- assert d1._threads.empty?
73
-
74
- d1.stop; d1.shutdown; d1.close; d1.terminate
75
- end
76
-
77
- test 'can wait until all threads start' do
78
- d1 = Dummy.new.configure(config_element()).start
79
- ary = []
80
- d1.thread_create(:t1) do
81
- ary << 1
82
- end
83
- d1.thread_create(:t2) do
84
- ary << 2
85
- end
86
- d1.thread_create(:t3) do
87
- ary << 3
88
- end
89
- Timeout.timeout(10) do
90
- d1.thread_wait_until_start
91
- end
92
- assert_equal [1,2,3], ary.sort
93
-
94
- d1.stop; d1.shutdown; d1.close; d1.terminate
95
- end
96
-
97
- test 'can stop threads which is watching thread_current_running?, and then close it' do
98
- d1 = Dummy.new.configure(config_element()).start
99
-
100
- m1 = Mutex.new
101
- thread_in_run = false
102
- Timeout.timeout(10) do
103
- t = d1.thread_create(:test2) do
104
- thread_in_run = true
105
- m1.lock
106
- while d1.thread_current_running?
107
- Thread.pass
108
- end
109
- thread_in_run = false
110
- m1.unlock
111
- end
112
- Thread.pass until m1.locked?
113
-
114
- assert thread_in_run
115
- assert !d1._threads.empty?
116
-
117
- d1.stop
118
- Thread.pass while m1.locked?
119
- assert !t[:_fluentd_plugin_helper_thread_running]
120
- assert t.stop?
121
- end
122
-
123
- assert d1._threads.empty?
124
-
125
- d1.stop; d1.shutdown; d1.close; d1.terminate
126
- end
127
-
128
- test 'can terminate threads forcedly which is running forever' do
129
- d1 = Dummy.new.configure(config_element()).start
130
-
131
- m1 = Mutex.new
132
- thread_in_run = false
133
- Timeout.timeout(10) do
134
- t = d1.thread_create(:test2) do
135
- thread_in_run = true
136
- m1.lock
137
- while true
138
- Thread.pass
139
- end
140
- thread_in_run = false
141
- end
142
- Thread.pass until m1.locked?
143
-
144
- assert thread_in_run
145
- assert !d1._threads.empty?
146
-
147
- d1.stop
148
- assert !t[:_fluentd_plugin_helper_thread_running]
149
- assert t.alive?
150
-
151
- d1.shutdown
152
- assert t.alive?
153
- assert !d1._threads.empty?
154
-
155
- d1.close
156
- assert t.alive?
157
- assert !d1._threads.empty?
158
-
159
- d1.terminate
160
- assert t.stop?
161
- assert d1._threads.empty?
162
- end
163
- end
164
- end