The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use warnings;
use strict;

use Test::More;

use FindBin;

use lib "$FindBin::Bin";
use Memd;

if ($Memd::memd) {
    plan tests => 13;
} else {
    plan skip_all => 'Not connected';
}


use constant THRESHOLD => 1024 * 1024 - 1024;

my $key = 'big_value';
my $value = 'x' x THRESHOLD;
my $small_value = 'x' x (THRESHOLD - 2048);
my $big_value = 'x' x (THRESHOLD + 2048);

my %smaller_params = %Memd::params;
$smaller_params{max_size} = THRESHOLD - 2048;
$smaller_params{namespace} .= 'smaller/';
my $smaller_memd = new Cache::Memcached::Fast(\%smaller_params);

my %bigger_params = %Memd::params;
$bigger_params{max_size} = THRESHOLD + 2048;
$bigger_params{namespace} .= 'bigger/';
my $bigger_memd = new Cache::Memcached::Fast(\%bigger_params);

$Memd::memd->enable_compress(0);
$smaller_memd->enable_compress(0);
$bigger_memd->enable_compress(0);

ok($Memd::memd->set($key, $value), 'Store value uncompressed');
ok($Memd::memd->get($key) eq $value, 'Fetch');
ok(! $smaller_memd->set($key, $value),
   'Values equal to or greater than THRESHOLD should be rejected by module');
ok(! $bigger_memd->set($key, $big_value),
   'Values greater than 1MB should be rejected by server');

my @res = $smaller_memd->set_multi(["$key-1", $small_value],
                                   ["$key-2", $big_value],
                                   ["$key-3", $small_value]);
ok($res[0] and not defined $res[1] and $res[2]);
ok($smaller_memd->delete_multi("$key-1", "$key-3"));

SKIP: {
    my $warning;

    {
        local $SIG{__WARN__} = sub { die $_[0] };

        eval {
            $Memd::memd->enable_compress(1);
            $smaller_memd->enable_compress(1);
            $bigger_memd->enable_compress(1);
        }
    }

    if ($@) {
        if ($@ =~ /^Compression module was not found/) {
            skip $@, 6;
        } else {
            warn "$@\n";
        }
    }

    ok($smaller_memd->set($key, $value), 'Store compressed value');
    ok($bigger_memd->set($key, $big_value), 'Store compressed value');

    ok($smaller_memd->get($key) eq $value, 'Fetch and uncompress');
    ok($bigger_memd->get($key) eq $big_value, 'Fetch and uncompress');

    ok($smaller_memd->delete($key), 'Delete');
    ok($bigger_memd->delete($key), 'Delete');
}

ok($Memd::memd->delete($key), 'Delete');