| # REQUIRES: curl, httplib, thread_support |
| # UNSUPPORTED: system-windows |
| |
| #int main () { |
| # int x = 1; |
| # return x; |
| #} |
| # |
| #Build as : clang -g main.c -o main-debug.exe |
| #Then run : cp main-debug.exe main.exe && strip main.exe |
| #resulting buildid: 2c39b7557c50162aaeb5a3148c9f76e6e46012e3 |
| |
| # RUN: rm -rf %t |
| # RUN: mkdir %t |
| # # Query the debuginfod server for artifacts |
| # RUN: DEBUGINFOD_CACHE_PATH=%t %python %s --server-cmd 'llvm-debuginfod -v -c 3 %S/Inputs' \ |
| # RUN: --tool-cmd 'llvm-debuginfod-find --dump --executable 2c39b7557c50162aaeb5a3148c9f76e6e46012e3' | \ |
| # RUN: diff - %S/Inputs/main.exe |
| # RUN: DEBUGINFOD_CACHE_PATH=%t %python %s --server-cmd 'llvm-debuginfod -v -c 3 %S/Inputs' \ |
| # RUN: --tool-cmd 'llvm-debuginfod-find --dump --debuginfo 2c39b7557c50162aaeb5a3148c9f76e6e46012e3' | \ |
| # RUN: diff - %S/Inputs/main-debug.exe |
| # Debuginfod server does not yet support source files |
| |
| # # The artifacts should still be present in the cache without needing to query |
| # # the server. |
| # RUN: DEBUGINFOD_CACHE_PATH=%t llvm-debuginfod-find --dump \ |
| # RUN: --executable 2c39b7557c50162aaeb5a3148c9f76e6e46012e3 | \ |
| # RUN: diff - %S/Inputs/main.exe |
| # RUN: DEBUGINFOD_CACHE_PATH=%t llvm-debuginfod-find --dump \ |
| # RUN: --debuginfo 2c39b7557c50162aaeb5a3148c9f76e6e46012e3 | \ |
| # RUN: diff - %S/Inputs/main-debug.exe |
| |
| |
| |
| # This script is used to test the debuginfod client within a host tool against |
| # the debuginfod server. |
| # It first stands up the debuginfod server and then executes the tool. |
| # This way the tool can make debuginfod HTTP requests to the debuginfod server. |
| import argparse |
| import threading |
| import subprocess |
| import sys |
| import os |
| import io |
| |
| # Starts the server and obtains the port number from the first line of stdout. |
| # Waits until the server has completed one full directory scan before returning. |
| def start_debuginfod_server(server_args): |
| process = subprocess.Popen( |
| server_args, |
| env=os.environ, |
| stdout=subprocess.PIPE) |
| port = -1 |
| # Obtain the port. |
| stdout_reader = io.TextIOWrapper(process.stdout, encoding='ascii') |
| stdout_line = stdout_reader.readline() |
| port = int(stdout_line.split()[-1]) |
| # Wait until a directory scan is completed. |
| while True: |
| stdout_line = stdout_reader.readline().strip() |
| print(stdout_line, file=sys.stderr) |
| if stdout_line == 'Updated collection': |
| break |
| return (process, port) |
| |
| # Starts the server with the specified args (if nonempty), then runs the tool |
| # with specified args. |
| # Sets the DEBUGINFOD_CACHE_PATH env var to point at the given cache_directory. |
| # Sets the DEBUGINFOD_URLS env var to point at the local server. |
| def test_tool(server_args, tool_args): |
| server_process = None |
| client_process = None |
| port = None |
| server_process, port = start_debuginfod_server(server_args) |
| try: |
| env = os.environ |
| if port is not None: |
| env['DEBUGINFOD_URLS'] = 'http://localhost:%s' % port |
| client_process = subprocess.Popen( |
| tool_args, env=os.environ) |
| client_code = client_process.wait() |
| if client_code != 0: |
| print('nontrivial client return code %s' % client_code, file=sys.stderr) |
| return 1 |
| if server_process is not None: |
| server_process.terminate() |
| server_code = server_process.wait() |
| if server_code != -15: |
| print('nontrivial server return code %s' % server_code, file=sys.stderr) |
| return 1 |
| |
| finally: |
| if server_process is not None: |
| server_process.terminate() |
| if client_process is not None: |
| client_process.terminate() |
| return 0 |
| |
| def main(): |
| parser = argparse.ArgumentParser() |
| parser.add_argument('--server-cmd', default='', help='Command to start the server. If not present, no server is started.', type=str) |
| parser.add_argument('--tool-cmd', required=True, type=str) |
| args = parser.parse_args() |
| result = test_tool(args.server_cmd.split(), |
| args.tool_cmd.split()) |
| sys.exit(result) |
| |
| if __name__ == '__main__': |
| main() |