EV-Etcd

 view release on metacpan or  search on metacpan

t/binary_data.t  view on Meta::CPAN

#!/usr/bin/env perl
use strict;
use warnings;
use lib 'blib/lib', 'blib/arch';
use Test::More;
use Encode qw(encode_utf8);

# Skip if EV not available
BEGIN {
    eval { require EV };
    plan skip_all => 'EV required' if $@;
}

use EV;
use EV::Etcd;

# Check if etcd is available
my $etcd_available = 0;
eval {
    my $client = EV::Etcd->new(
        endpoints => ['127.0.0.1:2379'],
        timeout => 2,
    );
    $client->status(sub {
        my ($resp, $err) = @_;
        $etcd_available = 1 if !$err;
        EV::break;
    });
    my $t = EV::timer(3, 0, sub { EV::break });
    EV::run;
};

plan skip_all => 'etcd not available on 127.0.0.1:2379' unless $etcd_available;

plan tests => 18;

my $client = EV::Etcd->new(
    endpoints => ['127.0.0.1:2379'],
);

my $prefix = "/test-binary-$$-" . time();

# Test 1-3: UTF-8 key and value
{
    my $utf8_key = "$prefix/utf8-\x{4e2d}\x{6587}";  # Chinese characters
    my $utf8_value = "value-\x{65e5}\x{672c}\x{8a9e}";  # Japanese characters

    my $put_ok = 0;
    $client->put(encode_utf8($utf8_key), encode_utf8($utf8_value), sub {
        my ($resp, $err) = @_;
        $put_ok = !$err && $resp->{header};
        EV::break;
    });
    my $t1 = EV::timer(5, 0, sub { EV::break });
    EV::run;

    ok($put_ok, 'put with UTF-8 key and value succeeded');

    my $get_value;
    $client->get(encode_utf8($utf8_key), sub {
        my ($resp, $err) = @_;
        if (!$err && $resp->{kvs} && @{$resp->{kvs}}) {
            $get_value = $resp->{kvs}[0]{value};
        }
        EV::break;
    });
    my $t2 = EV::timer(5, 0, sub { EV::break });
    EV::run;

    ok(defined $get_value, 'get UTF-8 key succeeded');
    is($get_value, encode_utf8($utf8_value), 'UTF-8 value round-trips correctly');
    diag("UTF-8 test: stored and retrieved CJK characters");
}

# Test 4-6: Binary data with null bytes
{
    my $binary_key = "$prefix/binary-key";
    my $binary_value = "before\x00middle\x00after";  # Contains null bytes

    my $put_ok = 0;
    $client->put($binary_key, $binary_value, sub {
        my ($resp, $err) = @_;
        $put_ok = !$err && $resp->{header};
        EV::break;
    });
    my $t3 = EV::timer(5, 0, sub { EV::break });
    EV::run;

    ok($put_ok, 'put with binary value (null bytes) succeeded');

    my $get_value;
    $client->get($binary_key, sub {
        my ($resp, $err) = @_;
        if (!$err && $resp->{kvs} && @{$resp->{kvs}}) {
            $get_value = $resp->{kvs}[0]{value};
        }
        EV::break;
    });



( run in 1.410 second using v1.01-cache-2.11-cpan-524268b4103 )