logstash-output-google_cloud_storage 4.0.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +77 -0
  3. data/CONTRIBUTORS +18 -0
  4. data/Gemfile +11 -0
  5. data/LICENSE +13 -0
  6. data/NOTICE.TXT +5 -0
  7. data/README.md +100 -0
  8. data/docs/index.asciidoc +305 -0
  9. data/lib/logstash-output-google_cloud_storage_jars.rb +35 -0
  10. data/lib/logstash/outputs/gcs/client.rb +88 -0
  11. data/lib/logstash/outputs/gcs/log_rotate.rb +77 -0
  12. data/lib/logstash/outputs/gcs/path_factory.rb +119 -0
  13. data/lib/logstash/outputs/gcs/temp_log_file.rb +111 -0
  14. data/lib/logstash/outputs/gcs/worker_pool.rb +47 -0
  15. data/lib/logstash/outputs/google_cloud_storage.rb +276 -0
  16. data/logstash-output-google_cloud_storage.gemspec +33 -0
  17. data/spec/fixtures/credentials.json +8 -0
  18. data/spec/outputs/gcs/client_spec.rb +18 -0
  19. data/spec/outputs/gcs/log_rotate_spec.rb +129 -0
  20. data/spec/outputs/gcs/path_factory_spec.rb +189 -0
  21. data/spec/outputs/gcs/temp_log_file_spec.rb +155 -0
  22. data/spec/outputs/gcs/worker_pool_spec.rb +29 -0
  23. data/spec/outputs/google_cloud_storage_spec.rb +23 -0
  24. data/spec/spec_helper.rb +3 -0
  25. data/vendor/jar-dependencies/com/fasterxml/jackson/core/jackson-core/2.9.6/jackson-core-2.9.6.jar +0 -0
  26. data/vendor/jar-dependencies/com/google/api-client/google-api-client/1.23.0/google-api-client-1.23.0.jar +0 -0
  27. data/vendor/jar-dependencies/com/google/api-client/google-api-client/1.24.1/google-api-client-1.24.1.jar +0 -0
  28. data/vendor/jar-dependencies/com/google/api-client/google-api-client/1.27.0/google-api-client-1.27.0.jar +0 -0
  29. data/vendor/jar-dependencies/com/google/api/api-common/1.5.0/api-common-1.5.0.jar +0 -0
  30. data/vendor/jar-dependencies/com/google/api/api-common/1.7.0/api-common-1.7.0.jar +0 -0
  31. data/vendor/jar-dependencies/com/google/api/gax-httpjson/0.40.0/gax-httpjson-0.40.0.jar +0 -0
  32. data/vendor/jar-dependencies/com/google/api/gax-httpjson/0.47.0/gax-httpjson-0.47.0.jar +0 -0
  33. data/vendor/jar-dependencies/com/google/api/gax-httpjson/0.59.0/gax-httpjson-0.59.0.jar +0 -0
  34. data/vendor/jar-dependencies/com/google/api/gax/1.23.0/gax-1.23.0.jar +0 -0
  35. data/vendor/jar-dependencies/com/google/api/gax/1.30.0/gax-1.30.0.jar +0 -0
  36. data/vendor/jar-dependencies/com/google/api/gax/1.42.0/gax-1.42.0.jar +0 -0
  37. data/vendor/jar-dependencies/com/google/api/grpc/proto-google-common-protos/1.12.0/proto-google-common-protos-1.12.0.jar +0 -0
  38. data/vendor/jar-dependencies/com/google/api/grpc/proto-google-common-protos/1.14.0/proto-google-common-protos-1.14.0.jar +0 -0
  39. data/vendor/jar-dependencies/com/google/api/grpc/proto-google-common-protos/1.7.0/proto-google-common-protos-1.7.0.jar +0 -0
  40. data/vendor/jar-dependencies/com/google/api/grpc/proto-google-iam-v1/0.12.0/proto-google-iam-v1-0.12.0.jar +0 -0
  41. data/vendor/jar-dependencies/com/google/api/grpc/proto-google-iam-v1/0.8.0/proto-google-iam-v1-0.8.0.jar +0 -0
  42. data/vendor/jar-dependencies/com/google/apis/google-api-services-storage/v1-rev114-1.23.0/google-api-services-storage-v1-rev114-1.23.0.jar +0 -0
  43. data/vendor/jar-dependencies/com/google/apis/google-api-services-storage/v1-rev135-1.24.1/google-api-services-storage-v1-rev135-1.24.1.jar +0 -0
  44. data/vendor/jar-dependencies/com/google/apis/google-api-services-storage/v1-rev20181109-1.27.0/google-api-services-storage-v1-rev20181109-1.27.0.jar +0 -0
  45. data/vendor/jar-dependencies/com/google/auth/google-auth-library-credentials/0.10.0/google-auth-library-credentials-0.10.0.jar +0 -0
  46. data/vendor/jar-dependencies/com/google/auth/google-auth-library-credentials/0.13.0/google-auth-library-credentials-0.13.0.jar +0 -0
  47. data/vendor/jar-dependencies/com/google/auth/google-auth-library-credentials/0.9.0/google-auth-library-credentials-0.9.0.jar +0 -0
  48. data/vendor/jar-dependencies/com/google/auth/google-auth-library-oauth2-http/0.10.0/google-auth-library-oauth2-http-0.10.0.jar +0 -0
  49. data/vendor/jar-dependencies/com/google/auth/google-auth-library-oauth2-http/0.13.0/google-auth-library-oauth2-http-0.13.0.jar +0 -0
  50. data/vendor/jar-dependencies/com/google/auth/google-auth-library-oauth2-http/0.9.0/google-auth-library-oauth2-http-0.9.0.jar +0 -0
  51. data/vendor/jar-dependencies/com/google/cloud/google-cloud-core-http/1.25.0/google-cloud-core-http-1.25.0.jar +0 -0
  52. data/vendor/jar-dependencies/com/google/cloud/google-cloud-core-http/1.39.0/google-cloud-core-http-1.39.0.jar +0 -0
  53. data/vendor/jar-dependencies/com/google/cloud/google-cloud-core-http/1.65.0/google-cloud-core-http-1.65.0.jar +0 -0
  54. data/vendor/jar-dependencies/com/google/cloud/google-cloud-core/1.25.0/google-cloud-core-1.25.0.jar +0 -0
  55. data/vendor/jar-dependencies/com/google/cloud/google-cloud-core/1.39.0/google-cloud-core-1.39.0.jar +0 -0
  56. data/vendor/jar-dependencies/com/google/cloud/google-cloud-core/1.65.0/google-cloud-core-1.65.0.jar +0 -0
  57. data/vendor/jar-dependencies/com/google/cloud/google-cloud-storage/1.25.0/google-cloud-storage-1.25.0.jar +0 -0
  58. data/vendor/jar-dependencies/com/google/cloud/google-cloud-storage/1.39.0/google-cloud-storage-1.39.0.jar +0 -0
  59. data/vendor/jar-dependencies/com/google/cloud/google-cloud-storage/1.65.0/google-cloud-storage-1.65.0.jar +0 -0
  60. data/vendor/jar-dependencies/com/google/code/findbugs/jsr305/3.0.1/jsr305-3.0.1.jar +0 -0
  61. data/vendor/jar-dependencies/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar +0 -0
  62. data/vendor/jar-dependencies/com/google/code/gson/gson/2.7/gson-2.7.jar +0 -0
  63. data/vendor/jar-dependencies/com/google/errorprone/error_prone_annotations/2.1.3/error_prone_annotations-2.1.3.jar +0 -0
  64. data/vendor/jar-dependencies/com/google/errorprone/error_prone_annotations/2.2.0/error_prone_annotations-2.2.0.jar +0 -0
  65. data/vendor/jar-dependencies/com/google/guava/guava-jdk5/17.0/guava-jdk5-17.0.jar +0 -0
  66. data/vendor/jar-dependencies/com/google/guava/guava/20.0/guava-20.0.jar +0 -0
  67. data/vendor/jar-dependencies/com/google/guava/guava/26.0-android/guava-26.0-android.jar +0 -0
  68. data/vendor/jar-dependencies/com/google/http-client/google-http-client-apache/2.0.0/google-http-client-apache-2.0.0.jar +0 -0
  69. data/vendor/jar-dependencies/com/google/http-client/google-http-client-appengine/1.23.0/google-http-client-appengine-1.23.0.jar +0 -0
  70. data/vendor/jar-dependencies/com/google/http-client/google-http-client-appengine/1.24.1/google-http-client-appengine-1.24.1.jar +0 -0
  71. data/vendor/jar-dependencies/com/google/http-client/google-http-client-appengine/1.28.0/google-http-client-appengine-1.28.0.jar +0 -0
  72. data/vendor/jar-dependencies/com/google/http-client/google-http-client-jackson/1.23.0/google-http-client-jackson-1.23.0.jar +0 -0
  73. data/vendor/jar-dependencies/com/google/http-client/google-http-client-jackson/1.24.1/google-http-client-jackson-1.24.1.jar +0 -0
  74. data/vendor/jar-dependencies/com/google/http-client/google-http-client-jackson2/1.23.0/google-http-client-jackson2-1.23.0.jar +0 -0
  75. data/vendor/jar-dependencies/com/google/http-client/google-http-client-jackson2/1.24.1/google-http-client-jackson2-1.24.1.jar +0 -0
  76. data/vendor/jar-dependencies/com/google/http-client/google-http-client-jackson2/1.28.0/google-http-client-jackson2-1.28.0.jar +0 -0
  77. data/vendor/jar-dependencies/com/google/http-client/google-http-client/1.23.0/google-http-client-1.23.0.jar +0 -0
  78. data/vendor/jar-dependencies/com/google/http-client/google-http-client/1.24.1/google-http-client-1.24.1.jar +0 -0
  79. data/vendor/jar-dependencies/com/google/http-client/google-http-client/1.28.0/google-http-client-1.28.0.jar +0 -0
  80. data/vendor/jar-dependencies/com/google/j2objc/j2objc-annotations/1.1/j2objc-annotations-1.1.jar +0 -0
  81. data/vendor/jar-dependencies/com/google/oauth-client/google-oauth-client/1.23.0/google-oauth-client-1.23.0.jar +0 -0
  82. data/vendor/jar-dependencies/com/google/oauth-client/google-oauth-client/1.24.1/google-oauth-client-1.24.1.jar +0 -0
  83. data/vendor/jar-dependencies/com/google/oauth-client/google-oauth-client/1.27.0/google-oauth-client-1.27.0.jar +0 -0
  84. data/vendor/jar-dependencies/com/google/protobuf/protobuf-java-util/3.5.1/protobuf-java-util-3.5.1.jar +0 -0
  85. data/vendor/jar-dependencies/com/google/protobuf/protobuf-java-util/3.6.0/protobuf-java-util-3.6.0.jar +0 -0
  86. data/vendor/jar-dependencies/com/google/protobuf/protobuf-java/3.5.1/protobuf-java-3.5.1.jar +0 -0
  87. data/vendor/jar-dependencies/com/google/protobuf/protobuf-java/3.6.0/protobuf-java-3.6.0.jar +0 -0
  88. data/vendor/jar-dependencies/commons-codec/commons-codec/1.3/commons-codec-1.3.jar +0 -0
  89. data/vendor/jar-dependencies/commons-codec/commons-codec/1.9/commons-codec-1.9.jar +0 -0
  90. data/vendor/jar-dependencies/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar +0 -0
  91. data/vendor/jar-dependencies/commons-logging/commons-logging/1.2/commons-logging-1.2.jar +0 -0
  92. data/vendor/jar-dependencies/io/grpc/grpc-context/1.12.0/grpc-context-1.12.0.jar +0 -0
  93. data/vendor/jar-dependencies/io/grpc/grpc-context/1.9.0/grpc-context-1.9.0.jar +0 -0
  94. data/vendor/jar-dependencies/io/opencensus/opencensus-api/0.11.1/opencensus-api-0.11.1.jar +0 -0
  95. data/vendor/jar-dependencies/io/opencensus/opencensus-api/0.15.0/opencensus-api-0.15.0.jar +0 -0
  96. data/vendor/jar-dependencies/io/opencensus/opencensus-contrib-http-util/0.11.1/opencensus-contrib-http-util-0.11.1.jar +0 -0
  97. data/vendor/jar-dependencies/io/opencensus/opencensus-contrib-http-util/0.15.0/opencensus-contrib-http-util-0.15.0.jar +0 -0
  98. data/vendor/jar-dependencies/joda-time/joda-time/2.9.2/joda-time-2.9.2.jar +0 -0
  99. data/vendor/jar-dependencies/org/apache/httpcomponents/httpclient/4.0.1/httpclient-4.0.1.jar +0 -0
  100. data/vendor/jar-dependencies/org/apache/httpcomponents/httpclient/4.5.3/httpclient-4.5.3.jar +0 -0
  101. data/vendor/jar-dependencies/org/apache/httpcomponents/httpcore/4.0.1/httpcore-4.0.1.jar +0 -0
  102. data/vendor/jar-dependencies/org/apache/httpcomponents/httpcore/4.4.6/httpcore-4.4.6.jar +0 -0
  103. data/vendor/jar-dependencies/org/codehaus/jackson/jackson-core-asl/1.9.11/jackson-core-asl-1.9.11.jar +0 -0
  104. data/vendor/jar-dependencies/org/threeten/threetenbp/1.3.3/threetenbp-1.3.3.jar +0 -0
  105. metadata +249 -0
@@ -0,0 +1,189 @@
1
+ # encoding: utf-8
2
+ require 'logstash/outputs/gcs/path_factory'
3
+
4
+ describe LogStash::Outputs::Gcs::PathFactory do
5
+ describe '#initialize' do
6
+ it 'includes optional fields if requested' do
7
+ pf = LogStash::Outputs::Gcs::PathFactoryBuilder.build do |builder|
8
+ builder.set_directory 'path/to/directory'
9
+ builder.set_prefix 'prefix'
10
+ builder.set_include_host true
11
+ builder.set_date_pattern ''
12
+ builder.set_include_part true
13
+ builder.set_include_uuid true
14
+ builder.set_is_gzipped true
15
+ end
16
+
17
+ vars = {
18
+ prefix: 'prefix',
19
+ host: 'hostname',
20
+ date: '2018-01-01',
21
+ uuid: '00000000-0000-0000-0000-000000000000',
22
+ partf: '333'
23
+ }
24
+
25
+ expected = 'prefix_hostname_2018-01-01.part333.00000000-0000-0000-0000-000000000000.log.gz'
26
+ expected = File.join('path/to/directory', expected)
27
+
28
+ actual = pf.current_path(vars)
29
+
30
+ expect(actual).to eq(expected)
31
+ end
32
+
33
+ it 'excludes optional fields if not requested' do
34
+ pf = LogStash::Outputs::Gcs::PathFactoryBuilder.build do |builder|
35
+ builder.set_directory 'path/to/directory'
36
+ builder.set_prefix 'prefix'
37
+ builder.set_include_host false
38
+ builder.set_date_pattern ''
39
+ builder.set_include_part false
40
+ builder.set_include_uuid false
41
+ builder.set_is_gzipped false
42
+ end
43
+
44
+ vars = {
45
+ prefix: 'prefix',
46
+ host: 'hostname',
47
+ date: '2018-01-01',
48
+ uuid: '00000000-0000-0000-0000-000000000000',
49
+ partf: '333'
50
+ }
51
+
52
+ expected = 'prefix_2018-01-01.log'
53
+ expected = File.join('path/to/directory', expected)
54
+
55
+ actual = pf.current_path(vars)
56
+
57
+ expect(actual).to eq(expected)
58
+ end
59
+
60
+ it 'loads a path immediately' do
61
+ pf = LogStash::Outputs::Gcs::PathFactoryBuilder.build do |builder|
62
+ builder.set_directory ''
63
+ builder.set_prefix ''
64
+ builder.set_include_host false
65
+ builder.set_date_pattern ''
66
+ builder.set_include_part false
67
+ builder.set_include_uuid false
68
+ builder.set_is_gzipped false
69
+ end
70
+
71
+ expect(pf.current_path).to_not eq(nil)
72
+ end
73
+
74
+ it 'recovers the starting part number' do
75
+ contents = ['pre_date.part009.log.gz', 'pre_date.part091.log.gz', 'pre_date.part000.log.gz']
76
+
77
+ allow(::File).to receive(:directory?).with('dir').and_return(true)
78
+ allow(Dir).to receive(:glob).and_return(contents)
79
+
80
+ pf = LogStash::Outputs::Gcs::PathFactoryBuilder.build do |builder|
81
+ builder.set_directory 'dir'
82
+ builder.set_prefix 'pre'
83
+ builder.set_include_host false
84
+ builder.set_date_pattern 'date'
85
+ builder.set_include_part true
86
+ builder.set_include_uuid false
87
+ builder.set_is_gzipped false
88
+ end
89
+
90
+ expect(pf.current_path).to include('part092')
91
+ end
92
+ end
93
+
94
+ describe 'rotate_path!' do
95
+ it 'increments the part number if the base has not changed' do
96
+ pf = LogStash::Outputs::Gcs::PathFactoryBuilder.build do |builder|
97
+ builder.set_directory 'dir'
98
+ builder.set_prefix 'pre'
99
+ builder.set_include_host false
100
+ builder.set_date_pattern 'date'
101
+ builder.set_include_part true
102
+ builder.set_include_uuid false
103
+ builder.set_is_gzipped false
104
+ end
105
+
106
+ expect(pf.current_path).to eq(File.join('dir', 'pre_date.part000.log'))
107
+
108
+ pf.rotate_path!
109
+ expect(pf.current_path).to eq(File.join('dir', 'pre_date.part001.log'))
110
+ end
111
+
112
+ it 'resets the part number if the base has changed' do
113
+ pf = LogStash::Outputs::Gcs::PathFactoryBuilder.build do |builder|
114
+ builder.set_directory 'dir'
115
+ builder.set_prefix 'pre'
116
+ builder.set_include_host false
117
+ builder.set_date_pattern '%N'
118
+ builder.set_include_part true
119
+ builder.set_include_uuid false
120
+ builder.set_is_gzipped false
121
+ end
122
+ expect(pf.current_path).to include('part000')
123
+
124
+ pf.rotate_path!
125
+ expect(pf.current_path).to include('part000')
126
+ end
127
+
128
+ it 'returns the path being rotated out' do
129
+ pf = LogStash::Outputs::Gcs::PathFactoryBuilder.build do |builder|
130
+ builder.set_directory 'dir'
131
+ builder.set_prefix 'pre'
132
+ builder.set_include_host false
133
+ builder.set_date_pattern 'date'
134
+ builder.set_include_part true
135
+ builder.set_include_uuid false
136
+ builder.set_is_gzipped false
137
+ end
138
+ last = pf.current_path
139
+ after = pf.rotate_path!
140
+ expect(after).to eq(last)
141
+ end
142
+ end
143
+
144
+ describe 'should_rotate?' do
145
+ it 'returns false when the times in the bases are the same' do
146
+ pf = LogStash::Outputs::Gcs::PathFactoryBuilder.build do |builder|
147
+ builder.set_directory ''
148
+ builder.set_prefix ''
149
+ builder.set_include_host false
150
+ builder.set_date_pattern ''
151
+ builder.set_include_part false
152
+ builder.set_include_uuid false
153
+ builder.set_is_gzipped false
154
+ end
155
+ sleep 1.0
156
+ expect(pf.should_rotate?).to eq(false)
157
+ end
158
+
159
+ it 'returns true when the times in the bases are different' do
160
+ pf = LogStash::Outputs::Gcs::PathFactoryBuilder.build do |builder|
161
+ builder.set_directory ''
162
+ builder.set_prefix ''
163
+ builder.set_include_host false
164
+ builder.set_date_pattern '%N'
165
+ builder.set_include_part false
166
+ builder.set_include_uuid false
167
+ builder.set_is_gzipped false
168
+ end
169
+ sleep 1.0
170
+ expect(pf.should_rotate?).to eq(true)
171
+ end
172
+ end
173
+
174
+ describe 'current_path' do
175
+ it 'joins the directory and filename' do
176
+ pf = LogStash::Outputs::Gcs::PathFactoryBuilder.build do |builder|
177
+ builder.set_directory 'dir'
178
+ builder.set_prefix 'pre'
179
+ builder.set_include_host false
180
+ builder.set_date_pattern 'date'
181
+ builder.set_include_part false
182
+ builder.set_include_uuid false
183
+ builder.set_is_gzipped false
184
+ end
185
+
186
+ expect(pf.current_path).to eq(File.join('dir', 'pre_date.log'))
187
+ end
188
+ end
189
+ end
@@ -0,0 +1,155 @@
1
+ # encoding: utf-8
2
+ require 'logstash/outputs/gcs/temp_log_file'
3
+ require 'stud/temporary'
4
+ require 'zlib'
5
+
6
+ shared_examples 'a log file' do
7
+ describe '#initialize' do
8
+ it 'opens a file' do
9
+ expect{subject.fd}.to_not raise_error
10
+ expect(subject.fd).to_not be_nil
11
+ end
12
+
13
+ it 'sets the path' do
14
+ expect{subject.path}.to_not raise_error
15
+ expect(subject.path).to_not be_nil
16
+ end
17
+
18
+ it 'sets last sync' do
19
+ expect{subject.time_since_sync}.to_not raise_error
20
+ end
21
+ end
22
+
23
+ describe '#write' do
24
+ it 'writes the content' do
25
+ expect(subject.fd).to receive(:write).with('foo')
26
+ expect(subject.fd).to receive(:write).with("\n")
27
+
28
+ subject.write('foo', "\n")
29
+ end
30
+
31
+ it 'fails if the file is closed' do
32
+ subject.close!
33
+
34
+ expect{ subject.write('foo') }.to raise_error(IOError)
35
+ end
36
+ end
37
+
38
+ describe '#fsync' do
39
+ it 'fails if the file is closed' do
40
+ subject.close!
41
+
42
+ expect{ subject.fsync }.to raise_error(IOError)
43
+ end
44
+ end
45
+
46
+ describe '#close!' do
47
+ it 'fails if the file is closed' do
48
+ subject.close!
49
+
50
+ expect{ subject.close! }.to raise_error(IOError)
51
+ end
52
+ end
53
+
54
+ describe '#size' do
55
+ it 'gets the size of the file on disk' do
56
+ subject.write('hello, world!')
57
+ subject.fsync
58
+
59
+ expect(subject.size).to eq(File.stat(subject.path).size)
60
+ end
61
+
62
+ it 'does not fail if the file is closed' do
63
+ subject.close!
64
+
65
+ expect{ subject.size }.to_not raise_error
66
+ end
67
+ end
68
+
69
+ describe '#time_since_sync' do
70
+ it 'returns a delta' do
71
+ expect(Time).to receive(:now).and_return(Time.at(30), Time.at(40), Time.at(50))
72
+
73
+ subject.fsync
74
+
75
+ expect(subject.time_since_sync).to eq(10)
76
+ end
77
+ end
78
+ end
79
+
80
+ describe LogStash::Outputs::Gcs::PlainLogFile do
81
+ let(:tempdir) { Stud::Temporary.directory }
82
+ let(:path) { ::File.join(tempdir, 'logfile.log') }
83
+ subject { LogStash::Outputs::Gcs::LogFileFactory.create(path, false, false) }
84
+
85
+ it_behaves_like 'a log file'
86
+
87
+ it 'creates a valid plain text file' do
88
+ subject.write('Hello, world!')
89
+ subject.close!
90
+ data = File.read(path)
91
+
92
+ expect(data).to eq('Hello, world!')
93
+ end
94
+ end
95
+
96
+ describe LogStash::Outputs::Gcs::GzipLogFile do
97
+ let(:tempdir) { Stud::Temporary.directory }
98
+ let(:path) { ::File.join(tempdir, 'logfile.log') }
99
+ subject { LogStash::Outputs::Gcs::LogFileFactory.create(path, true, false) }
100
+
101
+ it_behaves_like 'a log file'
102
+
103
+ it 'creates a valid gzip' do
104
+ subject.write('Hello, world!')
105
+ subject.close!
106
+
107
+ Zlib::GzipReader.open(path) do |gz|
108
+ expect(gz.read).to eq('Hello, world!')
109
+ end
110
+ end
111
+ end
112
+
113
+ describe LogStash::Outputs::Gcs::SynchronizedLogFile do
114
+ let(:tempdir) { Stud::Temporary.directory }
115
+ let(:path) { ::File.join(tempdir, 'logfile.log') }
116
+ subject { LogStash::Outputs::Gcs::LogFileFactory.create(path, false, true) }
117
+
118
+ it_behaves_like 'a log file'
119
+ end
120
+
121
+ describe 'gzip encoded file' do
122
+ let(:tempdir) { Stud::Temporary.directory }
123
+ let(:path) { ::File.join(tempdir, 'logfile.log') }
124
+ subject { LogStash::Outputs::Gcs::LogFileFactory.create(path, false, false, true) }
125
+
126
+ it_behaves_like 'a log file'
127
+
128
+ it 'creates a valid gzip' do
129
+ subject.write('Hello, world!')
130
+ subject.close!
131
+
132
+ Zlib::GzipReader.open(path) do |gz|
133
+ expect(gz.read).to eq('Hello, world!')
134
+ end
135
+ end
136
+ end
137
+
138
+ describe 'double gzip encoded file' do
139
+ let(:tempdir) { Stud::Temporary.directory }
140
+ let(:path) { ::File.join(tempdir, 'logfile.log') }
141
+ subject { LogStash::Outputs::Gcs::LogFileFactory.create(path, true, false, true) }
142
+
143
+ it_behaves_like 'a log file'
144
+
145
+ it 'creates a valid double gzip' do
146
+ subject.write('Hello, world!')
147
+ subject.close!
148
+
149
+ Zlib::GzipReader.open(path) do |outer|
150
+ Zlib::GzipReader.new(outer) do |inner|
151
+ expect(inner.read).to eq('Hello, world!')
152
+ end
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+ require 'logstash/outputs/gcs/worker_pool'
3
+
4
+ describe LogStash::Outputs::Gcs::WorkerPool do
5
+ describe '#post' do
6
+ it 'runs the task in the same thread if synchronous' do
7
+ pool = LogStash::Outputs::Gcs::WorkerPool.new(5, true)
8
+ expect(pool.workers).to_not receive(:post)
9
+
10
+ pool.post { 1 + 2 }
11
+ pool.stop!
12
+ end
13
+
14
+ it 'runs the task in a different thread if asynchronous' do
15
+ pool = LogStash::Outputs::Gcs::WorkerPool.new(5, false)
16
+ expect(pool.workers).to receive(:post)
17
+
18
+ pool.post { 1 + 2 }
19
+ pool.stop!
20
+ end
21
+
22
+ it 'raises an error if the pool is already stopped' do
23
+ pool = LogStash::Outputs::Gcs::WorkerPool.new(5, true)
24
+ pool.stop!
25
+
26
+ expect{ pool.post{} }.to raise_error(RuntimeError)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,23 @@
1
+ # encoding: utf-8
2
+ require_relative "../spec_helper"
3
+ require "tempfile"
4
+
5
+ describe LogStash::Outputs::GoogleCloudStorage do
6
+
7
+ let(:javaclient) { double("google-java-client") }
8
+ let(:javastorage) { double("google-java-client-storage") }
9
+
10
+ subject { described_class.new(config) }
11
+ let(:config) { {"bucket" => "", "uploader_interval_secs" => 0.1, "upload_synchronous" => true} }
12
+
13
+ before(:each) do
14
+ allow(LogStash::Outputs::Gcs::Client).to receive(:new).and_return(:javaclient)
15
+ allow(javaclient).to receive(:initialize_storage).and_return(:javastorage)
16
+ end
17
+
18
+ it "should register without errors" do
19
+ expect { subject.register }.to_not raise_error
20
+
21
+ subject.close
22
+ end
23
+ end
@@ -0,0 +1,3 @@
1
+ # encoding: utf-8
2
+ require "logstash/devutils/rspec/spec_helper"
3
+ require "logstash/outputs/google_cloud_storage"