Blame t/chunked-items.t

Packit 4e8bc4
#!/usr/bin/perl
Packit 4e8bc4
# Networked logging tests.
Packit 4e8bc4
Packit 4e8bc4
use strict;
Packit 4e8bc4
use warnings;
Packit 4e8bc4
Packit 4e8bc4
use Test::More;
Packit 4e8bc4
use FindBin qw($Bin);
Packit 4e8bc4
use lib "$Bin/lib";
Packit 4e8bc4
use MemcachedTest;
Packit 4e8bc4
Packit 4e8bc4
my $server = new_memcached('-m 48 -o slab_chunk_max=16384');
Packit 4e8bc4
my $sock = $server->sock;
Packit 4e8bc4
Packit 4e8bc4
# We're testing to ensure item chaining doesn't corrupt or poorly overlap
Packit 4e8bc4
# data, so create a non-repeating pattern.
Packit 4e8bc4
my @parts = ();
Packit 4e8bc4
for (1 .. 8000) {
Packit 4e8bc4
    push(@parts, $_);
Packit 4e8bc4
}
Packit 4e8bc4
my $pattern = join(':', @parts);
Packit 4e8bc4
Packit 4e8bc4
my $plen = length($pattern);
Packit 4e8bc4
Packit 4e8bc4
print $sock "set pattern 0 0 $plen\r\n$pattern\r\n";
Packit 4e8bc4
is(scalar <$sock>, "STORED\r\n", "stored pattern successfully");
Packit 4e8bc4
Packit 4e8bc4
mem_get_is($sock, "pattern", $pattern);
Packit 4e8bc4
Packit 4e8bc4
for (1..5) {
Packit 4e8bc4
    my $size = 400 * 1024;
Packit 4e8bc4
    my $data = "x" x $size;
Packit 4e8bc4
    print $sock "set foo$_ 0 0 $size\r\n$data\r\n";
Packit 4e8bc4
    my $res = <$sock>;
Packit 4e8bc4
    is($res, "STORED\r\n", "stored some big items");
Packit 4e8bc4
}
Packit 4e8bc4
Packit 4e8bc4
{
Packit 4e8bc4
    my $max = 1024 * 1024;
Packit 4e8bc4
    my $big = "a big value that's > .5M and < 1M. ";
Packit 4e8bc4
    while (length($big) * 2 < $max) {
Packit 4e8bc4
        $big = $big . $big;
Packit 4e8bc4
    }
Packit 4e8bc4
    my $biglen = length($big);
Packit 4e8bc4
Packit 4e8bc4
    for (1..100) {
Packit 4e8bc4
        print $sock "set toast$_ 0 0 $biglen\r\n$big\r\n";
Packit 4e8bc4
        is(scalar <$sock>, "STORED\r\n", "stored big");
Packit 4e8bc4
        mem_get_is($sock, "toast$_", $big);
Packit 4e8bc4
    }
Packit 4e8bc4
}
Packit 4e8bc4
Packit 4e8bc4
# Test a wide range of sets.
Packit 4e8bc4
{
Packit 4e8bc4
    my $len = 1024 * 200;
Packit 4e8bc4
    while ($len < 1024 * 1024) {
Packit 4e8bc4
        my $val = "B" x $len;
Packit 4e8bc4
        print $sock "set foo_$len 0 0 $len\r\n$val\r\n";
Packit 4e8bc4
        is(scalar <$sock>, "STORED\r\n", "stored size $len");
Packit 4e8bc4
        $len += 2048;
Packit 4e8bc4
    }
Packit 4e8bc4
}
Packit 4e8bc4
Packit 4e8bc4
# Test long appends and prepends.
Packit 4e8bc4
# Note: memory bloats like crazy if we use one test per request.
Packit 4e8bc4
{
Packit 4e8bc4
    my $str = 'seedstring';
Packit 4e8bc4
    my $len = length($str);
Packit 4e8bc4
    print $sock "set appender 0 0 $len\r\n$str\r\n";
Packit 4e8bc4
    is(scalar <$sock>, "STORED\r\n", "stored seed string for append");
Packit 4e8bc4
    my $unexpected = 0;
Packit 4e8bc4
    for my $part (@parts) {
Packit 4e8bc4
        # reduce required loops but still have a pattern.
Packit 4e8bc4
        my $todo = $part . "x" x 10;
Packit 4e8bc4
        $str .= $todo;
Packit 4e8bc4
        my $len = length($todo);
Packit 4e8bc4
        print $sock "append appender 0 0 $len\r\n$todo\r\n";
Packit 4e8bc4
        is(scalar <$sock>, "STORED\r\n", "append $todo size $len");
Packit 4e8bc4
        print $sock "get appender\r\n";
Packit 4e8bc4
        my $header = scalar <$sock>;
Packit 4e8bc4
        my $body = scalar <$sock>;
Packit 4e8bc4
        my $end = scalar <$sock>;
Packit 4e8bc4
        $unexpected++ unless $body eq "$str\r\n";
Packit 4e8bc4
    }
Packit 4e8bc4
    is($unexpected, 0, "No unexpected results during appends\n");
Packit 4e8bc4
    # Now test appending a chunked item to a chunked item.
Packit 4e8bc4
    $len = length($str);
Packit 4e8bc4
    print $sock "append appender 0 0 $len\r\n$str\r\n";
Packit 4e8bc4
    is(scalar <$sock>, "STORED\r\n", "append large string size $len");
Packit 4e8bc4
    mem_get_is($sock, "appender", $str . $str);
Packit 4e8bc4
    print $sock "delete appender\r\n";
Packit 4e8bc4
    is(scalar <$sock>, "DELETED\r\n", "removed appender key");
Packit 4e8bc4
}
Packit 4e8bc4
Packit 4e8bc4
{
Packit 4e8bc4
    my $str = 'seedstring';
Packit 4e8bc4
    my $len = length($str);
Packit 4e8bc4
    print $sock "set prepender 0 0 $len\r\n$str\r\n";
Packit 4e8bc4
    is(scalar <$sock>, "STORED\r\n", "stored seed string for append");
Packit 4e8bc4
    my $unexpected = 0;
Packit 4e8bc4
    for my $part (@parts) {
Packit 4e8bc4
        # reduce required loops but still have a pattern.
Packit 4e8bc4
        $part .= "x" x 10;
Packit 4e8bc4
        $str = $part . $str;
Packit 4e8bc4
        my $len = length($part);
Packit 4e8bc4
        print $sock "prepend prepender 0 0 $len\r\n$part\r\n";
Packit 4e8bc4
        is(scalar <$sock>, "STORED\r\n", "prepend $part size $len");
Packit 4e8bc4
        print $sock "get prepender\r\n";
Packit 4e8bc4
        my $header = scalar <$sock>;
Packit 4e8bc4
        my $body = scalar <$sock>;
Packit 4e8bc4
        my $end = scalar <$sock>;
Packit 4e8bc4
        $unexpected++ unless $body eq "$str\r\n";
Packit 4e8bc4
    }
Packit 4e8bc4
    is($unexpected, 0, "No unexpected results during prepends\n");
Packit 4e8bc4
    # Now test prepending a chunked item to a chunked item.
Packit 4e8bc4
    $len = length($str);
Packit 4e8bc4
    print $sock "prepend prepender 0 0 $len\r\n$str\r\n";
Packit 4e8bc4
    is(scalar <$sock>, "STORED\r\n", "prepend large string size $len");
Packit 4e8bc4
    mem_get_is($sock, "prepender", $str . $str);
Packit 4e8bc4
    print $sock "delete prepender\r\n";
Packit 4e8bc4
    is(scalar <$sock>, "DELETED\r\n", "removed prepender key");
Packit 4e8bc4
}
Packit 4e8bc4
Packit 4e8bc4
done_testing();