fluentd 0.12.40 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE.md +6 -0
  3. data/.gitignore +2 -0
  4. data/.travis.yml +33 -21
  5. data/CONTRIBUTING.md +1 -0
  6. data/ChangeLog +810 -237
  7. data/README.md +0 -25
  8. data/Rakefile +2 -1
  9. data/Vagrantfile +17 -0
  10. data/appveyor.yml +35 -0
  11. data/example/filter_stdout.conf +5 -5
  12. data/example/in_forward.conf +2 -2
  13. data/example/in_http.conf +2 -2
  14. data/example/in_out_forward.conf +17 -0
  15. data/example/in_syslog.conf +2 -2
  16. data/example/in_tail.conf +2 -2
  17. data/example/in_tcp.conf +2 -2
  18. data/example/in_udp.conf +2 -2
  19. data/example/out_copy.conf +4 -4
  20. data/example/out_file.conf +2 -2
  21. data/example/out_forward.conf +2 -2
  22. data/example/out_forward_buf_file.conf +23 -0
  23. data/example/v0_12_filter.conf +8 -8
  24. data/fluent.conf +29 -0
  25. data/fluentd.gemspec +18 -11
  26. data/lib/fluent/agent.rb +60 -58
  27. data/lib/fluent/command/cat.rb +1 -1
  28. data/lib/fluent/command/debug.rb +7 -5
  29. data/lib/fluent/command/fluentd.rb +97 -2
  30. data/lib/fluent/compat/call_super_mixin.rb +67 -0
  31. data/lib/fluent/compat/filter.rb +50 -0
  32. data/lib/fluent/compat/formatter.rb +109 -0
  33. data/lib/fluent/compat/input.rb +50 -0
  34. data/lib/fluent/compat/output.rb +617 -0
  35. data/lib/fluent/compat/output_chain.rb +60 -0
  36. data/lib/fluent/compat/parser.rb +163 -0
  37. data/lib/fluent/compat/propagate_default.rb +62 -0
  38. data/lib/fluent/config.rb +23 -20
  39. data/lib/fluent/config/configure_proxy.rb +119 -70
  40. data/lib/fluent/config/dsl.rb +5 -18
  41. data/lib/fluent/config/element.rb +72 -8
  42. data/lib/fluent/config/error.rb +0 -3
  43. data/lib/fluent/config/literal_parser.rb +0 -2
  44. data/lib/fluent/config/parser.rb +4 -4
  45. data/lib/fluent/config/section.rb +39 -28
  46. data/lib/fluent/config/types.rb +2 -13
  47. data/lib/fluent/config/v1_parser.rb +1 -3
  48. data/lib/fluent/configurable.rb +48 -16
  49. data/lib/fluent/daemon.rb +15 -0
  50. data/lib/fluent/engine.rb +26 -52
  51. data/lib/fluent/env.rb +6 -4
  52. data/lib/fluent/event.rb +58 -11
  53. data/lib/fluent/event_router.rb +5 -5
  54. data/lib/fluent/filter.rb +2 -50
  55. data/lib/fluent/formatter.rb +4 -293
  56. data/lib/fluent/input.rb +2 -32
  57. data/lib/fluent/label.rb +2 -2
  58. data/lib/fluent/load.rb +3 -2
  59. data/lib/fluent/log.rb +107 -38
  60. data/lib/fluent/match.rb +0 -36
  61. data/lib/fluent/mixin.rb +117 -7
  62. data/lib/fluent/msgpack_factory.rb +62 -0
  63. data/lib/fluent/output.rb +7 -612
  64. data/lib/fluent/output_chain.rb +23 -0
  65. data/lib/fluent/parser.rb +4 -800
  66. data/lib/fluent/plugin.rb +100 -121
  67. data/lib/fluent/plugin/bare_output.rb +63 -0
  68. data/lib/fluent/plugin/base.rb +121 -0
  69. data/lib/fluent/plugin/buf_file.rb +101 -182
  70. data/lib/fluent/plugin/buf_memory.rb +9 -92
  71. data/lib/fluent/plugin/buffer.rb +473 -0
  72. data/lib/fluent/plugin/buffer/chunk.rb +135 -0
  73. data/lib/fluent/plugin/buffer/file_chunk.rb +339 -0
  74. data/lib/fluent/plugin/buffer/memory_chunk.rb +100 -0
  75. data/lib/fluent/plugin/exec_util.rb +80 -75
  76. data/lib/fluent/plugin/file_util.rb +33 -28
  77. data/lib/fluent/plugin/file_wrapper.rb +120 -0
  78. data/lib/fluent/plugin/filter.rb +51 -0
  79. data/lib/fluent/plugin/filter_grep.rb +13 -40
  80. data/lib/fluent/plugin/filter_record_transformer.rb +22 -18
  81. data/lib/fluent/plugin/formatter.rb +93 -0
  82. data/lib/fluent/plugin/formatter_csv.rb +48 -0
  83. data/lib/fluent/plugin/formatter_hash.rb +32 -0
  84. data/lib/fluent/plugin/formatter_json.rb +47 -0
  85. data/lib/fluent/plugin/formatter_ltsv.rb +42 -0
  86. data/lib/fluent/plugin/formatter_msgpack.rb +32 -0
  87. data/lib/fluent/plugin/formatter_out_file.rb +45 -0
  88. data/lib/fluent/plugin/formatter_single_value.rb +34 -0
  89. data/lib/fluent/plugin/formatter_stdout.rb +39 -0
  90. data/lib/fluent/plugin/in_debug_agent.rb +4 -0
  91. data/lib/fluent/plugin/in_dummy.rb +22 -18
  92. data/lib/fluent/plugin/in_exec.rb +18 -8
  93. data/lib/fluent/plugin/in_forward.rb +36 -79
  94. data/lib/fluent/plugin/in_gc_stat.rb +4 -0
  95. data/lib/fluent/plugin/in_http.rb +21 -18
  96. data/lib/fluent/plugin/in_monitor_agent.rb +15 -48
  97. data/lib/fluent/plugin/in_object_space.rb +6 -1
  98. data/lib/fluent/plugin/in_stream.rb +7 -3
  99. data/lib/fluent/plugin/in_syslog.rb +46 -95
  100. data/lib/fluent/plugin/in_tail.rb +51 -595
  101. data/lib/fluent/plugin/in_tcp.rb +8 -1
  102. data/lib/fluent/plugin/in_udp.rb +8 -14
  103. data/lib/fluent/plugin/input.rb +33 -0
  104. data/lib/fluent/plugin/multi_output.rb +95 -0
  105. data/lib/fluent/plugin/out_buffered_null.rb +59 -0
  106. data/lib/fluent/plugin/out_copy.rb +11 -7
  107. data/lib/fluent/plugin/out_exec.rb +15 -11
  108. data/lib/fluent/plugin/out_exec_filter.rb +18 -10
  109. data/lib/fluent/plugin/out_file.rb +34 -5
  110. data/lib/fluent/plugin/out_forward.rb +19 -9
  111. data/lib/fluent/plugin/out_null.rb +0 -14
  112. data/lib/fluent/plugin/out_roundrobin.rb +11 -7
  113. data/lib/fluent/plugin/out_stdout.rb +5 -7
  114. data/lib/fluent/plugin/out_stream.rb +3 -1
  115. data/lib/fluent/plugin/output.rb +979 -0
  116. data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
  117. data/lib/fluent/plugin/parser.rb +244 -0
  118. data/lib/fluent/plugin/parser_apache.rb +24 -0
  119. data/lib/fluent/plugin/parser_apache2.rb +84 -0
  120. data/lib/fluent/plugin/parser_apache_error.rb +21 -0
  121. data/lib/fluent/plugin/parser_csv.rb +31 -0
  122. data/lib/fluent/plugin/parser_json.rb +79 -0
  123. data/lib/fluent/plugin/parser_ltsv.rb +50 -0
  124. data/lib/fluent/plugin/parser_multiline.rb +102 -0
  125. data/lib/fluent/plugin/parser_nginx.rb +24 -0
  126. data/lib/fluent/plugin/parser_none.rb +36 -0
  127. data/lib/fluent/plugin/parser_syslog.rb +82 -0
  128. data/lib/fluent/plugin/parser_tsv.rb +37 -0
  129. data/lib/fluent/plugin/socket_util.rb +120 -114
  130. data/lib/fluent/plugin/storage.rb +84 -0
  131. data/lib/fluent/plugin/storage_local.rb +116 -0
  132. data/lib/fluent/plugin/string_util.rb +16 -13
  133. data/lib/fluent/plugin_helper.rb +39 -0
  134. data/lib/fluent/plugin_helper/child_process.rb +298 -0
  135. data/lib/fluent/plugin_helper/compat_parameters.rb +99 -0
  136. data/lib/fluent/plugin_helper/event_emitter.rb +80 -0
  137. data/lib/fluent/plugin_helper/event_loop.rb +118 -0
  138. data/lib/fluent/plugin_helper/retry_state.rb +177 -0
  139. data/lib/fluent/plugin_helper/storage.rb +308 -0
  140. data/lib/fluent/plugin_helper/thread.rb +147 -0
  141. data/lib/fluent/plugin_helper/timer.rb +85 -0
  142. data/lib/fluent/plugin_id.rb +63 -0
  143. data/lib/fluent/process.rb +21 -30
  144. data/lib/fluent/registry.rb +21 -9
  145. data/lib/fluent/root_agent.rb +115 -40
  146. data/lib/fluent/supervisor.rb +330 -320
  147. data/lib/fluent/system_config.rb +42 -18
  148. data/lib/fluent/test.rb +6 -1
  149. data/lib/fluent/test/base.rb +23 -3
  150. data/lib/fluent/test/driver/base.rb +247 -0
  151. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  152. data/lib/fluent/test/driver/filter.rb +35 -0
  153. data/lib/fluent/test/driver/input.rb +31 -0
  154. data/lib/fluent/test/driver/output.rb +78 -0
  155. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  156. data/lib/fluent/test/filter_test.rb +0 -1
  157. data/lib/fluent/test/formatter_test.rb +2 -1
  158. data/lib/fluent/test/input_test.rb +23 -17
  159. data/lib/fluent/test/output_test.rb +28 -39
  160. data/lib/fluent/test/parser_test.rb +1 -1
  161. data/lib/fluent/time.rb +104 -1
  162. data/lib/fluent/{status.rb → unique_id.rb} +15 -24
  163. data/lib/fluent/version.rb +1 -1
  164. data/lib/fluent/winsvc.rb +72 -0
  165. data/test/compat/test_calls_super.rb +164 -0
  166. data/test/config/test_config_parser.rb +83 -0
  167. data/test/config/test_configurable.rb +547 -274
  168. data/test/config/test_configure_proxy.rb +146 -29
  169. data/test/config/test_dsl.rb +3 -181
  170. data/test/config/test_element.rb +274 -0
  171. data/test/config/test_literal_parser.rb +1 -1
  172. data/test/config/test_section.rb +79 -7
  173. data/test/config/test_system_config.rb +21 -0
  174. data/test/config/test_types.rb +3 -26
  175. data/test/helper.rb +78 -8
  176. data/test/plugin/test_bare_output.rb +118 -0
  177. data/test/plugin/test_base.rb +75 -0
  178. data/test/plugin/test_buf_file.rb +420 -521
  179. data/test/plugin/test_buf_memory.rb +32 -194
  180. data/test/plugin/test_buffer.rb +981 -0
  181. data/test/plugin/test_buffer_chunk.rb +110 -0
  182. data/test/plugin/test_buffer_file_chunk.rb +770 -0
  183. data/test/plugin/test_buffer_memory_chunk.rb +265 -0
  184. data/test/plugin/test_filter.rb +255 -0
  185. data/test/plugin/test_filter_grep.rb +2 -73
  186. data/test/plugin/test_filter_record_transformer.rb +24 -68
  187. data/test/plugin/test_filter_stdout.rb +6 -6
  188. data/test/plugin/test_in_debug_agent.rb +2 -0
  189. data/test/plugin/test_in_dummy.rb +11 -17
  190. data/test/plugin/test_in_exec.rb +6 -25
  191. data/test/plugin/test_in_forward.rb +112 -151
  192. data/test/plugin/test_in_gc_stat.rb +2 -0
  193. data/test/plugin/test_in_http.rb +106 -157
  194. data/test/plugin/test_in_object_space.rb +21 -5
  195. data/test/plugin/test_in_stream.rb +14 -13
  196. data/test/plugin/test_in_syslog.rb +30 -275
  197. data/test/plugin/test_in_tail.rb +95 -234
  198. data/test/plugin/test_in_tcp.rb +14 -0
  199. data/test/plugin/test_in_udp.rb +21 -13
  200. data/test/plugin/test_input.rb +122 -0
  201. data/test/plugin/test_multi_output.rb +180 -0
  202. data/test/plugin/test_out_buffered_null.rb +79 -0
  203. data/test/plugin/test_out_copy.rb +15 -2
  204. data/test/plugin/test_out_exec.rb +75 -25
  205. data/test/plugin/test_out_exec_filter.rb +74 -8
  206. data/test/plugin/test_out_file.rb +61 -7
  207. data/test/plugin/test_out_forward.rb +92 -15
  208. data/test/plugin/test_out_roundrobin.rb +1 -0
  209. data/test/plugin/test_out_stdout.rb +22 -13
  210. data/test/plugin/test_out_stream.rb +18 -0
  211. data/test/plugin/test_output.rb +515 -0
  212. data/test/plugin/test_output_as_buffered.rb +1540 -0
  213. data/test/plugin/test_output_as_buffered_overflow.rb +247 -0
  214. data/test/plugin/test_output_as_buffered_retries.rb +808 -0
  215. data/test/plugin/test_output_as_buffered_secondary.rb +776 -0
  216. data/test/plugin/test_output_as_standard.rb +362 -0
  217. data/test/plugin/test_owned_by.rb +35 -0
  218. data/test/plugin/test_storage.rb +167 -0
  219. data/test/plugin/test_storage_local.rb +8 -0
  220. data/test/plugin_helper/test_child_process.rb +599 -0
  221. data/test/plugin_helper/test_compat_parameters.rb +175 -0
  222. data/test/plugin_helper/test_event_emitter.rb +51 -0
  223. data/test/plugin_helper/test_event_loop.rb +52 -0
  224. data/test/plugin_helper/test_retry_state.rb +399 -0
  225. data/test/plugin_helper/test_storage.rb +411 -0
  226. data/test/plugin_helper/test_thread.rb +164 -0
  227. data/test/plugin_helper/test_timer.rb +100 -0
  228. data/test/scripts/exec_script.rb +0 -6
  229. data/test/scripts/fluent/plugin/out_test.rb +3 -0
  230. data/test/test_config.rb +13 -4
  231. data/test/test_event.rb +24 -13
  232. data/test/test_event_router.rb +8 -7
  233. data/test/test_event_time.rb +187 -0
  234. data/test/test_formatter.rb +13 -51
  235. data/test/test_input.rb +1 -1
  236. data/test/test_log.rb +239 -16
  237. data/test/test_mixin.rb +1 -1
  238. data/test/test_output.rb +53 -66
  239. data/test/test_parser.rb +105 -323
  240. data/test/test_plugin_helper.rb +81 -0
  241. data/test/test_root_agent.rb +4 -52
  242. data/test/test_supervisor.rb +272 -0
  243. data/test/test_unique_id.rb +47 -0
  244. metadata +180 -54
  245. data/lib/fluent/buffer.rb +0 -365
  246. data/lib/fluent/plugin/filter_parser.rb +0 -107
  247. data/lib/fluent/plugin/in_status.rb +0 -76
  248. data/lib/fluent/test/helpers.rb +0 -86
  249. data/test/plugin/data/log/foo/bar2 +0 -0
  250. data/test/plugin/test_filter_parser.rb +0 -744
  251. data/test/plugin/test_in_status.rb +0 -38
  252. data/test/test_buffer.rb +0 -624
@@ -0,0 +1,274 @@
1
+ require_relative '../helper'
2
+ require 'fluent/config/element'
3
+
4
+ class TestConfigElement < ::Test::Unit::TestCase
5
+ def element(name = 'ROOT', arg = '', attrs = {}, elements = [], unused = nil)
6
+ Fluent::Config::Element.new(name, arg, attrs, elements, unused)
7
+ end
8
+
9
+ sub_test_case 'Most test' do
10
+ test 'should be written' do
11
+ pend 'TODO'
12
+ end
13
+ end
14
+
15
+ sub_test_case '#elements=' do
16
+ test 'elements can be set by others' do
17
+ e = element()
18
+ assert_equal [], e.elements
19
+
20
+ e1 = element('e1')
21
+ e2 = element('e2')
22
+ e.elements = [e1, e2]
23
+ assert_equal [e1, e2], e.elements
24
+ end
25
+ end
26
+
27
+ sub_test_case '#elements' do
28
+ setup do
29
+ @c1 = element('source')
30
+ @c2 = element('source', 'yay')
31
+ @c3 = element('match', 'test.**')
32
+ @c4 = element('label', '@mytest', {}, [ element('filter', '**'), element('match', '**') ])
33
+ children = [@c1, @c2, @c3, @c4]
34
+ @e = Fluent::Config::Element.new('ROOT', '', {}, children)
35
+ end
36
+
37
+ test 'returns all elements without arguments' do
38
+ assert_equal [@c1, @c2, @c3, @c4], @e.elements
39
+ end
40
+
41
+ test 'returns elements with specified names' do
42
+ assert_equal [@c1, @c2, @c3], @e.elements('source', 'match')
43
+ assert_equal [@c3, @c4], @e.elements('match', 'label')
44
+ end
45
+
46
+ test 'returns elements with specified name, and arg if specified' do
47
+ assert_equal [@c1, @c2], @e.elements(name: 'source')
48
+ assert_equal [@c2], @e.elements(name: 'source', arg: 'yay')
49
+ end
50
+
51
+ test 'keyword argument name/arg and names are exclusive' do
52
+ assert_raise ArgumentError do
53
+ @e.elements('source', name: 'match')
54
+ end
55
+ assert_raise ArgumentError do
56
+ @e.elements('source', 'match', name: 'label', arg: '@mytest')
57
+ end
58
+ end
59
+
60
+ test 'specifying only arg without name is invalid' do
61
+ assert_raise ArgumentError do
62
+ @e.elements(arg: '@mytest')
63
+ end
64
+ end
65
+ end
66
+
67
+ sub_test_case '#initialize' do
68
+ test 'creates object with blank attrs and elements' do
69
+ e = element('ROOT', '', {}, [])
70
+ assert_equal([], e.elements)
71
+ end
72
+
73
+ test 'creates object which contains attrs and elements' do
74
+ e = element('ROOT', '', {"k1" => "v1", "k2" => "v2"}, [
75
+ element('test', 'mydata', {'k3' => 'v3'}, [])
76
+ ])
77
+ assert_equal('ROOT', e.name)
78
+ assert_equal('', e.arg)
79
+ assert_equal('v1', e["k1"])
80
+ assert_equal('v2', e["k2"])
81
+ assert_equal(1, e.elements.size)
82
+ e.each_element('test') do |el|
83
+ assert_equal('test', el.name)
84
+ assert_equal('mydata', el.arg)
85
+ assert_equal('v3', el["k3"])
86
+ end
87
+ end
88
+
89
+ test 'creates object which contains attrs, elements and unused' do
90
+ e = element('ROOT', '', {"k1" => "v1", "k2" => "v2", "k4" => "v4"}, [
91
+ element('test', 'mydata', {'k3' => 'v3'}, [])
92
+ ], "k3")
93
+ assert_equal("k3", e.unused)
94
+ assert_equal('ROOT', e.name)
95
+ assert_equal('', e.arg)
96
+ assert_equal('v1', e["k1"])
97
+ assert_equal('v2', e["k2"])
98
+ assert_equal('v4', e["k4"])
99
+ assert_equal(1, e.elements.size)
100
+ e.each_element('test') do |el|
101
+ assert_equal('test', el.name)
102
+ assert_equal('mydata', el.arg)
103
+ assert_equal('v3', el["k3"])
104
+ end
105
+ assert_equal("k3", e.unused)
106
+ end
107
+ end
108
+
109
+ sub_test_case "@unused" do
110
+ sub_test_case '#[] has side effect for @unused' do
111
+ test 'without unused argument' do
112
+ e = element('ROOT', '', {"k1" => "v1", "k2" => "v2", "k4" => "v4"}, [
113
+ element('test', 'mydata', {'k3' => 'v3'}, [])
114
+ ])
115
+ assert_equal(["k1", "k2", "k4"], e.unused)
116
+ assert_equal('v1', e["k1"])
117
+ assert_equal(["k2", "k4"], e.unused)
118
+ assert_equal('v2', e["k2"])
119
+ assert_equal(["k4"], e.unused)
120
+ assert_equal('v4', e["k4"])
121
+ assert_equal([], e.unused)
122
+ end
123
+
124
+ test 'with unused argument' do
125
+ e = element('ROOT', '', {"k1" => "v1", "k2" => "v2", "k4" => "v4"}, [
126
+ element('test', 'mydata', {'k3' => 'v3'}, [])
127
+ ], ["k4"])
128
+ assert_equal(["k4"], e.unused)
129
+ assert_equal('v1', e["k1"])
130
+ assert_equal(["k4"], e.unused)
131
+ assert_equal('v2', e["k2"])
132
+ assert_equal(["k4"], e.unused)
133
+ assert_equal('v4', e["k4"])
134
+ # only consume for "k4"
135
+ assert_equal([], e.unused)
136
+ end
137
+ end
138
+ end
139
+
140
+ sub_test_case '#add_element' do
141
+ test 'elements can be set by #add_element' do
142
+ e = element()
143
+ assert_equal [], e.elements
144
+
145
+ e.add_element('e1', '')
146
+ e.add_element('e2', '')
147
+ assert_equal [element('e1', ''), element('e2', '')], e.elements
148
+ end
149
+ end
150
+
151
+ sub_test_case '#==' do
152
+ sub_test_case 'compare with two element objects' do
153
+ test 'equal' do
154
+ e1 = element('ROOT', '', {}, [])
155
+ e2 = element('ROOT', '', {}, [])
156
+ assert_true(e1 == e2)
157
+ end
158
+
159
+ data("differ args" => [Fluent::Config::Element.new('ROOT', '', {}, []),
160
+ Fluent::Config::Element.new('ROOT', 'mydata', {}, [])],
161
+ "differ keys" => [Fluent::Config::Element.new('ROOT', 'mydata', {}, []),
162
+ Fluent::Config::Element.new('ROOT', 'mydata', {"k1" => "v1"}, [])],
163
+ "differ elemnts" =>
164
+ [Fluent::Config::Element.new('ROOT', 'mydata', {"k1" => "v1"}, []),
165
+ Fluent::Config::Element.new('ROOT', 'mydata', {"k1" => "v1"}, [
166
+ Fluent::Config::Element.new('test', 'mydata', {'k3' => 'v3'}, [])
167
+ ])])
168
+ test 'not equal' do |data|
169
+ e1, e2 = data
170
+ assert_false(e1 == e2)
171
+ end
172
+ end
173
+ end
174
+
175
+ sub_test_case '#+' do
176
+ test 'can merge 2 elements: object side is primary' do
177
+ e1 = element('ROOT', 'mydata', {"k1" => "v1"}, [])
178
+ e2 = element('ROOT', 'mydata2', {"k1" => "ignored", "k2" => "v2"}, [
179
+ element('test', 'ext', {'k3' => 'v3'}, [])
180
+ ])
181
+ e = e1 + e2
182
+
183
+ assert_equal('ROOT', e.name)
184
+ assert_equal('mydata', e.arg)
185
+ assert_equal('v1', e['k1'])
186
+ assert_equal('v2', e['k2'])
187
+ assert_equal(1, e.elements.size)
188
+ e.each_element('test') do |el|
189
+ assert_equal('test', el.name)
190
+ assert_equal('ext', el.arg)
191
+ assert_equal('v3', el["k3"])
192
+ end
193
+ end
194
+ end
195
+
196
+ sub_test_case '#check_not_fetched' do
197
+ sub_test_case 'without unused' do
198
+ test 'can get attribute keys and original Config::Element' do
199
+ e = element('ROOT', 'mydata', {"k1" => "v1"}, [])
200
+ e.check_not_fetched { |key, elem|
201
+ assert_equal("k1", key)
202
+ assert_equal(e, elem)
203
+ }
204
+ end
205
+ end
206
+
207
+ sub_test_case 'with unused' do
208
+ test 'can get unused marked attribute keys and original Config::Element' do
209
+ e = element('ROOT', 'mydata', {"k1" => "v1", "k2" => "unused", "k3" => "k3"})
210
+ e.unused = "k2"
211
+ e.check_not_fetched { |key, elem|
212
+ assert_equal("k2", key)
213
+ assert_equal(e, elem)
214
+ }
215
+ end
216
+ end
217
+ end
218
+
219
+ sub_test_case '#has_key?' do
220
+ test 'can get boolean with key name' do
221
+ e = element('ROOT', 'mydata', {"k1" => "v1"}, [])
222
+ assert_true(e.has_key?("k1"))
223
+ assert_false(e.has_key?("noexistent"))
224
+ end
225
+ end
226
+
227
+
228
+ sub_test_case '#to_s' do
229
+ data("without v1_config" => [false, <<-CONF
230
+ <ROOT>
231
+ k1 v1
232
+ k2 "stringVal"
233
+ <test ext>
234
+ k2 v2
235
+ </test>
236
+ </ROOT>
237
+ CONF
238
+ ],
239
+ "with v1_config" => [true, <<-CONF
240
+ <ROOT>
241
+ k1 v1
242
+ k2 "stringVal"
243
+ <test ext>
244
+ k2 v2
245
+ </test>
246
+ </ROOT>
247
+ CONF
248
+ ],
249
+ )
250
+ test 'dump config element with #to_s' do |data|
251
+ v1_config, expected = data
252
+ e = element('ROOT', '', {'k1' => 'v1', "k2" =>"\"stringVal\""}, [
253
+ element('test', 'ext', {'k2' => 'v2'}, [])
254
+ ])
255
+ e.v1_config = v1_config
256
+ dump = expected
257
+ assert_not_equal(e.inspect, e.to_s)
258
+ assert_equal(dump, e.to_s)
259
+ end
260
+ end
261
+
262
+ sub_test_case '#inspect' do
263
+ test 'dump config element with #inspect' do
264
+ e = element('ROOT', '', {'k1' => 'v1'}, [
265
+ element('test', 'ext', {'k2' => 'v2'}, [])
266
+ ])
267
+ dump = <<-CONF
268
+ name:ROOT, arg:, {\"k1\"=>\"v1\"}, [name:test, arg:ext, {\"k2\"=>\"v2\"}, []]
269
+ CONF
270
+ assert_not_equal(e.to_s, e.inspect)
271
+ assert_equal(dump.chomp, e.inspect)
272
+ end
273
+ end
274
+ end
@@ -105,8 +105,8 @@ module Fluent::Config
105
105
  test('"\\.t"') { assert_text_parsed_as(".t", '"\\.t"') }
106
106
  test('"\\$t"') { assert_text_parsed_as("$t", '"\\$t"') }
107
107
  test('"\\"') { assert_text_parsed_as("#t", '"\\#t"') }
108
- test('"\\0"') { assert_text_parsed_as("\0", '"\\0"') }
109
108
  test('"\\z"') { assert_parse_error('"\\z"') } # unknown escaped character
109
+ test('"\\0"') { assert_parse_error('"\\0"') } # unknown escaped character
110
110
  test('"\\1"') { assert_parse_error('"\\1"') } # unknown escaped character
111
111
  test('"t') { assert_parse_error('"t') } # non-terminated quoted character
112
112
  test("\"t\nt\"") { assert_text_parsed_as("t\nt", "\"t\nt\"" ) } # multiline string
@@ -24,7 +24,7 @@ module Fluent::Config
24
24
  name: 'tagomoris',
25
25
  age: 34,
26
26
  send: 'email',
27
- class: 'normal',
27
+ klass: 'normal',
28
28
  keys: 5,
29
29
  }
30
30
  s1 = Fluent::Config::Section.new(hash)
@@ -32,17 +32,53 @@ module Fluent::Config
32
32
  assert_equal("tagomoris", s1[:name])
33
33
  assert_equal(34, s1[:age])
34
34
  assert_equal("email", s1[:send])
35
- assert_equal("normal", s1[:class])
35
+ assert_equal("normal", s1[:klass])
36
36
  assert_equal(5, s1[:keys])
37
37
 
38
38
  assert_equal("tagomoris", s1.name)
39
39
  assert_equal(34, s1.age)
40
40
  assert_equal("email", s1.send)
41
- assert_equal("normal", s1.class)
41
+ assert_equal("normal", s1.klass)
42
42
  assert_equal(5, s1.keys)
43
43
 
44
44
  assert_raise(NoMethodError) { s1.dup }
45
45
  end
46
+
47
+ test 'creates object which contains specified hash object itself, including fields with at prefix' do
48
+ hash = {
49
+ name: 'tagomoris',
50
+ age: 34,
51
+ send: 'email',
52
+ klass: 'normal',
53
+ keys: 5,
54
+ }
55
+ hash['@id'.to_sym] = 'myid'
56
+
57
+ s1 = Fluent::Config::Section.new(hash)
58
+ assert_equal('myid', s1['@id'])
59
+ assert_equal('myid', s1['@id'.to_sym])
60
+ assert_equal('myid', s1.__send__('@id'.to_sym))
61
+ end
62
+
63
+ test 'creates object and config element which corresponds to section object itself' do
64
+ hash = {
65
+ name: 'tagomoris',
66
+ age: 34,
67
+ send: 'email',
68
+ klass: 'normal',
69
+ keys: 5,
70
+ }
71
+ hash['@id'.to_sym] = 'myid'
72
+ conf = config_element('section', '', {'name' => 'tagomoris', 'age' => 34, 'send' => 'email', 'klass' => 'normal', 'keys' => 5})
73
+ s2 = Fluent::Config::Section.new(hash, conf)
74
+ assert s2.corresponding_config_element.is_a?(Fluent::Config::Element)
75
+ end
76
+ end
77
+
78
+ sub_test_case '#class' do
79
+ test 'returns class constant' do
80
+ assert_equal Fluent::Config::Section, Fluent::Config::Section.new({}).class
81
+ end
46
82
  end
47
83
 
48
84
  sub_test_case '#object_id' do
@@ -61,7 +97,7 @@ module Fluent::Config
61
97
  name: 'tagomoris',
62
98
  age: 34,
63
99
  send: 'email',
64
- class: 'normal',
100
+ klass: 'normal',
65
101
  keys: 5,
66
102
  }
67
103
  s = Fluent::Config::Section.new(hash)
@@ -89,10 +125,10 @@ module Fluent::Config
89
125
 
90
126
  sub_test_case '#+' do
91
127
  test 'can merge 2 sections: argument side is primary, internal hash is newly created' do
92
- h1 = {name: "s1", num: 10, class: "A"}
128
+ h1 = {name: "s1", num: 10, klass: "A"}
93
129
  s1 = Fluent::Config::Section.new(h1)
94
130
 
95
- h2 = {name: "s2", class: "A", num2: "5", num3: "8"}
131
+ h2 = {name: "s2", klass: "A", num2: "5", num3: "8"}
96
132
  s2 = Fluent::Config::Section.new(h2)
97
133
  s = s1 + s2
98
134
 
@@ -101,11 +137,47 @@ module Fluent::Config
101
137
 
102
138
  assert_equal("s2", s.name)
103
139
  assert_equal(10, s.num)
104
- assert_equal("A", s.class)
140
+ assert_equal("A", s.klass)
105
141
  assert_equal("5", s.num2)
106
142
  assert_equal("8", s.num3)
107
143
  end
108
144
  end
145
+
146
+ sub_test_case '#to_s' do
147
+ test '#to_s == #inspect' do
148
+ h1 = {name: "s1", num: 10, klass: "A"}
149
+ s1 = Fluent::Config::Section.new(h1)
150
+
151
+ assert_equal(s1.to_s, s1.inspect)
152
+ end
153
+ end
154
+
155
+ data("inspect" => [:inspect, true],
156
+ "nil?" => [:nil?, true],
157
+ "to_h" => [:to_h, true],
158
+ "+" => [:+, true],
159
+ "instance_of?" => [:instance_of?, true],
160
+ "kind_of?" => [:kind_of?, true],
161
+ "[]" => [:[], true],
162
+ "respond_to?" => [:respond_to?, true],
163
+ "respond_to_missing?" => [:respond_to_missing?, true],
164
+ "!" => [:!, true],
165
+ "!=" => [:!=, true],
166
+ "==" => [:==, true],
167
+ "equal?" => [:equal?, true],
168
+ "instance_eval" => [:instance_eval, true],
169
+ "instance_exec" => [:instance_exec, true],
170
+ "method_missing" => [:method_missing, false],
171
+ "singleton_method_added" => [:singleton_method_added, false],
172
+ "singleton_method_removed" => [:singleton_method_removed, false],
173
+ "singleton_method_undefined" => [:singleton_method_undefined, false],
174
+ "no_such_method" => [:no_such_method, false])
175
+ test '#respond_to?' do |data|
176
+ method, expected = data
177
+ h1 = {name: "s1", num: 10, klass: "A"}
178
+ s1 = Fluent::Config::Section.new(h1)
179
+ assert_equal(expected, s1.respond_to?(method))
180
+ end
109
181
  end
110
182
  end
111
183
  end
@@ -20,6 +20,9 @@ module Fluent::Config
20
20
  @suppress_config_dump = nil
21
21
  @suppress_repeated_stacktrace = nil
22
22
  @without_source = nil
23
+ @emit_error_log_interval = nil
24
+ @file_permission = nil
25
+ @dir_permission = nil
23
26
  end
24
27
  end
25
28
 
@@ -48,6 +51,8 @@ module Fluent::Config
48
51
  assert_nil(s.instance_variable_get(:@emit_error_log_interval))
49
52
  assert_nil(s.instance_variable_get(:@suppress_config_dump))
50
53
  assert_nil(s.instance_variable_get(:@without_source))
54
+ assert_nil(s.instance_variable_get(:@file_permission))
55
+ assert_nil(s.instance_variable_get(:@dir_permission))
51
56
  end
52
57
 
53
58
  {'log_level' => 'error',
@@ -81,6 +86,8 @@ module Fluent::Config
81
86
  assert_nil(s.instance_variable_get(:@emit_error_log_interval))
82
87
  assert_nil(s.instance_variable_get(:@suppress_config_dump))
83
88
  assert_nil(s.instance_variable_get(:@without_source))
89
+ assert_nil(s.instance_variable_get(:@file_permission))
90
+ assert_nil(s.instance_variable_get(:@dir_permission))
84
91
  end
85
92
  }
86
93
 
@@ -95,5 +102,19 @@ module Fluent::Config
95
102
  sc.apply(s)
96
103
  assert_equal(Fluent::Log::LEVEL_WARN, s.instance_variable_get("@log").level)
97
104
  end
105
+
106
+ test 'process global overridable variables' do
107
+ conf = parse_text(<<-EOS)
108
+ <system>
109
+ file_permission 0655
110
+ dir_permission 0765
111
+ </system>
112
+ EOS
113
+ s = FakeSupervisor.new
114
+ sc = Fluent::SystemConfig.new(conf)
115
+ sc.apply(s)
116
+ assert_equal(0655, s.instance_variable_get(:@file_permission))
117
+ assert_equal(0765, s.instance_variable_get(:@dir_permission))
118
+ end
98
119
  end
99
120
  end