The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::Base;
use Test::TCP;

plan tests => 2;

use t::Client;

use Kamaitachi;

my $port = empty_port;

my $k = Kamaitachi->new( port => $port );

use constant {
    CONNECT   => 0,
    HANDSHAKE => 1,
};

my $state = CONNECT;

# connect
create_client(
    $port,
    {
        on_write_ready => sub {
            my $socket = shift;
            pass("connect success");

            my $packet = $socket->{context}{client_token} = pack('C', 0) x 0x600;

            $socket->watch_write(0);
            $socket->write(
                pack('C', 3) . pack('C', 0) x 0x600,
            );

            $state = HANDSHAKE;
        },

        on_read_ready => sub {
            my $socket = shift;

            my $bref = $socket->read( $k->buffer_size );
            unless (defined $bref) {
                $socket->close;
                stop_loop;
                return;
            }
            $socket->{context}{io}->push($$bref);

            if ($state == CONNECT) {
                fail("handshake ok");
                stop_loop;
                return;
            }

            if ($state == HANDSHAKE) {
                if (not $socket->{context}{server_token}) {
                    $bref = $socket->{context}{io}->read(0x600 + 1) or return;
                    $socket->{context}{server_token} = substr $$bref, 1;
                }

                if ($socket->{context}{server_token}) {
                    $bref = $socket->{context}{io}->read(0x600) or return;
                    my $token = $$bref;

                    is($socket->{context}{client_token}, $token, 'handshake ok');

                    $socket->close;
                    stop_loop;
                }
            }
        },
    },
);
run_loop;