#!/usr/bin/lua
require("posix")
dofile("tests/testlib.lua")

cwriteln("****************************************************************")
cwriteln(" Testing excludes                                               ")
cwriteln("****************************************************************")

local tdir, srcdir, trgdir = mktemps()
local logfile = tdir .. "log"
local cfgfile = tdir .. "config.lua"
local range = 5
local log = {"-log", "all"}

writefile(cfgfile, [[
settings = {
	logfile = "]]..logfile..[[",
	nodaemon = true,
	delay = 3,
}

sync {
	default.rsync,
	source = "]]..srcdir..[[",
	target = "]]..trgdir..[[",
	exclude = {
		"erf",
		"/eaf",
		"erd/",
		"/ead/",
	},
}]]);

-- writes all files
local function writefiles()
	posix.mkdir(srcdir .. "d");
	writefile(srcdir .. "erf", "erf");
	writefile(srcdir .. "eaf", "erf");
	writefile(srcdir .. "erd", "erd");
	writefile(srcdir .. "ead", "ead");
	writefile(srcdir .. "d/erf", "erf");
	writefile(srcdir .. "d/eaf", "erf");
	writefile(srcdir .. "d/erd", "erd");
	writefile(srcdir .. "d/ead", "ead");
end

-- test if the filename exists, fails if this is different to expect
local function testfile(filename, expect)
	local stat, err = posix.stat(filename)
	if stat and not expect then
		cwriteln("failure: ",filename," should be excluded");
		os.exit(1);
	end
	if not stat and expect then
		cwriteln("failure: ",filename," should not be excluded");
		os.exit(1);
	end
end

-- test all files
local function testfiles()
	testfile(trgdir .. "erf", false);
	testfile(trgdir .. "eaf", false);
	testfile(trgdir .. "erd", true);
	testfile(trgdir .. "ead", true);
	testfile(trgdir .. "d/erf", false);
	testfile(trgdir .. "d/eaf", true);
	testfile(trgdir .. "d/erd", true);
	testfile(trgdir .. "d/ead", true);
end


cwriteln( 'testing startup excludes' );
writefiles( );
cwriteln( 'starting Lsyncd' );
local pid = spawn( './lsyncd', cfgfile, '-log', 'all');

cwriteln( 'waiting for Lsyncd to start' );
posix.sleep( 3 )
cwriteln( 'testing excludes after startup' );
testfiles( );
cwriteln( 'ok, removing sources' );

if srcdir:sub( 1,4 ) ~= '/tmp'
then
	-- just to make sure before rm -rf
	cwriteln( 'exit before drama, srcdir is "', srcdir, '"' );
	os.exit( 1 );
end

os.execute( 'rm -rf '..srcdir..'/*' );

cwriteln( 'waiting for Lsyncd to remove destination' );

posix.sleep( 5 );

_, result, code = os.execute( 'diff -urN ' .. srcdir .. ' ' .. trgdir )

if result ~= 'exit' or code ~= 0
then
	cwriteln( 'fail, target directory not empty!' );
	os.exit( 1 );
end

cwriteln( 'writing files after startup' );
writefiles( );
cwriteln( 'waiting for Lsyncd to transmit changes' );
posix.sleep( 5 );
testfiles( );

cwriteln( 'killing started Lsyncd' );
posix.kill( pid );
local _, exitmsg, lexitcode = posix.wait( lpid );
cwriteln( 'Exitcode of Lsyncd = ', exitmsg, ' ', lexitcode );

if lexitcode == 143
then
	cwriteln( "OK" );
	os.exit( 0 );
else
	os.exit( 1 );
end

-- TODO remove temp
