diff options
-rw-r--r-- | lib/puppet/network/http.rb | 20 | ||||
-rw-r--r-- | lib/puppet/network/http/mongrel.rb | 2 | ||||
-rw-r--r-- | lib/puppet/network/http/webrick.rb | 2 | ||||
-rw-r--r-- | lib/puppet/network/server.rb | 15 | ||||
-rw-r--r-- | spec/unit/network/http.rb | 13 | ||||
-rw-r--r-- | spec/unit/network/server.rb | 111 |
6 files changed, 102 insertions, 61 deletions
diff --git a/lib/puppet/network/http.rb b/lib/puppet/network/http.rb index c46a73159..86784e50e 100644 --- a/lib/puppet/network/http.rb +++ b/lib/puppet/network/http.rb @@ -1,18 +1,10 @@ class Puppet::Network::HTTP - def self.new(args = {}) - raise ArgumentError, ":server_type is required" unless args[:server_type] - obj = class_for_server_type(args[:server_type]).allocate - obj.send :initialize, args.delete_if {|k,v| k == :server_type } - obj - end - - class << self - def class_for_server_type(server_type) - Class.new - # TODO: this will end up probably: { :webrick => ... } - - end - private :class_for_server_type + def self.server_class_by_type(kind) + return Puppet::Network::HTTP::WEBRick if kind == :webrick + return Puppet::Network::HTTP::Mongrel if kind == :mongrel + raise ArgumentError, "Unknown HTTP server name [#{kind}]" end end +require 'puppet/network/http/webrick' +require 'puppet/network/http/mongrel' diff --git a/lib/puppet/network/http/mongrel.rb b/lib/puppet/network/http/mongrel.rb new file mode 100644 index 000000000..dda3c1751 --- /dev/null +++ b/lib/puppet/network/http/mongrel.rb @@ -0,0 +1,2 @@ +class Puppet::Network::HTTP::Mongrel +end diff --git a/lib/puppet/network/http/webrick.rb b/lib/puppet/network/http/webrick.rb new file mode 100644 index 000000000..ad15261f6 --- /dev/null +++ b/lib/puppet/network/http/webrick.rb @@ -0,0 +1,2 @@ +class Puppet::Network::HTTP::WEBRick +end diff --git a/lib/puppet/network/server.rb b/lib/puppet/network/server.rb index 177cce4df..941cb9df1 100644 --- a/lib/puppet/network/server.rb +++ b/lib/puppet/network/server.rb @@ -1,9 +1,10 @@ class Puppet::Network::Server - attr_reader :server_type, :http_server + attr_reader :server_type, :http_server_class, :protocols def initialize(args = {}) @server_type = Puppet[:servertype] or raise "No servertype configuration found." # e.g., WEBrick, Mongrel, etc. @http_server_class = http_server_class_by_type(@server_type) + @protocols = [] @listening = false @routes = {} self.register(args[:handlers]) if args[:handlers] @@ -33,26 +34,24 @@ class Puppet::Network::Server def listen raise "Cannot listen -- already listening." if listening? - initialize_http_server - self.http_server.listen(@routes.dup) + http_server.listen(@routes.dup) @listening = true end def unlisten raise "Cannot unlisten -- not currently listening." unless listening? - self.http_server.unlisten + http_server.unlisten @listening = false end private - def initialize_http_server - @server = @http_server_class.new + def http_server + @http_server ||= http_server_class.new end def http_server_class_by_type(kind) - # TODO: this will become Puppet::Network::HTTP::WEBrick or Puppet::Network::HTTP::Mongrel - Class.new + Puppet::Network::HTTP.server_class_by_type(kind) end end diff --git a/spec/unit/network/http.rb b/spec/unit/network/http.rb index 50ef92866..c488411ff 100644 --- a/spec/unit/network/http.rb +++ b/spec/unit/network/http.rb @@ -8,6 +8,15 @@ require File.dirname(__FILE__) + '/../../spec_helper' require 'puppet/network/http' describe Puppet::Network::HTTP do - it "should require a server type when initializing" - it "should return an instance of the http server class corresponding to the server type" + it "should return the webrick HTTP server class when asked for a webrick server" do + Puppet::Network::HTTP.server_class_by_type(:webrick).should be(Puppet::Network::HTTP::WEBRick) + end + + it "should return the mongrel HTTP server class when asked for a mongrel server" do + Puppet::Network::HTTP.server_class_by_type(:mongrel).should be(Puppet::Network::HTTP::Mongrel) + end + + it "should return an error when asked for an unknown server" do + Proc.new { Puppet::Network::HTTP.server_class_by_type :foo }.should raise_error(ArgumentError) + end end
\ No newline at end of file diff --git a/spec/unit/network/server.rb b/spec/unit/network/server.rb index a23f22058..b2994c6f9 100644 --- a/spec/unit/network/server.rb +++ b/spec/unit/network/server.rb @@ -7,15 +7,13 @@ require File.dirname(__FILE__) + '/../../spec_helper' require 'puppet/network/server' -# a fake server class, so we don't have to implement full autoloading etc. (or at least just yet) just to do testing -class TestServer < Puppet::Network::Server -end describe Puppet::Network::Server, "when initializing" do before do - Puppet::Network::Server.stubs(:server_class_by_name).returns(TestServer) + @mock_http_server_class = mock('http server class') + Puppet::Network::HTTP.stubs(:server_class_by_type).returns(@mock_http_server_class) end - + it "should use the Puppet configurator to determine which HTTP server will be used to provide access to clients" do Puppet.expects(:[]).with(:servertype).returns(:suparserver) @server = Puppet::Network::Server.new @@ -26,6 +24,13 @@ describe Puppet::Network::Server, "when initializing" do Puppet.expects(:[]).with(:servertype).returns(nil) Proc.new { Puppet::Network::Server.new }.should raise_error end + + it "should ask the Puppet::Network::HTTP class to fetch the proper HTTP server class" do + Puppet.stubs(:[]).with(:servertype).returns(:suparserver) + mock_http_server_class = mock('http server class') + Puppet::Network::HTTP.expects(:server_class_by_type).with(:suparserver).returns(mock_http_server_class) + @server = Puppet::Network::Server.new + end it "should allow registering indirections" do @server = Puppet::Network::Server.new(:handlers => [ :foo, :bar, :baz]) @@ -39,7 +44,8 @@ end describe Puppet::Network::Server, "in general" do before do - Puppet::Network::Server.stubs(:server_class_by_name).returns(TestServer) + @mock_http_server_class = mock('http server class') + Puppet::Network::HTTP.stubs(:server_class_by_type).returns(@mock_http_server_class) Puppet.stubs(:[]).with(:servertype).returns(:suparserver) @server = Puppet::Network::Server.new end @@ -105,8 +111,6 @@ describe Puppet::Network::Server, "in general" do @server.server_type.should == :suparserver end - it "should allocate an instance of the appropriate HTTP server" - it "should allow for multiple configurations, each handling different indirections" do @server2 = Puppet::Network::Server.new @server.register(:foo, :bar) @@ -117,42 +121,40 @@ describe Puppet::Network::Server, "in general" do Proc.new { @server2.unregister(:bar) }.should raise_error(ArgumentError) end - it "should provide a means of determining which style of service is being offered to clients" + it "should provide a means of determining which style of service is being offered to clients" do + @server.protocols.should == [] + end end describe Puppet::Network::Server, "when listening is off" do before do - Puppet::Network::Server.stubs(:server_class_by_name).returns(TestServer) + @mock_http_server_class = mock('http server class') + Puppet::Network::HTTP.stubs(:server_class_by_type).returns(@mock_http_server_class) Puppet.stubs(:[]).with(:servertype).returns(:suparserver) @server = Puppet::Network::Server.new @mock_http_server = mock('http server') @mock_http_server.stubs(:listen) @server.stubs(:http_server).returns(@mock_http_server) end - - it "should allow listening to be turned on" do - Proc.new { @server.listen }.should_not raise_error - end - - it "should cause the HTTP server to listen when listening is turned on" do - mock_http_server = mock('http server') - mock_http_server.expects(:listen) - @server.expects(:http_server).returns(mock_http_server) - @server.listen - end + + it "should indicate that it is not listening" do + @server.should_not be_listening + end it "should not allow listening to be turned off" do Proc.new { @server.unlisten }.should raise_error(RuntimeError) end - it "should indicate that it is not listening" do - @server.should_not be_listening - end + it "should allow listening to be turned on" do + Proc.new { @server.listen }.should_not raise_error + end + end describe Puppet::Network::Server, "when listening is on" do before do - Puppet::Network::Server.stubs(:server_class_by_name).returns(TestServer) + @mock_http_server_class = mock('http server class') + Puppet::Network::HTTP.stubs(:server_class_by_type).returns(@mock_http_server_class) Puppet.stubs(:[]).with(:servertype).returns(:suparserver) @server = Puppet::Network::Server.new @mock_http_server = mock('http server') @@ -160,29 +162,64 @@ describe Puppet::Network::Server, "when listening is on" do @mock_http_server.stubs(:unlisten) @server.stubs(:http_server).returns(@mock_http_server) @server.listen - @server.register(:foo) + end + + it "should indicate that listening is turned off" do + @server.should be_listening + end + + it "should not allow listening to be turned on" do + Proc.new { @server.listen }.should raise_error(RuntimeError) end it "should allow listening to be turned off" do Proc.new { @server.unlisten }.should_not raise_error end - - it "should cause the HTTP server to stop listening when listening is turned off" do - mock_http_server = mock('http server') - mock_http_server.expects(:unlisten) - @server.expects(:http_server).returns(mock_http_server) - @server.unlisten +end + +describe Puppet::Network::Server, "when listening is being turned on" do + before do + @mock_http_server_class = mock('http server class') + Puppet::Network::HTTP.stubs(:server_class_by_type).returns(@mock_http_server_class) + Puppet.stubs(:[]).with(:servertype).returns(:suparserver) + @server = Puppet::Network::Server.new + @mock_http_server = mock('http server') + @mock_http_server.stubs(:listen) end - it "should not allow listening to be turned on" do - Proc.new { @server.listen }.should raise_error(RuntimeError) + it "should fetch an instance of an HTTP server when listening is turned on" do + mock_http_server_class = mock('http server class') + mock_http_server_class.expects(:new).returns(@mock_http_server) + @server.expects(:http_server_class).returns(mock_http_server_class) + @server.listen + end + + it "should cause the HTTP server to listen when listening is turned on" do + @mock_http_server.expects(:listen) + @server.expects(:http_server).returns(@mock_http_server) + @server.listen + end +end + +describe Puppet::Network::Server, "when listening is being turned off" do + before do + @mock_http_server_class = mock('http server class') + Puppet::Network::HTTP.stubs(:server_class_by_type).returns(@mock_http_server_class) + Puppet.stubs(:[]).with(:servertype).returns(:suparserver) + @server = Puppet::Network::Server.new + @mock_http_server = mock('http server') + @mock_http_server.stubs(:listen) + @server.stubs(:http_server).returns(@mock_http_server) + @server.listen end - it "should indicate that listening is turned off" do - @server.should be_listening + it "should cause the HTTP server to stop listening when listening is turned off" do + @mock_http_server.expects(:unlisten) + @server.unlisten end - + it "should not allow for indirections to be turned off" do + @server.register(:foo) Proc.new { @server.unregister(:foo) }.should raise_error(RuntimeError) end end |