diff options
Diffstat (limited to 'gdb/testsuite/gdb.python/py-source-styling.exp')
-rw-r--r-- | gdb/testsuite/gdb.python/py-source-styling.exp | 107 |
1 files changed, 94 insertions, 13 deletions
diff --git a/gdb/testsuite/gdb.python/py-source-styling.exp b/gdb/testsuite/gdb.python/py-source-styling.exp index ba7e795..8eed56b 100644 --- a/gdb/testsuite/gdb.python/py-source-styling.exp +++ b/gdb/testsuite/gdb.python/py-source-styling.exp @@ -33,12 +33,43 @@ if { [build_executable "failed to build" ${testfile} ${srcfile}] == -1 } { set line_number [gdb_get_line_number "List this line."] +# Helper proc. Run CMD, which should produce a source listing, and +# check if the source code is styled or not. EXPECT_STYLED indicates +# if we expect the source listing to be styled or not. +proc check_source_listing_styling { cmd expect_styled { testname "" } } { + if { $testname eq "" } { + set testname $cmd + } + + set seen_style_escape false + gdb_test_multiple $cmd $testname { + -re -wrap "Python Exception.*" { + fail $gdb_test_name + return + } + -re "\033" { + set seen_style_escape true + exp_continue + } + -re "$::gdb_prompt $" { + gdb_assert { $seen_style_escape == $expect_styled } \ + $gdb_test_name + } + } +} + # Check that the Python pygments module can be used for source # highlighting when GNU source highlight is not available (or is # disabled, as is done in this test). proc test_pygments_styling {} { clean_restart $::binfile + # Remote host boards disable styling via GDB's command line. Turn + # it back on now. + if {[is_remote host]} { + gdb_test "set style enabled on" + } + if { ![gdb_py_module_available "pygments"] } { unsupported "pygments module not available" return @@ -52,19 +83,7 @@ proc test_pygments_styling {} { gdb_test "maint flush source-cache" "Source cache flushed\\." - set seen_style_escape false - gdb_test_multiple "list $::line_number" "" { - -re "Python Exception.*" { - fail $gdb_test_name - } - -re "\033" { - set seen_style_escape true - exp_continue - } - -re "$::gdb_prompt $" { - gdb_assert { $seen_style_escape } $gdb_test_name - } - } + check_source_listing_styling "list $::line_number" true } # Use gdb.execute to list source code containing non-utf-8 character. @@ -93,6 +112,67 @@ proc test_gdb_execute_non_utf8_source {} { gdb_test "python print(source)" ".*List this line.*" } +# Use gdb.execute() to list source code. Alternate between asking for +# styled, and unstyled source code. In some cases we ask for the +# output to be returned via a string, and in other cases we ask for +# the output to be sent straight to stdout. +proc_with_prefix test_source_cache_style_tracking {} { + clean_restart $::binfile + + # Remote host boards disable styling via GDB's command line. Turn + # it back on now. + if {[is_remote host]} { + gdb_test "set style enabled on" + } + + gdb_test_no_output "set host-charset ISO-8859-1" + + # Commands which return styled, and non-styled source code mixed + # together. This ensures that the source cache will need to keep + # discarding the entry with the wrong styling mode. All of these + # gdb.execute calls send their output via a string. + check_source_listing_styling \ + "python print(gdb.execute('list $::line_number', to_string=True), end='')" \ + false + check_source_listing_styling \ + "python print(gdb.execute('list $::line_number', to_string=True, styling=True), end='')" \ + true + foreach from_tty { True False } { + check_source_listing_styling \ + "python print(gdb.execute('list $::line_number', $from_tty, True), end='')" \ + false + check_source_listing_styling \ + "python print(gdb.execute('list $::line_number', $from_tty, True, True), end='')" \ + true + check_source_listing_styling \ + "python print(gdb.execute('list $::line_number', $from_tty, True, False), end='')" \ + false + } + + # The same again, but this time the output is sent directly to + # stdout. + check_source_listing_styling \ + "python gdb.execute('list $::line_number')" \ + true + check_source_listing_styling \ + "python gdb.execute('list $::line_number', to_string=False, styling=False)" \ + false + check_source_listing_styling \ + "python gdb.execute('list $::line_number', to_string=False, styling=True)" \ + true + foreach from_tty { True False } { + check_source_listing_styling \ + "python gdb.execute('list $::line_number', $from_tty, False, False)" \ + false + check_source_listing_styling \ + "python gdb.execute('list $::line_number', $from_tty, False, True)" \ + true + check_source_listing_styling \ + "python gdb.execute('list $::line_number', $from_tty, False)" \ + true + } +} + # We need an ANSI-capable terminal to get the output, additionally we # need to set LC_ALL so GDB knows the terminal is UTF-8 capable, # otherwise we'll get a UnicodeEncodeError trying to encode the @@ -100,4 +180,5 @@ proc test_gdb_execute_non_utf8_source {} { with_ansi_styling_terminal { test_pygments_styling test_gdb_execute_non_utf8_source + test_source_cache_style_tracking } |