sub perform_request()

in t/lib/MockAsyncCxn.pm [62:133]


sub perform_request {
#===================================
    my $self   = shift;
    my $params = shift;

    my $d = deferred;

    eval {
        my $response = shift @{ $self->mock_responses }
            or die "Mock responses exhausted";

        if ( my $node = $response->{node} ) {
            die "Mock response handled by wrong node ["
                . $self->node_num . "]: "
                . Dumper($response)
                unless $node eq $self->node_num;
        }

        my $log_msg;

        # Sniff request
        if ( my $nodes = $response->{sniff} ) {
            $log_msg = "SNIFF: [" . ( join ", ", @$nodes ) . "]";
            $response->{code} ||= 200;
            my $i = 1;
            unless ( $response->{error} ) {
                $response->{content} = $self->serializer->encode(
                    {   nodes => {
                            map {
                                'node_'
                                    . $i++ => { http_address => "inet[/$_]" }
                            } @$nodes
                        }
                    }
                );
            }
        }

        # Normal request
        elsif ( $response->{code} ) {
            $log_msg
                = "REQUEST: " . ( $response->{error} || $response->{code} );
        }

        # Ping request
        else {
            $log_msg = "PING: " . ( $response->{ping} ? 'OK' : 'NOT_OK' );
            $response
                = $response->{ping}
                ? { code => 200 }
                : { code => 500, error => 'Cxn' };
        }

        $self->logger->debugf( "[%s-%s] %s", $self->node_num, $self->host,
            $log_msg );

        $d->resolve(
            $self->process_response(
                $params,                 # request
                $response->{code},       # code
                $response->{error},      # msg
                $response->{content},    # body
                {
                    'content-type' => 'application/json',
                    $PRODUCT_CHECK_HEADER => $PRODUCT_CHECK_VALUE
                }
            )
        );
        1;
    } || do { $d->reject( $@ || 'Unknown error' ) };
    return $d->promise;
}