The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w
use strict;

use SVK::Util qw(can_run abs_path);
use SVK::Test;
use Pushmi::Test;
BEGIN { check_apache() }

use Test::More tests => 11;

use File::Spec::Functions qw(rel2abs catdir catfile);

my ($xd, $svk) = build_test('master', 'slave');
my $tree = create_basic_tree ($xd, '/master/');
my $masterdepot = $xd->find_depot('master');
my $slavedepot = $xd->find_depot('slave');

my $apache_root = rel2abs(catdir ('t', 'apache_master'));
my ($passwd, $policy) = map { catfile($apache_root, $_) }
                          qw/svnpasswd svnpolicy/;

# XXX: write a test which wouldn't fail only if we have svnpolicy
my ( $master, $master_url ) = get_dav_server(
    apache_root => rel2abs( catdir( 't', 'apache_master' ) ),
    repospath   => $masterdepot->repospath,
    map { $_ => catfile( $apache_root, $_ ) } qw/svnpasswd svnpolicy/,
);
diag $master_url;

overwrite_file($passwd, "test:LM9XDLRiC7OUE
mirror:TUcTg/K0XfIcI
"); # test: test, mirror: secret
overwrite_file($policy, q{
[/]
mirror = rw
test = r
[/X]
test = rw

});

my $perl = join(' ', $^X, map { "'-I$_'" } abs_path(@INC));
my $pushmi = can_run('pushmi') or die "can't find pushmi";
my ( $slave, $slave_url ) = get_dav_server(
    apache_root => rel2abs( catdir( 't', 'apache_slave' ) ),
    repospath   => $slavedepot->repospath,
    extra_modules => ['perl'],
    (map { $_ => catfile( $apache_root, $_ ) } qw/svnpasswd svnpolicy/),
    extra_config => qq{
PerlSetVar PushmiConfig $FindBin::Bin/pushmi.conf
Require valid-user
PerlAuthzHandler Pushmi::Apache::AuthCache
},
);

$master->start;
{
    local $ENV{PERL5LIB}=join(':', map { abs_path($_) } @INC);
    $slave->start;
}

start_memcached();
#my $perlbal_port = 9998;
#my $perlbal_url = start_perlbal($perlbal_port);
my ($perlbal_url, $perlbal_port) = ($slave_url, 5009);
diag $perlbal_url;

run_pushmi('mirror', $slavedepot->repospath, $master_url);
system('svn', 'mkdir', '--non-interactive', '--no-auth-cache', '--username' => 'mirror', '--password' => 'secret', -m => 'mkdir', "$master_url/X");

run_pushmi('sync', $slavedepot->repospath);
is_svn_output(['mkdir', '--non-interactive', '--no-auth-cache', '--username' => 'test', '--password' => 'test', -m => 'mkdir', "$perlbal_url/orzzzz"],
	      [],
	      [qr{svn: .*403 Forbidden}]);

#sleep 1 while 1;
is_svn_output(['mkdir', '--non-interactive', '--no-auth-cache', '--username' => 'test', '--password' => 'test', -m => 'mkdir', "$perlbal_url/X/mmmm"],
	      ['','Committed revision 4.']);
diag $slave_url;

is($masterdepot->repos->fs->revision_prop(4, 'svn:author'), 'test', 'user is correct');

is($slavedepot->repos->fs->revision_prop(4, 'svn:author'), 'test', 'user is correct');

my ($copath,  $corpath)  = get_copath('auth-svn');

is_svn_output(['co', '--non-interactive', '--no-auth-cache', '--username' => 'test', '--password' => 'test', "$slave_url/X", $copath],
	      ['A    t/checkout/auth-svn/mmmm',
	       'Checked out revision 4.']);

overwrite_file("$copath/fileA.txt", "fnord");

is_svn_output(['add', "$copath/fileA.txt"],
	      ['A         t/checkout/auth-svn/fileA.txt']);

is_svn_output(['ci', '--non-interactive', '--no-auth-cache', '--username' => 'test', '--password' => '', -m => 'commit a single file', $copath],
	      [],
	      ["svn: Commit failed (details follow):",
	       "svn: OPTIONS request failed on '/svn/X'",
	       "svn: OPTIONS of '/svn/X': authorization failed (http://localhost:$perlbal_port)"]);

is_svn_output(['ci', '--non-interactive', '--no-auth-cache', '--username' => 'test', '--password' => 'test', -m => 'commit a single file', $copath],
	      ['Adding         t/checkout/auth-svn/fileA.txt',
	       'Transmitting file data .',
	       'Committed revision 5.']);



append_file("$copath/fileA.txt", "fnordfnord");


is_svn_output(['ci', '--non-interactive', '--no-auth-cache', '--username' => 'test', '--password' => 'test', -m => 'commit a single file', $copath],
	      ['Sending        t/checkout/auth-svn/fileA.txt',
	       'Transmitting file data .',
	       'Committed revision 6.']);

is_svn_output(['rm', "$copath/mmmm"],
	      ['D         t/checkout/auth-svn/mmmm']);


is_svn_output(['ci', '--non-interactive', '--no-auth-cache', '--username' => 'test', '--password' => 'test', -m => 'commit a single file', $copath],
	      ['Deleting       t/checkout/auth-svn/mmmm',
	       '',
	       'Committed revision 7.']);