summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/puppet/application/puppetqd.rb22
-rwxr-xr-xspec/unit/application/puppetqd.rb185
2 files changed, 197 insertions, 10 deletions
diff --git a/lib/puppet/application/puppetqd.rb b/lib/puppet/application/puppetqd.rb
index 9d2740a81..05bb21fe9 100644
--- a/lib/puppet/application/puppetqd.rb
+++ b/lib/puppet/application/puppetqd.rb
@@ -5,11 +5,14 @@ require 'puppet/resource/catalog'
require 'puppet/indirector/catalog/queue'
Puppet::Application.new(:puppetqd) do
- extend Puppet::Daemon
-
should_parse_config
+ attr_accessor :daemon
+
preinit do
+ @daemon = Puppet::Daemon.new
+ @daemon.argv = ARGV.dup
+
# Do an initial trap, so that cancels don't get a stack trace.
trap(:INT) do
$stderr.puts "Cancelling startup"
@@ -22,8 +25,6 @@ Puppet::Application.new(:puppetqd) do
}.each do |opt,val|
options[opt] = val
end
-
- @args = {}
end
option("--debug","-d")
@@ -37,9 +38,8 @@ Puppet::Application.new(:puppetqd) do
Puppet.notice "Processing queued catalog for %s" % catalog.name
catalog.save
end
- daemonize if Puppet[:daemonize]
- while true do sleep 1000 end
+ sleep_forever()
end
# Handle the logging settings.
@@ -52,10 +52,6 @@ Puppet::Application.new(:puppetqd) do
Puppet::Util::Log.level = :info
end
end
-
- unless options[:setdest]
- Puppet::Util::Log.newdestination(:syslog)
- end
end
setup do
@@ -70,5 +66,11 @@ Puppet::Application.new(:puppetqd) do
end
Puppet::Resource::Catalog.terminus_class = :active_record
+
+ daemon.daemonize if Puppet[:daemonize]
+ end
+
+ def sleep_forever
+ while true do sleep 1000 end
end
end
diff --git a/spec/unit/application/puppetqd.rb b/spec/unit/application/puppetqd.rb
new file mode 100755
index 000000000..198043efc
--- /dev/null
+++ b/spec/unit/application/puppetqd.rb
@@ -0,0 +1,185 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+require 'puppet/application/puppetqd'
+
+describe "puppetqd" do
+ before :each do
+ @puppetqd = Puppet::Application[:puppetqd]
+ @puppetqd.stubs(:puts)
+ @daemon = stub_everything 'daemon', :daemonize => nil
+ Puppet::Util::Log.stubs(:newdestination)
+ Puppet::Util::Log.stubs(:level=)
+
+ Puppet::Resource::Catalog.stubs(:terminus_class=)
+ end
+
+ it "should ask Puppet::Application to parse Puppet configuration file" do
+ @puppetqd.should_parse_config?.should be_true
+ end
+
+ it "should declare a main command" do
+ @puppetqd.should respond_to(:main)
+ end
+
+ it "should declare a preinit block" do
+ @puppetqd.should respond_to(:run_preinit)
+ end
+
+ describe "in preinit" do
+ before :each do
+ @puppetqd.stubs(:trap)
+ end
+
+ it "should catch INT" do
+ @puppetqd.expects(:trap).with { |arg,block| arg == :INT }
+
+ @puppetqd.run_preinit
+ end
+
+ it "should init :verbose to false" do
+ @puppetqd.run_preinit
+
+ @puppetqd.options[:verbose].should be_false
+ end
+
+ it "should init :debug to false" do
+ @puppetqd.run_preinit
+
+ @puppetqd.options[:debug].should be_false
+ end
+
+ it "should create a Daemon instance and copy ARGV to it" do
+ ARGV.expects(:dup).returns "eh"
+ daemon = mock("daemon")
+ daemon.expects(:argv=).with("eh")
+ Puppet::Daemon.expects(:new).returns daemon
+ @puppetqd.run_preinit
+ end
+ end
+
+ describe "when handling options" do
+
+ [:debug, :verbose].each do |option|
+ it "should declare handle_#{option} method" do
+ @puppetqd.should respond_to("handle_#{option}".to_sym)
+ end
+
+ it "should store argument value when calling handle_#{option}" do
+ @puppetqd.options.expects(:[]=).with(option, 'arg')
+ @puppetqd.send("handle_#{option}".to_sym, 'arg')
+ end
+ end
+ end
+
+ describe "during setup" do
+ before :each do
+ @puppetqd.options.stubs(:[])
+ @puppetqd.daemon.stubs(:daemonize)
+ Puppet.stubs(:info)
+ Puppet.features.stubs(:stomp?).returns true
+ Puppet::Resource::Catalog.stubs(:terminus_class=)
+ Puppet.stubs(:settraps)
+ Puppet.settings.stubs(:print_config?)
+ Puppet.settings.stubs(:print_config)
+ end
+
+ it "should fail if the stomp feature is missing" do
+ Puppet.features.expects(:stomp?).returns false
+ lambda { @puppetqd.run_setup }.should raise_error(ArgumentError)
+ end
+
+ it "should print puppet config if asked to in Puppet config" do
+ @puppetqd.stubs(:exit)
+ Puppet.settings.stubs(:print_configs?).returns(true)
+
+ Puppet.settings.expects(:print_configs)
+
+ @puppetqd.run_setup
+ end
+
+ it "should exit after printing puppet config if asked to in Puppet config" do
+ Puppet.settings.stubs(:print_configs?).returns(true)
+
+ lambda { @puppetqd.run_setup }.should raise_error(SystemExit)
+ end
+
+ it "should call setup_logs" do
+ @puppetqd.expects(:setup_logs)
+ @puppetqd.run_setup
+ end
+
+ describe "when setting up logs" do
+ before :each do
+ Puppet::Util::Log.stubs(:newdestination)
+ end
+
+ it "should set log level to debug if --debug was passed" do
+ @puppetqd.options.stubs(:[]).with(:debug).returns(true)
+
+ Puppet::Util::Log.expects(:level=).with(:debug)
+
+ @puppetqd.setup_logs
+ end
+
+ it "should set log level to info if --verbose was passed" do
+ @puppetqd.options.stubs(:[]).with(:verbose).returns(true)
+
+ Puppet::Util::Log.expects(:level=).with(:info)
+
+ @puppetqd.setup_logs
+ end
+
+ [:verbose, :debug].each do |level|
+ it "should set console as the log destination with level #{level}" do
+ @puppetqd.options.stubs(:[]).with(level).returns(true)
+
+ Puppet::Util::Log.expects(:newdestination).with(:console)
+
+ @puppetqd.setup_logs
+ end
+ end
+ end
+
+ it "should configure the Catalog class to use ActiveRecord" do
+ Puppet::Resource::Catalog.expects(:terminus_class=).with(:active_record)
+
+ @puppetqd.run_setup
+ end
+
+ it "should daemonize if needed" do
+ Puppet.expects(:[]).with(:daemonize).returns(true)
+
+ @puppetqd.daemon.expects(:daemonize)
+
+ @puppetqd.run_setup
+ end
+ end
+
+ describe "when running" do
+ before :each do
+ @puppetqd.stubs(:sleep_forever)
+ Puppet::Resource::Catalog::Queue.stubs(:subscribe)
+ end
+
+ it "should subscribe to the queue" do
+ Puppet::Resource::Catalog::Queue.expects(:subscribe)
+ @puppetqd.main
+ end
+
+ it "should log and save each catalog passed by the queue" do
+ catalog = mock 'catalog', :name => 'eh'
+ catalog.expects(:save)
+
+ Puppet::Resource::Catalog::Queue.expects(:subscribe).yields(catalog)
+ Puppet.expects(:notice)
+ @puppetqd.main
+ end
+
+ it "should loop and sleep forever" do
+ @puppetqd.expects(:sleep_forever)
+ @puppetqd.main
+ end
+ end
+end