fluentd 1.17.0-x86-mingw32 → 1.17.1-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +46 -0
  3. data/README.md +1 -0
  4. data/SECURITY.md +2 -2
  5. data/fluent.conf +14 -14
  6. data/lib/fluent/command/cap_ctl.rb +4 -4
  7. data/lib/fluent/compat/call_super_mixin.rb +3 -3
  8. data/lib/fluent/compat/propagate_default.rb +4 -4
  9. data/lib/fluent/config/yaml_parser/parser.rb +4 -0
  10. data/lib/fluent/log/console_adapter.rb +4 -2
  11. data/lib/fluent/plugin/in_exec.rb +14 -2
  12. data/lib/fluent/plugin/in_http.rb +1 -1
  13. data/lib/fluent/plugin/in_sample.rb +13 -7
  14. data/lib/fluent/plugin/in_tail.rb +65 -23
  15. data/lib/fluent/plugin/out_copy.rb +1 -1
  16. data/lib/fluent/plugin/out_file.rb +8 -0
  17. data/lib/fluent/plugin/out_http.rb +12 -0
  18. data/lib/fluent/plugin/parser_json.rb +4 -12
  19. data/lib/fluent/plugin_helper/http_server/server.rb +1 -1
  20. data/lib/fluent/version.rb +1 -1
  21. data/templates/new_gem/fluent-plugin.gemspec.erb +6 -5
  22. metadata +25 -472
  23. data/.github/DISCUSSION_TEMPLATE/q-a-japanese.yml +0 -50
  24. data/.github/DISCUSSION_TEMPLATE/q-a.yml +0 -47
  25. data/.github/ISSUE_TEMPLATE/bug_report.yml +0 -71
  26. data/.github/ISSUE_TEMPLATE/config.yml +0 -5
  27. data/.github/ISSUE_TEMPLATE/feature_request.yml +0 -39
  28. data/.github/ISSUE_TEMPLATE.md +0 -17
  29. data/.github/PULL_REQUEST_TEMPLATE.md +0 -14
  30. data/.github/workflows/stale-actions.yml +0 -24
  31. data/.github/workflows/test-ruby-head.yml +0 -31
  32. data/.github/workflows/test.yml +0 -32
  33. data/.gitignore +0 -30
  34. data/Gemfile +0 -9
  35. data/fluentd.gemspec +0 -62
  36. data/test/command/test_binlog_reader.rb +0 -362
  37. data/test/command/test_ca_generate.rb +0 -70
  38. data/test/command/test_cap_ctl.rb +0 -100
  39. data/test/command/test_cat.rb +0 -128
  40. data/test/command/test_ctl.rb +0 -56
  41. data/test/command/test_fluentd.rb +0 -1291
  42. data/test/command/test_plugin_config_formatter.rb +0 -397
  43. data/test/command/test_plugin_generator.rb +0 -109
  44. data/test/compat/test_calls_super.rb +0 -166
  45. data/test/compat/test_parser.rb +0 -92
  46. data/test/config/assertions.rb +0 -42
  47. data/test/config/test_config_parser.rb +0 -551
  48. data/test/config/test_configurable.rb +0 -1784
  49. data/test/config/test_configure_proxy.rb +0 -604
  50. data/test/config/test_dsl.rb +0 -415
  51. data/test/config/test_element.rb +0 -518
  52. data/test/config/test_literal_parser.rb +0 -309
  53. data/test/config/test_plugin_configuration.rb +0 -56
  54. data/test/config/test_section.rb +0 -191
  55. data/test/config/test_system_config.rb +0 -195
  56. data/test/config/test_types.rb +0 -408
  57. data/test/counter/test_client.rb +0 -563
  58. data/test/counter/test_error.rb +0 -44
  59. data/test/counter/test_mutex_hash.rb +0 -179
  60. data/test/counter/test_server.rb +0 -589
  61. data/test/counter/test_store.rb +0 -258
  62. data/test/counter/test_validator.rb +0 -137
  63. data/test/helper.rb +0 -155
  64. data/test/helpers/fuzzy_assert.rb +0 -89
  65. data/test/helpers/process_extenstion.rb +0 -33
  66. data/test/log/test_console_adapter.rb +0 -117
  67. data/test/plugin/data/2010/01/20100102-030405.log +0 -0
  68. data/test/plugin/data/2010/01/20100102-030406.log +0 -0
  69. data/test/plugin/data/2010/01/20100102.log +0 -0
  70. data/test/plugin/data/log/bar +0 -0
  71. data/test/plugin/data/log/foo/bar.log +0 -0
  72. data/test/plugin/data/log/foo/bar2 +0 -0
  73. data/test/plugin/data/log/test.log +0 -0
  74. data/test/plugin/data/log_numeric/01.log +0 -0
  75. data/test/plugin/data/log_numeric/02.log +0 -0
  76. data/test/plugin/data/log_numeric/12.log +0 -0
  77. data/test/plugin/data/log_numeric/14.log +0 -0
  78. data/test/plugin/data/sd_file/config +0 -11
  79. data/test/plugin/data/sd_file/config.json +0 -17
  80. data/test/plugin/data/sd_file/config.yaml +0 -11
  81. data/test/plugin/data/sd_file/config.yml +0 -11
  82. data/test/plugin/data/sd_file/invalid_config.yml +0 -7
  83. data/test/plugin/in_tail/test_fifo.rb +0 -121
  84. data/test/plugin/in_tail/test_io_handler.rb +0 -150
  85. data/test/plugin/in_tail/test_position_file.rb +0 -346
  86. data/test/plugin/out_forward/test_ack_handler.rb +0 -140
  87. data/test/plugin/out_forward/test_connection_manager.rb +0 -145
  88. data/test/plugin/out_forward/test_handshake_protocol.rb +0 -112
  89. data/test/plugin/out_forward/test_load_balancer.rb +0 -106
  90. data/test/plugin/out_forward/test_socket_cache.rb +0 -174
  91. data/test/plugin/test_bare_output.rb +0 -131
  92. data/test/plugin/test_base.rb +0 -247
  93. data/test/plugin/test_buf_file.rb +0 -1314
  94. data/test/plugin/test_buf_file_single.rb +0 -898
  95. data/test/plugin/test_buf_memory.rb +0 -42
  96. data/test/plugin/test_buffer.rb +0 -1493
  97. data/test/plugin/test_buffer_chunk.rb +0 -209
  98. data/test/plugin/test_buffer_file_chunk.rb +0 -871
  99. data/test/plugin/test_buffer_file_single_chunk.rb +0 -611
  100. data/test/plugin/test_buffer_memory_chunk.rb +0 -339
  101. data/test/plugin/test_compressable.rb +0 -87
  102. data/test/plugin/test_file_util.rb +0 -96
  103. data/test/plugin/test_filter.rb +0 -368
  104. data/test/plugin/test_filter_grep.rb +0 -697
  105. data/test/plugin/test_filter_parser.rb +0 -731
  106. data/test/plugin/test_filter_record_transformer.rb +0 -577
  107. data/test/plugin/test_filter_stdout.rb +0 -207
  108. data/test/plugin/test_formatter_csv.rb +0 -136
  109. data/test/plugin/test_formatter_hash.rb +0 -38
  110. data/test/plugin/test_formatter_json.rb +0 -61
  111. data/test/plugin/test_formatter_ltsv.rb +0 -70
  112. data/test/plugin/test_formatter_msgpack.rb +0 -28
  113. data/test/plugin/test_formatter_out_file.rb +0 -116
  114. data/test/plugin/test_formatter_single_value.rb +0 -44
  115. data/test/plugin/test_formatter_tsv.rb +0 -76
  116. data/test/plugin/test_in_debug_agent.rb +0 -49
  117. data/test/plugin/test_in_exec.rb +0 -261
  118. data/test/plugin/test_in_forward.rb +0 -1178
  119. data/test/plugin/test_in_gc_stat.rb +0 -62
  120. data/test/plugin/test_in_http.rb +0 -1124
  121. data/test/plugin/test_in_monitor_agent.rb +0 -922
  122. data/test/plugin/test_in_object_space.rb +0 -66
  123. data/test/plugin/test_in_sample.rb +0 -190
  124. data/test/plugin/test_in_syslog.rb +0 -505
  125. data/test/plugin/test_in_tail.rb +0 -3429
  126. data/test/plugin/test_in_tcp.rb +0 -328
  127. data/test/plugin/test_in_udp.rb +0 -296
  128. data/test/plugin/test_in_unix.rb +0 -181
  129. data/test/plugin/test_input.rb +0 -137
  130. data/test/plugin/test_metadata.rb +0 -89
  131. data/test/plugin/test_metrics.rb +0 -294
  132. data/test/plugin/test_metrics_local.rb +0 -96
  133. data/test/plugin/test_multi_output.rb +0 -204
  134. data/test/plugin/test_out_copy.rb +0 -308
  135. data/test/plugin/test_out_exec.rb +0 -312
  136. data/test/plugin/test_out_exec_filter.rb +0 -606
  137. data/test/plugin/test_out_file.rb +0 -1038
  138. data/test/plugin/test_out_forward.rb +0 -1349
  139. data/test/plugin/test_out_http.rb +0 -557
  140. data/test/plugin/test_out_null.rb +0 -105
  141. data/test/plugin/test_out_relabel.rb +0 -28
  142. data/test/plugin/test_out_roundrobin.rb +0 -146
  143. data/test/plugin/test_out_secondary_file.rb +0 -458
  144. data/test/plugin/test_out_stdout.rb +0 -205
  145. data/test/plugin/test_out_stream.rb +0 -103
  146. data/test/plugin/test_output.rb +0 -1334
  147. data/test/plugin/test_output_as_buffered.rb +0 -2024
  148. data/test/plugin/test_output_as_buffered_backup.rb +0 -363
  149. data/test/plugin/test_output_as_buffered_compress.rb +0 -179
  150. data/test/plugin/test_output_as_buffered_overflow.rb +0 -250
  151. data/test/plugin/test_output_as_buffered_retries.rb +0 -966
  152. data/test/plugin/test_output_as_buffered_secondary.rb +0 -882
  153. data/test/plugin/test_output_as_standard.rb +0 -374
  154. data/test/plugin/test_owned_by.rb +0 -34
  155. data/test/plugin/test_parser.rb +0 -399
  156. data/test/plugin/test_parser_apache.rb +0 -42
  157. data/test/plugin/test_parser_apache2.rb +0 -47
  158. data/test/plugin/test_parser_apache_error.rb +0 -45
  159. data/test/plugin/test_parser_csv.rb +0 -200
  160. data/test/plugin/test_parser_json.rb +0 -244
  161. data/test/plugin/test_parser_labeled_tsv.rb +0 -160
  162. data/test/plugin/test_parser_msgpack.rb +0 -127
  163. data/test/plugin/test_parser_multiline.rb +0 -111
  164. data/test/plugin/test_parser_nginx.rb +0 -88
  165. data/test/plugin/test_parser_none.rb +0 -52
  166. data/test/plugin/test_parser_regexp.rb +0 -284
  167. data/test/plugin/test_parser_syslog.rb +0 -650
  168. data/test/plugin/test_parser_tsv.rb +0 -122
  169. data/test/plugin/test_sd_file.rb +0 -228
  170. data/test/plugin/test_sd_srv.rb +0 -230
  171. data/test/plugin/test_storage.rb +0 -166
  172. data/test/plugin/test_storage_local.rb +0 -335
  173. data/test/plugin/test_string_util.rb +0 -26
  174. data/test/plugin_helper/data/cert/cert-key.pem +0 -27
  175. data/test/plugin_helper/data/cert/cert-with-CRLF.pem +0 -19
  176. data/test/plugin_helper/data/cert/cert-with-no-newline.pem +0 -19
  177. data/test/plugin_helper/data/cert/cert.pem +0 -19
  178. data/test/plugin_helper/data/cert/cert_chains/ca-cert-key.pem +0 -27
  179. data/test/plugin_helper/data/cert/cert_chains/ca-cert.pem +0 -20
  180. data/test/plugin_helper/data/cert/cert_chains/cert-key.pem +0 -27
  181. data/test/plugin_helper/data/cert/cert_chains/cert.pem +0 -40
  182. data/test/plugin_helper/data/cert/empty.pem +0 -0
  183. data/test/plugin_helper/data/cert/generate_cert.rb +0 -125
  184. data/test/plugin_helper/data/cert/with_ca/ca-cert-key-pass.pem +0 -30
  185. data/test/plugin_helper/data/cert/with_ca/ca-cert-key.pem +0 -27
  186. data/test/plugin_helper/data/cert/with_ca/ca-cert-pass.pem +0 -20
  187. data/test/plugin_helper/data/cert/with_ca/ca-cert.pem +0 -20
  188. data/test/plugin_helper/data/cert/with_ca/cert-key-pass.pem +0 -30
  189. data/test/plugin_helper/data/cert/with_ca/cert-key.pem +0 -27
  190. data/test/plugin_helper/data/cert/with_ca/cert-pass.pem +0 -21
  191. data/test/plugin_helper/data/cert/with_ca/cert.pem +0 -21
  192. data/test/plugin_helper/data/cert/without_ca/cert-key-pass.pem +0 -30
  193. data/test/plugin_helper/data/cert/without_ca/cert-key.pem +0 -27
  194. data/test/plugin_helper/data/cert/without_ca/cert-pass.pem +0 -20
  195. data/test/plugin_helper/data/cert/without_ca/cert.pem +0 -20
  196. data/test/plugin_helper/http_server/test_app.rb +0 -65
  197. data/test/plugin_helper/http_server/test_route.rb +0 -32
  198. data/test/plugin_helper/service_discovery/test_manager.rb +0 -93
  199. data/test/plugin_helper/service_discovery/test_round_robin_balancer.rb +0 -21
  200. data/test/plugin_helper/test_cert_option.rb +0 -25
  201. data/test/plugin_helper/test_child_process.rb +0 -862
  202. data/test/plugin_helper/test_compat_parameters.rb +0 -358
  203. data/test/plugin_helper/test_event_emitter.rb +0 -80
  204. data/test/plugin_helper/test_event_loop.rb +0 -52
  205. data/test/plugin_helper/test_extract.rb +0 -194
  206. data/test/plugin_helper/test_formatter.rb +0 -255
  207. data/test/plugin_helper/test_http_server_helper.rb +0 -372
  208. data/test/plugin_helper/test_inject.rb +0 -561
  209. data/test/plugin_helper/test_metrics.rb +0 -137
  210. data/test/plugin_helper/test_parser.rb +0 -264
  211. data/test/plugin_helper/test_record_accessor.rb +0 -238
  212. data/test/plugin_helper/test_retry_state.rb +0 -1006
  213. data/test/plugin_helper/test_server.rb +0 -1895
  214. data/test/plugin_helper/test_service_discovery.rb +0 -165
  215. data/test/plugin_helper/test_socket.rb +0 -146
  216. data/test/plugin_helper/test_storage.rb +0 -542
  217. data/test/plugin_helper/test_thread.rb +0 -164
  218. data/test/plugin_helper/test_timer.rb +0 -130
  219. data/test/scripts/exec_script.rb +0 -32
  220. data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +0 -7
  221. data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +0 -7
  222. data/test/scripts/fluent/plugin/formatter_known.rb +0 -8
  223. data/test/scripts/fluent/plugin/out_test.rb +0 -81
  224. data/test/scripts/fluent/plugin/out_test2.rb +0 -80
  225. data/test/scripts/fluent/plugin/parser_known.rb +0 -4
  226. data/test/test_capability.rb +0 -74
  227. data/test/test_clock.rb +0 -164
  228. data/test/test_config.rb +0 -369
  229. data/test/test_configdsl.rb +0 -148
  230. data/test/test_daemonizer.rb +0 -91
  231. data/test/test_engine.rb +0 -203
  232. data/test/test_event.rb +0 -531
  233. data/test/test_event_router.rb +0 -348
  234. data/test/test_event_time.rb +0 -199
  235. data/test/test_file_wrapper.rb +0 -53
  236. data/test/test_filter.rb +0 -121
  237. data/test/test_fluent_log_event_router.rb +0 -99
  238. data/test/test_formatter.rb +0 -369
  239. data/test/test_input.rb +0 -31
  240. data/test/test_log.rb +0 -1076
  241. data/test/test_match.rb +0 -148
  242. data/test/test_mixin.rb +0 -351
  243. data/test/test_msgpack_factory.rb +0 -50
  244. data/test/test_oj_options.rb +0 -55
  245. data/test/test_output.rb +0 -278
  246. data/test/test_plugin.rb +0 -251
  247. data/test/test_plugin_classes.rb +0 -370
  248. data/test/test_plugin_helper.rb +0 -81
  249. data/test/test_plugin_id.rb +0 -119
  250. data/test/test_process.rb +0 -14
  251. data/test/test_root_agent.rb +0 -951
  252. data/test/test_static_config_analysis.rb +0 -177
  253. data/test/test_supervisor.rb +0 -821
  254. data/test/test_test_drivers.rb +0 -136
  255. data/test/test_time_formatter.rb +0 -301
  256. data/test/test_time_parser.rb +0 -362
  257. data/test/test_tls.rb +0 -65
  258. data/test/test_unique_id.rb +0 -47
  259. data/test/test_variable_store.rb +0 -65
@@ -1,862 +0,0 @@
1
- # coding: utf-8
2
- require_relative '../helper'
3
- require 'fluent/plugin_helper/child_process'
4
- require 'fluent/plugin/base'
5
- require 'timeout'
6
- require 'tempfile'
7
-
8
- class ChildProcessTest < Test::Unit::TestCase
9
- TEST_DEADLOCK_TIMEOUT = 30
10
- TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING = 0.1 # This may be shorter than ruby's threading timer, but work well
11
- # @nalsh says that ruby's cpu assignments for threads are almost 200ms or so.
12
- # Loop interval (expected that it work as specified) should be longer than it.
13
- TEST_WAIT_INTERVAL_FOR_LOOP = 0.5
14
-
15
- setup do
16
- @d = Dummy.new
17
- @d.configure(config_element())
18
- @d.start
19
- end
20
-
21
- teardown do
22
- if @d
23
- @d.stop unless @d.stopped?
24
- @d.shutdown unless @d.shutdown?
25
- @d.close unless @d.closed?
26
- @d.terminate unless @d.terminated?
27
- @d.log.reset
28
- end
29
- end
30
-
31
- class Dummy < Fluent::Plugin::TestBase
32
- helpers :child_process
33
- def configure(conf)
34
- super
35
- @_child_process_kill_timeout = 1
36
- end
37
- end
38
-
39
- test 'can be instantiated' do
40
- d1 = Dummy.new
41
- assert d1.respond_to?(:_child_process_processes)
42
- end
43
-
44
- test 'can be configured and started' do
45
- d1 = Dummy.new
46
- assert_nothing_raised do
47
- d1.configure(config_element())
48
- end
49
- assert d1.plugin_id
50
- assert d1.log
51
-
52
- d1.start
53
- end
54
-
55
- test 'can execute external command asyncronously' do
56
- m = Mutex.new
57
- m.lock
58
- ary = []
59
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
60
- ran = false
61
- @d.child_process_execute(:t0, 'echo', arguments: ['foo', 'bar'], mode: [:read]) do |io|
62
- m.lock
63
- ran = true
64
- io.read # discard
65
- ary << 2
66
- m.unlock
67
- end
68
- ary << 1
69
- m.unlock
70
- sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until m.locked? || ran
71
- m.lock
72
- m.unlock
73
- end
74
- assert_equal [1,2], ary
75
- end
76
-
77
- test 'can execute external command at just once, which finishes immediately' do
78
- m = Mutex.new
79
- t1 = Time.now
80
- ary = []
81
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
82
- ran = false
83
- @d.child_process_execute(:t1, 'echo', arguments: ['foo', 'bar'], mode: [:read]) do |io|
84
- m.lock
85
- ran = true
86
- ary << io.read
87
- m.unlock
88
- end
89
- sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until m.locked? || ran
90
- m.lock
91
- m.unlock
92
- end
93
- assert{ Time.now - t1 < 4.0 }
94
- end
95
-
96
- test 'can execute external command at just once, which can handle both of read and write' do
97
- m = Mutex.new
98
- ary = []
99
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
100
- ran = false
101
- cmd = "ruby -e 'while !STDIN.eof? && line = STDIN.readline; puts line.chomp; STDOUT.flush rescue nil; end'"
102
- @d.child_process_execute(:t2, cmd, mode: [:write, :read]) do |writeio, readio|
103
- m.lock
104
- ran = true
105
-
106
- [[1,2],[3,4],[5,6]].each do |i,j|
107
- writeio.write "my data#{i}\n"
108
- writeio.write "my data#{j}\n"
109
- writeio.flush
110
- end
111
- writeio.close
112
-
113
- while line = readio.readline
114
- ary << line
115
- end
116
- m.unlock
117
- end
118
- sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until m.locked? || ran
119
- m.lock
120
- m.unlock
121
- end
122
-
123
- assert_equal [], @d.log.out.logs
124
- expected = (1..6).map{|i| "my data#{i}\n" }
125
- assert_equal expected, ary
126
- end
127
-
128
- test 'can execute external command at just once, which can handle both of read and write. Ignore stderr message/no block' do
129
- m = Mutex.new
130
- ary = []
131
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
132
- ran = false
133
- # lots of stderr message should not be blocked and message should not be printed in test.
134
- cmd = "ruby -e 'while !STDIN.eof? && line = STDIN.readline; STDERR.puts line.chomp * 1000; STDOUT.puts line.chomp; STDOUT.flush rescue nil; end'"
135
- @d.child_process_execute(:t2_and_ignore_stderr, cmd, mode: [:write, :read]) do |writeio, readio|
136
- m.lock
137
- ran = true
138
-
139
- [[1,2],[3,4],[5,6]].each do |i,j|
140
- writeio.write "my data#{i}\n"
141
- writeio.write "my data#{j}\n"
142
- writeio.flush
143
- end
144
- writeio.close
145
-
146
- while line = readio.readline
147
- ary << line
148
- end
149
- m.unlock
150
- end
151
- begin
152
- sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until m.locked? || ran
153
- m.lock
154
- rescue
155
- ensure
156
- m.unlock
157
- end
158
- end
159
-
160
- assert_equal [], @d.log.out.logs
161
- expected = (1..6).map{|i| "my data#{i}\n" }
162
- assert_equal expected, ary
163
- end
164
-
165
- test 'can execute external command at just once, which can handle all of read, write and stderr' do
166
- m = Mutex.new
167
- ary1 = []
168
- ary2 = []
169
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
170
- ran = false
171
- cmd = "ruby -e 'while !STDIN.eof? && line = STDIN.readline; puts line.chomp; STDOUT.flush rescue nil; STDERR.puts line.chomp; STDERR.flush rescue nil; end'"
172
- @d.child_process_execute(:t2a, cmd, mode: [:write, :read, :stderr]) do |writeio, readio, stderrio|
173
- m.lock
174
- ran = true
175
-
176
- [[1,2],[3,4],[5,6]].each do |i,j|
177
- writeio.write "my data#{i}\n"
178
- writeio.write "my data#{j}\n"
179
- writeio.flush
180
- end
181
- writeio.close
182
-
183
- while (line1 = readio.readline) && (line2 = stderrio.readline)
184
- ary1 << line1
185
- ary2 << line2
186
- end
187
-
188
- m.unlock
189
- end
190
- sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until m.locked? || ran
191
- m.lock
192
- m.unlock
193
- end
194
-
195
- assert_equal [], @d.log.out.logs
196
- expected = (1..6).map{|i| "my data#{i}\n" }
197
- assert_equal expected, ary1
198
- assert_equal expected, ary2
199
- end
200
-
201
- test 'can execute external command at just once, which can handle both of write and read (with stderr)' do
202
- m = Mutex.new
203
- ary = []
204
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
205
- ran = false
206
- cmd = "ruby"
207
- args = ['-e', 'while !STDIN.eof? && line = STDIN.readline; puts "[s]" + line.chomp; STDOUT.flush rescue nil; STDERR.puts "[e]" + line.chomp; STDERR.flush rescue nil; end']
208
- @d.child_process_execute(:t2b, cmd, arguments: args, mode: [:write, :read_with_stderr]) do |writeio, readio|
209
- m.lock
210
- ran = true
211
-
212
- [[1,2],[3,4],[5,6]].each do |i,j|
213
- writeio.write "my data#{i}\n"
214
- writeio.write "my data#{j}\n"
215
- writeio.flush
216
- end
217
- writeio.close
218
-
219
- while line = readio.readline
220
- ary << line
221
- end
222
-
223
- m.unlock
224
- end
225
- sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until m.locked? || ran
226
- m.lock
227
- m.unlock
228
- end
229
-
230
- assert_equal [], @d.log.out.logs
231
- expected = (1..6).map{|i| ["[s]my data#{i}\n", "[e]my data#{i}\n"] }.flatten
232
- assert_equal expected, ary
233
- end
234
-
235
- test 'can execute external command at just once, which runs forever' do
236
- ary = []
237
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
238
- ran = false
239
- args = ["-e", "while sleep 0.1; puts 1; STDOUT.flush; end"]
240
- @d.child_process_execute(:t3, "ruby", arguments: args, mode: [:read]) do |io|
241
- begin
242
- while @d.child_process_running? && line = io.readline
243
- ran ||= true
244
- ary << line
245
- end
246
- rescue
247
- # ignore
248
- end
249
- end
250
- sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until ran
251
- sleep 1
252
-
253
- @d.stop # nothing occurs
254
- @d.shutdown
255
- assert { ary.size >= 4 }
256
-
257
- @d.close
258
-
259
- @d.terminate
260
- assert @d._child_process_processes.empty?
261
- end
262
- end
263
-
264
- # In windows environment, child_process try KILL at first (because there's no SIGTERM)
265
- test 'can execute external command just once, and can terminate it forcedly when shutdown/terminate even if it ignore SIGTERM' do
266
- omit "SIGTERM is unavailable on Windows" if Fluent.windows?
267
-
268
- m = Mutex.new
269
- ary = []
270
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
271
- ran = false
272
- @d.child_process_execute(:t4, "ruby -e 'Signal.trap(:TERM, nil); while sleep 0.1; puts 1; STDOUT.flush rescue nil; end'", mode: [:read]) do |io|
273
- begin
274
- while line = io.readline
275
- unless ran
276
- m.lock
277
- ran = true
278
- end
279
- ary << line
280
- end
281
- rescue
282
- # ignore
283
- ensure
284
- m.unlock
285
- end
286
- end
287
- sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until m.locked? || ran
288
-
289
- assert_equal [], @d.log.out.logs
290
-
291
- @d.stop # nothing occurs
292
- lines1 = nil
293
- waiting(TEST_WAIT_INTERVAL_FOR_LOOP * 3) do
294
- lines1 = ary.size
295
- lines1 > 1
296
- end
297
-
298
- pid = @d._child_process_processes.keys.first
299
- # default value 10 is too long for test
300
- @d.instance_eval { @_child_process_exit_timeout = 1 }
301
- @d.shutdown
302
- sleep TEST_WAIT_INTERVAL_FOR_LOOP
303
- lines2 = ary.size
304
- assert { lines2 > lines1 }
305
- @d.close
306
-
307
- assert_nil((Process.waitpid(pid, Process::WNOHANG) rescue nil))
308
-
309
- @d.terminate
310
- assert @d._child_process_processes.empty?
311
- begin
312
- Process.waitpid(pid)
313
- rescue Errno::ECHILD
314
- end
315
- # Process successfully KILLed if test reaches here
316
- assert true
317
- end
318
- end
319
-
320
- test 'can execute external command many times, which finishes immediately' do
321
- ary = []
322
- arguments = ["okay"]
323
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
324
- start_time = Fluent::Clock.now
325
- @d.child_process_execute(:t5, "echo", arguments: arguments, interval: 1, mode: [:read]) do |io|
326
- ary << io.read.split("\n").map(&:chomp).join
327
- end
328
- 1.upto(2) do |i|
329
- sleep 0.1 while ary.size < i
330
- elapsed = Fluent::Clock.now - start_time
331
- assert_equal(i, ary.size)
332
- assert_true(elapsed > i && elapsed < i + 0.5,
333
- "actual elapsed: #{elapsed}")
334
- end
335
- assert_equal [], @d.log.out.logs
336
- @d.stop
337
- assert_equal [], @d.log.out.logs
338
- @d.shutdown; @d.close; @d.terminate
339
- end
340
- end
341
-
342
- test 'can execute external command many times, with leading once executed immediately' do
343
- ary = []
344
- arguments = ["okay"]
345
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
346
- start_time = Fluent::Clock.now
347
- @d.child_process_execute(:t6, "echo", arguments: arguments, interval: 1, immediate: true, mode: [:read]) do |io|
348
- ary << io.read.split("\n").map(&:chomp).join
349
- end
350
- 0.upto(1) do |i|
351
- sleep 0.1 while ary.size < i + 1
352
- elapsed = Fluent::Clock.now - start_time
353
- assert_equal(i + 1, ary.size)
354
- assert_true(elapsed > i && elapsed < i + 0.5,
355
- "actual elapsed: #{elapsed}")
356
- end
357
- @d.stop; @d.shutdown; @d.close; @d.terminate
358
- assert_equal [], @d.log.out.logs
359
- end
360
- end
361
-
362
- test 'does not execute long running external command in parallel in default' do
363
- ary = []
364
- arguments = ["-e", "10.times{ sleep #{TEST_WAIT_INTERVAL_FOR_LOOP} }"] # 5 sec
365
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
366
- assert_equal [], @d.log.out.logs
367
- @d.log.out.singleton_class.module_eval do
368
- define_method(:write){|message|
369
- raise "boo" if message.include?('test: {"test":"test"}') || message.include?('test: {"test"=>"test"}')
370
- @logs.push message
371
- }
372
- end
373
-
374
- @d.child_process_execute(:t7, "ruby", arguments: arguments, interval: 1, immediate: true, mode: [:read]) do |io|
375
- ary << io.read.split("\n").map(&:chomp).join
376
- end
377
- sleep 2
378
- assert_equal 1, @d._child_process_processes.size
379
- @d.stop
380
- warn_msg = '[warn]: previous child process is still running. skipped. title=:t7 command="ruby" arguments=["-e", "10.times{ sleep 0.5 }"] interval=1 parallel=false' + "\n"
381
- logs = @d.log.out.logs
382
- assert{ logs.first.end_with?(warn_msg) }
383
- assert{ logs.all?{|line| line.end_with?(warn_msg) } }
384
- @d.shutdown; @d.close; @d.terminate
385
- assert_equal [], @d.log.out.logs
386
- end
387
- end
388
-
389
- test 'can execute long running external command in parallel if specified' do
390
- ary = []
391
- arguments = ["-e", "10.times{ puts 'okay'; STDOUT.flush rescue nil; sleep #{TEST_WAIT_INTERVAL_FOR_LOOP} }"] # 5 sec
392
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
393
- @d.child_process_execute(:t8, "ruby", arguments: arguments, interval: 1, immediate: true, parallel: true, mode: [:read]) do |io|
394
- ary << io.read.split("\n").map(&:chomp).join
395
- end
396
- sleep 2
397
- processes = @d._child_process_processes.size
398
- assert { processes >= 2 && processes <= 4 }
399
- @d.stop; @d.shutdown; @d.close; @d.terminate
400
- assert_equal [], @d.log.out.logs
401
- end
402
- end
403
-
404
- test 'execute external processes only for writing' do
405
- m = Mutex.new
406
- unreadable = false
407
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
408
- ran = false
409
- @d.child_process_execute(:t9, "ruby", arguments: ['-e', 'a=""; while b=STDIN.readline; a+=b; end'], mode: [:write]) do |io|
410
- m.lock
411
- ran = true
412
- begin
413
- io.read
414
- rescue IOError
415
- unreadable = true
416
- end
417
- 50.times do
418
- io.write "hahaha\n"
419
- end
420
- m.unlock
421
- end
422
- sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until m.locked? || ran
423
- m.lock
424
- m.unlock
425
- assert unreadable
426
- @d.stop; @d.shutdown; @d.close; @d.terminate
427
- assert_equal [], @d.log.out.logs
428
- end
429
- end
430
-
431
- test 'execute external processes only for reading' do
432
- m = Mutex.new
433
- unwritable = false
434
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
435
- ran = false
436
- @d.child_process_execute(:t10, "ruby", arguments: ["-e", "while sleep #{TEST_WAIT_INTERVAL_FOR_LOOP}; puts 1; STDOUT.flush rescue nil; end"], mode: [:read]) do |io|
437
- m.lock
438
- ran = true
439
- begin
440
- io.write "foobar"
441
- rescue IOError
442
- unwritable = true
443
- end
444
- _data = io.readline
445
- m.unlock
446
- end
447
- sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until m.locked? || ran
448
- m.lock
449
- m.unlock
450
- @d.stop; @d.shutdown; @d.close; @d.terminate
451
- assert unwritable
452
- assert_equal [], @d.log.out.logs
453
- end
454
- end
455
-
456
- test 'can control external encodings' do
457
- m = Mutex.new
458
- encodings = []
459
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
460
- ran = false
461
- @d.child_process_execute(:t11, "ruby -e 'sleep 10'", external_encoding: 'ascii-8bit') do |r, w|
462
- m.lock
463
- ran = true
464
- encodings << r.external_encoding
465
- encodings << w.external_encoding
466
- m.unlock
467
- end
468
- sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until m.locked? || ran
469
- m.lock
470
- assert_equal Encoding::ASCII_8BIT, encodings[0]
471
- assert_equal Encoding::ASCII_8BIT, encodings[1]
472
- @d.stop; @d.shutdown; @d.close; @d.terminate
473
- end
474
- end
475
-
476
- test 'can control internal encodings' do
477
- m = Mutex.new
478
- encodings = []
479
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
480
- ran = false
481
- @d.child_process_execute(:t12, "ruby -e 'sleep 10'", external_encoding: 'utf-8', internal_encoding: 'ascii-8bit') do |r, w|
482
- m.lock
483
- ran = true
484
- encodings << r.internal_encoding
485
- encodings << w.internal_encoding
486
- m.unlock
487
- end
488
- sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until m.locked? || ran
489
- m.lock
490
- assert_equal Encoding::ASCII_8BIT, encodings[0]
491
- assert_equal Encoding::ASCII_8BIT, encodings[1]
492
- @d.stop; @d.shutdown; @d.close; @d.terminate
493
- end
494
- end
495
-
496
- test 'can convert encodings from ascii-8bit to utf-8' do
497
- m = Mutex.new
498
- str = nil
499
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
500
- ran = false
501
- args = ['-e', 'STDOUT.set_encoding("ascii-8bit"); STDOUT.write "\xA4\xB5\xA4\xC8\xA4\xB7"']
502
- @d.child_process_execute(:t13, "ruby", arguments: args, external_encoding: 'euc-jp', internal_encoding: 'windows-31j', mode: [:read]) do |io|
503
- m.lock
504
- ran = true
505
- str = io.read
506
- m.unlock
507
- end
508
- sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until m.locked? || ran
509
- m.lock
510
- assert_equal Encoding.find('windows-31j'), str.encoding
511
- expected = "さとし".encode('windows-31j')
512
- assert_equal expected, str
513
- @d.stop; @d.shutdown; @d.close; @d.terminate
514
- end
515
- end
516
-
517
- test 'can scrub characters without exceptions' do
518
- if Gem::Version.create(RUBY_VERSION) >= Gem::Version.create('3.3.0')
519
- pend "Behaviour of IO#set_encoding is changed as of Ruby 3.3 (#4058)"
520
- end
521
- m = Mutex.new
522
- str = nil
523
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
524
- ran = false
525
- args = ['-e', 'STDOUT.set_encoding("ascii-8bit"); STDOUT.write "\xFF\xFF\x00\xF0\xF0"']
526
- @d.child_process_execute(:t13a, "ruby", arguments: args, mode: [:read]) do |io|
527
- m.lock
528
- ran = true
529
- str = io.read
530
- m.unlock
531
- end
532
- sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until m.locked? || ran
533
- m.lock
534
- assert_equal Encoding.find('utf-8'), str.encoding
535
- replacement = "\uFFFD" # U+FFFD (REPLACEMENT CHARACTER)
536
- nul = "\x00" # U+0000 (NUL)
537
- expected = replacement * 2 + nul + replacement * 2
538
- assert_equal expected, str
539
- @d.stop; @d.shutdown; @d.close; @d.terminate
540
- end
541
- end
542
-
543
- test 'can scrub characters without exceptions and replace specified chars' do
544
- if Gem::Version.create(RUBY_VERSION) >= Gem::Version.create('3.3.0')
545
- pend "Behaviour of IO#set_encoding is changed as of Ruby 3.3 (#4058)"
546
- end
547
- m = Mutex.new
548
- str = nil
549
- replacement = "?"
550
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
551
- ran = false
552
- args = ['-e', 'STDOUT.set_encoding("ascii-8bit"); STDOUT.write "\xFF\xFF\x00\xF0\xF0"']
553
- @d.child_process_execute(:t13b, "ruby", arguments: args, mode: [:read], scrub: true, replace_string: replacement) do |io|
554
- m.lock
555
- ran = true
556
- str = io.read
557
- m.unlock
558
- end
559
- sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until m.locked? || ran
560
- m.lock
561
- assert_equal Encoding.find('utf-8'), str.encoding
562
- nul = "\x00" # U+0000 (NUL)
563
- expected = replacement * 2 + nul + replacement * 2
564
- assert_equal expected, str
565
- @d.stop; @d.shutdown; @d.close; @d.terminate
566
- end
567
- end
568
-
569
- unless Fluent.windows?
570
- test 'can specify subprocess name' do
571
- io = IO.popen([["cat", "caaaaaaaaaaat"], '-'])
572
- process_naming_enabled = (IO.popen(["ps", "opid,cmd"]){|_io| _io.readlines }.count{|line| line.include?("caaaaaaaaaaat") } > 0)
573
- Process.kill(:TERM, io.pid) rescue nil
574
- io.close rescue nil
575
-
576
- # Does TravisCI prohibit process renaming?
577
- # This test will be passed in such environment
578
- pend unless process_naming_enabled
579
-
580
- m = Mutex.new
581
- pids = []
582
- proc_lines = []
583
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
584
- ran = false
585
- @d.child_process_execute(:t14, "/bin/sh", arguments:['-c', 'sleep 10; echo "hello"'], subprocess_name: "sleeeeeeeeeper", mode: [:read]) do |readio|
586
- m.lock
587
- ran = true
588
- pids << @d.child_process_id
589
- proc_lines += IO.popen(["ps", "opid,cmd"]){|_io| _io.readlines }
590
- m.unlock
591
- readio.read
592
- end
593
- sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until m.locked? || ran
594
- m.lock
595
- pid = pids.first
596
- # 16357 sleeeeeeeeeper -e sleep 10; puts "hello"
597
- assert{ proc_lines.find{|line| line =~ /^\s*#{pid}\s/ }.strip.split(/\s+/)[1] == "sleeeeeeeeeper" }
598
- @d.stop; @d.shutdown; @d.close; @d.terminate
599
- end
600
- end
601
- end
602
-
603
- test 'can set ENV variables' do
604
- m = Mutex.new
605
- str = nil
606
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
607
- ran = false
608
- args = ['-e', 'puts ENV["testing_child_process"]']
609
- @d.child_process_execute(:t15a, "ruby", arguments: args, mode: [:read], env: {'testing_child_process' => 'Yes! True!'}) do |io|
610
- m.lock
611
- ran = true
612
- str = io.read
613
- m.unlock
614
- end
615
- sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until m.locked? || ran
616
- m.lock
617
- expected = "Yes! True!\n"
618
- assert_equal expected, str
619
- @d.stop; @d.shutdown; @d.close; @d.terminate
620
- end
621
- end
622
-
623
- test 'can unset ENV variables of Fluentd process' do
624
- m = Mutex.new
625
- str = nil
626
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
627
- current_env_path = ENV['PATH']
628
- ran = false
629
- args = ['-e', 'puts ENV["testing_child_process1"].to_s + ENV["testing_child_process2"].to_s']
630
- ENV['testing_child_process1'] = "No! False!"
631
- @d.child_process_execute(:t15b, "ruby", arguments: args, mode: [:read], unsetenv: true, env: {'testing_child_process2' => 'Yes! True!', 'PATH' => current_env_path}) do |io|
632
- m.lock
633
- ran = true
634
- str = io.read
635
- m.unlock
636
- end
637
- sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until m.locked? || ran
638
- m.lock
639
- expected = "Yes! True!\n"
640
- assert_equal expected, str
641
- @d.stop; @d.shutdown; @d.close; @d.terminate
642
- end
643
- end
644
-
645
- unless Fluent.windows?
646
- test 'can change working directory' do
647
- # check my real /tmp directory (for mac)
648
- cmd = ['ruby', '-e', 'Dir.chdir("/tmp"); puts Dir.pwd']
649
- mytmpdir = IO.popen(cmd){|io| io.read.chomp }
650
-
651
- m = Mutex.new
652
- str = nil
653
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
654
- ran = false
655
- args = ['-e', 'puts Dir.pwd']
656
- @d.child_process_execute(:t16, "ruby", arguments: args, mode: [:read], chdir: "/tmp") do |io|
657
- m.lock
658
- ran = true
659
- str = io.read.chomp
660
- m.unlock
661
- end
662
- sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until m.locked? || ran
663
- m.lock
664
- assert_equal mytmpdir, str
665
- @d.stop; @d.shutdown; @d.close; @d.terminate
666
- end
667
- end
668
- end
669
-
670
- sub_test_case 'on_exit_callback is specified' do
671
- setup do
672
- @temp = Tempfile.create("child_process_wait_with_on_exit_callback")
673
- @temp_path = @temp.path
674
- @temp.close
675
- end
676
-
677
- teardown do
678
- File.unlink @temp_path if File.exist?(@temp_path)
679
- end
680
-
681
- test 'can return exit status for child process successfully exits using on_exit_callback' do
682
- assert File.exist?(@temp_path)
683
-
684
- block_exits = false
685
- callback_called = false
686
- exit_status = nil
687
- args = ['-e', 'puts "yay"; File.unlink ARGV[0]', @temp_path]
688
- cb = ->(status){ exit_status = status; callback_called = true }
689
-
690
- str = nil
691
- pid = nil
692
- @d.child_process_execute(:st1, "ruby", arguments: args, mode: [:read], on_exit_callback: cb) do |readio|
693
- assert !callback_called # ensure yet to be called
694
- pid = @d.instance_eval { child_process_id }
695
- str = readio.read.chomp
696
- block_exits = true
697
- end
698
- waiting(TEST_DEADLOCK_TIMEOUT){ sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING while @d.child_process_exist?(pid) } # to get exit status
699
- waiting(TEST_DEADLOCK_TIMEOUT){ sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until block_exits }
700
- waiting(TEST_DEADLOCK_TIMEOUT){ sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until callback_called }
701
-
702
- assert callback_called
703
- assert exit_status
704
- assert_equal 0, exit_status.exitstatus
705
- assert !File.exist?(@temp_path)
706
-
707
- assert_equal "yay", str
708
- end
709
-
710
- test 'can return exit status with signal code for child process killed by signal using on_exit_callback' do
711
- omit "SIGQUIT is unsupported on Windows" if Fluent.windows?
712
-
713
- assert File.exist?(@temp_path)
714
-
715
- block_exits = false
716
- callback_called = false
717
- exit_status = nil
718
- args = ['-e', 'sleep ARGV[0].to_i; puts "yay"; File.unlink ARGV[1]', '100', @temp_path]
719
- cb = ->(status){ exit_status = status; callback_called = true }
720
-
721
- str = nil
722
- pid = nil
723
- @d.child_process_execute(:st1, "ruby", arguments: args, mode: [:read], on_exit_callback: cb) do |readio|
724
- pid = @d.instance_eval { child_process_id }
725
- sleep 1
726
- Process.kill(:QUIT, pid)
727
- str = readio.read.chomp rescue nil # empty string before EOF
728
- block_exits = true
729
- end
730
- waiting(TEST_DEADLOCK_TIMEOUT){ sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING while @d.child_process_exist?(pid) } # to get exit status
731
- waiting(TEST_DEADLOCK_TIMEOUT){ sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until block_exits }
732
- waiting(TEST_DEADLOCK_TIMEOUT){ sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until callback_called }
733
-
734
- assert callback_called
735
- assert exit_status
736
-
737
- assert_equal nil, exit_status.exitstatus
738
- assert_equal 3, exit_status.termsig
739
- assert File.exist?(@temp_path)
740
- assert_equal '', str
741
- end
742
-
743
- test 'calls on_exit_callback for each process exits for interval call using on_exit_callback' do
744
- read_data_list = []
745
- exit_status_list = []
746
-
747
- args = ['yay']
748
- cb = ->(status){ exit_status_list << status }
749
-
750
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
751
- @d.child_process_execute(:st1, "echo", arguments: args, immediate: true, interval: 1, mode: [:read], on_exit_callback: cb) do |readio|
752
- read_data_list << readio.read.chomp
753
- end
754
- sleep 2.5
755
- end
756
-
757
- assert { read_data_list.size >= 2 }
758
- assert { exit_status_list.size >= 2 }
759
- end
760
-
761
- test 'waits lasting child process until wait_timeout if block is not specified' do
762
- assert File.exist?(@temp_path)
763
-
764
- callback_called = false
765
- exit_status = nil
766
- args = ['-e', 'File.unlink ARGV[0]', @temp_path]
767
- cb = ->(status){ exit_status = status; callback_called = true }
768
-
769
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
770
- @d.child_process_execute(:t17, "ruby", arguments: args, on_exit_callback: cb, wait_timeout: 2)
771
- sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until callback_called
772
- end
773
-
774
- assert callback_called
775
- assert exit_status
776
- assert_equal 0, exit_status.exitstatus
777
- assert !File.exist?(@temp_path)
778
- end
779
-
780
- test 'waits lasting child process until wait_timeout after block rans if block is specified' do
781
- assert File.exist?(@temp_path)
782
-
783
- callback_called = false
784
- exit_status = nil
785
- args = ['-e', 'File.unlink ARGV[0]', @temp_path]
786
- cb = ->(status){ exit_status = status; callback_called = true }
787
-
788
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
789
- @d.child_process_execute(:t17, "ruby", arguments: args, mode: nil, on_exit_callback: cb, wait_timeout: 10) do
790
- sleep 1
791
- end
792
- sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until callback_called
793
- end
794
-
795
- assert callback_called
796
- assert exit_status
797
- assert_equal 0, exit_status.exitstatus
798
- assert !File.exist?(@temp_path)
799
- end
800
-
801
- test 'kills lasting child process after wait_timeout if block is not specified' do
802
- assert File.exist?(@temp_path)
803
-
804
- callback_called = false
805
- exit_status = nil
806
- args = ['-e', 'sleep ARGV[0].to_i; File.unlink ARGV[1]', '20', @temp_path]
807
- cb = ->(status){ exit_status = status; callback_called = true }
808
-
809
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
810
- @d.child_process_execute(:t17, "ruby", arguments: args, on_exit_callback: cb, wait_timeout: 1)
811
- sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until callback_called
812
- end
813
-
814
- assert callback_called
815
- assert exit_status
816
- unless Fluent.windows? # On Windows, exitstatus is always 0 and termsig is nil
817
- assert_nil exit_status.exitstatus
818
- assert_equal 9, exit_status.termsig # SIGKILL
819
- end
820
- assert File.exist?(@temp_path)
821
- end
822
-
823
- test 'kills lasting child process after block ran and wait_timeout expires if block is specified' do
824
- assert File.exist?(@temp_path)
825
-
826
- callback_called = false
827
- exit_status = nil
828
- args = ['-e', 'sleep ARGV[0].to_i; File.unlink ARGV[1]', '20', @temp_path]
829
- cb = ->(status){ exit_status = status; callback_called = true }
830
-
831
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
832
- @d.child_process_execute(:t17, "ruby", arguments: args, mode: nil, on_exit_callback: cb, wait_timeout: 1) do
833
- sleep 1
834
- end
835
- sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until callback_called
836
- end
837
-
838
- assert callback_called
839
- assert exit_status
840
- unless Fluent.windows? # On Windows, exitstatus is always 0 and termsig is nil
841
- assert_nil exit_status.exitstatus
842
- assert_equal 9, exit_status.termsig # SIGKILL
843
- end
844
- assert File.exist?(@temp_path)
845
- end
846
-
847
- test 'execute child process writing data to stdout which is unread' do
848
- callback_called = false
849
- exit_status = nil
850
- prog = "echo writing to stdout"
851
- callback = ->(status){ exit_status = status; callback_called = true }
852
- Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
853
- @d.child_process_execute(:out_exec_process, prog, stderr: :connect, immediate: true, parallel: true, mode: [], wait_timeout: 1, on_exit_callback: callback)
854
- sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until callback_called
855
- end
856
- assert callback_called
857
- assert exit_status
858
- assert exit_status.success?
859
- assert_equal 0, exit_status.exitstatus
860
- end
861
- end
862
- end