require 'puppettest'
module PuppetTest::FileTesting
include PuppetTest
def cycle(comp)
trans = nil
assert_nothing_raised {
trans = comp.evaluate
}
assert_nothing_raised {
trans.evaluate
}
end
def randlist(list)
num = rand(4)
if num == 0
num = 1
end
set = []
ret = []
num.times { |index|
item = list[rand(list.length)]
if set.include?(item)
redo
end
ret.push item
}
return ret
end
def mkranddirsandfiles(dirs = nil,files = nil,depth = 3)
if depth < 0
return
end
unless dirs
dirs = %w{This Is A Set Of Directories}
end
unless files
files = %w{and this is a set of files}
end
tfiles = randlist(files)
tdirs = randlist(dirs)
tfiles.each { |file|
File.open(file, "w") { |of|
4.times {
of.puts rand(100)
}
}
}
tdirs.each { |dir|
# it shouldn't already exist, but...
unless FileTest.exists?(dir)
Dir.mkdir(dir)
FileUtils.cd(dir) {
mkranddirsandfiles(dirs,files,depth - 1)
}
end
}
end
def file_list(dir)
list = nil
FileUtils.cd(dir) {
list = %x{find . 2>/dev/null}.chomp.split(/\n/)
}
return list
end
def assert_trees_equal(fromdir,todir)
assert(FileTest.directory?(fromdir))
assert(FileTest.directory?(todir))
# verify the file list is the same
fromlist = nil
FileUtils.cd(fromdir) {
fromlist = %x{find . 2>/dev/null}.chomp.split(/\n/).reject { |file|
! FileTest.readable?(file)
}.sort
}
tolist = file_list(todir).sort
fromlist.sort.zip(tolist.sort).each { |a,b|
assert_equal(a, b,
"Fromfile %s with length %s does not match tofile %s with length %s" %
[a, fromlist.length, b, tolist.length])
}
#assert_equal(fromlist,tolist)
# and then do some verification that the files are actually set up
# the same
checked = 0
fromlist.each_with_index { |file,i|
fromfile = File.join(fromdir,file)
tofile = File.join(todir,file)
fromstat = File.stat(fromfile)
tostat = File.stat(tofile)
[:ftype,:gid,:mode,:uid].each { |method|
assert_equal(
fromstat.send(method),
tostat.send(method)
)
next if fromstat.ftype == "directory"
if checked < 10 and i % 3 == 0
from = File.open(fromfile) { |f| f.read }
to = File.open(tofile) { |f| f.read }
assert_equal(from,to)
checked += 1
end
}
}
end
def random_files(dir)
checked = 0
list = file_list(dir)
list.reverse.each_with_index { |file,i|
path = File.join(dir,file)
stat = File.stat(dir)
if checked < 10 and (i % 3) == 2
unless yield path
next
end
checked += 1
end
}
end
def delete_random_files(dir)
deleted = []
random_files(dir) { |file|
stat = File.stat(file)
begin
if stat.ftype == "directory"
false
else
deleted << file
File.unlink(file)
true
end
rescue => detail
# we probably won't be able to open our own secured files
puts detail
false
end
}
return deleted
end
def add_random_files(dir)
added = []
random_files(dir) { |file|
stat = File.stat(file)
begin
if stat.ftype == "directory"
name = File.join(file,"file" + rand(100).to_s)
File.open(name, "w") { |f|
f.puts rand(10)
}
added << name
else
false
end
rescue => detail
# we probably won't be able to open our own secured files
puts detail
false
end
}
return added
end
def modify_random_files(dir)
modded = []
random_files(dir) { |file|
stat = File.stat(file)
begin
if stat.ftype == "directory"
false
else
File.open(file, "w") { |f|
f.puts rand(10)
}
modded << name
true
end
rescue => detail
# we probably won't be able to open our own secured files
puts detail
false
end
}
return modded
end
def readonly_random_files(dir)
modded = []
random_files(dir) { |file|
stat = File.stat(file)
begin
if stat.ftype == "directory"
File.new(file).chmod(0111)
else
File.new(file).chmod(0000)
end
modded << file
rescue => detail
# we probably won't be able to open our own secured files
puts detail
false
end
}
return modded
end
def conffile
exampledir("root/etc/configfile")
end
end
# $Id: filetesting.rb 1632 2006-09-19 18:04:20Z luke $
syntax highlighted by Code2HTML, v. 0.9.1