#                                                              -*-mode: perl-*-

$description = "Test handling of temporary file created from stdin.";

# These tests rely on the test_driver checking for leftover temporary content

create_file('input.mk', "world:=1\n");
create_file('bye.mk', "moon:=2\n");

# sv 62118,62145.
# Test that makes leaves no temp file when make code is piped to stdin and -v,
# -h or an invalid option is specified.
my @opts = ('-v', '-h', '--nosuchopt');
my @exit_codes = (0, 0, 512);
for my $i (0 .. $#opts) {
    close(STDIN);
    open(STDIN, "<", 'input.mk') || die "$0: cannot open input.mk for reading: $!";
    run_make_test(q!
all:; $(info hello world)
!,
                  "$opts[$i] -f-", "/uilt for /", $exit_codes[$i]);
}

# sv 62118,62145.
# Test that a stdin temp file is removed.
close(STDIN);
open(STDIN, "<", 'input.mk') || die "$0: cannot open input.mk for reading: $!";
run_make_test(q!
all:; $(info world=$(world))
!,
              '-f-', "world=1\n#MAKE#: 'all' is up to date.\n");

# sv 62118,62145.
# Test that a stdin temp file is removed, even when make re-execs.
# Also test that make honors TMPDIR to create the temp file.
# Ensure touching bye.mk causes re-exec.
&utouch(-600, 'bye.mk');
close(STDIN);
open(STDIN, "<", 'input.mk') || die "$0: cannot open input.mk for reading: $!";
run_make_test(q!
include bye.mk
all:; $(info hello)
$(MAKE_RESTARTS)bye.mk: force; touch $@
force:
!,
              '-R --debug=b -f-', "/Re-executing.+?--temp-stdin=\Q$temppath\E/");

if ($port_type eq 'UNIX') {
# POSIX doesn't require sh to set PPID so test this
my $cmd = create_command();
add_options($cmd, '-f', '/dev/null', '-E', q!all:;@echo $$PPID!);
my $fout = 'ppidtest.out';
run_command_with_output($fout, @$cmd);
$_ = read_file_into_string($fout);
s/\r?\n//g;
if (/^[0-9]+$/) {
use POSIX ();

# sv 63157.
# Test that make removes the temporary file which holds make code from stdin,
# even when a signal is received.  include bye.mk and bye.mk: rule is needed
# to cause make to keep the temporary file for re-exec. Without re-exec make
# will remove the file before the signal arrives.  sleep is needed to let make
# write its "... Terminated" message to the log file.  Must use REGEX because
# some systems (MacOS) add extra text after Terminated.
&utouch(-600, 'bye.mk');
close(STDIN);
open(STDIN, "<", 'input.mk') || die "$0: cannot open input.mk for reading: $!";

run_make_test(q!
include bye.mk
pid := $(shell echo $$PPID)
all:;
bye.mk: force; @#HELPER# -q term $(pid) sleep 10
force:
!,
              '-f-', '/#MAKE#: \*\*\* \[#MAKEFILE#:5: bye.mk] Terminated/', POSIX::SIGTERM);
}
unlink($fout);

# sv 62118,62145.
# Test that a stdin temp file is removed, when execvp fails to re-exec make.
# In order to cause execvp to fail, copy the tested make binary to the temp
# directory and take away the 'x' bit.
use File::Spec;
use File::Copy;

my $tmakedir = File::Spec->catfile($cwdpath, 'tmakedir');
mkdir($tmakedir, 0770);
my $makecopy = File::Spec->catfile($tmakedir, 'make');
copy("$mkpath", $makecopy);
# Set file mode bits, because perl copy won't.
chmod 0700, $makecopy;

my @make_orig = @make_command;
@make_command = ($makecopy);

# Ensure touching bye.mk causes re-exec.
&utouch(-600, 'bye.mk');
close(STDIN);
open(STDIN, "<", 'input.mk') || die "$0: cannot open input.mk for reading: $!";
run_make_test("
include bye.mk
all:; \$(info hello)
\$(MAKE_RESTARTS)bye.mk: force; touch \$@ && chmod u-x $makecopy
force:
",
              "-f-", "touch bye.mk && chmod u-x $makecopy\nmake: $makecopy: $ERR_nonexe_file\n", 32512);

@make_command = @make_orig;
unlink($makecopy);
rmdir($tmakedir);

# SV 63333. Test that make exits with an error message if we cannot store a
# makefile from stdin to a temporary file.
# Create a non-writable temporary directory.

# If we do this Valgrind fails because it cannot write temp files... the docs
# don't describe any way to tell valgrind to use a directory other than TMPDIR.

if (!$valgrind) {
    my $tdir = 'test_tmp_dir';
    mkdir($tdir, 0500);
    $ENV{'TMPDIR'} = $tdir;
    close(STDIN);
    open(STDIN, "<", 'input.mk') || die "$0: cannot open input.mk for reading: $!";

    run_make_test(q!
all:; $(info hello, world)
!, '-f-', '/cannot store makefile from stdin to a temporary file.  Stop./', 512);
    rmdir($tdir);
}
}

# This close MUST come at the end of the test!!
close(STDIN);
unlink('input.mk', 'bye.mk');

# This tells the test driver that the perl test script executed properly.
1;
