2010-11-18 16:33:48 +00:00
|
|
|
#!/usr/bin/lua
|
|
|
|
-- a heavy duty test.
|
|
|
|
-- makes thousends of random changes to the source tree
|
|
|
|
-- checks every X changes if lsyncd managed to keep target tree in sync.
|
|
|
|
require("posix")
|
|
|
|
dofile("tests/testlib.lua")
|
|
|
|
|
|
|
|
-- always makes the same "random", so failures can be debugged.
|
2010-11-19 10:38:21 +00:00
|
|
|
math.randomseed(6)
|
2010-11-18 16:33:48 +00:00
|
|
|
|
2010-11-18 16:59:50 +00:00
|
|
|
local tdir = mktempd().."/"
|
2010-11-18 16:33:48 +00:00
|
|
|
cwriteln("using ", tdir, " as test root")
|
|
|
|
|
|
|
|
local srcdir = tdir.."src/"
|
|
|
|
local trgdir = tdir.."trg/"
|
|
|
|
|
|
|
|
posix.mkdir(srcdir)
|
|
|
|
posix.mkdir(trgdir)
|
2010-11-18 23:35:56 +00:00
|
|
|
-- local pid = spawn("./lsyncd","-nodaemon","-rsync",srcdir,trgdir)
|
2010-11-18 16:33:48 +00:00
|
|
|
|
2010-11-18 16:59:50 +00:00
|
|
|
cwriteln("waiting for Lsyncd to startup")
|
2010-11-18 16:33:48 +00:00
|
|
|
posix.sleep(1)
|
|
|
|
|
|
|
|
-- all dirs created, indexed by integer and path
|
2010-11-18 23:35:56 +00:00
|
|
|
root = {name=""}
|
|
|
|
alldirs = {root}
|
2010-11-19 11:21:12 +00:00
|
|
|
dirsWithFileI = {}
|
|
|
|
dirsWithFileD = {}
|
2010-11-18 23:35:56 +00:00
|
|
|
|
|
|
|
-----
|
|
|
|
-- returns the name of a directory
|
|
|
|
-- call it with name=nil
|
|
|
|
local function dirname(dir, name)
|
|
|
|
name = name or ""
|
|
|
|
if not dir then
|
|
|
|
return name
|
|
|
|
end
|
|
|
|
return dirname(dir.parent, dir.name .. "/" .. name)
|
|
|
|
end
|
|
|
|
|
2010-11-18 16:33:48 +00:00
|
|
|
|
2010-11-18 16:59:50 +00:00
|
|
|
cwriteln("making random data")
|
2010-11-19 10:38:21 +00:00
|
|
|
for ai=1,10 do
|
2010-11-18 16:33:48 +00:00
|
|
|
-- throw a die what to do
|
2010-11-19 10:38:21 +00:00
|
|
|
local acn = math.random(3)
|
2010-11-18 16:33:48 +00:00
|
|
|
|
2010-11-19 10:38:21 +00:00
|
|
|
if acn <= 1 then
|
|
|
|
-- creates a directory
|
2010-11-18 16:33:48 +00:00
|
|
|
-- chooses a random directory to create it into
|
2010-11-19 10:38:21 +00:00
|
|
|
local rdir = alldirs[math.random(#alldirs)]
|
2010-11-18 23:35:56 +00:00
|
|
|
-- creates a new random one letter name
|
|
|
|
local nn = string.char(96 + math.random(26))
|
2010-11-19 10:38:21 +00:00
|
|
|
if not rdir[nn] then
|
2010-11-18 23:35:56 +00:00
|
|
|
local ndir = {
|
|
|
|
name = nn,
|
2010-11-19 10:38:21 +00:00
|
|
|
parent = rdir,
|
2010-11-18 23:35:56 +00:00
|
|
|
}
|
|
|
|
local dn = dirname(ndir)
|
2010-11-19 10:38:21 +00:00
|
|
|
rdir[nn] = dn
|
2010-11-18 23:35:56 +00:00
|
|
|
table.insert(alldirs, ndir)
|
2010-11-19 10:38:21 +00:00
|
|
|
cwriteln("mkdir "..srcdir..dn)
|
2010-11-18 23:35:56 +00:00
|
|
|
posix.mkdir(srcdir..dn)
|
2010-11-18 16:33:48 +00:00
|
|
|
end
|
2010-11-19 10:38:21 +00:00
|
|
|
elseif acn <= 2 then
|
|
|
|
-- creates a file
|
2010-11-18 23:35:56 +00:00
|
|
|
-- chooses a random directory to create it into
|
2010-11-19 10:38:21 +00:00
|
|
|
local rdir = alldirs[math.random(#alldirs)]
|
2010-11-18 23:35:56 +00:00
|
|
|
-- creates a new random one letter name
|
|
|
|
local nn = 'f'..string.char(96 + math.random(26))
|
2010-11-19 10:38:21 +00:00
|
|
|
local fn = dirname(rdir) .. nn
|
|
|
|
cwriteln("mkfile "..srcdir..fn)
|
|
|
|
local f = io.open(srcdir..fn, "w")
|
|
|
|
if f then
|
|
|
|
for i=1,10 do
|
|
|
|
f:write(string.char(96 + math.random(26)))
|
|
|
|
end
|
|
|
|
f:write('\n')
|
|
|
|
f:close()
|
2010-11-19 11:21:12 +00:00
|
|
|
rdir[nn]=true
|
|
|
|
if not dirsWithFileD[rdir] then
|
|
|
|
table.insert(dirsWithFileI, rdir)
|
|
|
|
dirsWithFileD[rdir]=true
|
|
|
|
end
|
2010-11-19 10:38:21 +00:00
|
|
|
end
|
|
|
|
elseif acn <= 3 then
|
|
|
|
-- moves a directory
|
|
|
|
if #alldirs > 2 then
|
|
|
|
-- chooses a random directory to move
|
|
|
|
local odir = alldirs[math.random(2, #alldirs)]
|
|
|
|
-- chooses a random directory to move to
|
2010-11-19 11:21:12 +00:00
|
|
|
local tdir = alldirs[math.random(1, #alldirs)]
|
2010-11-19 10:38:21 +00:00
|
|
|
if tdir[odir.name] == nil then
|
|
|
|
-- origin name not in target dir already
|
|
|
|
local on = dirname(odir)
|
|
|
|
local tn = dirname(tdir)
|
2010-11-19 11:21:12 +00:00
|
|
|
cwriteln("mvdir ",srcdir,on," -> ",srcdir,tn,odir.name)
|
2010-11-19 10:38:21 +00:00
|
|
|
os.rename(srcdir..on, srcdir..tn..odir.name)
|
|
|
|
odir.parent[odir.name] = nil
|
|
|
|
tdir[odir.name] = odir
|
|
|
|
end
|
|
|
|
end
|
2010-11-19 11:21:12 +00:00
|
|
|
elseif acn <= 4 then
|
|
|
|
-- moves a file
|
|
|
|
if #dirsWithFileI > 1 then
|
|
|
|
-- picks a directory with a file at random
|
|
|
|
local odir = dirsWithFileI[math.random(1, #dirsWithFileI)]
|
|
|
|
local nf = 0
|
|
|
|
-- counts the files in there
|
|
|
|
for name, _ in odir do
|
|
|
|
if #name == 2 then
|
|
|
|
nf = nf + 1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
-- picks one file at random
|
|
|
|
nf = math.random(1, nf)
|
|
|
|
local mn
|
|
|
|
for name, _ in odir do
|
|
|
|
if #name == then
|
|
|
|
nf = nf - 1
|
|
|
|
end
|
|
|
|
if nf == 0 then
|
|
|
|
mn = name
|
|
|
|
end
|
|
|
|
end
|
|
|
|
-- picks a target directory at random
|
|
|
|
local tdir = alldirs[math.random(1, #alldirs)]
|
|
|
|
local on = dirname(odir)
|
|
|
|
local tn = dirname(tdir)
|
|
|
|
cwriteln("mvfile ",srcdir,on,mn," -> ",srcdir,tn,XXX )
|
|
|
|
end
|
2010-11-18 16:33:48 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2010-11-18 16:59:50 +00:00
|
|
|
cwriteln("waiting for Lsyncd to finish its jobs.")
|
|
|
|
posix.sleep(20)
|
2010-11-18 16:33:48 +00:00
|
|
|
|
2010-11-18 16:59:50 +00:00
|
|
|
cwriteln("killing the Lsyncd daemon")
|
|
|
|
posix.kill(pid)
|
|
|
|
local _, exitmsg, exitcode = posix.wait(lpid)
|
|
|
|
cwriteln("Exitcode of Lsyncd = ", exitmsg, " ", exitcode)
|
2010-11-18 16:33:48 +00:00
|
|
|
|
2010-11-18 16:59:50 +00:00
|
|
|
exitcode = os.execute("diff -r "..srcdir.." "..trgdir)
|
|
|
|
cwriteln("Exitcode of diff = ", exitcode)
|
|
|
|
os.exit(exitcode)
|
2010-11-18 16:33:48 +00:00
|
|
|
|