glint 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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