diff --git a/spec/unit/provider/host/parsed_spec.rb b/spec/unit/provider/host/parsed_spec.rb new file mode 100755 index 000000000..08254e608 --- /dev/null +++ b/spec/unit/provider/host/parsed_spec.rb @@ -0,0 +1,152 @@ +#!/usr/bin/env ruby + +require File.dirname(__FILE__) + '/../../../spec_helper' + +require 'puppet_spec/files' +require 'puppettest/support/utils' +require 'puppettest/fileparsing' + +provider_class = Puppet::Type.type(:host).provider(:parsed) + +describe provider_class do + include PuppetSpec::Files + extend PuppetTest::Support::Utils + include PuppetTest::FileParsing + + before do + @host_class = Puppet::Type.type(:host) + @provider = @host_class.provider(:parsed) + @hostfile = tmpfile('hosts') + @provider.any_instance.stubs(:target).returns @hostfile + end + + after :each do + @provider.initvars + end + + def mkhost(args) + hostresource = Puppet::Type::Host.new(:name => args[:name]) + hostresource.stubs(:should).with(:target).returns @hostfile + + # Using setters of provider + host = @provider.new(hostresource) + args.each do |property,value| + host.send("#{property}=", value) + end + host + end + + def genhost(host) + @provider.stubs(:filetype).returns(Puppet::Util::FileType::FileTypeRam) + File.stubs(:chown) + File.stubs(:chmod) + Puppet::Util::SUIDManager.stubs(:asuser).yields + host.flush + @provider.target_object(@hostfile).read + end + + describe "when parsing a line with ip and hostname" do + + it "should parse an ipv4 from the first field" do + @provider.parse_line("127.0.0.1 localhost")[:ip].should == "127.0.0.1" + end + + it "should parse an ipv6 from the first field" do + @provider.parse_line("::1 localhost")[:ip].should == "::1" + end + + it "should parse the name from the second field" do + @provider.parse_line("::1 localhost")[:name].should == "localhost" + end + + end + + describe "when parsing a line with ip, hostname and comment" do + before do + @testline = "127.0.0.1 localhost # A comment with a #-char" + end + + it "should parse the ip from the first field" do + @provider.parse_line(@testline)[:ip].should == "127.0.0.1" + end + + it "should parse the hostname from the second field" do + @provider.parse_line(@testline)[:name].should == "localhost" + end + + end + + describe "when parsing a line with ip, hostname and aliases" do + + it "should parse alias from the third field" do + @provider.parse_line("127.0.0.1 localhost localhost.localdomain")[:host_aliases].should == ["localhost.localdomain"] + end + + it "should parse multiple aliases" do + @provider.parse_line("127.0.0.1 host alias1 alias2")[:host_aliases].should == ['alias1', 'alias2'] + @provider.parse_line("127.0.0.1 host alias1\talias2")[:host_aliases].should == ['alias1', 'alias2'] + @provider.parse_line("127.0.0.1 host alias1\talias2 alias3")[:host_aliases].should == ['alias1', 'alias2', 'alias3'] + end + + end + + describe "when parsing a line with ip, hostname, aliases and comment" do + + before do + # Just playing with a few different delimiters + @testline = "127.0.0.1\t host alias1\talias2 alias3 # A comment with a #-char" + end + + it "should parse the ip from the first field" do + @provider.parse_line(@testline)[:ip].should == "127.0.0.1" + end + + it "should parse the hostname from the second field" do + @provider.parse_line(@testline)[:name].should == "host" + end + + it "should parse all host_aliases from the third field" do + @provider.parse_line(@testline)[:host_aliases].should == ['alias1' ,'alias2', 'alias3'] + end + + end + + describe "when operating on /etc/hosts like files" do + fakedata("data/providers/host/parsed","valid*").each do |file| + it "should be able to parse #{file}" do + fakedataparse(file) + end + end + + it "should be able to generate a simple hostfile entry" do + host = mkhost( + :name => 'localhost', + :ip => '127.0.0.1', + :ensure => :present + ) + genhost(host).should == "127.0.0.1\tlocalhost\n" + end + + it "should be able to generate an entry with one alias" do + host = mkhost( + :name => 'localhost.localdomain', + :ip => '127.0.0.1', + :host_aliases => ['localhost'], + :ensure => :present + ) + genhost(host).should == "127.0.0.1\tlocalhost.localdomain\tlocalhost\n" + end + + it "should be able to generate an entry with more than one alias" do + host = mkhost( + :name => 'host', + :ip => '192.0.0.1', + :host_aliases => [ 'a1','a2','a3','a4' ], + :ensure => :present + ) + genhost(host).should == "192.0.0.1\thost\ta1\ta2\ta3\ta4\n" + end + + end + +end diff --git a/spec/unit/type/host_spec.rb b/spec/unit/type/host_spec.rb new file mode 100755 index 000000000..43846b236 --- /dev/null +++ b/spec/unit/type/host_spec.rb @@ -0,0 +1,85 @@ +#!/usr/bin/env ruby + +require File.dirname(__FILE__) + '/../../spec_helper' + +ssh_authorized_key = Puppet::Type.type(:ssh_authorized_key) + +describe Puppet::Type.type(:host) do + before do + @class = Puppet::Type.type(:host) + @catalog = Puppet::Resource::Catalog.new + end + + it "should have :name be its namevar" do + @class.key_attributes.should == [:name] + end + + describe "when validating attributes" do + [:name, :provider ].each do |param| + it "should have a #{param} parameter" do + @class.attrtype(param).should == :param + end + end + + [:ip, :target, :host_aliases, :ensure].each do |property| + it "should have a #{property} property" do + @class.attrtype(property).should == :property + end + end + end + + describe "when validating values" do + it "should support present as a value for ensure" do + proc { @class.new(:name => "foo", :ensure => :present) }.should_not raise_error + end + + it "should support absent as a value for ensure" do + proc { @class.new(:name => "foo", :ensure => :absent) }.should_not raise_error + end + + it "should accept IPv4 addresses" do + proc { @class.new(:name => "foo", :ip => '10.96.0.1') }.should_not raise_error + end + + it "should accept long IPv6 addresses" do + # Taken from wikipedia article about ipv6 + proc { @class.new(:name => "foo", :ip => '2001:0db8:85a3:08d3:1319:8a2e:0370:7344') }.should_not raise_error + end + + it "should accept one host_alias" do + proc { @class.new(:name => "foo", :host_aliases => 'alias1') }.should_not raise_error + end + + it "should accept multiple host_aliases" do + proc { @class.new(:name => "foo", :host_aliases => [ 'alias1', 'alias2' ]) }.should_not raise_error + end + + it "should accept shortened IPv6 addresses" do + proc { @class.new(:name => "foo", :ip => '2001:db8:0:8d3:0:8a2e:70:7344') }.should_not raise_error + proc { @class.new(:name => "foo", :ip => '::ffff:192.0.2.128') }.should_not raise_error + proc { @class.new(:name => "foo", :ip => '::1') }.should_not raise_error + end + + it "should not accept malformed IPv4 addresses like 192.168.0.300" do + pending + proc { @class.new(:name => "foo", :ip => '192.168.0.300') }.should raise_error + end + + it "should not accept malformed IP addresses like 2001:0dg8:85a3:08d3:1319:8a2e:0370:7344" do + proc { @class.new(:name => "foo", :ip => '2001:0dg8:85a3:08d3:1319:8a2e:0370:7344') }.should raise_error + end + + it "should not accept spaces in resourcename" do + proc { @class.new(:name => "foo bar") }.should raise_error + end + + it "should not accept host_aliases with spaces" do + proc { @class.new(:name => "foo", :host_aliases => [ 'well_formed', 'not wellformed' ]) }.should raise_error + end + + it "should not accept empty host_aliases" do + pending + proc { @class.new(:name => "foo", :host_aliases => ['alias1','']) }.should raise_error + end + end +end diff --git a/test/data/providers/host/parsed/valid_hosts b/test/data/providers/host/parsed/valid_hosts new file mode 100644 index 000000000..de5caf740 --- /dev/null +++ b/test/data/providers/host/parsed/valid_hosts @@ -0,0 +1,14 @@ +# Some leading comment, that should be ignored +# The next line is empty so it should be ignored + +::1 localhost + +# We now try another delimiter: Several tabs +127.0.0.1 localhost + +# No test trailing spaces +10.0.0.1 host1 + +# Ok its time to test aliases +2001:252:0:1::2008:8 ipv6host alias1 +192.168.0.1 ipv4host alias2 alias3