diff options
| author | Josh Cooper <josh@puppetlabs.com> | 2011-04-21 14:37:50 -0700 |
|---|---|---|
| committer | Josh Cooper <josh@puppetlabs.com> | 2011-04-21 14:37:50 -0700 |
| commit | 01f610bb223b435dc52f491260af3ea002930102 (patch) | |
| tree | 93565136d5ef2b4156fdd64476792e441bcfbb4e /spec/unit/application | |
| parent | ac428b9557e2da251e4b51e48de844833ca0aa2a (diff) | |
| parent | fc66e98b84b9a16728af054485883334a5887cca (diff) | |
| download | puppet-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.rb | 349 | ||||
| -rwxr-xr-x | spec/unit/application/face_base_spec.rb | 105 | ||||
| -rwxr-xr-x | spec/unit/application/indirection_base_spec.rb | 7 |
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) |
