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

# $Revision: 1.14 $

use strict;
use Test::More tests => 15;

use File::Temp qw( tempdir );

use_ok("Mozilla::Backup");

my $tmpdir = tempdir( CLEANUP => 1 );

my $moz = new Mozilla::Backup();
ok(defined $moz, "new (no options)");

$moz = new Mozilla::Backup(
  pseudo => $tmpdir,
  debug  => 0,
  plugin => [ 'Mozilla::Backup::Plugin::Zip', compression => 6 ],
);
ok(defined $moz, "new");


my @all   = $moz->profile_types;
ok(@all, "profile_types");


my %types = map { $_ => 1 } ($moz->found_profile_types);

# Hm. Should this fail if no profiles found?

SKIP: {
  skip "No profiles found", 1 unless (keys %types);
  ok(%types, "found_profile_types");
}

my $prof_name = 0;

foreach my $type (qw( pseudo )) {

 SKIP: {
    skip "No $type profiles found", 10 unless ($moz->type_exists($type));

    my @profs = $moz->type($type)->profile_names();
    ok(@profs, "$type profile_names");

    ok(-r $moz->type($type)->ini_file, "ini_file");

    my $name  = $profs[0];
    ok($moz->type($type)->profile_exists($name), "$name profile exists");

    skip "No profile found for type", 7
      unless ($moz->type($type)->profile_exists($name));

    ok(-d $moz->type($type)->profile_path($name), "profile_path");

    ok(defined $moz->type($type)->profile_is_relative($name), "profile_is_relative");

    ok($moz->type($type)->profile_id($name), "profile_id");

    my $arch = $moz->_archive_name($type,$name);
    ok($arch =~ /^$type\-$name\-\d{8}\-\d{6}\.zip$/, "archive_name");

    skip "profile is locked", 3
      if ($moz->type($type)->profile_is_locked($name));

    my $file = $moz->backup_profile($type,$name,$tmpdir,$arch);
    ok(-e $file, "backup_profile $file");

    my $verify = File::Spec->catfile($tmpdir,$arch);
    ok(-e $verify, "file is where expected to be");

    # TODO - test that it is a valid zip file,
    #      - test that it does not have files that were excluded
    #        (such as Cache, etc.)
    #      - test that it is relative vs. absolute as appropriate
    #      - test separate backup that is opposite of profile_is_relative

    my $restored = sprintf("test%04d", ++$prof_name);

    SKIP : {
      skip "$restored profile exists", 1
	if ($moz->type("pseudo")->profile_exists($restored));

      $moz->restore_profile($file, "pseudo", $restored);

      my $rest_path = $moz->type($type)->profile_path($restored);
      ok(-d $rest_path, "restore path exists");

      # TODO - test that files are extracted?

    }

  }
}