sanford 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. data/bench/report.txt +34 -4
  2. data/bench/runner.rb +122 -1
  3. data/bench/services.rb +5 -2
  4. data/lib/sanford/error_handler.rb +60 -0
  5. data/lib/sanford/exceptions.rb +11 -10
  6. data/lib/sanford/host.rb +79 -101
  7. data/lib/sanford/host_data.rb +55 -0
  8. data/lib/sanford/logger.rb +23 -0
  9. data/lib/sanford/manager.rb +13 -22
  10. data/lib/sanford/rake.rb +1 -0
  11. data/lib/sanford/runner.rb +50 -0
  12. data/lib/sanford/server.rb +31 -15
  13. data/lib/sanford/service_handler.rb +34 -43
  14. data/lib/sanford/test_runner.rb +47 -0
  15. data/lib/sanford/version.rb +1 -1
  16. data/lib/sanford/worker.rb +124 -0
  17. data/lib/sanford.rb +49 -6
  18. data/sanford.gemspec +1 -1
  19. data/test/helper.rb +1 -0
  20. data/test/support/fake_connection.rb +18 -0
  21. data/test/support/helpers.rb +6 -10
  22. data/test/support/service_handlers.rb +56 -68
  23. data/test/support/services.rb +55 -10
  24. data/test/system/managing_test.rb +18 -18
  25. data/test/system/request_handling_test.rb +10 -100
  26. data/test/unit/config_test.rb +1 -43
  27. data/test/unit/error_handler_test.rb +133 -0
  28. data/test/unit/host_configuration_test.rb +41 -0
  29. data/test/unit/host_data_test.rb +65 -0
  30. data/test/unit/host_test.rb +20 -112
  31. data/test/unit/{host/version_group_test.rb → host_version_group_test.rb} +0 -0
  32. data/test/unit/hosts_test.rb +56 -0
  33. data/test/unit/manager_test.rb +3 -3
  34. data/test/unit/runner_test.rb +26 -0
  35. data/test/unit/server_test.rb +10 -2
  36. data/test/unit/service_handler_test.rb +126 -115
  37. data/test/unit/worker_test.rb +195 -0
  38. metadata +28 -16
  39. data/lib/sanford/config.rb +0 -33
  40. data/lib/sanford/connection.rb +0 -70
  41. data/lib/sanford/exception_handler.rb +0 -43
  42. data/test/unit/connection_test.rb +0 -23
  43. data/test/unit/exception_handler_test.rb +0 -69
@@ -1,70 +0,0 @@
1
- # Sanford's connection class is an extesion of the connection class provided by
2
- # Sanford-Protocol. It provides the main process of reading a request, routing
3
- # it and writing a response. All requests are benchmarked and logged. The
4
- # connection's `process` method should always try to return a response, so that
5
- # clients do not have to timeout.
6
- #
7
- # Notes:
8
- # * This class is separated from `Sanford::Server` to help with thread safety.
9
- # The server creates a new instance of this class per connection, which means
10
- # there is a separate connection per thread.
11
- #
12
- require 'benchmark'
13
- require 'sanford-protocol'
14
-
15
- require 'sanford/exceptions'
16
-
17
- module Sanford
18
-
19
- class Connection < Sanford::Protocol::Connection
20
-
21
- DEFAULT_TIMEOUT = 1
22
-
23
- attr_reader :service_host, :logger, :exception_handler, :timeout
24
-
25
- def initialize(service_host, client_socket)
26
- @service_host = service_host
27
- @exception_handler = self.service_host.exception_handler
28
- @logger = self.service_host.logger
29
- @timeout = (ENV['SANFORD_TIMEOUT'] || DEFAULT_TIMEOUT).to_f
30
- super(client_socket)
31
- end
32
-
33
- def process
34
- response = nil
35
- self.logger.info("Received request")
36
- benchmark = Benchmark.measure do
37
- begin
38
- request = Sanford::Protocol::Request.parse(self.read(self.timeout))
39
- self.log_request(request)
40
- response = Sanford::Protocol::Response.new(*self.run(request))
41
- rescue Exception => exception
42
- handler = self.exception_handler.new(exception, self.logger)
43
- response = handler.response
44
- ensure
45
- self.write(response.to_hash)
46
- end
47
- end
48
- time_taken = self.round_time(benchmark.real)
49
- self.logger.info("Completed in #{time_taken}ms #{response.status}\n")
50
- end
51
-
52
- protected
53
-
54
- def run(request)
55
- self.service_host.run(request)
56
- end
57
-
58
- def log_request(request)
59
- self.logger.info(" Version: #{request.version.inspect}")
60
- self.logger.info(" Service: #{request.name.inspect}")
61
- self.logger.info(" Parameters: #{request.params.inspect}")
62
- end
63
-
64
- def round_time(time_in_seconds)
65
- ((time_in_seconds * 1000.to_f) + 0.5).to_i
66
- end
67
-
68
- end
69
-
70
- end
@@ -1,43 +0,0 @@
1
- # Sanford's exception handler class takes an exception and builds a valid
2
- # response. For certain exceptions, Sanford will use special response codes and
3
- # for all others it will classify them as generic error requests.
4
- #
5
- require 'sanford-protocol'
6
-
7
- require 'sanford/exceptions'
8
-
9
- module Sanford
10
-
11
- class ExceptionHandler
12
- attr_reader :exception, :logger
13
-
14
- def initialize(exception, logger)
15
- @exception = exception
16
- @logger = logger
17
- end
18
-
19
- def response
20
- self.logger.error("#{exception.class}: #{exception.message}")
21
- self.logger.error(exception.backtrace.join("\n"))
22
- status = Sanford::Protocol::ResponseStatus.new(*self.determine_code_and_message)
23
- Sanford::Protocol::Response.new(status)
24
- end
25
-
26
- protected
27
-
28
- def determine_code_and_message
29
- case(self.exception)
30
- when Sanford::Protocol::BadMessageError, Sanford::Protocol::BadRequestError
31
- [ :bad_request, self.exception.message ]
32
- when Sanford::NotFoundError
33
- [ :not_found ]
34
- when Sanford::Protocol::TimeoutError
35
- [ :timeout ]
36
- when Exception
37
- [ :error, "An unexpected error occurred." ]
38
- end
39
- end
40
-
41
- end
42
-
43
- end
@@ -1,23 +0,0 @@
1
- require 'assert'
2
-
3
- require 'sanford-protocol/test/helpers'
4
-
5
- class Sanford::Connection
6
-
7
- class BaseTest < Assert::Context
8
- include Sanford::Protocol::Test::Helpers
9
-
10
- desc "Sanford::Connection"
11
- setup do
12
- @fake_socket = self.fake_socket_with_request('v1', 'echo', { :message => 'test' })
13
- @connection = Sanford::Connection.new(DummyHost.new, @fake_socket)
14
- end
15
- subject{ @connection }
16
-
17
- should have_instance_methods :service_host, :exception_handler, :logger, :process, :timeout
18
- end
19
-
20
- # The system test `test/system/request_handling_test.rb`, covers all the
21
- # special requests that can occur when given all sorts of invalid requests.
22
-
23
- end
@@ -1,69 +0,0 @@
1
- require 'assert'
2
-
3
- class Sanford::ExceptionHandler
4
-
5
- class BaseTest < Assert::Context
6
- desc "Sanford::Server::ExceptionHandler"
7
- setup do
8
- @exception = nil
9
- begin
10
- raise "test"
11
- rescue Exception => @exception
12
- end
13
- @logger = Sanford::NullLogger.new
14
- @exception_handler = Sanford::ExceptionHandler.new(@exception, @logger)
15
- end
16
- subject{ @exception_handler }
17
-
18
- should have_instance_methods :exception
19
-
20
- should "have built a 500 Sanford::Response" do
21
- response = subject.response
22
-
23
- assert_instance_of Sanford::Protocol::Response, response
24
- assert_equal 500, response.status.code
25
- assert_equal "An unexpected error occurred.", response.status.message
26
- end
27
- end
28
-
29
- class BadRequestTest < BaseTest
30
- desc "with a Sanford::BadRequest exception"
31
- setup do
32
- @exception = nil
33
- begin
34
- raise Sanford::Protocol::BadMessageError, "test"
35
- rescue Exception => @exception
36
- end
37
- @exception_handler = Sanford::ExceptionHandler.new(@exception, @logger)
38
- end
39
-
40
- should "have built a 400 Sanford::Response" do
41
- response = subject.response
42
-
43
- assert_instance_of Sanford::Protocol::Response, response
44
- assert_equal 400, response.status.code
45
- assert_equal "test", response.status.message
46
- end
47
- end
48
-
49
- class NotFoundTest < BaseTest
50
- desc "with a Sanford::NotFound exception"
51
- setup do
52
- @exception = nil
53
- begin
54
- raise Sanford::NotFoundError, "test"
55
- rescue Exception => @exception
56
- end
57
- @exception_handler = Sanford::ExceptionHandler.new(@exception, @logger)
58
- end
59
-
60
- should "have built a 404 Sanford::Response" do
61
- response = subject.response
62
-
63
- assert_instance_of Sanford::Protocol::Response, response
64
- assert_equal 404, response.status.code
65
- assert_equal nil, response.status.message
66
- end
67
- end
68
-
69
- end