1#
2# Copyright OpenEmbedded Contributors
3#
4# SPDX-License-Identifier: MIT
5#
6
7import tempfile
8import textwrap
9import bb.tinfoil
10import oe.path
11from oeqa.selftest.case import OESelftestTestCase
12from oeqa.utils.commands import bitbake
13
14class Fetch(OESelftestTestCase):
15    def test_git_mirrors(self):
16        """
17        Verify that the git fetcher will fall back to the HTTP mirrors. The
18        recipe needs to be one that we have on the Yocto Project source mirror
19        and is hosted in git.
20        """
21
22        # TODO: mktempd instead of hardcoding
23        dldir = os.path.join(self.builddir, "download-git-mirrors")
24        self.track_for_cleanup(dldir)
25
26        # No mirrors, should use git to fetch successfully
27        features = """
28DL_DIR = "%s"
29MIRRORS:forcevariable = ""
30PREMIRRORS:forcevariable = ""
31""" % dldir
32        self.write_config(features)
33        oe.path.remove(dldir, recurse=True)
34        bitbake("dbus-wait -c fetch -f")
35
36        # No mirrors and broken git, should fail
37        features = """
38DL_DIR = "%s"
39GIT_PROXY_COMMAND = "false"
40MIRRORS:forcevariable = ""
41PREMIRRORS:forcevariable = ""
42""" % dldir
43        self.write_config(features)
44        oe.path.remove(dldir, recurse=True)
45        with self.assertRaises(AssertionError):
46            bitbake("dbus-wait -c fetch -f")
47
48        # Broken git but a specific mirror
49        features = """
50DL_DIR = "%s"
51GIT_PROXY_COMMAND = "false"
52MIRRORS:forcevariable = "git://.*/.* http://downloads.yoctoproject.org/mirror/sources/"
53""" % dldir
54        self.write_config(features)
55        oe.path.remove(dldir, recurse=True)
56        bitbake("dbus-wait -c fetch -f")
57
58
59class Dependencies(OESelftestTestCase):
60    def write_recipe(self, content, tempdir):
61        f = os.path.join(tempdir, "test.bb")
62        with open(f, "w") as fd:
63            fd.write(content)
64        return f
65
66    def test_dependencies(self):
67        """
68        Verify that the correct dependencies are generated for specific SRC_URI entries.
69        """
70
71        with bb.tinfoil.Tinfoil() as tinfoil, tempfile.TemporaryDirectory(prefix="selftest-fetch") as tempdir:
72            tinfoil.prepare(config_only=False, quiet=2)
73
74            r = """
75            LICENSE="CLOSED"
76            SRC_URI="http://example.com/tarball.zip"
77            """
78            f = self.write_recipe(textwrap.dedent(r), tempdir)
79            d = tinfoil.parse_recipe_file(f)
80            self.assertIn("wget-native", d.getVarFlag("do_fetch", "depends"))
81            self.assertIn("unzip-native", d.getVarFlag("do_unpack", "depends"))
82
83            # Verify that the downloadfilename overrides the URI
84            r = """
85            LICENSE="CLOSED"
86            SRC_URI="https://example.com/tarball;downloadfilename=something.zip"
87            """
88            f = self.write_recipe(textwrap.dedent(r), tempdir)
89            d = tinfoil.parse_recipe_file(f)
90            self.assertIn("wget-native", d.getVarFlag("do_fetch", "depends"))
91            self.assertIn("unzip-native", d.getVarFlag("do_unpack", "depends") or "")
92
93            r = """
94            LICENSE="CLOSED"
95            SRC_URI="ftp://example.com/tarball.lz"
96            """
97            f = self.write_recipe(textwrap.dedent(r), tempdir)
98            d = tinfoil.parse_recipe_file(f)
99            self.assertIn("wget-native", d.getVarFlag("do_fetch", "depends"))
100            self.assertIn("lzip-native", d.getVarFlag("do_unpack", "depends"))
101
102            r = """
103            LICENSE="CLOSED"
104            SRC_URI="git://example.com/repo;branch=master"
105            """
106            f = self.write_recipe(textwrap.dedent(r), tempdir)
107            d = tinfoil.parse_recipe_file(f)
108            self.assertIn("git-native", d.getVarFlag("do_fetch", "depends"))
109