Merge branch 'bug/2.2.x/is_domain_name' into 2.2.x

* bug/2.2.x/is_domain_name:
  Check according to rfc1035
  Add additional domain name tests
  (maint) Memoize scope in domain_name spec

Closes pull request GH-24
This commit is contained in:
Jeff McCune 2012-01-11 19:19:02 -08:00
commit a03d8cda18
2 changed files with 49 additions and 17 deletions

View file

@ -4,7 +4,7 @@
module Puppet::Parser::Functions
newfunction(:is_domain_name, :type => :rvalue, :doc => <<-EOS
Returns true if the string passed to this function is a valid IP address. Support for IPv4 and IPv6 address types is included.
Returns true if the string passed to this function is a syntactically correct domain name.
EOS
) do |arguments|
@ -15,11 +15,31 @@ Returns true if the string passed to this function is a valid IP address. Suppor
domain = arguments[0]
if domain =~ /^(([a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])\.?$/ then
return true
else
return false
# Limits (rfc1035, 3.1)
domain_max_length=255
label_min_length=1
label_max_length=63
# Allow ".", it is the top level domain
return true if domain == '.'
# Remove the final dot, if present.
domain.chomp!('.')
# Check the whole domain
return false if domain.empty?
return false if domain.length > domain_max_length
# Check each label in the domain
labels = domain.split('.')
vlabels = labels.each do |label|
break if label.length < label_min_length
break if label.length > label_max_length
break if label[-1..-1] == '-'
break if label[0..0] == '-'
break unless /^[a-z\d-]+$/i.match(label)
end
return vlabels == labels
end
end

View file

@ -6,51 +6,63 @@ describe "the is_domain_name function" do
Puppet::Parser::Functions.autoloader.loadall
end
before :each do
@scope = Puppet::Parser::Scope.new
end
let(:scope) { Puppet::Parser::Scope.new }
it "should exist" do
Puppet::Parser::Functions.function("is_domain_name").should == "function_is_domain_name"
end
it "should raise a ParseError if there is less than 1 arguments" do
lambda { @scope.function_is_domain_name([]) }.should( raise_error(Puppet::ParseError))
lambda { scope.function_is_domain_name([]) }.should( raise_error(Puppet::ParseError))
end
it "should return true if a valid short domain name" do
result = scope.function_is_domain_name(["x.com"])
result.should(be_true)
end
it "should return true if the domain is ." do
result = scope.function_is_domain_name(["."])
result.should(be_true)
end
it "should return true if the domain is x.com." do
result = scope.function_is_domain_name(["x.com."])
result.should(be_true)
end
it "should return true if a valid domain name" do
result = @scope.function_is_domain_name(["foo.bar.com"])
result = scope.function_is_domain_name(["foo.bar.com"])
result.should(be_true)
end
it "should allow domain parts to start with numbers" do
result = @scope.function_is_domain_name(["3foo.2bar.com"])
result = scope.function_is_domain_name(["3foo.2bar.com"])
result.should(be_true)
end
it "should allow domain to end with a dot" do
result = @scope.function_is_domain_name(["3foo.2bar.com."])
result = scope.function_is_domain_name(["3foo.2bar.com."])
result.should(be_true)
end
it "should allow a single part domain" do
result = @scope.function_is_domain_name(["orange"])
result = scope.function_is_domain_name(["orange"])
result.should(be_true)
end
it "should return false if domain parts start with hyphens" do
result = @scope.function_is_domain_name(["-3foo.2bar.com"])
result = scope.function_is_domain_name(["-3foo.2bar.com"])
result.should(be_false)
end
it "should return true if domain contains hyphens" do
result = @scope.function_is_domain_name(["3foo-bar.2bar-fuzz.com"])
result = scope.function_is_domain_name(["3foo-bar.2bar-fuzz.com"])
result.should(be_true)
end
it "should return false if domain name contains spaces" do
result = @scope.function_is_domain_name(["not valid"])
result = scope.function_is_domain_name(["not valid"])
result.should(be_false)
end
end