# Copyright 2017-2021 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/>.

# Test that -list-thread-groups --available works.

load_lib mi-support.exp
set MIFLAGS "-i=mi"

standard_testfile

# Support for XML is needed to run this test.
if [gdb_skip_xml_test] then {
    unsupported "list-thread-groups-available.exp"
    return -1
}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    untested "failed to compile"
    return -1
}

if [mi_gdb_start] {
    continue
}

if ![can_spawn_for_attach] {
    continue
}

set string_re {(?:[^\\"]|\\.)*}

set id_re "id=\"$decimal\""
set type_re "type=\"process\""
set description_re "description=\"$string_re\""
set user_re "user=\"$string_re\""

# The CORES_RE regexp allows a process to be running on zero or more
# cores.  The former can happen if a process exits while GDB is
# reading information out of /proc.
set cores_re "cores=\\\[(\"$decimal\"(,\"$decimal\")*)?\\\]"

# List all available processes.
set process_entry_re "{${id_re},${type_re}(,$description_re)?(,$user_re)?(,$cores_re)?}"

# The list can be long, so read entries one by one to avoid hitting the
# timeout (especially when running with check-read1).
set cmd "-list-thread-groups --available"
set test "list available thread groups"
gdb_test_multiple $cmd $test -prompt "$mi_gdb_prompt" {
    -re "\\^done,groups=\\\[" {
	# The beginning of the response.
	exp_continue
    }

    -re "${process_entry_re}," {
	# All entries except the last one.
	exp_continue
    }

    -re "${process_entry_re}\\\]\r\n${mi_gdb_prompt}" {
	# The last entry.
	pass $gdb_test_name
    }
}

# List specific processes, make sure there are two entries.
set spawn_id_1 [remote_spawn target $binfile]
set pid_1 [spawn_id_get_pid $spawn_id_1]
set id_re_1 "id=\"$pid_1\""

set spawn_id_2 [remote_spawn target $binfile]
set pid_2 [spawn_id_get_pid $spawn_id_2]
set id_re_2 "id=\"$pid_2\""

# Unlike the earlier CORES_RE this list must contain at least one
# core.  Given that we know these processes will not exit while GDB is
# reading their information from /proc we can expect at least one core
# for each process.
set cores_re "cores=\\\[\"$decimal\"(,\"$decimal\")*\\\]"

set process_entry_re_1 "{${id_re_1},${type_re}(,$description_re)?(,$user_re)?(,$cores_re)?}"
set process_entry_re_2 "{${id_re_2},${type_re}(,$description_re)?(,$user_re)?(,$cores_re)?}"

set process_list_re "(${process_entry_re_1},${process_entry_re_2}|${process_entry_re_2},${process_entry_re_1})"

mi_gdb_test \
    "-list-thread-groups --available i${pid_1} i${pid_2}" \
    "\\^done,groups=\\\[${process_list_re}\\\]" \
    "list available thread groups with filter"

kill_wait_spawned_process $spawn_id_1
kill_wait_spawned_process $spawn_id_2
