summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/puppet/network/http.rb20
-rw-r--r--lib/puppet/network/http/mongrel.rb2
-rw-r--r--lib/puppet/network/http/webrick.rb2
-rw-r--r--lib/puppet/network/server.rb15
-rw-r--r--spec/unit/network/http.rb13
-rw-r--r--spec/unit/network/server.rb111
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