serverengine 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,85 @@
1
+
2
+ describe ServerEngine::SignalThread do
3
+ it 'start and stop' do
4
+ t = SignalThread.new
5
+ t.stop.should == t
6
+ t.join
7
+ end
8
+
9
+ it 'call handler' do
10
+ n = 0
11
+
12
+ t = SignalThread.new do |st|
13
+ st.trap('CONT') { n += 1 }
14
+ end
15
+
16
+ Process.kill('CONT', Process.pid)
17
+
18
+ t.stop.join
19
+
20
+ n.should == 1
21
+ end
22
+
23
+ it 'SIG_IGN' do
24
+ t = SignalThread.new do |st|
25
+ st.trap('QUIT', 'SIG_IGN')
26
+ end
27
+
28
+ Process.kill('QUIT', Process.pid)
29
+
30
+ t.stop.join
31
+ end
32
+
33
+ it 'signal in handler' do
34
+ n = 0
35
+
36
+ t = SignalThread.new do |st|
37
+ st.trap('QUIT') do
38
+ if n < 3
39
+ Process.kill('QUIT', Process.pid)
40
+ n += 1
41
+ end
42
+ end
43
+ end
44
+
45
+ Process.kill('QUIT', Process.pid)
46
+
47
+ sleep 1
48
+
49
+ n.should == 3
50
+ end
51
+
52
+ it 'stop in handler' do
53
+ n = 0
54
+
55
+ t = SignalThread.new do |st|
56
+ st.trap('QUIT') { st.stop }
57
+ end
58
+
59
+ Process.kill('QUIT', Process.pid)
60
+
61
+ t.join
62
+ end
63
+
64
+ it 'should not deadlock' do
65
+ n = 0
66
+
67
+ t = SignalThread.new do |st|
68
+ st.trap('CONT') { n += 1 }
69
+ end
70
+
71
+ (1..10).map {
72
+ Thread.new do
73
+ 10.times {
74
+ Process.kill('CONT', Process.pid)
75
+ }
76
+ end
77
+ }.each { |t|
78
+ t.join
79
+ }
80
+
81
+ # result won't be 100 because of kernel limitation
82
+ n.should > 0
83
+ end
84
+ end
85
+
@@ -0,0 +1,16 @@
1
+ require 'bundler'
2
+ require 'sigdump/setup'
3
+
4
+ begin
5
+ Bundler.setup(:default, :test)
6
+ rescue Bundler::BundlerError => e
7
+ $stderr.puts e.message
8
+ $stderr.puts "Run `bundle install` to install missing gems"
9
+ exit e.status_code
10
+ end
11
+
12
+ require 'serverengine'
13
+ include ServerEngine
14
+
15
+ require 'server_worker_context'
16
+
@@ -0,0 +1,142 @@
1
+
2
+ describe ServerEngine::Supervisor do
3
+ include_context 'test server and worker'
4
+
5
+ def start_supervisor(config={})
6
+ sv = Supervisor.new(TestServer, TestWorker, config)
7
+ t = Thread.new { sv.main }
8
+
9
+ return sv, t
10
+ end
11
+
12
+ it 'start and graceful stop' do
13
+ sv, t = start_supervisor
14
+
15
+ begin
16
+ wait_for_fork
17
+
18
+ test_state(:server_before_run).should == 1
19
+ test_state(:server_close).should == 1 # parent
20
+ ensure
21
+ sv.stop(true)
22
+ t.join
23
+ end
24
+
25
+ test_state(:server_stop).should == 1
26
+ test_state(:server_stop_graceful).should == 1
27
+ test_state(:server_restart).should == 0
28
+
29
+ test_state(:server_after_run).should == 1
30
+ test_state(:server_close).should == 2 # parent and child
31
+ end
32
+
33
+ it 'immediate stop' do
34
+ sv, t = start_supervisor
35
+
36
+ begin
37
+ wait_for_fork
38
+ ensure
39
+ sv.stop(false)
40
+ t.join
41
+ end
42
+
43
+ test_state(:server_stop).should == 1
44
+ test_state(:server_stop_immediate).should == 1
45
+ test_state(:server_after_run).should == 1
46
+ test_state(:server_close).should == 2
47
+ end
48
+
49
+ it 'graceful restart' do
50
+ sv, t = start_supervisor
51
+
52
+ begin
53
+ wait_for_fork
54
+
55
+ sv.restart(true)
56
+
57
+ ensure
58
+ sv.stop(true)
59
+ t.join
60
+ end
61
+
62
+ test_state(:server_stop).should == 1
63
+ test_state(:server_restart_graceful).should == 1
64
+
65
+ test_state(:server_before_run).should == 1
66
+ test_state(:server_after_run).should == 1
67
+ test_state(:server_close).should == 2
68
+ end
69
+
70
+ it 'immediate restart' do
71
+ sv, t = start_supervisor
72
+
73
+ begin
74
+ wait_for_fork
75
+
76
+ sv.restart(false)
77
+
78
+ ensure
79
+ sv.stop(true)
80
+ t.join
81
+ end
82
+
83
+ test_state(:server_stop).should == 1
84
+ test_state(:server_restart_immediate).should == 1
85
+
86
+ test_state(:server_before_run).should == 1
87
+ test_state(:server_after_run).should == 1
88
+ test_state(:server_close).should == 2
89
+ end
90
+
91
+ it 'reload' do
92
+ sv, t = start_supervisor
93
+
94
+ begin
95
+ wait_for_fork
96
+
97
+ sv.reload
98
+
99
+ ensure
100
+ sv.stop(true)
101
+ t.join
102
+ end
103
+
104
+ test_state(:server_stop).should == 1
105
+ test_state(:server_reload).should == 1
106
+ end
107
+
108
+ # TODO detach
109
+
110
+ module InitializeErrorServer
111
+ def initialize
112
+ raise StandardError, "error test"
113
+ end
114
+ end
115
+
116
+ it 'initialize error' do
117
+ sv = Supervisor.new(InitializeErrorServer, TestWorker)
118
+ lambda { sv.main }.should raise_error(StandardError)
119
+ end
120
+
121
+ module RunErrorWorker
122
+ def run
123
+ incr_test_state :worker_run
124
+ raise StandardError, "error test"
125
+ end
126
+ end
127
+
128
+ it 'auto restart in limited ratio' do
129
+ sv = Supervisor.new(TestServer, RunErrorWorker, server_restart_wait: 1)
130
+ t = Thread.new { sv.main }
131
+
132
+ begin
133
+ sleep 2.2
134
+ ensure
135
+ sv.stop(true)
136
+ t.join
137
+ end
138
+
139
+ test_state(:worker_run).should == 3
140
+ end
141
+
142
+ end
metadata ADDED
@@ -0,0 +1,134 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: serverengine
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.5.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Sadayuki Furuhashi
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-06-02 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: sigdump
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 0.2.2
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 0.2.2
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: 0.9.2
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 0.9.2
46
+ - !ruby/object:Gem::Dependency
47
+ name: rspec
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 2.13.0
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 2.13.0
62
+ description: A framework to implement robust multiprocess servers like Unicorn
63
+ email:
64
+ - frsyuki@gmail.com
65
+ executables: []
66
+ extensions: []
67
+ extra_rdoc_files: []
68
+ files:
69
+ - COPYING
70
+ - Changelog
71
+ - Gemfile
72
+ - README.md
73
+ - Rakefile
74
+ - lib/serverengine.rb
75
+ - lib/serverengine/blocking_flag.rb
76
+ - lib/serverengine/config_loader.rb
77
+ - lib/serverengine/daemon.rb
78
+ - lib/serverengine/daemon_logger.rb
79
+ - lib/serverengine/embedded_server.rb
80
+ - lib/serverengine/multi_process_server.rb
81
+ - lib/serverengine/multi_thread_server.rb
82
+ - lib/serverengine/multi_worker_server.rb
83
+ - lib/serverengine/process_manager.rb
84
+ - lib/serverengine/server.rb
85
+ - lib/serverengine/signal_thread.rb
86
+ - lib/serverengine/supervisor.rb
87
+ - lib/serverengine/utils.rb
88
+ - lib/serverengine/version.rb
89
+ - lib/serverengine/worker.rb
90
+ - serverengine.gemspec
91
+ - spec/blocking_flag_spec.rb
92
+ - spec/daemon_logger_spec.rb
93
+ - spec/daemon_spec.rb
94
+ - spec/multi_process_server_spec.rb
95
+ - spec/server_worker_context.rb
96
+ - spec/signal_thread_spec.rb
97
+ - spec/spec_helper.rb
98
+ - spec/supervisor_spec.rb
99
+ homepage: https://github.com/frsyuki/serverengine
100
+ licenses: []
101
+ post_install_message:
102
+ rdoc_options: []
103
+ require_paths:
104
+ - lib
105
+ required_ruby_version: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: 1.9.3
111
+ required_rubygems_version: !ruby/object:Gem::Requirement
112
+ none: false
113
+ requirements:
114
+ - - ! '>='
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ segments:
118
+ - 0
119
+ hash: -438822575013834971
120
+ requirements: []
121
+ rubyforge_project:
122
+ rubygems_version: 1.8.23
123
+ signing_key:
124
+ specification_version: 3
125
+ summary: ServerEngine - multiprocess server framework
126
+ test_files:
127
+ - spec/blocking_flag_spec.rb
128
+ - spec/daemon_logger_spec.rb
129
+ - spec/daemon_spec.rb
130
+ - spec/multi_process_server_spec.rb
131
+ - spec/server_worker_context.rb
132
+ - spec/signal_thread_spec.rb
133
+ - spec/spec_helper.rb
134
+ - spec/supervisor_spec.rb