summaryrefslogtreecommitdiffstats
path: root/spec/unit/util/autoload.rb
blob: 18938125d5bfcfe748a54869218482bb33dbdd26 (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

Dir.chdir(File.dirname(__FILE__)) { (s = lambda { |f| File.exist?(f) ? require(f) : Dir.chdir("..") { s.call(f) } }).call("spec/spec_helper.rb") }

require 'puppet/util/autoload'

describe Puppet::Util::Autoload do
    before do
        @autoload = Puppet::Util::Autoload.new("foo", "tmp")

        @autoload.stubs(:eachdir).yields "/my/dir"
    end

    it "should use the Cacher module" do
        Puppet::Util::Autoload.ancestors.should be_include(Puppet::Util::Cacher)
    end

    it "should use a ttl of 15 for the search path" do
        Puppet::Util::Autoload.attr_ttl(:searchpath).should == 15
    end

    describe "when building the search path" do
        it "should collect all of the plugins and lib directories that exist in the current environment's module path" do
            Puppet.settings.expects(:value).with(:environment).returns "foo"
            Puppet.settings.expects(:value).with(:modulepath, :foo).returns "/a:/b:/c"
            Dir.expects(:entries).with("/a").returns %w{one two}
            Dir.expects(:entries).with("/b").returns %w{one two}

            FileTest.stubs(:directory?).returns false
            FileTest.expects(:directory?).with("/a").returns true
            FileTest.expects(:directory?).with("/b").returns true
            %w{/a/one/plugins /a/two/lib /b/one/plugins /b/two/lib}.each do |d|
                FileTest.expects(:directory?).with(d).returns true
            end

            @autoload.module_directories.should == %w{/a/one/plugins /a/two/lib /b/one/plugins /b/two/lib}
        end

        it "should not look for lib directories in directories starting with '.'" do
            Puppet.settings.expects(:value).with(:environment).returns "foo"
            Puppet.settings.expects(:value).with(:modulepath, :foo).returns "/a"
            Dir.expects(:entries).with("/a").returns %w{. ..}

            FileTest.expects(:directory?).with("/a").returns true
            FileTest.expects(:directory?).with("/a/./lib").never
            FileTest.expects(:directory?).with("/a/./plugins").never
            FileTest.expects(:directory?).with("/a/../lib").never
            FileTest.expects(:directory?).with("/a/../plugins").never

            @autoload.module_directories
        end

        it "should include the module directories, the Puppet libdir, and all of the Ruby load directories" do
            @autoload.expects(:module_directories).returns %w{/one /two}
            @autoload.search_directories.should == ["/one", "/two", Puppet[:libdir], $:].flatten
        end

        it "should include in its search path all of the search directories that have a subdirectory matching the autoload path" do
            @autoload = Puppet::Util::Autoload.new("foo", "loaddir")
            @autoload.expects(:search_directories).returns %w{/one /two /three}
            FileTest.expects(:directory?).with("/one/loaddir").returns true
            FileTest.expects(:directory?).with("/two/loaddir").returns false
            FileTest.expects(:directory?).with("/three/loaddir").returns true
            @autoload.searchpath.should == ["/one/loaddir", "/three/loaddir"]
        end
    end

    it "should include its FileCache module" do
        Puppet::Util::Autoload.ancestors.should be_include(Puppet::Util::Autoload::FileCache)
    end

    describe "when loading a file" do
        before do
            @autoload.stubs(:searchpath).returns %w{/a}
        end

        [RuntimeError, LoadError, SyntaxError].each do |error|
            it "should not die an if a #{error.to_s} exception is thrown" do
                @autoload.stubs(:file_exist?).returns true

                Kernel.expects(:load).raises error

                @autoload.load("foo")
            end
        end

        it "should skip files that it knows are missing" do
            @autoload.expects(:named_file_missing?).with("foo").returns true
            @autoload.expects(:eachdir).never

            @autoload.load("foo")
        end

        it "should register that files are missing if they cannot be found" do
            @autoload.load("foo")

            @autoload.should be_named_file_missing("foo")
        end

        it "should register loaded files with the main loaded file list so they are not reloaded by ruby" do
            @autoload.stubs(:file_exist?).returns true
            Kernel.stubs(:load)

            @autoload.load("myfile")

            $".should be_include("tmp/myfile.rb")
        end
    end

    describe "when loading all files" do
        before do
            @autoload.stubs(:searchpath).returns %w{/a}
            Dir.stubs(:glob).returns "/path/to/file.rb"
        end

        [RuntimeError, LoadError, SyntaxError].each do |error|
            it "should not die an if a #{error.to_s} exception is thrown" do
                Kernel.expects(:require).raises error

                lambda { @autoload.loadall }.should_not raise_error
            end
        end

        it "should require the full path to the file" do
            Kernel.expects(:require).with("/path/to/file.rb")

            @autoload.loadall
        end
    end
end