#===----------------------------------------------------------------------===##
#
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#
#===----------------------------------------------------------------------===##
"""Commands used to automate testing gdb pretty printers.

This script is part of a larger framework to test gdb pretty printers. It
runs the program, detects test cases, checks them, and prints results.

See gdb_pretty_printer_test.sh.cpp on how to write a test case.

"""

from __future__ import print_function
import re
import gdb

test_failures = 0


class CheckResult(gdb.Command):

    def __init__(self):
        super(CheckResult, self).__init__(
            "print_and_compare", gdb.COMMAND_DATA)

    def invoke(self, arg, from_tty):
        try:
            # Stack frame is:
            # 0. StopForDebugger
            # 1. ComparePrettyPrintToChars or ComparePrettyPrintToRegex
            # 2. TestCase
            compare_frame = gdb.newest_frame().older()
            testcase_frame = compare_frame.older()
            test_loc = testcase_frame.find_sal()
            # Use interactive commands in the correct context to get the pretty
            # printed version

            value_str = self._get_value_string(compare_frame, testcase_frame)

            # Ignore the convenience variable name and newline
            value = value_str[value_str.find("= ") + 2:-1]
            gdb.newest_frame().select()

            expectation_val = compare_frame.read_var("expectation")
            if "PrettyPrintToRegex" in compare_frame.name():
                check_literal = expectation_val.string()
                test_fails = not re.match(check_literal, value)
            else:
                check_literal_string = expectation_val.string(encoding="utf-8")
                check_literal = check_literal_string.encode("utf-8")
                test_fails = value != check_literal

            if test_fails:
                global test_failures
                print("FAIL: " + test_loc.symtab.filename +
                      ":" + str(test_loc.line))
                print("GDB printed:")
                print("   " + value)
                print("Value should match:")
                print("   " + check_literal)
                test_failures += 1
            else:
                print("PASS: " + test_loc.symtab.filename +
                      ":" + str(test_loc.line))

        except RuntimeError as e:
            # At this point, lots of different things could be wrong, so don't try to
            # recover or figure it out. Don't exit either, because then it's
            # impossible debug the framework itself.
            print("FAIL: Something is wrong in the test framework.")
            print(str(e))
            test_failures += 1

    def _get_value_string(self, compare_frame, testcase_frame):
        compare_frame.select()
        if "ComparePrettyPrint" in compare_frame.name():
            return gdb.execute("p value", to_string=True)
        value_str = str(compare_frame.read_var("value"))
        clean_expression_str = value_str.strip("'\"")
        testcase_frame.select()
        return gdb.execute("p " + clean_expression_str, to_string=True)


def exit_handler(event=None):
    global test_failures
    if test_failures:
        print("FAILED %d cases" % test_failures)
    exit(test_failures)


# Start code executed at load time

# Disable terminal paging
gdb.execute("set height 0")
gdb.execute("set python print-stack full")
test_failures = 0
CheckResult()
test_bp = gdb.Breakpoint("StopForDebugger")
test_bp.enabled = True
test_bp.silent = True
test_bp.commands = "print_and_compare\ncontinue"
# "run" won't return if the program exits; ensure the script regains control.
gdb.events.exited.connect(exit_handler)
gdb.execute("run")
# If the program didn't exit, something went wrong, but we don't
# know what. Fail on exit.
test_failures += 1
exit_handler(None)
