#! /usr/bin/env perl
# Copyright 2022 The OpenSSL Project Authors. All Rights Reserved.
#
# Licensed under the Apache License 2.0 (the "License").  You may not use
# this file except in compliance with the License.  You can obtain a copy
# in the file LICENSE in the source distribution or at
# https://www.openssl.org/source/license.html

use strict;
use warnings;

use IPC::Open2;
use OpenSSL::Test qw/:DEFAULT srctop_file bldtop_file/;
use OpenSSL::Test::Utils;

setup("test_tfo");

plan skip_all => "test_tfo_cli needs sock enabled" if disabled("sock");
plan skip_all => "test_tfo_cli needs tls < 1.3 enabled"
    if disabled("tls1") && disabled("tls1_1") && disabled("tls1_2");
plan skip_all => "test_tfo_cli does not run on Windows nor VMS"
    if $^O =~ /^(VMS|MSWin32|msys)$/;

plan tests => 8;

my $shlib_wrap = bldtop_file("util", "shlib_wrap.sh");
my $apps_openssl = bldtop_file("apps", "openssl");
my $cert = srctop_file("apps", "server.pem");

sub run_test {
    my $tfo = shift;

    my $client_good = ! $tfo;
    my $server_good = ! $tfo;
    my $connect_good = 0;
    my $port = "0";

    # Not using TLSv1.3 allows the test to work with "no-ec"
    my @s_cmd = ("s_server", "-accept", ":0", "-cert", $cert, "-www", "-no_tls1_3", "-naccept", "1");
    push @s_cmd, "-tfo" if ($tfo);

    my $spid = open2(my $sout, my $sin, $shlib_wrap, $apps_openssl, @s_cmd);

    # Read until we get the port, TFO is output before the ACCEPT line
    while (<$sout>) {
        chomp;
        $server_good = $tfo if /^Listening for TFO$/;
        if (/^ACCEPT\s.*:(\d+)$/) {
            $port = $1;
            last;
        }
    }
    print STDERR "Port: $port\n";
    print STDERR "Invalid port\n" if ! ok($port);

    # Start up the client
    my @c_cmd = ("s_client", "-connect", ":$port", "-no_tls1_3");
    push @c_cmd, "-tfo" if ($tfo);

    my $cpid = open2(my $cout, my $cin, $shlib_wrap, $apps_openssl, @c_cmd);

    # Do the "GET", which will cause the client to finish
    print $cin "GET /\r\n";

    waitpid($cpid, 0);
    waitpid($spid, 0);

    # Check the client output
    while (<$cout>) {
        chomp;
        $client_good = $tfo if /^Connecting via TFO$/;
        $connect_good = 1 if /^Content-type: text/;
    }

    print STDERR "Client TFO check failed\n" if ! ok($client_good);
    print STDERR "Server TFO check failed\n" if ! ok($server_good);
    print STDERR "Connection failed\n" if ! ok($connect_good);
}

for my $tfo (0..1) {
    SKIP:
    {
        skip "TFO not enabled", 4 if disabled("tfo") && $tfo;

        run_test($tfo);
    }
}
