aboutsummaryrefslogtreecommitdiff
path: root/spec/unit/provider/host/parsed_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/unit/provider/host/parsed_spec.rb')
-rw-r--r--spec/unit/provider/host/parsed_spec.rb233
1 files changed, 233 insertions, 0 deletions
diff --git a/spec/unit/provider/host/parsed_spec.rb b/spec/unit/provider/host/parsed_spec.rb
new file mode 100644
index 0000000..b2cba76
--- /dev/null
+++ b/spec/unit/provider/host/parsed_spec.rb
@@ -0,0 +1,233 @@
+#! /usr/bin/env ruby
+require 'spec_helper'
+require 'shared_behaviours/all_parsedfile_providers'
+
+require 'puppet_spec/files'
+
+provider_class = Puppet::Type.type(:host).provider(:parsed)
+
+describe provider_class do
+ include PuppetSpec::Files
+
+ 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 to build our testobject
+ # Note: We already proved, that in case of host_aliases
+ # the provider setter "host_aliases=(value)" will be
+ # called with the joined array, so we just simulate that
+ host = @provider.new(hostresource)
+ args.each do |property,value|
+ value = value.join(" ") if property == :host_aliases and value.is_a?(Array)
+ 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 on incomplete line" do
+
+ it "should work for only ip" do
+ expect(@provider.parse_line("127.0.0.1")[:line]).to eq("127.0.0.1")
+ end
+
+ it "should work for only hostname" do
+ expect(@provider.parse_line("www.example.com")[:line]).to eq("www.example.com")
+ end
+
+ it "should work for ip and space" do
+ expect(@provider.parse_line("127.0.0.1 ")[:line]).to eq("127.0.0.1 ")
+ end
+
+ it "should work for hostname and space" do
+ expect(@provider.parse_line("www.example.com ")[:line]).to eq("www.example.com ")
+ end
+
+ it "should work for hostname and host_aliases" do
+ expect(@provider.parse_line("www.example.com www xyz")[:line]).to eq("www.example.com www xyz")
+ end
+
+ it "should work for ip and comment" do
+ expect(@provider.parse_line("127.0.0.1 #www xyz")[:line]).to eq("127.0.0.1 #www xyz")
+ end
+
+ it "should work for hostname and comment" do
+ expect(@provider.parse_line("xyz #www test123")[:line]).to eq("xyz #www test123")
+ end
+
+ it "should work for crazy incomplete lines" do
+ expect(@provider.parse_line("%th1s is a\t cr$zy !incompl1t line")[:line]).to eq("%th1s is a\t cr$zy !incompl1t line")
+ end
+
+ end
+
+ describe "when parsing a line with ip and hostname" do
+
+ it "should parse an ipv4 from the first field" do
+ expect(@provider.parse_line("127.0.0.1 localhost")[:ip]).to eq("127.0.0.1")
+ end
+
+ it "should parse an ipv6 from the first field" do
+ expect(@provider.parse_line("::1 localhost")[:ip]).to eq("::1")
+ end
+
+ it "should parse the name from the second field" do
+ expect(@provider.parse_line("::1 localhost")[:name]).to eq("localhost")
+ end
+
+ it "should set an empty comment" do
+ expect(@provider.parse_line("::1 localhost")[:comment]).to eq("")
+ end
+
+ it "should set host_aliases to :absent" do
+ expect(@provider.parse_line("::1 localhost")[:host_aliases]).to eq(:absent)
+ 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
+ expect(@provider.parse_line(@testline)[:ip]).to eq("127.0.0.1")
+ end
+
+ it "should parse the hostname from the second field" do
+ expect(@provider.parse_line(@testline)[:name]).to eq("localhost")
+ end
+
+ it "should parse the comment after the first '#' character" do
+ expect(@provider.parse_line(@testline)[:comment]).to eq('A comment with a #-char')
+ end
+
+ end
+
+ describe "when parsing a line with ip, hostname and aliases" do
+
+ it "should parse alias from the third field" do
+ expect(@provider.parse_line("127.0.0.1 localhost localhost.localdomain")[:host_aliases]).to eq("localhost.localdomain")
+ end
+
+ it "should parse multiple aliases" do
+ expect(@provider.parse_line("127.0.0.1 host alias1 alias2")[:host_aliases]).to eq('alias1 alias2')
+ expect(@provider.parse_line("127.0.0.1 host alias1\talias2")[:host_aliases]).to eq('alias1 alias2')
+ expect(@provider.parse_line("127.0.0.1 host alias1\talias2 alias3")[:host_aliases]).to eq('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
+ expect(@provider.parse_line(@testline)[:ip]).to eq("127.0.0.1")
+ end
+
+ it "should parse the hostname from the second field" do
+ expect(@provider.parse_line(@testline)[:name]).to eq("host")
+ end
+
+ it "should parse all host_aliases from the third field" do
+ expect(@provider.parse_line(@testline)[:host_aliases]).to eq('alias1 alias2 alias3')
+ end
+
+ it "should parse the comment after the first '#' character" do
+ expect(@provider.parse_line(@testline)[:comment]).to eq('A comment with a #-char')
+ end
+
+ end
+
+ describe "when operating on /etc/hosts like files" do
+ it_should_behave_like "all parsedfile providers",
+ provider_class, my_fixtures('valid*')
+
+ it "should be able to generate a simple hostfile entry" do
+ host = mkhost(
+ :name => 'localhost',
+ :ip => '127.0.0.1',
+ :ensure => :present
+ )
+ expect(genhost(host)).to eq("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
+ )
+ expect(genhost(host)).to eq("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
+ )
+ expect(genhost(host)).to eq("192.0.0.1\thost\ta1 a2 a3 a4\n")
+ end
+
+ it "should be able to generate a simple hostfile entry with comments" do
+ host = mkhost(
+ :name => 'localhost',
+ :ip => '127.0.0.1',
+ :comment => 'Bazinga!',
+ :ensure => :present
+ )
+ expect(genhost(host)).to eq("127.0.0.1\tlocalhost\t# Bazinga!\n")
+ end
+
+ it "should be able to generate an entry with one alias and a comment" do
+ host = mkhost(
+ :name => 'localhost.localdomain',
+ :ip => '127.0.0.1',
+ :host_aliases => 'localhost',
+ :comment => 'Bazinga!',
+ :ensure => :present
+ )
+ expect(genhost(host)).to eq("127.0.0.1\tlocalhost.localdomain\tlocalhost\t# Bazinga!\n")
+ end
+
+ it "should be able to generate an entry with more than one alias and a comment" do
+ host = mkhost(
+ :name => 'host',
+ :ip => '192.0.0.1',
+ :host_aliases => [ 'a1','a2','a3','a4' ],
+ :comment => 'Bazinga!',
+ :ensure => :present
+ )
+ expect(genhost(host)).to eq("192.0.0.1\thost\ta1 a2 a3 a4\t# Bazinga!\n")
+ end
+
+ end
+
+end