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