Report abuse

def evaluate
        @count = 0

        # Start logging.
        Puppet::Util::Log.newdestination(@report)

        prepare()

        begin
            allevents = @sorted_resources.collect { |resource|
                if resource.is_a?(Puppet::Type::Component)
                    Puppet.warning "Somehow left a component in the relationship graph"
                    next
                end
                ret = nil
                seconds = thinmark do
                begin
                    Timeout::timeout(resource[:expire]) {
                        ret = eval_resource(resource)
                    }
                 rescue(Timeout::Error)
                     Puppet.err "#{resource.to_s} expired at #{resource[:expire]} seconds."
                     @failures[resource] += 1
                 end
                end

                if Puppet[:evaltrace] and @catalog.host_config?
                    resource.info "Evaluated in %0.2f seconds" % seconds
                end
                ret
            }.flatten.reject { |e| e.nil? }
        ensure
            # And then close the transaction log.
            Puppet::Util::Log.close(@report)
        end

        Puppet.debug "Finishing transaction %s with %s changes" %
            [self.object_id, @count]

        @events = allevents
        allevents
    end

describe Puppet::Transaction, " when evaluating" do
    before do
        @config = Puppet::Resource::Catalog.new
        @transaction = Puppet::Transaction.new(@config)
    end
    it "should timeout when the running time of the resource is greater than the 'expire' parameter" do
        resource = Puppet::Type.type(:exec).new(:name => "/bin/sleep 3", :expire => "1")
        @config.add_resource(resource)

        Puppet.expects(:err).with(/.* expired at .*/)
        #lambda { @transaction.evaluate }.should raise_error
        @transaction.evaluate 
    end

    it "should timeout with a useful message"

    it "should not timeout when the running time of the resource is less than the 'expire' parameter"
    #it "should not timeout when the running time of the resource is less than the 'expire' parameter" do
        #resource = Puppet::Type.type(:exec).create(:name => "/bin/sleep 3", :expire => "5")
        #@config.add_resource(resource)

        #lambda { @transaction.evaluate }.should_not raise_error
    #end
end