fluentd 0.14.1 → 0.14.2

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 (129) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog +110 -1
  3. data/Rakefile +5 -1
  4. data/appveyor.yml +7 -1
  5. data/example/in_forward.conf +4 -0
  6. data/lib/fluent/compat/exec_util.rb +129 -0
  7. data/lib/fluent/compat/file_util.rb +54 -0
  8. data/lib/fluent/compat/filter.rb +21 -3
  9. data/lib/fluent/compat/formatter.rb +4 -2
  10. data/lib/fluent/compat/formatter_utils.rb +85 -0
  11. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +60 -0
  12. data/lib/fluent/compat/input.rb +1 -3
  13. data/lib/fluent/compat/output.rb +95 -39
  14. data/lib/fluent/compat/parser.rb +17 -0
  15. data/lib/fluent/compat/parser_utils.rb +40 -0
  16. data/lib/fluent/compat/socket_util.rb +165 -0
  17. data/lib/fluent/compat/string_util.rb +34 -0
  18. data/lib/fluent/{test/driver/owner.rb → compat/structured_format_mixin.rb} +5 -11
  19. data/lib/fluent/config/element.rb +2 -2
  20. data/lib/fluent/configurable.rb +2 -1
  21. data/lib/fluent/event.rb +61 -7
  22. data/lib/fluent/event_router.rb +1 -1
  23. data/lib/fluent/plugin.rb +7 -7
  24. data/lib/fluent/plugin/buf_file.rb +5 -2
  25. data/lib/fluent/plugin/buffer.rb +194 -64
  26. data/lib/fluent/plugin/buffer/chunk.rb +28 -3
  27. data/lib/fluent/plugin/buffer/file_chunk.rb +5 -21
  28. data/lib/fluent/plugin/buffer/memory_chunk.rb +1 -11
  29. data/lib/fluent/plugin/exec_util.rb +2 -112
  30. data/lib/fluent/plugin/file_util.rb +3 -38
  31. data/lib/fluent/plugin/file_wrapper.rb +1 -1
  32. data/lib/fluent/plugin/filter_grep.rb +3 -7
  33. data/lib/fluent/plugin/filter_record_transformer.rb +5 -5
  34. data/lib/fluent/plugin/filter_stdout.rb +18 -11
  35. data/lib/fluent/plugin/formatter.rb +0 -48
  36. data/lib/fluent/plugin/formatter_csv.rb +7 -8
  37. data/lib/fluent/plugin/formatter_hash.rb +1 -4
  38. data/lib/fluent/plugin/formatter_json.rb +1 -4
  39. data/lib/fluent/plugin/formatter_ltsv.rb +5 -6
  40. data/lib/fluent/plugin/formatter_msgpack.rb +1 -4
  41. data/lib/fluent/plugin/formatter_out_file.rb +36 -3
  42. data/lib/fluent/plugin/formatter_stdout.rb +36 -1
  43. data/lib/fluent/plugin/in_dummy.rb +9 -2
  44. data/lib/fluent/plugin/in_exec.rb +20 -57
  45. data/lib/fluent/plugin/in_forward.rb +4 -3
  46. data/lib/fluent/plugin/in_object_space.rb +8 -44
  47. data/lib/fluent/plugin/in_syslog.rb +13 -24
  48. data/lib/fluent/plugin/in_tail.rb +3 -0
  49. data/lib/fluent/plugin/out_buffered_stdout.rb +14 -4
  50. data/lib/fluent/plugin/out_exec.rb +7 -5
  51. data/lib/fluent/plugin/out_exec_filter.rb +10 -10
  52. data/lib/fluent/plugin/out_file.rb +1 -3
  53. data/lib/fluent/plugin/out_forward.rb +38 -57
  54. data/lib/fluent/plugin/out_stdout.rb +14 -5
  55. data/lib/fluent/plugin/out_stream.rb +3 -0
  56. data/lib/fluent/plugin/output.rb +31 -14
  57. data/lib/fluent/plugin/parser.rb +0 -69
  58. data/lib/fluent/plugin/parser_apache.rb +10 -6
  59. data/lib/fluent/plugin/parser_apache_error.rb +8 -3
  60. data/lib/fluent/plugin/parser_csv.rb +3 -1
  61. data/lib/fluent/plugin/parser_json.rb +1 -1
  62. data/lib/fluent/plugin/parser_multiline.rb +5 -3
  63. data/lib/fluent/plugin/parser_nginx.rb +10 -6
  64. data/lib/fluent/plugin/parser_regexp.rb +73 -0
  65. data/lib/fluent/plugin/socket_util.rb +2 -148
  66. data/lib/fluent/plugin/storage_local.rb +1 -1
  67. data/lib/fluent/plugin/string_util.rb +3 -18
  68. data/lib/fluent/plugin_helper.rb +1 -0
  69. data/lib/fluent/plugin_helper/compat_parameters.rb +166 -41
  70. data/lib/fluent/plugin_helper/formatter.rb +30 -19
  71. data/lib/fluent/plugin_helper/inject.rb +25 -12
  72. data/lib/fluent/plugin_helper/parser.rb +22 -13
  73. data/lib/fluent/plugin_helper/storage.rb +22 -13
  74. data/lib/fluent/registry.rb +19 -6
  75. data/lib/fluent/supervisor.rb +27 -1
  76. data/lib/fluent/test/driver/base.rb +16 -92
  77. data/lib/fluent/test/driver/base_owned.rb +17 -53
  78. data/lib/fluent/test/driver/base_owner.rb +125 -0
  79. data/lib/fluent/test/driver/filter.rb +24 -2
  80. data/lib/fluent/test/driver/input.rb +2 -2
  81. data/lib/fluent/test/driver/multi_output.rb +2 -2
  82. data/lib/fluent/test/driver/output.rb +3 -5
  83. data/lib/fluent/test/helpers.rb +25 -0
  84. data/lib/fluent/test/input_test.rb +4 -4
  85. data/lib/fluent/test/output_test.rb +3 -3
  86. data/lib/fluent/version.rb +1 -1
  87. data/test/config/test_element.rb +135 -6
  88. data/test/plugin/test_buf_file.rb +71 -3
  89. data/test/plugin/test_buffer.rb +305 -86
  90. data/test/plugin/test_buffer_chunk.rb +60 -2
  91. data/test/plugin/test_buffer_file_chunk.rb +4 -3
  92. data/test/plugin/test_filter_grep.rb +25 -21
  93. data/test/plugin/test_filter_record_transformer.rb +75 -67
  94. data/test/plugin/test_filter_stdout.rb +171 -74
  95. data/test/plugin/test_formatter_csv.rb +94 -0
  96. data/test/plugin/test_formatter_json.rb +30 -0
  97. data/test/plugin/test_formatter_ltsv.rb +52 -0
  98. data/test/plugin/test_formatter_msgpack.rb +28 -0
  99. data/test/plugin/test_formatter_out_file.rb +95 -0
  100. data/test/plugin/test_formatter_single_value.rb +38 -0
  101. data/test/plugin/test_in_dummy.rb +95 -0
  102. data/test/plugin/test_in_exec.rb +27 -31
  103. data/test/plugin/test_in_forward.rb +24 -0
  104. data/test/plugin/test_in_gc_stat.rb +5 -5
  105. data/test/plugin/test_in_object_space.rb +4 -4
  106. data/test/plugin/test_in_syslog.rb +60 -35
  107. data/test/plugin/test_out_buffered_stdout.rb +17 -3
  108. data/test/plugin/test_out_forward.rb +93 -5
  109. data/test/plugin/test_out_stdout.rb +14 -3
  110. data/test/plugin/test_output_as_buffered_retries.rb +20 -0
  111. data/test/plugin/test_output_as_buffered_secondary.rb +16 -0
  112. data/test/plugin/test_output_as_standard.rb +22 -22
  113. data/test/plugin/test_parser_apache.rb +13 -9
  114. data/test/plugin/test_parser_apache_error.rb +11 -6
  115. data/test/plugin/test_parser_csv.rb +35 -25
  116. data/test/plugin/test_parser_nginx.rb +11 -5
  117. data/test/plugin/test_parser_regexp.rb +235 -68
  118. data/test/plugin/test_parser_tsv.rb +54 -58
  119. data/test/plugin_helper/test_compat_parameters.rb +111 -46
  120. data/test/plugin_helper/test_formatter.rb +40 -0
  121. data/test/plugin_helper/test_inject.rb +101 -2
  122. data/test/plugin_helper/test_parser.rb +40 -0
  123. data/test/plugin_helper/test_storage.rb +43 -0
  124. data/test/test_event.rb +93 -0
  125. data/test/test_event_router.rb +13 -4
  126. data/test/test_event_time.rb +0 -3
  127. data/test/test_formatter.rb +7 -164
  128. data/test/test_plugin_classes.rb +28 -1
  129. metadata +24 -3
@@ -1,14 +1,16 @@
1
1
  require_relative '../helper'
2
+ require 'fluent/test/driver/filter'
2
3
  require 'fluent/plugin/filter_stdout'
3
4
  require 'timecop'
4
5
  require 'flexmock/test_unit'
5
6
 
6
7
  class StdoutFilterTest < Test::Unit::TestCase
7
- include Fluent
8
8
  include FlexMock::TestCase
9
9
 
10
10
  def setup
11
11
  Fluent::Test.setup
12
+ @old_tz = ENV["TZ"]
13
+ ENV["TZ"] = "UTC"
12
14
  Timecop.freeze
13
15
  end
14
16
 
@@ -16,99 +18,194 @@ class StdoutFilterTest < Test::Unit::TestCase
16
18
  super # FlexMock::TestCase requires this
17
19
  # http://flexmock.rubyforge.org/FlexMock/TestCase.html
18
20
  Timecop.return
21
+ ENV["TZ"] = @old_tz
19
22
  end
20
23
 
21
- CONFIG = %[
22
- ]
24
+ CONFIG = config_element('ROOT')
23
25
 
24
26
  def create_driver(conf = CONFIG)
25
- Test::FilterTestDriver.new(StdoutFilter, 'filter.test').configure(conf)
27
+ Fluent::Test::Driver::Filter.new(Fluent::Plugin::StdoutFilter).configure(conf)
26
28
  end
27
29
 
28
- def emit(d, msg, time)
30
+ def filter(d, time, record)
29
31
  d.run {
30
- d.emit(msg, time)
31
- }.filtered_as_array[0][2]
32
+ d.feed("filter.test", time, record)
33
+ }
34
+ d.filtered_records
32
35
  end
33
36
 
34
37
  def test_through_record
35
38
  d = create_driver
36
- time = Time.now
37
- filtered = emit(d, {'test' => 'test'}, Fluent::EventTime.from_time(time))
38
- assert_equal({'test' => 'test'}, filtered)
39
+ filtered = filter(d, event_time, {'test' => 'test'})
40
+ assert_equal([{'test' => 'test'}], filtered)
39
41
  end
40
42
 
41
- def test_configure_default
42
- d = create_driver
43
- assert_equal 'json', d.instance.formatter.output_type
44
- end
45
-
46
- def test_configure_output_type
47
- d = create_driver(CONFIG + "\noutput_type json")
48
- assert_equal 'json', d.instance.formatter.output_type
49
-
50
- d = create_driver(CONFIG + "\noutput_type hash")
51
- assert_equal 'hash', d.instance.formatter.output_type
52
-
53
- d = create_driver(CONFIG + "\noutput_type ltsv")
54
- assert_equal 'ltsv', d.instance.formatter.output_type
55
-
56
- assert_raise(Fluent::ConfigError) do
57
- d = create_driver(CONFIG + "\noutput_type foo")
43
+ sub_test_case "flat style parameters" do
44
+ sub_test_case "configure" do
45
+ def test_configure_default
46
+ d = create_driver
47
+ d.run {}
48
+ assert_equal 'json', d.instance.formatter.output_type
49
+ end
50
+
51
+ data(json: "json",
52
+ hash: "hash",
53
+ ltsv: "ltsv")
54
+ def test_output_type(data)
55
+ d = create_driver(CONFIG + config_element("", "", { "output_type" => data }))
56
+ d.run {}
57
+ assert_equal data, d.instance.formatter.output_type
58
+ end
59
+
60
+ def test_invalid_output_type
61
+ assert_raise(Fluent::ConfigError) do
62
+ d = create_driver(CONFIG + config_element("", "", { "output_type" => "foo" }))
63
+ d.run {}
64
+ end
65
+ end
58
66
  end
59
- end
60
-
61
- def test_output_type_json
62
- d = create_driver(CONFIG + "\noutput_type json")
63
- time = Time.now
64
- out = capture_log(d) { emit(d, {'test' => 'test'}, Fluent::EventTime.from_time(time)) }
65
- assert_equal "#{time.localtime} filter.test: {\"test\":\"test\"}\n", out
66
-
67
- # NOTE: Float::NAN is not jsonable
68
- d = create_driver(CONFIG + "\noutput_type json")
69
- flexmock(d.instance.router).should_receive(:emit_error_event)
70
- emit(d, {'test' => Float::NAN}, time)
71
- end
72
67
 
73
- def test_output_type_hash
74
- d = create_driver(CONFIG + "\noutput_type hash")
75
- time = Time.now
76
- out = capture_log(d) { emit(d, {'test' => 'test'}, Fluent::EventTime.from_time(time)) }
77
- assert_equal "#{time.localtime} filter.test: {\"test\"=>\"test\"}\n", out
68
+ def test_output_type_json
69
+ d = create_driver(CONFIG + config_element("", "", { "output_type" => "json" }))
70
+ etime = event_time
71
+ time = Time.at(etime.sec)
72
+ out = capture_log(d) { filter(d, etime, {'test' => 'test'}) }
73
+ assert_equal "#{time.localtime} filter.test: {\"test\":\"test\"}\n", out
74
+
75
+ # NOTE: Float::NAN is not jsonable
76
+ d = create_driver(CONFIG + config_element("", "", { "output_type" => "json" }))
77
+ flexmock(d.instance.router).should_receive(:emit_error_event)
78
+ filter(d, etime, {'test' => Float::NAN})
79
+ end
78
80
 
79
- # NOTE: Float::NAN is not jsonable, but hash string can output it.
80
- d = create_driver(CONFIG + "\noutput_type hash")
81
- out = capture_log(d) { emit(d, {'test' => Float::NAN}, Fluent::EventTime.from_time(time)) }
82
- assert_equal "#{time.localtime} filter.test: {\"test\"=>NaN}\n", out
83
- end
81
+ def test_output_type_hash
82
+ d = create_driver(CONFIG + config_element("", "", { "output_type" => "hash" }))
83
+ etime = event_time
84
+ time = Time.at(etime.sec)
85
+ out = capture_log(d) { filter(d, etime, {'test' => 'test'}) }
86
+ assert_equal "#{time.localtime} filter.test: {\"test\"=>\"test\"}\n", out
87
+
88
+ # NOTE: Float::NAN is not jsonable, but hash string can output it.
89
+ d = create_driver(CONFIG + config_element("", "", { "output_type" => "hash" }))
90
+ out = capture_log(d) { filter(d, etime, {'test' => Float::NAN}) }
91
+ assert_equal "#{time.localtime} filter.test: {\"test\"=>NaN}\n", out
92
+ end
84
93
 
85
- # Use include_time_key to output the message's time
86
- def test_include_time_key
87
- d = create_driver(CONFIG + "\noutput_type json\ninclude_time_key true\nutc")
88
- time = Time.now
89
- message_time = Fluent::EventTime.parse("2011-01-02 13:14:15 UTC")
90
- out = capture_log(d) { emit(d, {'test' => 'test'}, message_time) }
91
- assert_equal "#{time.localtime} filter.test: {\"test\":\"test\",\"time\":\"2011-01-02T13:14:15Z\"}\n", out
92
- end
94
+ # Use include_time_key to output the message's time
95
+ def test_include_time_key
96
+ config = config_element("", "", {
97
+ "output_type" => "json",
98
+ "include_time_key" => true,
99
+ "localtime" => false
100
+ })
101
+ d = create_driver(config)
102
+ etime = event_time
103
+ time = Time.at(etime.sec)
104
+ message_time = event_time("2011-01-02 13:14:15 UTC")
105
+ out = capture_log(d) { filter(d, message_time, {'test' => 'test'}) }
106
+ assert_equal "#{time.localtime} filter.test: {\"test\":\"test\",\"time\":\"2011-01-02T13:14:15Z\"}\n", out
107
+ end
93
108
 
94
- # out_stdout formatter itself can also be replaced
95
- def test_format_json
96
- d = create_driver(CONFIG + "\nformat json")
97
- time = Time.now
98
- out = capture_log(d) { emit(d, {'test' => 'test'}, Fluent::EventTime.from_time(time)) }
99
- assert_equal "{\"test\":\"test\"}\n", out
109
+ # out_stdout formatter itself can also be replaced
110
+ def test_format_json
111
+ d = create_driver(CONFIG + config_element("", "", { "format" => "json" }))
112
+ out = capture_log(d) { filter(d, event_time, {'test' => 'test'}) }
113
+ assert_equal "{\"test\":\"test\"}\n", out
114
+ end
100
115
  end
101
116
 
102
- private
117
+ sub_test_case "with <format> sub section" do
118
+ sub_test_case "configure" do
119
+ def test_default
120
+ conf = config_element
121
+ conf.elements << config_element("format", "", { "@type" => "stdout"})
122
+ d = create_driver(conf)
123
+ d.run {}
124
+ assert_equal("json", d.instance.formatter.output_type)
125
+ end
126
+
127
+ data(json: "json",
128
+ hash: "hash",
129
+ ltsv: "ltsv")
130
+ def test_output_type(data)
131
+ conf = config_element
132
+ conf.elements << config_element("format", "", { "@type" => "stdout", "output_type" => data })
133
+ d = create_driver(conf)
134
+ d.run {}
135
+ assert_equal(data, d.instance.formatter.output_type)
136
+ end
137
+
138
+ def test_invalid_output_type
139
+ conf = config_element
140
+ conf.elements << config_element("format", "", { "@type" => "stdout", "output_type" => "foo" })
141
+ assert_raise(Fluent::ConfigError) do
142
+ d = create_driver(conf)
143
+ d.run {}
144
+ end
145
+ end
146
+ end
103
147
 
104
- # Capture the log output of the block given
105
- def capture_log(d, &block)
106
- tmp = d.instance.log.out
107
- d.instance.log.out = StringIO.new
108
- yield
109
- return d.instance.log.out.string
110
- ensure
111
- d.instance.log.out = tmp
148
+ sub_test_case "output_type" do
149
+ def test_json
150
+ conf = config_element
151
+ conf.elements << config_element("format", "", { "@type" => "stdout", "output_type" => "json" })
152
+ d = create_driver(conf)
153
+ etime = event_time
154
+ time = Time.at(etime.sec)
155
+ out = capture_log(d) { filter(d, etime, {'test' => 'test'}) }
156
+ assert_equal "#{time.localtime} filter.test: {\"test\":\"test\"}\n", out
157
+ end
158
+
159
+ def test_json_nan
160
+ # NOTE: Float::NAN is not jsonable
161
+ conf = config_element
162
+ conf.elements << config_element("format", "", { "@type" => "stdout", "output_type" => "json" })
163
+ d = create_driver(conf)
164
+ etime = event_time
165
+ flexmock(d.instance.router).should_receive(:emit_error_event)
166
+ filter(d, etime, {'test' => Float::NAN})
167
+ end
168
+
169
+ def test_hash
170
+ conf = config_element
171
+ conf.elements << config_element("format", "", { "@type" => "stdout", "output_type" => "hash" })
172
+ d = create_driver(conf)
173
+ etime = event_time
174
+ time = Time.at(etime.sec)
175
+ out = capture_log(d) { filter(d, etime, {'test' => 'test'}) }
176
+ assert_equal "#{time.localtime} filter.test: {\"test\"=>\"test\"}\n", out
177
+ end
178
+
179
+ def test_hash_nan
180
+ # NOTE: Float::NAN is not jsonable, but hash string can output it.
181
+ conf = config_element
182
+ conf.elements << config_element("format", "", { "@type" => "stdout", "output_type" => "hash" })
183
+ d = create_driver(conf)
184
+ etime = event_time
185
+ time = Time.at(etime.sec)
186
+ out = capture_log(d) { filter(d, etime, {'test' => Float::NAN}) }
187
+ assert_equal "#{time.localtime} filter.test: {\"test\"=>NaN}\n", out
188
+ end
189
+
190
+ # Use include_time_key to output the message's time
191
+ def test_include_time_key
192
+ conf = config_element
193
+ conf.elements << config_element("format", "", {
194
+ "@type" => "stdout",
195
+ "output_type" => "json"
196
+ })
197
+ conf.elements << config_element("inject", "", {
198
+ "time_key" => "time",
199
+ "time_type" => "string",
200
+ "localtime" => false
201
+ })
202
+ d = create_driver(conf)
203
+ etime = event_time
204
+ time = Time.at(etime.sec)
205
+ message_time = event_time("2011-01-02 13:14:15 UTC")
206
+ out = capture_log(d) { filter(d, message_time, {'test' => 'test'}) }
207
+ assert_equal "#{time.localtime} filter.test: {\"test\":\"test\",\"time\":\"2011-01-02T13:14:15Z\"}\n", out
208
+ end
209
+ end
112
210
  end
113
211
  end
114
-
@@ -0,0 +1,94 @@
1
+ require_relative '../helper'
2
+ require 'fluent/test/driver/formatter'
3
+ require 'fluent/plugin/formatter_csv'
4
+
5
+ class CsvFormatterTest < ::Test::Unit::TestCase
6
+
7
+ def setup
8
+ @time = event_time
9
+ end
10
+
11
+ CONF = %[
12
+ fields a,b,c
13
+ ]
14
+
15
+ def create_driver(conf = CONF)
16
+ Fluent::Test::Driver::Formatter.new(Fluent::Plugin::CsvFormatter).configure(conf)
17
+ end
18
+
19
+ def tag
20
+ "tag"
21
+ end
22
+
23
+ def test_config_params
24
+ d = create_driver
25
+ assert_equal(',', d.instance.delimiter)
26
+ assert_equal(true, d.instance.force_quotes)
27
+ assert_equal(['a', 'b', 'c'], d.instance.fields)
28
+ end
29
+
30
+ data(
31
+ 'tab_char' => ["\t", '\t'],
32
+ 'tab_string' => ["\t", 'TAB'],
33
+ 'pipe' => ['|', '|'])
34
+ def test_config_params_with_customized_delimiters(data)
35
+ expected, target = data
36
+ d = create_driver("delimiter" => target, 'fields' => 'a,b,c')
37
+ assert_equal expected, d.instance.delimiter
38
+ end
39
+
40
+ def test_format
41
+ d = create_driver("fields" => "message,message2")
42
+ formatted = d.instance.format(tag, @time, {
43
+ 'message' => 'awesome',
44
+ 'message2' => 'awesome2'
45
+ })
46
+ assert_equal("\"awesome\",\"awesome2\"\n", formatted)
47
+ end
48
+
49
+ def test_format_with_customized_delimiters
50
+ d = create_driver("fields" => "message,message2",
51
+ "delimiter" => "\t")
52
+ formatted = d.instance.format(tag, @time, {
53
+ 'message' => 'awesome',
54
+ 'message2' => 'awesome2'
55
+ })
56
+ assert_equal("\"awesome\"\t\"awesome2\"\n", formatted)
57
+ end
58
+
59
+ def test_format_with_non_quote
60
+ d = create_driver("fields" => "message,message2",
61
+ "force_quotes" => false)
62
+ formatted = d.instance.format(tag, @time, {
63
+ 'message' => 'awesome',
64
+ 'message2' => 'awesome2'
65
+ })
66
+ assert_equal("awesome,awesome2\n", formatted)
67
+ end
68
+
69
+ data(
70
+ 'nil' => {
71
+ 'message' => 'awesome',
72
+ 'message2' => nil,
73
+ 'message3' => 'awesome3'
74
+ },
75
+ 'blank' => {
76
+ 'message' => 'awesome',
77
+ 'message2' => '',
78
+ 'message3' => 'awesome3'
79
+ })
80
+ def test_format_with_empty_fields(data)
81
+ d = create_driver("fields" => "message,message2,message3")
82
+ formatted = d.instance.format(tag, @time, data)
83
+ assert_equal("\"awesome\",\"\",\"awesome3\"\n", formatted)
84
+ end
85
+
86
+ data(
87
+ 'normally' => 'one,two,three',
88
+ 'white_space' => 'one , two , three',
89
+ 'blank' => 'one,,two,three')
90
+ def test_config_params_with_fields(data)
91
+ d = create_driver('fields' => data)
92
+ assert_equal %w(one two three), d.instance.fields
93
+ end
94
+ end
@@ -0,0 +1,30 @@
1
+ require_relative '../helper'
2
+ require 'fluent/test/driver/formatter'
3
+ require 'fluent/plugin/formatter_json'
4
+
5
+ class JsonFormatterTest < ::Test::Unit::TestCase
6
+
7
+ def setup
8
+ @time = event_time
9
+ end
10
+
11
+ def create_driver(conf = "")
12
+ Fluent::Test::Driver::Formatter.new(Fluent::Plugin::JSONFormatter).configure(conf)
13
+ end
14
+
15
+ def tag
16
+ "tag"
17
+ end
18
+
19
+ def record
20
+ {'message' => 'awesome'}
21
+ end
22
+
23
+ data('oj' => 'oj', 'yajl' => 'yajl')
24
+ def test_format(data)
25
+ d = create_driver('json_parser' => data)
26
+ formatted = d.instance.format(tag, @time, record)
27
+
28
+ assert_equal("#{Yajl.dump(record)}\n", formatted)
29
+ end
30
+ end
@@ -0,0 +1,52 @@
1
+ require_relative '../helper'
2
+ require 'fluent/test/driver/formatter'
3
+ require 'fluent/plugin/formatter_ltsv'
4
+
5
+ class LabeledTSVFormatterTest < ::Test::Unit::TestCase
6
+ def setup
7
+ @time = event_time
8
+ end
9
+
10
+ def create_driver(conf = "")
11
+ Fluent::Test::Driver::Formatter.new(Fluent::Plugin::LabeledTSVFormatter).configure(conf)
12
+ end
13
+
14
+ def tag
15
+ "tag"
16
+ end
17
+
18
+ def record
19
+ {'message' => 'awesome', 'greeting' => 'hello'}
20
+ end
21
+
22
+ def test_config_params
23
+ d = create_driver
24
+ assert_equal "\t", d.instance.delimiter
25
+ assert_equal ":", d.instance.label_delimiter
26
+
27
+ d = create_driver(
28
+ 'delimiter' => ',',
29
+ 'label_delimiter' => '=',
30
+ )
31
+
32
+ assert_equal ",", d.instance.delimiter
33
+ assert_equal "=", d.instance.label_delimiter
34
+ end
35
+
36
+ def test_format
37
+ d = create_driver({})
38
+ formatted = d.instance.format(tag, @time, record)
39
+
40
+ assert_equal("message:awesome\tgreeting:hello\n", formatted)
41
+ end
42
+
43
+ def test_format_with_customized_delimiters
44
+ d = create_driver(
45
+ 'delimiter' => ',',
46
+ 'label_delimiter' => '=',
47
+ )
48
+ formatted = d.instance.format(tag, @time, record)
49
+
50
+ assert_equal("message=awesome,greeting=hello\n", formatted)
51
+ end
52
+ end