#   Copyright 2018-2025 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 test checks that the index-cache feature generates the expected files at
# the expected location.

standard_testfile .c -2.c

if { [build_executable "failed to prepare" $testfile [list $srcfile $srcfile2] \
	  {debug build-id}] } {
    return
}

# The index cache won't be used in certain circumstances, for which we must
# account in this test:
#
#  - the binary already has an index section
#  - we use the -readnow switch
set has_index_section [exec_has_index_section $binfile]
set uses_readnow [expr [string first "-readnow" $GDBFLAGS] != -1]
set expecting_index_cache_use [expr !$has_index_section && !$uses_readnow]

# List the files in DIR on the host (where GDB-under-test runs).
# Return a list of two elements:
#   - 0 on success, -1 on failure
#   - the list of files on success, empty on failure

proc ls_host { dir } {
    lassign [remote_exec host ls "-1 $dir"] ret output

    if { $ret != 0 } {
	fail "failed to list files on host in $dir"
	return -1
    }

    # ls -1 returns a list separated by \r\n.  split will return a bunch of
    # empty entries (it treats a sequence of split characters as separate
    # fields, plus there is a \r\n at the end of the result).  Ignore empty
    # list elements.
    set filtered {}
    set files [split $output \r\n]

    foreach file $files {
	if { $file != "" } {
	    lappend filtered $file
	}
    }

    return [list 0 $filtered]
}

# Execute "show index-cache stats" and verify the output against expected
# values.

proc check_cache_stats { expected_hits expected_misses } {
    # This test wants to check the cache, so make sure it has completed
    # its work.
    gdb_test_no_output "maintenance wait-for-index-cache"

    set re [multi_line \
	"  Cache hits .this session.: $expected_hits" \
	"Cache misses .this session.: $expected_misses" \
    ]

    gdb_test "show index-cache stats" $re "check index-cache stats"
}

# Run CODE using a fresh GDB configured based on the other parameters.

proc run_test_with_flags { cache_dir cache_enabled code } {
    global GDBFLAGS testfile

    save_vars { GDBFLAGS } {
	set GDBFLAGS "$GDBFLAGS -iex \"set index-cache directory $cache_dir\""
	set GDBFLAGS "$GDBFLAGS -iex \"set index-cache enabled $cache_enabled\""

	clean_restart

	gdb_test_no_output "maint set dwarf synchronous on"

	gdb_load $::binfile

	uplevel 1 $code
    }
}

# Test administrative stuff.

proc_with_prefix test_basic_stuff { } {
    global testfile

    clean_restart ${testfile}

    # Check that the index cache is disabled by default.
    gdb_test \
	"show index-cache enabled" \
	"The index cache is off." \
	"index-cache is disabled by default"

    # Test that we can enable it and "show index-cache enabled" reflects that.
    gdb_test_no_output "set index-cache enabled on" "enable index cache"
    gdb_test \
	"show index-cache enabled" \
	"The index cache is on." \
	"index-cache is now enabled"

    with_test_prefix "deprecated commands" {
        gdb_test "set index-cache off" ".*is deprecated.*" "disable index cache"
	gdb_test \
	    "show index-cache enabled" \
	    "The index cache is off." \
	    "index-cache is now disabled"
        gdb_test "set index-cache on" ".*is deprecated.*" "enable index cache"
	gdb_test \
	    "show index-cache enabled" \
	    "The index cache is on." \
	    "index-cache is now enabled"
    }

    # Test the "set/show index-cache directory" commands.
    gdb_test "set index-cache directory" "Argument required.*" "set index-cache directory without arg"
    gdb_test_no_output "set index-cache directory /tmp" "change the index cache directory"
    gdb_test \
	"show index-cache directory" \
	"The directory of the index cache is \"/tmp\"."  \
	"show index cache directory"
}

# Test loading a binary with the cache disabled.  No file should be created.

proc_with_prefix test_cache_disabled { cache_dir test_prefix } {
    with_test_prefix $test_prefix {
	lassign [ls_host $cache_dir] ret files_before

	run_test_with_flags $cache_dir off {
	    lassign [ls_host $cache_dir] ret files_after

	    set nfiles_created [expr [llength $files_after] - [llength $files_before]]
	    gdb_assert "$nfiles_created == 0" "no files were created"

	    # Trigger expansion of symtab containing main, if not already done.
	    gdb_test "ptype main" "^type = int \\(void\\)"

	    # Trigger expansion of symtab not containing main.
	    gdb_test "ptype foo" "^type = int \\(void\\)"

	    # Look for non-existent function.
	    gdb_test "ptype foobar" "^No symbol \"foobar\" in current context\\."

	    check_cache_stats 0 0
	}
    }
}

# Test a cache miss.  We expect to have at least one file in the cache if the
# index cache is going to be used (see expecting_index_cache_use) and a cache
# miss in the stats.  If the cache is not going to be used, we expect to have
# no files and no cache hits nor misses.

proc_with_prefix test_cache_enabled_miss { cache_dir } {
    global testfile expecting_index_cache_use

    lassign [ls_host $cache_dir] ret files_before

    run_test_with_flags $cache_dir on {

	lassign [ls_host $cache_dir] ret files_after
	set nfiles_created [expr [llength $files_after] - [llength $files_before]]
	if { $expecting_index_cache_use } {
	    gdb_assert "$nfiles_created > 0" "at least one file was created"
	} else {
	    gdb_assert "$nfiles_created == 0" "no file was created"
	}

	set build_id [get_build_id  [standard_output_file ${testfile}]]
	if { $build_id == "" } {
	    fail "couldn't get executable build id"
	    return
	}

	set expected_created_file [list "${build_id}.gdb-index"]
	set found_idx [lsearch -exact $files_after $expected_created_file]
	if { $expecting_index_cache_use } {
	    gdb_assert "$found_idx >= 0" "expected file is there"
	} else {
	    gdb_assert "$found_idx == -1" "no index cache file generated"
	}

	remote_exec host rm "-f $cache_dir/$expected_created_file"

	# Trigger expansion of symtab containing main, if not already done.
	gdb_test "ptype main" "^type = int \\(void\\)"

	# Trigger expansion of symtab not containing main.
	gdb_test "ptype foo" "^type = int \\(void\\)"

	# Look for non-existent function.
	gdb_test "ptype foobar" "^No symbol \"foobar\" in current context\\."

	if { $expecting_index_cache_use } {
	    check_cache_stats 0 1
	} else {
	    check_cache_stats 0 0
	}
    }
}


# Test a cache hit.  We should have at least one file in the cache if the index
# cache is going to be used (see expecting_index_cache_use) and a cache hit in
# the stats.  If the cache is not going to be used, we expect to have no files
# and no cache hits nor misses.

proc_with_prefix test_cache_enabled_hit { cache_dir } {
    global expecting_index_cache_use

    # Just to populate the cache.
    with_test_prefix "populate cache" {
	run_test_with_flags $cache_dir on {}
    }

    lassign [ls_host $cache_dir] ret files_before

    run_test_with_flags $cache_dir on {
	lassign [ls_host $cache_dir] ret files_after
	set nfiles_created [expr [llength $files_after] - [llength $files_before]]
	gdb_assert "$nfiles_created == 0" "no files were created"

	# Trigger expansion of symtab containing main, if not already done.
	gdb_test "ptype main" "^type = int \\(void\\)"

	# Trigger expansion of symtab not containing main.
	gdb_test "ptype foo" "^type = int \\(void\\)"

	# Look for non-existent function.
	gdb_test "ptype foobar" "^No symbol \"foobar\" in current context\\."

	if { $expecting_index_cache_use } {
	    check_cache_stats 1 0
	} else {
	    check_cache_stats 0 0
	}
    }
}

test_basic_stuff

# The cache dir should be on the host (possibly remote), so we can't use the
# standard output directory for that (it's on the build machine).
lassign [remote_exec host mktemp -d] ret cache_dir

if { $ret != 0 } {
    fail "couldn't create temporary cache dir"
    return
}

# The ouput of mktemp contains an end of line, remove it.
set cache_dir [string trimright $cache_dir \r\n]

test_cache_disabled $cache_dir "before populate"
test_cache_enabled_miss $cache_dir
test_cache_enabled_hit $cache_dir

# Test again with the cache disabled, now that it is populated.
test_cache_disabled $cache_dir "after populate"

lassign [remote_exec host "sh -c" [quote_for_host rm $cache_dir/*.gdb-index]] ret
if { $ret != 0 && $expecting_index_cache_use } {
    fail "couldn't remove files in temporary cache dir"
    return
}

lassign [remote_exec host rmdir "$cache_dir"] ret
if { $ret != 0 } {
    fail "couldn't remove temporary cache dir"
    return
}
