EV-Etcd
view release on metacpan or search on metacpan
#!/usr/bin/env perl
use strict;
use warnings;
use lib 'blib/lib', 'blib/arch';
use Test::More;
# 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;
# Note: These tests are designed to work whether auth is enabled or not.
# We test user/role management which works regardless of auth state.
# We intentionally avoid enabling/disabling auth to not disrupt the cluster.
plan tests => 30;
my $client = EV::Etcd->new(
endpoints => ['127.0.0.1:2379'],
);
my $test_user = "test-user-$$-" . time();
my $test_role = "test-role-$$-" . time();
# Test 1-2: auth_status
$client->auth_status(sub {
my ($resp, $err) = @_;
ok(!$err, 'auth_status succeeded');
ok(defined $resp->{enabled}, 'auth_status has enabled field');
diag("Auth enabled: " . ($resp->{enabled} ? "yes" : "no"));
EV::break;
});
my $t1 = EV::timer(5, 0, sub { fail('timeout'); EV::break });
EV::run;
# Test 3-4: role_add
$client->role_add($test_role, sub {
my ($resp, $err) = @_;
ok(!$err, 'role_add succeeded');
ok($resp->{header}, 'role_add response has header');
diag("Created role: $test_role");
EV::break;
});
my $t2 = EV::timer(5, 0, sub { fail('timeout'); EV::break });
EV::run;
# Test 5-7: role_list
$client->role_list(sub {
my ($resp, $err) = @_;
ok(!$err, 'role_list succeeded');
ok(ref($resp->{roles}) eq 'ARRAY', 'role_list has roles array');
my $found = grep { $_ eq $test_role } @{$resp->{roles} || []};
ok($found, 'our test role is in the list');
diag("Found " . scalar(@{$resp->{roles} || []}) . " roles");
EV::break;
});
my $t3 = EV::timer(5, 0, sub { fail('timeout'); EV::break });
EV::run;
# Test 8-9: role_grant_permission
$client->role_grant_permission($test_role, 'READWRITE', '/test/', '/test0', sub {
my ($resp, $err) = @_;
ok(!$err, 'role_grant_permission succeeded');
ok($resp->{header}, 'role_grant_permission response has header');
diag("Granted READWRITE on /test/* to $test_role");
EV::break;
});
my $t4 = EV::timer(5, 0, sub { fail('timeout'); EV::break });
EV::run;
# Test 10-11: role_get (verify permission was granted)
$client->role_get($test_role, sub {
my ($resp, $err) = @_;
ok(!$err, 'role_get succeeded');
ok(ref($resp->{perm}) eq 'ARRAY', 'role_get has perm array');
if ($resp->{perm} && @{$resp->{perm}}) {
diag("Role has " . scalar(@{$resp->{perm}}) . " permission(s)");
diag(" First perm: type=$resp->{perm}[0]{perm_type}, key=$resp->{perm}[0]{key}");
( run in 0.603 second using v1.01-cache-2.11-cpan-524268b4103 )