Google-gRPC

 view release on metacpan or  search on metacpan

t/06-channel-pool.t  view on Meta::CPAN

use strict;
use warnings;
use Test::More tests => 4;
use Google::gRPC::ChannelPool;
use Google::gRPC::Client;
use Google::gRPC::Framing;

subtest 'DNS Resolution and Subchannel Pool Instantiation' => sub {
    my $pool = Google::gRPC::ChannelPool->new(
        target     => 'spanner.googleapis.com:443',
        auth_token => 'mock_token_testtoken',
    );

    ok($pool, 'instantiated ChannelPool');
    is($pool->target, 'spanner.googleapis.com:443', 'pool target matches');
    my $subs = $pool->subchannels;
    ok(scalar(@$subs) > 0, 'resolved target to subchannel endpoints');

    my $metrics = $pool->get_metrics();
    ok($metrics, 'retrieved metrics hash');
    my @ips = keys %$metrics;
    ok(scalar(@ips) > 0, 'metrics contain entries for resolved IPs');
};

subtest 'Round-Robin Subchannel Selection Algorithm' => sub {
    my $pool = Google::gRPC::ChannelPool->new(
        target       => 'spanner.googleapis.com:443',
        resolved_ips => ['10.0.0.1', '10.0.0.2', '10.0.0.3'],
        engine_type  => 'PP',
    );

    is(scalar(@{$pool->subchannels}), 3, 'pool contains 3 resolved subchannels');

    my @targets;
    for (1 .. 6) {
        my $ch = $pool->get_channel();
        push @targets, $ch->target;
    }

    is_deeply(\@targets, [
        '10.0.0.1:443',
        '10.0.0.2:443',
        '10.0.0.3:443',
        '10.0.0.1:443',
        '10.0.0.2:443',
        '10.0.0.3:443',
    ], 'round-robin algorithm distributes sequentially across subchannels');
};

subtest 'Per-IP Request Counts and Byte Metrics Tracking' => sub {
    my $pool = Google::gRPC::ChannelPool->new(
        target       => 'spanner.googleapis.com:443',
        resolved_ips => ['192.168.1.1', '192.168.1.2'],
        engine_type  => 'PP',
    );

    my @streams;
    for my $i (1 .. 4) {
        my $s = $pool->create_stream(
            service => 'google.spanner.v1.Spanner',
            method  => 'ExecuteSql',
            request => 'SELECT * FROM test_table WHERE id = ' . $i,
            type    => 'unary',
        );
        push @streams, $s;

        my $response_payload = 'mock_response_data_' . $i;
        my $framed = Google::gRPC::Framing::pack_frame($response_payload);
        $s->push_incoming_data($framed);
    }

    my $m1 = $pool->get_metrics('192.168.1.1');
    my $m2 = $pool->get_metrics('192.168.1.2');

    is($m1->{requests}, 2, 'ip 192.168.1.1 received 2 requests');
    is($m2->{requests}, 2, 'ip 192.168.1.2 received 2 requests');



( run in 1.274 second using v1.01-cache-2.11-cpan-81fc1098f69 )