fluentd 1.16.5-x64-mingw32 → 1.17.1-x64-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (268) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +88 -0
  3. data/README.md +2 -1
  4. data/Rakefile +1 -1
  5. data/SECURITY.md +2 -2
  6. data/fluent.conf +14 -14
  7. data/lib/fluent/command/binlog_reader.rb +1 -1
  8. data/lib/fluent/command/cap_ctl.rb +4 -4
  9. data/lib/fluent/compat/call_super_mixin.rb +3 -3
  10. data/lib/fluent/compat/propagate_default.rb +4 -4
  11. data/lib/fluent/config/configure_proxy.rb +2 -2
  12. data/lib/fluent/config/types.rb +1 -1
  13. data/lib/fluent/config/yaml_parser/parser.rb +4 -0
  14. data/lib/fluent/configurable.rb +2 -2
  15. data/lib/fluent/counter/mutex_hash.rb +1 -1
  16. data/lib/fluent/fluent_log_event_router.rb +0 -2
  17. data/lib/fluent/log/console_adapter.rb +4 -2
  18. data/lib/fluent/plugin/buf_file.rb +1 -1
  19. data/lib/fluent/plugin/buffer/file_chunk.rb +1 -1
  20. data/lib/fluent/plugin/buffer/file_single_chunk.rb +2 -3
  21. data/lib/fluent/plugin/filter_parser.rb +26 -8
  22. data/lib/fluent/plugin/in_exec.rb +14 -2
  23. data/lib/fluent/plugin/in_http.rb +19 -54
  24. data/lib/fluent/plugin/in_sample.rb +13 -7
  25. data/lib/fluent/plugin/in_tail.rb +99 -25
  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 +137 -13
  29. data/lib/fluent/plugin/owned_by_mixin.rb +0 -1
  30. data/lib/fluent/plugin/parser_json.rb +26 -17
  31. data/lib/fluent/plugin/parser_msgpack.rb +24 -3
  32. data/lib/fluent/plugin_helper/http_server/server.rb +1 -1
  33. data/lib/fluent/plugin_helper/metrics.rb +2 -2
  34. data/lib/fluent/registry.rb +6 -6
  35. data/lib/fluent/test/output_test.rb +1 -1
  36. data/lib/fluent/unique_id.rb +1 -1
  37. data/lib/fluent/version.rb +1 -1
  38. data/templates/new_gem/fluent-plugin.gemspec.erb +6 -5
  39. metadata +109 -459
  40. data/.github/ISSUE_TEMPLATE/bug_report.yml +0 -71
  41. data/.github/ISSUE_TEMPLATE/config.yml +0 -5
  42. data/.github/ISSUE_TEMPLATE/feature_request.yml +0 -39
  43. data/.github/ISSUE_TEMPLATE.md +0 -17
  44. data/.github/PULL_REQUEST_TEMPLATE.md +0 -14
  45. data/.github/workflows/stale-actions.yml +0 -24
  46. data/.github/workflows/test.yml +0 -32
  47. data/.gitignore +0 -30
  48. data/Gemfile +0 -9
  49. data/fluentd.gemspec +0 -54
  50. data/test/command/test_binlog_reader.rb +0 -362
  51. data/test/command/test_ca_generate.rb +0 -70
  52. data/test/command/test_cap_ctl.rb +0 -100
  53. data/test/command/test_cat.rb +0 -128
  54. data/test/command/test_ctl.rb +0 -56
  55. data/test/command/test_fluentd.rb +0 -1291
  56. data/test/command/test_plugin_config_formatter.rb +0 -397
  57. data/test/command/test_plugin_generator.rb +0 -109
  58. data/test/compat/test_calls_super.rb +0 -166
  59. data/test/compat/test_parser.rb +0 -92
  60. data/test/config/assertions.rb +0 -42
  61. data/test/config/test_config_parser.rb +0 -551
  62. data/test/config/test_configurable.rb +0 -1784
  63. data/test/config/test_configure_proxy.rb +0 -604
  64. data/test/config/test_dsl.rb +0 -415
  65. data/test/config/test_element.rb +0 -518
  66. data/test/config/test_literal_parser.rb +0 -309
  67. data/test/config/test_plugin_configuration.rb +0 -56
  68. data/test/config/test_section.rb +0 -191
  69. data/test/config/test_system_config.rb +0 -195
  70. data/test/config/test_types.rb +0 -408
  71. data/test/counter/test_client.rb +0 -563
  72. data/test/counter/test_error.rb +0 -44
  73. data/test/counter/test_mutex_hash.rb +0 -179
  74. data/test/counter/test_server.rb +0 -589
  75. data/test/counter/test_store.rb +0 -258
  76. data/test/counter/test_validator.rb +0 -137
  77. data/test/helper.rb +0 -155
  78. data/test/helpers/fuzzy_assert.rb +0 -89
  79. data/test/helpers/process_extenstion.rb +0 -33
  80. data/test/log/test_console_adapter.rb +0 -110
  81. data/test/plugin/data/2010/01/20100102-030405.log +0 -0
  82. data/test/plugin/data/2010/01/20100102-030406.log +0 -0
  83. data/test/plugin/data/2010/01/20100102.log +0 -0
  84. data/test/plugin/data/log/bar +0 -0
  85. data/test/plugin/data/log/foo/bar.log +0 -0
  86. data/test/plugin/data/log/foo/bar2 +0 -0
  87. data/test/plugin/data/log/test.log +0 -0
  88. data/test/plugin/data/sd_file/config +0 -11
  89. data/test/plugin/data/sd_file/config.json +0 -17
  90. data/test/plugin/data/sd_file/config.yaml +0 -11
  91. data/test/plugin/data/sd_file/config.yml +0 -11
  92. data/test/plugin/data/sd_file/invalid_config.yml +0 -7
  93. data/test/plugin/in_tail/test_fifo.rb +0 -121
  94. data/test/plugin/in_tail/test_io_handler.rb +0 -150
  95. data/test/plugin/in_tail/test_position_file.rb +0 -346
  96. data/test/plugin/out_forward/test_ack_handler.rb +0 -140
  97. data/test/plugin/out_forward/test_connection_manager.rb +0 -145
  98. data/test/plugin/out_forward/test_handshake_protocol.rb +0 -112
  99. data/test/plugin/out_forward/test_load_balancer.rb +0 -106
  100. data/test/plugin/out_forward/test_socket_cache.rb +0 -174
  101. data/test/plugin/test_bare_output.rb +0 -131
  102. data/test/plugin/test_base.rb +0 -247
  103. data/test/plugin/test_buf_file.rb +0 -1314
  104. data/test/plugin/test_buf_file_single.rb +0 -898
  105. data/test/plugin/test_buf_memory.rb +0 -42
  106. data/test/plugin/test_buffer.rb +0 -1493
  107. data/test/plugin/test_buffer_chunk.rb +0 -209
  108. data/test/plugin/test_buffer_file_chunk.rb +0 -871
  109. data/test/plugin/test_buffer_file_single_chunk.rb +0 -611
  110. data/test/plugin/test_buffer_memory_chunk.rb +0 -339
  111. data/test/plugin/test_compressable.rb +0 -87
  112. data/test/plugin/test_file_util.rb +0 -96
  113. data/test/plugin/test_filter.rb +0 -368
  114. data/test/plugin/test_filter_grep.rb +0 -697
  115. data/test/plugin/test_filter_parser.rb +0 -731
  116. data/test/plugin/test_filter_record_transformer.rb +0 -577
  117. data/test/plugin/test_filter_stdout.rb +0 -207
  118. data/test/plugin/test_formatter_csv.rb +0 -136
  119. data/test/plugin/test_formatter_hash.rb +0 -38
  120. data/test/plugin/test_formatter_json.rb +0 -61
  121. data/test/plugin/test_formatter_ltsv.rb +0 -70
  122. data/test/plugin/test_formatter_msgpack.rb +0 -28
  123. data/test/plugin/test_formatter_out_file.rb +0 -116
  124. data/test/plugin/test_formatter_single_value.rb +0 -44
  125. data/test/plugin/test_formatter_tsv.rb +0 -76
  126. data/test/plugin/test_in_debug_agent.rb +0 -49
  127. data/test/plugin/test_in_exec.rb +0 -261
  128. data/test/plugin/test_in_forward.rb +0 -1178
  129. data/test/plugin/test_in_gc_stat.rb +0 -62
  130. data/test/plugin/test_in_http.rb +0 -1102
  131. data/test/plugin/test_in_monitor_agent.rb +0 -922
  132. data/test/plugin/test_in_object_space.rb +0 -66
  133. data/test/plugin/test_in_sample.rb +0 -190
  134. data/test/plugin/test_in_syslog.rb +0 -505
  135. data/test/plugin/test_in_tail.rb +0 -3288
  136. data/test/plugin/test_in_tcp.rb +0 -328
  137. data/test/plugin/test_in_udp.rb +0 -296
  138. data/test/plugin/test_in_unix.rb +0 -181
  139. data/test/plugin/test_input.rb +0 -137
  140. data/test/plugin/test_metadata.rb +0 -89
  141. data/test/plugin/test_metrics.rb +0 -294
  142. data/test/plugin/test_metrics_local.rb +0 -96
  143. data/test/plugin/test_multi_output.rb +0 -204
  144. data/test/plugin/test_out_copy.rb +0 -308
  145. data/test/plugin/test_out_exec.rb +0 -312
  146. data/test/plugin/test_out_exec_filter.rb +0 -606
  147. data/test/plugin/test_out_file.rb +0 -1038
  148. data/test/plugin/test_out_forward.rb +0 -1349
  149. data/test/plugin/test_out_http.rb +0 -429
  150. data/test/plugin/test_out_null.rb +0 -105
  151. data/test/plugin/test_out_relabel.rb +0 -28
  152. data/test/plugin/test_out_roundrobin.rb +0 -146
  153. data/test/plugin/test_out_secondary_file.rb +0 -458
  154. data/test/plugin/test_out_stdout.rb +0 -205
  155. data/test/plugin/test_out_stream.rb +0 -103
  156. data/test/plugin/test_output.rb +0 -1334
  157. data/test/plugin/test_output_as_buffered.rb +0 -2024
  158. data/test/plugin/test_output_as_buffered_backup.rb +0 -363
  159. data/test/plugin/test_output_as_buffered_compress.rb +0 -179
  160. data/test/plugin/test_output_as_buffered_overflow.rb +0 -250
  161. data/test/plugin/test_output_as_buffered_retries.rb +0 -966
  162. data/test/plugin/test_output_as_buffered_secondary.rb +0 -882
  163. data/test/plugin/test_output_as_standard.rb +0 -374
  164. data/test/plugin/test_owned_by.rb +0 -35
  165. data/test/plugin/test_parser.rb +0 -399
  166. data/test/plugin/test_parser_apache.rb +0 -42
  167. data/test/plugin/test_parser_apache2.rb +0 -47
  168. data/test/plugin/test_parser_apache_error.rb +0 -45
  169. data/test/plugin/test_parser_csv.rb +0 -200
  170. data/test/plugin/test_parser_json.rb +0 -138
  171. data/test/plugin/test_parser_labeled_tsv.rb +0 -160
  172. data/test/plugin/test_parser_multiline.rb +0 -111
  173. data/test/plugin/test_parser_nginx.rb +0 -88
  174. data/test/plugin/test_parser_none.rb +0 -52
  175. data/test/plugin/test_parser_regexp.rb +0 -284
  176. data/test/plugin/test_parser_syslog.rb +0 -650
  177. data/test/plugin/test_parser_tsv.rb +0 -122
  178. data/test/plugin/test_sd_file.rb +0 -228
  179. data/test/plugin/test_sd_srv.rb +0 -230
  180. data/test/plugin/test_storage.rb +0 -167
  181. data/test/plugin/test_storage_local.rb +0 -335
  182. data/test/plugin/test_string_util.rb +0 -26
  183. data/test/plugin_helper/data/cert/cert-key.pem +0 -27
  184. data/test/plugin_helper/data/cert/cert-with-CRLF.pem +0 -19
  185. data/test/plugin_helper/data/cert/cert-with-no-newline.pem +0 -19
  186. data/test/plugin_helper/data/cert/cert.pem +0 -19
  187. data/test/plugin_helper/data/cert/cert_chains/ca-cert-key.pem +0 -27
  188. data/test/plugin_helper/data/cert/cert_chains/ca-cert.pem +0 -20
  189. data/test/plugin_helper/data/cert/cert_chains/cert-key.pem +0 -27
  190. data/test/plugin_helper/data/cert/cert_chains/cert.pem +0 -40
  191. data/test/plugin_helper/data/cert/empty.pem +0 -0
  192. data/test/plugin_helper/data/cert/generate_cert.rb +0 -125
  193. data/test/plugin_helper/data/cert/with_ca/ca-cert-key-pass.pem +0 -30
  194. data/test/plugin_helper/data/cert/with_ca/ca-cert-key.pem +0 -27
  195. data/test/plugin_helper/data/cert/with_ca/ca-cert-pass.pem +0 -20
  196. data/test/plugin_helper/data/cert/with_ca/ca-cert.pem +0 -20
  197. data/test/plugin_helper/data/cert/with_ca/cert-key-pass.pem +0 -30
  198. data/test/plugin_helper/data/cert/with_ca/cert-key.pem +0 -27
  199. data/test/plugin_helper/data/cert/with_ca/cert-pass.pem +0 -21
  200. data/test/plugin_helper/data/cert/with_ca/cert.pem +0 -21
  201. data/test/plugin_helper/data/cert/without_ca/cert-key-pass.pem +0 -30
  202. data/test/plugin_helper/data/cert/without_ca/cert-key.pem +0 -27
  203. data/test/plugin_helper/data/cert/without_ca/cert-pass.pem +0 -20
  204. data/test/plugin_helper/data/cert/without_ca/cert.pem +0 -20
  205. data/test/plugin_helper/http_server/test_app.rb +0 -65
  206. data/test/plugin_helper/http_server/test_route.rb +0 -32
  207. data/test/plugin_helper/service_discovery/test_manager.rb +0 -93
  208. data/test/plugin_helper/service_discovery/test_round_robin_balancer.rb +0 -21
  209. data/test/plugin_helper/test_cert_option.rb +0 -25
  210. data/test/plugin_helper/test_child_process.rb +0 -862
  211. data/test/plugin_helper/test_compat_parameters.rb +0 -358
  212. data/test/plugin_helper/test_event_emitter.rb +0 -80
  213. data/test/plugin_helper/test_event_loop.rb +0 -52
  214. data/test/plugin_helper/test_extract.rb +0 -194
  215. data/test/plugin_helper/test_formatter.rb +0 -255
  216. data/test/plugin_helper/test_http_server_helper.rb +0 -372
  217. data/test/plugin_helper/test_inject.rb +0 -561
  218. data/test/plugin_helper/test_metrics.rb +0 -137
  219. data/test/plugin_helper/test_parser.rb +0 -264
  220. data/test/plugin_helper/test_record_accessor.rb +0 -238
  221. data/test/plugin_helper/test_retry_state.rb +0 -1006
  222. data/test/plugin_helper/test_server.rb +0 -1895
  223. data/test/plugin_helper/test_service_discovery.rb +0 -165
  224. data/test/plugin_helper/test_socket.rb +0 -146
  225. data/test/plugin_helper/test_storage.rb +0 -542
  226. data/test/plugin_helper/test_thread.rb +0 -164
  227. data/test/plugin_helper/test_timer.rb +0 -130
  228. data/test/scripts/exec_script.rb +0 -32
  229. data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +0 -7
  230. data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +0 -7
  231. data/test/scripts/fluent/plugin/formatter_known.rb +0 -8
  232. data/test/scripts/fluent/plugin/out_test.rb +0 -81
  233. data/test/scripts/fluent/plugin/out_test2.rb +0 -80
  234. data/test/scripts/fluent/plugin/parser_known.rb +0 -4
  235. data/test/test_capability.rb +0 -74
  236. data/test/test_clock.rb +0 -164
  237. data/test/test_config.rb +0 -369
  238. data/test/test_configdsl.rb +0 -148
  239. data/test/test_daemonizer.rb +0 -91
  240. data/test/test_engine.rb +0 -203
  241. data/test/test_event.rb +0 -531
  242. data/test/test_event_router.rb +0 -348
  243. data/test/test_event_time.rb +0 -199
  244. data/test/test_file_wrapper.rb +0 -53
  245. data/test/test_filter.rb +0 -121
  246. data/test/test_fluent_log_event_router.rb +0 -99
  247. data/test/test_formatter.rb +0 -369
  248. data/test/test_input.rb +0 -31
  249. data/test/test_log.rb +0 -1076
  250. data/test/test_match.rb +0 -148
  251. data/test/test_mixin.rb +0 -351
  252. data/test/test_msgpack_factory.rb +0 -50
  253. data/test/test_oj_options.rb +0 -55
  254. data/test/test_output.rb +0 -278
  255. data/test/test_plugin.rb +0 -251
  256. data/test/test_plugin_classes.rb +0 -370
  257. data/test/test_plugin_helper.rb +0 -81
  258. data/test/test_plugin_id.rb +0 -119
  259. data/test/test_process.rb +0 -14
  260. data/test/test_root_agent.rb +0 -951
  261. data/test/test_static_config_analysis.rb +0 -177
  262. data/test/test_supervisor.rb +0 -821
  263. data/test/test_test_drivers.rb +0 -136
  264. data/test/test_time_formatter.rb +0 -301
  265. data/test/test_time_parser.rb +0 -362
  266. data/test/test_tls.rb +0 -65
  267. data/test/test_unique_id.rb +0 -47
  268. data/test/test_variable_store.rb +0 -65
@@ -1,458 +0,0 @@
1
- require_relative '../helper'
2
- require 'time'
3
- require 'fileutils'
4
- require 'fluent/event'
5
- require 'fluent/unique_id'
6
- require 'fluent/plugin/buffer'
7
- require 'fluent/plugin/out_secondary_file'
8
- require 'fluent/plugin/buffer/memory_chunk'
9
- require 'fluent/test/driver/output'
10
-
11
- class FileOutputSecondaryTest < Test::Unit::TestCase
12
- include Fluent::UniqueId::Mixin
13
-
14
- def setup
15
- Fluent::Test.setup
16
- FileUtils.rm_rf(TMP_DIR)
17
- FileUtils.mkdir_p(TMP_DIR)
18
- end
19
-
20
- TMP_DIR = File.expand_path(File.dirname(__FILE__) + "/../tmp/out_secondary_file#{ENV['TEST_ENV_NUMBER']}")
21
-
22
- CONFIG = %[
23
- directory #{TMP_DIR}
24
- basename out_file_test
25
- compress gzip
26
- ]
27
-
28
- class DummyOutput < Fluent::Plugin::Output
29
- def write(chunk); end
30
- end
31
-
32
- def create_primary(buffer_cofig = config_element('buffer'))
33
- DummyOutput.new.configure(config_element('ROOT','',{}, [buffer_cofig]))
34
- end
35
-
36
- def create_driver(conf = CONFIG, primary = create_primary)
37
- c = Fluent::Test::Driver::Output.new(Fluent::Plugin::SecondaryFileOutput)
38
- c.instance.acts_as_secondary(primary)
39
- c.configure(conf)
40
- end
41
-
42
- sub_test_case 'configure' do
43
- test 'default configuration' do
44
- d = create_driver %[directory #{TMP_DIR}]
45
- assert_equal 'dump.bin', d.instance.basename
46
- assert_equal TMP_DIR, d.instance.directory
47
- assert_equal :text, d.instance.compress
48
- assert_equal false, d.instance.append
49
- end
50
-
51
- test 'should be configurable' do
52
- d = create_driver %[
53
- directory #{TMP_DIR}
54
- basename out_file_test
55
- compress gzip
56
- append true
57
- ]
58
- assert_equal 'out_file_test', d.instance.basename
59
- assert_equal TMP_DIR, d.instance.directory
60
- assert_equal :gzip, d.instance.compress
61
- assert_equal true, d.instance.append
62
- end
63
-
64
- test 'should only use in secondary' do
65
- c = Fluent::Test::Driver::Output.new(Fluent::Plugin::SecondaryFileOutput)
66
- assert_raise Fluent::ConfigError.new("This plugin can only be used in the <secondary> section") do
67
- c.configure(CONFIG)
68
- end
69
- end
70
-
71
- test 'basename should not include `/`' do
72
- assert_raise Fluent::ConfigError.new("basename should not include `/`") do
73
- create_driver %[
74
- directory #{TMP_DIR}
75
- basename out/file
76
- ]
77
- end
78
- end
79
-
80
- test 'directory should be writable' do
81
- assert_nothing_raised do
82
- create_driver %[directory #{TMP_DIR}/test_dir/foo/bar/]
83
- end
84
-
85
- assert_nothing_raised do
86
- FileUtils.mkdir_p("#{TMP_DIR}/test_dir")
87
- File.chmod(0777, "#{TMP_DIR}/test_dir")
88
- create_driver %[directory #{TMP_DIR}/test_dir/foo/bar/]
89
- end
90
-
91
- if Process.uid.nonzero?
92
- assert_raise Fluent::ConfigError.new("out_secondary_file: `#{TMP_DIR}/test_dir/foo/bar/` should be writable") do
93
- FileUtils.mkdir_p("#{TMP_DIR}/test_dir")
94
- File.chmod(0555, "#{TMP_DIR}/test_dir")
95
- create_driver %[directory #{TMP_DIR}/test_dir/foo/bar/]
96
- end
97
- end
98
- end
99
-
100
- test 'should be passed directory' do
101
- assert_raise Fluent::ConfigError do
102
- i = Fluent::Plugin::SecondaryFileOutput.new
103
- i.acts_as_secondary(create_primary)
104
- i.configure(config_element())
105
- end
106
-
107
- assert_nothing_raised do
108
- create_driver %[directory #{TMP_DIR}/test_dir/foo/bar/]
109
- end
110
- end
111
- end
112
-
113
- def check_gzipped_result(path, expect)
114
- # Zlib::GzipReader has a bug of concatenated file: https://bugs.ruby-lang.org/issues/9790
115
- # Following code from https://www.ruby-forum.com/topic/971591#979520
116
- result = ""
117
- waiting(10) do
118
- # we can expect that GzipReader#read can wait unflushed raw data of `io` on disk
119
- File.open(path, "rb") { |io|
120
- loop do
121
- gzr = Zlib::GzipReader.new(io)
122
- result << gzr.read
123
- unused = gzr.unused
124
- gzr.finish
125
- break if unused.nil?
126
- io.pos -= unused.length
127
- end
128
- }
129
- end
130
-
131
- assert_equal expect, result
132
- end
133
-
134
- def create_chunk(primary, metadata, es)
135
- primary.buffer.generate_chunk(metadata).tap do |c|
136
- c.concat(es.to_msgpack_stream, es.size) # to_msgpack_stream is standard_format
137
- c.commit
138
- end
139
- end
140
-
141
- sub_test_case 'write' do
142
- setup do
143
- @record = { 'key' => 'value' }
144
- @time = event_time
145
- @es = Fluent::OneEventStream.new(@time, @record)
146
- @primary = create_primary
147
- metadata = @primary.buffer.new_metadata
148
- @chunk = create_chunk(@primary, metadata, @es)
149
- end
150
-
151
- test 'should output compressed file when compress option is gzip' do
152
- d = create_driver(CONFIG, @primary)
153
- path = d.instance.write(@chunk)
154
-
155
- assert_equal "#{TMP_DIR}/out_file_test.0.gz", path
156
- check_gzipped_result(path, @es.to_msgpack_stream.force_encoding('ASCII-8BIT'))
157
- end
158
-
159
- test 'should output plain text when compress option is default(text)' do
160
- d = create_driver(%[
161
- directory #{TMP_DIR}/
162
- basename out_file_test
163
- ], @primary)
164
-
165
- msgpack_binary = @es.to_msgpack_stream.force_encoding('ASCII-8BIT')
166
-
167
- path = d.instance.write(@chunk)
168
- assert_equal "#{TMP_DIR}/out_file_test.0", path
169
- waiting(5) do
170
- sleep 0.1 until File.stat(path).size == msgpack_binary.size
171
- end
172
-
173
- assert_equal msgpack_binary, File.binread(path)
174
- end
175
-
176
- test 'path should be incremental when append option is false' do
177
- d = create_driver(CONFIG, @primary)
178
- packed_value = @es.to_msgpack_stream.force_encoding('ASCII-8BIT')
179
-
180
- 5.times do |i|
181
- path = d.instance.write(@chunk)
182
- assert_equal "#{TMP_DIR}/out_file_test.#{i}.gz", path
183
- check_gzipped_result(path, packed_value)
184
- end
185
- end
186
-
187
- test 'path should be unchanged when append option is true' do
188
- d = create_driver(CONFIG + %[append true], @primary)
189
- packed_value = @es.to_msgpack_stream.force_encoding('ASCII-8BIT')
190
-
191
- [*1..5].each do |i|
192
- path = d.instance.write(@chunk)
193
- assert_equal "#{TMP_DIR}/out_file_test.gz", path
194
- check_gzipped_result(path, packed_value * i)
195
- end
196
- end
197
- end
198
-
199
- sub_test_case 'Syntax of placeholders' do
200
- data(
201
- tag: '${tag}',
202
- tag_index: '${tag[0]}',
203
- tag_index1: '${tag[10]}',
204
- variable: '${key1}',
205
- variable2: '${key@value}',
206
- variable3: '${key_value}',
207
- variable4: '${key.value}',
208
- variable5: '${key-value}',
209
- variable6: '${KEYVALUE}',
210
- variable7: '${tags}',
211
- variable8: '${tag${key}', # matched ${key}
212
- )
213
- test 'matches with a valid placeholder' do |path|
214
- assert Fluent::Plugin::SecondaryFileOutput::PLACEHOLDER_REGEX.match(path)
215
- end
216
-
217
- data(
218
- invalid_tag: 'tag',
219
- invalid_tag2: '{tag}',
220
- invalid_tag3: '${tag',
221
- invalid_tag4: '${tag0]}',
222
- invalid_tag5: '${tag[]]}',
223
- invalid_variable: '${key[0]}',
224
- invalid_variable2: '${key{key2}}',
225
- )
226
- test "doesn't match with an invalid placeholder" do |path|
227
- assert !Fluent::Plugin::SecondaryFileOutput::PLACEHOLDER_REGEX.match(path)
228
- end
229
- end
230
-
231
- sub_test_case 'path' do
232
- setup do
233
- @record = { 'key' => 'value' }
234
- @time = event_time
235
- @es = Fluent::OneEventStream.new(@time, @record)
236
- primary = create_primary
237
- m = primary.buffer.new_metadata
238
- @c = create_chunk(primary, m, @es)
239
- end
240
-
241
- test 'normal path when compress option is gzip' do
242
- d = create_driver
243
- path = d.instance.write(@c)
244
- assert_equal "#{TMP_DIR}/out_file_test.0.gz", path
245
- end
246
-
247
- test 'normal path when compress option is default' do
248
- d = create_driver %[
249
- directory #{TMP_DIR}
250
- basename out_file_test
251
- ]
252
- path = d.instance.write(@c)
253
- assert_equal "#{TMP_DIR}/out_file_test.0", path
254
- end
255
-
256
- test 'normal path when append option is true' do
257
- d = create_driver %[
258
- directory #{TMP_DIR}
259
- append true
260
- ]
261
- path = d.instance.write(@c)
262
- assert_equal "#{TMP_DIR}/dump.bin", path
263
- end
264
-
265
- test 'path with ${chunk_id}' do
266
- d = create_driver %[
267
- directory #{TMP_DIR}
268
- basename out_file_chunk_id_${chunk_id}
269
- ]
270
- path = d.instance.write(@c)
271
- if File.basename(path) =~ /out_file_chunk_id_([-_.@a-zA-Z0-9].*).0/
272
- unique_id = Fluent::UniqueId.hex(Fluent::UniqueId.generate)
273
- assert_equal unique_id.size, $1.size, "chunk_id size is mismatched"
274
- else
275
- flunk "chunk_id is not included in the path"
276
- end
277
- end
278
-
279
- data(
280
- invalid_tag: [/tag/, '${tag}'],
281
- invalid_tag0: [/tag\[0\]/, '${tag[0]}'],
282
- invalid_variable: [/dummy/, '${dummy}'],
283
- invalid_timeformat: [/time/, '%Y%m%d'],
284
- )
285
- test 'raise an error when basename includes incompatible placeholder' do |(expected_message, invalid_basename)|
286
- c = Fluent::Test::Driver::Output.new(Fluent::Plugin::SecondaryFileOutput)
287
- c.instance.acts_as_secondary(DummyOutput.new)
288
-
289
- assert_raise_message(expected_message) do
290
- c.configure %[
291
- directory #{TMP_DIR}/
292
- basename #{invalid_basename}
293
- compress gzip
294
- ]
295
- end
296
- end
297
-
298
- data(
299
- invalid_tag: [/tag/, '${tag}'],
300
- invalid_tag0: [/tag\[0\]/, '${tag[0]}'],
301
- invalid_variable: [/dummy/, '${dummy}'],
302
- invalid_timeformat: [/time/, '%Y%m%d'],
303
- )
304
- test 'raise an error when directory includes incompatible placeholder' do |(expected_message, invalid_directory)|
305
- c = Fluent::Test::Driver::Output.new(Fluent::Plugin::SecondaryFileOutput)
306
- c.instance.acts_as_secondary(DummyOutput.new)
307
-
308
- assert_raise_message(expected_message) do
309
- c.configure %[
310
- directory #{invalid_directory}/
311
- compress gzip
312
- ]
313
- end
314
- end
315
-
316
- test 'basename includes tag' do
317
- primary = create_primary(config_element('buffer', 'tag'))
318
-
319
- d = create_driver(%[
320
- directory #{TMP_DIR}/
321
- basename cool_${tag}
322
- compress gzip
323
- ], primary)
324
-
325
- m = primary.buffer.new_metadata(tag: 'test.dummy')
326
- c = create_chunk(primary, m, @es)
327
-
328
- path = d.instance.write(c)
329
- assert_equal "#{TMP_DIR}/cool_test.dummy.0.gz", path
330
- end
331
-
332
- test 'basename includes /tag[\d+]/' do
333
- primary = create_primary(config_element('buffer', 'tag'))
334
-
335
- d = create_driver(%[
336
- directory #{TMP_DIR}/
337
- basename cool_${tag[0]}_${tag[1]}
338
- compress gzip
339
- ], primary)
340
-
341
- m = primary.buffer.new_metadata(tag: 'test.dummy')
342
- c = create_chunk(primary, m, @es)
343
-
344
- path = d.instance.write(c)
345
- assert_equal "#{TMP_DIR}/cool_test_dummy.0.gz", path
346
- end
347
-
348
- test 'basename includes time format' do
349
- primary = create_primary(
350
- config_element('buffer', 'time', { 'timekey_zone' => '+0900', 'timekey' => 1 })
351
- )
352
-
353
- d = create_driver(%[
354
- directory #{TMP_DIR}/
355
- basename cool_%Y%m%d%H
356
- compress gzip
357
- ], primary)
358
-
359
- m = primary.buffer.new_metadata(timekey: event_time("2011-01-02 13:14:15 UTC"))
360
- c = create_chunk(primary, m, @es)
361
-
362
- path = d.instance.write(c)
363
- assert_equal "#{TMP_DIR}/cool_2011010222.0.gz", path
364
- end
365
-
366
- test 'basename includes time format with timekey_use_utc option' do
367
- primary = create_primary(
368
- config_element('buffer', 'time', { 'timekey_zone' => '+0900', 'timekey' => 1, 'timekey_use_utc' => true })
369
- )
370
-
371
- d = create_driver(%[
372
- directory #{TMP_DIR}/
373
- basename cool_%Y%m%d%H
374
- compress gzip
375
- ], primary)
376
-
377
- m = primary.buffer.new_metadata(timekey: event_time("2011-01-02 13:14:15 UTC"))
378
- c = create_chunk(primary, m, @es)
379
-
380
- path = d.instance.write(c)
381
- assert_equal "#{TMP_DIR}/cool_2011010213.0.gz", path
382
- end
383
-
384
- test 'basename includes variable' do
385
- primary = create_primary(config_element('buffer', 'test1'))
386
-
387
- d = create_driver(%[
388
- directory #{TMP_DIR}/
389
- basename cool_${test1}
390
- compress gzip
391
- ], primary)
392
-
393
- m = primary.buffer.new_metadata(variables: { "test1".to_sym => "dummy" })
394
- c = create_chunk(primary, m, @es)
395
-
396
- path = d.instance.write(c)
397
- assert_equal "#{TMP_DIR}/cool_dummy.0.gz", path
398
- end
399
-
400
- test 'basename includes unnecessary variable' do
401
- primary = create_primary(config_element('buffer', 'test1'))
402
- c = Fluent::Test::Driver::Output.new(Fluent::Plugin::SecondaryFileOutput)
403
- c.instance.acts_as_secondary(primary)
404
-
405
- assert_raise_message(/test2/) do
406
- c.configure %[
407
- directory #{TMP_DIR}/
408
- basename ${test1}_${test2}
409
- compress gzip
410
- ]
411
- end
412
- end
413
-
414
- test 'basename includes tag, time format, and variables' do
415
- primary = create_primary(
416
- config_element('buffer', 'time,tag,test1', { 'timekey_zone' => '+0000', 'timekey' => 1 })
417
- )
418
-
419
- d = create_driver(%[
420
- directory #{TMP_DIR}/
421
- basename cool_%Y%m%d%H_${tag}_${test1}
422
- compress gzip
423
- ], primary)
424
-
425
- m = primary.buffer.new_metadata(
426
- timekey: event_time("2011-01-02 13:14:15 UTC"),
427
- tag: 'test.tag',
428
- variables: { "test1".to_sym => "dummy" }
429
- )
430
-
431
- c = create_chunk(primary, m, @es)
432
-
433
- path = d.instance.write(c)
434
- assert_equal "#{TMP_DIR}/cool_2011010213_test.tag_dummy.0.gz", path
435
- end
436
-
437
- test 'directory includes tag, time format, and variables' do
438
- primary = create_primary(
439
- config_element('buffer', 'time,tag,test1', { 'timekey_zone' => '+0000', 'timekey' => 1 })
440
- )
441
-
442
- d = create_driver(%[
443
- directory #{TMP_DIR}/%Y%m%d%H/${tag}/${test1}
444
- compress gzip
445
- ], primary)
446
-
447
- m = primary.buffer.new_metadata(
448
- timekey: event_time("2011-01-02 13:14:15 UTC"),
449
- tag: 'test.tag',
450
- variables: { "test1".to_sym => "dummy" }
451
- )
452
- c = create_chunk(primary, m, @es)
453
-
454
- path = d.instance.write(c)
455
- assert_equal "#{TMP_DIR}/2011010213/test.tag/dummy/dump.bin.0.gz", path
456
- end
457
- end
458
- end
@@ -1,205 +0,0 @@
1
- require_relative '../helper'
2
- require 'fluent/test/driver/output'
3
- require 'fluent/plugin/out_stdout'
4
-
5
- class StdoutOutputTest < Test::Unit::TestCase
6
- def setup
7
- Fluent::Test.setup
8
- end
9
-
10
- CONFIG = %[
11
- ]
12
- TIME_FORMAT = '%Y-%m-%d %H:%M:%S.%9N %z'
13
-
14
- def create_driver(conf = CONFIG)
15
- Fluent::Test::Driver::Output.new(Fluent::Plugin::StdoutOutput).configure(conf)
16
- end
17
-
18
- sub_test_case 'non-buffered' do
19
- test 'configure' do
20
- d = create_driver
21
- assert_equal 1, d.instance.formatter_configs.size # init: true
22
- assert_kind_of Fluent::Plugin::StdoutFormatter, d.instance.formatter
23
- assert_equal 'json', d.instance.formatter.output_type
24
- end
25
-
26
- test 'configure output_type' do
27
- d = create_driver(CONFIG + "\noutput_type json")
28
- assert_kind_of Fluent::Plugin::StdoutFormatter, d.instance.formatter
29
- assert_equal 'json', d.instance.formatter.output_type
30
-
31
- d = create_driver(CONFIG + "\noutput_type hash")
32
- assert_kind_of Fluent::Plugin::StdoutFormatter, d.instance.formatter
33
- assert_equal 'hash', d.instance.formatter.output_type
34
-
35
- assert_raise(Fluent::NotFoundPluginError) do
36
- d = create_driver(CONFIG + "\noutput_type foo")
37
- end
38
- end
39
-
40
- test 'configure with time_format' do
41
- d = create_driver(CONFIG + <<-CONF)
42
- <format>
43
- @type stdout
44
- time_format %Y-%m-%dT%H:%M:%S.%L%z
45
- </format>
46
- CONF
47
-
48
- time = event_time
49
- out = capture_log do
50
- d.run(default_tag: 'test') do
51
- d.feed(time, {'test' => 'test'})
52
- end
53
- end
54
-
55
- t = Time.at(time).localtime.strftime("%Y-%m-%dT%H:%M:%S.%L%z")
56
- assert_equal "#{t} test: {\"test\":\"test\"}\n", out
57
- end
58
-
59
- test 'emit with default configuration' do
60
- d = create_driver
61
- time = event_time()
62
- out = capture_log do
63
- d.run(default_tag: 'test') do
64
- d.feed(time, {'test' => 'test1'})
65
- end
66
- end
67
- assert_equal "#{Time.at(time).localtime.strftime(TIME_FORMAT)} test: {\"test\":\"test1\"}\n", out
68
- end
69
-
70
- data('oj' => 'oj', 'yajl' => 'yajl')
71
- test 'emit in json format' do |data|
72
- d = create_driver(CONFIG + "\noutput_type json\njson_parser #{data}")
73
- time = event_time()
74
- out = capture_log do
75
- d.run(default_tag: 'test') do
76
- d.feed(time, {'test' => 'test1'})
77
- end
78
- end
79
- assert_equal "#{Time.at(time).localtime.strftime(TIME_FORMAT)} test: {\"test\":\"test1\"}\n", out
80
-
81
- if data == 'yajl'
82
- # NOTE: Float::NAN is not jsonable
83
- assert_raise(Yajl::EncodeError) { d.feed('test', time, {'test' => Float::NAN}) }
84
- else
85
- out = capture_log { d.feed('test', time, {'test' => Float::NAN}) }
86
- assert_equal "#{Time.at(time).localtime.strftime(TIME_FORMAT)} test: {\"test\":NaN}\n", out
87
- end
88
- end
89
-
90
- test 'emit in hash format' do
91
- d = create_driver(CONFIG + "\noutput_type hash")
92
- time = event_time()
93
- out = capture_log do
94
- d.run(default_tag: 'test') do
95
- d.feed(time, {'test' => 'test2'})
96
- end
97
- end
98
- assert_equal "#{Time.at(time).localtime.strftime(TIME_FORMAT)} test: {\"test\"=>\"test2\"}\n", out
99
-
100
- # NOTE: Float::NAN is not jsonable, but hash string can output it.
101
- out = capture_log { d.feed('test', time, {'test' => Float::NAN}) }
102
- assert_equal "#{Time.at(time).localtime.strftime(TIME_FORMAT)} test: {\"test\"=>NaN}\n", out
103
- end
104
- end
105
-
106
- sub_test_case 'buffered' do
107
- test 'configure' do
108
- d = create_driver(config_element("ROOT", "", {}, [config_element("buffer")]))
109
- assert_equal 1, d.instance.formatter_configs.size
110
- assert_kind_of Fluent::Plugin::StdoutFormatter, d.instance.formatter
111
- assert_equal 'json', d.instance.formatter.output_type
112
- assert_equal 10 * 1024, d.instance.buffer_config.chunk_limit_size
113
- assert d.instance.buffer_config.flush_at_shutdown
114
- assert_equal ['tag'], d.instance.buffer_config.chunk_keys
115
- assert d.instance.chunk_key_tag
116
- assert !d.instance.chunk_key_time
117
- assert_equal [], d.instance.chunk_keys
118
- end
119
-
120
- test 'configure with output_type' do
121
- d = create_driver(config_element("ROOT", "", {"output_type" => "json"}, [config_element("buffer")]))
122
- assert_kind_of Fluent::Plugin::StdoutFormatter, d.instance.formatter
123
- assert_equal 'json', d.instance.formatter.output_type
124
-
125
- d = create_driver(config_element("ROOT", "", {"output_type" => "hash"}, [config_element("buffer")]))
126
- assert_kind_of Fluent::Plugin::StdoutFormatter, d.instance.formatter
127
- assert_equal 'hash', d.instance.formatter.output_type
128
-
129
- assert_raise(Fluent::NotFoundPluginError) do
130
- create_driver(config_element("ROOT", "", {"output_type" => "foo"}, [config_element("buffer")]))
131
- end
132
- end
133
-
134
- sub_test_case "emit with default config" do
135
- test '#write(synchronous)' do
136
- d = create_driver(config_element("ROOT", "", {}, [config_element("buffer")]))
137
- time = event_time()
138
-
139
- out = capture_log do
140
- d.run(default_tag: 'test', flush: true) do
141
- d.feed(time, {'test' => 'test'})
142
- end
143
- end
144
- assert_equal "#{Time.at(time).localtime.strftime(TIME_FORMAT)} test: {\"test\":\"test\"}\n", out
145
- end
146
- end
147
-
148
- sub_test_case "emit json" do
149
- data('oj' => 'oj', 'yajl' => 'yajl')
150
- test '#write(synchronous)' do |data|
151
- d = create_driver(config_element("ROOT", "", {"output_type" => "json", "json_parser" => data}, [config_element("buffer")]))
152
- time = event_time()
153
-
154
- out = capture_log do
155
- d.run(default_tag: 'test', flush: true) do
156
- d.feed(time, {'test' => 'test'})
157
- end
158
- end
159
- assert_equal "#{Time.at(time).localtime.strftime(TIME_FORMAT)} test: {\"test\":\"test\"}\n", out
160
- end
161
- end
162
-
163
- sub_test_case 'emit hash' do
164
- test '#write(synchronous)' do
165
- d = create_driver(config_element("ROOT", "", {"output_type" => "hash"}, [config_element("buffer")]))
166
- time = event_time()
167
-
168
- out = capture_log do
169
- d.run(default_tag: 'test', flush: true) do
170
- d.feed(time, {'test' => 'test'})
171
- end
172
- end
173
-
174
- assert_equal "#{Time.at(time).localtime.strftime(TIME_FORMAT)} test: {\"test\"=>\"test\"}\n", out
175
- end
176
- end
177
- end
178
-
179
- data(
180
- 'utc and !localtime' => "utc true\nlocaltime false",
181
- '!utc and localtime' => "utc false\nlocaltime true")
182
- test 'success when configure with localtime and utc' do |c|
183
- assert_nothing_raised do
184
- create_driver(CONFIG + c)
185
- end
186
- end
187
-
188
- data('utc and localtime' => "utc true\nlocaltime true",
189
- '!utc and !localtime' => "utc false\nlocaltime false")
190
- test 'raise an error when configure with localtime and utc' do |c|
191
- assert_raise(Fluent::ConfigError.new('both of utc and localtime are specified, use only one of them')) do
192
- create_driver(CONFIG + c)
193
- end
194
- end
195
-
196
- # Capture the log output of the block given
197
- def capture_log(&block)
198
- tmp = $log
199
- $log = StringIO.new
200
- yield
201
- return $log.string
202
- ensure
203
- $log = tmp
204
- end
205
- end