jls-lumberjack 0.0.22 → 0.0.23
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/lumberjack/client.rb +11 -43
- data/spec/integration_spec.rb +61 -0
- data/spec/lumberjack/client_spec.rb +98 -0
- data/spec/spec_helper.rb +4 -0
- metadata +53 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5ecf8e491d03fcc59fb32625cd5ad69018071f89
|
4
|
+
data.tar.gz: 3fc5d05089e0b192d736fb046854635757bf10e6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4d6cc57fc88054f98a72bf6ccb51bdd2d91b01d6e1ba4232ac7bda25d3cf21acdb07e3940b6c0938ac6f2807f8701404819b30cbe3cfaf9edcd6d7cf919fffe6
|
7
|
+
data.tar.gz: 79946f5b1c4237e14e13a44a9d257635722469f57832a8ced321e45606236279c2b380d57c18ed8d9a18c13fa5306fb044c150a26ff46c74da5dc10d11d1b33b
|
data/lib/lumberjack/client.rb
CHANGED
@@ -80,7 +80,17 @@ module Lumberjack
|
|
80
80
|
private
|
81
81
|
def connection_start(opts)
|
82
82
|
tcp_socket = TCPSocket.new(opts[:address], opts[:port])
|
83
|
-
|
83
|
+
|
84
|
+
certificate = OpenSSL::X509::Certificate.new(File.read(opts[:ssl_certificate]))
|
85
|
+
|
86
|
+
certificate_store = OpenSSL::X509::Store.new
|
87
|
+
certificate_store.add_cert(certificate)
|
88
|
+
|
89
|
+
ssl_context = OpenSSL::SSL::SSLContext.new
|
90
|
+
ssl_context.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
91
|
+
ssl_context.cert_store = certificate_store
|
92
|
+
|
93
|
+
@socket = OpenSSL::SSL::SSLSocket.new(tcp_socket, ssl_context)
|
84
94
|
@socket.connect
|
85
95
|
@socket.syswrite(["1", "W", @window_size].pack("AAN"))
|
86
96
|
end
|
@@ -133,48 +143,6 @@ module Lumberjack
|
|
133
143
|
def read_last_ack
|
134
144
|
@socket.read(4).unpack("N").first
|
135
145
|
end
|
136
|
-
|
137
|
-
private
|
138
|
-
def to_frame(hash, sequence)
|
139
|
-
frame = ["1", "D", sequence]
|
140
|
-
pack = "AAN"
|
141
|
-
keys = deep_keys(hash)
|
142
|
-
frame << keys.length
|
143
|
-
pack << "N"
|
144
|
-
keys.each do |k|
|
145
|
-
val = deep_get(hash,k)
|
146
|
-
key_length = k.bytesize
|
147
|
-
val_length = val.bytesize
|
148
|
-
frame << key_length
|
149
|
-
pack << "N"
|
150
|
-
frame << k
|
151
|
-
pack << "A#{key_length}"
|
152
|
-
frame << val_length
|
153
|
-
pack << "N"
|
154
|
-
frame << val
|
155
|
-
pack << "A#{val_length}"
|
156
|
-
end
|
157
|
-
frame.pack(pack)
|
158
|
-
end
|
159
|
-
|
160
|
-
private
|
161
|
-
def deep_get(hash, key="")
|
162
|
-
return hash if key.nil?
|
163
|
-
deep_get(
|
164
|
-
hash[key.split('.').first],
|
165
|
-
key[key.split('.').first.length+1..key.length]
|
166
|
-
)
|
167
|
-
end
|
168
|
-
|
169
|
-
private
|
170
|
-
def deep_keys(hash, prefix="")
|
171
|
-
keys = []
|
172
|
-
hash.each do |k,v|
|
173
|
-
keys << "#{prefix}#{k}" if v.class == String
|
174
|
-
keys << deep_keys(hash[k], "#{k}.") if v.class == Hash
|
175
|
-
end
|
176
|
-
keys.flatten
|
177
|
-
end
|
178
146
|
end
|
179
147
|
|
180
148
|
module Encoder
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "lumberjack/client"
|
3
|
+
require "lumberjack/server"
|
4
|
+
require "stud/temporary"
|
5
|
+
require "flores/pki"
|
6
|
+
require "fileutils"
|
7
|
+
require "thread"
|
8
|
+
require "spec_helper"
|
9
|
+
|
10
|
+
describe "A client" do
|
11
|
+
let(:certificate) { Flores::PKI.generate }
|
12
|
+
let(:certificate_file_crt) { "certificate.crt" }
|
13
|
+
let(:certificate_file_key) { "certificate.key" }
|
14
|
+
let(:port) { Flores::Random.integer(1024..65335) }
|
15
|
+
let(:host) { "127.0.0.1" }
|
16
|
+
|
17
|
+
before do
|
18
|
+
expect(File).to receive(:read).at_least(1).with(certificate_file_crt) { certificate.first.to_s }
|
19
|
+
expect(File).to receive(:read).at_least(1).with(certificate_file_key) { certificate.last.to_s }
|
20
|
+
|
21
|
+
server = Lumberjack::Server.new(:port => port,
|
22
|
+
:address => host,
|
23
|
+
:ssl_certificate => certificate_file_crt,
|
24
|
+
:ssl_key => certificate_file_key)
|
25
|
+
|
26
|
+
Thread.new do
|
27
|
+
server.run { |data| }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context "with a valid certificate" do
|
32
|
+
it "successfully connect to the server" do
|
33
|
+
expect {
|
34
|
+
Lumberjack::Client.new(:port => port,
|
35
|
+
:host => host,
|
36
|
+
:addresses => host,
|
37
|
+
:ssl_certificate => certificate_file_crt)
|
38
|
+
|
39
|
+
}.not_to raise_error
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context "with an invalid certificate" do
|
44
|
+
let(:invalid_certificate) { Flores::PKI.generate }
|
45
|
+
let(:invalid_certificate_file) { "invalid.crt" }
|
46
|
+
|
47
|
+
before do
|
48
|
+
expect(File).to receive(:read).with(invalid_certificate_file) { invalid_certificate.first.to_s }
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should refuse to connect" do
|
52
|
+
expect {
|
53
|
+
Lumberjack::Client.new(:port => port,
|
54
|
+
:host => host,
|
55
|
+
:addresses => host,
|
56
|
+
:ssl_certificate => invalid_certificate_file)
|
57
|
+
|
58
|
+
}.to raise_error(OpenSSL::SSL::SSLError, /certificate verify failed/)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'lumberjack/client'
|
4
|
+
require 'lumberjack/server'
|
5
|
+
require "socket"
|
6
|
+
require "thread"
|
7
|
+
require "openssl"
|
8
|
+
require "zlib"
|
9
|
+
|
10
|
+
describe "Lumberjack::Client" do
|
11
|
+
|
12
|
+
describe "Lumberjack::Socket" do
|
13
|
+
|
14
|
+
let(:port) { 5000 }
|
15
|
+
|
16
|
+
subject(:socket) { Lumberjack::Socket.new(:port => port, :ssl_certificate => "" ) }
|
17
|
+
|
18
|
+
before do
|
19
|
+
allow_any_instance_of(Lumberjack::Socket).to receive(:connection_start).and_return(true)
|
20
|
+
end
|
21
|
+
|
22
|
+
context "sequence" do
|
23
|
+
|
24
|
+
let(:hash) { {:a => 1, :b => 2}}
|
25
|
+
let(:max_unsigned_int) { (2**32)-1 }
|
26
|
+
|
27
|
+
before(:each) do
|
28
|
+
allow(socket).to receive(:ack).and_return(true)
|
29
|
+
allow(socket).to receive(:write).and_return(true)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "force sequence to be an unsigned 32 bits int" do
|
33
|
+
socket.instance_variable_set(:@sequence, max_unsigned_int)
|
34
|
+
socket.write_hash(hash)
|
35
|
+
expect(socket.sequence).to eq(1)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context "ack" do
|
40
|
+
|
41
|
+
let(:hash) { {:a => 1, :b => 2}}
|
42
|
+
|
43
|
+
before(:each) do
|
44
|
+
allow(socket).to receive(:write).and_return(true)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "increments the sequence per windows size" do
|
48
|
+
allow(socket).to receive(:read_version_and_type).and_return([1, 'A'])
|
49
|
+
expect(socket).to receive(:ack).twice.and_call_original
|
50
|
+
|
51
|
+
[5000, 10000].each do |last_ack|
|
52
|
+
windows_size = 5001
|
53
|
+
|
54
|
+
allow(socket).to receive(:read_last_ack).and_return(last_ack)
|
55
|
+
|
56
|
+
windows_size.times do
|
57
|
+
socket.write_hash(hash)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe Lumberjack::Encoder do
|
66
|
+
it 'should creates frames without truncating accentued characters' do
|
67
|
+
content = {
|
68
|
+
"message" => "Le Canadien de Montréal est la meilleure équipe au monde!",
|
69
|
+
"other" => "éléphant"
|
70
|
+
}
|
71
|
+
parser = Lumberjack::Parser.new
|
72
|
+
parser.feed(Lumberjack::Encoder.to_frame(content, 0)) do |code, sequence, data|
|
73
|
+
expect(data["message"].force_encoding('UTF-8')).to eq(content["message"])
|
74
|
+
expect(data["other"].force_encoding('UTF-8')).to eq(content["other"])
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'should creates frames without dropping multibytes characters' do
|
79
|
+
content = {
|
80
|
+
"message" => "国際ホッケー連盟" # International Hockey Federation
|
81
|
+
}
|
82
|
+
parser = Lumberjack::Parser.new
|
83
|
+
parser.feed(Lumberjack::Encoder.to_frame(content, 0)) do |code, sequence, data|
|
84
|
+
expect(data["message"].force_encoding('UTF-8')).to eq(content["message"])
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'should creates compressed frames' do
|
89
|
+
content = {
|
90
|
+
"message" => "国際ホッケー連盟" # International Hockey Federation
|
91
|
+
}
|
92
|
+
parser = Lumberjack::Parser.new
|
93
|
+
parser.feed(Lumberjack::Encoder.to_compressed_frame(content, 0)) do |code, sequence, data|
|
94
|
+
expect(data["message"].force_encoding('UTF-8')).to eq(content["message"])
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,15 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jls-lumberjack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.23
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jordan Sissel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
12
|
-
dependencies:
|
11
|
+
date: 2015-07-31 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: flores
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.0.6
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.0.6
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: stud
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
13
55
|
description: lumberjack log transport library
|
14
56
|
email:
|
15
57
|
- jls@semicomplete.com
|
@@ -19,6 +61,9 @@ extra_rdoc_files: []
|
|
19
61
|
files:
|
20
62
|
- lib/lumberjack/client.rb
|
21
63
|
- lib/lumberjack/server.rb
|
64
|
+
- spec/integration_spec.rb
|
65
|
+
- spec/lumberjack/client_spec.rb
|
66
|
+
- spec/spec_helper.rb
|
22
67
|
homepage: https://github.com/jordansissel/lumberjack
|
23
68
|
licenses: []
|
24
69
|
metadata: {}
|
@@ -38,8 +83,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
38
83
|
version: '0'
|
39
84
|
requirements: []
|
40
85
|
rubyforge_project:
|
41
|
-
rubygems_version: 2.4.
|
86
|
+
rubygems_version: 2.4.5
|
42
87
|
signing_key:
|
43
88
|
specification_version: 4
|
44
89
|
summary: lumberjack log transport library
|
45
|
-
test_files:
|
90
|
+
test_files:
|
91
|
+
- spec/integration_spec.rb
|
92
|
+
- spec/lumberjack/client_spec.rb
|
93
|
+
- spec/spec_helper.rb
|