summaryrefslogtreecommitdiffstats
path: root/spec/unit/application
diff options
context:
space:
mode:
authorJosh Cooper <josh@puppetlabs.com>2011-04-21 14:37:50 -0700
committerJosh Cooper <josh@puppetlabs.com>2011-04-21 14:37:50 -0700
commit01f610bb223b435dc52f491260af3ea002930102 (patch)
tree93565136d5ef2b4156fdd64476792e441bcfbb4e /spec/unit/application
parentac428b9557e2da251e4b51e48de844833ca0aa2a (diff)
parentfc66e98b84b9a16728af054485883334a5887cca (diff)
downloadpuppet-01f610bb223b435dc52f491260af3ea002930102.tar.gz
puppet-01f610bb223b435dc52f491260af3ea002930102.tar.xz
puppet-01f610bb223b435dc52f491260af3ea002930102.zip
Merge branch 'next'
Diffstat (limited to 'spec/unit/application')
-rw-r--r--spec/unit/application/device_spec.rb349
-rwxr-xr-xspec/unit/application/face_base_spec.rb105
-rwxr-xr-xspec/unit/application/indirection_base_spec.rb7
3 files changed, 448 insertions, 13 deletions
diff --git a/spec/unit/application/device_spec.rb b/spec/unit/application/device_spec.rb
new file mode 100644
index 000000000..086e321e9
--- /dev/null
+++ b/spec/unit/application/device_spec.rb
@@ -0,0 +1,349 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+require 'puppet/application/device'
+require 'puppet/util/network_device/config'
+require 'ostruct'
+require 'puppet/configurer'
+
+describe Puppet::Application::Device do
+ before :each do
+ @device = Puppet::Application[:device]
+# @device.stubs(:puts)
+ @device.preinit
+ Puppet::Util::Log.stubs(:newdestination)
+ Puppet::Util::Log.stubs(:level=)
+
+ Puppet::Node.indirection.stubs(:terminus_class=)
+ Puppet::Node.indirection.stubs(:cache_class=)
+ Puppet::Node::Facts.indirection.stubs(:terminus_class=)
+ end
+
+ it "should operate in agent run_mode" do
+ @device.class.run_mode.name.should == :agent
+ end
+
+ it "should ask Puppet::Application to parse Puppet configuration file" do
+ @device.should_parse_config?.should be_true
+ end
+
+ it "should declare a main command" do
+ @device.should respond_to(:main)
+ end
+
+ it "should declare a preinit block" do
+ @device.should respond_to(:preinit)
+ end
+
+ describe "in preinit" do
+ before :each do
+ @device.stubs(:trap)
+ end
+
+ it "should catch INT" do
+ @device.expects(:trap).with { |arg,block| arg == :INT }
+
+ @device.preinit
+ end
+ end
+
+ describe "when handling options" do
+ before do
+ @device.command_line.stubs(:args).returns([])
+ end
+
+ [:centrallogging, :debug, :verbose,].each do |option|
+ it "should declare handle_#{option} method" do
+ @device.should respond_to("handle_#{option}".to_sym)
+ end
+
+ it "should store argument value when calling handle_#{option}" do
+ @device.options.expects(:[]=).with(option, 'arg')
+ @device.send("handle_#{option}".to_sym, 'arg')
+ end
+ end
+
+ it "should set waitforcert to 0 with --onetime and if --waitforcert wasn't given" do
+ Puppet[:onetime] = true
+ Puppet::SSL::Host.any_instance.expects(:wait_for_cert).with(0)
+ @device.setup_host
+ end
+
+ it "should use supplied waitforcert when --onetime is specified" do
+ Puppet[:onetime] = true
+ @device.handle_waitforcert(60)
+ Puppet::SSL::Host.any_instance.expects(:wait_for_cert).with(60)
+ @device.setup_host
+ end
+
+ it "should use a default value for waitforcert when --onetime and --waitforcert are not specified" do
+ Puppet::SSL::Host.any_instance.expects(:wait_for_cert).with(120)
+ @device.setup_host
+ end
+
+ it "should set the log destination with --logdest" do
+ @device.options.stubs(:[]=).with { |opt,val| opt == :setdest }
+ Puppet::Log.expects(:newdestination).with("console")
+
+ @device.handle_logdest("console")
+ end
+
+ it "should put the setdest options to true" do
+ @device.options.expects(:[]=).with(:setdest,true)
+
+ @device.handle_logdest("console")
+ end
+
+ it "should parse the log destination from the command line" do
+ @device.command_line.stubs(:args).returns(%w{--logdest /my/file})
+
+ Puppet::Util::Log.expects(:newdestination).with("/my/file")
+
+ @device.parse_options
+ end
+
+ it "should store the waitforcert options with --waitforcert" do
+ @device.options.expects(:[]=).with(:waitforcert,42)
+
+ @device.handle_waitforcert("42")
+ end
+
+ it "should set args[:Port] with --port" do
+ @device.handle_port("42")
+ @device.args[:Port].should == "42"
+ end
+
+ end
+
+ describe "during setup" do
+ before :each do
+ @device.options.stubs(:[])
+ Puppet.stubs(:info)
+ FileTest.stubs(:exists?).returns(true)
+ Puppet[:libdir] = "/dev/null/lib"
+ Puppet::SSL::Host.stubs(:ca_location=)
+ Puppet::Transaction::Report.indirection.stubs(:terminus_class=)
+ Puppet::Resource::Catalog.indirection.stubs(:terminus_class=)
+ Puppet::Resource::Catalog.indirection.stubs(:cache_class=)
+ Puppet::Node::Facts.indirection.stubs(:terminus_class=)
+ @host = stub_everything 'host'
+ Puppet::SSL::Host.stubs(:new).returns(@host)
+ Puppet.stubs(:settraps)
+ end
+
+ it "should call setup_logs" do
+ @device.expects(:setup_logs)
+ @device.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
+ @device.options.stubs(:[]).with(:debug).returns(true)
+
+ Puppet::Util::Log.expects(:level=).with(:debug)
+
+ @device.setup_logs
+ end
+
+ it "should set log level to info if --verbose was passed" do
+ @device.options.stubs(:[]).with(:verbose).returns(true)
+
+ Puppet::Util::Log.expects(:level=).with(:info)
+
+ @device.setup_logs
+ end
+
+ [:verbose, :debug].each do |level|
+ it "should set console as the log destination with level #{level}" do
+ @device.options.stubs(:[]).with(level).returns(true)
+
+ Puppet::Util::Log.expects(:newdestination).with(:console)
+
+ @device.setup_logs
+ end
+ end
+
+ it "should set syslog as the log destination if no --logdest" do
+ @device.options.stubs(:[]).with(:setdest).returns(false)
+
+ Puppet::Util::Log.expects(:newdestination).with(:syslog)
+
+ @device.setup_logs
+ end
+
+ end
+
+ it "should set a central log destination with --centrallogs" do
+ @device.options.stubs(:[]).with(:centrallogs).returns(true)
+ Puppet[:server] = "puppet.reductivelabs.com"
+ Puppet::Util::Log.stubs(:newdestination).with(:syslog)
+
+ Puppet::Util::Log.expects(:newdestination).with("puppet.reductivelabs.com")
+
+ @device.setup
+ end
+
+ it "should use :main, :agent, :device and :ssl config" do
+ Puppet.settings.expects(:use).with(:main, :agent, :device, :ssl)
+
+ @device.setup
+ end
+
+ it "should install a remote ca location" do
+ Puppet::SSL::Host.expects(:ca_location=).with(:remote)
+
+ @device.setup
+ end
+
+ it "should tell the report handler to use REST" do
+ Puppet::Transaction::Report.indirection.expects(:terminus_class=).with(:rest)
+
+ @device.setup
+ end
+
+ it "should change the catalog_terminus setting to 'rest'" do
+ Puppet[:catalog_terminus] = :foo
+ @device.setup
+ Puppet[:catalog_terminus].should == :rest
+ end
+
+ it "should tell the catalog handler to use cache" do
+ Puppet::Resource::Catalog.indirection.expects(:cache_class=).with(:yaml)
+
+ @device.setup
+ end
+
+ it "should change the facts_terminus setting to 'network_device'" do
+ Puppet[:facts_terminus] = :foo
+
+ @device.setup
+ Puppet[:facts_terminus].should == :network_device
+ end
+ end
+
+ describe "when initializing each devices SSL" do
+ before(:each) do
+ @host = stub_everything 'host'
+ Puppet::SSL::Host.stubs(:new).returns(@host)
+ end
+
+ it "should create a new ssl host" do
+ Puppet::SSL::Host.expects(:new).returns(@host)
+ @device.setup_host
+ end
+
+ it "should wait for a certificate" do
+ @device.options.stubs(:[]).with(:waitforcert).returns(123)
+ @host.expects(:wait_for_cert).with(123)
+
+ @device.setup_host
+ end
+ end
+
+
+ describe "when running" do
+ before :each do
+ @device.options.stubs(:[]).with(:fingerprint).returns(false)
+ Puppet.stubs(:notice)
+ @device.options.stubs(:[]).with(:client)
+ Puppet::Util::NetworkDevice::Config.stubs(:devices).returns({})
+ end
+
+ it "should dispatch to main" do
+ @device.stubs(:main)
+ @device.run_command
+ end
+
+ it "should get the device list" do
+ device_hash = stub_everything 'device hash'
+ Puppet::Util::NetworkDevice::Config.expects(:devices).returns(device_hash)
+ @device.main
+ end
+
+ it "should exit if the device list is empty" do
+ @device.expects(:exit).with(1)
+ @device.main
+ end
+
+ describe "for each device" do
+ before(:each) do
+ Puppet[:vardir] = "/dummy"
+ Puppet[:confdir] = "/dummy"
+ Puppet[:certname] = "certname"
+ @device_hash = {
+ "device1" => OpenStruct.new(:name => "device1", :url => "url", :provider => "cisco"),
+ "device2" => OpenStruct.new(:name => "device2", :url => "url", :provider => "cisco"),
+ }
+ Puppet::Util::NetworkDevice::Config.stubs(:devices).returns(@device_hash)
+ Puppet.settings.stubs(:set_value)
+ Puppet.settings.stubs(:use)
+ @device.stubs(:setup_host)
+ Puppet::Util::NetworkDevice.stubs(:init)
+ @configurer = stub_everything 'configurer'
+ Puppet::Configurer.stubs(:new).returns(@configurer)
+ end
+
+ it "should set vardir to the device vardir" do
+ Puppet.settings.expects(:set_value).with(:vardir, "/dummy/devices/device1", :cli)
+ @device.main
+ end
+
+ it "should set confdir to the device confdir" do
+ Puppet.settings.expects(:set_value).with(:confdir, "/dummy/devices/device1", :cli)
+ @device.main
+ end
+
+ it "should set certname to the device certname" do
+ Puppet.settings.expects(:set_value).with(:certname, "device1", :cli)
+ Puppet.settings.expects(:set_value).with(:certname, "device2", :cli)
+ @device.main
+ end
+
+ it "should make sure all the required folders and files are created" do
+ Puppet.settings.expects(:use).with(:main, :agent, :ssl).twice
+ @device.main
+ end
+
+ it "should initialize the device singleton" do
+ Puppet::Util::NetworkDevice.expects(:init).with(@device_hash["device1"]).then.with(@device_hash["device2"])
+ @device.main
+ end
+
+ it "should setup the SSL context" do
+ @device.expects(:setup_host).twice
+ @device.main
+ end
+
+ it "should launch a configurer for this device" do
+ @configurer.expects(:run).twice
+ @device.main
+ end
+
+ [:vardir, :confdir].each do |setting|
+ it "should cleanup the #{setting} setting after the run" do
+ configurer = states('configurer').starts_as('notrun')
+ Puppet.settings.expects(:set_value).with(setting, "/dummy/devices/device1", :cli).when(configurer.is('notrun'))
+ @configurer.expects(:run).twice.then(configurer.is('run'))
+ Puppet.settings.expects(:set_value).with(setting, "/dummy", :cli).when(configurer.is('run'))
+
+ @device.main
+ end
+ end
+
+ it "should cleanup the certname setting after the run" do
+ configurer = states('configurer').starts_as('notrun')
+ Puppet.settings.expects(:set_value).with(:certname, "device1", :cli).when(configurer.is('notrun'))
+ @configurer.expects(:run).twice.then(configurer.is('run'))
+ Puppet.settings.expects(:set_value).with(:certname, "certname", :cli).when(configurer.is('run'))
+
+ @device.main
+ end
+
+ end
+ end
+end
diff --git a/spec/unit/application/face_base_spec.rb b/spec/unit/application/face_base_spec.rb
index 939712ef8..5403608cf 100755
--- a/spec/unit/application/face_base_spec.rb
+++ b/spec/unit/application/face_base_spec.rb
@@ -11,7 +11,6 @@ describe Puppet::Application::FaceBase do
Puppet::Face.define(:basetest, '0.0.1') do
option("--[no-]boolean")
option("--mandatory MANDATORY")
- option("--optional [OPTIONAL]")
action :foo do
option("--action")
@@ -60,19 +59,39 @@ describe Puppet::Application::FaceBase do
app.face.name.should == :basetest
end
- it "should set the format based on the face default" do
- app.format.should == :pson
- end
-
it "should find the action" do
app.action.should be
app.action.name.should == :foo
end
end
- it "should fail if no action is given" do
- expect { app.preinit; app.parse_options }.
- to raise_error OptionParser::MissingArgument, /No action given/
+ it "should use the default action if not given any arguments" do
+ app.command_line.stubs(:args).returns []
+ action = stub(:options => [])
+ Puppet::Face[:basetest, '0.0.1'].expects(:get_default_action).returns(action)
+ app.stubs(:main)
+ app.run
+ app.action.should == action
+ app.arguments.should == [ { } ]
+ end
+
+ it "should use the default action if not given a valid one" do
+ app.command_line.stubs(:args).returns %w{bar}
+ action = stub(:options => [])
+ Puppet::Face[:basetest, '0.0.1'].expects(:get_default_action).returns(action)
+ app.stubs(:main)
+ app.run
+ app.action.should == action
+ app.arguments.should == [ 'bar', { } ]
+ end
+
+ it "should have no action if not given a valid one and there is no default action" do
+ app.command_line.stubs(:args).returns %w{bar}
+ Puppet::Face[:basetest, '0.0.1'].expects(:get_default_action).returns(nil)
+ app.stubs(:main)
+ app.run
+ app.action.should be_nil
+ app.arguments.should == [ 'bar', { } ]
end
it "should report a sensible error when options with = fail" do
@@ -169,7 +188,6 @@ describe Puppet::Application::FaceBase do
app.face = Puppet::Face[:basetest, '0.0.1']
app.action = app.face.get_action(:foo)
- app.format = :pson
app.arguments = ["myname", "myarg"]
end
@@ -178,10 +196,79 @@ describe Puppet::Application::FaceBase do
app.main
end
+ it "should lookup help when it cannot do anything else" do
+ app.action = nil
+ Puppet::Face[:help, :current].expects(:help).with(:basetest, *app.arguments)
+ app.stubs(:puts) # meh. Don't print nil, thanks. --daniel 2011-04-12
+ app.main
+ end
+
it "should use its render method to render any result" do
app.expects(:render).with(app.arguments.length + 1)
app.stubs(:puts) # meh. Don't print nil, thanks. --daniel 2011-04-12
app.main
end
end
+
+ describe "#render" do
+ before :each do
+ app.face = Puppet::Face[:basetest, '0.0.1']
+ app.action = app.face.get_action(:foo)
+ end
+
+ ["hello", 1, 1.0].each do |input|
+ it "should just return a #{input.class.name}" do
+ app.render(input).should == input
+ end
+ end
+
+ [[1, 2], ["one"], [{ 1 => 1 }]].each do |input|
+ it "should render #{input.class} using the 'pp' library" do
+ app.render(input).should == input.pretty_inspect
+ end
+ end
+
+ it "should render a non-trivially-keyed Hash with the 'pp' library" do
+ hash = { [1,2] => 3, [2,3] => 5, [3,4] => 7 }
+ app.render(hash).should == hash.pretty_inspect
+ end
+
+ it "should render a {String,Numeric}-keyed Hash into a table" do
+ object = Object.new
+ hash = { "one" => 1, "two" => [], "three" => {}, "four" => object,
+ 5 => 5, 6.0 => 6 }
+
+ # Gotta love ASCII-betical sort order. Hope your objects are better
+ # structured for display than my test one is. --daniel 2011-04-18
+ app.render(hash).should == <<EOT
+5 5
+6.0 6
+four #{object.pretty_inspect.chomp}
+one 1
+three {}
+two []
+EOT
+ end
+
+ it "should render a hash nicely with a multi-line value" do
+ hash = {
+ "number" => { "1" => '1' * 40, "2" => '2' * 40, '3' => '3' * 40 },
+ "text" => { "a" => 'a' * 40, 'b' => 'b' * 40, 'c' => 'c' * 40 }
+ }
+ app.render(hash).should == <<EOT
+number {"1"=>"1111111111111111111111111111111111111111",
+ "2"=>"2222222222222222222222222222222222222222",
+ "3"=>"3333333333333333333333333333333333333333"}
+text {"a"=>"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+ "b"=>"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+ "c"=>"cccccccccccccccccccccccccccccccccccccccc"}
+EOT
+ end
+
+ it "should invoke the action rendering hook while rendering" do
+ app.action.set_rendering_method_for(:for_humans, proc { |value| "bi-winning!" })
+ app.action.render_as = :for_humans
+ app.render("bi-polar?").should == "bi-winning!"
+ end
+ end
end
diff --git a/spec/unit/application/indirection_base_spec.rb b/spec/unit/application/indirection_base_spec.rb
index 63ab11eed..57740384a 100755
--- a/spec/unit/application/indirection_base_spec.rb
+++ b/spec/unit/application/indirection_base_spec.rb
@@ -23,12 +23,11 @@ describe Puppet::Application::IndirectionBase do
it "should accept a terminus command line option" do
# It would be nice not to have to stub this, but whatever... writing an
# entire indirection stack would cause us more grief. --daniel 2011-03-31
- terminus = mock("test indirection terminus")
+ terminus = stub_everything("test indirection terminus")
Puppet::Indirector::Indirection.expects(:instance).
- with(:testindirection).twice.returns()
+ with(:testindirection).returns(terminus)
- subject.command_line.
- instance_variable_set('@args', %w{--terminus foo save})
+ subject.command_line.instance_variable_set('@args', %w{--terminus foo save})
# Not a very nice thing. :(
$stderr.stubs(:puts)