2 # Apache License, Version 2.0
11 def render_file(filepath):
24 output = subprocess.check_output(command)
26 print(output.decode("utf-8"))
28 except subprocess.CalledProcessError as e:
29 if os.path.exists(TEMP_FILE):
32 print(e.output.decode("utf-8"))
33 if b"Error: engine not found" in e.output:
35 elif b"blender probably wont start" in e.output:
39 if os.path.exists(TEMP_FILE):
42 print(e.output.decode("utf-8"))
46 def test_get_name(filepath):
47 filename = os.path.basename(filepath)
48 return os.path.splitext(filename)[0]
51 def verify_output(filepath):
52 testname = test_get_name(filepath)
53 dirpath = os.path.dirname(filepath)
54 reference_dirpath = os.path.join(dirpath, "reference_renders")
55 reference_image = os.path.join(reference_dirpath, testname + ".png")
56 if not os.path.exists(reference_image):
66 subprocess.check_output(command)
68 except subprocess.CalledProcessError as e:
70 print(e.output.decode("utf-8"))
71 return e.returncode == 1
74 def run_test(filepath):
75 testname = test_get_name(filepath)
76 spacer = "." * (32 - len(testname))
77 print(testname, spacer, end="")
79 error = render_file(filepath)
81 if verify_output(filepath):
91 for dirpath, dirnames, filenames in os.walk(path):
92 for filename in filenames:
93 if filename.lower().endswith(".blend"):
94 filepath = os.path.join(dirpath, filename)
98 def run_all_tests(dirpath):
100 all_files = list(blend_list(dirpath))
102 for filepath in all_files:
103 error = run_test(filepath)
105 if error == "NO_CYCLES":
106 print("Can't perform tests because Cycles failed to load!")
108 elif error == "NO_START":
109 print('Can not perform tests because blender fails to start.',
110 'Make sure INSTALL target was run.')
112 elif error == 'VARIFY':
115 print("Unknown error %r" % error)
116 testname = test_get_name(filepath)
117 failed_tests.append(testname)
120 print("\n\nFAILED tests:")
121 for test in failed_tests:
127 def create_argparse():
128 parser = argparse.ArgumentParser()
129 parser.add_argument("-blender", nargs="+")
130 parser.add_argument("-testdir", nargs=1)
131 parser.add_argument("-idiff", nargs=1)
136 parser = create_argparse()
137 args = parser.parse_args()
139 global BLENDER, ROOT, IDIFF
140 global TEMP_FILE, TEMP_FILE_MASK, TEST_SCRIPT
143 BLENDER = args.blender[0]
144 ROOT = args.testdir[0]
145 IDIFF = args.idiff[0]
147 TEMP = tempfile.mkdtemp()
148 TEMP_FILE_MASK = os.path.join(TEMP, "test")
149 TEMP_FILE = TEMP_FILE_MASK + "0001.png"
151 TEST_SCRIPT = os.path.join(os.path.dirname(__file__), "runtime_check.py")
153 VERBOSE = os.environ.get("BLENDER_VERBOSE") is not None
155 ok = run_all_tests(ROOT)
157 # Cleanup temp files and folders
158 if os.path.exists(TEMP_FILE):
165 if __name__ == "__main__":