fluentd 0.14.4-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.
Potentially problematic release.
This version of fluentd might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/.github/ISSUE_TEMPLATE.md +6 -0
- data/.gitignore +26 -0
- data/.travis.yml +45 -0
- data/AUTHORS +2 -0
- data/CONTRIBUTING.md +35 -0
- data/COPYING +14 -0
- data/ChangeLog +276 -0
- data/Gemfile +9 -0
- data/README.md +51 -0
- data/Rakefile +53 -0
- data/Vagrantfile +17 -0
- data/appveyor.yml +41 -0
- data/bin/fluent-debug +5 -0
- data/example/copy_roundrobin.conf +39 -0
- data/example/filter_stdout.conf +22 -0
- data/example/in_forward.conf +11 -0
- data/example/in_http.conf +14 -0
- data/example/in_out_forward.conf +17 -0
- data/example/in_syslog.conf +15 -0
- data/example/in_tail.conf +14 -0
- data/example/in_tcp.conf +13 -0
- data/example/in_udp.conf +13 -0
- data/example/multi_filters.conf +61 -0
- data/example/out_buffered_null.conf +32 -0
- data/example/out_copy.conf +20 -0
- data/example/out_file.conf +13 -0
- data/example/out_forward.conf +35 -0
- data/example/out_forward_buf_file.conf +23 -0
- data/example/v0_12_filter.conf +78 -0
- data/example/v1_literal_example.conf +36 -0
- data/fluent.conf +139 -0
- data/fluentd.gemspec +51 -0
- data/lib/fluent/agent.rb +194 -0
- data/lib/fluent/command/bundler_injection.rb +45 -0
- data/lib/fluent/command/cat.rb +319 -0
- data/lib/fluent/command/debug.rb +102 -0
- data/lib/fluent/command/fluentd.rb +273 -0
- data/lib/fluent/compat/call_super_mixin.rb +67 -0
- data/lib/fluent/compat/exec_util.rb +129 -0
- data/lib/fluent/compat/file_util.rb +54 -0
- data/lib/fluent/compat/filter.rb +68 -0
- data/lib/fluent/compat/formatter.rb +111 -0
- data/lib/fluent/compat/formatter_utils.rb +85 -0
- data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
- data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
- data/lib/fluent/compat/input.rb +49 -0
- data/lib/fluent/compat/output.rb +677 -0
- data/lib/fluent/compat/output_chain.rb +60 -0
- data/lib/fluent/compat/parser.rb +180 -0
- data/lib/fluent/compat/parser_utils.rb +40 -0
- data/lib/fluent/compat/propagate_default.rb +62 -0
- data/lib/fluent/compat/record_filter_mixin.rb +34 -0
- data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
- data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
- data/lib/fluent/compat/socket_util.rb +165 -0
- data/lib/fluent/compat/string_util.rb +34 -0
- data/lib/fluent/compat/structured_format_mixin.rb +26 -0
- data/lib/fluent/compat/type_converter.rb +90 -0
- data/lib/fluent/config.rb +56 -0
- data/lib/fluent/config/basic_parser.rb +123 -0
- data/lib/fluent/config/configure_proxy.rb +366 -0
- data/lib/fluent/config/dsl.rb +149 -0
- data/lib/fluent/config/element.rb +218 -0
- data/lib/fluent/config/error.rb +26 -0
- data/lib/fluent/config/literal_parser.rb +251 -0
- data/lib/fluent/config/parser.rb +107 -0
- data/lib/fluent/config/section.rb +212 -0
- data/lib/fluent/config/types.rb +136 -0
- data/lib/fluent/config/v1_parser.rb +190 -0
- data/lib/fluent/configurable.rb +176 -0
- data/lib/fluent/daemon.rb +15 -0
- data/lib/fluent/engine.rb +220 -0
- data/lib/fluent/env.rb +27 -0
- data/lib/fluent/event.rb +287 -0
- data/lib/fluent/event_router.rb +259 -0
- data/lib/fluent/filter.rb +21 -0
- data/lib/fluent/formatter.rb +23 -0
- data/lib/fluent/input.rb +21 -0
- data/lib/fluent/label.rb +38 -0
- data/lib/fluent/load.rb +36 -0
- data/lib/fluent/log.rb +445 -0
- data/lib/fluent/match.rb +141 -0
- data/lib/fluent/mixin.rb +31 -0
- data/lib/fluent/msgpack_factory.rb +62 -0
- data/lib/fluent/output.rb +26 -0
- data/lib/fluent/output_chain.rb +23 -0
- data/lib/fluent/parser.rb +23 -0
- data/lib/fluent/plugin.rb +161 -0
- data/lib/fluent/plugin/bare_output.rb +63 -0
- data/lib/fluent/plugin/base.rb +130 -0
- data/lib/fluent/plugin/buf_file.rb +154 -0
- data/lib/fluent/plugin/buf_memory.rb +34 -0
- data/lib/fluent/plugin/buffer.rb +603 -0
- data/lib/fluent/plugin/buffer/chunk.rb +160 -0
- data/lib/fluent/plugin/buffer/file_chunk.rb +323 -0
- data/lib/fluent/plugin/buffer/memory_chunk.rb +90 -0
- data/lib/fluent/plugin/exec_util.rb +22 -0
- data/lib/fluent/plugin/file_util.rb +22 -0
- data/lib/fluent/plugin/file_wrapper.rb +120 -0
- data/lib/fluent/plugin/filter.rb +93 -0
- data/lib/fluent/plugin/filter_grep.rb +75 -0
- data/lib/fluent/plugin/filter_record_transformer.rb +342 -0
- data/lib/fluent/plugin/filter_stdout.rb +53 -0
- data/lib/fluent/plugin/formatter.rb +45 -0
- data/lib/fluent/plugin/formatter_csv.rb +47 -0
- data/lib/fluent/plugin/formatter_hash.rb +29 -0
- data/lib/fluent/plugin/formatter_json.rb +44 -0
- data/lib/fluent/plugin/formatter_ltsv.rb +41 -0
- data/lib/fluent/plugin/formatter_msgpack.rb +29 -0
- data/lib/fluent/plugin/formatter_out_file.rb +78 -0
- data/lib/fluent/plugin/formatter_single_value.rb +34 -0
- data/lib/fluent/plugin/formatter_stdout.rb +74 -0
- data/lib/fluent/plugin/in_debug_agent.rb +64 -0
- data/lib/fluent/plugin/in_dummy.rb +135 -0
- data/lib/fluent/plugin/in_exec.rb +149 -0
- data/lib/fluent/plugin/in_forward.rb +366 -0
- data/lib/fluent/plugin/in_gc_stat.rb +52 -0
- data/lib/fluent/plugin/in_http.rb +422 -0
- data/lib/fluent/plugin/in_monitor_agent.rb +401 -0
- data/lib/fluent/plugin/in_object_space.rb +90 -0
- data/lib/fluent/plugin/in_syslog.rb +204 -0
- data/lib/fluent/plugin/in_tail.rb +838 -0
- data/lib/fluent/plugin/in_tcp.rb +41 -0
- data/lib/fluent/plugin/in_udp.rb +37 -0
- data/lib/fluent/plugin/in_unix.rb +201 -0
- data/lib/fluent/plugin/input.rb +33 -0
- data/lib/fluent/plugin/multi_output.rb +95 -0
- data/lib/fluent/plugin/out_buffered_null.rb +59 -0
- data/lib/fluent/plugin/out_buffered_stdout.rb +70 -0
- data/lib/fluent/plugin/out_copy.rb +42 -0
- data/lib/fluent/plugin/out_exec.rb +114 -0
- data/lib/fluent/plugin/out_exec_filter.rb +393 -0
- data/lib/fluent/plugin/out_file.rb +167 -0
- data/lib/fluent/plugin/out_forward.rb +646 -0
- data/lib/fluent/plugin/out_null.rb +27 -0
- data/lib/fluent/plugin/out_relabel.rb +28 -0
- data/lib/fluent/plugin/out_roundrobin.rb +80 -0
- data/lib/fluent/plugin/out_stdout.rb +48 -0
- data/lib/fluent/plugin/out_stream.rb +130 -0
- data/lib/fluent/plugin/output.rb +1020 -0
- data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
- data/lib/fluent/plugin/parser.rb +175 -0
- data/lib/fluent/plugin/parser_apache.rb +28 -0
- data/lib/fluent/plugin/parser_apache2.rb +84 -0
- data/lib/fluent/plugin/parser_apache_error.rb +26 -0
- data/lib/fluent/plugin/parser_csv.rb +33 -0
- data/lib/fluent/plugin/parser_json.rb +79 -0
- data/lib/fluent/plugin/parser_ltsv.rb +50 -0
- data/lib/fluent/plugin/parser_multiline.rb +104 -0
- data/lib/fluent/plugin/parser_nginx.rb +28 -0
- data/lib/fluent/plugin/parser_none.rb +36 -0
- data/lib/fluent/plugin/parser_regexp.rb +73 -0
- data/lib/fluent/plugin/parser_syslog.rb +82 -0
- data/lib/fluent/plugin/parser_tsv.rb +37 -0
- data/lib/fluent/plugin/socket_util.rb +22 -0
- data/lib/fluent/plugin/storage.rb +84 -0
- data/lib/fluent/plugin/storage_local.rb +132 -0
- data/lib/fluent/plugin/string_util.rb +22 -0
- data/lib/fluent/plugin_helper.rb +42 -0
- data/lib/fluent/plugin_helper/child_process.rb +298 -0
- data/lib/fluent/plugin_helper/compat_parameters.rb +224 -0
- data/lib/fluent/plugin_helper/event_emitter.rb +80 -0
- data/lib/fluent/plugin_helper/event_loop.rb +118 -0
- data/lib/fluent/plugin_helper/formatter.rb +149 -0
- data/lib/fluent/plugin_helper/inject.rb +125 -0
- data/lib/fluent/plugin_helper/parser.rb +147 -0
- data/lib/fluent/plugin_helper/retry_state.rb +177 -0
- data/lib/fluent/plugin_helper/storage.rb +331 -0
- data/lib/fluent/plugin_helper/thread.rb +147 -0
- data/lib/fluent/plugin_helper/timer.rb +90 -0
- data/lib/fluent/plugin_id.rb +63 -0
- data/lib/fluent/process.rb +504 -0
- data/lib/fluent/registry.rb +99 -0
- data/lib/fluent/root_agent.rb +314 -0
- data/lib/fluent/rpc.rb +94 -0
- data/lib/fluent/supervisor.rb +680 -0
- data/lib/fluent/system_config.rb +122 -0
- data/lib/fluent/test.rb +56 -0
- data/lib/fluent/test/base.rb +85 -0
- data/lib/fluent/test/driver/base.rb +179 -0
- data/lib/fluent/test/driver/base_owned.rb +70 -0
- data/lib/fluent/test/driver/base_owner.rb +125 -0
- data/lib/fluent/test/driver/event_feeder.rb +98 -0
- data/lib/fluent/test/driver/filter.rb +57 -0
- data/lib/fluent/test/driver/formatter.rb +30 -0
- data/lib/fluent/test/driver/input.rb +31 -0
- data/lib/fluent/test/driver/multi_output.rb +52 -0
- data/lib/fluent/test/driver/output.rb +76 -0
- data/lib/fluent/test/driver/parser.rb +30 -0
- data/lib/fluent/test/driver/test_event_router.rb +45 -0
- data/lib/fluent/test/filter_test.rb +77 -0
- data/lib/fluent/test/formatter_test.rb +65 -0
- data/lib/fluent/test/helpers.rb +79 -0
- data/lib/fluent/test/input_test.rb +172 -0
- data/lib/fluent/test/log.rb +73 -0
- data/lib/fluent/test/output_test.rb +156 -0
- data/lib/fluent/test/parser_test.rb +70 -0
- data/lib/fluent/time.rb +175 -0
- data/lib/fluent/timezone.rb +133 -0
- data/lib/fluent/unique_id.rb +39 -0
- data/lib/fluent/version.rb +21 -0
- data/lib/fluent/winsvc.rb +71 -0
- data/test/compat/test_calls_super.rb +166 -0
- data/test/compat/test_parser.rb +82 -0
- data/test/config/assertions.rb +42 -0
- data/test/config/test_config_parser.rb +507 -0
- data/test/config/test_configurable.rb +1194 -0
- data/test/config/test_configure_proxy.rb +386 -0
- data/test/config/test_dsl.rb +415 -0
- data/test/config/test_element.rb +403 -0
- data/test/config/test_literal_parser.rb +297 -0
- data/test/config/test_section.rb +184 -0
- data/test/config/test_system_config.rb +120 -0
- data/test/config/test_types.rb +171 -0
- data/test/helper.rb +119 -0
- data/test/plugin/data/2010/01/20100102-030405.log +0 -0
- data/test/plugin/data/2010/01/20100102-030406.log +0 -0
- data/test/plugin/data/2010/01/20100102.log +0 -0
- data/test/plugin/data/log/bar +0 -0
- data/test/plugin/data/log/foo/bar.log +0 -0
- data/test/plugin/data/log/test.log +0 -0
- data/test/plugin/test_bare_output.rb +118 -0
- data/test/plugin/test_base.rb +75 -0
- data/test/plugin/test_buf_file.rb +571 -0
- data/test/plugin/test_buf_memory.rb +42 -0
- data/test/plugin/test_buffer.rb +1200 -0
- data/test/plugin/test_buffer_chunk.rb +168 -0
- data/test/plugin/test_buffer_file_chunk.rb +771 -0
- data/test/plugin/test_buffer_memory_chunk.rb +265 -0
- data/test/plugin/test_file_util.rb +96 -0
- data/test/plugin/test_filter.rb +353 -0
- data/test/plugin/test_filter_grep.rb +119 -0
- data/test/plugin/test_filter_record_transformer.rb +600 -0
- data/test/plugin/test_filter_stdout.rb +211 -0
- data/test/plugin/test_formatter_csv.rb +94 -0
- data/test/plugin/test_formatter_json.rb +30 -0
- data/test/plugin/test_formatter_ltsv.rb +52 -0
- data/test/plugin/test_formatter_msgpack.rb +28 -0
- data/test/plugin/test_formatter_out_file.rb +95 -0
- data/test/plugin/test_formatter_single_value.rb +38 -0
- data/test/plugin/test_in_debug_agent.rb +28 -0
- data/test/plugin/test_in_dummy.rb +188 -0
- data/test/plugin/test_in_exec.rb +133 -0
- data/test/plugin/test_in_forward.rb +635 -0
- data/test/plugin/test_in_gc_stat.rb +39 -0
- data/test/plugin/test_in_http.rb +442 -0
- data/test/plugin/test_in_monitor_agent.rb +329 -0
- data/test/plugin/test_in_object_space.rb +64 -0
- data/test/plugin/test_in_syslog.rb +205 -0
- data/test/plugin/test_in_tail.rb +1001 -0
- data/test/plugin/test_in_tcp.rb +102 -0
- data/test/plugin/test_in_udp.rb +121 -0
- data/test/plugin/test_in_unix.rb +126 -0
- data/test/plugin/test_input.rb +122 -0
- data/test/plugin/test_multi_output.rb +180 -0
- data/test/plugin/test_out_buffered_null.rb +79 -0
- data/test/plugin/test_out_buffered_stdout.rb +122 -0
- data/test/plugin/test_out_copy.rb +160 -0
- data/test/plugin/test_out_exec.rb +155 -0
- data/test/plugin/test_out_exec_filter.rb +262 -0
- data/test/plugin/test_out_file.rb +383 -0
- data/test/plugin/test_out_forward.rb +590 -0
- data/test/plugin/test_out_null.rb +29 -0
- data/test/plugin/test_out_relabel.rb +28 -0
- data/test/plugin/test_out_roundrobin.rb +146 -0
- data/test/plugin/test_out_stdout.rb +92 -0
- data/test/plugin/test_out_stream.rb +93 -0
- data/test/plugin/test_output.rb +568 -0
- data/test/plugin/test_output_as_buffered.rb +1604 -0
- data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
- data/test/plugin/test_output_as_buffered_retries.rb +839 -0
- data/test/plugin/test_output_as_buffered_secondary.rb +817 -0
- data/test/plugin/test_output_as_standard.rb +374 -0
- data/test/plugin/test_owned_by.rb +35 -0
- data/test/plugin/test_parser_apache.rb +42 -0
- data/test/plugin/test_parser_apache2.rb +38 -0
- data/test/plugin/test_parser_apache_error.rb +45 -0
- data/test/plugin/test_parser_base.rb +32 -0
- data/test/plugin/test_parser_csv.rb +104 -0
- data/test/plugin/test_parser_json.rb +107 -0
- data/test/plugin/test_parser_labeled_tsv.rb +129 -0
- data/test/plugin/test_parser_multiline.rb +100 -0
- data/test/plugin/test_parser_nginx.rb +48 -0
- data/test/plugin/test_parser_none.rb +53 -0
- data/test/plugin/test_parser_regexp.rb +277 -0
- data/test/plugin/test_parser_syslog.rb +66 -0
- data/test/plugin/test_parser_time.rb +46 -0
- data/test/plugin/test_parser_tsv.rb +121 -0
- data/test/plugin/test_storage.rb +167 -0
- data/test/plugin/test_storage_local.rb +8 -0
- data/test/plugin/test_string_util.rb +26 -0
- data/test/plugin_helper/test_child_process.rb +608 -0
- data/test/plugin_helper/test_compat_parameters.rb +242 -0
- data/test/plugin_helper/test_event_emitter.rb +51 -0
- data/test/plugin_helper/test_event_loop.rb +52 -0
- data/test/plugin_helper/test_formatter.rb +252 -0
- data/test/plugin_helper/test_inject.rb +487 -0
- data/test/plugin_helper/test_parser.rb +263 -0
- data/test/plugin_helper/test_retry_state.rb +399 -0
- data/test/plugin_helper/test_storage.rb +521 -0
- data/test/plugin_helper/test_thread.rb +164 -0
- data/test/plugin_helper/test_timer.rb +131 -0
- data/test/scripts/exec_script.rb +32 -0
- data/test/scripts/fluent/plugin/formatter_known.rb +8 -0
- data/test/scripts/fluent/plugin/out_test.rb +81 -0
- data/test/scripts/fluent/plugin/out_test2.rb +80 -0
- data/test/scripts/fluent/plugin/parser_known.rb +4 -0
- data/test/test_config.rb +179 -0
- data/test/test_configdsl.rb +148 -0
- data/test/test_event.rb +329 -0
- data/test/test_event_router.rb +331 -0
- data/test/test_event_time.rb +184 -0
- data/test/test_filter.rb +121 -0
- data/test/test_formatter.rb +319 -0
- data/test/test_input.rb +31 -0
- data/test/test_log.rb +572 -0
- data/test/test_match.rb +137 -0
- data/test/test_mixin.rb +351 -0
- data/test/test_output.rb +214 -0
- data/test/test_plugin_classes.rb +136 -0
- data/test/test_plugin_helper.rb +81 -0
- data/test/test_process.rb +48 -0
- data/test/test_root_agent.rb +278 -0
- data/test/test_supervisor.rb +339 -0
- data/test/test_time_formatter.rb +186 -0
- data/test/test_unique_id.rb +47 -0
- metadata +823 -0
@@ -0,0 +1,265 @@
|
|
1
|
+
require_relative '../helper'
|
2
|
+
require 'fluent/plugin/buffer/memory_chunk'
|
3
|
+
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
class BufferMemoryChunkTest < Test::Unit::TestCase
|
7
|
+
setup do
|
8
|
+
@c = Fluent::Plugin::Buffer::MemoryChunk.new(Object.new)
|
9
|
+
end
|
10
|
+
|
11
|
+
test 'has blank chunk initially' do
|
12
|
+
assert @c.empty?
|
13
|
+
assert_equal '', @c.instance_eval{ @chunk }
|
14
|
+
assert_equal 0, @c.instance_eval{ @chunk_bytes }
|
15
|
+
assert_equal 0, @c.instance_eval{ @adding_bytes }
|
16
|
+
assert_equal 0, @c.instance_eval{ @adding_size }
|
17
|
+
end
|
18
|
+
|
19
|
+
test 'can #append, #commit and #read it' do
|
20
|
+
assert @c.empty?
|
21
|
+
|
22
|
+
d1 = {"f1" => 'v1', "f2" => 'v2', "f3" => 'v3'}
|
23
|
+
d2 = {"f1" => 'vv1', "f2" => 'vv2', "f3" => 'vv3'}
|
24
|
+
data = [d1.to_json + "\n", d2.to_json + "\n"]
|
25
|
+
@c.append(data)
|
26
|
+
@c.commit
|
27
|
+
|
28
|
+
content = @c.read
|
29
|
+
ds = content.split("\n").select{|d| !d.empty? }
|
30
|
+
|
31
|
+
assert_equal 2, ds.size
|
32
|
+
assert_equal d1, JSON.parse(ds[0])
|
33
|
+
assert_equal d2, JSON.parse(ds[1])
|
34
|
+
|
35
|
+
d3 = {"f1" => 'x', "f2" => 'y', "f3" => 'z'}
|
36
|
+
d4 = {"f1" => 'a', "f2" => 'b', "f3" => 'c'}
|
37
|
+
@c.append([d3.to_json + "\n", d4.to_json + "\n"])
|
38
|
+
@c.commit
|
39
|
+
|
40
|
+
content = @c.read
|
41
|
+
ds = content.split("\n").select{|d| !d.empty? }
|
42
|
+
|
43
|
+
assert_equal 4, ds.size
|
44
|
+
assert_equal d1, JSON.parse(ds[0])
|
45
|
+
assert_equal d2, JSON.parse(ds[1])
|
46
|
+
assert_equal d3, JSON.parse(ds[2])
|
47
|
+
assert_equal d4, JSON.parse(ds[3])
|
48
|
+
end
|
49
|
+
|
50
|
+
test 'can #concat, #commit and #read it' do
|
51
|
+
assert @c.empty?
|
52
|
+
|
53
|
+
d1 = {"f1" => 'v1', "f2" => 'v2', "f3" => 'v3'}
|
54
|
+
d2 = {"f1" => 'vv1', "f2" => 'vv2', "f3" => 'vv3'}
|
55
|
+
data = [d1.to_json + "\n", d2.to_json + "\n"].join
|
56
|
+
@c.concat(data, 2)
|
57
|
+
@c.commit
|
58
|
+
|
59
|
+
content = @c.read
|
60
|
+
ds = content.split("\n").select{|d| !d.empty? }
|
61
|
+
|
62
|
+
assert_equal 2, ds.size
|
63
|
+
assert_equal d1, JSON.parse(ds[0])
|
64
|
+
assert_equal d2, JSON.parse(ds[1])
|
65
|
+
|
66
|
+
d3 = {"f1" => 'x', "f2" => 'y', "f3" => 'z'}
|
67
|
+
d4 = {"f1" => 'a', "f2" => 'b', "f3" => 'c'}
|
68
|
+
@c.concat([d3.to_json + "\n", d4.to_json + "\n"].join, 2)
|
69
|
+
@c.commit
|
70
|
+
|
71
|
+
content = @c.read
|
72
|
+
ds = content.split("\n").select{|d| !d.empty? }
|
73
|
+
|
74
|
+
assert_equal 4, ds.size
|
75
|
+
assert_equal d1, JSON.parse(ds[0])
|
76
|
+
assert_equal d2, JSON.parse(ds[1])
|
77
|
+
assert_equal d3, JSON.parse(ds[2])
|
78
|
+
assert_equal d4, JSON.parse(ds[3])
|
79
|
+
end
|
80
|
+
|
81
|
+
test 'has its contents in binary (ascii-8bit)' do
|
82
|
+
data1 = "aaa bbb ccc".force_encoding('utf-8')
|
83
|
+
@c.append([data1])
|
84
|
+
@c.commit
|
85
|
+
assert_equal Encoding::ASCII_8BIT, @c.instance_eval{ @chunk.encoding }
|
86
|
+
|
87
|
+
content = @c.read
|
88
|
+
assert_equal Encoding::ASCII_8BIT, content.encoding
|
89
|
+
end
|
90
|
+
|
91
|
+
test 'has #bytesize and #size' do
|
92
|
+
assert @c.empty?
|
93
|
+
|
94
|
+
d1 = {"f1" => 'v1', "f2" => 'v2', "f3" => 'v3'}
|
95
|
+
d2 = {"f1" => 'vv1', "f2" => 'vv2', "f3" => 'vv3'}
|
96
|
+
data = [d1.to_json + "\n", d2.to_json + "\n"]
|
97
|
+
@c.append(data)
|
98
|
+
|
99
|
+
assert_equal (d1.to_json + "\n" + d2.to_json + "\n").bytesize, @c.bytesize
|
100
|
+
assert_equal 2, @c.size
|
101
|
+
|
102
|
+
@c.commit
|
103
|
+
|
104
|
+
assert_equal (d1.to_json + "\n" + d2.to_json + "\n").bytesize, @c.bytesize
|
105
|
+
assert_equal 2, @c.size
|
106
|
+
|
107
|
+
first_bytesize = @c.bytesize
|
108
|
+
|
109
|
+
d3 = {"f1" => 'x', "f2" => 'y', "f3" => 'z'}
|
110
|
+
d4 = {"f1" => 'a', "f2" => 'b', "f3" => 'c'}
|
111
|
+
@c.append([d3.to_json + "\n", d4.to_json + "\n"])
|
112
|
+
|
113
|
+
assert_equal first_bytesize + (d3.to_json + "\n" + d4.to_json + "\n").bytesize, @c.bytesize
|
114
|
+
assert_equal 4, @c.size
|
115
|
+
|
116
|
+
@c.commit
|
117
|
+
|
118
|
+
assert_equal first_bytesize + (d3.to_json + "\n" + d4.to_json + "\n").bytesize, @c.bytesize
|
119
|
+
assert_equal 4, @c.size
|
120
|
+
end
|
121
|
+
|
122
|
+
test 'can #rollback to revert non-committed data' do
|
123
|
+
assert @c.empty?
|
124
|
+
|
125
|
+
d1 = {"f1" => 'v1', "f2" => 'v2', "f3" => 'v3'}
|
126
|
+
d2 = {"f1" => 'vv1', "f2" => 'vv2', "f3" => 'vv3'}
|
127
|
+
data = [d1.to_json + "\n", d2.to_json + "\n"]
|
128
|
+
@c.append(data)
|
129
|
+
|
130
|
+
assert_equal (d1.to_json + "\n" + d2.to_json + "\n").bytesize, @c.bytesize
|
131
|
+
assert_equal 2, @c.size
|
132
|
+
|
133
|
+
@c.rollback
|
134
|
+
|
135
|
+
assert @c.empty?
|
136
|
+
|
137
|
+
assert @c.empty?
|
138
|
+
|
139
|
+
d1 = {"f1" => 'v1', "f2" => 'v2', "f3" => 'v3'}
|
140
|
+
d2 = {"f1" => 'vv1', "f2" => 'vv2', "f3" => 'vv3'}
|
141
|
+
data = [d1.to_json + "\n", d2.to_json + "\n"]
|
142
|
+
@c.append(data)
|
143
|
+
@c.commit
|
144
|
+
|
145
|
+
assert_equal (d1.to_json + "\n" + d2.to_json + "\n").bytesize, @c.bytesize
|
146
|
+
assert_equal 2, @c.size
|
147
|
+
|
148
|
+
first_bytesize = @c.bytesize
|
149
|
+
|
150
|
+
d3 = {"f1" => 'x', "f2" => 'y', "f3" => 'z'}
|
151
|
+
d4 = {"f1" => 'a', "f2" => 'b', "f3" => 'c'}
|
152
|
+
@c.append([d3.to_json + "\n", d4.to_json + "\n"])
|
153
|
+
|
154
|
+
assert_equal first_bytesize + (d3.to_json + "\n" + d4.to_json + "\n").bytesize, @c.bytesize
|
155
|
+
assert_equal 4, @c.size
|
156
|
+
|
157
|
+
@c.rollback
|
158
|
+
|
159
|
+
assert_equal first_bytesize, @c.bytesize
|
160
|
+
assert_equal 2, @c.size
|
161
|
+
end
|
162
|
+
|
163
|
+
test 'can #rollback to revert non-committed data from #concat' do
|
164
|
+
assert @c.empty?
|
165
|
+
|
166
|
+
d1 = {"f1" => 'v1', "f2" => 'v2', "f3" => 'v3'}
|
167
|
+
d2 = {"f1" => 'vv1', "f2" => 'vv2', "f3" => 'vv3'}
|
168
|
+
data = [d1.to_json + "\n", d2.to_json + "\n"].join
|
169
|
+
@c.concat(data, 2)
|
170
|
+
|
171
|
+
assert_equal (d1.to_json + "\n" + d2.to_json + "\n").bytesize, @c.bytesize
|
172
|
+
assert_equal 2, @c.size
|
173
|
+
|
174
|
+
@c.rollback
|
175
|
+
|
176
|
+
assert @c.empty?
|
177
|
+
|
178
|
+
assert @c.empty?
|
179
|
+
|
180
|
+
d1 = {"f1" => 'v1', "f2" => 'v2', "f3" => 'v3'}
|
181
|
+
d2 = {"f1" => 'vv1', "f2" => 'vv2', "f3" => 'vv3'}
|
182
|
+
data = [d1.to_json + "\n", d2.to_json + "\n"]
|
183
|
+
@c.append(data)
|
184
|
+
@c.commit
|
185
|
+
|
186
|
+
assert_equal (d1.to_json + "\n" + d2.to_json + "\n").bytesize, @c.bytesize
|
187
|
+
assert_equal 2, @c.size
|
188
|
+
|
189
|
+
first_bytesize = @c.bytesize
|
190
|
+
|
191
|
+
d3 = {"f1" => 'x', "f2" => 'y', "f3" => 'z'}
|
192
|
+
d4 = {"f1" => 'a', "f2" => 'b', "f3" => 'c'}
|
193
|
+
@c.concat([d3.to_json + "\n", d4.to_json + "\n"].join, 2)
|
194
|
+
|
195
|
+
assert_equal first_bytesize + (d3.to_json + "\n" + d4.to_json + "\n").bytesize, @c.bytesize
|
196
|
+
assert_equal 4, @c.size
|
197
|
+
|
198
|
+
@c.rollback
|
199
|
+
|
200
|
+
assert_equal first_bytesize, @c.bytesize
|
201
|
+
assert_equal 2, @c.size
|
202
|
+
end
|
203
|
+
|
204
|
+
test 'does nothing for #close' do
|
205
|
+
d1 = {"f1" => 'v1', "f2" => 'v2', "f3" => 'v3'}
|
206
|
+
d2 = {"f1" => 'vv1', "f2" => 'vv2', "f3" => 'vv3'}
|
207
|
+
data = [d1.to_json + "\n", d2.to_json + "\n"]
|
208
|
+
@c.append(data)
|
209
|
+
@c.commit
|
210
|
+
d3 = {"f1" => 'x', "f2" => 'y', "f3" => 'z'}
|
211
|
+
d4 = {"f1" => 'a', "f2" => 'b', "f3" => 'c'}
|
212
|
+
@c.append([d3.to_json + "\n", d4.to_json + "\n"])
|
213
|
+
@c.commit
|
214
|
+
|
215
|
+
content = @c.read
|
216
|
+
|
217
|
+
@c.close
|
218
|
+
|
219
|
+
assert_equal content, @c.read
|
220
|
+
end
|
221
|
+
|
222
|
+
test 'deletes all data by #purge' do
|
223
|
+
d1 = {"f1" => 'v1', "f2" => 'v2', "f3" => 'v3'}
|
224
|
+
d2 = {"f1" => 'vv1', "f2" => 'vv2', "f3" => 'vv3'}
|
225
|
+
data = [d1.to_json + "\n", d2.to_json + "\n"]
|
226
|
+
@c.append(data)
|
227
|
+
@c.commit
|
228
|
+
d3 = {"f1" => 'x', "f2" => 'y', "f3" => 'z'}
|
229
|
+
d4 = {"f1" => 'a', "f2" => 'b', "f3" => 'c'}
|
230
|
+
@c.append([d3.to_json + "\n", d4.to_json + "\n"])
|
231
|
+
@c.commit
|
232
|
+
|
233
|
+
@c.purge
|
234
|
+
|
235
|
+
assert @c.empty?
|
236
|
+
assert_equal 0, @c.bytesize
|
237
|
+
assert_equal 0, @c.size
|
238
|
+
assert_equal '', @c.read
|
239
|
+
end
|
240
|
+
|
241
|
+
test 'can #open its contents as io' do
|
242
|
+
d1 = {"f1" => 'v1', "f2" => 'v2', "f3" => 'v3'}
|
243
|
+
d2 = {"f1" => 'vv1', "f2" => 'vv2', "f3" => 'vv3'}
|
244
|
+
data = [d1.to_json + "\n", d2.to_json + "\n"]
|
245
|
+
@c.append(data)
|
246
|
+
@c.commit
|
247
|
+
d3 = {"f1" => 'x', "f2" => 'y', "f3" => 'z'}
|
248
|
+
d4 = {"f1" => 'a', "f2" => 'b', "f3" => 'c'}
|
249
|
+
@c.append([d3.to_json + "\n", d4.to_json + "\n"])
|
250
|
+
@c.commit
|
251
|
+
|
252
|
+
lines = []
|
253
|
+
@c.open do |io|
|
254
|
+
assert io
|
255
|
+
io.readlines.each do |l|
|
256
|
+
lines << l
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
assert_equal d1.to_json + "\n", lines[0]
|
261
|
+
assert_equal d2.to_json + "\n", lines[1]
|
262
|
+
assert_equal d3.to_json + "\n", lines[2]
|
263
|
+
assert_equal d4.to_json + "\n", lines[3]
|
264
|
+
end
|
265
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require_relative '../helper'
|
2
|
+
require 'fluent/plugin/file_util'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
class FileUtilTest < Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
FileUtils.rm_rf(TEST_DIR)
|
8
|
+
FileUtils.mkdir_p(TEST_DIR)
|
9
|
+
end
|
10
|
+
|
11
|
+
TEST_DIR = File.expand_path(File.dirname(__FILE__) + "/../tmp/file_util")
|
12
|
+
|
13
|
+
sub_test_case 'writable?' do
|
14
|
+
test 'file exists and writable' do
|
15
|
+
FileUtils.touch("#{TEST_DIR}/test_file")
|
16
|
+
assert_true Fluent::FileUtil.writable?("#{TEST_DIR}/test_file")
|
17
|
+
end
|
18
|
+
|
19
|
+
test 'file exists and not writable' do
|
20
|
+
FileUtils.touch("#{TEST_DIR}/test_file")
|
21
|
+
File.chmod(0444, "#{TEST_DIR}/test_file")
|
22
|
+
assert_false Fluent::FileUtil.writable?("#{TEST_DIR}/test_file")
|
23
|
+
end
|
24
|
+
|
25
|
+
test 'directory exists' do
|
26
|
+
FileUtils.mkdir_p("#{TEST_DIR}/test_dir")
|
27
|
+
assert_false Fluent::FileUtil.writable?("#{TEST_DIR}/test_dir")
|
28
|
+
end
|
29
|
+
|
30
|
+
test 'file does not exist and parent directory is writable' do
|
31
|
+
FileUtils.mkdir_p("#{TEST_DIR}/test_dir")
|
32
|
+
assert_true Fluent::FileUtil.writable?("#{TEST_DIR}/test_dir/test_file")
|
33
|
+
end
|
34
|
+
|
35
|
+
test 'file does not exist and parent directory is not writable' do
|
36
|
+
FileUtils.mkdir_p("#{TEST_DIR}/test_dir")
|
37
|
+
File.chmod(0444, "#{TEST_DIR}/test_dir")
|
38
|
+
assert_false Fluent::FileUtil.writable?("#{TEST_DIR}/test_dir/test_file")
|
39
|
+
end
|
40
|
+
|
41
|
+
test 'parent directory does not exist' do
|
42
|
+
FileUtils.rm_rf("#{TEST_DIR}/test_dir")
|
43
|
+
assert_false Fluent::FileUtil.writable?("#{TEST_DIR}/test_dir/test_file")
|
44
|
+
end
|
45
|
+
|
46
|
+
test 'parent file (not directory) exists' do
|
47
|
+
FileUtils.touch("#{TEST_DIR}/test_file")
|
48
|
+
assert_false Fluent::FileUtil.writable?("#{TEST_DIR}/test_file/foo")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
sub_test_case 'writable_p?' do
|
53
|
+
test 'file exists and writable' do
|
54
|
+
FileUtils.touch("#{TEST_DIR}/test_file")
|
55
|
+
assert_true Fluent::FileUtil.writable_p?("#{TEST_DIR}/test_file")
|
56
|
+
end
|
57
|
+
|
58
|
+
test 'file exists and not writable' do
|
59
|
+
FileUtils.touch("#{TEST_DIR}/test_file")
|
60
|
+
File.chmod(0444, "#{TEST_DIR}/test_file")
|
61
|
+
assert_false Fluent::FileUtil.writable_p?("#{TEST_DIR}/test_file")
|
62
|
+
end
|
63
|
+
|
64
|
+
test 'directory exists' do
|
65
|
+
FileUtils.mkdir_p("#{TEST_DIR}/test_dir")
|
66
|
+
assert_false Fluent::FileUtil.writable_p?("#{TEST_DIR}/test_dir")
|
67
|
+
end
|
68
|
+
|
69
|
+
test 'parent directory exists and writable' do
|
70
|
+
FileUtils.mkdir_p("#{TEST_DIR}/test_dir")
|
71
|
+
assert_true Fluent::FileUtil.writable_p?("#{TEST_DIR}/test_dir/test_file")
|
72
|
+
end
|
73
|
+
|
74
|
+
test 'parent directory exists and not writable' do
|
75
|
+
FileUtils.mkdir_p("#{TEST_DIR}/test_dir")
|
76
|
+
File.chmod(0555, "#{TEST_DIR}/test_dir")
|
77
|
+
assert_false Fluent::FileUtil.writable_p?("#{TEST_DIR}/test_dir/test_file")
|
78
|
+
end
|
79
|
+
|
80
|
+
test 'parent of parent (of parent ...) directory exists and writable' do
|
81
|
+
FileUtils.mkdir_p("#{TEST_DIR}/test_dir")
|
82
|
+
assert_true Fluent::FileUtil.writable_p?("#{TEST_DIR}/test_dir/foo/bar/baz")
|
83
|
+
end
|
84
|
+
|
85
|
+
test 'parent of parent (of parent ...) directory exists and not writable' do
|
86
|
+
FileUtils.mkdir_p("#{TEST_DIR}/test_dir")
|
87
|
+
File.chmod(0555, "#{TEST_DIR}/test_dir")
|
88
|
+
assert_false Fluent::FileUtil.writable_p?("#{TEST_DIR}/test_dir/foo/bar/baz")
|
89
|
+
end
|
90
|
+
|
91
|
+
test 'parent of parent (of parent ...) file (not directory) exists' do
|
92
|
+
FileUtils.touch("#{TEST_DIR}/test_file")
|
93
|
+
assert_false Fluent::FileUtil.writable_p?("#{TEST_DIR}/test_file/foo/bar/baz")
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,353 @@
|
|
1
|
+
require_relative '../helper'
|
2
|
+
require 'fluent/plugin/filter'
|
3
|
+
require 'fluent/event'
|
4
|
+
require 'flexmock/test_unit'
|
5
|
+
|
6
|
+
module FluentPluginFilterTest
|
7
|
+
class DummyPlugin < Fluent::Plugin::Filter
|
8
|
+
end
|
9
|
+
class NumDoublePlugin < Fluent::Plugin::Filter
|
10
|
+
def filter(tag, time, record)
|
11
|
+
r = record.dup
|
12
|
+
r["num"] = r["num"].to_i * 2
|
13
|
+
r
|
14
|
+
end
|
15
|
+
end
|
16
|
+
class IgnoreForNumPlugin < Fluent::Plugin::Filter
|
17
|
+
def filter(tag, time, record)
|
18
|
+
if record["num"].is_a? Numeric
|
19
|
+
nil
|
20
|
+
else
|
21
|
+
record
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
class RaiseForNumPlugin < Fluent::Plugin::Filter
|
26
|
+
def filter(tag, time, record)
|
27
|
+
if record["num"].is_a? Numeric
|
28
|
+
raise "Value of num is Number!"
|
29
|
+
end
|
30
|
+
record
|
31
|
+
end
|
32
|
+
end
|
33
|
+
class NumDoublePluginWithTime < Fluent::Plugin::Filter
|
34
|
+
def filter_with_time(tag, time, record)
|
35
|
+
r = record.dup
|
36
|
+
r["num"] = r["num"].to_i * 2
|
37
|
+
[time, r]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
class IgnoreForNumPluginWithTime < Fluent::Plugin::Filter
|
41
|
+
def filter_with_time(tag, time, record)
|
42
|
+
if record["num"].is_a? Numeric
|
43
|
+
nil
|
44
|
+
else
|
45
|
+
[time, record]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
class InvalidPlugin < Fluent::Plugin::Filter
|
50
|
+
# Because of implemnting `filter_with_time` and `filter` methods
|
51
|
+
def filter_with_time(tag, time, record); end
|
52
|
+
def filter(tag, time, record); end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
class FilterPluginTest < Test::Unit::TestCase
|
57
|
+
DummyRouter = Struct.new(:emits) do
|
58
|
+
def emit_error_event(tag, time, record, error)
|
59
|
+
self.emits << [tag, time, record, error]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
setup do
|
64
|
+
@p = nil
|
65
|
+
end
|
66
|
+
|
67
|
+
teardown do
|
68
|
+
if @p
|
69
|
+
@p.stop unless @p.stopped?
|
70
|
+
@p.before_shutdown unless @p.before_shutdown?
|
71
|
+
@p.shutdown unless @p.shutdown?
|
72
|
+
@p.after_shutdown unless @p.after_shutdown?
|
73
|
+
@p.close unless @p.closed?
|
74
|
+
@p.terminate unless @p.terminated?
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
sub_test_case 'for basic dummy plugin' do
|
79
|
+
setup do
|
80
|
+
Fluent::Test.setup
|
81
|
+
end
|
82
|
+
|
83
|
+
test 'plugin does not define #filter raises error' do
|
84
|
+
assert_raise NotImplementedError do
|
85
|
+
FluentPluginFilterTest::DummyPlugin.new
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
sub_test_case 'normal filter plugin' do
|
91
|
+
setup do
|
92
|
+
Fluent::Test.setup
|
93
|
+
@p = FluentPluginFilterTest::NumDoublePlugin.new
|
94
|
+
end
|
95
|
+
|
96
|
+
test 'has healthy lifecycle' do
|
97
|
+
assert !@p.configured?
|
98
|
+
@p.configure(config_element)
|
99
|
+
assert @p.configured?
|
100
|
+
|
101
|
+
assert !@p.started?
|
102
|
+
@p.start
|
103
|
+
assert @p.start
|
104
|
+
|
105
|
+
assert !@p.stopped?
|
106
|
+
@p.stop
|
107
|
+
assert @p.stopped?
|
108
|
+
|
109
|
+
assert !@p.before_shutdown?
|
110
|
+
@p.before_shutdown
|
111
|
+
assert @p.before_shutdown?
|
112
|
+
|
113
|
+
assert !@p.shutdown?
|
114
|
+
@p.shutdown
|
115
|
+
assert @p.shutdown?
|
116
|
+
|
117
|
+
assert !@p.after_shutdown?
|
118
|
+
@p.after_shutdown
|
119
|
+
assert @p.after_shutdown?
|
120
|
+
|
121
|
+
assert !@p.closed?
|
122
|
+
@p.close
|
123
|
+
assert @p.closed?
|
124
|
+
|
125
|
+
assert !@p.terminated?
|
126
|
+
@p.terminate
|
127
|
+
assert @p.terminated?
|
128
|
+
end
|
129
|
+
|
130
|
+
test 'has plugin_id automatically generated' do
|
131
|
+
assert @p.respond_to?(:plugin_id_configured?)
|
132
|
+
assert @p.respond_to?(:plugin_id)
|
133
|
+
|
134
|
+
@p.configure(config_element)
|
135
|
+
|
136
|
+
assert !@p.plugin_id_configured?
|
137
|
+
assert @p.plugin_id
|
138
|
+
assert{ @p.plugin_id != 'mytest' }
|
139
|
+
end
|
140
|
+
|
141
|
+
test 'has plugin_id manually configured' do
|
142
|
+
@p.configure(config_element('ROOT', '', {'@id' => 'mytest'}))
|
143
|
+
assert @p.plugin_id_configured?
|
144
|
+
assert_equal 'mytest', @p.plugin_id
|
145
|
+
end
|
146
|
+
|
147
|
+
test 'has plugin logger' do
|
148
|
+
assert @p.respond_to?(:log)
|
149
|
+
assert @p.log
|
150
|
+
|
151
|
+
# default logger
|
152
|
+
original_logger = @p.log
|
153
|
+
|
154
|
+
@p.configure(config_element('ROOT', '', {'@log_level' => 'debug'}))
|
155
|
+
|
156
|
+
assert{ @p.log.object_id != original_logger.object_id }
|
157
|
+
assert_equal Fluent::Log::LEVEL_DEBUG, @p.log.level
|
158
|
+
end
|
159
|
+
|
160
|
+
test 'can load plugin helpers' do
|
161
|
+
assert_nothing_raised do
|
162
|
+
class FluentPluginFilterTest::DummyPlugin2 < Fluent::Plugin::Filter
|
163
|
+
helpers :storage
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
test 'filters events correctly' do
|
169
|
+
test_es = [
|
170
|
+
[event_time('2016-04-19 13:01:00 -0700'), {"num" => "1", "message" => "Hello filters!"}],
|
171
|
+
[event_time('2016-04-19 13:01:03 -0700'), {"num" => "2", "message" => "Hello filters!"}],
|
172
|
+
[event_time('2016-04-19 13:01:05 -0700'), {"num" => "3", "message" => "Hello filters!"}],
|
173
|
+
]
|
174
|
+
@p.configure(config_element)
|
175
|
+
es = @p.filter_stream('testing', test_es)
|
176
|
+
assert es.is_a? Fluent::EventStream
|
177
|
+
|
178
|
+
ary = []
|
179
|
+
es.each do |time, r|
|
180
|
+
ary << [time, r]
|
181
|
+
end
|
182
|
+
|
183
|
+
assert_equal 3, ary.size
|
184
|
+
|
185
|
+
assert_equal event_time('2016-04-19 13:01:00 -0700'), ary[0][0]
|
186
|
+
assert_equal "Hello filters!", ary[0][1]["message"]
|
187
|
+
assert_equal 2, ary[0][1]["num"]
|
188
|
+
|
189
|
+
assert_equal event_time('2016-04-19 13:01:03 -0700'), ary[1][0]
|
190
|
+
assert_equal 4, ary[1][1]["num"]
|
191
|
+
|
192
|
+
assert_equal event_time('2016-04-19 13:01:05 -0700'), ary[2][0]
|
193
|
+
assert_equal 6, ary[2][1]["num"]
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
sub_test_case 'filter plugin returns nil for some records' do
|
198
|
+
setup do
|
199
|
+
Fluent::Test.setup
|
200
|
+
@p = FluentPluginFilterTest::IgnoreForNumPlugin.new
|
201
|
+
end
|
202
|
+
|
203
|
+
test 'filter_stream ignores records which #filter return nil' do
|
204
|
+
test_es = [
|
205
|
+
[event_time('2016-04-19 13:01:00 -0700'), {"num" => "1", "message" => "Hello filters!"}],
|
206
|
+
[event_time('2016-04-19 13:01:03 -0700'), {"num" => 2, "message" => "Ignored, yay!"}],
|
207
|
+
[event_time('2016-04-19 13:01:05 -0700'), {"num" => "3", "message" => "Hello filters!"}],
|
208
|
+
]
|
209
|
+
@p.configure(config_element)
|
210
|
+
es = @p.filter_stream('testing', test_es)
|
211
|
+
assert es.is_a? Fluent::EventStream
|
212
|
+
|
213
|
+
ary = []
|
214
|
+
es.each do |time, r|
|
215
|
+
ary << [time, r]
|
216
|
+
end
|
217
|
+
|
218
|
+
assert_equal 2, ary.size
|
219
|
+
|
220
|
+
assert_equal event_time('2016-04-19 13:01:00 -0700'), ary[0][0]
|
221
|
+
assert_equal "Hello filters!", ary[0][1]["message"]
|
222
|
+
assert_equal "1", ary[0][1]["num"]
|
223
|
+
|
224
|
+
assert_equal event_time('2016-04-19 13:01:05 -0700'), ary[1][0]
|
225
|
+
assert_equal "3", ary[1][1]["num"]
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
sub_test_case 'filter plugin raises error' do
|
230
|
+
setup do
|
231
|
+
Fluent::Test.setup
|
232
|
+
@p = FluentPluginFilterTest::RaiseForNumPlugin.new
|
233
|
+
end
|
234
|
+
|
235
|
+
test 'has router and can emit events to error streams' do
|
236
|
+
assert @p.has_router?
|
237
|
+
@p.configure(config_element)
|
238
|
+
assert @p.router
|
239
|
+
|
240
|
+
@p.router = DummyRouter.new([])
|
241
|
+
|
242
|
+
test_es = [
|
243
|
+
[event_time('2016-04-19 13:01:00 -0700'), {"num" => "1", "message" => "Hello filters!"}],
|
244
|
+
[event_time('2016-04-19 13:01:03 -0700'), {"num" => 2, "message" => "Hello error router!"}],
|
245
|
+
[event_time('2016-04-19 13:01:05 -0700'), {"num" => "3", "message" => "Hello filters!"}],
|
246
|
+
]
|
247
|
+
es = @p.filter_stream('testing', test_es)
|
248
|
+
assert es.is_a? Fluent::EventStream
|
249
|
+
|
250
|
+
ary = []
|
251
|
+
es.each do |time, r|
|
252
|
+
ary << [time, r]
|
253
|
+
end
|
254
|
+
|
255
|
+
assert_equal 2, ary.size
|
256
|
+
|
257
|
+
assert_equal event_time('2016-04-19 13:01:00 -0700'), ary[0][0]
|
258
|
+
assert_equal "Hello filters!", ary[0][1]["message"]
|
259
|
+
assert_equal "1", ary[0][1]["num"]
|
260
|
+
|
261
|
+
assert_equal event_time('2016-04-19 13:01:05 -0700'), ary[1][0]
|
262
|
+
assert_equal "3", ary[1][1]["num"]
|
263
|
+
|
264
|
+
assert_equal 1, @p.router.emits.size
|
265
|
+
|
266
|
+
error_emits = @p.router.emits
|
267
|
+
|
268
|
+
assert_equal "testing", error_emits[0][0]
|
269
|
+
assert_equal event_time('2016-04-19 13:01:03 -0700'), error_emits[0][1]
|
270
|
+
assert_equal({"num" => 2, "message" => "Hello error router!"}, error_emits[0][2])
|
271
|
+
assert{ error_emits[0][3].is_a? RuntimeError }
|
272
|
+
assert_equal "Value of num is Number!", error_emits[0][3].message
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
sub_test_case 'filter plugins that is implmented `filter_with_time`' do
|
277
|
+
setup do
|
278
|
+
Fluent::Test.setup
|
279
|
+
@p = FluentPluginFilterTest::NumDoublePluginWithTime.new
|
280
|
+
end
|
281
|
+
|
282
|
+
test 'filters events correctly' do
|
283
|
+
test_es = [
|
284
|
+
[event_time('2016-04-19 13:01:00 -0700'), {"num" => "1", "message" => "Hello filters!"}],
|
285
|
+
[event_time('2016-04-19 13:01:03 -0700'), {"num" => "2", "message" => "Hello filters!"}],
|
286
|
+
[event_time('2016-04-19 13:01:05 -0700'), {"num" => "3", "message" => "Hello filters!"}],
|
287
|
+
]
|
288
|
+
es = @p.filter_stream('testing', test_es)
|
289
|
+
assert es.is_a? Fluent::EventStream
|
290
|
+
|
291
|
+
ary = []
|
292
|
+
es.each do |time, r|
|
293
|
+
ary << [time, r]
|
294
|
+
end
|
295
|
+
|
296
|
+
assert_equal 3, ary.size
|
297
|
+
|
298
|
+
assert_equal event_time('2016-04-19 13:01:00 -0700'), ary[0][0]
|
299
|
+
assert_equal "Hello filters!", ary[0][1]["message"]
|
300
|
+
assert_equal 2, ary[0][1]["num"]
|
301
|
+
|
302
|
+
assert_equal event_time('2016-04-19 13:01:03 -0700'), ary[1][0]
|
303
|
+
assert_equal 4, ary[1][1]["num"]
|
304
|
+
|
305
|
+
assert_equal event_time('2016-04-19 13:01:05 -0700'), ary[2][0]
|
306
|
+
assert_equal 6, ary[2][1]["num"]
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
sub_test_case 'filter plugin that is implmented `filter_with_time` and returns nil for some records' do
|
311
|
+
setup do
|
312
|
+
Fluent::Test.setup
|
313
|
+
@p = FluentPluginFilterTest::IgnoreForNumPluginWithTime.new
|
314
|
+
end
|
315
|
+
|
316
|
+
test 'filter_stream ignores records which #filter_with_time return nil' do
|
317
|
+
test_es = [
|
318
|
+
[event_time('2016-04-19 13:01:00 -0700'), {"num" => "1", "message" => "Hello filters!"}],
|
319
|
+
[event_time('2016-04-19 13:01:03 -0700'), {"num" => 2, "message" => "Ignored, yay!"}],
|
320
|
+
[event_time('2016-04-19 13:01:05 -0700'), {"num" => "3", "message" => "Hello filters!"}],
|
321
|
+
]
|
322
|
+
@p.configure(config_element)
|
323
|
+
es = @p.filter_stream('testing', test_es)
|
324
|
+
assert es.is_a? Fluent::EventStream
|
325
|
+
|
326
|
+
ary = []
|
327
|
+
es.each do |time, r|
|
328
|
+
ary << [time, r]
|
329
|
+
end
|
330
|
+
|
331
|
+
assert_equal 2, ary.size
|
332
|
+
|
333
|
+
assert_equal event_time('2016-04-19 13:01:00 -0700'), ary[0][0]
|
334
|
+
assert_equal "Hello filters!", ary[0][1]["message"]
|
335
|
+
assert_equal "1", ary[0][1]["num"]
|
336
|
+
|
337
|
+
assert_equal event_time('2016-04-19 13:01:05 -0700'), ary[1][0]
|
338
|
+
assert_equal "3", ary[1][1]["num"]
|
339
|
+
end
|
340
|
+
end
|
341
|
+
|
342
|
+
sub_test_case 'filter plugins that is implmented both `filter_with_time` and `filter`' do
|
343
|
+
setup do
|
344
|
+
Fluent::Test.setup
|
345
|
+
end
|
346
|
+
|
347
|
+
test 'raises DuplicatedImplementError' do
|
348
|
+
assert_raise do
|
349
|
+
FluentPluginFilterTest::InvalidPlugin.new
|
350
|
+
end
|
351
|
+
end
|
352
|
+
end
|
353
|
+
end
|