serverengine 1.5.0

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,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