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"
39SRC_URI:pn-dbus-wait = "git://git.yoctoproject.org/dbus-wait;branch=master;protocol=git"
40GIT_PROXY_COMMAND = "false"
41MIRRORS:forcevariable = ""
42PREMIRRORS:forcevariable = ""
43""" % dldir
44        self.write_config(features)
45        oe.path.remove(dldir, recurse=True)
46        with self.assertRaises(AssertionError):
47            bitbake("dbus-wait -c fetch -f")
48
49        # Broken git but a specific mirror
50        features = """
51DL_DIR = "%s"
52SRC_URI:pn-dbus-wait = "git://git.yoctoproject.org/dbus-wait;branch=master;protocol=git"
53GIT_PROXY_COMMAND = "false"
54MIRRORS:forcevariable = "git://.*/.* http://downloads.yoctoproject.org/mirror/sources/"
55""" % dldir
56        self.write_config(features)
57        oe.path.remove(dldir, recurse=True)
58        bitbake("dbus-wait -c fetch -f")
59
60
61class Dependencies(OESelftestTestCase):
62    def write_recipe(self, content, tempdir):
63        f = os.path.join(tempdir, "test.bb")
64        with open(f, "w") as fd:
65            fd.write(content)
66        return f
67
68    def test_dependencies(self):
69        """
70        Verify that the correct dependencies are generated for specific SRC_URI entries.
71        """
72
73        with bb.tinfoil.Tinfoil() as tinfoil, tempfile.TemporaryDirectory(prefix="selftest-fetch") as tempdir:
74            tinfoil.prepare(config_only=False, quiet=2)
75
76            r = """
77            LICENSE="CLOSED"
78            SRC_URI="http://example.com/tarball.zip"
79            """
80            f = self.write_recipe(textwrap.dedent(r), tempdir)
81            d = tinfoil.parse_recipe_file(f)
82            self.assertIn("wget-native", d.getVarFlag("do_fetch", "depends"))
83            self.assertIn("unzip-native", d.getVarFlag("do_unpack", "depends"))
84
85            # Verify that the downloadfilename overrides the URI
86            r = """
87            LICENSE="CLOSED"
88            SRC_URI="https://example.com/tarball;downloadfilename=something.zip"
89            """
90            f = self.write_recipe(textwrap.dedent(r), tempdir)
91            d = tinfoil.parse_recipe_file(f)
92            self.assertIn("wget-native", d.getVarFlag("do_fetch", "depends"))
93            self.assertIn("unzip-native", d.getVarFlag("do_unpack", "depends") or "")
94
95            r = """
96            LICENSE="CLOSED"
97            SRC_URI="ftp://example.com/tarball.lz"
98            """
99            f = self.write_recipe(textwrap.dedent(r), tempdir)
100            d = tinfoil.parse_recipe_file(f)
101            self.assertIn("wget-native", d.getVarFlag("do_fetch", "depends"))
102            self.assertIn("lzip-native", d.getVarFlag("do_unpack", "depends"))
103
104            r = """
105            LICENSE="CLOSED"
106            SRC_URI="git://example.com/repo;branch=master;rev=ffffffffffffffffffffffffffffffffffffffff"
107            """
108            f = self.write_recipe(textwrap.dedent(r), tempdir)
109            d = tinfoil.parse_recipe_file(f)
110            self.assertIn("git-native", d.getVarFlag("do_fetch", "depends"))
111