18490a7d9SArthur Eubanks#!/usr/bin/env python3 28490a7d9SArthur Eubanks# ===----------------------------------------------------------------------===## 38490a7d9SArthur Eubanks# 48490a7d9SArthur Eubanks# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 58490a7d9SArthur Eubanks# See https://llvm.org/LICENSE.txt for license information. 68490a7d9SArthur Eubanks# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 78490a7d9SArthur Eubanks# 88490a7d9SArthur Eubanks# ===----------------------------------------------------------------------===## 98490a7d9SArthur Eubanks 108490a7d9SArthur Eubanksimport os 118490a7d9SArthur Eubanksimport subprocess 128490a7d9SArthur Eubanksimport sys 138490a7d9SArthur Eubanksimport tempfile 148490a7d9SArthur Eubanks 158490a7d9SArthur Eubankscur_dir = os.path.dirname(os.path.realpath(__file__)) 168490a7d9SArthur Eubanksbisect_script = os.path.join(cur_dir, "..", "rsp_bisect.py") 178490a7d9SArthur Eubankstest1 = os.path.join(cur_dir, "test_script.py") 188490a7d9SArthur Eubankstest2 = os.path.join(cur_dir, "test_script_inv.py") 198490a7d9SArthur Eubanksrsp = os.path.join(cur_dir, "rsp") 208490a7d9SArthur Eubanks 218490a7d9SArthur Eubanks 228490a7d9SArthur Eubanksdef run_bisect(success, test_script): 238490a7d9SArthur Eubanks args = [ 24*b71edfaaSTobias Hieta bisect_script, 25*b71edfaaSTobias Hieta "--test", 26*b71edfaaSTobias Hieta test_script, 27*b71edfaaSTobias Hieta "--rsp", 28*b71edfaaSTobias Hieta rsp, 29*b71edfaaSTobias Hieta "--other-rel-path", 30*b71edfaaSTobias Hieta "../Other", 318490a7d9SArthur Eubanks ] 32*b71edfaaSTobias Hieta res = subprocess.run(args, capture_output=True, encoding="UTF-8") 33*b71edfaaSTobias Hieta if len(sys.argv) > 1 and sys.argv[1] == "-v": 34*b71edfaaSTobias Hieta print("Ran {} with return code {}".format(args, res.returncode)) 35*b71edfaaSTobias Hieta print("Stdout:") 368490a7d9SArthur Eubanks print(res.stdout) 37*b71edfaaSTobias Hieta print("Stderr:") 388490a7d9SArthur Eubanks print(res.stderr) 398490a7d9SArthur Eubanks if res.returncode != (0 if success else 1): 408490a7d9SArthur Eubanks print(res.stdout) 418490a7d9SArthur Eubanks print(res.stderr) 42*b71edfaaSTobias Hieta raise AssertionError("unexpected bisection return code for " + str(args)) 438490a7d9SArthur Eubanks return res.stdout 448490a7d9SArthur Eubanks 458490a7d9SArthur Eubanks 468490a7d9SArthur Eubanks# Test that an empty rsp file fails. 47*b71edfaaSTobias Hietawith open(rsp, "w") as f: 488490a7d9SArthur Eubanks pass 498490a7d9SArthur Eubanks 508490a7d9SArthur Eubanksrun_bisect(False, test1) 518490a7d9SArthur Eubanks 528490a7d9SArthur Eubanks# Test that an rsp file without any paths fails. 53*b71edfaaSTobias Hietawith open(rsp, "w") as f: 54*b71edfaaSTobias Hieta f.write("hello\nfoo\n") 558490a7d9SArthur Eubanks 568490a7d9SArthur Eubanksrun_bisect(False, test1) 578490a7d9SArthur Eubanks 588490a7d9SArthur Eubanks# Test that an rsp file with one path succeeds. 59*b71edfaaSTobias Hietawith open(rsp, "w") as f: 60*b71edfaaSTobias Hieta f.write("./foo\n") 618490a7d9SArthur Eubanks 628490a7d9SArthur Eubanksoutput = run_bisect(True, test1) 63*b71edfaaSTobias Hietaassert "./foo" in output 648490a7d9SArthur Eubanks 658490a7d9SArthur Eubanks# Test that an rsp file with one path and one extra arg succeeds. 66*b71edfaaSTobias Hietawith open(rsp, "w") as f: 67*b71edfaaSTobias Hieta f.write("hello\n./foo\n") 688490a7d9SArthur Eubanks 698490a7d9SArthur Eubanksoutput = run_bisect(True, test1) 70*b71edfaaSTobias Hietaassert "./foo" in output 718490a7d9SArthur Eubanks 728490a7d9SArthur Eubanks# Test that an rsp file with three paths and one extra arg succeeds. 73*b71edfaaSTobias Hietawith open(rsp, "w") as f: 74*b71edfaaSTobias Hieta f.write("hello\n./foo\n./bar\n./baz\n") 758490a7d9SArthur Eubanks 768490a7d9SArthur Eubanksoutput = run_bisect(True, test1) 77*b71edfaaSTobias Hietaassert "./foo" in output 788490a7d9SArthur Eubanks 79*b71edfaaSTobias Hietawith open(rsp, "w") as f: 80*b71edfaaSTobias Hieta f.write("hello\n./bar\n./foo\n./baz\n") 818490a7d9SArthur Eubanks 828490a7d9SArthur Eubanksoutput = run_bisect(True, test1) 83*b71edfaaSTobias Hietaassert "./foo" in output 848490a7d9SArthur Eubanks 85*b71edfaaSTobias Hietawith open(rsp, "w") as f: 86*b71edfaaSTobias Hieta f.write("hello\n./bar\n./baz\n./foo\n") 878490a7d9SArthur Eubanks 888490a7d9SArthur Eubanksoutput = run_bisect(True, test1) 89*b71edfaaSTobias Hietaassert "./foo" in output 908490a7d9SArthur Eubanks 918490a7d9SArthur Eubanksoutput = run_bisect(True, test2) 92*b71edfaaSTobias Hietaassert "./foo" in output 938490a7d9SArthur Eubanks 94*b71edfaaSTobias Hietawith open(rsp + ".0", "r") as f: 958490a7d9SArthur Eubanks contents = f.read() 96*b71edfaaSTobias Hieta assert " ../Other/./foo" in contents 978490a7d9SArthur Eubanks 98*b71edfaaSTobias Hietawith open(rsp + ".1", "r") as f: 998490a7d9SArthur Eubanks contents = f.read() 100*b71edfaaSTobias Hieta assert " ./foo" in contents 1018490a7d9SArthur Eubanks 1028490a7d9SArthur Eubanksos.remove(rsp) 103*b71edfaaSTobias Hietaos.remove(rsp + ".0") 104*b71edfaaSTobias Hietaos.remove(rsp + ".1") 1058490a7d9SArthur Eubanks 106*b71edfaaSTobias Hietaprint("Success!") 107