summaryrefslogtreecommitdiffstats
path: root/test/ral/type/tidy.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/ral/type/tidy.rb')
-rwxr-xr-xtest/ral/type/tidy.rb291
1 files changed, 291 insertions, 0 deletions
diff --git a/test/ral/type/tidy.rb b/test/ral/type/tidy.rb
new file mode 100755
index 000000000..60fad6516
--- /dev/null
+++ b/test/ral/type/tidy.rb
@@ -0,0 +1,291 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../lib/puppettest'
+
+require 'puppettest'
+require 'puppettest/support/utils'
+
+class TestTidy < Test::Unit::TestCase
+ include PuppetTest::Support::Utils
+ include PuppetTest::FileTesting
+ def mktmpfile
+ # because luke's home directory is on nfs, it can't be used for testing
+ # as root
+ tmpfile = tempfile()
+ File.open(tmpfile, "w") { |f| f.puts rand(100) }
+ @@tmpfiles.push tmpfile
+ return tmpfile
+ end
+
+ def mktmpdir
+ dir = File.join(tmpdir(), "puppetlinkdir")
+ unless FileTest.exists?(dir)
+ Dir.mkdir(dir)
+ end
+ @@tmpfiles.push dir
+ return dir
+ end
+
+ def test_tidydirs
+ dir = mktmpdir
+ file = File.join(dir, "file")
+ File.open(file, "w") { |f|
+ f.puts "some stuff"
+ }
+
+ tidy = Puppet.type(:tidy).create(
+ :name => dir,
+ :size => "1b",
+ :rmdirs => true,
+ :recurse => true
+ )
+
+ assert_events([:file_tidied, :file_tidied], tidy)
+
+ assert(!FileTest.exists?(file), "Tidied %s still exists" % file)
+ assert(!FileTest.exists?(dir), "Tidied %s still exists" % dir)
+
+ end
+
+ def disabled_test_recursion
+ source = mktmpdir()
+ FileUtils.cd(source) {
+ mkranddirsandfiles()
+ }
+
+ link = nil
+ assert_nothing_raised {
+ link = newlink(:target => source, :recurse => true)
+ }
+ comp = mk_catalog("linktest",link)
+ cycle(comp)
+
+ path = link.name
+ list = file_list(path)
+ FileUtils.cd(path) {
+ list.each { |file|
+ unless FileTest.directory?(file)
+ assert(FileTest.symlink?(file))
+ target = File.readlink(file)
+ assert_equal(target,File.join(source,file.sub(/^\.\//,'')))
+ end
+ }
+ }
+ end
+
+ # Test the different age iterations.
+ def test_age_conversions
+ tidy = Puppet::Type.newtidy :path => tempfile(), :age => "1m"
+
+ convertors = {
+ :second => 1,
+ :minute => 60
+ }
+
+ convertors[:hour] = convertors[:minute] * 60
+ convertors[:day] = convertors[:hour] * 24
+ convertors[:week] = convertors[:day] * 7
+
+ # First make sure we default to days
+ assert_nothing_raised do
+ tidy[:age] = "2"
+ end
+
+ assert_equal(2 * convertors[:day], tidy.should(:age),
+ "Converted 2 wrong")
+
+ convertors.each do |name, number|
+ init = name.to_s[0..0] # The first letter
+ [0, 1, 5].each do |multi|
+ [init, init.upcase].each do |letter|
+ age = multi.to_s + letter.to_s
+ assert_nothing_raised do
+ tidy[:age] = age
+ end
+
+ assert_equal(multi * convertors[name], tidy.should(:age),
+ "Converted %s wrong" % age)
+ end
+ end
+ end
+ end
+
+ def test_size_conversions
+ convertors = {
+ :b => 0,
+ :kb => 1,
+ :mb => 2,
+ :gb => 3
+ }
+
+ tidy = Puppet::Type.newtidy :path => tempfile(), :age => "1m"
+
+ # First make sure we default to kb
+ assert_nothing_raised do
+ tidy[:size] = "2"
+ end
+
+ assert_equal(2048, tidy.should(:size),
+ "Converted 2 wrong")
+
+ convertors.each do |name, number|
+ init = name.to_s[0..0] # The first letter
+ [0, 1, 5].each do |multi|
+ [init, init.upcase].each do |letter|
+ size = multi.to_s + letter.to_s
+ assert_nothing_raised do
+ tidy[:size] = size
+ end
+
+ total = multi
+ number.times do total *= 1024 end
+
+ assert_equal(total, tidy.should(:size),
+ "Converted %s wrong" % size)
+ end
+ end
+ end
+ end
+
+ def test_agetest
+ tidy = Puppet::Type.newtidy :path => tempfile(), :age => "1m"
+
+ age = tidy.property(:age)
+
+ # Set it to something that should be fine
+ assert(age.insync?(Time.now.to_i - 5), "Tried to tidy a low age")
+
+ # Now to something that should fail
+ assert(! age.insync?(Time.now.to_i - 120), "Incorrectly skipped tidy")
+ end
+
+ def test_sizetest
+ tidy = Puppet::Type.newtidy :path => tempfile(), :size => "1k"
+
+ size = tidy.property(:size)
+
+ # Set it to something that should be fine
+ assert(size.insync?(50), "Tried to tidy a low size")
+
+ # Now to something that should fail
+ assert(! size.insync?(2048), "Incorrectly skipped tidy")
+ end
+
+ # Make sure we can remove different types of files
+ def test_tidytypes
+ path = tempfile()
+ tidy = Puppet::Type.newtidy :path => path, :size => "1b", :age => "1s"
+
+ # Start with a file
+ File.open(path, "w") { |f| f.puts "this is a test" }
+ assert_events([:file_tidied], tidy)
+ assert(! FileTest.exists?(path), "File was not removed")
+
+ # Then a link
+ dest = tempfile
+ File.open(dest, "w") { |f| f.puts "this is a test" }
+ File.symlink(dest, path)
+ assert_events([:file_tidied], tidy)
+ assert(! FileTest.exists?(path), "Link was not removed")
+ assert(FileTest.exists?(dest), "Destination was removed")
+
+ # And a directory
+ Dir.mkdir(path)
+ tidy[:rmdirs] = true
+ assert_events([:file_tidied], tidy)
+ assert(! FileTest.exists?(path), "File was not removed")
+ end
+
+ # Make sure we can specify either attribute and get appropriate behaviour.
+ # I found that the original implementation of this did not work unless both
+ # size and age were specified.
+ def test_one_attribute
+ path = tempfile()
+ File.open(path, "w") { |f| 10.times { f.puts "yayness " } }
+ tidy = Puppet::Type.type(:tidy).create :path => path, :size => "1b"
+
+ assert_apply(tidy)
+ assert(! FileTest.exists?(path), "file did not get tidied")
+
+ tidy.class.clear
+
+ # Now try one with just an age attribute.
+ time = Time.now - 10
+ stat = stub 'stat', :mtime => time, :atime => time, :ftype => "file"
+ File.stubs(:lstat)
+ File.stubs(:lstat).with(path).returns(stat)
+
+ File.open(path, "w") { |f| 10.times { f.puts "yayness " } }
+ tidy = Puppet::Type.type(:tidy).create :path => path, :age => "5s"
+
+
+ assert_apply(tidy)
+ assert(! FileTest.exists?(path), "file did not get tidied")
+ end
+
+ # Testing #355.
+ def test_remove_dead_links
+ dir = tempfile()
+ link = File.join(dir, "link")
+ target = tempfile()
+ Dir.mkdir(dir)
+ File.symlink(target, link)
+
+ tidy = Puppet::Type.newtidy :path => dir, :size => "1b", :recurse => true
+ assert_apply(tidy)
+ assert(! FileTest.symlink?(link), "link was not tidied")
+ end
+
+ def test_glob_matches_single
+ dir = mktmpdir
+ files = {
+ :remove => File.join(dir, "01-foo"),
+ :keep => File.join(dir, "default")
+ }
+ files.each do |tag, file|
+ File.open(file, "w") { |f|
+ f.puts "some stuff"
+ }
+ end
+
+ tidy = Puppet.type(:tidy).create(
+ :name => dir,
+ :size => "1b",
+ :rmdirs => true,
+ :recurse => true,
+ :matches => "01-*"
+ )
+ assert_apply(tidy)
+
+ assert(FileTest.exists?(files[:keep]), "%s was tidied" % files[:keep])
+ assert(!FileTest.exists?(files[:remove]), "Tidied %s still exists" % files[:remove])
+ end
+
+ def test_glob_matches_multiple
+ dir = mktmpdir
+ files = {
+ :remove1 => File.join(dir, "01-foo"),
+ :remove2 => File.join(dir, "02-bar"),
+ :keep1 => File.join(dir, "default")
+ }
+ files.each do |tag, file|
+ File.open(file, "w") { |f|
+ f.puts "some stuff"
+ }
+ end
+
+ tidy = Puppet.type(:tidy).create(
+ :name => dir,
+ :size => "1b",
+ :rmdirs => true,
+ :recurse => true,
+ :matches => ["01-*", "02-*"]
+ )
+ assert_apply(tidy)
+
+ assert(FileTest.exists?(files[:keep1]), "%s was tidied" % files[:keep1])
+ assert(!FileTest.exists?(files[:remove1]), "Tidied %s still exists" % files[:remove1])
+ assert(!FileTest.exists?(files[:remove2]), "Tidied %s still exists" % files[:remove2])
+ end
+end
+