fluent-plugin-gcloud-pubsub-custom-subscriber 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,226 @@
1
+ # coding: utf-8
2
+ require_relative "../test_helper"
3
+ require "fluent/test/driver/output"
4
+ require "fluent/test/helpers"
5
+
6
+ class GcloudPubSubOutputTest < Test::Unit::TestCase
7
+ include Fluent::Test::Helpers
8
+
9
+ CONFIG = %[
10
+ project project-test
11
+ topic topic-test
12
+ key key-test
13
+ ]
14
+
15
+ ReRaisedError = Class.new(RuntimeError)
16
+
17
+ def create_driver(conf = CONFIG)
18
+ Fluent::Test::Driver::Output.new(Fluent::Plugin::GcloudPubSubOutput).configure(conf)
19
+ end
20
+
21
+ setup do
22
+ Fluent::Test.setup
23
+ end
24
+
25
+ setup do
26
+ @time = event_time('2016-07-09 11:12:13 UTC')
27
+ end
28
+
29
+ sub_test_case 'configure' do
30
+ test 'default values are configured' do
31
+ d = create_driver(%[
32
+ project project-test
33
+ topic topic-test
34
+ key key-test
35
+ ])
36
+
37
+ assert_equal('project-test', d.instance.project)
38
+ assert_equal('topic-test', d.instance.topic)
39
+ assert_equal('key-test', d.instance.key)
40
+ assert_equal(false, d.instance.autocreate_topic)
41
+ assert_equal(1000, d.instance.max_messages)
42
+ assert_equal(9800000, d.instance.max_total_size)
43
+ assert_equal(4000000, d.instance.max_message_size)
44
+ end
45
+
46
+ test '"topic" must be specified' do
47
+ assert_raises Fluent::ConfigError do
48
+ create_driver(%[
49
+ project project-test
50
+ key key-test
51
+ ])
52
+ end
53
+ end
54
+
55
+ test '"autocreate_topic" can be specified' do
56
+ d = create_driver(%[
57
+ project project-test
58
+ topic topic-test
59
+ key key-test
60
+ autocreate_topic true
61
+ ])
62
+
63
+ assert_equal(true, d.instance.autocreate_topic)
64
+ end
65
+ end
66
+
67
+ sub_test_case 'topic' do
68
+ setup do
69
+ @publisher = mock!
70
+ @pubsub_mock = mock!
71
+ stub(Google::Cloud::Pubsub).new { @pubsub_mock }
72
+ end
73
+
74
+ test '"autocreate_topic" is enabled' do
75
+ d = create_driver(%[
76
+ project project-test
77
+ topic topic-test
78
+ key key-test
79
+ autocreate_topic true
80
+ ])
81
+
82
+ @publisher.publish.once
83
+ @pubsub_mock.topic("topic-test").once { nil }
84
+ @pubsub_mock.create_topic("topic-test").once { @publisher }
85
+ d.run(default_tag: "test") do
86
+ d.feed(@time, {"a" => "b"})
87
+ end
88
+ end
89
+
90
+ test '40x error occurred on connecting to Pub/Sub' do
91
+ d = create_driver
92
+
93
+ @pubsub_mock.topic('topic-test').once do
94
+ raise Google::Cloud::NotFoundError.new('TEST')
95
+ end
96
+
97
+ assert_raise Google::Cloud::NotFoundError do
98
+ d.run(default_tag: "test") do
99
+ d.feed(@time, {"a" => "b"})
100
+ end
101
+ end
102
+ end
103
+
104
+ test '50x error occurred on connecting to Pub/Sub' do
105
+ d = create_driver
106
+
107
+ @pubsub_mock.topic('topic-test').once do
108
+ raise Google::Cloud::UnavailableError.new('TEST')
109
+ end
110
+
111
+ assert_raise Fluent::GcloudPubSub::RetryableError do
112
+ d.run(default_tag: "test") do
113
+ d.feed(@time, {"a" => "b"})
114
+ end
115
+ end
116
+ end
117
+
118
+ test 'topic is nil' do
119
+ d = create_driver
120
+
121
+ @pubsub_mock.topic('topic-test').once { nil }
122
+
123
+ assert_raise Fluent::GcloudPubSub::Error do
124
+ d.run(default_tag: "test") do
125
+ d.feed(@time, {"a" => "b"})
126
+ end
127
+ end
128
+ end
129
+
130
+ test 'messages exceeding "max_message_size" are not published' do
131
+ d = create_driver(%[
132
+ project project-test
133
+ topic topic-test
134
+ key key-test
135
+ max_message_size 1000
136
+ ])
137
+
138
+ @publisher.publish.times(0)
139
+ d.run(default_tag: "test") do
140
+ d.feed(@time, {"a" => "a" * 1000})
141
+ end
142
+ end
143
+ end
144
+
145
+ sub_test_case 'publish' do
146
+ setup do
147
+ @publisher = mock!
148
+ @pubsub_mock = mock!.topic(anything) { @publisher }
149
+ stub(Google::Cloud::Pubsub).new { @pubsub_mock }
150
+ end
151
+
152
+ test 'messages are divided into "max_messages"' do
153
+ d = create_driver
154
+ @publisher.publish.times(2)
155
+ d.run(default_tag: "test") do
156
+ # max_messages is default 1000
157
+ 1001.times do |i|
158
+ d.feed(@time, {"a" => i})
159
+ end
160
+ end
161
+ end
162
+
163
+ test 'messages are divided into "max_total_size"' do
164
+ d = create_driver(%[
165
+ project project-test
166
+ topic topic-test
167
+ key key-test
168
+ max_messages 100000
169
+ max_total_size 1000
170
+ ])
171
+
172
+ @publisher.publish.times(2)
173
+ d.run(default_tag: "test") do
174
+ # 400 * 4 / max_total_size = twice
175
+ 4.times do
176
+ d.feed(@time, {"a" => "a" * 400})
177
+ end
178
+ end
179
+ end
180
+
181
+ test 'accept "ASCII-8BIT" encoded multibyte strings' do
182
+ # on fluentd v0.14, all strings treated as "ASCII-8BIT" except specified encoding.
183
+ d = create_driver
184
+ @publisher.publish.once
185
+ d.run(default_tag: "test") do
186
+ d.feed(@time, {"a" => "あああ".force_encoding("ASCII-8BIT")})
187
+ end
188
+ end
189
+
190
+ test 'reraise unexpected errors' do
191
+ d = create_driver
192
+ @publisher.publish.once { raise ReRaisedError }
193
+ assert_raises ReRaisedError do
194
+ d.run(default_tag: "test") do
195
+ d.feed([{'a' => 1, 'b' => 2}])
196
+ end
197
+ end
198
+ end
199
+
200
+ test 'reraise RetryableError' do
201
+ d = create_driver
202
+ @publisher.publish.once { raise Google::Cloud::UnavailableError.new('TEST') }
203
+ assert_raises Fluent::GcloudPubSub::RetryableError do
204
+ d.run(default_tag: "test") do
205
+ d.feed([{'a' => 1, 'b' => 2}])
206
+ end
207
+ end
208
+ end
209
+
210
+ test 'inject section' do
211
+ d = create_driver(%[
212
+ project project-test
213
+ topic topic-test
214
+ key key-test
215
+ <inject>
216
+ tag_key tag
217
+ </inject>
218
+ ])
219
+ @publisher.publish.once
220
+ d.run(default_tag: 'test') do
221
+ d.feed({"foo" => "bar"})
222
+ end
223
+ assert_equal({"tag" => 'test', "foo" => "bar"}, JSON.parse(MessagePack.unpack(d.formatted.first)[0]))
224
+ end
225
+ end
226
+ end
@@ -0,0 +1,31 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require "test/unit/rr"
12
+
13
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
15
+
16
+ require 'fluent/test'
17
+ unless ENV.has_key?('VERBOSE')
18
+ nulllogger = Object.new
19
+ nulllogger.instance_eval {|obj|
20
+ def method_missing(method, *args)
21
+ # pass
22
+ end
23
+ }
24
+ $log = nulllogger
25
+ end
26
+
27
+ require 'fluent/plugin/in_gcloud_pubsub'
28
+ require 'fluent/plugin/out_gcloud_pubsub'
29
+
30
+ class Test::Unit::TestCase
31
+ end
metadata ADDED
@@ -0,0 +1,148 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-gcloud-pubsub-custom-subscriber
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.3.1
5
+ platform: ruby
6
+ authors:
7
+ - BL-Logging-Engineer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-10-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: fluentd
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.14.15
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '2'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 0.14.15
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '2'
33
+ - !ruby/object:Gem::Dependency
34
+ name: google-cloud-pubsub
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: 0.30.0
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: 0.30.0
47
+ - !ruby/object:Gem::Dependency
48
+ name: bundler
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: rake
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: test-unit
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: test-unit-rr
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ description: Google Cloud Pub/Sub input/output plugin for Fluentd event collector
104
+ without auto-create topic requiring only Pub/Sub subscriber ACL
105
+ email:
106
+ executables: []
107
+ extensions: []
108
+ extra_rdoc_files: []
109
+ files:
110
+ - ".gitignore"
111
+ - ".travis.yml"
112
+ - CHANGELOG.md
113
+ - Gemfile
114
+ - LICENSE
115
+ - README.md
116
+ - Rakefile
117
+ - fluent-plugin-gcloud-pubsub-custom.gemspec
118
+ - lib/fluent/plugin/gcloud_pubsub/client.rb
119
+ - lib/fluent/plugin/in_gcloud_pubsub.rb
120
+ - lib/fluent/plugin/out_gcloud_pubsub.rb
121
+ - test/plugin/test_in_gcloud_pubsub.rb
122
+ - test/plugin/test_out_gcloud_pubsub.rb
123
+ - test/test_helper.rb
124
+ homepage:
125
+ licenses:
126
+ - MIT
127
+ metadata: {}
128
+ post_install_message:
129
+ rdoc_options: []
130
+ require_paths:
131
+ - lib
132
+ required_ruby_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ required_rubygems_version: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ requirements: []
143
+ rubygems_version: 3.0.6
144
+ signing_key:
145
+ specification_version: 4
146
+ summary: Google Cloud Pub/Sub input/output plugin for Fluentd event collector without
147
+ auto-create topic requiring only Pub/Sub subscriber ACL
148
+ test_files: []