glint 0.0.1 → 0.0.2

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 81f0eee87a5a44a32801d9146415bc2389bb15a2
4
+ data.tar.gz: 5d3b67a57c0b799140b04d10b60e2dd76f9062b9
5
+ SHA512:
6
+ metadata.gz: e13fc5620882e3aada1251aba79fdc8f091d9115c38b1d82f2efbfd514ca32da23b90fba72a54fffa2bcd17b4be1742b66db9e6c3d74d063636dad123e815baf
7
+ data.tar.gz: b5d7c8e28415b7eb30d9d8850bbdc7923d74ea327d4ffe797d7ad363937c596600afccb76b97d5a913ab9b5c5a7cb4eba7f1248553ad6426e3e796ef65d4bb48
@@ -4,4 +4,3 @@ rvm:
4
4
  - 1.9.3
5
5
  - 1.9.2
6
6
  - ruby-head
7
- - rbx-19mode
data/README.md CHANGED
@@ -4,7 +4,7 @@ Glint is a library which allows you to fire arbitrary TCP server processes progr
4
4
 
5
5
  It's useful when you want to test your code against real TCP server processes.
6
6
 
7
- ## Usage
7
+ ## Synopsis
8
8
 
9
9
  ```ruby
10
10
  server = Glint::Server.new do |port|
@@ -21,6 +21,42 @@ exit
21
21
  # The process executed above will be shutdown here.
22
22
  ```
23
23
 
24
+ ## Methods
25
+
26
+ ### Glint::Server
27
+
28
+ #### Glint::Server.info
29
+
30
+ server.rb:
31
+
32
+ ```
33
+ server = Glint::Server.new do |port|
34
+ exec 'memcached', '-p', port.to_s;
35
+ exit 0
36
+ end
37
+ server.start
38
+
39
+ Glint::Server.info[:memcached] = "127.0.0.1:#{server.port}"
40
+ ```
41
+
42
+ client.rb:
43
+
44
+ ```
45
+ client = Dalli::Client.new(Glint::Server.info[:memcached])
46
+ ```
47
+
48
+ `Glint::Server.info` is used to store server info globally which is retrieved and utilized by client later. It's useful when server and client codes are not in the same code.
49
+
50
+ #### Glint::Server#start
51
+
52
+ ```
53
+ server = Glint::Server.new do |port|
54
+ exec 'memcached', '-p', port.to_s;
55
+ exit 0
56
+ end
57
+ server.start
58
+ ```
59
+
24
60
  ## Installation
25
61
 
26
62
  Add this line to your application's Gemfile:
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'dalli'
4
+ gem 'rake'
5
+ gem 'rspec'
@@ -0,0 +1,8 @@
1
+ require 'rspec/core'
2
+ require 'rspec/core/rake_task'
3
+ RSpec::Core::RakeTask.new(:spec) do |spec|
4
+ spec.pattern = FileList['spec/**/*_spec.rb']
5
+ spec.ruby_opts = %w[-w]
6
+ end
7
+
8
+ task :default => :spec
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'bar' do
4
+ include_context 'memcached'
5
+ before { client.set('test_bar', 'value') }
6
+ it { expect(client.get('test_bar')).to be == 'value' }
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'baz' do
4
+ include_context 'memcached'
5
+ before { client.set('test_baz', 'value') }
6
+ it { expect(client.get('test_baz')).to be == 'value' }
7
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'foo' do
4
+ include_context 'memcached'
5
+
6
+ before {
7
+ client.set('test_foo', 'value')
8
+ }
9
+
10
+ it {
11
+ expect(client.get('test_foo')).to be == 'value'
12
+ }
13
+ end
@@ -0,0 +1,8 @@
1
+ server = Glint::Server.new do |port|
2
+ exec 'memcached', '-p', port.to_s;
3
+ exit 0
4
+ end
5
+ server.on_stopped = ->(s) { puts 'memcached stopped!' }
6
+ server.start
7
+
8
+ Glint::Server.info[:memcached] = "127.0.0.1:#{server.port}"
@@ -0,0 +1,14 @@
1
+ $LOAD_PATH.unshift '../../lib'
2
+
3
+ require 'glint'
4
+ Dir[File.expand_path("../servers/*.rb", __FILE__)].each do |f|
5
+ require f
6
+ end
7
+
8
+ require 'rspec'
9
+ shared_context 'memcached' do
10
+ require 'dalli'
11
+ let(:client) {
12
+ Dalli::Client.new(Glint::Server.info[:memcached])
13
+ }
14
+ end
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'redis'
4
+ gem 'rake'
5
+ gem 'rspec'
@@ -0,0 +1,8 @@
1
+ require 'rspec/core'
2
+ require 'rspec/core/rake_task'
3
+ RSpec::Core::RakeTask.new(:spec) do |spec|
4
+ spec.pattern = FileList['spec/**/*_spec.rb']
5
+ spec.ruby_opts = %w[-w]
6
+ end
7
+
8
+ task :default => :spec
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'bar' do
4
+ include_context 'redis'
5
+ before { client.set('test_bar', 'value') }
6
+ it { expect(client.get('test_bar')).to be == 'value' }
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'baz' do
4
+ include_context 'redis'
5
+ before { client.set('test_baz', 'value') }
6
+ it { expect(client.get('test_baz')).to be == 'value' }
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'foo' do
4
+ include_context 'redis'
5
+ before { client.set('test_foo', 'value') }
6
+ it { expect(client.get('test_foo')).to be == 'value' }
7
+ end
@@ -0,0 +1,12 @@
1
+ server = Glint::Server.new do |port|
2
+ # `--port` option is available since version 2.6
3
+ exec 'redis-server', '--port', port.to_s
4
+ exit 0
5
+ end
6
+ server.on_stopped = ->(s) { puts 'redis stopped!' }
7
+ server.start
8
+
9
+ Glint::Server.info[:redis] = {
10
+ host: "127.0.0.1",
11
+ port: server.port,
12
+ }
@@ -0,0 +1,18 @@
1
+ $LOAD_PATH.unshift '../../lib'
2
+
3
+ require 'glint'
4
+ Dir[File.expand_path("../servers/*.rb", __FILE__)].each {|f| require f}
5
+
6
+ require 'rspec'
7
+ shared_context 'redis' do
8
+ require 'redis'
9
+ let(:client) {
10
+ Redis.new(
11
+ host: Glint::Server.info[:redis][:host],
12
+ port: Glint::Server.info[:redis][:port]
13
+ )
14
+ }
15
+ end
16
+
17
+ RSpec.configure do |config|
18
+ end
@@ -1,8 +1,13 @@
1
1
  require_relative 'util.rb'
2
+ require "timeout"
2
3
 
3
4
  module Glint
4
5
  class Server
5
- attr_accessor :port, :block, :pid, :child_pid
6
+ attr_accessor :port, :block, :pid, :child_pid, :on_stopped
7
+
8
+ def self.info
9
+ @@info ||= {}
10
+ end
6
11
 
7
12
  def initialize(port = nil, opts = {}, &block)
8
13
  unless block_given?
@@ -10,6 +15,7 @@ module Glint
10
15
  end
11
16
 
12
17
  @port = port || Util.empty_port
18
+ @opts = { timeout: 1, signals: [:TERM, :INT, :KILL] }.merge(opts)
13
19
  @block = block
14
20
  @pid = Process.pid
15
21
 
@@ -23,13 +29,22 @@ module Glint
23
29
  end
24
30
 
25
31
  Util.wait_port(port)
32
+ self
26
33
  end
27
34
 
28
35
  def stop
29
36
  if pid == Process.pid && child_pid
30
- Process.kill(:TERM, child_pid)
31
- Process.waitpid(child_pid)
37
+ signals = @opts[:signals].clone
38
+ begin
39
+ Process.kill(signals.shift, child_pid)
40
+ timeout(@opts[:timeout]) do
41
+ Process.waitpid(child_pid)
42
+ end
43
+ rescue Timeout::Error => e
44
+ retry
45
+ end
32
46
  self.child_pid = nil
47
+ on_stopped && on_stopped.call(self)
33
48
  end
34
49
  end
35
50
  end
@@ -1,3 +1,3 @@
1
1
  module Glint
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -2,6 +2,26 @@ require_relative '../../spec_helper'
2
2
 
3
3
  module Glint
4
4
  describe Server do
5
+ describe '.info' do
6
+ context 'when no info set' do
7
+ it { expect(Glint::Server.info).to be == {} }
8
+ end
9
+
10
+ context 'when a value via the method' do
11
+ before {
12
+ Glint::Server.info['foo'] = 'bar'
13
+ Glint::Server.info['baz'] = 'qux'
14
+ }
15
+
16
+ it {
17
+ expect(Glint::Server.info).to be == {
18
+ 'foo' => 'bar',
19
+ 'baz' => 'qux',
20
+ }
21
+ }
22
+ end
23
+ end
24
+
5
25
  describe '.new' do
6
26
  context 'when block is given' do
7
27
  context 'and a port is passed in' do
@@ -50,14 +70,75 @@ module Glint
50
70
  exec File.expand_path("../../../bin/server.rb", __FILE__), port.to_s
51
71
  end
52
72
  }
53
- before { server.start }
54
73
 
55
74
  it {
75
+ expect(server.start).to equal(server)
56
76
  expect(server.child_pid).to be_true
57
77
  }
58
78
  end
59
79
 
60
80
  describe '#stop' do
81
+ context "when normal process" do
82
+ let(:server) {
83
+ server = Glint::Server.new do |port|
84
+ exec File.expand_path("../../../bin/server.rb", __FILE__), port.to_s
85
+ end
86
+ server.start
87
+ server
88
+ }
89
+ let(:child_pid) { server.child_pid }
90
+
91
+ before { server.stop }
92
+
93
+ it {
94
+ expect(server.child_pid).to be_nil
95
+ }
96
+ end
97
+
98
+ context "when process which traps SIGTERM" do
99
+ let(:server) {
100
+ server = Glint::Server.new(nil, { timeout: 0.1 }) do |port|
101
+ require "socket"
102
+ Signal.trap(:SIGTERM) { }
103
+ server = TCPServer.new(port)
104
+ 1 while server.accept
105
+ end
106
+ server.start
107
+ server
108
+ }
109
+ let(:child_pid) { server.child_pid }
110
+
111
+ before { server.stop }
112
+
113
+ it {
114
+ expect(server.child_pid).to be_nil
115
+ }
116
+ end
117
+
118
+ context "when process which traps SIGTERM and SIGINT" do
119
+ let(:server) {
120
+ server = Glint::Server.new(nil, { timeout: 0.1 }) do |port|
121
+ require "socket"
122
+ Signal.trap(:SIGTERM) { }
123
+ Signal.trap(:SIGINT) { }
124
+ server = TCPServer.new(port)
125
+ 1 while server.accept
126
+ end
127
+ server.start
128
+ server
129
+ }
130
+ let(:child_pid) { server.child_pid }
131
+
132
+ before { server.stop }
133
+
134
+ it {
135
+ expect(server.child_pid).to be_nil
136
+ }
137
+ end
138
+ end
139
+
140
+ describe '#on_stopped' do
141
+ let!(:result) { false }
61
142
  let(:server) {
62
143
  server = Glint::Server.new do |port|
63
144
  exec File.expand_path("../../../bin/server.rb", __FILE__), port.to_s
@@ -65,13 +146,29 @@ module Glint
65
146
  server.start
66
147
  server
67
148
  }
68
- let(:child_pid) { server.child_pid }
69
149
 
70
- before { server.stop }
150
+ context 'when `on_stopped` is set' do
151
+ before {
152
+ server.on_stopped = ->(s) {
153
+ s.instance_variable_set(:@_stopped, true)
154
+ }
155
+ server.stop
156
+ }
71
157
 
72
- it {
73
- expect(server.child_pid).to be_nil
74
- }
158
+ it {
159
+ expect(server.instance_variable_get(:@_stopped)).to be true
160
+ }
161
+ end
162
+
163
+ context 'when `on_stopped` is not set' do
164
+ before {
165
+ server.stop
166
+ }
167
+
168
+ it {
169
+ expect(server.instance_variable_get(:@_stopped)).to be nil
170
+ }
171
+ end
75
172
  end
76
173
  end
77
174
  end
metadata CHANGED
@@ -1,36 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glint
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
5
- prerelease:
4
+ version: 0.0.2
6
5
  platform: ruby
7
6
  authors:
8
7
  - Kentaro Kuribayashi
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-02-17 00:00:00.000000000 Z
11
+ date: 2014-01-10 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rake
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - '>='
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rspec
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ~>
44
39
  - !ruby/object:Gem::Version
@@ -57,6 +52,20 @@ files:
57
52
  - LICENSE.txt
58
53
  - README.md
59
54
  - Rakefile
55
+ - examples/memcached/Gemfile
56
+ - examples/memcached/Rakefile
57
+ - examples/memcached/spec/lib/bar_spec.rb
58
+ - examples/memcached/spec/lib/baz_spec.rb
59
+ - examples/memcached/spec/lib/foo_spec.rb
60
+ - examples/memcached/spec/servers/memcached.rb
61
+ - examples/memcached/spec/spec_helper.rb
62
+ - examples/redis/Gemfile
63
+ - examples/redis/Rakefile
64
+ - examples/redis/spec/lib/bar_spec.rb
65
+ - examples/redis/spec/lib/baz_spec.rb
66
+ - examples/redis/spec/lib/foo_spec.rb
67
+ - examples/redis/spec/servers/redis.rb
68
+ - examples/redis/spec/spec_helper.rb
60
69
  - glint.gemspec
61
70
  - lib/glint.rb
62
71
  - lib/glint/server.rb
@@ -69,30 +78,26 @@ files:
69
78
  homepage: http://github.com/kentaro/glint
70
79
  licenses:
71
80
  - MIT
81
+ metadata: {}
72
82
  post_install_message:
73
83
  rdoc_options: []
74
84
  require_paths:
75
85
  - lib
76
86
  required_ruby_version: !ruby/object:Gem::Requirement
77
- none: false
78
87
  requirements:
79
- - - ! '>='
88
+ - - '>='
80
89
  - !ruby/object:Gem::Version
81
90
  version: 1.9.2
82
91
  required_rubygems_version: !ruby/object:Gem::Requirement
83
- none: false
84
92
  requirements:
85
- - - ! '>='
93
+ - - '>='
86
94
  - !ruby/object:Gem::Version
87
95
  version: '0'
88
- segments:
89
- - 0
90
- hash: 1775963593609715634
91
96
  requirements: []
92
97
  rubyforge_project:
93
- rubygems_version: 1.8.23
98
+ rubygems_version: 2.0.14
94
99
  signing_key:
95
- specification_version: 3
100
+ specification_version: 4
96
101
  summary: Firebombs arbitrary server processs for tests.
97
102
  test_files:
98
103
  - spec/bin/server.rb