diff options
| author | luke <luke@980ebf18-57e1-0310-9a29-db15c13687c0> | 2006-08-14 06:21:03 +0000 |
|---|---|---|
| committer | luke <luke@980ebf18-57e1-0310-9a29-db15c13687c0> | 2006-08-14 06:21:03 +0000 |
| commit | 12452ee9ca294563f2e2724ff36f179004f9846f (patch) | |
| tree | bee6053e8164f4a8dbf214f1898fafecb1d61f2f /test | |
| parent | 4d6120a1f77cfe76fafbe32caa5d853449562376 (diff) | |
| download | puppet-12452ee9ca294563f2e2724ff36f179004f9846f.tar.gz puppet-12452ee9ca294563f2e2724ff36f179004f9846f.tar.xz puppet-12452ee9ca294563f2e2724ff36f179004f9846f.zip | |
Merging r1468 from the implementations branch with r1438 from when the branch was first created.
git-svn-id: https://reductivelabs.com/svn/puppet/trunk@1469 980ebf18-57e1-0310-9a29-db15c13687c0
Diffstat (limited to 'test')
| -rw-r--r-- | test/other/autoload.rb | 111 | ||||
| -rw-r--r-- | test/other/provider.rb | 165 | ||||
| -rwxr-xr-x | test/providers/group.rb | 246 | ||||
| -rw-r--r-- | test/providers/nameservice.rb | 36 | ||||
| -rw-r--r-- | test/providers/package.rb | 86 | ||||
| -rw-r--r-- | test/providers/user.rb | 528 | ||||
| -rwxr-xr-x | test/puppet/utiltest.rb | 42 | ||||
| -rw-r--r-- | test/puppettest.rb | 107 | ||||
| -rw-r--r-- | test/server/pelement.rb | 5 | ||||
| -rw-r--r-- | test/types/basic.rb | 2 | ||||
| -rwxr-xr-x | test/types/cron.rb | 12 | ||||
| -rwxr-xr-x | test/types/group.rb | 302 | ||||
| -rw-r--r-- | test/types/package.rb | 129 | ||||
| -rw-r--r-- | test/types/query.rb | 3 | ||||
| -rw-r--r-- | test/types/service.rb | 16 | ||||
| -rw-r--r-- | test/types/state.rb | 39 | ||||
| -rw-r--r-- | test/types/type.rb | 83 | ||||
| -rwxr-xr-x | test/types/user.rb | 370 |
18 files changed, 1686 insertions, 596 deletions
diff --git a/test/other/autoload.rb b/test/other/autoload.rb new file mode 100644 index 000000000..95fafbda2 --- /dev/null +++ b/test/other/autoload.rb @@ -0,0 +1,111 @@ +#!/usr/bin/env ruby + +if __FILE__ == $0 + $:.unshift '..' + $:.unshift '../../lib' + $puppetbase = "../.." +end + +require 'puppet' +require 'puppet/autoload' +require 'puppettest' +require 'test/unit' + +class TestAutoload < Test::Unit::TestCase + include TestPuppet + @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::Autoload.new(klass, :yayness) + } + + assert_equal(loader.object_id, Puppet::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 + + def test_loadall + end +end diff --git a/test/other/provider.rb b/test/other/provider.rb new file mode 100644 index 000000000..fc04b9926 --- /dev/null +++ b/test/other/provider.rb @@ -0,0 +1,165 @@ +if __FILE__ == $0 + $:.unshift '..' + $:.unshift '../../lib' + $puppetbase = "../.." +end + +require 'puppet' +require 'puppet/provider' +require 'puppettest' +require 'test/unit' + +class TestImpl < Test::Unit::TestCase + include TestPuppet + + def setup + super + @type = newtype(@method_name.to_s + "type") + + # But create a new provider for every method. + @provider = newprovider(@method_name.to_s + "provider") + end + + def newtype(name) + # First create a fake type + return Puppet::Type.newtype(name) { + newparam(:name) { isnamevar } + } + end + + def newprovider(name, type = nil) + type ||= @type + provider = nil + assert_nothing_raised("Could not create provider") do + provider = type.provide(name) {} + end + return provider + end + + # Just a quick run-through to see if the basics work + def test_newprovider + assert_nothing_raised do + @provider.confine :operatingsystem => Facter["operatingsystem"].value + @provider.defaultfor :operatingsystem => Facter["operatingsystem"].value + end + + assert(@provider.suitable?, "Implementation was not considered suitable") + assert(@provider.default?, "Implementation was not considered a default") + + assert_equal(@provider, @type.defaultprovider, + "Did not correctly find default provider") + + end + + def test_provider_false_confine + assert_nothing_raised do + @provider.confine :false => false + end + + assert(@provider.suitable?, "False did not check correctly") + end + + def test_provider_true_confine + assert_nothing_raised do + @provider.confine :true => true + end + + assert(@provider.suitable?, "True did not check correctly") + + # Now check whether we multiple true things work + assert_nothing_raised do + @provider.confine :true => false + @provider.confine :true => true + end + assert(! @provider.suitable?, "One truth overrode another") + end + + def test_provider_exists_confine + file = tempfile() + + assert_nothing_raised do + @provider.confine :exists => file + end + + assert(! @provider.suitable?, "Exists did not check correctly") + File.open(file, "w") { |f| f.puts "" } + assert(@provider.suitable?, "Exists did not find file correctly") + end + + def test_provider_facts_confine + # Now check for multiple platforms + assert_nothing_raised do + @provider.confine :operatingsystem => [Facter["operatingsystem"].value, :yayos] + @provider.confine :operatingsystem => [:fakeos, :otheros] + end + + assert(@provider.suitable?, "Implementation not considered suitable") + end + + def test_provider_default + nondef = nil + assert_nothing_raised { + nondef = newprovider(:nondefault) + } + + assert_nothing_raised do + @provider.defaultfor :operatingsystem => Facter["operatingsystem"].value + end + + assert_equal(@provider.name, @type.defaultprovider.name, "Did not get right provider") + + @type.suitableprovider + end + + def test_subclassconfines + parent = newprovider("parentprovider") + + # Now make a bad confine on the parent + parent.confine :exists => "/this/file/definitely/does/not/exist" + + child = nil + assert_nothing_raised { + child = @type.provide("child", :parent => parent.name) {} + } + + assert(child.suitable?, "Parent ruled out child") + end + + def test_commands + parent = newprovider("parentprovider") + + child = nil + assert_nothing_raised { + child = @type.provide("child", :parent => parent.name) {} + } + + assert_nothing_raised { + child.commands :which => "which" + } + + assert(child.command(:which), "Did not find 'which' command") + + assert(child.command(:which) =~ /^\//, + "Command did not become fully qualified") + assert(FileTest.exists?(child.command(:which)), + "Did not find actual 'which' binary") + + assert_raise(Puppet::DevError) do + child.command(:nosuchcommand) + end + + # Now create a parent command + assert_nothing_raised { + parent.commands :sh => Puppet::Util.binary('sh') + } + + assert(parent.command(:sh), "Did not find 'sh' command") + + assert(child.command(:sh), "Did not find parent's 'sh' command") + + assert(FileTest.exists?(child.command(:sh)), + "Somehow broke path to sh") + end +end + +# $Id$ diff --git a/test/providers/group.rb b/test/providers/group.rb new file mode 100755 index 000000000..364d1750d --- /dev/null +++ b/test/providers/group.rb @@ -0,0 +1,246 @@ +if __FILE__ == $0 + $:.unshift '..' + $:.unshift '../../lib' + $puppetbase = "../.." +end + +require 'etc' +require 'puppet/type' +require 'puppettest' +require 'test/unit' + +class TestGroupProvider < Test::Unit::TestCase + include TestPuppet + def setup + super + @@tmpgroups = [] + @provider = nil + assert_nothing_raised { + @provider = Puppet::Type.type(:group).defaultprovider + } + + assert(@provider, "Could not find default group provider") + assert(@provider.name != :fake, "Got a fake provider") + end + + def teardown + super + Puppet.type(:group).clear + @@tmpgroups.each { |group| + unless missing?(group) + remove(group) + end + } + end + + def mkgroup(name, hash = {}) + fakemodel = fakemodel(:group, name) + group = nil + assert_nothing_raised { + group = @provider.new(fakemodel) + } + hash.each do |name, val| + fakemodel[name] = val + end + assert(group, "Could not create provider group") + + return group + end + + case Facter["operatingsystem"].value + when "Darwin": + def missing?(group) + output = %x{nidump -r /groups/#{group} / 2>/dev/null}.chomp + + if output == "" + return true + else + return false + end + + assert_equal("", output, "Group %s is present:\n%s" % [group, output]) + end + + def gid(name) + %x{nireport / /groups name gid}.split("\n").each { |line| + group, id = line.chomp.split(/\s+/) + assert(id =~ /^-?\d+$/, "Group id %s for %s is not a number" % + [id, group]) + if group == name + return Integer(id) + end + } + + return nil + end + + def remove(group) + system("niutil -destroy / /groups/%s" % group) + end + else + def missing?(group) + begin + obj = Etc.getgrnam(group) + return false + rescue ArgumentError + return true + end + end + + def gid(name) + assert_nothing_raised { + obj = Etc.getgrnam(name) + return obj.gid + } + + return nil + end + + def remove(group) + system("groupdel %s" % group) + end + end + + def groupnames + %x{groups}.chomp.split(/ /) + end + + def groupids + Process.groups + end + + def attrtest_ensure(group) + old = group.ensure + assert_nothing_raised { + group.ensure = :absent + } + + assert(!group.exists?, "Group was not deleted") + + assert_nothing_raised { + group.ensure = :present + } + assert(group.exists?, "Group was not created") + + unless old == :present + assert_nothing_raised { + group.ensure = old + } + end + end + + def attrtest_gid(group) + old = gid(group.name) + + newgid = old + while true + newgid += 1 + + if newgid - old > 1000 + $stderr.puts "Could not find extra test UID" + return + end + begin + Etc.getgrgid(newgid) + rescue ArgumentError => detail + break + end + end + + assert_nothing_raised("Failed to change group id") { + group.gid = newgid + } + + curgid = nil + assert_nothing_raised { + curgid = gid(group.name) + } + + assert_equal(newgid, curgid, "GID was not changed") + # Refresh + group.getinfo(true) + assert_equal(newgid, group.gid, "Object got wrong gid") + + assert_nothing_raised("Failed to change group id") { + group.gid = old + } + end + + # Iterate over each of our groups and try to grab the gid. + def test_ownprovidergroups + groupnames().each { |group| + gobj = nil + comp = nil + fakemodel = fakemodel(:group, group) + assert_nothing_raised { + gobj = @provider.new(fakemodel) + } + + assert(gobj.gid, "Failed to retrieve gid") + } + end + + if Process.uid == 0 + def test_mkgroup + gobj = nil + comp = nil + name = "pptestgr" + assert(missing?(name), "Group %s is still present" % name) + group = mkgroup(name) + + @@tmpgroups << name + + assert(group.respond_to?(:addcmd), "no respondo?") + assert_nothing_raised { + group.create + } + assert(!missing?(name), "Group %s is missing" % name) + + tests = Puppet.type(:group).validstates + + tests.each { |test| + if self.respond_to?("attrtest_%s" % test) + self.send("attrtest_%s" % test, group) + else + $stderr.puts "Not testing attr %s of group" % test + end + } + + assert_nothing_raised { + group.delete + } + end + + # groupadd -o is broken in FreeBSD. + unless Facter["operatingsystem"].value == "FreeBSD" + def test_duplicateIDs + group1 = mkgroup("group1", :gid => 125) + group2 = mkgroup("group2", :gid => 125) + + @@tmpgroups << "group1" + @@tmpgroups << "group2" + # Create the first group + assert_nothing_raised { + group1.create + } + + # Not all OSes fail here, so we can't test that it doesn't work with + # it off, only that it does work with it on. + assert_nothing_raised { + group2.model[:allowdupe] = :true + } + + # Now create the second group + assert_nothing_raised { + group2.create + } + assert_equal(:present, group2.ensure, + "Group did not get created") + end + end + else + $stderr.puts "Not running as root; skipping group creation tests." + end +end + +# $Id$ diff --git a/test/providers/nameservice.rb b/test/providers/nameservice.rb new file mode 100644 index 000000000..0e0f8050f --- /dev/null +++ b/test/providers/nameservice.rb @@ -0,0 +1,36 @@ +if __FILE__ == $0 + $:.unshift '..' + $:.unshift '../../lib' + $puppetbase = "../.." +end + +require 'puppettest' +require 'puppet' +require 'test/unit' +require 'facter' + +class TestNameServiceProvider < Test::Unit::TestCase + include FileTesting + + def test_option + klass = Class.new(Puppet::Type::Provider::NameService) + klass.model = Puppet::Type.type(:user) + + val = nil + assert_nothing_raised { + val = klass.option(:home, :flag) + } + + assert_nil(val, "Got an option") + + assert_nothing_raised { + klass.options :home, :flag => "-d" + } + assert_nothing_raised { + val = klass.option(:home, :flag) + } + assert_equal("-d", val, "Got incorrect option") + end +end + +# $Id$ diff --git a/test/providers/package.rb b/test/providers/package.rb new file mode 100644 index 000000000..210fae5c1 --- /dev/null +++ b/test/providers/package.rb @@ -0,0 +1,86 @@ +if __FILE__ == $0 + $:.unshift '..' + $:.unshift '../../lib' + $puppetbase = "../.." +end + +require 'etc' +require 'puppet/type' +require 'puppettest' +require 'test/unit' + +class TestPackageProvider < Test::Unit::TestCase + include TestPuppet + def setup + super + @provider = nil + assert_nothing_raised { + @provider = Puppet::Type.type(:package).defaultprovider + } + + assert(@provider, "Could not find default package provider") + assert(@provider.name != :fake, "Got a fake provider") + end + + def test_nothing + end + + if Facter["operatingsystem"].value == "Solaris" and Process.uid == 0 + if Puppet.type(:package).provider(:blastwave).suitable? + # FIXME The packaging crap needs to be rewritten to support testing + # multiple package types on the same platform. + def test_list_blastwave + pkgs = nil + assert_nothing_raised { + pkgs = Puppet::Type.type(:package).provider(:blastwave).list + } + + pkgs.each do |pkg| + if pkg[:name] =~ /^CSW/ + assert_equal(:blastwave, pkg[:provider], + "Type was not set correctly") + end + end + end + + def test_install_blastwave + pkg = nil + name = "cabextract" + model = fakemodel(:package, name) + assert_nothing_raised { + pkg = Puppet::Type.type(:package).provider(:blastwave).new(model) + } + + if hash = pkg.query and hash[:ensure] != :absent + p hash + $stderr.puts "Cannot test pkg installation; %s is already installed" % + name + return + end + + assert_nothing_raised { + pkg.install + } + + hash = nil + assert(hash = pkg.query, + "package did not install") + assert(hash[:ensure] != :absent, + "package did not install") + + latest = nil + assert_nothing_raised { + latest = pkg.latest + } + assert(latest, "Could not find latest package version") + assert_nothing_raised { + pkg.uninstall + } + end + else + $stderr.puts "No pkg-get scripting; skipping blastwave tests" + end + end +end + +# $Id$ diff --git a/test/providers/user.rb b/test/providers/user.rb new file mode 100644 index 000000000..15b453780 --- /dev/null +++ b/test/providers/user.rb @@ -0,0 +1,528 @@ +if __FILE__ == $0 + $:.unshift '..' + $:.unshift '../../lib' + $puppetbase = "../.." +end + +require 'puppettest' +require 'puppet' +require 'test/unit' +require 'facter' + +class TestUserProvider < Test::Unit::TestCase + include FileTesting + + def setup + super + setme() + @@tmpusers = [] + @provider = nil + assert_nothing_raised { + @provider = Puppet::Type.type(:user).defaultprovider + } + + assert(@provider, "Could not find default user provider") + + end + + def teardown + @@tmpusers.each { |user| + unless missing?(user) + remove(user) + end + } + super + #Puppet.type(:user).clear + end + + case Facter["operatingsystem"].value + when "Darwin": + def missing?(user) + output = %x{nidump -r /users/#{user} / 2>/dev/null}.chomp + + if output == "" + return true + else + return false + end + + assert_equal("", output, "User %s is present:\n%s" % [user, output]) + end + + def current?(param, user) + state = Puppet.type(:user).states.find { |st| + st.name == param + } + + output = %x{nireport / /users name #{state.netinfokey}} + output.split("\n").each { |line| + if line =~ /^(\w+)\s+(.+)$/ + username = $1 + id = $2.sub(/\s+$/, '') + if username == user.name + if id =~ /^[-0-9]+$/ + return Integer(id) + else + return id + end + end + else + raise "Could not match %s" % line + end + } + + return nil + end + + def remove(user) + system("niutil -destroy / /users/%s" % user) + end + else + def missing?(user) + begin + obj = Etc.getpwnam(user) + return false + rescue ArgumentError + return true + end + end + + def current?(param, user) + state = Puppet.type(:user).states.find { |st| + st.name == param + } + + assert_nothing_raised { + obj = Etc.getpwnam(user.name) + return obj.send(user.posixmethod(param)) + } + + return nil + end + + def remove(user) + system("userdel %s" % user) + end + end + + + def eachstate + Puppet::Type.type(:user).validstates.each do |state| + next if state == :ensure + yield state + end + end + + def findshell(old = nil) + %w{/bin/sh /bin/bash /sbin/sh /bin/ksh /bin/zsh /bin/csh /bin/tcsh + /usr/bin/sh /usr/bin/bash /usr/bin/ksh /usr/bin/zsh /usr/bin/csh + /usr/bin/tcsh}.find { |shell| + if old + FileTest.exists?(shell) and shell != old + else + FileTest.exists?(shell) + end + } + end + + def fakedata(name, param) + case param + when :name: name + when :comment: "Puppet Testing User %s" % name + when :gid: Process.gid() + when :shell: findshell() + when :home: "/home/%s" % name + else + return nil + end + end + + def mkuser(name) + fakemodel = fakemodel(:user, name) + user = nil + assert_nothing_raised { + user = @provider.new(fakemodel) + } + assert(user, "Could not create provider user") + + return user + end + + def test_list + names = nil + assert_nothing_raised { + names = @provider.listbyname + } + + assert(names.length > 0, "Listed no users") + + # Now try it by object + assert_nothing_raised { + names = @provider.list + } + assert(names.length > 0, "Listed no users as objects") + + names.each do |obj| + assert_instance_of(Puppet::Type.type(:user), obj) + assert(obj[:provider], "Provider was not set") + end + end + + def test_infocollection + fakemodel = fakemodel(:user, @me) + + user = nil + assert_nothing_raised { + user = @provider.new(fakemodel) + } + assert(user, "Could not create user provider") + + Puppet::Type.type(:user).validstates.each do |state| + next if state == :ensure + val = nil + assert_nothing_raised { + val = user.send(state) + } + + assert(val != :absent, + "State %s is missing" % state) + + assert(val, "Did not get value for %s" % state) + end + end + + def test_exists + user = mkuser("nosuchuserok") + + assert(! user.exists?, + "Fake user exists?") + + user = mkuser(@me) + assert(user.exists?, + "I don't exist?") + end + + def attrtest_ensure(user) + old = user.ensure + assert_nothing_raised { + user.ensure = :absent + } + + assert(missing?(user.name), "User is still present") + assert_nothing_raised { + user.ensure = :present + } + assert(!missing?(user.name), "User is absent") + assert_nothing_raised { + user.ensure = :absent + } + + unless old == :absent + user.ensure = old + end + end + + def attrtest_comment(user) + old = user.comment + + assert_nothing_raised { + user.comment = "A different comment" + } + + assert_equal("A different comment", current?(:comment, user), + "Comment was not changed") + + assert_nothing_raised { + user.comment = old + } + + assert_equal(old, current?(:comment, user), + "Comment was not reverted") + end + + def attrtest_home(user) + old = current?(:home, user) + + assert_nothing_raised { + user.home = "/tmp" + } + + assert_equal("/tmp", current?(:home, user), "Home was not changed") + assert_nothing_raised { + user.home = old + } + + assert_equal(old, current?(:home, user), "Home was not reverted") + end + + def attrtest_shell(user) + old = current?(:shell, user) + + newshell = findshell(old) + + unless newshell + $stderr.puts "Cannot find alternate shell; skipping shell test" + return + end + + assert_nothing_raised { + user.shell = newshell + } + + assert_equal(newshell, current?(:shell, user), + "Shell was not changed") + + assert_nothing_raised { + user.shell = old + } + + assert_equal(old, current?(:shell, user), "Shell was not reverted") + end + + def attrtest_gid(user) + old = current?(:gid, user) + + newgroup = %w{nogroup nobody staff users daemon}.find { |gid| + begin + group = Etc.getgrnam(gid) + rescue ArgumentError => detail + next + end + old != group.gid + } + group = Etc.getgrnam(newgroup) + + unless newgroup + $stderr.puts "Cannot find alternate group; skipping gid test" + return + end + + assert_raise(ArgumentError, "gid allowed a non-integer value") do + user.gid = group.name + end + + assert_nothing_raised("Failed to specify group by id") { + user.gid = group.gid + } + + assert_equal(group.gid, current?(:gid,user), "GID was not changed") + + assert_nothing_raised("Failed to change back to old gid") { + user.gid = old + } + end + + def attrtest_uid(user) + old = current?(:uid, user) + + newuid = old + while true + newuid += 1 + + if newuid - old > 1000 + $stderr.puts "Could not find extra test UID" + return + end + begin + newuser = Etc.getpwuid(newuid) + rescue ArgumentError => detail + break + end + end + + assert_nothing_raised("Failed to change user id") { + user.uid = newuid + } + + assert_equal(newuid, current?(:uid, user), "UID was not changed") + + assert_nothing_raised("Failed to change user id") { + user.uid = old + } + assert_equal(old, current?(:uid, user), "UID was not changed back") + end + + def attrtest_groups(user) + Etc.setgrent + max = 0 + while group = Etc.getgrent + if group.gid > max and group.gid < 5000 + max = group.gid + end + end + + groups = [] + main = [] + extra = [] + 5.times do |i| + i += 1 + name = "pptstgr%s" % i + tmpgroup = Puppet.type(:group).create( + :name => name, + :gid => max + i + ) + + groups << tmpgroup + + cleanup do + tmpgroup.provider.delete if tmpgroup.provider.exists? + end + + if i < 3 + main << name + else + extra << name + end + end + + # Create our test groups + assert_apply(*groups) + + # Now add some of them to our user + assert_nothing_raised { + user.model[:groups] = extra.join(",") + } + + # Some tests to verify that groups work correctly startig from nothing + # Remove our user + user.ensure = :absent + + # And add it again + user.ensure = :present + + # Make sure that the group list is added at creation time. + # This is necessary because we don't have default fakedata for groups. + assert(user.groups, "Did not retrieve group list") + + list = user.groups.split(",") + assert_equal(extra.sort, list.sort, "Group list was not set at creation time") + + # Now set to our main list of groups + assert_nothing_raised { + user.groups = main.join(",") + } + + list = user.groups.split(",") + assert_equal(main.sort, list.sort, "Group list is not equal") + end + + if Process.uid == 0 + def test_simpleuser + name = "pptest" + + assert(missing?(name), "User %s is present" % name) + + user = mkuser(name) + + eachstate do |state| + if val = fakedata(user.name, state) + user.model[state] = val + end + end + + @@tmpusers << name + + assert_nothing_raised { + user.create + } + + assert_equal("Puppet Testing User pptest", + user.comment, + "Comment was not set") + + assert_nothing_raised { + user.delete + } + + assert(missing?(user.name), "User was not deleted") + end + + def test_alluserstates + user = nil + name = "pptest" + + assert(missing?(name), "User %s is present" % name) + + user = mkuser(name) + + eachstate do |state| + if val = fakedata(user.name, state) + user.model[state] = val + end + end + + @@tmpusers << name + + assert_nothing_raised { + user.create + } + assert_equal("Puppet Testing User pptest", user.comment, + "Comment was not set") + + tests = Puppet::Type.type(:user).validstates + + just = nil + tests.each { |test| + next unless test == :groups + if self.respond_to?("attrtest_%s" % test) + self.send("attrtest_%s" % test, user) + else + Puppet.err "Not testing attr %s of user" % test + end + } + + assert_nothing_raised { + user.delete + } + end + + # This is a weird method that shows how annoying the interface between + # types and providers is. Grr. + def test_duplicateIDs + user1 = mkuser("user1") + user1.create + user1.uid = 125 + user2 = mkuser("user2") + user2.model[:uid] = 125 + + cleanup do + user1.ensure = :absent + user2.ensure = :absent + end + + # Not all OSes fail here, so we can't test that it doesn't work with + # it off, only that it does work with it on. + assert_nothing_raised { + user2.model[:allowdupe] = :true + } + assert_nothing_raised { user2.create } + assert_equal(:present, user2.ensure, + "User did not get created") + end + else + $stderr.puts "Not root; skipping user creation/modification tests" + end + + # Here is where we test individual providers + def test_useradd_flags + useradd = nil + assert_nothing_raised { + useradd = Puppet::Type.type(:user).provider(:useradd) + } + assert(useradd, "Did not retrieve useradd provider") + + user = nil + assert_nothing_raised { + fakemodel = fakemodel(:user, @me) + user = useradd.new(fakemodel) + } + + assert_equal("-d", user.send(:flag, :home), + "Incorrect home flag") + + assert_equal("-s", user.send(:flag, :shell), + "Incorrect shell flag") + end +end + +# $Id$ diff --git a/test/puppet/utiltest.rb b/test/puppet/utiltest.rb index ebf61e0f0..c2dcdada5 100755 --- a/test/puppet/utiltest.rb +++ b/test/puppet/utiltest.rb @@ -294,6 +294,48 @@ class TestPuppetUtil < Test::Unit::TestCase assert(Process.euid == 0, "UID did not get reset") end end + + def test_proxy + klass = Class.new do + attr_accessor :hash + class << self + attr_accessor :ohash + end + end + klass.send(:include, Puppet::Util) + + klass.ohash = {} + + inst = klass.new + inst.hash = {} + assert_nothing_raised do + Puppet::Util.proxy klass, :hash, "[]", "[]=", :clear, :delete + end + + assert_nothing_raised do + Puppet::Util.classproxy klass, :ohash, "[]", "[]=", :clear, :delete + end + + assert_nothing_raised do + inst[:yay] = "boo" + inst["cool"] = :yayness + end + + [:yay, "cool"].each do |var| + assert_equal(inst.hash[var], inst[var], + "Var %s did not take" % var) + end + + assert_nothing_raised do + klass[:Yay] = "boo" + klass["Cool"] = :yayness + end + + [:Yay, "Cool"].each do |var| + assert_equal(inst.hash[var], inst[var], + "Var %s did not take" % var) + end + end end # $Id$ diff --git a/test/puppettest.rb b/test/puppettest.rb index cc7ff2ccc..a49ceb175 100644 --- a/test/puppettest.rb +++ b/test/puppettest.rb @@ -9,6 +9,100 @@ require 'test/unit' module TestPuppet include ObjectSpace + # A baseclass for the faketypes. + class FakeModel < Hash + class << self + attr_accessor :name + @name = :fakemodel + end + + def self.validstates + Puppet::Type.type(@name).validstates + end + + def self.validstate?(name) + Puppet::Type.type(@name).validstate?(name) + end + + def initialize(name) + self[:name] = name + end + + def inspect + "%s(%s)" % [self.class.to_s.sub(/.+::/, ''), super()] + end + + def name + self[:name] + end + end + + class FakeProvider + attr_accessor :model + class << self + attr_accessor :name, :model, :methods + end + + # A very low number, so these never show up as defaults via the standard + # algorithms. + def self.defaultnum + -50 + end + + # Set up methods to fake things + def self.apimethods(*ary) + @model.validstates.each do |state| + ary << state unless ary.include? state + end + attr_accessor *ary + + @methods = ary + end + + def self.initvars + @calls = Hash.new do |hash, key| + hash[key] = 0 + end + end + + def self.suitable? + true + end + + def initialize(model) + @model = model + end + end + + @@fakemodels = {} + @@fakeproviders = {} + + def fakemodel(type, name, options = {}) + type = type.intern if type.is_a? String + unless @@fakemodels.include? type + @@fakemodels[type] = Class.new(FakeModel) + @@fakemodels[type].name = type + end + + obj = @@fakemodels[type].new(name) + obj[:name] = name + options.each do |name, val| + obj[name] = val + end + obj + end + + def fakeprovider(type, model) + type = type.intern if type.is_a? String + unless @@fakeproviders.include? type + @@fakeproviders[type] = Class.new(FakeModel) do + @name = type + end + end + + @@fakeproviders[type].new(model) + end + def gcdebug(type) Puppet.warning "%s: %s" % [type, ObjectSpace.each_object(type) { |o| }] end @@ -119,6 +213,19 @@ module TestPuppet @@cleaners << block end + def setme + # retrieve the user name + id = %x{id}.chomp + if id =~ /uid=\d+\(([^\)]+)\)/ + @me = $1 + else + puts id + end + unless defined? @me + raise "Could not retrieve user name; 'id' did not work" + end + end + def teardown stopservices diff --git a/test/server/pelement.rb b/test/server/pelement.rb index 7bff1cb26..5d5b5ceb4 100644 --- a/test/server/pelement.rb +++ b/test/server/pelement.rb @@ -27,11 +27,8 @@ class TestPElementServer < Test::Unit::TestCase obj.retrieve end - assert(obj.insync?, "Described %s[%s] is not in sync" % - [trans.type, name]) - if trans.type == :package - assert_equal(Puppet::Type.type(:package).default, obj[:type]) + assert_equal(Puppet::Type.type(:package).defaultprovider.name, obj[:provider]) end end type.clear diff --git a/test/types/basic.rb b/test/types/basic.rb index 1c41d37bc..f734cb5a0 100644 --- a/test/types/basic.rb +++ b/test/types/basic.rb @@ -38,7 +38,7 @@ class TestBasic < Test::Unit::TestCase assert_nothing_raised() { @sleeper = Puppet.type(:service).create( :name => "sleeper", - :type => "init", + :provider => "init", :path => File.join($puppetbase,"examples/root/etc/init.d"), :hasstatus => true, :ensure => :running diff --git a/test/types/cron.rb b/test/types/cron.rb index fee09b360..caada9f91 100755 --- a/test/types/cron.rb +++ b/test/types/cron.rb @@ -15,16 +15,8 @@ class TestCron < Test::Unit::TestCase include TestPuppet def setup super - # retrieve the user name - id = %x{id}.chomp - if id =~ /uid=\d+\(([^\)]+)\)/ - @me = $1 - else - puts id - end - unless defined? @me - raise "Could not retrieve user name; 'id' did not work" - end + + setme() # god i'm lazy @crontype = Puppet.type(:cron) diff --git a/test/types/group.rb b/test/types/group.rb index cb9b988ed..508b8436c 100755 --- a/test/types/group.rb +++ b/test/types/group.rb @@ -1,11 +1,9 @@ if __FILE__ == $0 $:.unshift '..' $:.unshift '../../lib' - $puppetbase = "../../../../language/trunk" + $puppetbase = "../.." end -# $Id$ - require 'etc' require 'puppet/type' require 'puppettest' @@ -13,18 +11,40 @@ require 'test/unit' class TestGroup < Test::Unit::TestCase include TestPuppet + + p = Puppet::Type.type(:group).provide :fake, :parent => TestPuppet::FakeProvider do + @name = :fake + apimethods :ensure, :gid + + def create + @ensure = :present + end + + def delete + @ensure = :absent + end + + def exists? + if defined? @ensure and @ensure == :present + true + else + false + end + end + end + + FakeGroupProvider = p + + @@fakeproviders[:group] = p + def setup super - @@tmpgroups = [] + Puppet::Type.type(:group).defaultprovider = FakeGroupProvider end def teardown Puppet.type(:group).clear - @@tmpgroups.each { |group| - unless missing?(group) - remove(group) - end - } + Puppet::Type.type(:group).defaultprovider = nil super end @@ -38,60 +58,6 @@ class TestGroup < Test::Unit::TestCase return group end - case Facter["operatingsystem"].value - when "Darwin": - def missing?(group) - output = %x{nidump -r /groups/#{group} / 2>/dev/null}.chomp - - if output == "" - return true - else - return false - end - - assert_equal("", output, "Group %s is present:\n%s" % [group, output]) - end - - def gid(name) - %x{nireport / /groups name gid}.split("\n").each { |line| - group, id = line.chomp.split(/\s+/) - assert(id =~ /^-?\d+$/, "Group id %s for %s is not a number" % - [id, group]) - if group == name - return Integer(id) - end - } - - return nil - end - - def remove(group) - system("niutil -destroy / /groups/%s" % group) - end - else - def missing?(group) - begin - obj = Etc.getgrnam(group) - return false - rescue ArgumentError - return true - end - end - - def gid(name) - assert_nothing_raised { - obj = Etc.getgrnam(name) - return obj.gid - } - - return nil - end - - def remove(group) - system("groupdel %s" % group) - end - end - def groupnames %x{groups}.chomp.split(/ /) end @@ -101,99 +67,52 @@ class TestGroup < Test::Unit::TestCase end def attrtest_ensure(group) - old = group.is(:ensure) group[:ensure] = :absent comp = newcomp("ensuretest", group) - assert_apply(group) - assert(missing?(group.name), "User is still present") + assert_apply(comp) + assert_equal(:absent, group.provider.ensure, "Group is still present") group[:ensure] = :present assert_events([:group_created], comp) - assert(!missing?(group.name), "User is absent") + assert_equal(:present, group.provider.ensure, "Group is absent") group[:ensure] = :absent trans = assert_events([:group_removed], comp) + assert_equal(:absent, group.provider.ensure, "Group is present") assert_rollback_events(trans, [:group_created], "group") - - group[:ensure] = old - assert_apply(group) + assert_equal(:present, group.provider.ensure, "Group is absent") end + # This is a bit odd, since we're not actually doing anything on the machine. + # Just make sure we can set the gid and that it will work correctly. def attrtest_gid(group) - obj = nil - #assert_nothing_raised { - # obj = Etc.getgrnam(group[:name]) - #} - group.retrieve - old = gid(group[:name]) - comp = newcomp("gidtest", group) - - group[:gid] = old - - trans = assert_events([], comp, "group") - - newgid = old - while true - newgid += 1 - - if newgid - old > 1000 - $stderr.puts "Could not find extra test UID" - return - end - begin - Etc.getgrgid(newgid) - rescue ArgumentError => detail - break - end - end - - assert_nothing_raised("Failed to change group id") { - group[:gid] = newgid - } - - trans = assert_events([:group_modified], comp, "group") - curgid = nil + # Check the validation. assert_nothing_raised { - curgid = gid(group[:name]) + group[:gid] = "15" } - assert_equal(newgid, curgid, "GID was not changed") + assert_equal(15, group.should(:gid), + "Did not convert gid to number") - assert_rollback_events(trans, [:group_modified], "group") + comp = newcomp(group) + trans = assert_events([:group_modified], comp, "group") + assert_equal(15, group.provider.gid, "GID was not changed") assert_nothing_raised { - curgid = gid(group[:name]) + group[:gid] = 16 } - assert_equal(old, curgid, "UID was not reverted") - end - - # Disabled, because it was testing implementation, not function - def disabled_test_eachmethod - obj = Etc.getgrnam(groupnames()[0]) - - assert(obj, "Could not retrieve test group object") + assert_equal(16, group.should(:gid), + "Did not keep gid as number") - Puppet.type(:group).validstates.each { |name, state| - assert_nothing_raised { - method = state.infomethod - assert(method, "State %s has no infomethod" % name) - assert(obj.respond_to?(method), - "State %s has an invalid method %s" % - [name, method] - ) - } + # Now switch to 16 + trans = assert_events([:group_modified], comp, "group") + assert_equal(16, group.provider.gid, "GID was not changed") - assert_nothing_raised { - method = state.infomethod - assert(method, "State %s has no infomethod" % name) - assert(obj.respond_to?(method), - "State %s has an invalid method %s" % - [name, method] - ) - } - } + # And then rollback + assert_rollback_events(trans, [:group_modified], "group") + assert_equal(15, group.provider.gid, "GID was not changed") end def test_owngroups @@ -205,119 +124,52 @@ class TestGroup < Test::Unit::TestCase :name => group, :check => [:gid] ) - - comp = newcomp("grouptest %s" % group, gobj) } - #trans = nil + # Set a fake gid + gobj.provider.gid = rand(100) + assert_nothing_raised { gobj.retrieve - #trans = comp.evaluate } assert(gobj.is(:gid), "Failed to retrieve gid") } end - # Test that we can query things - # It'd be nice if we could automate this... - def test_checking - require 'etc' + def test_mkgroup + gobj = nil + comp = nil + name = "pptestgr" - name = nil - assert_nothing_raised { - name = Etc.getgrgid(Process.gid).name - } - user = nil assert_nothing_raised { - checks = Puppet.type(:group).validstates - user = Puppet.type(:group).create( + gobj = Puppet.type(:group).create( :name => name, - :check => checks + :ensure => :present ) - } - assert_nothing_raised { - user.retrieve + comp = newcomp("groupmaker %s" % name, gobj) } - assert_equal(Process.gid, user.is(:gid), "Retrieved UID does not match") - end + trans = assert_events([:group_created], comp, "group") - if Process.uid == 0 - def test_mkgroup - gobj = nil - comp = nil - name = "pptestgr" - - #os = Facter["operatingsystem"].value - - #if os == "Darwin" - # obj = nil - # assert_nothing_raised { - # obj = Etc.getgrnam(name) - # } - # assert_equal(-2, obj.gid, "Darwin GID is not -2") - #else - #assert_raise(ArgumentError) { - # obj = Etc.getgrnam(name) - #} - #end - assert(missing?(name), "Group %s is still present" % name) - assert_nothing_raised { - gobj = Puppet.type(:group).create( - :name => name, - :ensure => :present - ) - - comp = newcomp("groupmaker %s" % name, gobj) - } - - @@tmpgroups << name - trans = assert_events([:group_created], comp, "group") - - obj = nil - assert_nothing_raised { - obj = Etc.getgrnam(name) - } - assert(!missing?(name), "Group %s is missing" % name) + assert(gobj.provider.exists?, + "Did not create group") - tests = Puppet.type(:group).validstates + tests = Puppet.type(:group).validstates - gobj.retrieve - tests.each { |test| - if self.respond_to?("attrtest_%s" % test) - self.send("attrtest_%s" % test, gobj) - else - #$stderr.puts "Not testing attr %s of group" % test - end - } - - assert_rollback_events(trans, [:group_removed], "group") - - assert(missing?(name), "Group %s is still present" % name) - end - - # groupadd -o is broken in FreeBSD. - unless Facter["operatingsystem"].value == "FreeBSD" - def test_duplicateIDs - group1 = mkgroup("group1", :gid => 125) - group2 = mkgroup("group2", :gid => 125) + gobj.retrieve + tests.each { |test| + if self.respond_to?("attrtest_%s" % test) + self.send("attrtest_%s" % test, gobj) + else + #$stderr.puts "Not testing attr %s of group" % test + end + } - assert_apply(group1) + assert_rollback_events(trans, [:group_removed], "group") - # Not all OSes fail here, so we can't test that it doesn't work with - # it off, only that it does work with it on. - assert_nothing_raised { - group2[:allowdupe] = true - } - assert_apply(group2) - group2.retrieve - assert_equal(:present, group2.state(:ensure).is, - "Group did not get created") - end - end - else - $stderr.puts "Not running as root; skipping group creation tests." + assert(! gobj.provider.exists?, + "Did not delete group") end end diff --git a/test/types/package.rb b/test/types/package.rb index d4ddc14c9..779c693fe 100644 --- a/test/types/package.rb +++ b/test/types/package.rb @@ -11,7 +11,7 @@ require 'facter' $platform = Facter["operatingsystem"].value -unless Puppet.type(:package).default +unless Puppet.type(:package).defaultprovider puts "No default package type for %s; skipping package tests" % $platform else @@ -54,14 +54,15 @@ class TestPackages < Test::Unit::TestCase list.each { |pkg, source| hash = {:name => pkg} if useensure - hash[:ensure] = "latest" + hash[:ensure] = "installed" end if source source = source[0] if source.is_a? Array hash[:source] = source end + # Override the default package type for our test packages. if Facter["operatingsystem"].value == "Darwin" - hash[:type] = "darwinport" + hash[:provider] = "darwinport" end obj = Puppet.type(:package).create(hash) assert(pkg, "Could not create package") @@ -103,6 +104,8 @@ class TestPackages < Test::Unit::TestCase retval = {"aop" => nil} when "FreeBSD": retval = {"yahtzee" => nil} + when "RedHat": + retval = {"puppet" => "/home/luke/rpm/RPMS/i386/puppet-0.16.1-1.i386.rpm"} else Puppet.notice "No test packages for %s" % $platform end @@ -168,18 +171,6 @@ class TestPackages < Test::Unit::TestCase } end - def test_specifypkgtype - pkg = nil - assert_nothing_raised { - pkg = Puppet.type(:package).create( - :name => "mypkg", - :type => "yum" - ) - } - assert(pkg, "Did not create package") - assert_equal(:yum, pkg[:type]) - end - def test_latestpkg mkpkgs { |pkg| next unless pkg.respond_to? :latest @@ -194,11 +185,8 @@ class TestPackages < Test::Unit::TestCase def test_listing pkgtype = Puppet::Type.type(:package) - # Heh - defaulttype = pkgtype.pkgtype(pkgtype.default) - assert_nothing_raised("Could not list packages") do - defaulttype.list + pkgtype.list end end @@ -213,14 +201,14 @@ class TestPackages < Test::Unit::TestCase pkg.retrieve } - if pkg.insync? or pkg.is(:ensure) != :absent + if pkg.provider.query Puppet.notice "Test package %s is already installed; please choose a different package for testing" % pkg next end comp = newcomp("package", pkg) - assert_events([:package_created], comp, "package") + assert_events([:package_installed], comp, "package") pkg.retrieve @@ -243,7 +231,7 @@ class TestPackages < Test::Unit::TestCase pkg[:ensure] = "latest" } - assert_events([:package_created], comp, "package") + assert_events([:package_installed], comp, "package") pkg.retrieve assert(pkg.insync?, "After install, package is not insync") @@ -306,9 +294,9 @@ class TestPackages < Test::Unit::TestCase modpkg(pkg) - assert(pkg.latest, "Could not retrieve latest value") + assert(pkg.provider.latest, "Could not retrieve latest value") - assert_events([:package_created], pkg) + assert_events([:package_installed], pkg) assert_nothing_raised { pkg.retrieve @@ -345,7 +333,8 @@ class TestPackages < Test::Unit::TestCase pkg = Puppet::Type.type(:package).create( :name => "pkgtesting", :source => "/Users/luke/Documents/Puppet/pkgtesting.pkg", - :ensure => :present + :ensure => :present, + :provider => :apple ) } @@ -362,7 +351,7 @@ class TestPackages < Test::Unit::TestCase @@tmpfiles << "/tmp/file" @@tmpfiles << "/Library/Receipts/pkgtesting.pkg" - assert_events([:package_created], pkg, "package") + assert_events([:package_installed], pkg, "package") assert_nothing_raised { pkg.retrieve @@ -375,15 +364,15 @@ class TestPackages < Test::Unit::TestCase end # Yay, gems. They're special because any OS can test them. - if %x{which gem 2>/dev/null}.chomp != "" + if Puppet::Type.type(:package).provider(:gem).suitable? def test_list_gems gems = nil assert_nothing_raised { - gems = Puppet::Type.type(:package).pkgtype(:gem).list + gems = Puppet::Type.type(:package).provider(:gem).list } gems.each do |gem| - assert_equal(:gem, gem[:type], + assert_equal(:gem, gem[:provider], "Type was not set correctly") end end @@ -396,7 +385,7 @@ class TestPackages < Test::Unit::TestCase :name => name, :version => "0.0.2", :ensure => "installed", - :type => :gem + :provider => :gem ) } @@ -410,7 +399,7 @@ class TestPackages < Test::Unit::TestCase return end - assert_events([:package_created], gem) + assert_events([:package_installed], gem) assert_nothing_raised { gem.retrieve @@ -421,7 +410,7 @@ class TestPackages < Test::Unit::TestCase latest = nil assert_nothing_raised { - latest = gem.latest + latest = gem.provider.latest } assert(latest != gem[:version], "Did not correctly find latest value") @@ -440,12 +429,13 @@ class TestPackages < Test::Unit::TestCase end else + $stderr.puts "Install gems for gem tests" def test_nogems_nofailures obj = nil assert_nothing_raised do Puppet::Type.newpackage( :name => "yayness", - :type => "gem", + :provider => "gem", :ensure => "installed" ) end @@ -455,7 +445,7 @@ class TestPackages < Test::Unit::TestCase end end end - if ["Fedora", "RedHat", "CentOS"].include?(Facter["operatingsystem"].value) and + if Puppet.type(:package).provider(:rpm).suitable? and FileTest.exists?("/home/luke/rpm/RPMS/i386/puppet-server-0.16.1-1.i386.rpm") # We have a special test here, because we don't actually want to install the @@ -464,73 +454,36 @@ class TestPackages < Test::Unit::TestCase pkg = nil assert_nothing_raised { pkg = Puppet::Type.type(:package).create( - :type => :rpm, + :provider => :rpm, :name => "puppet-server", :source => "/home/luke/rpm/RPMS/i386/puppet-server-0.16.1-1.i386.rpm" ) } - assert_equal("0.16.1-1", pkg.latest, "RPM did not provide correct value for latest") + assert_equal("0.16.1-1", pkg.provider.latest, "RPM did not provide correct value for latest") end end - if Facter["operatingsystem"].value == "Solaris" - if pkgget = %x{which pkg-get 2>/dev/null}.chomp and pkgget != "" - # FIXME The packaging crap needs to be rewritten to support testing - # multiple package types on the same platform. - def test_list_blastwave - pkgs = nil - assert_nothing_raised { - pkgs = Puppet::Type.type(:package).pkgtype(:blastwave).list - } - - pkgs.each do |pkg| - if pkg[:name] =~ /^CSW/ - assert_equal(:blastwave, pkg[:type], - "Type was not set correctly") - end + def test_packagedefaults + should = case Facter["operatingsystem"].value + when "Debian": :apt + when "Darwin": :apple + when "RedHat": :rpm + when "Fedora": :yum + when "FreeBSD": :ports + when "OpenBSD": :openbsd + when "Solaris": :sun end - end - def test_install_blastwave - pkg = nil - name = "cabextract" - assert_nothing_raised { - pkg = Puppet::Type.newpackage( - :name => name, - :ensure => "installed", - :type => :blastwave - ) - } + default = Puppet.type(:package).defaultprovider + assert(default, "No default package provider for %s" % + Facter["operatingsystem"].value) - assert_nothing_raised { - pkg.retrieve - } - if pkg.is(:ensure) != :absent - p pkg.is(:ensure) - $stderr.puts "Cannot test pkg installation; %s is already installed" % - name - return + if should + assert_equal(should, default.name, + "Incorrect default package format") end - - assert_events([:package_created], pkg) - - assert_nothing_raised { - pkg.retrieve - } - - latest = nil - assert_nothing_raised { - latest = pkg.latest - } - pkg[:ensure] = :absent - - assert_events([:package_removed], pkg) - end - else - $stderr.puts "No pkg-get scripting; skipping blastwave tests" - end end end end diff --git a/test/types/query.rb b/test/types/query.rb index 451291cac..121670012 100644 --- a/test/types/query.rb +++ b/test/types/query.rb @@ -34,7 +34,7 @@ class TestQuery < Test::Unit::TestCase unless Puppet.type(:service).has_key?("sleeper") Puppet.type(:service).create( :name => "sleeper", - :type => "init", + :provider => "init", :path => File.join($puppetbase,"examples/root/etc/init.d"), :hasstatus => true, :check => [:ensure] @@ -82,6 +82,7 @@ class TestQuery < Test::Unit::TestCase def test_service service = service() + assert(service, "Did not get service object") service.eachstate { |state| assert_nil(state.is) } diff --git a/test/types/service.rb b/test/types/service.rb index 3a8ba089a..176f84818 100644 --- a/test/types/service.rb +++ b/test/types/service.rb @@ -118,7 +118,7 @@ class TestLocalService < Test::Unit::TestCase end def mktestsvcs - tstsvcs.collect { |svc,svcargs| + list = tstsvcs.collect { |svc,svcargs| args = svcargs.dup args[:name] = svc Puppet.type(:service).create(args) @@ -167,11 +167,9 @@ class TestLocalService < Test::Unit::TestCase # test refreshing it assert_nothing_raised() { - service.refresh + service.provider.refresh } - assert(service.respond_to?(:refresh)) - # now stop it assert_nothing_raised() { service[:ensure] = :stopped @@ -229,7 +227,7 @@ class TestLocalService < Test::Unit::TestCase mktestsvcs.each { |svc| val = nil assert_nothing_raised("Could not get status") { - val = svc.status + val = svc.provider.status } assert_instance_of(Symbol, val) } @@ -242,29 +240,28 @@ class TestLocalService < Test::Unit::TestCase mktestsvcs.each { |svc| startstate = nil assert_nothing_raised("Could not get status") { - startstate = svc.status + startstate = svc.provider.status } cycleservice(svc) svc[:ensure] = startstate assert_apply(svc) - Puppet.type(:service).clear Puppet.type(:component).clear } end def test_serviceenabledisable mktestsvcs.each { |svc| + assert(svc[:name], "Service has no name") startstate = nil svc[:check] = :enable assert_nothing_raised("Could not get status") { - startstate = svc.enabled? + startstate = svc.provider.enabled? } cycleenable(svc) svc[:enable] = startstate assert_apply(svc) - Puppet.type(:service).clear Puppet.type(:component).clear } end @@ -299,7 +296,6 @@ class TestLocalService < Test::Unit::TestCase svc[:enable] = startenable svc[:ensure] = startensure assert_apply(svc) - Puppet.type(:service).clear Puppet.type(:component).clear end end diff --git a/test/types/state.rb b/test/types/state.rb index 406b9af6b..638372afe 100644 --- a/test/types/state.rb +++ b/test/types/state.rb @@ -32,6 +32,7 @@ class TestState < Test::Unit::TestCase def test_newvalue state = newstate() + # These are bogus because they don't define events. :/ assert_nothing_raised { state.newvalue(:one) do @is = 1 @@ -51,6 +52,7 @@ class TestState < Test::Unit::TestCase } assert_equal(:one, inst.should) + ret = nil assert_nothing_raised { inst.set_one } assert_equal(1, inst.is) @@ -87,6 +89,43 @@ class TestState < Test::Unit::TestCase assert_equal("yayness".upcase, inst.is) end + + def test_newvalue_event_option + state = newstate() + + assert_nothing_raised do + state.newvalue(:myvalue, :event => :fake_valued) do + @is = :valued + end + state.newvalue(:other, :event => "fake_other") do + @is = :valued + end + end + inst = newinst(state) + + assert_nothing_raised { + inst.should = :myvalue + } + + ret = nil + assert_nothing_raised { + ret = inst.sync + } + + assert_equal(:fake_valued, ret, + "Event did not get returned correctly") + + assert_nothing_raised { + inst.should = :other + } + + assert_nothing_raised { + ret = inst.sync + } + + assert_equal(:fake_other, ret, + "Event did not get returned correctly") + end end # $Id$ diff --git a/test/types/type.rb b/test/types/type.rb index 333c5683f..48e0b4323 100644 --- a/test/types/type.rb +++ b/test/types/type.rb @@ -35,20 +35,22 @@ class TestType < Test::Unit::TestCase # next #end - assert( - type.namevar, - "Failed to retrieve namevar for %s" % name - ) + assert_nothing_raised { + assert( + type.namevar, + "Failed to retrieve namevar for %s" % name + ) - assert_not_nil( - type.states, - "States for %s are nil" % name - ) + assert_not_nil( + type.states, + "States for %s are nil" % name + ) - assert_not_nil( - type.validstates, - "Valid states for %s are nil" % name - ) + assert_not_nil( + type.validstates, + "Valid states for %s are nil" % name + ) + } } end @@ -464,6 +466,63 @@ end assert_equal("yaytest", File.read(path), "Exec did not correctly copy file.") end + + def test_newstate_options + # Create a type with a fake provider + providerclass = Class.new do + def method_missing(method, *args) + return method + end + end + self.class.const_set("ProviderClass", providerclass) + + type = Puppet::Type.newtype(:mytype) do + newparam(:name) do + isnamevar + end + def provider + @provider ||= ProviderClass.new + + @provider + end + end + + # Now make a state with no options. + state = nil + assert_nothing_raised do + state = type.newstate(:noopts) do + end + end + + # Now create an instance + obj = type.create(:name => :myobj) + + inst = state.new(:parent => obj) + + # And make sure it's correctly setting @is + ret = nil + assert_nothing_raised { + ret = inst.retrieve + } + + assert_equal(:noopts, inst.is) + + # Now create a state with a different way of doing it + state = nil + assert_nothing_raised do + state = type.newstate(:setretrieve, :retrieve => :yayness) + end + + inst = state.new(:parent => obj) + + # And make sure it's correctly setting @is + ret = nil + assert_nothing_raised { + ret = inst.retrieve + } + + assert_equal(:yayness, inst.is) + end end # $Id$ diff --git a/test/types/user.rb b/test/types/user.rb index 87e90ff22..008f39272 100755 --- a/test/types/user.rb +++ b/test/types/user.rb @@ -1,11 +1,9 @@ if __FILE__ == $0 $:.unshift '..' $:.unshift '../../lib' - $puppetbase = "../../../../language/trunk" + $puppetbase = "../.." end -# $Id$ - require 'etc' require 'puppet/type' require 'puppettest' @@ -13,90 +11,37 @@ require 'test/unit' class TestUser < Test::Unit::TestCase include TestPuppet - def setup - super - @@tmpusers = [] - end - def teardown - @@tmpusers.each { |user| - unless missing?(user) - remove(user) + p = Puppet::Type.type(:user).provide :fake, :parent => TestPuppet::FakeProvider do + @name = :fake + apimethods + def create + @ensure = :present + @model.eachstate do |state| + next if state.name == :ensure + state.sync end - } - super - #Puppet.type(:user).clear - end - - case Facter["operatingsystem"].value - when "Darwin": - def missing?(user) - output = %x{nidump -r /users/#{user} / 2>/dev/null}.chomp - - if output == "" - return true - else - return false - end - - assert_equal("", output, "User %s is present:\n%s" % [user, output]) end - def current?(param, name) - state = Puppet.type(:user).states.find { |st| - st.name == param - } - - output = %x{nireport / /users name #{state.netinfokey}} - output.split("\n").each { |line| - if line =~ /^(\w+)\s+(.+)$/ - user = $1 - id = $2.sub(/\s+$/, '') - if user == name - if id =~ /^[-0-9]+$/ - return Integer(id) - else - return id - end - end - else - raise "Could not match %s" % line - end - } - - return nil + def delete + @ensure = :absent + @model.eachstate do |state| + send(state.name.to_s + "=", :absent) + end end - def remove(user) - system("niutil -destroy / /users/%s" % user) - end - else - def missing?(user) - begin - obj = Etc.getpwnam(user) - return false - rescue ArgumentError - return true + def exists? + if defined? @ensure and @ensure == :present + true + else + false end end + end - def current?(param, name) - state = Puppet.type(:user).states.find { |st| - st.name == param - } - - assert_nothing_raised { - obj = Etc.getpwnam(name) - return obj.send(state.posixmethod) - } - - return nil - end + FakeUserProvider = p - def remove(user) - system("userdel %s" % user) - end - end + @@fakeproviders[:group] = p def findshell(old = nil) %w{/bin/sh /bin/bash /sbin/sh /bin/ksh /bin/zsh /bin/csh /bin/tcsh @@ -110,6 +55,16 @@ class TestUser < Test::Unit::TestCase } end + def setup + super + Puppet::Type.type(:user).defaultprovider = FakeUserProvider + end + + def teardown + Puppet::Type.type(:user).defaultprovider = nil + super + end + def mkuser(name) user = nil assert_nothing_raised { @@ -122,19 +77,21 @@ class TestUser < Test::Unit::TestCase ) } + assert(user, "Did not create user") + return user end def attrtest_ensure(user) - old = user.is(:ensure) + old = user.provider.ensure user[:ensure] = :absent comp = newcomp("ensuretest", user) assert_apply(user) - assert(missing?(user.name), "User is still present") + assert(!user.provider.exists?, "User is still present") user[:ensure] = :present assert_events([:user_created], comp) - assert(!missing?(user.name), "User is absent") + assert(user.provider.exists?, "User is absent") user[:ensure] = :absent trans = assert_events([:user_removed], comp) @@ -146,19 +103,19 @@ class TestUser < Test::Unit::TestCase def attrtest_comment(user) user.retrieve - old = user.is(:comment) + old = user.provider.comment user[:comment] = "A different comment" comp = newcomp("commenttest", user) - trans = assert_events([:user_modified], comp, "user") + trans = assert_events([:user_changed], comp, "user") - assert_equal("A different comment", current?(:comment, user[:name]), + assert_equal("A different comment", user.provider.comment, "Comment was not changed") - assert_rollback_events(trans, [:user_modified], "user") + assert_rollback_events(trans, [:user_changed], "user") - assert_equal(old, current?(:comment, user[:name]), + assert_equal(old, user.provider.comment, "Comment was not reverted") end @@ -166,24 +123,24 @@ class TestUser < Test::Unit::TestCase obj = nil comp = newcomp("hometest", user) - old = current?(:home, user[:name]) + old = user.provider.home user[:home] = old trans = assert_events([], comp, "user") user[:home] = "/tmp" - trans = assert_events([:user_modified], comp, "user") + trans = assert_events([:user_changed], comp, "user") - assert_equal("/tmp", current?(:home, user[:name]), "Home was not changed") + assert_equal("/tmp", user.provider.home, "Home was not changed") - assert_rollback_events(trans, [:user_modified], "user") + assert_rollback_events(trans, [:user_changed], "user") - assert_equal(old, current?(:home, user[:name]), "Home was not reverted") + assert_equal(old, user.provider.home, "Home was not reverted") end def attrtest_shell(user) - old = current?(:shell, user[:name]) + old = user.provider.shell comp = newcomp("shelltest", user) user[:shell] = old @@ -199,19 +156,21 @@ class TestUser < Test::Unit::TestCase user[:shell] = newshell - trans = assert_events([:user_modified], comp, "user") + trans = assert_events([:user_changed], comp, "user") - assert_equal(newshell, current?(:shell, user[:name]), + user.retrieve + assert_equal(newshell, user.provider.shell, "Shell was not changed") - assert_rollback_events(trans, [:user_modified], "user") + assert_rollback_events(trans, [:user_changed], "user") + user.retrieve - assert_equal(old, current?(:shell, user[:name]), "Shell was not reverted") + assert_equal(old, user.provider.shell, "Shell was not reverted") end def attrtest_gid(user) obj = nil - old = current?(:gid,user.name) + old = user.provider.gid comp = newcomp("gidtest", user) user.retrieve @@ -239,7 +198,7 @@ class TestUser < Test::Unit::TestCase user[:gid] = newgid } - trans = assert_events([:user_modified], comp, "user") + trans = assert_events([:user_changed], comp, "user") # then by id newgid = Etc.getgrnam(newgid).gid @@ -252,23 +211,21 @@ class TestUser < Test::Unit::TestCase assert_events([], comp, "user") - assert_equal(newgid, current?(:gid,user[:name]), "GID was not changed") + assert_equal(newgid, user.provider.gid, "GID was not changed") - assert_rollback_events(trans, [:user_modified], "user") + assert_rollback_events(trans, [:user_changed], "user") - assert_equal(old, current?(:gid,user[:name]), "GID was not reverted") + assert_equal(old, user.provider.gid, "GID was not reverted") end def attrtest_uid(user) obj = nil comp = newcomp("uidtest", user) - old = current?(:uid, user[:name]) - user[:uid] = old + user.provider.uid = 1 - trans = assert_events([], comp, "user") - - newuid = old + old = 1 + newuid = 1 while true newuid += 1 @@ -287,13 +244,13 @@ class TestUser < Test::Unit::TestCase user[:uid] = newuid } - trans = assert_events([:user_modified], comp, "user") + trans = assert_events([:user_changed], comp, "user") - assert_equal(newuid, current?(:uid, user[:name]), "UID was not changed") + assert_equal(newuid, user.provider.uid, "UID was not changed") - assert_rollback_events(trans, [:user_modified], "user") + assert_rollback_events(trans, [:user_changed], "user") - assert_equal(old, current?(:uid, user[:name]), "UID was not reverted") + assert_equal(old, user.provider.uid, "UID was not reverted") end def attrtest_groups(user) @@ -311,11 +268,7 @@ class TestUser < Test::Unit::TestCase 5.times do |i| i += 1 name = "pptstgr%s" % i - groups << Puppet.type(:group).create( - :name => name, - :gid => max + i - ) - + groups << name if i < 3 main << name else @@ -323,9 +276,6 @@ class TestUser < Test::Unit::TestCase end end - # Create our test groups - assert_apply(*groups) - assert(user[:membership] == :minimum, "Membership did not default correctly") assert_nothing_raised { @@ -353,6 +303,10 @@ class TestUser < Test::Unit::TestCase user[:ensure] = :present assert_apply(user) + # Make sure that the groups are a string, not an array + assert(user.provider.groups.is_a?(String), + "Incorrectly passed an array to groups") + user.retrieve assert(user.state(:groups).is, "Did not retrieve group list") @@ -365,7 +319,7 @@ class TestUser < Test::Unit::TestCase user[:groups] = main } - assert_equal((main + extra).sort.join(","), user.state(:groups).should) + assert_equal((main + extra).sort, user.state(:groups).should.sort) assert_nothing_raised { user.retrieve @@ -393,7 +347,7 @@ class TestUser < Test::Unit::TestCase assert(!user.insync?, "User is incorrectly in sync") - assert_events([:user_modified], user) + assert_events([:user_changed], user) assert_nothing_raised { user.retrieve } @@ -401,75 +355,35 @@ class TestUser < Test::Unit::TestCase list = user.state(:groups).is assert_equal(main.sort, list.sort, "Group list is not equal") - # Now delete our groups - groups.each do |group| - group[:ensure] = :absent - end - user.delete(:groups) - - assert_apply(*groups) - end - - # Disabled, because this is testing too much internal implementation - def disabled_test_eachmethod - obj = Etc.getpwuid(Process.uid) - - assert(obj, "Could not retrieve test group object") - - Puppet.type(:user).validstates.each { |name| - assert_nothing_raised { - method = state.posixmethod - assert(method, "State %s has no infomethod" % name) - assert(obj.respond_to?(method), - "State %s has an invalid method %s" % - [name, method]) - } - } end - def test_checking - require 'etc' - - name = nil - assert_nothing_raised { - name = Etc.getpwuid(Process.uid).name - } + def test_autorequire + file = tempfile() + comp = nil user = nil + group =nil + home = nil + ogroup = nil assert_nothing_raised { - checks = Puppet.type(:user).validstates user = Puppet.type(:user).create( - :name => name, - :check => checks + :name => "pptestu", + :home => file, + :gid => "pptestg", + :groups => "yayness" ) + home = Puppet.type(:file).create( + :path => file, + :ensure => "directory" + ) + group = Puppet.type(:group).create( + :name => "pptestg" + ) + ogroup = Puppet.type(:group).create( + :name => "yayness" + ) + comp = newcomp(user, group, home, ogroup) } - - assert_nothing_raised { - user.retrieve - } - - assert_equal(Process.uid, user.is(:uid), "Retrieved UID does not match") - end - - def test_autorequire - file = tempfile() - user = Puppet.type(:user).create( - :name => "pptestu", - :home => file, - :gid => "pptestg", - :groups => "yayness" - ) - home = Puppet.type(:file).create( - :path => file, - :ensure => "directory" - ) - group = Puppet.type(:group).create( - :name => "pptestg" - ) - ogroup = Puppet.type(:group).create( - :name => "yayness" - ) - comp = newcomp(user, group, home, ogroup) comp.finalize comp.retrieve @@ -478,86 +392,52 @@ class TestUser < Test::Unit::TestCase assert(user.requires?(ogroup), "User did not require other groups") end - if Process.uid == 0 - def test_simpleuser - name = "pptest" - - assert(missing?(name), "User %s is present" % name) - - user = mkuser(name) - - @@tmpusers << name - - comp = newcomp("usercomp", user) + def test_simpleuser + name = "pptest" - trans = assert_events([:user_created], comp, "user") + user = mkuser(name) - assert_equal("Puppet Testing User", current?(:comment, user[:name]), - "Comment was not set") + comp = newcomp("usercomp", user) - assert_rollback_events(trans, [:user_removed], "user") + trans = assert_events([:user_created], comp, "user") - assert(missing?(user[:name])) - end - - def test_allstates - user = nil - name = "pptest" + assert_equal(user.should(:comment), user.provider.comment, + "Comment was not set correctly") - assert(missing?(name), "User %s is present" % name) + assert_rollback_events(trans, [:user_removed], "user") - user = mkuser(name) + assert(! user.provider.exists?, "User did not get deleted") + end - @@tmpusers << name + def test_allusermodelstates + user = nil + name = "pptest" - comp = newcomp("usercomp", user) + user = mkuser(name) - trans = assert_events([:user_created], comp, "user") + assert(! user.provider.exists?, "User %s is present" % name) - user.retrieve - assert_equal("Puppet Testing User", current?(:comment, user[:name]), - "Comment was not set") + comp = newcomp("usercomp", user) - tests = Puppet.type(:user).validstates + trans = assert_events([:user_created], comp, "user") - tests.each { |test| - next unless test.to_s =~ /groups/ - if self.respond_to?("attrtest_%s" % test) - self.send("attrtest_%s" % test, user) - else - Puppet.err "Not testing attr %s of user" % test - end - } - - user[:ensure] = :absent - assert_apply(user) - end + user.retrieve + assert_equal("Puppet Testing User", user.provider.comment, + "Comment was not set") - def test_duplicateIDs - user1 = mkuser("user1") - user1[:uid] = 125 - user2 = mkuser("user2") - user2[:uid] = 125 + tests = Puppet.type(:user).validstates - cleanup do - user1[:ensure] = :absent - user2[:ensure] = :absent - assert_apply(user1, user2) + tests.each { |test| + if self.respond_to?("attrtest_%s" % test) + self.send("attrtest_%s" % test, user) + else + Puppet.err "Not testing attr %s of user" % test end + } - assert_apply(user1) - - # Not all OSes fail here, so we can't test that it doesn't work with - # it off, only that it does work with it on. - assert_nothing_raised { - user2[:allowdupe] = true - } - assert_apply(user2) - user2.retrieve - assert_equal(:present, user2.state(:ensure).is, - "User did not get created") - end - else - $stderr.puts "Not root; skipping user creation/modification tests" + user[:ensure] = :absent + assert_apply(user) end end + +# $Id$ |
