sanford 0.10.1 → 0.11.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.
- data/Gemfile +1 -1
- data/README.md +41 -56
- data/Rakefile +0 -1
- data/bench/client.rb +8 -3
- data/bench/{services.rb → config.sanford} +11 -6
- data/bench/{runner.rb → report.rb} +2 -2
- data/bench/report.txt +32 -32
- data/lib/sanford/cli.rb +42 -28
- data/lib/sanford/config_file.rb +79 -0
- data/lib/sanford/{worker.rb → connection_handler.rb} +28 -20
- data/lib/sanford/error_handler.rb +7 -7
- data/lib/sanford/pid_file.rb +42 -0
- data/lib/sanford/process.rb +136 -0
- data/lib/sanford/process_signal.rb +20 -0
- data/lib/sanford/route.rb +48 -0
- data/lib/sanford/router.rb +36 -0
- data/lib/sanford/runner.rb +30 -58
- data/lib/sanford/sanford_runner.rb +19 -9
- data/lib/sanford/server.rb +211 -42
- data/lib/sanford/server_data.rb +47 -0
- data/lib/sanford/service_handler.rb +8 -46
- data/lib/sanford/template_source.rb +19 -2
- data/lib/sanford/test_runner.rb +27 -28
- data/lib/sanford/version.rb +1 -1
- data/lib/sanford.rb +1 -23
- data/sanford.gemspec +4 -5
- data/test/helper.rb +3 -20
- data/test/support/app_server.rb +142 -0
- data/test/support/config.sanford +7 -0
- data/test/support/config_invalid_run.sanford +3 -0
- data/test/support/config_no_run.sanford +0 -0
- data/test/support/fake_server_connection.rb +58 -0
- data/test/support/pid_file_spy.rb +19 -0
- data/test/support/template.erb +1 -0
- data/test/system/server_tests.rb +378 -0
- data/test/system/service_handler_tests.rb +224 -0
- data/test/unit/cli_tests.rb +187 -0
- data/test/unit/config_file_tests.rb +59 -0
- data/test/unit/connection_handler_tests.rb +254 -0
- data/test/unit/error_handler_tests.rb +30 -35
- data/test/unit/pid_file_tests.rb +70 -0
- data/test/unit/process_signal_tests.rb +61 -0
- data/test/unit/process_tests.rb +428 -0
- data/test/unit/route_tests.rb +92 -0
- data/test/unit/router_tests.rb +65 -0
- data/test/unit/runner_tests.rb +61 -15
- data/test/unit/sanford_runner_tests.rb +162 -28
- data/test/unit/sanford_tests.rb +0 -8
- data/test/unit/server_data_tests.rb +87 -0
- data/test/unit/server_tests.rb +502 -21
- data/test/unit/service_handler_tests.rb +114 -219
- data/test/unit/template_engine_tests.rb +1 -1
- data/test/unit/template_source_tests.rb +56 -16
- data/test/unit/test_runner_tests.rb +206 -0
- metadata +67 -67
- data/bench/tasks.rb +0 -41
- data/lib/sanford/config.rb +0 -28
- data/lib/sanford/host.rb +0 -129
- data/lib/sanford/host_data.rb +0 -65
- data/lib/sanford/hosts.rb +0 -38
- data/lib/sanford/manager.rb +0 -275
- data/test/support/fake_connection.rb +0 -36
- data/test/support/helpers.rb +0 -17
- data/test/support/service_handlers.rb +0 -154
- data/test/support/services.rb +0 -123
- data/test/support/simple_client.rb +0 -62
- data/test/system/request_handling_tests.rb +0 -306
- data/test/unit/config_tests.rb +0 -56
- data/test/unit/host_data_tests.rb +0 -71
- data/test/unit/host_tests.rb +0 -141
- data/test/unit/hosts_tests.rb +0 -50
- data/test/unit/manager_tests.rb +0 -195
- data/test/unit/worker_tests.rb +0 -24
data/test/unit/runner_tests.rb
CHANGED
@@ -1,34 +1,80 @@
|
|
1
1
|
require 'assert'
|
2
2
|
require 'sanford/runner'
|
3
3
|
|
4
|
-
require '
|
4
|
+
require 'sanford/server_data'
|
5
|
+
require 'sanford/service_handler'
|
5
6
|
|
6
|
-
|
7
|
+
class Sanford::Runner
|
7
8
|
|
8
9
|
class UnitTests < Assert::Context
|
9
10
|
desc "Sanford::Runner"
|
10
11
|
setup do
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
@handler_class = TestServiceHandler
|
13
|
+
|
14
|
+
@runner_class = Sanford::Runner
|
15
|
+
end
|
16
|
+
subject{ @runner_class }
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
class InitTests < UnitTests
|
21
|
+
desc "when init"
|
22
|
+
setup do
|
23
|
+
@runner = @runner_class.new(@handler_class)
|
16
24
|
end
|
17
25
|
subject{ @runner }
|
18
26
|
|
19
|
-
should
|
20
|
-
should have_readers :
|
21
|
-
should have_imeths :
|
22
|
-
should have_imeths :halt
|
27
|
+
should have_readers :handler_class, :handler
|
28
|
+
should have_readers :request, :params, :logger, :template_source
|
29
|
+
should have_imeths :run
|
30
|
+
should have_imeths :halt
|
23
31
|
|
24
|
-
should "
|
25
|
-
|
26
|
-
|
32
|
+
should "know its handler class and handler" do
|
33
|
+
assert_equal @handler_class, subject.handler_class
|
34
|
+
assert_instance_of @handler_class, subject.handler
|
35
|
+
end
|
36
|
+
|
37
|
+
should "not set its request, params, logger or template source" do
|
38
|
+
assert_nil subject.request
|
39
|
+
assert_nil subject.params
|
40
|
+
assert_nil subject.logger
|
41
|
+
assert_nil subject.template_source
|
42
|
+
end
|
43
|
+
|
44
|
+
should "throw halt with response args using `halt`" do
|
45
|
+
code = Factory.integer
|
46
|
+
message = Factory.string
|
47
|
+
data = Factory.string
|
48
|
+
|
49
|
+
result = catch(:halt) do
|
50
|
+
subject.halt(code, :message => message, :data => data)
|
27
51
|
end
|
52
|
+
assert_instance_of ResponseArgs, result
|
53
|
+
assert_equal [ code, message ], result.status
|
54
|
+
assert_equal data, result.data
|
55
|
+
end
|
56
|
+
|
57
|
+
should "accept string keys using `halt`" do
|
58
|
+
code = Factory.integer
|
59
|
+
message = Factory.string
|
60
|
+
data = Factory.string
|
61
|
+
|
62
|
+
result = catch(:halt) do
|
63
|
+
subject.halt(code, 'message' => message, 'data' => data)
|
64
|
+
end
|
65
|
+
assert_instance_of ResponseArgs, result
|
66
|
+
assert_equal [ code, message ], result.status
|
67
|
+
assert_equal data, result.data
|
68
|
+
end
|
69
|
+
|
70
|
+
should "raise a not implemented error when run" do
|
71
|
+
assert_raises(NotImplementedError){ subject.run }
|
28
72
|
end
|
29
73
|
|
30
74
|
end
|
31
75
|
|
32
|
-
|
76
|
+
class TestServiceHandler
|
77
|
+
include Sanford::ServiceHandler
|
78
|
+
end
|
33
79
|
|
34
80
|
end
|
@@ -1,29 +1,29 @@
|
|
1
1
|
require 'assert'
|
2
2
|
require 'sanford/sanford_runner'
|
3
3
|
|
4
|
-
require 'sanford/
|
5
|
-
require '
|
4
|
+
require 'sanford/server_data'
|
5
|
+
require 'sanford/service_handler'
|
6
6
|
|
7
7
|
class Sanford::SanfordRunner
|
8
8
|
|
9
9
|
class UnitTests < Assert::Context
|
10
10
|
desc "Sanford::SanfordRunner"
|
11
11
|
setup do
|
12
|
+
@handler_class = TestServiceHandler
|
13
|
+
@request = Sanford::Protocol::Request.new(Factory.string, {
|
14
|
+
:something => Factory.string
|
15
|
+
})
|
16
|
+
@server_data = Sanford::ServerData.new({
|
17
|
+
:logger => Factory.string,
|
18
|
+
:template_source => Factory.string
|
19
|
+
})
|
20
|
+
|
12
21
|
@runner_class = Sanford::SanfordRunner
|
13
22
|
end
|
14
23
|
subject{ @runner_class }
|
15
24
|
|
16
|
-
should "be a
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
should "be able to build a runner with a handler class and params and run it" do
|
21
|
-
response = nil
|
22
|
-
assert_nothing_raised do
|
23
|
-
response = subject.run(BasicServiceHandler, {})
|
24
|
-
end
|
25
|
-
|
26
|
-
assert_equal 200, response.code
|
25
|
+
should "be a runner" do
|
26
|
+
assert_true subject < Sanford::Runner
|
27
27
|
end
|
28
28
|
|
29
29
|
end
|
@@ -31,36 +31,170 @@ class Sanford::SanfordRunner
|
|
31
31
|
class InitTests < UnitTests
|
32
32
|
desc "when init"
|
33
33
|
setup do
|
34
|
-
@
|
35
|
-
@runner = @runner_class.new(BasicServiceHandler, @request)
|
34
|
+
@runner = @runner_class.new(@handler_class, @request, @server_data)
|
36
35
|
end
|
37
36
|
subject{ @runner }
|
38
37
|
|
39
|
-
should "
|
40
|
-
|
38
|
+
should "know its request, params, logger and template source" do
|
39
|
+
assert_equal @request, subject.request
|
40
|
+
assert_equal @request.params, subject.params
|
41
|
+
assert_equal @server_data.logger, subject.logger
|
42
|
+
assert_equal @server_data.template_source, subject.template_source
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
class RunTests < InitTests
|
48
|
+
desc "and run"
|
49
|
+
setup do
|
50
|
+
@handler = @runner.handler
|
51
|
+
@response = @runner.run
|
52
|
+
end
|
53
|
+
subject{ @response }
|
54
|
+
|
55
|
+
should "run the handlers before callbacks" do
|
56
|
+
assert_equal 1, @handler.first_before_call_order
|
57
|
+
assert_equal 2, @handler.second_before_call_order
|
58
|
+
end
|
59
|
+
|
60
|
+
should "run the handlers init" do
|
61
|
+
assert_equal 3, @handler.init_call_order
|
62
|
+
end
|
63
|
+
|
64
|
+
should "run the handlers run and use its result to build a response" do
|
65
|
+
assert_equal 4, @handler.run_call_order
|
66
|
+
assert_instance_of Sanford::Protocol::Response, subject
|
67
|
+
assert_equal @handler.response_data, subject.data
|
68
|
+
end
|
41
69
|
|
42
|
-
|
43
|
-
assert_equal
|
44
|
-
assert_equal
|
45
|
-
assert_equal 'joe.test@example.com', response.data['email']
|
70
|
+
should "run the handlers after callbacks" do
|
71
|
+
assert_equal 5, @handler.first_after_call_order
|
72
|
+
assert_equal 6, @handler.second_after_call_order
|
46
73
|
end
|
47
74
|
|
48
75
|
end
|
49
76
|
|
50
|
-
class
|
77
|
+
class RunHaltInBeforeTests < UnitTests
|
78
|
+
desc "running a handler that halts in a before callback"
|
51
79
|
setup do
|
52
|
-
|
80
|
+
req = Sanford::Protocol::Request.new(Factory.string, 'halt' => 'before')
|
81
|
+
runner = @runner_class.new(@handler_class, req, @server_data).tap(&:run)
|
82
|
+
@handler = runner.handler
|
83
|
+
end
|
84
|
+
subject{ @handler }
|
85
|
+
|
86
|
+
should "stop processing when the halt is called" do
|
87
|
+
assert_not_nil subject.first_before_call_order
|
88
|
+
assert_nil subject.second_before_call_order
|
89
|
+
assert_nil subject.init_call_order
|
90
|
+
assert_nil subject.run_call_order
|
91
|
+
assert_nil subject.first_after_call_order
|
92
|
+
assert_nil subject.second_after_call_order
|
53
93
|
end
|
54
94
|
|
55
|
-
|
56
|
-
subject.run
|
95
|
+
end
|
57
96
|
|
58
|
-
|
59
|
-
|
97
|
+
class RunHandlerHaltInitTests < UnitTests
|
98
|
+
desc "running a handler that halts in init"
|
99
|
+
setup do
|
100
|
+
req = Sanford::Protocol::Request.new(Factory.string, 'halt' => 'init')
|
101
|
+
runner = @runner_class.new(@handler_class, req, @server_data).tap(&:run)
|
102
|
+
@handler = runner.handler
|
103
|
+
end
|
104
|
+
subject{ @handler }
|
105
|
+
|
106
|
+
should "stop processing when the halt is called" do
|
107
|
+
assert_not_nil subject.first_before_call_order
|
108
|
+
assert_not_nil subject.second_before_call_order
|
109
|
+
assert_not_nil subject.init_call_order
|
110
|
+
assert_nil subject.run_call_order
|
111
|
+
assert_nil subject.first_after_call_order
|
112
|
+
assert_nil subject.second_after_call_order
|
60
113
|
end
|
61
114
|
|
62
115
|
end
|
63
116
|
|
64
|
-
|
117
|
+
class RunHandlerHaltRunTests < UnitTests
|
118
|
+
desc "running a handler that halts in run"
|
119
|
+
setup do
|
120
|
+
req = Sanford::Protocol::Request.new(Factory.string, 'halt' => 'run')
|
121
|
+
runner = @runner_class.new(@handler_class, req, @server_data).tap(&:run)
|
122
|
+
@handler = runner.handler
|
123
|
+
end
|
124
|
+
subject{ @handler }
|
125
|
+
|
126
|
+
should "stop processing when the halt is called" do
|
127
|
+
assert_not_nil subject.first_before_call_order
|
128
|
+
assert_not_nil subject.second_before_call_order
|
129
|
+
assert_not_nil subject.init_call_order
|
130
|
+
assert_not_nil subject.run_call_order
|
131
|
+
assert_nil subject.first_after_call_order
|
132
|
+
assert_nil subject.second_after_call_order
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
136
|
+
|
137
|
+
class RunHandlerHaltAfterTests < UnitTests
|
138
|
+
desc "running a handler that halts in a after callback"
|
139
|
+
setup do
|
140
|
+
req = Sanford::Protocol::Request.new(Factory.string, 'halt' => 'after')
|
141
|
+
runner = @runner_class.new(@handler_class, req, @server_data).tap(&:run)
|
142
|
+
@handler = runner.handler
|
143
|
+
end
|
144
|
+
subject{ @handler }
|
145
|
+
|
146
|
+
should "stop processing when the halt is called" do
|
147
|
+
assert_not_nil subject.first_before_call_order
|
148
|
+
assert_not_nil subject.second_before_call_order
|
149
|
+
assert_not_nil subject.init_call_order
|
150
|
+
assert_not_nil subject.run_call_order
|
151
|
+
assert_not_nil subject.first_after_call_order
|
152
|
+
assert_nil subject.second_after_call_order
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
156
|
+
|
157
|
+
class TestServiceHandler
|
158
|
+
include Sanford::ServiceHandler
|
159
|
+
|
160
|
+
attr_reader :first_before_call_order, :second_before_call_order
|
161
|
+
attr_reader :first_after_call_order, :second_after_call_order
|
162
|
+
attr_reader :init_call_order, :run_call_order
|
163
|
+
attr_reader :response_data
|
164
|
+
|
165
|
+
before do
|
166
|
+
@first_before_call_order = next_call_order
|
167
|
+
halt_if('before')
|
168
|
+
end
|
169
|
+
before{ @second_before_call_order = next_call_order }
|
170
|
+
|
171
|
+
after do
|
172
|
+
@first_after_call_order = next_call_order
|
173
|
+
halt_if('after')
|
174
|
+
end
|
175
|
+
after{ @second_after_call_order = next_call_order }
|
176
|
+
|
177
|
+
def init!
|
178
|
+
@init_call_order = next_call_order
|
179
|
+
halt_if('init')
|
180
|
+
end
|
181
|
+
|
182
|
+
def run!
|
183
|
+
@run_call_order = next_call_order
|
184
|
+
halt_if('run')
|
185
|
+
@response_data ||= Factory.string
|
186
|
+
end
|
187
|
+
|
188
|
+
private
|
189
|
+
|
190
|
+
def next_call_order
|
191
|
+
@order ||= 0
|
192
|
+
@order += 1
|
193
|
+
end
|
194
|
+
|
195
|
+
def halt_if(value)
|
196
|
+
halt Factory.integer if params['halt'] == value
|
197
|
+
end
|
198
|
+
end
|
65
199
|
|
66
200
|
end
|
data/test/unit/sanford_tests.rb
CHANGED
@@ -1,20 +1,12 @@
|
|
1
1
|
require 'assert'
|
2
2
|
require 'sanford'
|
3
3
|
|
4
|
-
require 'sanford/config'
|
5
|
-
|
6
4
|
module Sanford
|
7
5
|
|
8
6
|
class UnitTests < Assert::Context
|
9
7
|
desc "Sanford"
|
10
8
|
subject{ Sanford }
|
11
9
|
|
12
|
-
should have_imeths :config, :configure, :init, :register, :hosts
|
13
|
-
|
14
|
-
should "return a `Config` instance with the `config` method" do
|
15
|
-
assert_kind_of Sanford::Config, subject.config
|
16
|
-
end
|
17
|
-
|
18
10
|
end
|
19
11
|
|
20
12
|
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'assert'
|
2
|
+
require 'sanford/server_data'
|
3
|
+
|
4
|
+
require 'sanford/route'
|
5
|
+
|
6
|
+
class Sanford::ServerData
|
7
|
+
|
8
|
+
class UnitTests < Assert::Context
|
9
|
+
desc "Sanford::ServerData"
|
10
|
+
setup do
|
11
|
+
@name = Factory.string
|
12
|
+
@ip = Factory.string
|
13
|
+
@port = Factory.integer
|
14
|
+
@pid_file = Factory.file_path
|
15
|
+
@logger = Factory.string
|
16
|
+
@verbose_logging = Factory.boolean
|
17
|
+
@receives_keep_alive = Factory.boolean
|
18
|
+
@error_procs = [ proc{ } ]
|
19
|
+
@route = Sanford::Route.new(Factory.string, TestHandler.to_s).tap(&:validate!)
|
20
|
+
|
21
|
+
@server_data = Sanford::ServerData.new({
|
22
|
+
:name => @name,
|
23
|
+
:ip => @ip,
|
24
|
+
:port => @port,
|
25
|
+
:pid_file => @pid_file,
|
26
|
+
:logger => @logger,
|
27
|
+
:verbose_logging => @verbose_logging,
|
28
|
+
:receives_keep_alive => @receives_keep_alive,
|
29
|
+
:error_procs => @error_procs,
|
30
|
+
:routes => [ @route ]
|
31
|
+
})
|
32
|
+
end
|
33
|
+
subject{ @server_data }
|
34
|
+
|
35
|
+
should have_readers :name
|
36
|
+
should have_readers :ip, :port
|
37
|
+
should have_readers :pid_file
|
38
|
+
should have_readers :logger, :verbose_logging
|
39
|
+
should have_readers :receives_keep_alive
|
40
|
+
should have_readers :error_procs
|
41
|
+
should have_readers :routes
|
42
|
+
|
43
|
+
should "know its attributes" do
|
44
|
+
assert_equal @name, subject.name
|
45
|
+
assert_equal @ip, subject.ip
|
46
|
+
assert_equal @port, subject.port
|
47
|
+
assert_equal @pid_file, subject.pid_file
|
48
|
+
assert_equal @logger, subject.logger
|
49
|
+
assert_equal @verbose_logging, subject.verbose_logging
|
50
|
+
assert_equal @receives_keep_alive, subject.receives_keep_alive
|
51
|
+
assert_equal @error_procs, subject.error_procs
|
52
|
+
end
|
53
|
+
|
54
|
+
should "build a routes lookup hash" do
|
55
|
+
expected = { @route.name => @route }
|
56
|
+
assert_equal expected, subject.routes
|
57
|
+
end
|
58
|
+
|
59
|
+
should "allow lookup a route using `route_for`" do
|
60
|
+
route = subject.route_for(@route.name)
|
61
|
+
assert_equal @route, route
|
62
|
+
end
|
63
|
+
|
64
|
+
should "raise a not found error using `route_for` with an invalid name" do
|
65
|
+
assert_raises(Sanford::NotFoundError) do
|
66
|
+
subject.route_for(Factory.string)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
should "default its attributes when they aren't provided" do
|
71
|
+
server_data = Sanford::ServerData.new
|
72
|
+
assert_nil server_data.name
|
73
|
+
assert_nil server_data.ip
|
74
|
+
assert_nil server_data.port
|
75
|
+
assert_nil server_data.pid_file
|
76
|
+
assert_nil server_data.logger
|
77
|
+
assert_false server_data.verbose_logging
|
78
|
+
assert_false server_data.receives_keep_alive
|
79
|
+
assert_equal [], server_data.error_procs
|
80
|
+
assert_equal({}, server_data.routes)
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
TestHandler = Class.new
|
86
|
+
|
87
|
+
end
|