Files
binutils-gdb/gdb/testsuite/gdb.python/py-mi-notify.exp
Tom de Vries 83fafbe970 [gdb/testsuite] Handle unordered dict in gdb.python/py-mi-notify.exp
With test-case gdb.python/py-mi-notify.exp and python 3.4, I occasionally run
into:
...
python gdb.notify_mi('-test-notification', { 'data1' : 1 , 'data2' : 2 })
&"python gdb.notify_mi('-test-notification', { 'data1' : 1 , 'data2' : 2 })\n"
=-test-notification,data2="2",data1="1"
^done
(gdb)
FAIL: $exp: python notification, with additional data (unexpected output)
...

In contrast, a passing version looks like:
...
python gdb.notify_mi('-test-notification', { 'data1' : 1 , 'data2' : 2 })
&"python gdb.notify_mi('-test-notification', { 'data1' : 1 , 'data2' : 2 })\n"
=-test-notification,data1="1",data2="2"
^done
(gdb)
PASS: gdb.python/py-mi-notify.exp: python notification, with additional data
...

The python method "gdb.notify_mi(name, data)" has parameter data which is a
dictionary, and it iterates over that dictionary.

The problem is that dictionaries are only guaranteed to be iterating in
insertion order starting python 3.7 (though cpython does this starting python
3.6).

Fix this in the same way as in commit 362a867f2a ("[gdb/testsuite] Handle
unordered dict in gdb.python/py-mi-cmd.exp"): by allowing the alternative
order.

Tested on x86_64-linux.
2025-01-30 13:21:56 +01:00

75 lines
2.5 KiB
Plaintext

# Copyright (C) 2023-2024 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 custom MI notifications implemented in Python.
load_lib gdb-python.exp
load_lib mi-support.exp
set MIFLAGS "-i=mi"
gdb_exit
if {[mi_gdb_start]} {
return
}
if {[lsearch -exact [mi_get_features] python] < 0} {
unsupported "python support is disabled"
return -1
}
standard_testfile
mi_gdb_test "set python print-stack full" \
".*\\^done" \
"set python print-stack full"
mi_gdb_test "python gdb.notify_mi('-test-notification')" \
".*=-test-notification\r\n\\^done" \
"python notification, no additional data parameter"
mi_gdb_test "python gdb.notify_mi('-test-notification', None)" \
".*=-test-notification\r\n\\^done" \
"python notification, no additional data"
set re_data1 {data1="1"}
set re_data2 {data2="2"}
set re_data1_data2 ($re_data1,$re_data2|$re_data2,$re_data1)
mi_gdb_test "python gdb.notify_mi('-test-notification', \{ 'data1' : 1 , 'data2' : 2 })" \
".*=-test-notification,$re_data1_data2\r\n\\^done" \
"python notification, with additional data"
mi_gdb_test "python gdb.notify_mi('-test-notification', 1)" \
".*\\^error,msg=\".*\"" \
"python notification, invalid additional data"
mi_gdb_test "python gdb.notify_mi('', None)" \
".*\\^error,msg=\".*\"" \
"python notification, empty notification name"
mi_gdb_test "python gdb.notify_mi('**invalid**', None)" \
".*\\^error,msg=\".*\"" \
"python notification, invalid notification name"
mi_gdb_test "python gdb.notify_mi(\[1,2,3\], None)" \
".*\\^error,msg=\".*\"" \
"python notification, non-string notification name"
mi_gdb_test "python gdb.notify_mi()" \
".*\\^error,msg=\".*\"" \
"python notification, no arguments passed"
mi_gdb_test "python gdb.notify_mi('thread-group-added', \{'id' : 'i2'\})" \
".*=thread-group-added,id=\"i2\"\r\n\\^done" \
"python notification, using existing internal notification name"