summaryrefslogtreecommitdiffstats
path: root/test/util/autoload.rb
blob: 34f40df246079e3a4add69c87ccaa4f1555e779b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/usr/bin/env ruby

$:.unshift("../lib").unshift("../../lib") if __FILE__ =~ /\.rb$/

require 'puppet'
require 'puppet/util/autoload'
require 'puppettest'

class TestAutoload < Test::Unit::TestCase
	include PuppetTest
    @things = []
    def self.newthing(name)
        @things << name
    end

    def self.thing?(name)
        @things.include? name
    end

    def self.clear
        @things.clear
    end

    def mkfile(name, path)
        # Now create a file to load
        File.open(path, "w") do |f|
            f.puts %{
TestAutoload.newthing(:#{name.to_s})
            }
        end
    end

    def teardown
        super
        self.class.clear
    end

    def test_load
        dir = tempfile()
        $: << dir
        cleanup do
            $:.delete(dir)
        end

        Dir.mkdir(dir)

        rbdir = File.join(dir, "yayness")

        Dir.mkdir(rbdir)

        # An object for specifying autoload
        klass = self.class

        loader = nil
        assert_nothing_raised {
            loader = Puppet::Util::Autoload.new(klass, :yayness)
        }

        assert_equal(loader.object_id, Puppet::Util::Autoload[klass].object_id,
                    "Did not retrieve loader object by class")

        # Make sure we don't fail on missing files
        assert_nothing_raised {
            assert_equal(false, loader.load(:mything),
                        "got incorrect return on failed load")
        }

        # Now create a couple of files for testing
        path = File.join(rbdir, "mything.rb")
        mkfile(:mything, path)
        opath = File.join(rbdir, "othing.rb")
        mkfile(:othing, opath)

        # Now try to actually load it.
        assert_nothing_raised {
            assert_equal(true, loader.load(:mything),
                        "got incorrect return on failed load")
        }

        assert(loader.loaded?(:mything), "Not considered loaded")

        assert(klass.thing?(:mything),
                "Did not get loaded thing")

        # Now clear everything, and test loadall
        assert_nothing_raised {
            loader.clear
        }

        self.class.clear

        assert_nothing_raised {
            loader.loadall
        }

        [:mything, :othing].each do |thing|
            assert(loader.loaded?(thing), "#{thing.to_s} not considered loaded")

            assert(klass.thing?(thing),
                    "Did not get loaded #{thing.to_s}")
        end
    end

    # Make sure that autoload dynamically modifies $: with the libdir as
    # appropriate.
    def test_autoload_uses_libdir
        dir = Puppet[:libdir]
        unless FileTest.directory?(dir)
            Dir.mkdir(dir)
        end

        loader = File.join(dir, "test")
        Dir.mkdir(loader)
        name = "funtest"
        file = File.join(loader, "funtest.rb")
        File.open(file, "w") do |f|
            f.puts "$loaded = true"
        end

        auto = Puppet::Util::Autoload.new(self, "test")

        # Now make sure autoloading modifies $: as necessary
        assert(! $:.include?(dir), "search path already includes libdir")

        assert_nothing_raised do
            assert(auto.load("funtest"), "did not successfully load funtest")
        end
        assert($:.include?(dir), "libdir did not get added to search path")
    end
end