# 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()