The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

use 5.010;
use strict;
use warnings;

# NAME: Test of the function Kafka::Protocol::produce_request

use lib 'lib';

use Test::More tests => 22;

BEGIN {
    eval "use Test::Exception";
    plan skip_all => "because Test::Exception required for testing" if $@;
}

# PRECONDITIONS ----------------------------------------------------------------

# options for testing arguments: ( undef, 0, 0.5, 1, -1, "", "0", "0.5", "1", \"scalar", [] )

# -- verify load the module
BEGIN { use_ok 'Kafka::Protocol', qw( produce_request ) }

# -- declaration of variables to test
my $topic       = "test";
my $partition   = 0;

# control request to a single message
my $single_message = "The first message";
my $request_single =                            # PRODUCE Request - "no compression" now
    # Request Header
     '0000002a'                                 # REQUEST_LENGTH
    .'0000'                                     # REQUEST_TYPE
    .'0004'                                     # TOPIC_LENGTH
    .'74657374'                                 # TOPIC ("test")
    .'00000000'                                 # PARTITION
    # PRODUCE Request
    .'0000001a'                                 # MESSAGES_LENGTH
    # MESSAGE
    .'00000016'                                 # LENGTH
    .'00'                                       # MAGIC
    .''                                         # COMPRESSION
    .'d94a22be'                                 # CHECKSUM
    .'546865206669727374206d657373616765'       # PAYLOAD ("The first message")
    ;

# control request to a series of messages
my $series_of_messages = [
        "The first message",
        "The second message",
        "The third message",
    ];
my $request_series =                            # PRODUCE Request - "no compression" now
    # Request Header
     '0000005f'                                 # REQUEST_LENGTH
    .'0000'                                     # REQUEST_TYPE
    .'0004'                                     # TOPIC_LENGTH
    .'74657374'                                 # TOPIC ("test")
    .'00000000'                                 # PARTITION
    # PRODUCE Request
    .'0000004f'                                 # MESSAGES_LENGTH
    # MESSAGE
    .'00000016'                                 # LENGTH
    .'00'                                       # MAGIC
    .''                                         # COMPRESSION
    .'d94a22be'                                 # CHECKSUM
    .'546865206669727374206d657373616765'       # PAYLOAD ("The first message")
    # MESSAGE
    .'00000017'                                 # LENGTH
    .'00'                                       # MAGIC
    .''                                         # COMPRESSION
    .'a3810845'                                 # CHECKSUM
    .'546865207365636f6e64206d657373616765'     # PAYLOAD ("The second message")
    # MESSAGE
    .'00000016'                                 # LENGTH
    .'00'                                       # MAGIC
    .''                                         # COMPRESSION
    .'58611780'                                 # CHECKSUM
    .'546865207468697264206d657373616765'       # PAYLOAD ("The third message")
    ;

# INSTRUCTIONS -----------------------------------------------------------------

# -- verify response to invalid arguments

# without args
throws_ok { produce_request() }                                             qr/^Mismatch argument/, 'expecting to die: Mismatch argument';

# topic: to see if a value is a normal non-false string of non-zero length
foreach my $topic ( ( undef, 0, "", "0", \"scalar", [] ) )
{
    throws_ok { produce_request( $topic, $partition, $single_message ) }    qr/^Mismatch argument/, 'expecting to die: Mismatch argument';
}

# partition: to see if a value is a non-negative integer (of any length). That is, a positive integer, or zero
foreach my $partition ( ( undef, 0.5, -1, "", "0.5", \"scalar", [] ) )
{
    throws_ok { produce_request( $topic, $partition, $single_message ) }    qr/^Mismatch argument/, 'expecting to die: Mismatch argument';
}

# messages:
#   to see if a value is a normal non-false string of non-zero length
#   or a raw and unblessed ARRAY reference, allowing ARRAY references that contain no elements
foreach my $messages ( ( undef, 0, "", "0", \"scalar" ) )
{
    throws_ok { produce_request( $topic, $partition, $messages ) }          qr/^Mismatch argument/, 'expecting to die: Mismatch argument';
}

# -- verify request form for a single message
is unpack( "H*", produce_request( $topic, $partition, $single_message       ) ), $request_single,   "correct request for a single message";

# -- verify request form for a series of messages
is unpack( "H*", produce_request( $topic, $partition, $series_of_messages   ) ), $request_series,   "correct request for a series of messages";

# POSTCONDITIONS ---------------------------------------------------------------