You can reproduce the error with a simple manifest

    Bogus_type <| title == 'foo' |>

We used to fail because find_resource_type returned nil and we never
checked if it was nil before calling methods on it.

Reviewed-by: Max Martin <[email protected]>
Signed-off-by: Matt Robinson <[email protected]>
---
 lib/puppet/parser/ast/collection.rb     |    9 +++++----
 spec/unit/parser/ast/collection_spec.rb |   28 ++++++++++++++++------------
 2 files changed, 21 insertions(+), 16 deletions(-)

diff --git a/lib/puppet/parser/ast/collection.rb 
b/lib/puppet/parser/ast/collection.rb
index ef36b71..565b831 100644
--- a/lib/puppet/parser/ast/collection.rb
+++ b/lib/puppet/parser/ast/collection.rb
@@ -16,6 +16,7 @@ class Puppet::Parser::AST
       str, code = query && query.safeevaluate(scope)
 
       resource_type = scope.find_resource_type(@type)
+      fail "Resource type #{@type} doesn't exist" unless resource_type
       newcoll = Puppet::Parser::Collector.new(scope, resource_type.name, str, 
code, self.form)
 
       scope.compiler.add_collection(newcoll)
@@ -26,10 +27,10 @@ class Puppet::Parser::AST
         params = @override.collect { |param| param.safeevaluate(scope) }
         newcoll.add_override(
           :parameters => params,
-          :file => @file,
-          :line => @line,
-          :source => scope.source,        
-          :scope => scope
+          :file       => @file,
+          :line       => @line,
+          :source     => scope.source,
+          :scope      => scope
         )
       end
 
diff --git a/spec/unit/parser/ast/collection_spec.rb 
b/spec/unit/parser/ast/collection_spec.rb
index 392a2c0..cc33075 100755
--- a/spec/unit/parser/ast/collection_spec.rb
+++ b/spec/unit/parser/ast/collection_spec.rb
@@ -4,20 +4,21 @@ require File.dirname(__FILE__) + '/../../../spec_helper'
 
 describe Puppet::Parser::AST::Collection do
   before :each do
-    @scope = stub_everything 'scope'
-    @mytype = stub_everything('mytype')
-    @scope.stubs(:find_resource_type).returns @mytype
-    @compiler = stub_everything 'compile'
-    @scope.stubs(:compiler).returns(@compiler)
+    @mytype = Puppet::Resource::Type.new(:definition, "mytype")
+    @environment = Puppet::Node::Environment.new
+    @environment.known_resource_types.add @mytype
+
+    @compiler = Puppet::Parser::Compiler.new(Puppet::Node.new("foonode", 
:environment => @environment))
+    @scope = Puppet::Parser::Scope.new(:compiler => @compiler)
 
     @overrides = stub_everything 'overrides'
     @overrides.stubs(:is_a?).with(Puppet::Parser::AST).returns(true)
-
   end
 
   it "should evaluate its query" do
     query = mock 'query'
     collection = Puppet::Parser::AST::Collection.new :query => query, :form => 
:virtual
+    collection.type = 'mytype'
 
     query.expects(:safeevaluate).with(@scope)
 
@@ -26,8 +27,8 @@ describe Puppet::Parser::AST::Collection do
 
   it "should instantiate a Collector for this type" do
     collection = Puppet::Parser::AST::Collection.new :form => :virtual, :type 
=> "test"
-    @test_type = stub 'type', :name => 'test'
-    @scope.expects(:find_resource_type).with('test').returns @test_type
+    @test_type = Puppet::Resource::Type.new(:definition, "test")
+    @environment.known_resource_types.add @test_type
 
     Puppet::Parser::Collector.expects(:new).with(@scope, "test", nil, nil, 
:virtual)
 
@@ -35,7 +36,7 @@ describe Puppet::Parser::AST::Collection do
   end
 
   it "should tell the compiler about this collector" do
-    collection = Puppet::Parser::AST::Collection.new :form => :virtual, :type 
=> "test"
+    collection = Puppet::Parser::AST::Collection.new :form => :virtual, :type 
=> "mytype"
     Puppet::Parser::Collector.stubs(:new).returns("whatever")
 
     @compiler.expects(:add_collection).with("whatever")
@@ -45,7 +46,7 @@ describe Puppet::Parser::AST::Collection do
 
   it "should evaluate overriden paramaters" do
     collector = stub_everything 'collector'
-    collection = Puppet::Parser::AST::Collection.new :form => :virtual, :type 
=> "test", :override => @overrides
+    collection = Puppet::Parser::AST::Collection.new :form => :virtual, :type 
=> "mytype", :override => @overrides
     Puppet::Parser::Collector.stubs(:new).returns(collector)
 
     @overrides.expects(:safeevaluate).with(@scope)
@@ -55,7 +56,7 @@ describe Puppet::Parser::AST::Collection do
 
   it "should tell the collector about overrides" do
     collector = mock 'collector'
-    collection = Puppet::Parser::AST::Collection.new :form => :virtual, :type 
=> "test", :override => @overrides
+    collection = Puppet::Parser::AST::Collection.new :form => :virtual, :type 
=> "mytype", :override => @overrides
     Puppet::Parser::Collector.stubs(:new).returns(collector)
 
     collector.expects(:add_override)
@@ -63,5 +64,8 @@ describe Puppet::Parser::AST::Collection do
     collection.evaluate(@scope)
   end
 
-
+  it "should fail when evaluating undefined resource types" do
+    collection = Puppet::Parser::AST::Collection.new :form => :virtual, :type 
=> "bogus"
+    lambda { collection.evaluate(@scope) }.should raise_error "Resource type 
bogus doesn't exist"
+  end
 end
-- 
1.7.3.1

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en.

Reply via email to