sanford 0.17.0 → 0.18.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/bench/report.rb +2 -0
- data/bench/report.txt +28 -37
- data/lib/sanford/connection_handler.rb +10 -3
- data/lib/sanford/error_handler.rb +4 -4
- data/lib/sanford/io_pipe.rb +40 -0
- data/lib/sanford/process.rb +108 -28
- data/lib/sanford/router.rb +5 -0
- data/lib/sanford/server.rb +133 -95
- data/lib/sanford/server_data.rb +27 -28
- data/lib/sanford/template_source.rb +2 -2
- data/lib/sanford/version.rb +1 -1
- data/sanford.gemspec +4 -5
- data/test/helper.rb +11 -0
- data/test/support/app_server.rb +6 -3
- data/test/support/factory.rb +7 -0
- data/test/system/server_tests.rb +21 -3
- data/test/system/service_handler_tests.rb +4 -4
- data/test/unit/cli_tests.rb +2 -2
- data/test/unit/connection_handler_tests.rb +107 -47
- data/test/unit/error_handler_tests.rb +11 -11
- data/test/unit/io_pipe_tests.rb +84 -0
- data/test/unit/process_tests.rb +266 -131
- data/test/unit/router_tests.rb +25 -7
- data/test/unit/server_data_tests.rb +68 -46
- data/test/unit/server_tests.rb +197 -240
- data/test/unit/template_engine_tests.rb +1 -1
- data/test/unit/template_source_tests.rb +6 -0
- data/test/unit/test_runner_tests.rb +0 -19
- metadata +12 -19
data/test/unit/router_tests.rb
CHANGED
@@ -8,12 +8,21 @@ class Sanford::Router
|
|
8
8
|
class UnitTests < Assert::Context
|
9
9
|
desc "Sanford::Router"
|
10
10
|
setup do
|
11
|
-
@
|
11
|
+
@router_class = Sanford::Router
|
12
|
+
end
|
13
|
+
subject{ @router_class }
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
class InitTests < UnitTests
|
18
|
+
desc "when init"
|
19
|
+
setup do
|
20
|
+
@router = @router_class.new
|
12
21
|
end
|
13
22
|
subject{ @router }
|
14
23
|
|
15
24
|
should have_readers :routes
|
16
|
-
should have_imeths :service_handler_ns, :service
|
25
|
+
should have_imeths :service_handler_ns, :service, :validate!
|
17
26
|
|
18
27
|
should "build an empty array for its routes by default" do
|
19
28
|
assert_equal [], subject.routes
|
@@ -49,17 +58,26 @@ class Sanford::Router
|
|
49
58
|
subject.service service_name, handler_name
|
50
59
|
|
51
60
|
route = subject.routes.last
|
52
|
-
|
53
|
-
assert_equal
|
61
|
+
exp = "#{namespace}::#{handler_name}"
|
62
|
+
assert_equal exp, route.handler_class_name
|
63
|
+
end
|
64
|
+
|
65
|
+
should "validate each route when validating" do
|
66
|
+
subject.service(Factory.string, TestHandler.to_s)
|
67
|
+
subject.routes.each{ |route| assert_nil route.handler_class }
|
68
|
+
subject.validate!
|
69
|
+
subject.routes.each{ |route| assert_not_nil route.handler_class }
|
54
70
|
end
|
55
71
|
|
56
72
|
should "know its custom inspect" do
|
57
73
|
reference = '0x0%x' % (subject.object_id << 1)
|
58
|
-
|
59
|
-
|
60
|
-
assert_equal
|
74
|
+
exp = "#<#{subject.class}:#{reference} " \
|
75
|
+
"@service_handler_ns=#{subject.service_handler_ns.inspect}>"
|
76
|
+
assert_equal exp, subject.inspect
|
61
77
|
end
|
62
78
|
|
63
79
|
end
|
64
80
|
|
81
|
+
TestHandler = Class.new
|
82
|
+
|
65
83
|
end
|
@@ -8,72 +8,76 @@ class Sanford::ServerData
|
|
8
8
|
class UnitTests < Assert::Context
|
9
9
|
desc "Sanford::ServerData"
|
10
10
|
setup do
|
11
|
-
@orig_ip_env_var
|
12
|
-
@orig_port_env_var
|
11
|
+
@orig_ip_env_var = ENV['SANFORD_IP']
|
12
|
+
@orig_port_env_var = ENV['SANFORD_PORT']
|
13
|
+
@orig_label_env_var = ENV['SANFORD_PROCESS_LABEL']
|
13
14
|
ENV.delete('SANFORD_IP')
|
14
15
|
ENV.delete('SANFORD_PORT')
|
16
|
+
ENV.delete('SANFORD_PROCESS_LABEL')
|
17
|
+
ENV.delete('SANFORD_DEBUG')
|
15
18
|
|
16
19
|
@route = Sanford::Route.new(Factory.string, TestHandler.to_s).tap(&:validate!)
|
20
|
+
|
17
21
|
@config_hash = {
|
18
22
|
:name => Factory.string,
|
19
23
|
:ip => Factory.string,
|
20
24
|
:port => Factory.integer,
|
21
25
|
:pid_file => Factory.file_path,
|
22
|
-
:
|
26
|
+
:shutdown_timeout => Factory.integer,
|
23
27
|
:worker_class => Class.new,
|
24
28
|
:worker_params => { Factory.string => Factory.string },
|
25
29
|
:num_workers => Factory.integer,
|
26
|
-
:verbose_logging => Factory.boolean,
|
27
|
-
:logger => Factory.string,
|
28
|
-
:template_source => Factory.string,
|
29
|
-
:shutdown_timeout => Factory.integer,
|
30
|
-
:init_procs => Factory.integer(3).times.map{ proc{} },
|
31
30
|
:error_procs => Factory.integer(3).times.map{ proc{} },
|
31
|
+
:template_source => Factory.string,
|
32
|
+
:logger => Factory.string,
|
32
33
|
:router => Factory.string,
|
34
|
+
:receives_keep_alive => Factory.boolean,
|
35
|
+
:verbose_logging => Factory.boolean,
|
33
36
|
:routes => [@route]
|
34
37
|
}
|
35
38
|
@server_data = Sanford::ServerData.new(@config_hash)
|
36
39
|
end
|
37
40
|
teardown do
|
38
|
-
ENV['SANFORD_IP']
|
39
|
-
ENV['SANFORD_PORT']
|
41
|
+
ENV['SANFORD_IP'] = @orig_ip_env_var
|
42
|
+
ENV['SANFORD_PORT'] = @orig_port_env_var
|
43
|
+
ENV['SANFORD_PROCESS_LABEL'] = @orig_label_env_var
|
44
|
+
ENV['SANFORD_DEBUG'] = @orig_debug_env_var
|
40
45
|
end
|
41
46
|
subject{ @server_data }
|
42
47
|
|
43
|
-
should have_readers :name
|
44
|
-
should have_readers :pid_file
|
45
|
-
should have_readers :receives_keep_alive
|
46
|
-
should have_readers :worker_class, :worker_params, :num_workers
|
47
|
-
should have_readers :debug, :logger, :dtcp_logger, :verbose_logging
|
48
|
-
should have_readers :template_source, :shutdown_timeout
|
49
|
-
should have_readers :init_procs, :error_procs
|
50
|
-
should have_readers :router, :routes
|
51
48
|
should have_accessors :ip, :port
|
49
|
+
should have_readers :name, :pid_file, :shutdown_timeout
|
50
|
+
should have_readers :worker_class, :worker_params, :num_workers
|
51
|
+
should have_readers :error_procs, :template_source, :logger, :router
|
52
|
+
should have_readers :receives_keep_alive, :verbose_logging
|
53
|
+
should have_readers :debug, :dtcp_logger, :routes, :process_label
|
54
|
+
should have_imeths :route_for
|
52
55
|
|
53
|
-
should "know its
|
56
|
+
should "know its attrs" do
|
54
57
|
h = @config_hash
|
55
58
|
assert_equal h[:name], subject.name
|
56
59
|
assert_equal h[:ip], subject.ip
|
57
60
|
assert_equal h[:port], subject.port
|
58
61
|
assert_equal h[:pid_file], subject.pid_file
|
59
62
|
|
60
|
-
assert_equal h[:
|
61
|
-
|
62
|
-
assert_equal h[:worker_class], subject.worker_class
|
63
|
-
assert_equal h[:worker_params], subject.worker_params
|
64
|
-
assert_equal h[:num_workers], subject.num_workers
|
65
|
-
|
66
|
-
assert_equal h[:verbose_logging], subject.verbose_logging
|
67
|
-
assert_equal h[:logger], subject.logger
|
63
|
+
assert_equal h[:shutdown_timeout], subject.shutdown_timeout
|
68
64
|
|
65
|
+
assert_equal h[:worker_class], subject.worker_class
|
66
|
+
assert_equal h[:worker_params], subject.worker_params
|
67
|
+
assert_equal h[:num_workers], subject.num_workers
|
68
|
+
assert_equal h[:error_procs], subject.error_procs
|
69
69
|
assert_equal h[:template_source], subject.template_source
|
70
|
+
assert_equal h[:logger], subject.logger
|
71
|
+
assert_equal h[:router], subject.router
|
70
72
|
|
71
|
-
assert_equal h[:
|
73
|
+
assert_equal h[:receives_keep_alive], subject.receives_keep_alive
|
74
|
+
assert_equal h[:verbose_logging], subject.verbose_logging
|
72
75
|
|
73
|
-
|
74
|
-
|
76
|
+
assert_false subject.debug
|
77
|
+
assert_nil subject.dtcp_logger
|
75
78
|
|
76
|
-
|
79
|
+
exp = { @route.name => @route }
|
80
|
+
assert_equal exp, subject.routes
|
77
81
|
end
|
78
82
|
|
79
83
|
should "use ip and port env vars if they are set" do
|
@@ -90,14 +94,32 @@ class Sanford::ServerData
|
|
90
94
|
assert_equal @config_hash[:port], server_data.port
|
91
95
|
end
|
92
96
|
|
93
|
-
should "
|
94
|
-
|
95
|
-
|
97
|
+
should "know its process label" do
|
98
|
+
ENV['SANFORD_PROCESS_LABEL'] = Factory.string
|
99
|
+
server_data = Sanford::ServerData.new(@config_hash)
|
100
|
+
exp = ENV['SANFORD_PROCESS_LABEL']
|
101
|
+
assert_equal exp, server_data.process_label
|
102
|
+
|
103
|
+
ENV['SANFORD_PROCESS_LABEL'] = ""
|
104
|
+
server_data = Sanford::ServerData.new(@config_hash)
|
105
|
+
exp = "#{@config_hash[:name]}-#{@config_hash[:ip]}-#{@config_hash[:port]}"
|
106
|
+
assert_equal exp, server_data.process_label
|
107
|
+
|
108
|
+
ENV.delete('SANFORD_PROCESS_LABEL')
|
109
|
+
server_data = Sanford::ServerData.new(@config_hash)
|
110
|
+
exp = "#{@config_hash[:name]}-#{@config_hash[:ip]}-#{@config_hash[:port]}"
|
111
|
+
assert_equal exp, server_data.process_label
|
112
|
+
end
|
113
|
+
|
114
|
+
should "use the debug env var if set" do
|
115
|
+
ENV['SANFORD_DEBUG'] = Factory.string
|
116
|
+
server_data = Sanford::ServerData.new(@config_hash)
|
117
|
+
assert_true server_data.debug
|
118
|
+
assert_equal server_data.logger, server_data.dtcp_logger
|
96
119
|
end
|
97
120
|
|
98
|
-
should "
|
99
|
-
route
|
100
|
-
assert_equal @route, route
|
121
|
+
should "look up a route using `route_for`" do
|
122
|
+
assert_equal @route, subject.route_for(@route.name)
|
101
123
|
end
|
102
124
|
|
103
125
|
should "raise a not found error using `route_for` with an invalid name" do
|
@@ -106,30 +128,30 @@ class Sanford::ServerData
|
|
106
128
|
end
|
107
129
|
end
|
108
130
|
|
109
|
-
should "default its
|
131
|
+
should "default its attrs when they aren't provided" do
|
110
132
|
server_data = Sanford::ServerData.new
|
111
133
|
assert_nil server_data.name
|
112
134
|
assert_nil server_data.ip
|
113
135
|
assert_nil server_data.port
|
114
136
|
assert_nil server_data.pid_file
|
115
|
-
|
116
|
-
assert_false server_data.receives_keep_alive
|
137
|
+
assert_nil server_data.shutdown_timeout
|
117
138
|
|
118
139
|
assert_nil server_data.worker_class
|
119
140
|
assert_equal({}, server_data.worker_params)
|
120
141
|
assert_nil server_data.num_workers
|
121
142
|
|
122
|
-
|
123
|
-
assert_nil server_data.logger
|
143
|
+
assert_equal [], server_data.error_procs
|
124
144
|
|
125
145
|
assert_nil server_data.template_source
|
146
|
+
assert_nil server_data.logger
|
147
|
+
assert_nil server_data.router
|
126
148
|
|
127
|
-
|
149
|
+
assert_false server_data.receives_keep_alive
|
150
|
+
assert_false server_data.verbose_logging
|
128
151
|
|
129
|
-
|
130
|
-
|
152
|
+
assert_false server_data.debug
|
153
|
+
assert_nil server_data.dtcp_logger
|
131
154
|
|
132
|
-
assert_nil server_data.router
|
133
155
|
assert_equal({}, server_data.routes)
|
134
156
|
end
|
135
157
|
|
data/test/unit/server_tests.rb
CHANGED
@@ -3,158 +3,107 @@ require 'sanford/server'
|
|
3
3
|
|
4
4
|
require 'dat-tcp/server_spy'
|
5
5
|
require 'much-plugin'
|
6
|
-
require '
|
7
|
-
require 'sanford/
|
6
|
+
require 'sanford/logger'
|
7
|
+
require 'sanford/router'
|
8
|
+
require 'sanford/template_source'
|
8
9
|
|
9
10
|
module Sanford::Server
|
10
11
|
|
11
12
|
class UnitTests < Assert::Context
|
12
13
|
desc "Sanford::Server"
|
13
14
|
setup do
|
14
|
-
@server_class = Class.new
|
15
|
-
include Sanford::Server
|
16
|
-
end
|
15
|
+
@server_class = Class.new{ include Sanford::Server }
|
17
16
|
end
|
18
17
|
subject{ @server_class }
|
19
18
|
|
20
|
-
should have_imeths :
|
21
|
-
should have_imeths :name, :ip, :port, :pid_file
|
22
|
-
should have_imeths :
|
23
|
-
should have_imeths :
|
24
|
-
should have_imeths :
|
25
|
-
should have_imeths :verbose_logging, :logger
|
26
|
-
should have_imeths :shutdown_timeout
|
27
|
-
should have_imeths :init, :error
|
28
|
-
should have_imeths :router, :template_source
|
19
|
+
should have_imeths :config
|
20
|
+
should have_imeths :name, :ip, :port, :pid_file, :shutdown_timeout
|
21
|
+
should have_imeths :worker_class, :worker_params, :num_workers, :workers
|
22
|
+
should have_imeths :init, :error, :template_source, :logger, :router
|
23
|
+
should have_imeths :receives_keep_alive, :verbose_logging
|
29
24
|
|
30
25
|
should "use much-plugin" do
|
31
26
|
assert_includes MuchPlugin, Sanford::Server
|
32
27
|
end
|
33
28
|
|
34
|
-
should "
|
35
|
-
config = subject.
|
36
|
-
assert_instance_of Configuration, config
|
37
|
-
assert_same config, subject.configuration
|
38
|
-
end
|
29
|
+
should "allow setting its config values" do
|
30
|
+
config = subject.config
|
39
31
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
assert_equal new_name, subject.configuration.name
|
44
|
-
assert_equal new_name, subject.name
|
45
|
-
end
|
32
|
+
exp = Factory.string
|
33
|
+
subject.name exp
|
34
|
+
assert_equal exp, config.name
|
46
35
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
assert_equal new_ip, subject.configuration.ip
|
51
|
-
assert_equal new_ip, subject.ip
|
52
|
-
end
|
36
|
+
exp = Factory.string
|
37
|
+
subject.ip exp
|
38
|
+
assert_equal exp, config.ip
|
53
39
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
assert_equal new_port, subject.configuration.port
|
58
|
-
assert_equal new_port, subject.port
|
59
|
-
end
|
40
|
+
exp = Factory.integer
|
41
|
+
subject.port exp
|
42
|
+
assert_equal exp, config.port
|
60
43
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
exp = Pathname.new(new_pid_file)
|
65
|
-
assert_equal exp, subject.configuration.pid_file
|
66
|
-
assert_equal exp, subject.pid_file
|
67
|
-
end
|
44
|
+
exp = Factory.file_path
|
45
|
+
subject.pid_file exp
|
46
|
+
assert_equal exp, config.pid_file
|
68
47
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
assert_equal new_keep_alive, subject.configuration.receives_keep_alive
|
73
|
-
assert_equal new_keep_alive, subject.receives_keep_alive
|
74
|
-
end
|
48
|
+
exp = Factory.integer
|
49
|
+
subject.shutdown_timeout exp
|
50
|
+
assert_equal exp, config.shutdown_timeout
|
75
51
|
|
76
|
-
|
77
|
-
|
78
|
-
subject.worker_class
|
79
|
-
assert_equal new_worker_class, subject.configuration.worker_class
|
80
|
-
assert_equal new_worker_class, subject.worker_class
|
81
|
-
end
|
52
|
+
exp = Class.new
|
53
|
+
subject.worker_class exp
|
54
|
+
assert_equal exp, subject.config.worker_class
|
82
55
|
|
83
|
-
|
84
|
-
|
85
|
-
subject.worker_params
|
86
|
-
assert_equal new_worker_params, subject.configuration.worker_params
|
87
|
-
assert_equal new_worker_params, subject.worker_params
|
88
|
-
end
|
56
|
+
exp = { Factory.string => Factory.string }
|
57
|
+
subject.worker_params exp
|
58
|
+
assert_equal exp, subject.config.worker_params
|
89
59
|
|
90
|
-
|
91
|
-
|
92
|
-
subject.num_workers
|
93
|
-
assert_equal
|
94
|
-
assert_equal new_num_workers, subject.num_workers
|
95
|
-
end
|
60
|
+
exp = Factory.integer
|
61
|
+
subject.num_workers(exp)
|
62
|
+
assert_equal exp, subject.config.num_workers
|
63
|
+
assert_equal exp, subject.workers
|
96
64
|
|
97
|
-
|
98
|
-
|
99
|
-
subject.
|
100
|
-
assert_equal
|
101
|
-
assert_equal
|
102
|
-
end
|
65
|
+
exp = proc{ }
|
66
|
+
assert_equal 0, config.init_procs.size
|
67
|
+
subject.init(&exp)
|
68
|
+
assert_equal 1, config.init_procs.size
|
69
|
+
assert_equal exp, config.init_procs.first
|
103
70
|
|
104
|
-
|
105
|
-
|
106
|
-
subject.
|
107
|
-
assert_equal
|
108
|
-
assert_equal
|
109
|
-
end
|
71
|
+
exp = proc{ }
|
72
|
+
assert_equal 0, config.error_procs.size
|
73
|
+
subject.error(&exp)
|
74
|
+
assert_equal 1, config.error_procs.size
|
75
|
+
assert_equal exp, config.error_procs.first
|
110
76
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
assert_equal new_logger, subject.configuration.logger
|
115
|
-
assert_equal new_logger, subject.logger
|
116
|
-
end
|
77
|
+
exp = Sanford::TemplateSource.new(Factory.path)
|
78
|
+
subject.template_source exp
|
79
|
+
assert_equal exp, config.template_source
|
117
80
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
assert_equal new_shutdown_timeout, subject.configuration.shutdown_timeout
|
122
|
-
assert_equal new_shutdown_timeout, subject.shutdown_timeout
|
123
|
-
end
|
81
|
+
exp = Logger.new(STDOUT)
|
82
|
+
subject.logger exp
|
83
|
+
assert_equal exp, config.logger
|
124
84
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
assert_includes new_init_proc, subject.configuration.init_procs
|
129
|
-
end
|
85
|
+
exp = Factory.boolean
|
86
|
+
subject.receives_keep_alive exp
|
87
|
+
assert_equal exp, config.receives_keep_alive
|
130
88
|
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
assert_includes new_error_proc, subject.configuration.error_procs
|
89
|
+
exp = Factory.boolean
|
90
|
+
subject.verbose_logging exp
|
91
|
+
assert_equal exp, config.verbose_logging
|
135
92
|
end
|
136
93
|
|
137
|
-
should "
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
94
|
+
should "have a router by default and allow overriding it" do
|
95
|
+
assert_kind_of Sanford::Router, subject.router
|
96
|
+
|
97
|
+
new_router = Sanford::Router.new
|
98
|
+
subject.router new_router
|
99
|
+
assert_same new_router, subject.config.router
|
100
|
+
assert_same new_router, subject.router
|
142
101
|
end
|
143
102
|
|
144
103
|
should "allow configuring the router by passing a block to `router`" do
|
145
|
-
new_router = Factory.string
|
146
|
-
|
147
104
|
block_scope = nil
|
148
|
-
subject.router
|
149
|
-
assert_equal
|
150
|
-
assert_equal new_router, block_scope
|
151
|
-
end
|
152
|
-
|
153
|
-
should "allow setting the configuration template source" do
|
154
|
-
new_template_source = Factory.string
|
155
|
-
subject.template_source(new_template_source)
|
156
|
-
assert_equal new_template_source, subject.configuration.template_source
|
157
|
-
assert_equal new_template_source, subject.template_source
|
105
|
+
subject.router{ block_scope = self }
|
106
|
+
assert_equal subject.router, block_scope
|
158
107
|
end
|
159
108
|
|
160
109
|
end
|
@@ -165,17 +114,13 @@ module Sanford::Server
|
|
165
114
|
@server_class.name Factory.string
|
166
115
|
@server_class.ip Factory.string
|
167
116
|
@server_class.port Factory.integer
|
168
|
-
@server_class.num_workers Factory.integer
|
169
|
-
@server_class.worker_params(Factory.string => Factory.string)
|
170
117
|
@server_class.shutdown_timeout Factory.integer
|
118
|
+
@server_class.worker_params(Factory.string => Factory.string)
|
119
|
+
@server_class.num_workers Factory.integer
|
171
120
|
|
172
121
|
@error_procs = Factory.integer(3).times.map{ proc{} }
|
173
122
|
@error_procs.each{ |p| @server_class.error(&p) }
|
174
123
|
|
175
|
-
@server_class.router do
|
176
|
-
service Factory.string, TestHandler.to_s
|
177
|
-
end
|
178
|
-
|
179
124
|
@dtcp_spy = nil
|
180
125
|
Assert.stub(DatTCP::Server, :new) do |*args|
|
181
126
|
@dtcp_spy = DatTCP::ServerSpy.new(*args)
|
@@ -185,37 +130,44 @@ module Sanford::Server
|
|
185
130
|
end
|
186
131
|
subject{ @server }
|
187
132
|
|
188
|
-
should have_readers :server_data
|
189
|
-
should have_imeths :
|
190
|
-
should have_imeths :
|
191
|
-
should have_imeths :configured_ip, :configured_port
|
133
|
+
should have_readers :server_data
|
134
|
+
should have_imeths :ip, :port, :file_descriptor, :client_file_descriptors
|
135
|
+
should have_imeths :name, :configured_ip, :configured_port, :process_label
|
192
136
|
should have_imeths :pid_file, :logger, :router, :template_source
|
193
137
|
should have_imeths :listen, :start, :pause, :stop, :halt
|
194
|
-
should have_imeths :paused?
|
138
|
+
should have_imeths :listening?, :running?, :paused?
|
195
139
|
|
196
|
-
should "have validated its
|
197
|
-
assert_true
|
140
|
+
should "have validated its config" do
|
141
|
+
assert_true @server_class.config.valid?
|
198
142
|
end
|
199
143
|
|
200
144
|
should "know its server data" do
|
201
|
-
|
202
|
-
data
|
145
|
+
config = @server_class.config
|
146
|
+
data = subject.server_data
|
203
147
|
|
204
148
|
assert_instance_of Sanford::ServerData, data
|
205
|
-
assert_equal configuration.name, data.name
|
206
|
-
assert_equal configuration.ip, data.ip
|
207
|
-
assert_equal configuration.port, data.port
|
208
|
-
assert_equal configuration.worker_class, data.worker_class
|
209
|
-
assert_equal configuration.worker_params, data.worker_params
|
210
|
-
assert_equal configuration.verbose_logging, data.verbose_logging
|
211
|
-
assert_equal configuration.receives_keep_alive, data.receives_keep_alive
|
212
|
-
assert_equal configuration.error_procs, data.error_procs
|
213
|
-
assert_equal configuration.routes, data.routes.values
|
214
149
|
|
215
|
-
|
150
|
+
assert_equal config.name, data.name
|
151
|
+
assert_equal config.ip, data.ip
|
152
|
+
assert_equal config.port, data.port
|
153
|
+
assert_equal config.pid_file, data.pid_file
|
154
|
+
assert_equal config.shutdown_timeout, data.shutdown_timeout
|
155
|
+
assert_equal config.worker_class, data.worker_class
|
156
|
+
assert_equal config.worker_params, data.worker_params
|
157
|
+
assert_equal config.num_workers, data.num_workers
|
158
|
+
assert_equal config.error_procs, data.error_procs
|
159
|
+
|
160
|
+
assert_instance_of config.logger.class, data.logger
|
161
|
+
assert_instance_of config.router.class, data.router
|
162
|
+
|
163
|
+
assert_equal config.template_source, data.template_source
|
164
|
+
assert_equal config.verbose_logging, data.verbose_logging
|
165
|
+
assert_equal config.receives_keep_alive, data.receives_keep_alive
|
166
|
+
|
167
|
+
assert_equal config.routes, data.routes.values
|
216
168
|
end
|
217
169
|
|
218
|
-
should "
|
170
|
+
should "build a dat-tcp server" do
|
219
171
|
data = subject.server_data
|
220
172
|
|
221
173
|
assert_not_nil @dtcp_spy
|
@@ -227,21 +179,19 @@ module Sanford::Server
|
|
227
179
|
:sanford_server_data => data
|
228
180
|
})
|
229
181
|
assert_equal exp, @dtcp_spy.worker_params
|
230
|
-
|
231
|
-
assert_equal @dtcp_spy, subject.dat_tcp_server
|
232
182
|
end
|
233
183
|
|
234
184
|
should "demeter its server data" do
|
235
|
-
|
236
|
-
assert_equal subject.server_data.ip, subject.configured_ip
|
237
|
-
assert_equal subject.server_data.port, subject.configured_port
|
238
|
-
assert_equal subject.server_data.pid_file, subject.pid_file
|
239
|
-
end
|
185
|
+
data = subject.server_data
|
240
186
|
|
241
|
-
|
242
|
-
assert_equal
|
243
|
-
assert_equal
|
244
|
-
assert_equal
|
187
|
+
assert_equal data.name, subject.name
|
188
|
+
assert_equal data.ip, subject.configured_ip
|
189
|
+
assert_equal data.port, subject.configured_port
|
190
|
+
assert_equal data.process_label, subject.process_label
|
191
|
+
assert_equal data.pid_file, subject.pid_file
|
192
|
+
assert_equal data.logger, subject.logger
|
193
|
+
assert_equal data.router, subject.router
|
194
|
+
assert_equal data.template_source, subject.template_source
|
245
195
|
end
|
246
196
|
|
247
197
|
should "call listen on its dat tcp server using `listen`" do
|
@@ -324,13 +274,21 @@ module Sanford::Server
|
|
324
274
|
assert_equal wait, @dtcp_spy.waiting_for_halt
|
325
275
|
end
|
326
276
|
|
327
|
-
should "know if its been paused" do
|
277
|
+
should "know if its listening, running or been paused" do
|
278
|
+
assert_false subject.listening?
|
279
|
+
assert_false subject.running?
|
328
280
|
assert_false subject.paused?
|
329
281
|
subject.listen
|
282
|
+
assert_true subject.listening?
|
283
|
+
assert_false subject.running?
|
330
284
|
assert_true subject.paused?
|
331
285
|
subject.start
|
286
|
+
assert_true subject.listening?
|
287
|
+
assert_true subject.running?
|
332
288
|
assert_false subject.paused?
|
333
289
|
subject.pause
|
290
|
+
assert_true subject.listening?
|
291
|
+
assert_false subject.running?
|
334
292
|
assert_true subject.paused?
|
335
293
|
end
|
336
294
|
|
@@ -355,111 +313,85 @@ module Sanford::Server
|
|
355
313
|
|
356
314
|
end
|
357
315
|
|
358
|
-
class
|
359
|
-
|
360
|
-
|
361
|
-
desc "Configuration"
|
316
|
+
class ConfigTests < UnitTests
|
317
|
+
desc "Config"
|
362
318
|
setup do
|
363
|
-
@
|
364
|
-
|
365
|
-
c.ip Factory.string
|
366
|
-
c.port Factory.integer
|
367
|
-
end
|
319
|
+
@config_class = Config
|
320
|
+
@config = Config.new
|
368
321
|
end
|
369
|
-
subject{ @
|
322
|
+
subject{ @config }
|
370
323
|
|
371
|
-
should
|
372
|
-
should have_options :receives_keep_alive
|
373
|
-
should have_options :verbose_logging, :logger
|
374
|
-
should have_options :template_source
|
375
|
-
should have_accessors :init_procs, :error_procs
|
324
|
+
should have_accessors :name, :ip, :port, :pid_file, :shutdown_timeout
|
376
325
|
should have_accessors :worker_class, :worker_params, :num_workers
|
377
|
-
should have_accessors :
|
378
|
-
should have_accessors :
|
379
|
-
should have_imeths :routes
|
380
|
-
should have_imeths :to_hash
|
381
|
-
should have_imeths :valid?, :validate!
|
326
|
+
should have_accessors :init_procs, :error_procs, :template_source, :logger, :router
|
327
|
+
should have_accessors :receives_keep_alive, :verbose_logging
|
328
|
+
should have_imeths :routes, :valid?, :validate!
|
382
329
|
|
383
|
-
should "
|
384
|
-
|
330
|
+
should "know its default attr values" do
|
331
|
+
assert_equal 4, @config_class::DEFAULT_NUM_WORKERS
|
332
|
+
assert_equal '0.0.0.0', @config_class::DEFAULT_IP_ADDRESS
|
385
333
|
end
|
386
334
|
|
387
|
-
should "
|
388
|
-
|
389
|
-
end
|
335
|
+
should "default its attrs" do
|
336
|
+
assert_nil subject.name
|
390
337
|
|
391
|
-
|
392
|
-
|
393
|
-
assert_nil config.name
|
394
|
-
assert_equal '0.0.0.0', config.ip
|
395
|
-
assert_nil config.port
|
396
|
-
assert_nil config.pid_file
|
338
|
+
exp = @config_class::DEFAULT_IP_ADDRESS
|
339
|
+
assert_equal exp, subject.ip
|
397
340
|
|
398
|
-
|
341
|
+
assert_nil subject.port
|
342
|
+
assert_nil subject.pid_file
|
343
|
+
assert_nil subject.shutdown_timeout
|
399
344
|
|
400
|
-
|
401
|
-
assert_instance_of Sanford::NullLogger, config.logger
|
402
|
-
assert_instance_of Sanford::NullTemplateSource, config.template_source
|
345
|
+
assert_equal DefaultWorker, subject.worker_class
|
403
346
|
|
404
|
-
|
405
|
-
assert_nil config.worker_params
|
406
|
-
assert_equal Configuration::DEFAULT_NUM_WORKERS, config.num_workers
|
347
|
+
assert_nil subject.worker_params
|
407
348
|
|
408
|
-
|
349
|
+
exp = @config_class::DEFAULT_NUM_WORKERS
|
350
|
+
assert_equal exp, subject.num_workers
|
409
351
|
|
410
|
-
assert_equal [],
|
411
|
-
assert_equal [],
|
352
|
+
assert_equal [], subject.init_procs
|
353
|
+
assert_equal [], subject.error_procs
|
412
354
|
|
413
|
-
assert_instance_of Sanford::
|
414
|
-
|
415
|
-
end
|
355
|
+
assert_instance_of Sanford::NullTemplateSource, subject.template_source
|
356
|
+
assert_equal ENV['PWD'], subject.template_source.path
|
416
357
|
|
417
|
-
|
418
|
-
|
358
|
+
assert_instance_of Sanford::NullLogger, subject.logger
|
359
|
+
assert_instance_of Sanford::Router, subject.router
|
360
|
+
|
361
|
+
assert_equal false, subject.receives_keep_alive
|
362
|
+
assert_equal true, subject.verbose_logging
|
419
363
|
end
|
420
364
|
|
421
|
-
should "
|
422
|
-
assert_equal subject.router.routes, subject.routes
|
423
|
-
subject.router.service(Factory.string, TestHandler.to_s)
|
365
|
+
should "demeter its router" do
|
424
366
|
assert_equal subject.router.routes, subject.routes
|
425
367
|
end
|
426
368
|
|
427
|
-
should "
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
assert_equal subject.init_procs, config_hash[:init_procs]
|
434
|
-
assert_equal subject.error_procs, config_hash[:error_procs]
|
435
|
-
assert_equal subject.router, config_hash[:router]
|
436
|
-
assert_equal subject.routes, config_hash[:routes]
|
437
|
-
end
|
369
|
+
should "not be valid until validate! has been run" do
|
370
|
+
assert_false subject.valid?
|
371
|
+
|
372
|
+
subject.name = Factory.string
|
373
|
+
subject.ip = Factory.string
|
374
|
+
subject.port = Factory.integer
|
438
375
|
|
439
|
-
should "call its init procs when validated" do
|
440
|
-
called = false
|
441
|
-
subject.init_procs << proc{ called = true }
|
442
376
|
subject.validate!
|
443
|
-
assert_true
|
377
|
+
assert_true subject.valid?
|
444
378
|
end
|
445
379
|
|
446
|
-
should "
|
447
|
-
subject.name = nil
|
448
|
-
assert_raises(InvalidError){ subject.validate! }
|
380
|
+
should "complain if validating and its name/ip/port is nil" do
|
449
381
|
subject.name = Factory.string
|
382
|
+
subject.ip = Factory.string
|
383
|
+
subject.port = Factory.integer
|
450
384
|
|
451
|
-
|
385
|
+
a = [:name, :ip, :port].sample
|
386
|
+
subject.send("#{a}=", nil)
|
452
387
|
assert_raises(InvalidError){ subject.validate! }
|
453
|
-
|
388
|
+
end
|
454
389
|
|
455
|
-
|
456
|
-
|
390
|
+
should "complain if validating and its worker class isn't a Worker" do
|
391
|
+
subject.name = Factory.string
|
392
|
+
subject.ip = Factory.string
|
457
393
|
subject.port = Factory.integer
|
458
394
|
|
459
|
-
assert_nothing_raised{ subject.validate! }
|
460
|
-
end
|
461
|
-
|
462
|
-
should "validate its worker class when validated" do
|
463
395
|
subject.worker_class = Module.new
|
464
396
|
assert_raises(InvalidError){ subject.validate! }
|
465
397
|
|
@@ -467,17 +399,44 @@ module Sanford::Server
|
|
467
399
|
assert_raises(InvalidError){ subject.validate! }
|
468
400
|
end
|
469
401
|
|
470
|
-
|
471
|
-
|
472
|
-
|
402
|
+
end
|
403
|
+
|
404
|
+
class ValidationTests < ConfigTests
|
405
|
+
desc "when successfully validated"
|
406
|
+
setup do
|
407
|
+
@router = Sanford::Router.new
|
408
|
+
@router_validate_called = false
|
409
|
+
Assert.stub(@router, :validate!){ @router_validate_called = true }
|
410
|
+
|
411
|
+
@config = Config.new.tap do |c|
|
412
|
+
c.name = Factory.string
|
413
|
+
c.ip = Factory.string
|
414
|
+
c.port = Factory.integer
|
415
|
+
c.router = @router
|
416
|
+
end
|
417
|
+
|
418
|
+
@initialized = false
|
419
|
+
@config.init_procs << proc{ @initialized = true }
|
420
|
+
|
421
|
+
@other_initialized = false
|
422
|
+
@config.init_procs << proc{ @other_initialized = true }
|
423
|
+
end
|
424
|
+
|
425
|
+
should "call its init procs" do
|
426
|
+
assert_equal false, @initialized
|
427
|
+
assert_equal false, @other_initialized
|
428
|
+
|
473
429
|
subject.validate!
|
474
|
-
|
430
|
+
|
431
|
+
assert_equal true, @initialized
|
432
|
+
assert_equal true, @other_initialized
|
475
433
|
end
|
476
434
|
|
477
|
-
should "
|
478
|
-
assert_false
|
435
|
+
should "call validate! on the router" do
|
436
|
+
assert_false @router_validate_called
|
437
|
+
|
479
438
|
subject.validate!
|
480
|
-
assert_true
|
439
|
+
assert_true @router_validate_called
|
481
440
|
end
|
482
441
|
|
483
442
|
should "only be able to be validated once" do
|
@@ -491,8 +450,6 @@ module Sanford::Server
|
|
491
450
|
|
492
451
|
end
|
493
452
|
|
494
|
-
TestHandler = Class.new
|
495
|
-
|
496
453
|
class TCPServerSpy
|
497
454
|
attr_reader :set_socket_option_calls
|
498
455
|
|