# Copyright 2015-2020 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# This file is part of the gdb testsuite.

# Test the setting of "history size" via $HOME/.gdbinit

# This test depends on being able to set $HOME and $GDBHISTSIZE.
# We cannot expect remote hosts to see environment variables set on the
# local machine.

# Do not run if gdb debug is enabled - it interferes with the command history.
if [gdb_debug_enabled] {
    untested "debug is enabled"
    return 0
}

if { [is_remote host] } {
    unsupported "can't set environment variables on remote host"
    return -1
}

# Check that the history size is properly set to SIZE when reading the .gdbinit
# file located in HOME with the environment variable GDBHISTSIZE optionally
# set to GDBHISTSIZE_VAL.

proc test_gdbinit_history_setting { home size { gdbhistsize_val "-" } } {
    global env
    global INTERNAL_GDBFLAGS
    global srcdir
    global subdir

    save_vars { INTERNAL_GDBFLAGS env(GDBHISTFILE) env(GDBHISTSIZE) env(HOME) } {
	set env(HOME) "$srcdir/$subdir/$home"

	# These environment variables take precedence over whatever
	# history size is set in .gdbinit.  Make sure the former is not
	# set.
	unset -nocomplain env(GDBHISTFILE)
	unset -nocomplain env(GDBHISTSIZE)

	if { $gdbhistsize_val != "-" } {
	    set env(GDBHISTSIZE) $gdbhistsize_val
	}

	set INTERNAL_GDBFLAGS [string map {"-nx" ""} $INTERNAL_GDBFLAGS]

	set prefix "home=$home"
	if { $gdbhistsize_val != "-" } {
	    append prefix " gdbhistsize=$gdbhistsize_val"
	}

	with_test_prefix $prefix {
	    gdb_exit
	    gdb_start

	    gdb_test "show history size" "The size of the command history is $size."

	    if { $size == "0" } {
		gdb_test_no_output "show commands"
	    } elseif { $size != "1" } {
		gdb_test "show commands" "    .  show history size\r\n    .  show commands"
	    }
	}
    }
}

# Check that the history file does not get truncated to zero when a gdbinit
# file sets the history size to unlimited.

proc test_no_truncation_of_unlimited_history_file { } {
    global env
    global INTERNAL_GDBFLAGS

    save_vars { INTERNAL_GDBFLAGS env(GDBHISTFILE) env(GDBHISTSIZE) } {
	# These environment variables take precedence over whatever
	# history size is set in .gdbinit.  Make sure the former is not
	# set.
	unset -nocomplain env(GDBHISTFILE)
	unset -nocomplain env(GDBHISTSIZE)

	set temp_gdbinit [standard_output_file "gdbinit-history.gdbinit"]
	set temp_histfile [standard_output_file "gdbinit-history.gdb_history"]
	file delete $temp_gdbinit
	file delete $temp_histfile

	set fd [open $temp_gdbinit "w"]
	puts $fd "set history size unlimited\n"
	puts $fd "set history filename $temp_histfile\n"
	puts $fd "set history save\n"
	close $fd

	append INTERNAL_GDBFLAGS " -x $temp_gdbinit"

	# We have to start then exit GDB twice: the first time to test the creation
	# of the initial history file, and the second time to test appending to it.
	# In either case the initial "print 1" command should persist through the
	# history file.
	with_test_prefix "truncation" {
	    gdb_exit
	    gdb_start
	    gdb_test "print 1"

	    with_test_prefix "creating" {
		gdb_exit
		gdb_start
		gdb_test "server show commands" "    .  print 1.*"
	    }

	    with_test_prefix "appending" {
		gdb_exit
		gdb_start
		gdb_test "server show commands" "    .  print 1.*"
	    }
        }
    }
}

test_gdbinit_history_setting "gdbinit-history/unlimited" "unlimited"
test_gdbinit_history_setting "gdbinit-history/zero" "0"

test_no_truncation_of_unlimited_history_file

# A valid GDBHISTSIZE value overrides the setting inside the .gdbinit file; an
# invalid GDBHISTSIZE value is ignored, falling back on the setting inside the
# .gdbinit file.
test_gdbinit_history_setting "gdbinit-history/unlimited" "1000" "1000"
test_gdbinit_history_setting "gdbinit-history/unlimited" "unlimited" "foo"
