xref: /llvm-project/llvm/utils/rsp_bisect_test/test.py (revision b71edfaa4ec3c998aadb35255ce2f60bba2940b0)
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