1import os 2 3from conans.client.cmd.test import install_build_and_test 4from conans.client.manager import deps_install 5from conans.errors import ConanException 6from conans.model.ref import ConanFileReference 7 8 9def _get_test_conanfile_path(tf, conanfile_path): 10 """Searches in the declared test_folder or in the standard locations""" 11 12 if tf is False: 13 # Look up for testing conanfile can be disabled if tf (test folder) is False 14 return None 15 16 test_folders = [tf] if tf else ["test_package", "test"] 17 base_folder = os.path.dirname(conanfile_path) 18 for test_folder_name in test_folders: 19 test_folder = os.path.join(base_folder, test_folder_name) 20 test_conanfile_path = os.path.join(test_folder, "conanfile.py") 21 if os.path.exists(test_conanfile_path): 22 return test_conanfile_path 23 else: 24 if tf: 25 raise ConanException("test folder '%s' not available, or it doesn't have a conanfile.py" 26 % tf) 27 28 29def create(app, ref, graph_info, remotes, update, build_modes, 30 manifest_folder, manifest_verify, manifest_interactive, keep_build, test_build_folder, 31 test_folder, conanfile_path, recorder, is_build_require=False, require_overrides=None): 32 assert isinstance(ref, ConanFileReference), "ref needed" 33 test_conanfile_path = _get_test_conanfile_path(test_folder, conanfile_path) 34 35 if test_conanfile_path: 36 if graph_info.graph_lock: 37 # If we have a lockfile, then we are first going to make sure the lockfile is used 38 # correctly to build the package in the cache, and only later will try to run 39 # test_package 40 out = app.out 41 out.info("Installing and building %s" % repr(ref)) 42 deps_install(app=app, 43 ref_or_path=ref, 44 create_reference=ref, 45 install_folder=None, # Not output conaninfo etc 46 base_folder=None, # Not output generators 47 manifest_folder=manifest_folder, 48 manifest_verify=manifest_verify, 49 manifest_interactive=manifest_interactive, 50 remotes=remotes, 51 graph_info=graph_info, 52 build_modes=build_modes, 53 update=update, 54 keep_build=keep_build, 55 recorder=recorder, 56 conanfile_path=os.path.dirname(test_conanfile_path)) 57 out.info("Executing test_package %s" % repr(ref)) 58 try: 59 graph_info.graph_lock.relax() 60 # FIXME: It needs to clear the cache, otherwise it fails 61 app.binaries_analyzer._evaluated = {} 62 # FIXME: Forcing now not building test dependencies, binaries should be there 63 install_build_and_test(app, test_conanfile_path, ref, graph_info, remotes, 64 update, build_modes=None, 65 test_build_folder=test_build_folder, recorder=recorder) 66 except Exception as e: 67 raise ConanException("Something failed while testing '%s' test_package after " 68 "it was built using the lockfile. Please report this error: %s" 69 % (str(ref), str(e))) 70 71 else: 72 install_build_and_test(app, test_conanfile_path, 73 ref, graph_info, remotes, update, 74 build_modes=build_modes, 75 manifest_folder=manifest_folder, 76 manifest_verify=manifest_verify, 77 manifest_interactive=manifest_interactive, 78 keep_build=keep_build, 79 test_build_folder=test_build_folder, 80 recorder=recorder, 81 require_overrides=require_overrides 82 ) 83 else: 84 deps_install(app=app, 85 ref_or_path=ref, 86 create_reference=ref, 87 install_folder=None, # Not output infos etc 88 base_folder=None, # Not output generators 89 manifest_folder=manifest_folder, 90 manifest_verify=manifest_verify, 91 manifest_interactive=manifest_interactive, 92 remotes=remotes, 93 graph_info=graph_info, 94 build_modes=build_modes, 95 update=update, 96 keep_build=keep_build, 97 recorder=recorder, 98 is_build_require=is_build_require, 99 require_overrides=require_overrides) 100