blob: c5d15e9fd8dc5f55d08b00cdd249aa0595ee4ee8 [file] [log] [blame]
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001#
2# BitBake Tests for the Fetcher (fetch2/)
3#
4# Copyright (C) 2012 Richard Purdie
5#
Brad Bishopc342db32019-05-15 21:57:59 -04006# SPDX-License-Identifier: GPL-2.0-only
Patrick Williamsc124f4f2015-09-15 14:41:29 -05007#
8
9import unittest
Brad Bishop316dfdd2018-06-25 12:45:53 -040010import hashlib
Patrick Williamsc124f4f2015-09-15 14:41:29 -050011import tempfile
Patrick Williamsc0f7c042017-02-23 20:41:17 -060012import collections
Patrick Williamsc124f4f2015-09-15 14:41:29 -050013import os
Patrick Williams92b42cb2022-09-03 06:53:57 -050014import signal
Andrew Geissler9aee5002022-03-30 16:27:02 +000015import tarfile
Patrick Williamsc124f4f2015-09-15 14:41:29 -050016from bb.fetch2 import URI
17from bb.fetch2 import FetchMethod
18import bb
Andrew Geissler82c905d2020-04-13 13:39:40 -050019from bb.tests.support.httpserver import HTTPService
Patrick Williamsc124f4f2015-09-15 14:41:29 -050020
Brad Bishopd7bf8c12018-02-25 22:55:05 -050021def skipIfNoNetwork():
22 if os.environ.get("BB_SKIP_NETTESTS") == "yes":
Andrew Geissler7e0e3c02022-02-25 20:34:39 +000023 return unittest.skip("network test")
Brad Bishopd7bf8c12018-02-25 22:55:05 -050024 return lambda f: f
25
Patrick Williams92b42cb2022-09-03 06:53:57 -050026class TestTimeout(Exception):
Andrew Geissler8f840682023-07-21 09:09:43 -050027 # Indicate to pytest that this is not a test suite
28 __test__ = False
Patrick Williams92b42cb2022-09-03 06:53:57 -050029
30class Timeout():
31
32 def __init__(self, seconds):
33 self.seconds = seconds
34
35 def handle_timeout(self, signum, frame):
36 raise TestTimeout("Test failed: timeout reached")
37
38 def __enter__(self):
39 signal.signal(signal.SIGALRM, self.handle_timeout)
40 signal.alarm(self.seconds)
41
42 def __exit__(self, exc_type, exc_val, exc_tb):
43 signal.alarm(0)
44
Patrick Williamsc124f4f2015-09-15 14:41:29 -050045class URITest(unittest.TestCase):
46 test_uris = {
47 "http://www.google.com/index.html" : {
48 'uri': 'http://www.google.com/index.html',
49 'scheme': 'http',
50 'hostname': 'www.google.com',
51 'port': None,
52 'hostport': 'www.google.com',
53 'path': '/index.html',
54 'userinfo': '',
55 'username': '',
56 'password': '',
57 'params': {},
58 'query': {},
59 'relative': False
60 },
61 "http://www.google.com/index.html;param1=value1" : {
62 'uri': 'http://www.google.com/index.html;param1=value1',
63 'scheme': 'http',
64 'hostname': 'www.google.com',
65 'port': None,
66 'hostport': 'www.google.com',
67 'path': '/index.html',
68 'userinfo': '',
69 'username': '',
70 'password': '',
71 'params': {
72 'param1': 'value1'
73 },
74 'query': {},
75 'relative': False
76 },
77 "http://www.example.org/index.html?param1=value1" : {
78 'uri': 'http://www.example.org/index.html?param1=value1',
79 'scheme': 'http',
80 'hostname': 'www.example.org',
81 'port': None,
82 'hostport': 'www.example.org',
83 'path': '/index.html',
84 'userinfo': '',
85 'username': '',
86 'password': '',
87 'params': {},
88 'query': {
89 'param1': 'value1'
90 },
91 'relative': False
92 },
93 "http://www.example.org/index.html?qparam1=qvalue1;param2=value2" : {
94 'uri': 'http://www.example.org/index.html?qparam1=qvalue1;param2=value2',
95 'scheme': 'http',
96 'hostname': 'www.example.org',
97 'port': None,
98 'hostport': 'www.example.org',
99 'path': '/index.html',
100 'userinfo': '',
101 'username': '',
102 'password': '',
103 'params': {
104 'param2': 'value2'
105 },
106 'query': {
107 'qparam1': 'qvalue1'
108 },
109 'relative': False
110 },
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600111 # Check that trailing semicolons are handled correctly
112 "http://www.example.org/index.html?qparam1=qvalue1;param2=value2;" : {
113 'uri': 'http://www.example.org/index.html?qparam1=qvalue1;param2=value2',
114 'scheme': 'http',
115 'hostname': 'www.example.org',
116 'port': None,
117 'hostport': 'www.example.org',
118 'path': '/index.html',
119 'userinfo': '',
120 'username': '',
121 'password': '',
122 'params': {
123 'param2': 'value2'
124 },
125 'query': {
126 'qparam1': 'qvalue1'
127 },
128 'relative': False
129 },
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500130 "http://www.example.com:8080/index.html" : {
131 'uri': 'http://www.example.com:8080/index.html',
132 'scheme': 'http',
133 'hostname': 'www.example.com',
134 'port': 8080,
135 'hostport': 'www.example.com:8080',
136 'path': '/index.html',
137 'userinfo': '',
138 'username': '',
139 'password': '',
140 'params': {},
141 'query': {},
142 'relative': False
143 },
144 "cvs://anoncvs@cvs.handhelds.org/cvs;module=familiar/dist/ipkg" : {
145 'uri': 'cvs://anoncvs@cvs.handhelds.org/cvs;module=familiar/dist/ipkg',
146 'scheme': 'cvs',
147 'hostname': 'cvs.handhelds.org',
148 'port': None,
149 'hostport': 'cvs.handhelds.org',
150 'path': '/cvs',
151 'userinfo': 'anoncvs',
152 'username': 'anoncvs',
153 'password': '',
154 'params': {
155 'module': 'familiar/dist/ipkg'
156 },
157 'query': {},
158 'relative': False
159 },
160 "cvs://anoncvs:anonymous@cvs.handhelds.org/cvs;tag=V0-99-81;module=familiar/dist/ipkg": {
161 'uri': 'cvs://anoncvs:anonymous@cvs.handhelds.org/cvs;tag=V0-99-81;module=familiar/dist/ipkg',
162 'scheme': 'cvs',
163 'hostname': 'cvs.handhelds.org',
164 'port': None,
165 'hostport': 'cvs.handhelds.org',
166 'path': '/cvs',
167 'userinfo': 'anoncvs:anonymous',
168 'username': 'anoncvs',
169 'password': 'anonymous',
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600170 'params': collections.OrderedDict([
171 ('tag', 'V0-99-81'),
172 ('module', 'familiar/dist/ipkg')
173 ]),
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500174 'query': {},
175 'relative': False
176 },
177 "file://example.diff": { # NOTE: Not RFC compliant!
178 'uri': 'file:example.diff',
179 'scheme': 'file',
180 'hostname': '',
181 'port': None,
182 'hostport': '',
183 'path': 'example.diff',
184 'userinfo': '',
185 'username': '',
186 'password': '',
187 'params': {},
188 'query': {},
189 'relative': True
190 },
191 "file:example.diff": { # NOTE: RFC compliant version of the former
192 'uri': 'file:example.diff',
193 'scheme': 'file',
194 'hostname': '',
195 'port': None,
196 'hostport': '',
197 'path': 'example.diff',
198 'userinfo': '',
199 'userinfo': '',
200 'username': '',
201 'password': '',
202 'params': {},
203 'query': {},
204 'relative': True
205 },
206 "file:///tmp/example.diff": {
207 'uri': 'file:///tmp/example.diff',
208 'scheme': 'file',
209 'hostname': '',
210 'port': None,
211 'hostport': '',
212 'path': '/tmp/example.diff',
213 'userinfo': '',
214 'userinfo': '',
215 'username': '',
216 'password': '',
217 'params': {},
218 'query': {},
219 'relative': False
220 },
221 "git:///path/example.git": {
222 'uri': 'git:///path/example.git',
223 'scheme': 'git',
224 'hostname': '',
225 'port': None,
226 'hostport': '',
227 'path': '/path/example.git',
228 'userinfo': '',
229 'userinfo': '',
230 'username': '',
231 'password': '',
232 'params': {},
233 'query': {},
234 'relative': False
235 },
236 "git:path/example.git": {
237 'uri': 'git:path/example.git',
238 'scheme': 'git',
239 'hostname': '',
240 'port': None,
241 'hostport': '',
242 'path': 'path/example.git',
243 'userinfo': '',
244 'userinfo': '',
245 'username': '',
246 'password': '',
247 'params': {},
248 'query': {},
249 'relative': True
250 },
251 "git://example.net/path/example.git": {
252 'uri': 'git://example.net/path/example.git',
253 'scheme': 'git',
254 'hostname': 'example.net',
255 'port': None,
256 'hostport': 'example.net',
257 'path': '/path/example.git',
258 'userinfo': '',
259 'userinfo': '',
260 'username': '',
261 'password': '',
262 'params': {},
263 'query': {},
264 'relative': False
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500265 },
Andrew Geisslerc3d88e42020-10-02 09:45:00 -0500266 "git://tfs-example.org:22/tfs/example%20path/example.git": {
267 'uri': 'git://tfs-example.org:22/tfs/example%20path/example.git',
268 'scheme': 'git',
269 'hostname': 'tfs-example.org',
270 'port': 22,
271 'hostport': 'tfs-example.org:22',
272 'path': '/tfs/example path/example.git',
273 'userinfo': '',
274 'userinfo': '',
275 'username': '',
276 'password': '',
277 'params': {},
278 'query': {},
279 'relative': False
280 },
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500281 "http://somesite.net;someparam=1": {
282 'uri': 'http://somesite.net;someparam=1',
283 'scheme': 'http',
284 'hostname': 'somesite.net',
285 'port': None,
286 'hostport': 'somesite.net',
287 'path': '',
288 'userinfo': '',
289 'userinfo': '',
290 'username': '',
291 'password': '',
292 'params': {"someparam" : "1"},
293 'query': {},
294 'relative': False
295 },
296 "file://somelocation;someparam=1": {
297 'uri': 'file:somelocation;someparam=1',
298 'scheme': 'file',
299 'hostname': '',
300 'port': None,
301 'hostport': '',
302 'path': 'somelocation',
303 'userinfo': '',
304 'userinfo': '',
305 'username': '',
306 'password': '',
307 'params': {"someparam" : "1"},
308 'query': {},
309 'relative': True
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500310 }
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500311
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500312 }
313
314 def test_uri(self):
315 for test_uri, ref in self.test_uris.items():
316 uri = URI(test_uri)
317
318 self.assertEqual(str(uri), ref['uri'])
319
320 # expected attributes
321 self.assertEqual(uri.scheme, ref['scheme'])
322
323 self.assertEqual(uri.userinfo, ref['userinfo'])
324 self.assertEqual(uri.username, ref['username'])
325 self.assertEqual(uri.password, ref['password'])
326
327 self.assertEqual(uri.hostname, ref['hostname'])
328 self.assertEqual(uri.port, ref['port'])
329 self.assertEqual(uri.hostport, ref['hostport'])
330
331 self.assertEqual(uri.path, ref['path'])
332 self.assertEqual(uri.params, ref['params'])
333
334 self.assertEqual(uri.relative, ref['relative'])
335
336 def test_dict(self):
337 for test in self.test_uris.values():
338 uri = URI()
339
340 self.assertEqual(uri.scheme, '')
341 self.assertEqual(uri.userinfo, '')
342 self.assertEqual(uri.username, '')
343 self.assertEqual(uri.password, '')
344 self.assertEqual(uri.hostname, '')
345 self.assertEqual(uri.port, None)
346 self.assertEqual(uri.path, '')
347 self.assertEqual(uri.params, {})
348
349
350 uri.scheme = test['scheme']
351 self.assertEqual(uri.scheme, test['scheme'])
352
353 uri.userinfo = test['userinfo']
354 self.assertEqual(uri.userinfo, test['userinfo'])
355 self.assertEqual(uri.username, test['username'])
356 self.assertEqual(uri.password, test['password'])
357
358 # make sure changing the values doesn't do anything unexpected
359 uri.username = 'changeme'
360 self.assertEqual(uri.username, 'changeme')
361 self.assertEqual(uri.password, test['password'])
362 uri.password = 'insecure'
363 self.assertEqual(uri.username, 'changeme')
364 self.assertEqual(uri.password, 'insecure')
365
366 # reset back after our trickery
367 uri.userinfo = test['userinfo']
368 self.assertEqual(uri.userinfo, test['userinfo'])
369 self.assertEqual(uri.username, test['username'])
370 self.assertEqual(uri.password, test['password'])
371
372 uri.hostname = test['hostname']
373 self.assertEqual(uri.hostname, test['hostname'])
374 self.assertEqual(uri.hostport, test['hostname'])
375
376 uri.port = test['port']
377 self.assertEqual(uri.port, test['port'])
378 self.assertEqual(uri.hostport, test['hostport'])
379
380 uri.path = test['path']
381 self.assertEqual(uri.path, test['path'])
382
383 uri.params = test['params']
384 self.assertEqual(uri.params, test['params'])
385
386 uri.query = test['query']
387 self.assertEqual(uri.query, test['query'])
388
389 self.assertEqual(str(uri), test['uri'])
390
391 uri.params = {}
392 self.assertEqual(uri.params, {})
393 self.assertEqual(str(uri), (str(uri).split(";"))[0])
394
395class FetcherTest(unittest.TestCase):
396
397 def setUp(self):
398 self.origdir = os.getcwd()
399 self.d = bb.data.init()
Andrew Geisslereff27472021-10-29 15:35:00 -0500400 self.tempdir = tempfile.mkdtemp(prefix="bitbake-fetch-")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500401 self.dldir = os.path.join(self.tempdir, "download")
402 os.mkdir(self.dldir)
403 self.d.setVar("DL_DIR", self.dldir)
404 self.unpackdir = os.path.join(self.tempdir, "unpacked")
405 os.mkdir(self.unpackdir)
406 persistdir = os.path.join(self.tempdir, "persistdata")
407 self.d.setVar("PERSISTENT_DIR", persistdir)
408
409 def tearDown(self):
410 os.chdir(self.origdir)
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600411 if os.environ.get("BB_TMPDIR_NOCLEAN") == "yes":
412 print("Not cleaning up %s. Please remove manually." % self.tempdir)
413 else:
Andrew Geisslerc926e172021-05-07 16:11:35 -0500414 bb.process.run('chmod u+rw -R %s' % self.tempdir)
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600415 bb.utils.prunedir(self.tempdir)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500416
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000417 def git(self, cmd, cwd=None):
418 if isinstance(cmd, str):
419 cmd = 'git ' + cmd
420 else:
421 cmd = ['git'] + cmd
422 if cwd is None:
423 cwd = self.gitdir
424 return bb.process.run(cmd, cwd=cwd)[0]
425
426 def git_init(self, cwd=None):
427 self.git('init', cwd=cwd)
Patrick Williamse760df82023-05-26 11:10:49 -0500428 # Explicitly set initial branch to master as
429 # a common setup is to use other default
430 # branch than master.
431 self.git(['checkout', '-b', 'master'], cwd=cwd)
Andrew Geissler8f840682023-07-21 09:09:43 -0500432
433 try:
434 self.git(['config', 'user.email'], cwd=cwd)
435 except bb.process.ExecutionError:
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000436 self.git(['config', 'user.email', 'you@example.com'], cwd=cwd)
Andrew Geissler8f840682023-07-21 09:09:43 -0500437
438 try:
439 self.git(['config', 'user.name'], cwd=cwd)
440 except bb.process.ExecutionError:
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000441 self.git(['config', 'user.name', 'Your Name'], cwd=cwd)
442
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500443class MirrorUriTest(FetcherTest):
444
445 replaceuris = {
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000446 ("git://git.invalid.infradead.org/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/.*", "http://somewhere.org/somedir/")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500447 : "http://somewhere.org/somedir/git2_git.invalid.infradead.org.mtd-utils.git.tar.gz",
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000448 ("git://git.invalid.infradead.org/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/([^/]+/)*([^/]*)", "git://somewhere.org/somedir/\\2;protocol=http")
449 : "git://somewhere.org/somedir/mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http",
450 ("git://git.invalid.infradead.org/foo/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/([^/]+/)*([^/]*)", "git://somewhere.org/somedir/\\2;protocol=http")
451 : "git://somewhere.org/somedir/mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http",
452 ("git://git.invalid.infradead.org/foo/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/([^/]+/)*([^/]*)", "git://somewhere.org/\\2;protocol=http")
453 : "git://somewhere.org/mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http",
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500454 ("git://someserver.org/bitbake;tag=1234567890123456789012345678901234567890", "git://someserver.org/bitbake", "git://git.openembedded.org/bitbake")
455 : "git://git.openembedded.org/bitbake;tag=1234567890123456789012345678901234567890",
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000456 ("file://sstate-xyz.tgz", "file://.*", "file:///somewhere/1234/sstate-cache")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500457 : "file:///somewhere/1234/sstate-cache/sstate-xyz.tgz",
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000458 ("file://sstate-xyz.tgz", "file://.*", "file:///somewhere/1234/sstate-cache/")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500459 : "file:///somewhere/1234/sstate-cache/sstate-xyz.tgz",
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000460 ("http://somewhere.org/somedir1/somedir2/somefile_1.2.3.tar.gz", "http://.*/.*", "http://somewhere2.org/somedir3")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500461 : "http://somewhere2.org/somedir3/somefile_1.2.3.tar.gz",
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000462 ("http://somewhere.org/somedir1/somefile_1.2.3.tar.gz", "http://somewhere.org/somedir1/somefile_1.2.3.tar.gz", "http://somewhere2.org/somedir3/somefile_1.2.3.tar.gz")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500463 : "http://somewhere2.org/somedir3/somefile_1.2.3.tar.gz",
464 ("http://www.apache.org/dist/subversion/subversion-1.7.1.tar.bz2", "http://www.apache.org/dist", "http://archive.apache.org/dist")
465 : "http://archive.apache.org/dist/subversion/subversion-1.7.1.tar.bz2",
466 ("http://www.apache.org/dist/subversion/subversion-1.7.1.tar.bz2", "http://.*/.*", "file:///somepath/downloads/")
467 : "file:///somepath/downloads/subversion-1.7.1.tar.bz2",
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000468 ("git://git.invalid.infradead.org/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/.*", "git://somewhere.org/somedir/BASENAME;protocol=http")
469 : "git://somewhere.org/somedir/mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http",
470 ("git://git.invalid.infradead.org/foo/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/.*", "git://somewhere.org/somedir/BASENAME;protocol=http")
471 : "git://somewhere.org/somedir/mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http",
472 ("git://git.invalid.infradead.org/foo/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/.*", "git://somewhere.org/somedir/MIRRORNAME;protocol=http")
473 : "git://somewhere.org/somedir/git.invalid.infradead.org.foo.mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http",
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800474 ("http://somewhere.org/somedir1/somedir2/somefile_1.2.3.tar.gz", "http://.*/.*", "http://somewhere2.org")
475 : "http://somewhere2.org/somefile_1.2.3.tar.gz",
476 ("http://somewhere.org/somedir1/somedir2/somefile_1.2.3.tar.gz", "http://.*/.*", "http://somewhere2.org/")
477 : "http://somewhere2.org/somefile_1.2.3.tar.gz",
478 ("git://someserver.org/bitbake;tag=1234567890123456789012345678901234567890;branch=master", "git://someserver.org/bitbake;branch=master", "git://git.openembedded.org/bitbake;protocol=http")
479 : "git://git.openembedded.org/bitbake;tag=1234567890123456789012345678901234567890;branch=master;protocol=http",
Andrew Geissler595f6302022-01-24 19:11:47 +0000480 ("git://user1@someserver.org/bitbake;tag=1234567890123456789012345678901234567890;branch=master", "git://someserver.org/bitbake;branch=master", "git://user2@git.openembedded.org/bitbake;protocol=http")
481 : "git://user2@git.openembedded.org/bitbake;tag=1234567890123456789012345678901234567890;branch=master;protocol=http",
482 ("git://someserver.org/bitbake;tag=1234567890123456789012345678901234567890;protocol=git;branch=master", "git://someserver.org/bitbake", "git://someotherserver.org/bitbake;protocol=https")
483 : "git://someotherserver.org/bitbake;tag=1234567890123456789012345678901234567890;protocol=https;branch=master",
Andrew Geissler595f6302022-01-24 19:11:47 +0000484 ("gitsm://git.qemu.org/git/seabios.git/;protocol=https;name=roms/seabios;subpath=roms/seabios;bareclone=1;nobranch=1;rev=1234567890123456789012345678901234567890", "gitsm://.*/.*", "http://petalinux.xilinx.com/sswreleases/rel-v${XILINX_VER_MAIN}/downloads") : "http://petalinux.xilinx.com/sswreleases/rel-v%24%7BXILINX_VER_MAIN%7D/downloads/git2_git.qemu.org.git.seabios.git..tar.gz",
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000485 ("https://somewhere.org/example/1.0.0/example;downloadfilename=some-example-1.0.0.tgz", "https://.*/.*", "file:///mirror/PATH")
486 : "file:///mirror/example/1.0.0/some-example-1.0.0.tgz;downloadfilename=some-example-1.0.0.tgz",
487 ("https://somewhere.org/example-1.0.0.tgz;downloadfilename=some-example-1.0.0.tgz", "https://.*/.*", "file:///mirror/some-example-1.0.0.tgz")
488 : "file:///mirror/some-example-1.0.0.tgz;downloadfilename=some-example-1.0.0.tgz",
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500489
490 #Renaming files doesn't work
491 #("http://somewhere.org/somedir1/somefile_1.2.3.tar.gz", "http://somewhere.org/somedir1/somefile_1.2.3.tar.gz", "http://somewhere2.org/somedir3/somefile_2.3.4.tar.gz") : "http://somewhere2.org/somedir3/somefile_2.3.4.tar.gz"
492 #("file://sstate-xyz.tgz", "file://.*/.*", "file:///somewhere/1234/sstate-cache") : "file:///somewhere/1234/sstate-cache/sstate-xyz.tgz",
493 }
494
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000495 mirrorvar = "http://.*/.* file:///somepath/downloads/ " \
496 "git://someserver.org/bitbake git://git.openembedded.org/bitbake " \
497 "https://.*/.* file:///someotherpath/downloads/ " \
498 "http://.*/.* file:///someotherpath/downloads/"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500499
500 def test_urireplace(self):
Andrew Geissler615f2f12022-07-15 14:00:58 -0500501 self.d.setVar("FILESPATH", ".")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500502 for k, v in self.replaceuris.items():
503 ud = bb.fetch.FetchData(k[0], self.d)
504 ud.setup_localpath(self.d)
505 mirrors = bb.fetch2.mirror_from_string("%s %s" % (k[1], k[2]))
506 newuris, uds = bb.fetch2.build_mirroruris(ud, mirrors, self.d)
507 self.assertEqual([v], newuris)
508
509 def test_urilist1(self):
510 fetcher = bb.fetch.FetchData("http://downloads.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz", self.d)
511 mirrors = bb.fetch2.mirror_from_string(self.mirrorvar)
512 uris, uds = bb.fetch2.build_mirroruris(fetcher, mirrors, self.d)
513 self.assertEqual(uris, ['file:///somepath/downloads/bitbake-1.0.tar.gz', 'file:///someotherpath/downloads/bitbake-1.0.tar.gz'])
514
515 def test_urilist2(self):
516 # Catch https:// -> files:// bug
517 fetcher = bb.fetch.FetchData("https://downloads.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz", self.d)
518 mirrors = bb.fetch2.mirror_from_string(self.mirrorvar)
519 uris, uds = bb.fetch2.build_mirroruris(fetcher, mirrors, self.d)
520 self.assertEqual(uris, ['file:///someotherpath/downloads/bitbake-1.0.tar.gz'])
521
522 def test_mirror_of_mirror(self):
523 # Test if mirror of a mirror works
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000524 mirrorvar = self.mirrorvar + " http://.*/.* http://otherdownloads.yoctoproject.org/downloads/"
525 mirrorvar = mirrorvar + " http://otherdownloads.yoctoproject.org/.* http://downloads2.yoctoproject.org/downloads/"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500526 fetcher = bb.fetch.FetchData("http://downloads.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz", self.d)
527 mirrors = bb.fetch2.mirror_from_string(mirrorvar)
528 uris, uds = bb.fetch2.build_mirroruris(fetcher, mirrors, self.d)
529 self.assertEqual(uris, ['file:///somepath/downloads/bitbake-1.0.tar.gz',
530 'file:///someotherpath/downloads/bitbake-1.0.tar.gz',
531 'http://otherdownloads.yoctoproject.org/downloads/bitbake-1.0.tar.gz',
532 'http://downloads2.yoctoproject.org/downloads/bitbake-1.0.tar.gz'])
533
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000534 recmirrorvar = "https://.*/[^/]* http://AAAA/A/A/A/ " \
535 "https://.*/[^/]* https://BBBB/B/B/B/"
Patrick Williamsd7e96312015-09-22 08:09:05 -0500536
537 def test_recursive(self):
538 fetcher = bb.fetch.FetchData("https://downloads.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz", self.d)
539 mirrors = bb.fetch2.mirror_from_string(self.recmirrorvar)
540 uris, uds = bb.fetch2.build_mirroruris(fetcher, mirrors, self.d)
541 self.assertEqual(uris, ['http://AAAA/A/A/A/bitbake/bitbake-1.0.tar.gz',
542 'https://BBBB/B/B/B/bitbake/bitbake-1.0.tar.gz',
543 'http://AAAA/A/A/A/B/B/bitbake/bitbake-1.0.tar.gz'])
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500544
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800545
546class GitDownloadDirectoryNamingTest(FetcherTest):
547 def setUp(self):
548 super(GitDownloadDirectoryNamingTest, self).setUp()
Andrew Geissler028142b2023-05-05 11:29:21 -0500549 self.recipe_url = "git://git.openembedded.org/bitbake;branch=master;protocol=https"
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800550 self.recipe_dir = "git.openembedded.org.bitbake"
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000551 self.mirror_url = "git://github.com/openembedded/bitbake.git;protocol=https;branch=master"
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800552 self.mirror_dir = "github.com.openembedded.bitbake.git"
553
554 self.d.setVar('SRCREV', '82ea737a0b42a8b53e11c9cde141e9e9c0bd8c40')
555
556 def setup_mirror_rewrite(self):
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000557 self.d.setVar("PREMIRRORS", self.recipe_url + " " + self.mirror_url)
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800558
559 @skipIfNoNetwork()
560 def test_that_directory_is_named_after_recipe_url_when_no_mirroring_is_used(self):
561 self.setup_mirror_rewrite()
562 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
563
564 fetcher.download()
565
566 dir = os.listdir(self.dldir + "/git2")
567 self.assertIn(self.recipe_dir, dir)
568
569 @skipIfNoNetwork()
570 def test_that_directory_exists_for_mirrored_url_and_recipe_url_when_mirroring_is_used(self):
571 self.setup_mirror_rewrite()
572 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
573
574 fetcher.download()
575
576 dir = os.listdir(self.dldir + "/git2")
577 self.assertIn(self.mirror_dir, dir)
578 self.assertIn(self.recipe_dir, dir)
579
580 @skipIfNoNetwork()
581 def test_that_recipe_directory_and_mirrored_directory_exists_when_mirroring_is_used_and_the_mirrored_directory_already_exists(self):
582 self.setup_mirror_rewrite()
583 fetcher = bb.fetch.Fetch([self.mirror_url], self.d)
584 fetcher.download()
585 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
586
587 fetcher.download()
588
589 dir = os.listdir(self.dldir + "/git2")
590 self.assertIn(self.mirror_dir, dir)
591 self.assertIn(self.recipe_dir, dir)
592
593
594class TarballNamingTest(FetcherTest):
595 def setUp(self):
596 super(TarballNamingTest, self).setUp()
Andrew Geissler028142b2023-05-05 11:29:21 -0500597 self.recipe_url = "git://git.openembedded.org/bitbake;branch=master;protocol=https"
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800598 self.recipe_tarball = "git2_git.openembedded.org.bitbake.tar.gz"
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000599 self.mirror_url = "git://github.com/openembedded/bitbake.git;protocol=https;branch=master"
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800600 self.mirror_tarball = "git2_github.com.openembedded.bitbake.git.tar.gz"
601
602 self.d.setVar('BB_GENERATE_MIRROR_TARBALLS', '1')
603 self.d.setVar('SRCREV', '82ea737a0b42a8b53e11c9cde141e9e9c0bd8c40')
604
605 def setup_mirror_rewrite(self):
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000606 self.d.setVar("PREMIRRORS", self.recipe_url + " " + self.mirror_url)
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800607
608 @skipIfNoNetwork()
609 def test_that_the_recipe_tarball_is_created_when_no_mirroring_is_used(self):
610 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
611
612 fetcher.download()
613
614 dir = os.listdir(self.dldir)
615 self.assertIn(self.recipe_tarball, dir)
616
617 @skipIfNoNetwork()
618 def test_that_the_mirror_tarball_is_created_when_mirroring_is_used(self):
619 self.setup_mirror_rewrite()
620 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
621
622 fetcher.download()
623
624 dir = os.listdir(self.dldir)
625 self.assertIn(self.mirror_tarball, dir)
626
627
628class GitShallowTarballNamingTest(FetcherTest):
629 def setUp(self):
630 super(GitShallowTarballNamingTest, self).setUp()
Andrew Geissler028142b2023-05-05 11:29:21 -0500631 self.recipe_url = "git://git.openembedded.org/bitbake;branch=master;protocol=https"
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800632 self.recipe_tarball = "gitshallow_git.openembedded.org.bitbake_82ea737-1_master.tar.gz"
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000633 self.mirror_url = "git://github.com/openembedded/bitbake.git;protocol=https;branch=master"
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800634 self.mirror_tarball = "gitshallow_github.com.openembedded.bitbake.git_82ea737-1_master.tar.gz"
635
636 self.d.setVar('BB_GIT_SHALLOW', '1')
637 self.d.setVar('BB_GENERATE_SHALLOW_TARBALLS', '1')
638 self.d.setVar('SRCREV', '82ea737a0b42a8b53e11c9cde141e9e9c0bd8c40')
639
640 def setup_mirror_rewrite(self):
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000641 self.d.setVar("PREMIRRORS", self.recipe_url + " " + self.mirror_url)
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800642
643 @skipIfNoNetwork()
644 def test_that_the_tarball_is_named_after_recipe_url_when_no_mirroring_is_used(self):
645 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
646
647 fetcher.download()
648
649 dir = os.listdir(self.dldir)
650 self.assertIn(self.recipe_tarball, dir)
651
652 @skipIfNoNetwork()
653 def test_that_the_mirror_tarball_is_created_when_mirroring_is_used(self):
654 self.setup_mirror_rewrite()
655 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
656
657 fetcher.download()
658
659 dir = os.listdir(self.dldir)
660 self.assertIn(self.mirror_tarball, dir)
661
662
Andrew Geissler9aee5002022-03-30 16:27:02 +0000663class CleanTarballTest(FetcherTest):
664 def setUp(self):
665 super(CleanTarballTest, self).setUp()
Andrew Geissler028142b2023-05-05 11:29:21 -0500666 self.recipe_url = "git://git.openembedded.org/bitbake;protocol=https"
Andrew Geissler9aee5002022-03-30 16:27:02 +0000667 self.recipe_tarball = "git2_git.openembedded.org.bitbake.tar.gz"
668
669 self.d.setVar('BB_GENERATE_MIRROR_TARBALLS', '1')
670 self.d.setVar('SRCREV', '82ea737a0b42a8b53e11c9cde141e9e9c0bd8c40')
671
672 @skipIfNoNetwork()
673 def test_that_the_tarball_contents_does_not_leak_info(self):
674 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
675
676 fetcher.download()
677
678 fetcher.unpack(self.unpackdir)
679 mtime = bb.process.run('git log --all -1 --format=%ct',
680 cwd=os.path.join(self.unpackdir, 'git'))
681 self.assertEqual(len(mtime), 2)
682 mtime = int(mtime[0])
683
684 archive = tarfile.open(os.path.join(self.dldir, self.recipe_tarball))
685 self.assertNotEqual(len(archive.members), 0)
686 for member in archive.members:
Patrick Williams03907ee2022-05-01 06:28:52 -0500687 self.assertEqual(member.uname, 'oe')
688 self.assertEqual(member.uid, 0)
689 self.assertEqual(member.gname, 'oe')
690 self.assertEqual(member.gid, 0)
Andrew Geissler9aee5002022-03-30 16:27:02 +0000691 self.assertEqual(member.mtime, mtime)
692
693
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500694class FetcherLocalTest(FetcherTest):
695 def setUp(self):
696 def touch(fn):
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600697 with open(fn, 'a'):
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500698 os.utime(fn, None)
699
700 super(FetcherLocalTest, self).setUp()
701 self.localsrcdir = os.path.join(self.tempdir, 'localsrc')
702 os.makedirs(self.localsrcdir)
703 touch(os.path.join(self.localsrcdir, 'a'))
704 touch(os.path.join(self.localsrcdir, 'b'))
705 os.makedirs(os.path.join(self.localsrcdir, 'dir'))
706 touch(os.path.join(self.localsrcdir, 'dir', 'c'))
707 touch(os.path.join(self.localsrcdir, 'dir', 'd'))
708 os.makedirs(os.path.join(self.localsrcdir, 'dir', 'subdir'))
709 touch(os.path.join(self.localsrcdir, 'dir', 'subdir', 'e'))
Andrew Geisslerc3d88e42020-10-02 09:45:00 -0500710 touch(os.path.join(self.localsrcdir, r'backslash\x2dsystemd-unit.device'))
Andrew Geissler595f6302022-01-24 19:11:47 +0000711 bb.process.run('tar cf archive.tar -C dir .', cwd=self.localsrcdir)
712 bb.process.run('tar czf archive.tar.gz -C dir .', cwd=self.localsrcdir)
713 bb.process.run('tar cjf archive.tar.bz2 -C dir .', cwd=self.localsrcdir)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500714 self.d.setVar("FILESPATH", self.localsrcdir)
715
716 def fetchUnpack(self, uris):
717 fetcher = bb.fetch.Fetch(uris, self.d)
718 fetcher.download()
719 fetcher.unpack(self.unpackdir)
720 flst = []
721 for root, dirs, files in os.walk(self.unpackdir):
722 for f in files:
723 flst.append(os.path.relpath(os.path.join(root, f), self.unpackdir))
724 flst.sort()
725 return flst
726
Andrew Geissler615f2f12022-07-15 14:00:58 -0500727 def test_local_checksum_fails_no_file(self):
728 self.d.setVar("SRC_URI", "file://404")
729 with self.assertRaises(bb.BBHandledException):
730 bb.fetch.get_checksum_file_list(self.d)
731
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500732 def test_local(self):
733 tree = self.fetchUnpack(['file://a', 'file://dir/c'])
734 self.assertEqual(tree, ['a', 'dir/c'])
735
Andrew Geisslerc3d88e42020-10-02 09:45:00 -0500736 def test_local_backslash(self):
737 tree = self.fetchUnpack([r'file://backslash\x2dsystemd-unit.device'])
738 self.assertEqual(tree, [r'backslash\x2dsystemd-unit.device'])
739
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500740 def test_local_wildcard(self):
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500741 with self.assertRaises(bb.fetch2.ParameterError):
742 tree = self.fetchUnpack(['file://a', 'file://dir/*'])
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500743
744 def test_local_dir(self):
745 tree = self.fetchUnpack(['file://a', 'file://dir'])
746 self.assertEqual(tree, ['a', 'dir/c', 'dir/d', 'dir/subdir/e'])
747
748 def test_local_subdir(self):
749 tree = self.fetchUnpack(['file://dir/subdir'])
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500750 self.assertEqual(tree, ['dir/subdir/e'])
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500751
752 def test_local_subdir_file(self):
753 tree = self.fetchUnpack(['file://dir/subdir/e'])
754 self.assertEqual(tree, ['dir/subdir/e'])
755
756 def test_local_subdirparam(self):
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500757 tree = self.fetchUnpack(['file://a;subdir=bar', 'file://dir;subdir=foo/moo'])
758 self.assertEqual(tree, ['bar/a', 'foo/moo/dir/c', 'foo/moo/dir/d', 'foo/moo/dir/subdir/e'])
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500759
760 def test_local_deepsubdirparam(self):
761 tree = self.fetchUnpack(['file://dir/subdir/e;subdir=bar'])
762 self.assertEqual(tree, ['bar/dir/subdir/e'])
763
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600764 def test_local_absolutedir(self):
765 # Unpacking to an absolute path that is a subdirectory of the root
766 # should work
767 tree = self.fetchUnpack(['file://a;subdir=%s' % os.path.join(self.unpackdir, 'bar')])
768
769 # Unpacking to an absolute path outside of the root should fail
770 with self.assertRaises(bb.fetch2.UnpackError):
771 self.fetchUnpack(['file://a;subdir=/bin/sh'])
772
Andrew Geissler595f6302022-01-24 19:11:47 +0000773 def test_local_striplevel(self):
774 tree = self.fetchUnpack(['file://archive.tar;subdir=bar;striplevel=1'])
775 self.assertEqual(tree, ['bar/c', 'bar/d', 'bar/subdir/e'])
776
777 def test_local_striplevel_gzip(self):
778 tree = self.fetchUnpack(['file://archive.tar.gz;subdir=bar;striplevel=1'])
779 self.assertEqual(tree, ['bar/c', 'bar/d', 'bar/subdir/e'])
780
781 def test_local_striplevel_bzip2(self):
782 tree = self.fetchUnpack(['file://archive.tar.bz2;subdir=bar;striplevel=1'])
783 self.assertEqual(tree, ['bar/c', 'bar/d', 'bar/subdir/e'])
784
Andrew Geisslerc926e172021-05-07 16:11:35 -0500785 def dummyGitTest(self, suffix):
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600786 # Create dummy local Git repo
787 src_dir = tempfile.mkdtemp(dir=self.tempdir,
788 prefix='gitfetch_localusehead_')
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000789 self.gitdir = os.path.abspath(src_dir)
790 self.git_init()
791 self.git(['commit', '--allow-empty', '-m', 'Dummy commit'])
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600792 # Use other branch than master
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000793 self.git(['checkout', '-b', 'my-devel'])
794 self.git(['commit', '--allow-empty', '-m', 'Dummy commit 2'])
795 orig_rev = self.git(['rev-parse', 'HEAD']).strip()
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600796
797 # Fetch and check revision
798 self.d.setVar("SRCREV", "AUTOINC")
Andrew Geisslerfc113ea2023-03-31 09:59:46 -0500799 self.d.setVar("__BBSRCREV_SEEN", "1")
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000800 url = "git://" + self.gitdir + ";branch=master;protocol=file;" + suffix
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600801 fetcher = bb.fetch.Fetch([url], self.d)
802 fetcher.download()
803 fetcher.unpack(self.unpackdir)
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000804 unpack_rev = self.git(['rev-parse', 'HEAD'],
805 cwd=os.path.join(self.unpackdir, 'git')).strip()
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600806 self.assertEqual(orig_rev, unpack_rev)
807
Andrew Geisslerc926e172021-05-07 16:11:35 -0500808 def test_local_gitfetch_usehead(self):
809 self.dummyGitTest("usehead=1")
810
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600811 def test_local_gitfetch_usehead_withname(self):
Andrew Geisslerc926e172021-05-07 16:11:35 -0500812 self.dummyGitTest("usehead=1;name=newName")
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600813
Andrew Geisslerc926e172021-05-07 16:11:35 -0500814 def test_local_gitfetch_shared(self):
815 self.dummyGitTest("usehead=1;name=sharedName")
816 alt = os.path.join(self.unpackdir, 'git/.git/objects/info/alternates')
817 self.assertTrue(os.path.exists(alt))
818
819 def test_local_gitfetch_noshared(self):
820 self.d.setVar('BB_GIT_NOSHARED', '1')
821 self.unpackdir += '_noshared'
822 self.dummyGitTest("usehead=1;name=noSharedName")
823 alt = os.path.join(self.unpackdir, 'git/.git/objects/info/alternates')
824 self.assertFalse(os.path.exists(alt))
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600825
Brad Bishop316dfdd2018-06-25 12:45:53 -0400826class FetcherNoNetworkTest(FetcherTest):
827 def setUp(self):
828 super().setUp()
829 # all test cases are based on not having network
830 self.d.setVar("BB_NO_NETWORK", "1")
831
832 def test_missing(self):
833 string = "this is a test file\n".encode("utf-8")
834 self.d.setVarFlag("SRC_URI", "md5sum", hashlib.md5(string).hexdigest())
835 self.d.setVarFlag("SRC_URI", "sha256sum", hashlib.sha256(string).hexdigest())
836
837 self.assertFalse(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz")))
838 self.assertFalse(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz.done")))
839 fetcher = bb.fetch.Fetch(["http://invalid.yoctoproject.org/test-file.tar.gz"], self.d)
840 with self.assertRaises(bb.fetch2.NetworkAccess):
841 fetcher.download()
842
843 def test_valid_missing_donestamp(self):
844 # create the file in the download directory with correct hash
845 string = "this is a test file\n".encode("utf-8")
846 with open(os.path.join(self.dldir, "test-file.tar.gz"), "wb") as f:
847 f.write(string)
848
849 self.d.setVarFlag("SRC_URI", "md5sum", hashlib.md5(string).hexdigest())
850 self.d.setVarFlag("SRC_URI", "sha256sum", hashlib.sha256(string).hexdigest())
851
852 self.assertTrue(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz")))
853 self.assertFalse(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz.done")))
854 fetcher = bb.fetch.Fetch(["http://invalid.yoctoproject.org/test-file.tar.gz"], self.d)
855 fetcher.download()
856 self.assertTrue(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz.done")))
857
858 def test_invalid_missing_donestamp(self):
859 # create an invalid file in the download directory with incorrect hash
860 string = "this is a test file\n".encode("utf-8")
861 with open(os.path.join(self.dldir, "test-file.tar.gz"), "wb"):
862 pass
863
864 self.d.setVarFlag("SRC_URI", "md5sum", hashlib.md5(string).hexdigest())
865 self.d.setVarFlag("SRC_URI", "sha256sum", hashlib.sha256(string).hexdigest())
866
867 self.assertTrue(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz")))
868 self.assertFalse(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz.done")))
869 fetcher = bb.fetch.Fetch(["http://invalid.yoctoproject.org/test-file.tar.gz"], self.d)
870 with self.assertRaises(bb.fetch2.NetworkAccess):
871 fetcher.download()
872 # the existing file should not exist or should have be moved to "bad-checksum"
873 self.assertFalse(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz")))
874
875 def test_nochecksums_missing(self):
876 self.assertFalse(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz")))
877 self.assertFalse(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz.done")))
878 # ssh fetch does not support checksums
879 fetcher = bb.fetch.Fetch(["ssh://invalid@invalid.yoctoproject.org/test-file.tar.gz"], self.d)
880 # attempts to download with missing donestamp
881 with self.assertRaises(bb.fetch2.NetworkAccess):
882 fetcher.download()
883
884 def test_nochecksums_missing_donestamp(self):
885 # create a file in the download directory
886 with open(os.path.join(self.dldir, "test-file.tar.gz"), "wb"):
887 pass
888
889 self.assertTrue(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz")))
890 self.assertFalse(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz.done")))
891 # ssh fetch does not support checksums
892 fetcher = bb.fetch.Fetch(["ssh://invalid@invalid.yoctoproject.org/test-file.tar.gz"], self.d)
893 # attempts to download with missing donestamp
894 with self.assertRaises(bb.fetch2.NetworkAccess):
895 fetcher.download()
896
897 def test_nochecksums_has_donestamp(self):
898 # create a file in the download directory with the donestamp
899 with open(os.path.join(self.dldir, "test-file.tar.gz"), "wb"):
900 pass
901 with open(os.path.join(self.dldir, "test-file.tar.gz.done"), "wb"):
902 pass
903
904 self.assertTrue(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz")))
905 self.assertTrue(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz.done")))
906 # ssh fetch does not support checksums
907 fetcher = bb.fetch.Fetch(["ssh://invalid@invalid.yoctoproject.org/test-file.tar.gz"], self.d)
908 # should not fetch
909 fetcher.download()
910 # both files should still exist
911 self.assertTrue(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz")))
912 self.assertTrue(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz.done")))
913
914 def test_nochecksums_missing_has_donestamp(self):
915 # create a file in the download directory with the donestamp
916 with open(os.path.join(self.dldir, "test-file.tar.gz.done"), "wb"):
917 pass
918
919 self.assertFalse(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz")))
920 self.assertTrue(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz.done")))
921 # ssh fetch does not support checksums
922 fetcher = bb.fetch.Fetch(["ssh://invalid@invalid.yoctoproject.org/test-file.tar.gz"], self.d)
923 with self.assertRaises(bb.fetch2.NetworkAccess):
924 fetcher.download()
925 # both files should still exist
926 self.assertFalse(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz")))
927 self.assertFalse(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz.done")))
928
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500929class FetcherNetworkTest(FetcherTest):
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500930 @skipIfNoNetwork()
931 def test_fetch(self):
Andrew Geisslereff27472021-10-29 15:35:00 -0500932 fetcher = bb.fetch.Fetch(["https://downloads.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz", "https://downloads.yoctoproject.org/releases/bitbake/bitbake-1.1.tar.gz"], self.d)
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500933 fetcher.download()
934 self.assertEqual(os.path.getsize(self.dldir + "/bitbake-1.0.tar.gz"), 57749)
935 self.assertEqual(os.path.getsize(self.dldir + "/bitbake-1.1.tar.gz"), 57892)
936 self.d.setVar("BB_NO_NETWORK", "1")
Andrew Geisslereff27472021-10-29 15:35:00 -0500937 fetcher = bb.fetch.Fetch(["https://downloads.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz", "https://downloads.yoctoproject.org/releases/bitbake/bitbake-1.1.tar.gz"], self.d)
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500938 fetcher.download()
939 fetcher.unpack(self.unpackdir)
940 self.assertEqual(len(os.listdir(self.unpackdir + "/bitbake-1.0/")), 9)
941 self.assertEqual(len(os.listdir(self.unpackdir + "/bitbake-1.1/")), 9)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500942
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500943 @skipIfNoNetwork()
944 def test_fetch_mirror(self):
Andrew Geisslereff27472021-10-29 15:35:00 -0500945 self.d.setVar("MIRRORS", "http://.*/.* https://downloads.yoctoproject.org/releases/bitbake")
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500946 fetcher = bb.fetch.Fetch(["http://invalid.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz"], self.d)
947 fetcher.download()
948 self.assertEqual(os.path.getsize(self.dldir + "/bitbake-1.0.tar.gz"), 57749)
949
950 @skipIfNoNetwork()
951 def test_fetch_mirror_of_mirror(self):
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000952 self.d.setVar("MIRRORS", "http://.*/.* http://invalid2.yoctoproject.org/ http://invalid2.yoctoproject.org/.* https://downloads.yoctoproject.org/releases/bitbake")
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500953 fetcher = bb.fetch.Fetch(["http://invalid.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz"], self.d)
954 fetcher.download()
955 self.assertEqual(os.path.getsize(self.dldir + "/bitbake-1.0.tar.gz"), 57749)
956
957 @skipIfNoNetwork()
958 def test_fetch_file_mirror_of_mirror(self):
Andrew Geissler615f2f12022-07-15 14:00:58 -0500959 self.d.setVar("FILESPATH", ".")
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000960 self.d.setVar("MIRRORS", "http://.*/.* file:///some1where/ file:///some1where/.* file://some2where/ file://some2where/.* https://downloads.yoctoproject.org/releases/bitbake")
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500961 fetcher = bb.fetch.Fetch(["http://invalid.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz"], self.d)
962 os.mkdir(self.dldir + "/some2where")
963 fetcher.download()
964 self.assertEqual(os.path.getsize(self.dldir + "/bitbake-1.0.tar.gz"), 57749)
965
966 @skipIfNoNetwork()
967 def test_fetch_premirror(self):
Andrew Geisslereff27472021-10-29 15:35:00 -0500968 self.d.setVar("PREMIRRORS", "http://.*/.* https://downloads.yoctoproject.org/releases/bitbake")
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500969 fetcher = bb.fetch.Fetch(["http://invalid.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz"], self.d)
970 fetcher.download()
971 self.assertEqual(os.path.getsize(self.dldir + "/bitbake-1.0.tar.gz"), 57749)
972
973 @skipIfNoNetwork()
Andrew Geissler5199d832021-09-24 16:47:35 -0500974 def test_fetch_specify_downloadfilename(self):
Andrew Geisslereff27472021-10-29 15:35:00 -0500975 fetcher = bb.fetch.Fetch(["https://downloads.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz;downloadfilename=bitbake-v1.0.0.tar.gz"], self.d)
Andrew Geissler5199d832021-09-24 16:47:35 -0500976 fetcher.download()
977 self.assertEqual(os.path.getsize(self.dldir + "/bitbake-v1.0.0.tar.gz"), 57749)
978
979 @skipIfNoNetwork()
980 def test_fetch_premirror_specify_downloadfilename_regex_uri(self):
Andrew Geisslereff27472021-10-29 15:35:00 -0500981 self.d.setVar("PREMIRRORS", "http://.*/.* https://downloads.yoctoproject.org/releases/bitbake/")
Andrew Geissler595f6302022-01-24 19:11:47 +0000982 fetcher = bb.fetch.Fetch(["http://invalid.yoctoproject.org/releases/bitbake/1.0.tar.gz;downloadfilename=bitbake-1.0.tar.gz"], self.d)
Andrew Geissler5199d832021-09-24 16:47:35 -0500983 fetcher.download()
Andrew Geissler595f6302022-01-24 19:11:47 +0000984 self.assertEqual(os.path.getsize(self.dldir + "/bitbake-1.0.tar.gz"), 57749)
Andrew Geissler5199d832021-09-24 16:47:35 -0500985
986 @skipIfNoNetwork()
987 # BZ13039
988 def test_fetch_premirror_specify_downloadfilename_specific_uri(self):
Andrew Geisslereff27472021-10-29 15:35:00 -0500989 self.d.setVar("PREMIRRORS", "http://invalid.yoctoproject.org/releases/bitbake https://downloads.yoctoproject.org/releases/bitbake")
Andrew Geissler595f6302022-01-24 19:11:47 +0000990 fetcher = bb.fetch.Fetch(["http://invalid.yoctoproject.org/releases/bitbake/1.0.tar.gz;downloadfilename=bitbake-1.0.tar.gz"], self.d)
Andrew Geissler5199d832021-09-24 16:47:35 -0500991 fetcher.download()
Andrew Geissler595f6302022-01-24 19:11:47 +0000992 self.assertEqual(os.path.getsize(self.dldir + "/bitbake-1.0.tar.gz"), 57749)
993
994 @skipIfNoNetwork()
995 def test_fetch_premirror_use_downloadfilename_to_fetch(self):
996 # Ensure downloadfilename is used when fetching from premirror.
997 self.d.setVar("PREMIRRORS", "http://.*/.* https://downloads.yoctoproject.org/releases/bitbake")
998 fetcher = bb.fetch.Fetch(["http://invalid.yoctoproject.org/releases/bitbake/bitbake-1.1.tar.gz;downloadfilename=bitbake-1.0.tar.gz"], self.d)
999 fetcher.download()
1000 self.assertEqual(os.path.getsize(self.dldir + "/bitbake-1.0.tar.gz"), 57749)
Andrew Geissler5199d832021-09-24 16:47:35 -05001001
1002 @skipIfNoNetwork()
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001003 def gitfetcher(self, url1, url2):
1004 def checkrevision(self, fetcher):
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001005 fetcher.unpack(self.unpackdir)
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001006 revision = self.git(['rev-parse', 'HEAD'],
1007 cwd=os.path.join(self.unpackdir, 'git')).strip()
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001008 self.assertEqual(revision, "270a05b0b4ba0959fe0624d2a4885d7b70426da5")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001009
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001010 self.d.setVar("BB_GENERATE_MIRROR_TARBALLS", "1")
1011 self.d.setVar("SRCREV", "270a05b0b4ba0959fe0624d2a4885d7b70426da5")
1012 fetcher = bb.fetch.Fetch([url1], self.d)
1013 fetcher.download()
1014 checkrevision(self, fetcher)
1015 # Wipe out the dldir clone and the unpacked source, turn off the network and check mirror tarball works
1016 bb.utils.prunedir(self.dldir + "/git2/")
1017 bb.utils.prunedir(self.unpackdir)
1018 self.d.setVar("BB_NO_NETWORK", "1")
1019 fetcher = bb.fetch.Fetch([url2], self.d)
1020 fetcher.download()
1021 checkrevision(self, fetcher)
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001022
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001023 @skipIfNoNetwork()
1024 def test_gitfetch(self):
Andrew Geissler028142b2023-05-05 11:29:21 -05001025 url1 = url2 = "git://git.openembedded.org/bitbake;branch=master;protocol=https"
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001026 self.gitfetcher(url1, url2)
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001027
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001028 @skipIfNoNetwork()
1029 def test_gitfetch_goodsrcrev(self):
1030 # SRCREV is set but matches rev= parameter
Andrew Geissler028142b2023-05-05 11:29:21 -05001031 url1 = url2 = "git://git.openembedded.org/bitbake;rev=270a05b0b4ba0959fe0624d2a4885d7b70426da5;branch=master;protocol=https"
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001032 self.gitfetcher(url1, url2)
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001033
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001034 @skipIfNoNetwork()
1035 def test_gitfetch_badsrcrev(self):
1036 # SRCREV is set but does not match rev= parameter
Andrew Geissler028142b2023-05-05 11:29:21 -05001037 url1 = url2 = "git://git.openembedded.org/bitbake;rev=dead05b0b4ba0959fe0624d2a4885d7b70426da5;branch=master;protocol=https"
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001038 self.assertRaises(bb.fetch.FetchError, self.gitfetcher, url1, url2)
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001039
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001040 @skipIfNoNetwork()
1041 def test_gitfetch_tagandrev(self):
1042 # SRCREV is set but does not match rev= parameter
Andrew Geissler028142b2023-05-05 11:29:21 -05001043 url1 = url2 = "git://git.openembedded.org/bitbake;rev=270a05b0b4ba0959fe0624d2a4885d7b70426da5;tag=270a05b0b4ba0959fe0624d2a4885d7b70426da5;protocol=https"
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001044 self.assertRaises(bb.fetch.FetchError, self.gitfetcher, url1, url2)
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001045
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001046 @skipIfNoNetwork()
Andrew Geisslerd1e89492021-02-12 15:35:20 -06001047 def test_gitfetch_usehead(self):
1048 # Since self.gitfetcher() sets SRCREV we expect this to override
1049 # `usehead=1' and instead fetch the specified SRCREV. See
1050 # test_local_gitfetch_usehead() for a positive use of the usehead
1051 # feature.
Andrew Geissler028142b2023-05-05 11:29:21 -05001052 url = "git://git.openembedded.org/bitbake;usehead=1;branch=master;protocol=https"
Andrew Geisslerd1e89492021-02-12 15:35:20 -06001053 self.assertRaises(bb.fetch.ParameterError, self.gitfetcher, url, url)
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001054
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001055 @skipIfNoNetwork()
Andrew Geisslerd1e89492021-02-12 15:35:20 -06001056 def test_gitfetch_usehead_withname(self):
1057 # Since self.gitfetcher() sets SRCREV we expect this to override
1058 # `usehead=1' and instead fetch the specified SRCREV. See
1059 # test_local_gitfetch_usehead() for a positive use of the usehead
1060 # feature.
Andrew Geissler028142b2023-05-05 11:29:21 -05001061 url = "git://git.openembedded.org/bitbake;usehead=1;name=newName;branch=master;protocol=https"
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001062 self.assertRaises(bb.fetch.ParameterError, self.gitfetcher, url, url)
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001063
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001064 @skipIfNoNetwork()
Brad Bishop1a4b7ee2018-12-16 17:11:34 -08001065 def test_gitfetch_finds_local_tarball_for_mirrored_url_when_previous_downloaded_by_the_recipe_url(self):
Andrew Geissler028142b2023-05-05 11:29:21 -05001066 recipeurl = "git://git.openembedded.org/bitbake;branch=master;protocol=https"
1067 mirrorurl = "git://someserver.org/bitbake;branch=master;protocol=https"
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001068 self.d.setVar("PREMIRRORS", "git://someserver.org/bitbake git://git.openembedded.org/bitbake")
Brad Bishop1a4b7ee2018-12-16 17:11:34 -08001069 self.gitfetcher(recipeurl, mirrorurl)
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001070
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001071 @skipIfNoNetwork()
Brad Bishop1a4b7ee2018-12-16 17:11:34 -08001072 def test_gitfetch_finds_local_tarball_when_previous_downloaded_from_a_premirror(self):
Andrew Geissler028142b2023-05-05 11:29:21 -05001073 recipeurl = "git://someserver.org/bitbake;branch=master;protocol=https"
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001074 self.d.setVar("PREMIRRORS", "git://someserver.org/bitbake git://git.openembedded.org/bitbake")
Brad Bishop1a4b7ee2018-12-16 17:11:34 -08001075 self.gitfetcher(recipeurl, recipeurl)
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001076
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001077 @skipIfNoNetwork()
Brad Bishop1a4b7ee2018-12-16 17:11:34 -08001078 def test_gitfetch_finds_local_repository_when_premirror_rewrites_the_recipe_url(self):
Andrew Geissler028142b2023-05-05 11:29:21 -05001079 realurl = "https://git.openembedded.org/bitbake"
1080 recipeurl = "git://someserver.org/bitbake;protocol=https"
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001081 self.sourcedir = self.unpackdir.replace("unpacked", "sourcemirror.git")
1082 os.chdir(self.tempdir)
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001083 self.git(['clone', realurl, self.sourcedir], cwd=self.tempdir)
1084 self.d.setVar("PREMIRRORS", "%s git://%s;protocol=file" % (recipeurl, self.sourcedir))
Brad Bishop1a4b7ee2018-12-16 17:11:34 -08001085 self.gitfetcher(recipeurl, recipeurl)
Patrick Williamsc0f7c042017-02-23 20:41:17 -06001086
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001087 @skipIfNoNetwork()
1088 def test_git_submodule(self):
Brad Bishopf8caae32019-03-25 13:13:56 -04001089 # URL with ssh submodules
Andrew Geissler028142b2023-05-05 11:29:21 -05001090 url = "gitsm://git.yoctoproject.org/git-submodule-test;branch=ssh-gitsm-tests;rev=049da4a6cb198d7c0302e9e8b243a1443cb809a7;branch=master;protocol=https"
Brad Bishopf8caae32019-03-25 13:13:56 -04001091 # Original URL (comment this if you have ssh access to git.yoctoproject.org)
Andrew Geissler028142b2023-05-05 11:29:21 -05001092 url = "gitsm://git.yoctoproject.org/git-submodule-test;branch=master;rev=a2885dd7d25380d23627e7544b7bbb55014b16ee;branch=master;protocol=https"
Brad Bishopf8caae32019-03-25 13:13:56 -04001093 fetcher = bb.fetch.Fetch([url], self.d)
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001094 fetcher.download()
1095 # Previous cwd has been deleted
1096 os.chdir(os.path.dirname(self.unpackdir))
1097 fetcher.unpack(self.unpackdir)
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001098
Brad Bishopf8caae32019-03-25 13:13:56 -04001099 repo_path = os.path.join(self.tempdir, 'unpacked', 'git')
1100 self.assertTrue(os.path.exists(repo_path), msg='Unpacked repository missing')
1101 self.assertTrue(os.path.exists(os.path.join(repo_path, 'bitbake')), msg='bitbake submodule missing')
1102 self.assertFalse(os.path.exists(os.path.join(repo_path, 'na')), msg='uninitialized submodule present')
1103
1104 # Only when we're running the extended test with a submodule's submodule, can we check this.
1105 if os.path.exists(os.path.join(repo_path, 'bitbake-gitsm-test1')):
1106 self.assertTrue(os.path.exists(os.path.join(repo_path, 'bitbake-gitsm-test1', 'bitbake')), msg='submodule of submodule missing')
1107
Brad Bishop96ff1982019-08-19 13:50:42 -04001108 @skipIfNoNetwork()
Brad Bishopf8caae32019-03-25 13:13:56 -04001109 def test_git_submodule_dbus_broker(self):
1110 # The following external repositories have show failures in fetch and unpack operations
1111 # We want to avoid regressions!
Andrew Geissler595f6302022-01-24 19:11:47 +00001112 url = "gitsm://github.com/bus1/dbus-broker;protocol=https;rev=fc874afa0992d0c75ec25acb43d344679f0ee7d2;branch=main"
Brad Bishopf8caae32019-03-25 13:13:56 -04001113 fetcher = bb.fetch.Fetch([url], self.d)
1114 fetcher.download()
1115 # Previous cwd has been deleted
1116 os.chdir(os.path.dirname(self.unpackdir))
1117 fetcher.unpack(self.unpackdir)
1118
1119 repo_path = os.path.join(self.tempdir, 'unpacked', 'git')
1120 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/subprojects/c-dvar/config')), msg='Missing submodule config "subprojects/c-dvar"')
1121 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/subprojects/c-list/config')), msg='Missing submodule config "subprojects/c-list"')
1122 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/subprojects/c-rbtree/config')), msg='Missing submodule config "subprojects/c-rbtree"')
1123 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/subprojects/c-sundry/config')), msg='Missing submodule config "subprojects/c-sundry"')
1124 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/subprojects/c-utf8/config')), msg='Missing submodule config "subprojects/c-utf8"')
1125
Brad Bishop96ff1982019-08-19 13:50:42 -04001126 @skipIfNoNetwork()
Brad Bishopf8caae32019-03-25 13:13:56 -04001127 def test_git_submodule_CLI11(self):
Andrew Geissler595f6302022-01-24 19:11:47 +00001128 url = "gitsm://github.com/CLIUtils/CLI11;protocol=https;rev=bd4dc911847d0cde7a6b41dfa626a85aab213baf;branch=main"
Brad Bishopf8caae32019-03-25 13:13:56 -04001129 fetcher = bb.fetch.Fetch([url], self.d)
1130 fetcher.download()
1131 # Previous cwd has been deleted
1132 os.chdir(os.path.dirname(self.unpackdir))
1133 fetcher.unpack(self.unpackdir)
1134
1135 repo_path = os.path.join(self.tempdir, 'unpacked', 'git')
1136 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/extern/googletest/config')), msg='Missing submodule config "extern/googletest"')
1137 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/extern/json/config')), msg='Missing submodule config "extern/json"')
1138 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/extern/sanitizers/config')), msg='Missing submodule config "extern/sanitizers"')
1139
Brad Bishop96ff1982019-08-19 13:50:42 -04001140 @skipIfNoNetwork()
Brad Bishop19323692019-04-05 15:28:33 -04001141 def test_git_submodule_update_CLI11(self):
1142 """ Prevent regression on update detection not finding missing submodule, or modules without needed commits """
Andrew Geissler595f6302022-01-24 19:11:47 +00001143 url = "gitsm://github.com/CLIUtils/CLI11;protocol=https;rev=cf6a99fa69aaefe477cc52e3ef4a7d2d7fa40714;branch=main"
Brad Bishop19323692019-04-05 15:28:33 -04001144 fetcher = bb.fetch.Fetch([url], self.d)
1145 fetcher.download()
1146
1147 # CLI11 that pulls in a newer nlohmann-json
Andrew Geissler595f6302022-01-24 19:11:47 +00001148 url = "gitsm://github.com/CLIUtils/CLI11;protocol=https;rev=49ac989a9527ee9bb496de9ded7b4872c2e0e5ca;branch=main"
Brad Bishop19323692019-04-05 15:28:33 -04001149 fetcher = bb.fetch.Fetch([url], self.d)
1150 fetcher.download()
1151 # Previous cwd has been deleted
1152 os.chdir(os.path.dirname(self.unpackdir))
1153 fetcher.unpack(self.unpackdir)
1154
1155 repo_path = os.path.join(self.tempdir, 'unpacked', 'git')
1156 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/extern/googletest/config')), msg='Missing submodule config "extern/googletest"')
1157 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/extern/json/config')), msg='Missing submodule config "extern/json"')
1158 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/extern/sanitizers/config')), msg='Missing submodule config "extern/sanitizers"')
1159
Brad Bishop96ff1982019-08-19 13:50:42 -04001160 @skipIfNoNetwork()
Brad Bishopf8caae32019-03-25 13:13:56 -04001161 def test_git_submodule_aktualizr(self):
Andrew Geissler595f6302022-01-24 19:11:47 +00001162 url = "gitsm://github.com/advancedtelematic/aktualizr;branch=master;protocol=https;rev=d00d1a04cc2366d1a5f143b84b9f507f8bd32c44"
Brad Bishopf8caae32019-03-25 13:13:56 -04001163 fetcher = bb.fetch.Fetch([url], self.d)
1164 fetcher.download()
1165 # Previous cwd has been deleted
1166 os.chdir(os.path.dirname(self.unpackdir))
1167 fetcher.unpack(self.unpackdir)
1168
1169 repo_path = os.path.join(self.tempdir, 'unpacked', 'git')
1170 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/partial/extern/isotp-c/config')), msg='Missing submodule config "partial/extern/isotp-c/config"')
1171 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/partial/extern/isotp-c/modules/deps/bitfield-c/config')), msg='Missing submodule config "partial/extern/isotp-c/modules/deps/bitfield-c/config"')
1172 self.assertTrue(os.path.exists(os.path.join(repo_path, 'partial/extern/isotp-c/deps/bitfield-c/.git')), msg="Submodule of submodule isotp-c did not unpack properly")
1173 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/tests/tuf-test-vectors/config')), msg='Missing submodule config "tests/tuf-test-vectors/config"')
1174 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/third_party/googletest/config')), msg='Missing submodule config "third_party/googletest/config"')
1175 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/third_party/HdrHistogram_c/config')), msg='Missing submodule config "third_party/HdrHistogram_c/config"')
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001176
Brad Bishop96ff1982019-08-19 13:50:42 -04001177 @skipIfNoNetwork()
Brad Bishop393846f2019-05-20 12:24:11 -04001178 def test_git_submodule_iotedge(self):
1179 """ Prevent regression on deeply nested submodules not being checked out properly, even though they were fetched. """
1180
1181 # This repository also has submodules where the module (name), path and url do not align
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001182 url = "gitsm://github.com/azure/iotedge.git;protocol=https;rev=d76e0316c6f324345d77c48a83ce836d09392699;branch=main"
Brad Bishop393846f2019-05-20 12:24:11 -04001183 fetcher = bb.fetch.Fetch([url], self.d)
1184 fetcher.download()
1185 # Previous cwd has been deleted
1186 os.chdir(os.path.dirname(self.unpackdir))
1187 fetcher.unpack(self.unpackdir)
1188
1189 repo_path = os.path.join(self.tempdir, 'unpacked', 'git')
1190
1191 self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/c-shared/README.md')), msg='Missing submodule checkout')
1192 self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/c-shared/testtools/ctest/README.md')), msg='Missing submodule checkout')
1193 self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/c-shared/testtools/testrunner/readme.md')), msg='Missing submodule checkout')
1194 self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/c-shared/testtools/umock-c/readme.md')), msg='Missing submodule checkout')
1195 self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/c-shared/testtools/umock-c/deps/ctest/README.md')), msg='Missing submodule checkout')
1196 self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/c-shared/testtools/umock-c/deps/testrunner/readme.md')), msg='Missing submodule checkout')
1197 self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/utpm/README.md')), msg='Missing submodule checkout')
1198 self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/utpm/deps/c-utility/README.md')), msg='Missing submodule checkout')
1199 self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/utpm/deps/c-utility/testtools/ctest/README.md')), msg='Missing submodule checkout')
1200 self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/utpm/deps/c-utility/testtools/testrunner/readme.md')), msg='Missing submodule checkout')
1201 self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/utpm/deps/c-utility/testtools/umock-c/readme.md')), msg='Missing submodule checkout')
1202 self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/utpm/deps/c-utility/testtools/umock-c/deps/ctest/README.md')), msg='Missing submodule checkout')
1203 self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/utpm/deps/c-utility/testtools/umock-c/deps/testrunner/readme.md')), msg='Missing submodule checkout')
1204
Patrick Williams92b42cb2022-09-03 06:53:57 -05001205 @skipIfNoNetwork()
1206 def test_git_submodule_reference_to_parent(self):
1207 self.recipe_url = "gitsm://github.com/gflags/gflags.git;protocol=https;branch=master"
1208 self.d.setVar("SRCREV", "14e1138441bbbb584160cb1c0a0426ec1bac35f1")
1209 with Timeout(60):
1210 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
1211 with self.assertRaises(bb.fetch2.FetchError):
1212 fetcher.download()
1213
Brad Bishop15ae2502019-06-18 21:44:24 -04001214class SVNTest(FetcherTest):
1215 def skipIfNoSvn():
1216 import shutil
1217 if not shutil.which("svn"):
1218 return unittest.skip("svn not installed, tests being skipped")
1219
1220 if not shutil.which("svnadmin"):
1221 return unittest.skip("svnadmin not installed, tests being skipped")
1222
1223 return lambda f: f
1224
1225 @skipIfNoSvn()
1226 def setUp(self):
1227 """ Create a local repository """
1228
1229 super(SVNTest, self).setUp()
1230
1231 # Create something we can fetch
1232 src_dir = tempfile.mkdtemp(dir=self.tempdir,
1233 prefix='svnfetch_srcdir_')
1234 src_dir = os.path.abspath(src_dir)
1235 bb.process.run("echo readme > README.md", cwd=src_dir)
1236
1237 # Store it in a local SVN repository
1238 repo_dir = tempfile.mkdtemp(dir=self.tempdir,
1239 prefix='svnfetch_localrepo_')
1240 repo_dir = os.path.abspath(repo_dir)
1241 bb.process.run("svnadmin create project", cwd=repo_dir)
1242
1243 self.repo_url = "file://%s/project" % repo_dir
1244 bb.process.run("svn import --non-interactive -m 'Initial import' %s %s/trunk" % (src_dir, self.repo_url),
1245 cwd=repo_dir)
1246
1247 bb.process.run("svn co %s svnfetch_co" % self.repo_url, cwd=self.tempdir)
1248 # Github will emulate SVN. Use this to check if we're downloding...
Andrew Geissler595f6302022-01-24 19:11:47 +00001249 bb.process.run("svn propset svn:externals 'bitbake https://github.com/PhilipHazel/pcre2.git' .",
Brad Bishop15ae2502019-06-18 21:44:24 -04001250 cwd=os.path.join(self.tempdir, 'svnfetch_co', 'trunk'))
1251 bb.process.run("svn commit --non-interactive -m 'Add external'",
1252 cwd=os.path.join(self.tempdir, 'svnfetch_co', 'trunk'))
1253
1254 self.src_dir = src_dir
1255 self.repo_dir = repo_dir
1256
1257 @skipIfNoSvn()
1258 def tearDown(self):
1259 os.chdir(self.origdir)
1260 if os.environ.get("BB_TMPDIR_NOCLEAN") == "yes":
1261 print("Not cleaning up %s. Please remove manually." % self.tempdir)
1262 else:
1263 bb.utils.prunedir(self.tempdir)
1264
1265 @skipIfNoSvn()
1266 @skipIfNoNetwork()
1267 def test_noexternal_svn(self):
1268 # Always match the rev count from setUp (currently rev 2)
1269 url = "svn://%s;module=trunk;protocol=file;rev=2" % self.repo_url.replace('file://', '')
1270 fetcher = bb.fetch.Fetch([url], self.d)
1271 fetcher.download()
1272 os.chdir(os.path.dirname(self.unpackdir))
1273 fetcher.unpack(self.unpackdir)
1274
1275 self.assertTrue(os.path.exists(os.path.join(self.unpackdir, 'trunk')), msg="Missing trunk")
1276 self.assertTrue(os.path.exists(os.path.join(self.unpackdir, 'trunk', 'README.md')), msg="Missing contents")
1277 self.assertFalse(os.path.exists(os.path.join(self.unpackdir, 'trunk/bitbake/trunk')), msg="External dir should NOT exist")
1278 self.assertFalse(os.path.exists(os.path.join(self.unpackdir, 'trunk/bitbake/trunk', 'README')), msg="External README should NOT exit")
1279
1280 @skipIfNoSvn()
1281 def test_external_svn(self):
1282 # Always match the rev count from setUp (currently rev 2)
1283 url = "svn://%s;module=trunk;protocol=file;externals=allowed;rev=2" % self.repo_url.replace('file://', '')
1284 fetcher = bb.fetch.Fetch([url], self.d)
1285 fetcher.download()
1286 os.chdir(os.path.dirname(self.unpackdir))
1287 fetcher.unpack(self.unpackdir)
1288
1289 self.assertTrue(os.path.exists(os.path.join(self.unpackdir, 'trunk')), msg="Missing trunk")
1290 self.assertTrue(os.path.exists(os.path.join(self.unpackdir, 'trunk', 'README.md')), msg="Missing contents")
1291 self.assertTrue(os.path.exists(os.path.join(self.unpackdir, 'trunk/bitbake/trunk')), msg="External dir should exist")
1292 self.assertTrue(os.path.exists(os.path.join(self.unpackdir, 'trunk/bitbake/trunk', 'README')), msg="External README should exit")
1293
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001294class TrustedNetworksTest(FetcherTest):
1295 def test_trusted_network(self):
1296 # Ensure trusted_network returns False when the host IS in the list.
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001297 url = "git://Someserver.org/foo;rev=1;branch=master"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001298 self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org someserver.org server2.org server3.org")
1299 self.assertTrue(bb.fetch.trusted_network(self.d, url))
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001300
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001301 def test_wild_trusted_network(self):
1302 # Ensure trusted_network returns true when the *.host IS in the list.
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001303 url = "git://Someserver.org/foo;rev=1;branch=master"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001304 self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org *.someserver.org server2.org server3.org")
1305 self.assertTrue(bb.fetch.trusted_network(self.d, url))
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001306
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001307 def test_prefix_wild_trusted_network(self):
1308 # Ensure trusted_network returns true when the prefix matches *.host.
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001309 url = "git://git.Someserver.org/foo;rev=1;branch=master"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001310 self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org *.someserver.org server2.org server3.org")
1311 self.assertTrue(bb.fetch.trusted_network(self.d, url))
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001312
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001313 def test_two_prefix_wild_trusted_network(self):
1314 # Ensure trusted_network returns true when the prefix matches *.host.
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001315 url = "git://something.git.Someserver.org/foo;rev=1;branch=master"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001316 self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org *.someserver.org server2.org server3.org")
1317 self.assertTrue(bb.fetch.trusted_network(self.d, url))
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001318
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001319 def test_port_trusted_network(self):
1320 # Ensure trusted_network returns True, even if the url specifies a port.
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001321 url = "git://someserver.org:8080/foo;rev=1;branch=master"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001322 self.d.setVar("BB_ALLOWED_NETWORKS", "someserver.org")
1323 self.assertTrue(bb.fetch.trusted_network(self.d, url))
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001324
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001325 def test_untrusted_network(self):
1326 # Ensure trusted_network returns False when the host is NOT in the list.
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001327 url = "git://someserver.org/foo;rev=1;branch=master"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001328 self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org server2.org server3.org")
1329 self.assertFalse(bb.fetch.trusted_network(self.d, url))
1330
1331 def test_wild_untrusted_network(self):
1332 # Ensure trusted_network returns False when the host is NOT in the list.
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001333 url = "git://*.someserver.org/foo;rev=1;branch=master"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001334 self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org server2.org server3.org")
1335 self.assertFalse(bb.fetch.trusted_network(self.d, url))
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001336
1337class URLHandle(unittest.TestCase):
1338
1339 datatable = {
1340 "http://www.google.com/index.html" : ('http', 'www.google.com', '/index.html', '', '', {}),
1341 "cvs://anoncvs@cvs.handhelds.org/cvs;module=familiar/dist/ipkg" : ('cvs', 'cvs.handhelds.org', '/cvs', 'anoncvs', '', {'module': 'familiar/dist/ipkg'}),
Patrick Williamsc0f7c042017-02-23 20:41:17 -06001342 "cvs://anoncvs:anonymous@cvs.handhelds.org/cvs;tag=V0-99-81;module=familiar/dist/ipkg" : ('cvs', 'cvs.handhelds.org', '/cvs', 'anoncvs', 'anonymous', collections.OrderedDict([('tag', 'V0-99-81'), ('module', 'familiar/dist/ipkg')])),
Andrew Geissler028142b2023-05-05 11:29:21 -05001343 "git://git.openembedded.org/bitbake;branch=@foo;protocol=https" : ('git', 'git.openembedded.org', '/bitbake', '', '', {'branch': '@foo', 'protocol' : 'https'}),
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001344 "file://somelocation;someparam=1": ('file', '', 'somelocation', '', '', {'someparam': '1'}),
Patrick Williams2a254922023-08-11 09:48:11 -05001345 "https://somesite.com/somerepo.git;user=anyUser:idtoken=1234" : ('https', 'somesite.com', '/somerepo.git', '', '', {'user': 'anyUser:idtoken=1234'}),
Andrew Geissler028142b2023-05-05 11:29:21 -05001346 r'git://s.o-me_ONE:!#$%^&*()-_={}[]\|:?,.<>~`@git.openembedded.org/bitbake;branch=main;protocol=https': ('git', 'git.openembedded.org', '/bitbake', 's.o-me_ONE', r'!#$%^&*()-_={}[]\|:?,.<>~`', {'branch': 'main', 'protocol' : 'https'}),
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001347 }
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001348 # we require a pathname to encodeurl but users can still pass such urls to
1349 # decodeurl and we need to handle them
1350 decodedata = datatable.copy()
1351 decodedata.update({
Brad Bishop1a4b7ee2018-12-16 17:11:34 -08001352 "http://somesite.net;someparam=1": ('http', 'somesite.net', '/', '', '', {'someparam': '1'}),
Patrick Williams2390b1b2022-11-03 13:47:49 -05001353 "npmsw://some.registry.url;package=@pkg;version=latest": ('npmsw', 'some.registry.url', '/', '', '', {'package': '@pkg', 'version': 'latest'}),
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001354 })
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001355
1356 def test_decodeurl(self):
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001357 for k, v in self.decodedata.items():
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001358 result = bb.fetch.decodeurl(k)
1359 self.assertEqual(result, v)
1360
1361 def test_encodeurl(self):
1362 for k, v in self.datatable.items():
1363 result = bb.fetch.encodeurl(v)
1364 self.assertEqual(result, k)
1365
1366class FetchLatestVersionTest(FetcherTest):
1367
1368 test_git_uris = {
1369 # version pattern "X.Y.Z"
Andrew Geissler595f6302022-01-24 19:11:47 +00001370 ("mx-1.0", "git://github.com/clutter-project/mx.git;branch=mx-1.4;protocol=https", "9b1db6b8060bd00b121a692f942404a24ae2960f", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001371 : "1.99.4",
1372 # version pattern "vX.Y"
Andrew Geisslerd25ed322020-06-27 00:28:28 -05001373 # mirror of git.infradead.org since network issues interfered with testing
Andrew Geissler028142b2023-05-05 11:29:21 -05001374 ("mtd-utils", "git://git.yoctoproject.org/mtd-utils.git;branch=master;protocol=https", "ca39eb1d98e736109c64ff9c1aa2a6ecca222d8f", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001375 : "1.5.0",
1376 # version pattern "pkg_name-X.Y"
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001377 # mirror of git://anongit.freedesktop.org/git/xorg/proto/presentproto since network issues interfered with testing
Andrew Geissler028142b2023-05-05 11:29:21 -05001378 ("presentproto", "git://git.yoctoproject.org/bbfetchtests-presentproto;branch=master;protocol=https", "24f3a56e541b0a9e6c6ee76081f441221a120ef9", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001379 : "1.0",
1380 # version pattern "pkg_name-vX.Y.Z"
Andrew Geissler028142b2023-05-05 11:29:21 -05001381 ("dtc", "git://git.yoctoproject.org/bbfetchtests-dtc.git;branch=master;protocol=https", "65cc4d2748a2c2e6f27f1cf39e07a5dbabd80ebf", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001382 : "1.4.0",
1383 # combination version pattern
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001384 ("sysprof", "git://gitlab.gnome.org/GNOME/sysprof.git;protocol=https;branch=master", "cd44ee6644c3641507fb53b8a2a69137f2971219", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001385 : "1.2.0",
1386 ("u-boot-mkimage", "git://git.denx.de/u-boot.git;branch=master;protocol=git", "62c175fbb8a0f9a926c88294ea9f7e88eb898f6c", "")
1387 : "2014.01",
1388 # version pattern "yyyymmdd"
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001389 ("mobile-broadband-provider-info", "git://gitlab.gnome.org/GNOME/mobile-broadband-provider-info.git;protocol=https;branch=master", "4ed19e11c2975105b71b956440acdb25d46a347d", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001390 : "20120614",
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001391 # packages with a valid UPSTREAM_CHECK_GITTAGREGEX
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001392 # mirror of git://anongit.freedesktop.org/xorg/driver/xf86-video-omap since network issues interfered with testing
Andrew Geissler028142b2023-05-05 11:29:21 -05001393 ("xf86-video-omap", "git://git.yoctoproject.org/bbfetchtests-xf86-video-omap;branch=master;protocol=https", "ae0394e687f1a77e966cf72f895da91840dffb8f", r"(?P<pver>(\d+\.(\d\.?)*))")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001394 : "0.4.3",
Andrew Geissler028142b2023-05-05 11:29:21 -05001395 ("build-appliance-image", "git://git.yoctoproject.org/poky;branch=master;protocol=https", "b37dd451a52622d5b570183a81583cc34c2ff555", r"(?P<pver>(([0-9][\.|_]?)+[0-9]))")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001396 : "11.0.0",
Andrew Geissler595f6302022-01-24 19:11:47 +00001397 ("chkconfig-alternatives-native", "git://github.com/kergoth/chkconfig;branch=sysroot;protocol=https", "cd437ecbd8986c894442f8fce1e0061e20f04dee", r"chkconfig\-(?P<pver>((\d+[\.\-_]*)+))")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001398 : "1.3.59",
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001399 ("remake", "git://github.com/rocky/remake.git;protocol=https;branch=master", "f05508e521987c8494c92d9c2871aec46307d51d", r"(?P<pver>(\d+\.(\d+\.)*\d*(\+dbg\d+(\.\d+)*)*))")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001400 : "3.82+dbg0.9",
1401 }
1402
1403 test_wget_uris = {
Andrew Geissler82c905d2020-04-13 13:39:40 -05001404 #
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001405 # packages with versions inside directory name
Andrew Geissler82c905d2020-04-13 13:39:40 -05001406 #
1407 # http://kernel.org/pub/linux/utils/util-linux/v2.23/util-linux-2.24.2.tar.bz2
1408 ("util-linux", "/pub/linux/utils/util-linux/v2.23/util-linux-2.24.2.tar.bz2", "", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001409 : "2.24.2",
Andrew Geissler82c905d2020-04-13 13:39:40 -05001410 # http://www.abisource.com/downloads/enchant/1.6.0/enchant-1.6.0.tar.gz
1411 ("enchant", "/downloads/enchant/1.6.0/enchant-1.6.0.tar.gz", "", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001412 : "1.6.0",
Andrew Geissler82c905d2020-04-13 13:39:40 -05001413 # http://www.cmake.org/files/v2.8/cmake-2.8.12.1.tar.gz
1414 ("cmake", "/files/v2.8/cmake-2.8.12.1.tar.gz", "", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001415 : "2.8.12.1",
Andrew Geissler517393d2023-01-13 08:55:19 -06001416 # https://download.gnome.org/sources/libxml2/2.9/libxml2-2.9.14.tar.xz
1417 ("libxml2", "/software/libxml2/2.9/libxml2-2.9.14.tar.xz", "", "")
1418 : "2.10.3",
Andrew Geissler82c905d2020-04-13 13:39:40 -05001419 #
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001420 # packages with versions only in current directory
Andrew Geissler82c905d2020-04-13 13:39:40 -05001421 #
Andrew Geisslereff27472021-10-29 15:35:00 -05001422 # https://downloads.yoctoproject.org/releases/eglibc/eglibc-2.18-svnr23787.tar.bz2
Andrew Geissler82c905d2020-04-13 13:39:40 -05001423 ("eglic", "/releases/eglibc/eglibc-2.18-svnr23787.tar.bz2", "", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001424 : "2.19",
Andrew Geisslereff27472021-10-29 15:35:00 -05001425 # https://downloads.yoctoproject.org/releases/gnu-config/gnu-config-20120814.tar.bz2
Andrew Geissler82c905d2020-04-13 13:39:40 -05001426 ("gnu-config", "/releases/gnu-config/gnu-config-20120814.tar.bz2", "", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001427 : "20120814",
Andrew Geissler82c905d2020-04-13 13:39:40 -05001428 #
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001429 # packages with "99" in the name of possible version
Andrew Geissler82c905d2020-04-13 13:39:40 -05001430 #
1431 # http://freedesktop.org/software/pulseaudio/releases/pulseaudio-4.0.tar.xz
1432 ("pulseaudio", "/software/pulseaudio/releases/pulseaudio-4.0.tar.xz", "", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001433 : "5.0",
Andrew Geissler82c905d2020-04-13 13:39:40 -05001434 # http://xorg.freedesktop.org/releases/individual/xserver/xorg-server-1.15.1.tar.bz2
1435 ("xserver-xorg", "/releases/individual/xserver/xorg-server-1.15.1.tar.bz2", "", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001436 : "1.15.1",
Andrew Geissler82c905d2020-04-13 13:39:40 -05001437 #
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001438 # packages with valid UPSTREAM_CHECK_URI and UPSTREAM_CHECK_REGEX
Andrew Geissler82c905d2020-04-13 13:39:40 -05001439 #
1440 # http://www.cups.org/software/1.7.2/cups-1.7.2-source.tar.bz2
1441 # https://github.com/apple/cups/releases
Andrew Geissler5199d832021-09-24 16:47:35 -05001442 ("cups", "/software/1.7.2/cups-1.7.2-source.tar.bz2", "/apple/cups/releases", r"(?P<name>cups\-)(?P<pver>((\d+[\.\-_]*)+))\-source\.tar\.gz")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001443 : "2.0.0",
Andrew Geissler82c905d2020-04-13 13:39:40 -05001444 # http://download.oracle.com/berkeley-db/db-5.3.21.tar.gz
1445 # http://ftp.debian.org/debian/pool/main/d/db5.3/
Andrew Geissler5199d832021-09-24 16:47:35 -05001446 ("db", "/berkeley-db/db-5.3.21.tar.gz", "/debian/pool/main/d/db5.3/", r"(?P<name>db5\.3_)(?P<pver>\d+(\.\d+)+).+\.orig\.tar\.xz")
Brad Bishop79641f22019-09-10 07:20:22 -04001447 : "5.3.10",
Andrew Geissler595f6302022-01-24 19:11:47 +00001448 #
1449 # packages where the tarball compression changed in the new version
1450 #
1451 # http://ftp.debian.org/debian/pool/main/m/minicom/minicom_2.7.1.orig.tar.gz
1452 ("minicom", "/debian/pool/main/m/minicom/minicom_2.7.1.orig.tar.gz", "", "")
1453 : "2.8",
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001454 }
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001455
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001456 @skipIfNoNetwork()
1457 def test_git_latest_versionstring(self):
1458 for k, v in self.test_git_uris.items():
1459 self.d.setVar("PN", k[0])
1460 self.d.setVar("SRCREV", k[2])
1461 self.d.setVar("UPSTREAM_CHECK_GITTAGREGEX", k[3])
1462 ud = bb.fetch2.FetchData(k[1], self.d)
1463 pupver= ud.method.latest_versionstring(ud, self.d)
1464 verstring = pupver[0]
Brad Bishop316dfdd2018-06-25 12:45:53 -04001465 self.assertTrue(verstring, msg="Could not find upstream version for %s" % k[0])
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001466 r = bb.utils.vercmp_string(v, verstring)
1467 self.assertTrue(r == -1 or r == 0, msg="Package %s, version: %s <= %s" % (k[0], v, verstring))
1468
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001469 def test_wget_latest_versionstring(self):
Andrew Geissler82c905d2020-04-13 13:39:40 -05001470 testdata = os.path.dirname(os.path.abspath(__file__)) + "/fetch-testdata"
1471 server = HTTPService(testdata)
1472 server.start()
1473 port = server.port
1474 try:
1475 for k, v in self.test_wget_uris.items():
1476 self.d.setVar("PN", k[0])
1477 checkuri = ""
1478 if k[2]:
1479 checkuri = "http://localhost:%s/" % port + k[2]
1480 self.d.setVar("UPSTREAM_CHECK_URI", checkuri)
1481 self.d.setVar("UPSTREAM_CHECK_REGEX", k[3])
1482 url = "http://localhost:%s/" % port + k[1]
1483 ud = bb.fetch2.FetchData(url, self.d)
1484 pupver = ud.method.latest_versionstring(ud, self.d)
1485 verstring = pupver[0]
1486 self.assertTrue(verstring, msg="Could not find upstream version for %s" % k[0])
1487 r = bb.utils.vercmp_string(v, verstring)
1488 self.assertTrue(r == -1 or r == 0, msg="Package %s, version: %s <= %s" % (k[0], v, verstring))
1489 finally:
1490 server.stop()
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001491
1492
1493class FetchCheckStatusTest(FetcherTest):
Andrew Geisslereff27472021-10-29 15:35:00 -05001494 test_wget_uris = ["https://downloads.yoctoproject.org/releases/sato/sato-engine-0.1.tar.gz",
1495 "https://downloads.yoctoproject.org/releases/sato/sato-engine-0.2.tar.gz",
1496 "https://downloads.yoctoproject.org/releases/sato/sato-engine-0.3.tar.gz",
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001497 "https://yoctoproject.org/",
Andrew Geissler95ac1b82021-03-31 14:34:31 -05001498 "https://docs.yoctoproject.org",
Andrew Geisslereff27472021-10-29 15:35:00 -05001499 "https://downloads.yoctoproject.org/releases/opkg/opkg-0.1.7.tar.gz",
1500 "https://downloads.yoctoproject.org/releases/opkg/opkg-0.3.0.tar.gz",
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001501 "ftp://sourceware.org/pub/libffi/libffi-1.20.tar.gz",
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001502 # GitHub releases are hosted on Amazon S3, which doesn't support HEAD
1503 "https://github.com/kergoth/tslib/releases/download/1.1/tslib-1.1.tar.xz"
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001504 ]
1505
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001506 @skipIfNoNetwork()
1507 def test_wget_checkstatus(self):
1508 fetch = bb.fetch2.Fetch(self.test_wget_uris, self.d)
1509 for u in self.test_wget_uris:
1510 with self.subTest(url=u):
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001511 ud = fetch.ud[u]
1512 m = ud.method
1513 ret = m.checkstatus(fetch, ud, self.d)
1514 self.assertTrue(ret, msg="URI %s, can't check status" % (u))
1515
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001516 @skipIfNoNetwork()
1517 def test_wget_checkstatus_connection_cache(self):
1518 from bb.fetch2 import FetchConnectionCache
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001519
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001520 connection_cache = FetchConnectionCache()
1521 fetch = bb.fetch2.Fetch(self.test_wget_uris, self.d,
1522 connection_cache = connection_cache)
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001523
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001524 for u in self.test_wget_uris:
1525 with self.subTest(url=u):
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001526 ud = fetch.ud[u]
1527 m = ud.method
1528 ret = m.checkstatus(fetch, ud, self.d)
1529 self.assertTrue(ret, msg="URI %s, can't check status" % (u))
1530
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001531 connection_cache.close_connections()
1532
1533
1534class GitMakeShallowTest(FetcherTest):
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001535 def setUp(self):
1536 FetcherTest.setUp(self)
1537 self.gitdir = os.path.join(self.tempdir, 'gitshallow')
1538 bb.utils.mkdirhier(self.gitdir)
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001539 self.git_init()
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001540
1541 def assertRefs(self, expected_refs):
1542 actual_refs = self.git(['for-each-ref', '--format=%(refname)']).splitlines()
1543 full_expected = self.git(['rev-parse', '--symbolic-full-name'] + expected_refs).splitlines()
1544 self.assertEqual(sorted(full_expected), sorted(actual_refs))
1545
1546 def assertRevCount(self, expected_count, args=None):
1547 if args is None:
1548 args = ['HEAD']
1549 revs = self.git(['rev-list'] + args)
1550 actual_count = len(revs.splitlines())
1551 self.assertEqual(expected_count, actual_count, msg='Object count `%d` is not the expected `%d`' % (actual_count, expected_count))
1552
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001553 def make_shallow(self, args=None):
1554 if args is None:
1555 args = ['HEAD']
Brad Bishop316dfdd2018-06-25 12:45:53 -04001556 return bb.process.run([bb.fetch2.git.Git.make_shallow_path] + args, cwd=self.gitdir)
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001557
1558 def add_empty_file(self, path, msg=None):
1559 if msg is None:
1560 msg = path
1561 open(os.path.join(self.gitdir, path), 'w').close()
1562 self.git(['add', path])
1563 self.git(['commit', '-m', msg, path])
1564
1565 def test_make_shallow_single_branch_no_merge(self):
1566 self.add_empty_file('a')
1567 self.add_empty_file('b')
1568 self.assertRevCount(2)
1569 self.make_shallow()
1570 self.assertRevCount(1)
1571
1572 def test_make_shallow_single_branch_one_merge(self):
1573 self.add_empty_file('a')
1574 self.add_empty_file('b')
1575 self.git('checkout -b a_branch')
1576 self.add_empty_file('c')
1577 self.git('checkout master')
1578 self.add_empty_file('d')
1579 self.git('merge --no-ff --no-edit a_branch')
1580 self.git('branch -d a_branch')
1581 self.add_empty_file('e')
1582 self.assertRevCount(6)
1583 self.make_shallow(['HEAD~2'])
1584 self.assertRevCount(5)
1585
1586 def test_make_shallow_at_merge(self):
1587 self.add_empty_file('a')
1588 self.git('checkout -b a_branch')
1589 self.add_empty_file('b')
1590 self.git('checkout master')
1591 self.git('merge --no-ff --no-edit a_branch')
1592 self.git('branch -d a_branch')
1593 self.assertRevCount(3)
1594 self.make_shallow()
1595 self.assertRevCount(1)
1596
1597 def test_make_shallow_annotated_tag(self):
1598 self.add_empty_file('a')
1599 self.add_empty_file('b')
1600 self.git('tag -a -m a_tag a_tag')
1601 self.assertRevCount(2)
1602 self.make_shallow(['a_tag'])
1603 self.assertRevCount(1)
1604
1605 def test_make_shallow_multi_ref(self):
1606 self.add_empty_file('a')
1607 self.add_empty_file('b')
1608 self.git('checkout -b a_branch')
1609 self.add_empty_file('c')
1610 self.git('checkout master')
1611 self.add_empty_file('d')
1612 self.git('checkout -b a_branch_2')
1613 self.add_empty_file('a_tag')
1614 self.git('tag a_tag')
1615 self.git('checkout master')
1616 self.git('branch -D a_branch_2')
1617 self.add_empty_file('e')
1618 self.assertRevCount(6, ['--all'])
1619 self.make_shallow()
1620 self.assertRevCount(5, ['--all'])
1621
1622 def test_make_shallow_multi_ref_trim(self):
1623 self.add_empty_file('a')
1624 self.git('checkout -b a_branch')
1625 self.add_empty_file('c')
1626 self.git('checkout master')
1627 self.assertRevCount(1)
1628 self.assertRevCount(2, ['--all'])
1629 self.assertRefs(['master', 'a_branch'])
1630 self.make_shallow(['-r', 'master', 'HEAD'])
1631 self.assertRevCount(1, ['--all'])
1632 self.assertRefs(['master'])
1633
1634 def test_make_shallow_noop(self):
1635 self.add_empty_file('a')
1636 self.assertRevCount(1)
1637 self.make_shallow()
1638 self.assertRevCount(1)
1639
1640 @skipIfNoNetwork()
1641 def test_make_shallow_bitbake(self):
1642 self.git('remote add origin https://github.com/openembedded/bitbake')
1643 self.git('fetch --tags origin')
1644 orig_revs = len(self.git('rev-list --all').splitlines())
1645 self.make_shallow(['refs/tags/1.10.0'])
1646 self.assertRevCount(orig_revs - 1746, ['--all'])
1647
1648class GitShallowTest(FetcherTest):
1649 def setUp(self):
1650 FetcherTest.setUp(self)
1651 self.gitdir = os.path.join(self.tempdir, 'git')
1652 self.srcdir = os.path.join(self.tempdir, 'gitsource')
1653
1654 bb.utils.mkdirhier(self.srcdir)
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001655 self.git_init(cwd=self.srcdir)
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001656 self.d.setVar('WORKDIR', self.tempdir)
1657 self.d.setVar('S', self.gitdir)
1658 self.d.delVar('PREMIRRORS')
1659 self.d.delVar('MIRRORS')
1660
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001661 uri = 'git://%s;protocol=file;subdir=${S};branch=master' % self.srcdir
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001662 self.d.setVar('SRC_URI', uri)
1663 self.d.setVar('SRCREV', '${AUTOREV}')
1664 self.d.setVar('AUTOREV', '${@bb.fetch2.get_autorev(d)}')
1665
1666 self.d.setVar('BB_GIT_SHALLOW', '1')
1667 self.d.setVar('BB_GENERATE_MIRROR_TARBALLS', '0')
1668 self.d.setVar('BB_GENERATE_SHALLOW_TARBALLS', '1')
Andrew Geisslerfc113ea2023-03-31 09:59:46 -05001669 self.d.setVar("__BBSRCREV_SEEN", "1")
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001670
1671 def assertRefs(self, expected_refs, cwd=None):
1672 if cwd is None:
1673 cwd = self.gitdir
1674 actual_refs = self.git(['for-each-ref', '--format=%(refname)'], cwd=cwd).splitlines()
1675 full_expected = self.git(['rev-parse', '--symbolic-full-name'] + expected_refs, cwd=cwd).splitlines()
1676 self.assertEqual(sorted(set(full_expected)), sorted(set(actual_refs)))
1677
1678 def assertRevCount(self, expected_count, args=None, cwd=None):
1679 if args is None:
1680 args = ['HEAD']
1681 if cwd is None:
1682 cwd = self.gitdir
1683 revs = self.git(['rev-list'] + args, cwd=cwd)
1684 actual_count = len(revs.splitlines())
1685 self.assertEqual(expected_count, actual_count, msg='Object count `%d` is not the expected `%d`' % (actual_count, expected_count))
1686
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001687 def add_empty_file(self, path, cwd=None, msg=None):
1688 if msg is None:
1689 msg = path
1690 if cwd is None:
1691 cwd = self.srcdir
1692 open(os.path.join(cwd, path), 'w').close()
1693 self.git(['add', path], cwd)
1694 self.git(['commit', '-m', msg, path], cwd)
1695
1696 def fetch(self, uri=None):
1697 if uri is None:
Brad Bishop19323692019-04-05 15:28:33 -04001698 uris = self.d.getVar('SRC_URI').split()
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001699 uri = uris[0]
1700 d = self.d
1701 else:
1702 d = self.d.createCopy()
1703 d.setVar('SRC_URI', uri)
1704 uri = d.expand(uri)
1705 uris = [uri]
1706
1707 fetcher = bb.fetch2.Fetch(uris, d)
1708 fetcher.download()
1709 ud = fetcher.ud[uri]
1710 return fetcher, ud
1711
1712 def fetch_and_unpack(self, uri=None):
1713 fetcher, ud = self.fetch(uri)
1714 fetcher.unpack(self.d.getVar('WORKDIR'))
1715 assert os.path.exists(self.d.getVar('S'))
1716 return fetcher, ud
1717
1718 def fetch_shallow(self, uri=None, disabled=False, keepclone=False):
1719 """Fetch a uri, generating a shallow tarball, then unpack using it"""
1720 fetcher, ud = self.fetch_and_unpack(uri)
1721 assert os.path.exists(ud.clonedir), 'Git clone in DLDIR (%s) does not exist for uri %s' % (ud.clonedir, uri)
1722
1723 # Confirm that the unpacked repo is unshallow
1724 if not disabled:
1725 assert os.path.exists(os.path.join(self.dldir, ud.mirrortarballs[0]))
1726
1727 # fetch and unpack, from the shallow tarball
1728 bb.utils.remove(self.gitdir, recurse=True)
Andrew Geisslerc926e172021-05-07 16:11:35 -05001729 bb.process.run('chmod u+w -R "%s"' % ud.clonedir)
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001730 bb.utils.remove(ud.clonedir, recurse=True)
Brad Bishopf8caae32019-03-25 13:13:56 -04001731 bb.utils.remove(ud.clonedir.replace('gitsource', 'gitsubmodule'), recurse=True)
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001732
1733 # confirm that the unpacked repo is used when no git clone or git
1734 # mirror tarball is available
1735 fetcher, ud = self.fetch_and_unpack(uri)
1736 if not disabled:
1737 assert os.path.exists(os.path.join(self.gitdir, '.git', 'shallow')), 'Unpacked git repository at %s is not shallow' % self.gitdir
1738 else:
1739 assert not os.path.exists(os.path.join(self.gitdir, '.git', 'shallow')), 'Unpacked git repository at %s is shallow' % self.gitdir
1740 return fetcher, ud
1741
1742 def test_shallow_disabled(self):
1743 self.add_empty_file('a')
1744 self.add_empty_file('b')
1745 self.assertRevCount(2, cwd=self.srcdir)
1746
1747 self.d.setVar('BB_GIT_SHALLOW', '0')
1748 self.fetch_shallow(disabled=True)
1749 self.assertRevCount(2)
1750
1751 def test_shallow_nobranch(self):
1752 self.add_empty_file('a')
1753 self.add_empty_file('b')
1754 self.assertRevCount(2, cwd=self.srcdir)
1755
1756 srcrev = self.git('rev-parse HEAD', cwd=self.srcdir).strip()
1757 self.d.setVar('SRCREV', srcrev)
Brad Bishop19323692019-04-05 15:28:33 -04001758 uri = self.d.getVar('SRC_URI').split()[0]
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001759 uri = '%s;nobranch=1;bare=1' % uri
1760
1761 self.fetch_shallow(uri)
1762 self.assertRevCount(1)
1763
1764 # shallow refs are used to ensure the srcrev sticks around when we
1765 # have no other branches referencing it
1766 self.assertRefs(['refs/shallow/default'])
1767
1768 def test_shallow_default_depth_1(self):
1769 # Create initial git repo
1770 self.add_empty_file('a')
1771 self.add_empty_file('b')
1772 self.assertRevCount(2, cwd=self.srcdir)
1773
1774 self.fetch_shallow()
1775 self.assertRevCount(1)
1776
1777 def test_shallow_depth_0_disables(self):
1778 self.add_empty_file('a')
1779 self.add_empty_file('b')
1780 self.assertRevCount(2, cwd=self.srcdir)
1781
1782 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
1783 self.fetch_shallow(disabled=True)
1784 self.assertRevCount(2)
1785
1786 def test_shallow_depth_default_override(self):
1787 self.add_empty_file('a')
1788 self.add_empty_file('b')
1789 self.assertRevCount(2, cwd=self.srcdir)
1790
1791 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '2')
1792 self.d.setVar('BB_GIT_SHALLOW_DEPTH_default', '1')
1793 self.fetch_shallow()
1794 self.assertRevCount(1)
1795
1796 def test_shallow_depth_default_override_disable(self):
1797 self.add_empty_file('a')
1798 self.add_empty_file('b')
1799 self.add_empty_file('c')
1800 self.assertRevCount(3, cwd=self.srcdir)
1801
1802 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
1803 self.d.setVar('BB_GIT_SHALLOW_DEPTH_default', '2')
1804 self.fetch_shallow()
1805 self.assertRevCount(2)
1806
1807 def test_current_shallow_out_of_date_clone(self):
1808 # Create initial git repo
1809 self.add_empty_file('a')
1810 self.add_empty_file('b')
1811 self.add_empty_file('c')
1812 self.assertRevCount(3, cwd=self.srcdir)
1813
1814 # Clone and generate mirror tarball
1815 fetcher, ud = self.fetch()
1816
1817 # Ensure we have a current mirror tarball, but an out of date clone
1818 self.git('update-ref refs/heads/master refs/heads/master~1', cwd=ud.clonedir)
1819 self.assertRevCount(2, cwd=ud.clonedir)
1820
1821 # Fetch and unpack, from the current tarball, not the out of date clone
1822 bb.utils.remove(self.gitdir, recurse=True)
1823 fetcher, ud = self.fetch()
1824 fetcher.unpack(self.d.getVar('WORKDIR'))
1825 self.assertRevCount(1)
1826
1827 def test_shallow_single_branch_no_merge(self):
1828 self.add_empty_file('a')
1829 self.add_empty_file('b')
1830 self.assertRevCount(2, cwd=self.srcdir)
1831
1832 self.fetch_shallow()
1833 self.assertRevCount(1)
1834 assert os.path.exists(os.path.join(self.gitdir, 'a'))
1835 assert os.path.exists(os.path.join(self.gitdir, 'b'))
1836
1837 def test_shallow_no_dangling(self):
1838 self.add_empty_file('a')
1839 self.add_empty_file('b')
1840 self.assertRevCount(2, cwd=self.srcdir)
1841
1842 self.fetch_shallow()
1843 self.assertRevCount(1)
1844 assert not self.git('fsck --dangling')
1845
1846 def test_shallow_srcrev_branch_truncation(self):
1847 self.add_empty_file('a')
1848 self.add_empty_file('b')
1849 b_commit = self.git('rev-parse HEAD', cwd=self.srcdir).rstrip()
1850 self.add_empty_file('c')
1851 self.assertRevCount(3, cwd=self.srcdir)
1852
1853 self.d.setVar('SRCREV', b_commit)
1854 self.fetch_shallow()
1855
1856 # The 'c' commit was removed entirely, and 'a' was removed from history
1857 self.assertRevCount(1, ['--all'])
1858 self.assertEqual(self.git('rev-parse HEAD').strip(), b_commit)
1859 assert os.path.exists(os.path.join(self.gitdir, 'a'))
1860 assert os.path.exists(os.path.join(self.gitdir, 'b'))
1861 assert not os.path.exists(os.path.join(self.gitdir, 'c'))
1862
1863 def test_shallow_ref_pruning(self):
1864 self.add_empty_file('a')
1865 self.add_empty_file('b')
1866 self.git('branch a_branch', cwd=self.srcdir)
1867 self.assertRefs(['master', 'a_branch'], cwd=self.srcdir)
1868 self.assertRevCount(2, cwd=self.srcdir)
1869
1870 self.fetch_shallow()
1871
1872 self.assertRefs(['master', 'origin/master'])
1873 self.assertRevCount(1)
1874
1875 def test_shallow_submodules(self):
1876 self.add_empty_file('a')
1877 self.add_empty_file('b')
1878
1879 smdir = os.path.join(self.tempdir, 'gitsubmodule')
1880 bb.utils.mkdirhier(smdir)
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001881 self.git_init(cwd=smdir)
Brad Bishop1a4b7ee2018-12-16 17:11:34 -08001882 # Make this look like it was cloned from a remote...
1883 self.git('config --add remote.origin.url "%s"' % smdir, cwd=smdir)
1884 self.git('config --add remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"', cwd=smdir)
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001885 self.add_empty_file('asub', cwd=smdir)
Brad Bishopf8caae32019-03-25 13:13:56 -04001886 self.add_empty_file('bsub', cwd=smdir)
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001887
1888 self.git('submodule init', cwd=self.srcdir)
Patrick Williams2390b1b2022-11-03 13:47:49 -05001889 self.git('-c protocol.file.allow=always submodule add file://%s' % smdir, cwd=self.srcdir)
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001890 self.git('submodule update', cwd=self.srcdir)
1891 self.git('commit -m submodule -a', cwd=self.srcdir)
1892
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001893 uri = 'gitsm://%s;protocol=file;subdir=${S};branch=master' % self.srcdir
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001894 fetcher, ud = self.fetch_shallow(uri)
1895
Brad Bishopf8caae32019-03-25 13:13:56 -04001896 # Verify the main repository is shallow
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001897 self.assertRevCount(1)
Brad Bishopf8caae32019-03-25 13:13:56 -04001898
1899 # Verify the gitsubmodule directory is present
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001900 assert os.listdir(os.path.join(self.gitdir, 'gitsubmodule'))
1901
Brad Bishopf8caae32019-03-25 13:13:56 -04001902 # Verify the submodule is also shallow
1903 self.assertRevCount(1, cwd=os.path.join(self.gitdir, 'gitsubmodule'))
1904
Andrew Geissler82c905d2020-04-13 13:39:40 -05001905 def test_shallow_submodule_mirrors(self):
1906 self.add_empty_file('a')
1907 self.add_empty_file('b')
1908
1909 smdir = os.path.join(self.tempdir, 'gitsubmodule')
1910 bb.utils.mkdirhier(smdir)
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001911 self.git_init(cwd=smdir)
Andrew Geissler82c905d2020-04-13 13:39:40 -05001912 # Make this look like it was cloned from a remote...
1913 self.git('config --add remote.origin.url "%s"' % smdir, cwd=smdir)
1914 self.git('config --add remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"', cwd=smdir)
1915 self.add_empty_file('asub', cwd=smdir)
1916 self.add_empty_file('bsub', cwd=smdir)
1917
1918 self.git('submodule init', cwd=self.srcdir)
Patrick Williams2390b1b2022-11-03 13:47:49 -05001919 self.git('-c protocol.file.allow=always submodule add file://%s' % smdir, cwd=self.srcdir)
Andrew Geissler82c905d2020-04-13 13:39:40 -05001920 self.git('submodule update', cwd=self.srcdir)
1921 self.git('commit -m submodule -a', cwd=self.srcdir)
1922
1923 uri = 'gitsm://%s;protocol=file;subdir=${S}' % self.srcdir
1924
1925 # Fetch once to generate the shallow tarball
1926 fetcher, ud = self.fetch(uri)
1927
1928 # Set up the mirror
1929 mirrordir = os.path.join(self.tempdir, 'mirror')
Andrew Geisslerc926e172021-05-07 16:11:35 -05001930 bb.utils.rename(self.dldir, mirrordir)
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001931 self.d.setVar('PREMIRRORS', 'gitsm://.*/.* file://%s/' % mirrordir)
Andrew Geissler82c905d2020-04-13 13:39:40 -05001932
1933 # Fetch from the mirror
1934 bb.utils.remove(self.dldir, recurse=True)
1935 bb.utils.remove(self.gitdir, recurse=True)
1936 self.fetch_and_unpack(uri)
1937
1938 # Verify the main repository is shallow
1939 self.assertRevCount(1)
1940
1941 # Verify the gitsubmodule directory is present
1942 assert os.listdir(os.path.join(self.gitdir, 'gitsubmodule'))
1943
1944 # Verify the submodule is also shallow
1945 self.assertRevCount(1, cwd=os.path.join(self.gitdir, 'gitsubmodule'))
Brad Bishopf8caae32019-03-25 13:13:56 -04001946
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001947 if any(os.path.exists(os.path.join(p, 'git-annex')) for p in os.environ.get('PATH').split(':')):
1948 def test_shallow_annex(self):
1949 self.add_empty_file('a')
1950 self.add_empty_file('b')
1951 self.git('annex init', cwd=self.srcdir)
1952 open(os.path.join(self.srcdir, 'c'), 'w').close()
1953 self.git('annex add c', cwd=self.srcdir)
Andrew Geisslerc926e172021-05-07 16:11:35 -05001954 self.git('commit --author "Foo Bar <foo@bar>" -m annex-c -a', cwd=self.srcdir)
1955 bb.process.run('chmod u+w -R %s' % self.srcdir)
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001956
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001957 uri = 'gitannex://%s;protocol=file;subdir=${S};branch=master' % self.srcdir
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001958 fetcher, ud = self.fetch_shallow(uri)
1959
1960 self.assertRevCount(1)
1961 assert './.git/annex/' in bb.process.run('tar -tzf %s' % os.path.join(self.dldir, ud.mirrortarballs[0]))[0]
1962 assert os.path.exists(os.path.join(self.gitdir, 'c'))
1963
1964 def test_shallow_multi_one_uri(self):
1965 # Create initial git repo
1966 self.add_empty_file('a')
1967 self.add_empty_file('b')
1968 self.git('checkout -b a_branch', cwd=self.srcdir)
1969 self.add_empty_file('c')
1970 self.add_empty_file('d')
1971 self.git('checkout master', cwd=self.srcdir)
1972 self.git('tag v0.0 a_branch', cwd=self.srcdir)
1973 self.add_empty_file('e')
1974 self.git('merge --no-ff --no-edit a_branch', cwd=self.srcdir)
1975 self.add_empty_file('f')
1976 self.assertRevCount(7, cwd=self.srcdir)
1977
Brad Bishop19323692019-04-05 15:28:33 -04001978 uri = self.d.getVar('SRC_URI').split()[0]
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001979 uri = '%s;branch=master,a_branch;name=master,a_branch' % uri
1980
1981 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
1982 self.d.setVar('BB_GIT_SHALLOW_REVS', 'v0.0')
1983 self.d.setVar('SRCREV_master', '${AUTOREV}')
1984 self.d.setVar('SRCREV_a_branch', '${AUTOREV}')
1985
1986 self.fetch_shallow(uri)
1987
1988 self.assertRevCount(5)
1989 self.assertRefs(['master', 'origin/master', 'origin/a_branch'])
1990
1991 def test_shallow_multi_one_uri_depths(self):
1992 # Create initial git repo
1993 self.add_empty_file('a')
1994 self.add_empty_file('b')
1995 self.git('checkout -b a_branch', cwd=self.srcdir)
1996 self.add_empty_file('c')
1997 self.add_empty_file('d')
1998 self.git('checkout master', cwd=self.srcdir)
1999 self.add_empty_file('e')
2000 self.git('merge --no-ff --no-edit a_branch', cwd=self.srcdir)
2001 self.add_empty_file('f')
2002 self.assertRevCount(7, cwd=self.srcdir)
2003
Brad Bishop19323692019-04-05 15:28:33 -04002004 uri = self.d.getVar('SRC_URI').split()[0]
Brad Bishopd7bf8c12018-02-25 22:55:05 -05002005 uri = '%s;branch=master,a_branch;name=master,a_branch' % uri
2006
2007 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
2008 self.d.setVar('BB_GIT_SHALLOW_DEPTH_master', '3')
2009 self.d.setVar('BB_GIT_SHALLOW_DEPTH_a_branch', '1')
2010 self.d.setVar('SRCREV_master', '${AUTOREV}')
2011 self.d.setVar('SRCREV_a_branch', '${AUTOREV}')
2012
2013 self.fetch_shallow(uri)
2014
2015 self.assertRevCount(4, ['--all'])
2016 self.assertRefs(['master', 'origin/master', 'origin/a_branch'])
2017
2018 def test_shallow_clone_preferred_over_shallow(self):
2019 self.add_empty_file('a')
2020 self.add_empty_file('b')
2021
2022 # Fetch once to generate the shallow tarball
2023 fetcher, ud = self.fetch()
2024 assert os.path.exists(os.path.join(self.dldir, ud.mirrortarballs[0]))
2025
2026 # Fetch and unpack with both the clonedir and shallow tarball available
2027 bb.utils.remove(self.gitdir, recurse=True)
2028 fetcher, ud = self.fetch_and_unpack()
2029
2030 # The unpacked tree should *not* be shallow
2031 self.assertRevCount(2)
2032 assert not os.path.exists(os.path.join(self.gitdir, '.git', 'shallow'))
2033
2034 def test_shallow_mirrors(self):
2035 self.add_empty_file('a')
2036 self.add_empty_file('b')
2037
2038 # Fetch once to generate the shallow tarball
2039 fetcher, ud = self.fetch()
2040 mirrortarball = ud.mirrortarballs[0]
2041 assert os.path.exists(os.path.join(self.dldir, mirrortarball))
2042
2043 # Set up the mirror
2044 mirrordir = os.path.join(self.tempdir, 'mirror')
2045 bb.utils.mkdirhier(mirrordir)
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002046 self.d.setVar('PREMIRRORS', 'git://.*/.* file://%s/' % mirrordir)
Brad Bishopd7bf8c12018-02-25 22:55:05 -05002047
Andrew Geisslerc926e172021-05-07 16:11:35 -05002048 bb.utils.rename(os.path.join(self.dldir, mirrortarball),
Brad Bishopd7bf8c12018-02-25 22:55:05 -05002049 os.path.join(mirrordir, mirrortarball))
2050
2051 # Fetch from the mirror
2052 bb.utils.remove(self.dldir, recurse=True)
2053 bb.utils.remove(self.gitdir, recurse=True)
2054 self.fetch_and_unpack()
2055 self.assertRevCount(1)
2056
2057 def test_shallow_invalid_depth(self):
2058 self.add_empty_file('a')
2059 self.add_empty_file('b')
2060
2061 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '-12')
2062 with self.assertRaises(bb.fetch2.FetchError):
2063 self.fetch()
2064
2065 def test_shallow_invalid_depth_default(self):
2066 self.add_empty_file('a')
2067 self.add_empty_file('b')
2068
2069 self.d.setVar('BB_GIT_SHALLOW_DEPTH_default', '-12')
2070 with self.assertRaises(bb.fetch2.FetchError):
2071 self.fetch()
2072
2073 def test_shallow_extra_refs(self):
2074 self.add_empty_file('a')
2075 self.add_empty_file('b')
2076 self.git('branch a_branch', cwd=self.srcdir)
2077 self.assertRefs(['master', 'a_branch'], cwd=self.srcdir)
2078 self.assertRevCount(2, cwd=self.srcdir)
2079
2080 self.d.setVar('BB_GIT_SHALLOW_EXTRA_REFS', 'refs/heads/a_branch')
2081 self.fetch_shallow()
2082
2083 self.assertRefs(['master', 'origin/master', 'origin/a_branch'])
2084 self.assertRevCount(1)
2085
2086 def test_shallow_extra_refs_wildcard(self):
2087 self.add_empty_file('a')
2088 self.add_empty_file('b')
2089 self.git('branch a_branch', cwd=self.srcdir)
2090 self.git('tag v1.0', cwd=self.srcdir)
2091 self.assertRefs(['master', 'a_branch', 'v1.0'], cwd=self.srcdir)
2092 self.assertRevCount(2, cwd=self.srcdir)
2093
2094 self.d.setVar('BB_GIT_SHALLOW_EXTRA_REFS', 'refs/tags/*')
2095 self.fetch_shallow()
2096
2097 self.assertRefs(['master', 'origin/master', 'v1.0'])
2098 self.assertRevCount(1)
2099
2100 def test_shallow_missing_extra_refs(self):
2101 self.add_empty_file('a')
2102 self.add_empty_file('b')
2103
2104 self.d.setVar('BB_GIT_SHALLOW_EXTRA_REFS', 'refs/heads/foo')
2105 with self.assertRaises(bb.fetch2.FetchError):
2106 self.fetch()
2107
2108 def test_shallow_missing_extra_refs_wildcard(self):
2109 self.add_empty_file('a')
2110 self.add_empty_file('b')
2111
2112 self.d.setVar('BB_GIT_SHALLOW_EXTRA_REFS', 'refs/tags/*')
2113 self.fetch()
2114
2115 def test_shallow_remove_revs(self):
2116 # Create initial git repo
2117 self.add_empty_file('a')
2118 self.add_empty_file('b')
2119 self.git('checkout -b a_branch', cwd=self.srcdir)
2120 self.add_empty_file('c')
2121 self.add_empty_file('d')
2122 self.git('checkout master', cwd=self.srcdir)
2123 self.git('tag v0.0 a_branch', cwd=self.srcdir)
2124 self.add_empty_file('e')
2125 self.git('merge --no-ff --no-edit a_branch', cwd=self.srcdir)
2126 self.git('branch -d a_branch', cwd=self.srcdir)
2127 self.add_empty_file('f')
2128 self.assertRevCount(7, cwd=self.srcdir)
2129
2130 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
2131 self.d.setVar('BB_GIT_SHALLOW_REVS', 'v0.0')
2132
2133 self.fetch_shallow()
2134
2135 self.assertRevCount(5)
2136
2137 def test_shallow_invalid_revs(self):
2138 self.add_empty_file('a')
2139 self.add_empty_file('b')
2140
2141 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
2142 self.d.setVar('BB_GIT_SHALLOW_REVS', 'v0.0')
2143
2144 with self.assertRaises(bb.fetch2.FetchError):
2145 self.fetch()
2146
Brad Bishop64c979e2019-11-04 13:55:29 -05002147 def test_shallow_fetch_missing_revs(self):
2148 self.add_empty_file('a')
2149 self.add_empty_file('b')
2150 fetcher, ud = self.fetch(self.d.getVar('SRC_URI'))
2151 self.git('tag v0.0 master', cwd=self.srcdir)
2152 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
2153 self.d.setVar('BB_GIT_SHALLOW_REVS', 'v0.0')
2154 self.fetch_shallow()
2155
2156 def test_shallow_fetch_missing_revs_fails(self):
2157 self.add_empty_file('a')
2158 self.add_empty_file('b')
2159 fetcher, ud = self.fetch(self.d.getVar('SRC_URI'))
2160 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
2161 self.d.setVar('BB_GIT_SHALLOW_REVS', 'v0.0')
2162
2163 with self.assertRaises(bb.fetch2.FetchError), self.assertLogs("BitBake.Fetcher", level="ERROR") as cm:
2164 self.fetch_shallow()
2165 self.assertIn("Unable to find revision v0.0 even from upstream", cm.output[0])
2166
Brad Bishopd7bf8c12018-02-25 22:55:05 -05002167 @skipIfNoNetwork()
2168 def test_bitbake(self):
Andrew Geissler595f6302022-01-24 19:11:47 +00002169 self.git('remote add --mirror=fetch origin https://github.com/openembedded/bitbake', cwd=self.srcdir)
Brad Bishopd7bf8c12018-02-25 22:55:05 -05002170 self.git('config core.bare true', cwd=self.srcdir)
2171 self.git('fetch', cwd=self.srcdir)
2172
2173 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
2174 # Note that the 1.10.0 tag is annotated, so this also tests
2175 # reference of an annotated vs unannotated tag
2176 self.d.setVar('BB_GIT_SHALLOW_REVS', '1.10.0')
2177
2178 self.fetch_shallow()
2179
2180 # Confirm that the history of 1.10.0 was removed
2181 orig_revs = len(self.git('rev-list master', cwd=self.srcdir).splitlines())
2182 revs = len(self.git('rev-list master').splitlines())
2183 self.assertNotEqual(orig_revs, revs)
2184 self.assertRefs(['master', 'origin/master'])
2185 self.assertRevCount(orig_revs - 1758)
Brad Bishop1a4b7ee2018-12-16 17:11:34 -08002186
2187 def test_that_unpack_throws_an_error_when_the_git_clone_nor_shallow_tarball_exist(self):
2188 self.add_empty_file('a')
2189 fetcher, ud = self.fetch()
2190 bb.utils.remove(self.gitdir, recurse=True)
2191 bb.utils.remove(self.dldir, recurse=True)
2192
2193 with self.assertRaises(bb.fetch2.UnpackError) as context:
2194 fetcher.unpack(self.d.getVar('WORKDIR'))
2195
2196 self.assertIn("No up to date source found", context.exception.msg)
2197 self.assertIn("clone directory not available or not up to date", context.exception.msg)
2198
2199 @skipIfNoNetwork()
2200 def test_that_unpack_does_work_when_using_git_shallow_tarball_but_tarball_is_not_available(self):
2201 self.d.setVar('SRCREV', 'e5939ff608b95cdd4d0ab0e1935781ab9a276ac0')
2202 self.d.setVar('BB_GIT_SHALLOW', '1')
2203 self.d.setVar('BB_GENERATE_SHALLOW_TARBALLS', '1')
Andrew Geissler028142b2023-05-05 11:29:21 -05002204 fetcher = bb.fetch.Fetch(["git://git.yoctoproject.org/fstests;branch=master;protocol=https"], self.d)
Brad Bishop1a4b7ee2018-12-16 17:11:34 -08002205 fetcher.download()
2206
2207 bb.utils.remove(self.dldir + "/*.tar.gz")
2208 fetcher.unpack(self.unpackdir)
2209
2210 dir = os.listdir(self.unpackdir + "/git/")
2211 self.assertIn("fstests.doap", dir)
Brad Bishop00e122a2019-10-05 11:10:57 -04002212
2213class GitLfsTest(FetcherTest):
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06002214 def skipIfNoGitLFS():
2215 import shutil
2216 if not shutil.which('git-lfs'):
2217 return unittest.skip('git-lfs not installed')
2218 return lambda f: f
2219
Brad Bishop00e122a2019-10-05 11:10:57 -04002220 def setUp(self):
2221 FetcherTest.setUp(self)
2222
2223 self.gitdir = os.path.join(self.tempdir, 'git')
2224 self.srcdir = os.path.join(self.tempdir, 'gitsource')
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002225
Brad Bishop00e122a2019-10-05 11:10:57 -04002226 self.d.setVar('WORKDIR', self.tempdir)
2227 self.d.setVar('S', self.gitdir)
2228 self.d.delVar('PREMIRRORS')
2229 self.d.delVar('MIRRORS')
2230
2231 self.d.setVar('SRCREV', '${AUTOREV}')
2232 self.d.setVar('AUTOREV', '${@bb.fetch2.get_autorev(d)}')
Andrew Geisslerfc113ea2023-03-31 09:59:46 -05002233 self.d.setVar("__BBSRCREV_SEEN", "1")
Brad Bishop00e122a2019-10-05 11:10:57 -04002234
2235 bb.utils.mkdirhier(self.srcdir)
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002236 self.git_init(cwd=self.srcdir)
Brad Bishop00e122a2019-10-05 11:10:57 -04002237 with open(os.path.join(self.srcdir, '.gitattributes'), 'wt') as attrs:
2238 attrs.write('*.mp3 filter=lfs -text')
2239 self.git(['add', '.gitattributes'], cwd=self.srcdir)
2240 self.git(['commit', '-m', "attributes", '.gitattributes'], cwd=self.srcdir)
2241
Andrew Geisslerd1e89492021-02-12 15:35:20 -06002242 def fetch(self, uri=None, download=True):
Brad Bishop00e122a2019-10-05 11:10:57 -04002243 uris = self.d.getVar('SRC_URI').split()
2244 uri = uris[0]
2245 d = self.d
2246
2247 fetcher = bb.fetch2.Fetch(uris, d)
Andrew Geisslerd1e89492021-02-12 15:35:20 -06002248 if download:
2249 fetcher.download()
Brad Bishop00e122a2019-10-05 11:10:57 -04002250 ud = fetcher.ud[uri]
2251 return fetcher, ud
2252
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06002253 def get_real_git_lfs_file(self):
2254 self.d.setVar('PATH', os.environ.get('PATH'))
2255 fetcher, ud = self.fetch()
2256 fetcher.unpack(self.d.getVar('WORKDIR'))
2257 unpacked_lfs_file = os.path.join(self.d.getVar('WORKDIR'), 'git', "Cat_poster_1.jpg")
2258 return unpacked_lfs_file
2259
2260 @skipIfNoGitLFS()
2261 @skipIfNoNetwork()
2262 def test_real_git_lfs_repo_succeeds_without_lfs_param(self):
2263 self.d.setVar('SRC_URI', "git://gitlab.com/gitlab-examples/lfs.git;protocol=https;branch=master")
2264 f = self.get_real_git_lfs_file()
2265 self.assertTrue(os.path.exists(f))
2266 self.assertEqual("c0baab607a97839c9a328b4310713307", bb.utils.md5_file(f))
2267
2268 @skipIfNoGitLFS()
2269 @skipIfNoNetwork()
2270 def test_real_git_lfs_repo_succeeds(self):
2271 self.d.setVar('SRC_URI', "git://gitlab.com/gitlab-examples/lfs.git;protocol=https;branch=master;lfs=1")
2272 f = self.get_real_git_lfs_file()
2273 self.assertTrue(os.path.exists(f))
2274 self.assertEqual("c0baab607a97839c9a328b4310713307", bb.utils.md5_file(f))
2275
2276 @skipIfNoGitLFS()
2277 @skipIfNoNetwork()
2278 def test_real_git_lfs_repo_succeeds(self):
2279 self.d.setVar('SRC_URI', "git://gitlab.com/gitlab-examples/lfs.git;protocol=https;branch=master;lfs=0")
2280 f = self.get_real_git_lfs_file()
2281 # This is the actual non-smudged placeholder file on the repo if git-lfs does not run
2282 lfs_file = (
2283 'version https://git-lfs.github.com/spec/v1\n'
2284 'oid sha256:34be66b1a39a1955b46a12588df9d5f6fc1da790e05cf01f3c7422f4bbbdc26b\n'
2285 'size 11423554\n'
2286 )
2287
2288 with open(f) as fh:
2289 self.assertEqual(lfs_file, fh.read())
2290
Brad Bishop00e122a2019-10-05 11:10:57 -04002291 def test_lfs_enabled(self):
2292 import shutil
2293
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002294 uri = 'git://%s;protocol=file;lfs=1;branch=master' % self.srcdir
Brad Bishop00e122a2019-10-05 11:10:57 -04002295 self.d.setVar('SRC_URI', uri)
2296
Andrew Geisslerd1e89492021-02-12 15:35:20 -06002297 # Careful: suppress initial attempt at downloading until
2298 # we know whether git-lfs is installed.
2299 fetcher, ud = self.fetch(uri=None, download=False)
Brad Bishop00e122a2019-10-05 11:10:57 -04002300 self.assertIsNotNone(ud.method._find_git_lfs)
2301
Andrew Geisslerd1e89492021-02-12 15:35:20 -06002302 # If git-lfs can be found, the unpack should be successful. Only
2303 # attempt this with the real live copy of git-lfs installed.
2304 if ud.method._find_git_lfs(self.d):
2305 fetcher.download()
2306 shutil.rmtree(self.gitdir, ignore_errors=True)
2307 fetcher.unpack(self.d.getVar('WORKDIR'))
Brad Bishop00e122a2019-10-05 11:10:57 -04002308
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06002309 old_find_git_lfs = ud.method._find_git_lfs
2310 try:
2311 # If git-lfs cannot be found, the unpack should throw an error
2312 with self.assertRaises(bb.fetch2.FetchError):
2313 fetcher.download()
2314 ud.method._find_git_lfs = lambda d: False
2315 shutil.rmtree(self.gitdir, ignore_errors=True)
2316 fetcher.unpack(self.d.getVar('WORKDIR'))
2317 finally:
2318 ud.method._find_git_lfs = old_find_git_lfs
Brad Bishop00e122a2019-10-05 11:10:57 -04002319
2320 def test_lfs_disabled(self):
2321 import shutil
2322
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002323 uri = 'git://%s;protocol=file;lfs=0;branch=master' % self.srcdir
Brad Bishop00e122a2019-10-05 11:10:57 -04002324 self.d.setVar('SRC_URI', uri)
2325
Andrew Geisslerd1e89492021-02-12 15:35:20 -06002326 # In contrast to test_lfs_enabled(), allow the implicit download
2327 # done by self.fetch() to occur here. The point of this test case
2328 # is to verify that the fetcher can survive even if the source
2329 # repository has Git LFS usage configured.
Brad Bishop00e122a2019-10-05 11:10:57 -04002330 fetcher, ud = self.fetch()
2331 self.assertIsNotNone(ud.method._find_git_lfs)
2332
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06002333 old_find_git_lfs = ud.method._find_git_lfs
2334 try:
2335 # If git-lfs can be found, the unpack should be successful. A
2336 # live copy of git-lfs is not required for this case, so
2337 # unconditionally forge its presence.
2338 ud.method._find_git_lfs = lambda d: True
2339 shutil.rmtree(self.gitdir, ignore_errors=True)
2340 fetcher.unpack(self.d.getVar('WORKDIR'))
2341 # If git-lfs cannot be found, the unpack should be successful
Brad Bishop00e122a2019-10-05 11:10:57 -04002342
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06002343 ud.method._find_git_lfs = lambda d: False
2344 shutil.rmtree(self.gitdir, ignore_errors=True)
2345 fetcher.unpack(self.d.getVar('WORKDIR'))
2346 finally:
2347 ud.method._find_git_lfs = old_find_git_lfs
Andrew Geissler82c905d2020-04-13 13:39:40 -05002348
Andrew Geisslerc3d88e42020-10-02 09:45:00 -05002349class GitURLWithSpacesTest(FetcherTest):
2350 test_git_urls = {
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002351 "git://tfs-example.org:22/tfs/example%20path/example.git;branch=master" : {
2352 'url': 'git://tfs-example.org:22/tfs/example%20path/example.git;branch=master',
Andrew Geisslerc3d88e42020-10-02 09:45:00 -05002353 'gitsrcname': 'tfs-example.org.22.tfs.example_path.example.git',
2354 'path': '/tfs/example path/example.git'
2355 },
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002356 "git://tfs-example.org:22/tfs/example%20path/example%20repo.git;branch=master" : {
2357 'url': 'git://tfs-example.org:22/tfs/example%20path/example%20repo.git;branch=master',
Andrew Geisslerc3d88e42020-10-02 09:45:00 -05002358 'gitsrcname': 'tfs-example.org.22.tfs.example_path.example_repo.git',
2359 'path': '/tfs/example path/example repo.git'
2360 }
2361 }
2362
2363 def test_urls(self):
2364
2365 # Set fake SRCREV to stop git fetcher from trying to contact non-existent git repo
2366 self.d.setVar('SRCREV', '82ea737a0b42a8b53e11c9cde141e9e9c0bd8c40')
2367
2368 for test_git_url, ref in self.test_git_urls.items():
2369
2370 fetcher = bb.fetch.Fetch([test_git_url], self.d)
2371 ud = fetcher.ud[fetcher.urls[0]]
2372
2373 self.assertEqual(ud.url, ref['url'])
2374 self.assertEqual(ud.path, ref['path'])
2375 self.assertEqual(ud.localfile, os.path.join(self.dldir, "git2", ref['gitsrcname']))
2376 self.assertEqual(ud.localpath, os.path.join(self.dldir, "git2", ref['gitsrcname']))
2377 self.assertEqual(ud.lockfile, os.path.join(self.dldir, "git2", ref['gitsrcname'] + '.lock'))
2378 self.assertEqual(ud.clonedir, os.path.join(self.dldir, "git2", ref['gitsrcname']))
2379 self.assertEqual(ud.fullmirror, os.path.join(self.dldir, "git2_" + ref['gitsrcname'] + '.tar.gz'))
2380
Andrew Geissler595f6302022-01-24 19:11:47 +00002381class CrateTest(FetcherTest):
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002382 @skipIfNoNetwork()
Andrew Geissler595f6302022-01-24 19:11:47 +00002383 def test_crate_url(self):
2384
2385 uri = "crate://crates.io/glob/0.2.11"
2386 self.d.setVar('SRC_URI', uri)
2387
2388 uris = self.d.getVar('SRC_URI').split()
2389 d = self.d
2390
2391 fetcher = bb.fetch2.Fetch(uris, self.d)
Andrew Geisslerfc113ea2023-03-31 09:59:46 -05002392 ud = fetcher.ud[fetcher.urls[0]]
2393
2394 self.assertIn("name", ud.parm)
Patrick Williams8e7b46e2023-05-01 14:19:06 -05002395 self.assertEqual(ud.parm["name"], "glob-0.2.11")
Andrew Geisslerfc113ea2023-03-31 09:59:46 -05002396 self.assertIn("downloadfilename", ud.parm)
2397 self.assertEqual(ud.parm["downloadfilename"], "glob-0.2.11.crate")
2398
Andrew Geissler595f6302022-01-24 19:11:47 +00002399 fetcher.download()
2400 fetcher.unpack(self.tempdir)
2401 self.assertEqual(sorted(os.listdir(self.tempdir)), ['cargo_home', 'download' , 'unpacked'])
2402 self.assertEqual(sorted(os.listdir(self.tempdir + "/download")), ['glob-0.2.11.crate', 'glob-0.2.11.crate.done'])
2403 self.assertTrue(os.path.exists(self.tempdir + "/cargo_home/bitbake/glob-0.2.11/.cargo-checksum.json"))
2404 self.assertTrue(os.path.exists(self.tempdir + "/cargo_home/bitbake/glob-0.2.11/src/lib.rs"))
2405
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002406 @skipIfNoNetwork()
Patrick Williamse760df82023-05-26 11:10:49 -05002407 def test_crate_url_matching_recipe(self):
2408
2409 self.d.setVar('BP', 'glob-0.2.11')
2410
2411 uri = "crate://crates.io/glob/0.2.11"
2412 self.d.setVar('SRC_URI', uri)
2413
2414 uris = self.d.getVar('SRC_URI').split()
2415 d = self.d
2416
2417 fetcher = bb.fetch2.Fetch(uris, self.d)
2418 ud = fetcher.ud[fetcher.urls[0]]
2419
2420 self.assertIn("name", ud.parm)
2421 self.assertEqual(ud.parm["name"], "glob-0.2.11")
2422 self.assertIn("downloadfilename", ud.parm)
2423 self.assertEqual(ud.parm["downloadfilename"], "glob-0.2.11.crate")
2424
2425 fetcher.download()
2426 fetcher.unpack(self.tempdir)
2427 self.assertEqual(sorted(os.listdir(self.tempdir)), ['download', 'glob-0.2.11', 'unpacked'])
2428 self.assertEqual(sorted(os.listdir(self.tempdir + "/download")), ['glob-0.2.11.crate', 'glob-0.2.11.crate.done'])
2429 self.assertTrue(os.path.exists(self.tempdir + "/glob-0.2.11/src/lib.rs"))
2430
2431 @skipIfNoNetwork()
Andrew Geisslerfc113ea2023-03-31 09:59:46 -05002432 def test_crate_url_params(self):
2433
2434 uri = "crate://crates.io/aho-corasick/0.7.20;name=aho-corasick-renamed"
2435 self.d.setVar('SRC_URI', uri)
2436
2437 uris = self.d.getVar('SRC_URI').split()
2438 d = self.d
2439
2440 fetcher = bb.fetch2.Fetch(uris, self.d)
2441 ud = fetcher.ud[fetcher.urls[0]]
2442
2443 self.assertIn("name", ud.parm)
2444 self.assertEqual(ud.parm["name"], "aho-corasick-renamed")
2445 self.assertIn("downloadfilename", ud.parm)
2446 self.assertEqual(ud.parm["downloadfilename"], "aho-corasick-0.7.20.crate")
2447
2448 fetcher.download()
2449 fetcher.unpack(self.tempdir)
2450 self.assertEqual(sorted(os.listdir(self.tempdir)), ['cargo_home', 'download' , 'unpacked'])
2451 self.assertEqual(sorted(os.listdir(self.tempdir + "/download")), ['aho-corasick-0.7.20.crate', 'aho-corasick-0.7.20.crate.done'])
2452 self.assertTrue(os.path.exists(self.tempdir + "/cargo_home/bitbake/aho-corasick-0.7.20/.cargo-checksum.json"))
2453 self.assertTrue(os.path.exists(self.tempdir + "/cargo_home/bitbake/aho-corasick-0.7.20/src/lib.rs"))
2454
2455 @skipIfNoNetwork()
Andrew Geissler595f6302022-01-24 19:11:47 +00002456 def test_crate_url_multi(self):
2457
2458 uri = "crate://crates.io/glob/0.2.11 crate://crates.io/time/0.1.35"
2459 self.d.setVar('SRC_URI', uri)
2460
2461 uris = self.d.getVar('SRC_URI').split()
2462 d = self.d
2463
2464 fetcher = bb.fetch2.Fetch(uris, self.d)
Andrew Geisslerfc113ea2023-03-31 09:59:46 -05002465 ud = fetcher.ud[fetcher.urls[0]]
2466
2467 self.assertIn("name", ud.parm)
Patrick Williams8e7b46e2023-05-01 14:19:06 -05002468 self.assertEqual(ud.parm["name"], "glob-0.2.11")
Andrew Geisslerfc113ea2023-03-31 09:59:46 -05002469 self.assertIn("downloadfilename", ud.parm)
2470 self.assertEqual(ud.parm["downloadfilename"], "glob-0.2.11.crate")
2471
2472 ud = fetcher.ud[fetcher.urls[1]]
2473 self.assertIn("name", ud.parm)
Patrick Williams8e7b46e2023-05-01 14:19:06 -05002474 self.assertEqual(ud.parm["name"], "time-0.1.35")
Andrew Geisslerfc113ea2023-03-31 09:59:46 -05002475 self.assertIn("downloadfilename", ud.parm)
2476 self.assertEqual(ud.parm["downloadfilename"], "time-0.1.35.crate")
2477
Andrew Geissler595f6302022-01-24 19:11:47 +00002478 fetcher.download()
2479 fetcher.unpack(self.tempdir)
2480 self.assertEqual(sorted(os.listdir(self.tempdir)), ['cargo_home', 'download' , 'unpacked'])
2481 self.assertEqual(sorted(os.listdir(self.tempdir + "/download")), ['glob-0.2.11.crate', 'glob-0.2.11.crate.done', 'time-0.1.35.crate', 'time-0.1.35.crate.done'])
2482 self.assertTrue(os.path.exists(self.tempdir + "/cargo_home/bitbake/glob-0.2.11/.cargo-checksum.json"))
2483 self.assertTrue(os.path.exists(self.tempdir + "/cargo_home/bitbake/glob-0.2.11/src/lib.rs"))
2484 self.assertTrue(os.path.exists(self.tempdir + "/cargo_home/bitbake/time-0.1.35/.cargo-checksum.json"))
2485 self.assertTrue(os.path.exists(self.tempdir + "/cargo_home/bitbake/time-0.1.35/src/lib.rs"))
2486
Andrew Geisslerfc113ea2023-03-31 09:59:46 -05002487 @skipIfNoNetwork()
2488 def test_crate_incorrect_cksum(self):
2489 uri = "crate://crates.io/aho-corasick/0.7.20"
2490 self.d.setVar('SRC_URI', uri)
Patrick Williams8e7b46e2023-05-01 14:19:06 -05002491 self.d.setVarFlag("SRC_URI", "aho-corasick-0.7.20.sha256sum", hashlib.sha256("Invalid".encode("utf-8")).hexdigest())
Andrew Geisslerfc113ea2023-03-31 09:59:46 -05002492
2493 uris = self.d.getVar('SRC_URI').split()
2494
2495 fetcher = bb.fetch2.Fetch(uris, self.d)
Andrew Geissler8f840682023-07-21 09:09:43 -05002496 with self.assertRaisesRegex(bb.fetch2.FetchError, "Fetcher failure for URL"):
Andrew Geisslerfc113ea2023-03-31 09:59:46 -05002497 fetcher.download()
2498
Andrew Geissler82c905d2020-04-13 13:39:40 -05002499class NPMTest(FetcherTest):
2500 def skipIfNoNpm():
2501 import shutil
2502 if not shutil.which('npm'):
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002503 return unittest.skip('npm not installed')
Andrew Geissler82c905d2020-04-13 13:39:40 -05002504 return lambda f: f
2505
2506 @skipIfNoNpm()
2507 @skipIfNoNetwork()
2508 def test_npm(self):
2509 url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0'
2510 fetcher = bb.fetch.Fetch([url], self.d)
2511 ud = fetcher.ud[fetcher.urls[0]]
2512 fetcher.download()
2513 self.assertTrue(os.path.exists(ud.localpath))
2514 self.assertTrue(os.path.exists(ud.localpath + '.done'))
2515 self.assertTrue(os.path.exists(ud.resolvefile))
2516 fetcher.unpack(self.unpackdir)
2517 unpackdir = os.path.join(self.unpackdir, 'npm')
2518 self.assertTrue(os.path.exists(os.path.join(unpackdir, 'package.json')))
2519
2520 @skipIfNoNpm()
2521 @skipIfNoNetwork()
2522 def test_npm_bad_checksum(self):
2523 url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0'
2524 # Fetch once to get a tarball
2525 fetcher = bb.fetch.Fetch([url], self.d)
2526 ud = fetcher.ud[fetcher.urls[0]]
2527 fetcher.download()
2528 self.assertTrue(os.path.exists(ud.localpath))
2529 # Modify the tarball
2530 bad = b'bad checksum'
2531 with open(ud.localpath, 'wb') as f:
2532 f.write(bad)
2533 # Verify that the tarball is fetched again
2534 fetcher.download()
2535 badsum = hashlib.sha512(bad).hexdigest()
2536 self.assertTrue(os.path.exists(ud.localpath + '_bad-checksum_' + badsum))
2537 self.assertTrue(os.path.exists(ud.localpath))
2538
2539 @skipIfNoNpm()
2540 @skipIfNoNetwork()
2541 def test_npm_premirrors(self):
2542 url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0'
2543 # Fetch once to get a tarball
2544 fetcher = bb.fetch.Fetch([url], self.d)
2545 ud = fetcher.ud[fetcher.urls[0]]
2546 fetcher.download()
2547 self.assertTrue(os.path.exists(ud.localpath))
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002548
2549 # Setup the mirror by renaming the download directory
Andrew Geissler82c905d2020-04-13 13:39:40 -05002550 mirrordir = os.path.join(self.tempdir, 'mirror')
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002551 bb.utils.rename(self.dldir, mirrordir)
2552 os.mkdir(self.dldir)
2553
2554 # Configure the premirror to be used
2555 self.d.setVar('PREMIRRORS', 'https?$://.*/.* file://%s/npm2' % mirrordir)
Andrew Geissler82c905d2020-04-13 13:39:40 -05002556 self.d.setVar('BB_FETCH_PREMIRRORONLY', '1')
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002557
Andrew Geissler82c905d2020-04-13 13:39:40 -05002558 # Fetch again
2559 self.assertFalse(os.path.exists(ud.localpath))
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002560 # The npm fetcher doesn't handle that the .resolved file disappears
2561 # while the fetcher object exists, which it does when we rename the
2562 # download directory to "mirror" above. Thus we need a new fetcher to go
2563 # with the now empty download directory.
2564 fetcher = bb.fetch.Fetch([url], self.d)
2565 ud = fetcher.ud[fetcher.urls[0]]
Andrew Geissler82c905d2020-04-13 13:39:40 -05002566 fetcher.download()
2567 self.assertTrue(os.path.exists(ud.localpath))
2568
2569 @skipIfNoNpm()
2570 @skipIfNoNetwork()
Andrew Geissler5199d832021-09-24 16:47:35 -05002571 def test_npm_premirrors_with_specified_filename(self):
2572 url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0'
2573 # Fetch once to get a tarball
2574 fetcher = bb.fetch.Fetch([url], self.d)
2575 ud = fetcher.ud[fetcher.urls[0]]
2576 fetcher.download()
2577 self.assertTrue(os.path.exists(ud.localpath))
2578 # Setup the mirror
2579 mirrordir = os.path.join(self.tempdir, 'mirror')
2580 bb.utils.mkdirhier(mirrordir)
2581 mirrorfilename = os.path.join(mirrordir, os.path.basename(ud.localpath))
2582 os.replace(ud.localpath, mirrorfilename)
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002583 self.d.setVar('PREMIRRORS', 'https?$://.*/.* file://%s' % mirrorfilename)
Andrew Geissler5199d832021-09-24 16:47:35 -05002584 self.d.setVar('BB_FETCH_PREMIRRORONLY', '1')
2585 # Fetch again
2586 self.assertFalse(os.path.exists(ud.localpath))
2587 fetcher.download()
2588 self.assertTrue(os.path.exists(ud.localpath))
2589
2590 @skipIfNoNpm()
2591 @skipIfNoNetwork()
Andrew Geissler82c905d2020-04-13 13:39:40 -05002592 def test_npm_mirrors(self):
2593 # Fetch once to get a tarball
2594 url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0'
2595 fetcher = bb.fetch.Fetch([url], self.d)
2596 ud = fetcher.ud[fetcher.urls[0]]
2597 fetcher.download()
2598 self.assertTrue(os.path.exists(ud.localpath))
2599 # Setup the mirror
2600 mirrordir = os.path.join(self.tempdir, 'mirror')
2601 bb.utils.mkdirhier(mirrordir)
2602 os.replace(ud.localpath, os.path.join(mirrordir, os.path.basename(ud.localpath)))
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002603 self.d.setVar('MIRRORS', 'https?$://.*/.* file://%s/' % mirrordir)
Andrew Geissler82c905d2020-04-13 13:39:40 -05002604 # Update the resolved url to an invalid url
2605 with open(ud.resolvefile, 'r') as f:
2606 url = f.read()
2607 uri = URI(url)
2608 uri.path = '/invalid'
2609 with open(ud.resolvefile, 'w') as f:
2610 f.write(str(uri))
2611 # Fetch again
2612 self.assertFalse(os.path.exists(ud.localpath))
2613 fetcher.download()
2614 self.assertTrue(os.path.exists(ud.localpath))
2615
2616 @skipIfNoNpm()
2617 @skipIfNoNetwork()
2618 def test_npm_destsuffix_downloadfilename(self):
2619 url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0;destsuffix=foo/bar;downloadfilename=foo-bar.tgz'
2620 fetcher = bb.fetch.Fetch([url], self.d)
2621 fetcher.download()
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002622 self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'foo-bar.tgz')))
Andrew Geissler82c905d2020-04-13 13:39:40 -05002623 fetcher.unpack(self.unpackdir)
2624 unpackdir = os.path.join(self.unpackdir, 'foo', 'bar')
2625 self.assertTrue(os.path.exists(os.path.join(unpackdir, 'package.json')))
2626
2627 def test_npm_no_network_no_tarball(self):
2628 url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0'
2629 self.d.setVar('BB_NO_NETWORK', '1')
2630 fetcher = bb.fetch.Fetch([url], self.d)
2631 with self.assertRaises(bb.fetch2.NetworkAccess):
2632 fetcher.download()
2633
2634 @skipIfNoNpm()
2635 @skipIfNoNetwork()
2636 def test_npm_no_network_with_tarball(self):
2637 url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0'
2638 # Fetch once to get a tarball
2639 fetcher = bb.fetch.Fetch([url], self.d)
2640 fetcher.download()
2641 # Disable network access
2642 self.d.setVar('BB_NO_NETWORK', '1')
2643 # Fetch again
2644 fetcher.download()
2645 fetcher.unpack(self.unpackdir)
2646 unpackdir = os.path.join(self.unpackdir, 'npm')
2647 self.assertTrue(os.path.exists(os.path.join(unpackdir, 'package.json')))
2648
2649 @skipIfNoNpm()
2650 @skipIfNoNetwork()
2651 def test_npm_registry_alternate(self):
Andrew Geissler5199d832021-09-24 16:47:35 -05002652 url = 'npm://skimdb.npmjs.com;package=@savoirfairelinux/node-server-example;version=1.0.0'
Andrew Geissler82c905d2020-04-13 13:39:40 -05002653 fetcher = bb.fetch.Fetch([url], self.d)
2654 fetcher.download()
2655 fetcher.unpack(self.unpackdir)
2656 unpackdir = os.path.join(self.unpackdir, 'npm')
2657 self.assertTrue(os.path.exists(os.path.join(unpackdir, 'package.json')))
2658
2659 @skipIfNoNpm()
2660 @skipIfNoNetwork()
2661 def test_npm_version_latest(self):
2662 url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=latest'
2663 fetcher = bb.fetch.Fetch([url], self.d)
2664 fetcher.download()
2665 fetcher.unpack(self.unpackdir)
2666 unpackdir = os.path.join(self.unpackdir, 'npm')
2667 self.assertTrue(os.path.exists(os.path.join(unpackdir, 'package.json')))
2668
2669 @skipIfNoNpm()
2670 @skipIfNoNetwork()
2671 def test_npm_registry_invalid(self):
2672 url = 'npm://registry.invalid.org;package=@savoirfairelinux/node-server-example;version=1.0.0'
2673 fetcher = bb.fetch.Fetch([url], self.d)
2674 with self.assertRaises(bb.fetch2.FetchError):
2675 fetcher.download()
2676
2677 @skipIfNoNpm()
2678 @skipIfNoNetwork()
2679 def test_npm_package_invalid(self):
2680 url = 'npm://registry.npmjs.org;package=@savoirfairelinux/invalid;version=1.0.0'
2681 fetcher = bb.fetch.Fetch([url], self.d)
2682 with self.assertRaises(bb.fetch2.FetchError):
2683 fetcher.download()
2684
2685 @skipIfNoNpm()
2686 @skipIfNoNetwork()
2687 def test_npm_version_invalid(self):
2688 url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=invalid'
2689 with self.assertRaises(bb.fetch2.ParameterError):
2690 fetcher = bb.fetch.Fetch([url], self.d)
2691
2692 @skipIfNoNpm()
2693 @skipIfNoNetwork()
2694 def test_npm_registry_none(self):
2695 url = 'npm://;package=@savoirfairelinux/node-server-example;version=1.0.0'
2696 with self.assertRaises(bb.fetch2.MalformedUrl):
2697 fetcher = bb.fetch.Fetch([url], self.d)
2698
2699 @skipIfNoNpm()
2700 @skipIfNoNetwork()
2701 def test_npm_package_none(self):
2702 url = 'npm://registry.npmjs.org;version=1.0.0'
2703 with self.assertRaises(bb.fetch2.MissingParameterError):
2704 fetcher = bb.fetch.Fetch([url], self.d)
2705
2706 @skipIfNoNpm()
2707 @skipIfNoNetwork()
2708 def test_npm_version_none(self):
2709 url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example'
2710 with self.assertRaises(bb.fetch2.MissingParameterError):
2711 fetcher = bb.fetch.Fetch([url], self.d)
2712
2713 def create_shrinkwrap_file(self, data):
2714 import json
2715 datadir = os.path.join(self.tempdir, 'data')
2716 swfile = os.path.join(datadir, 'npm-shrinkwrap.json')
2717 bb.utils.mkdirhier(datadir)
2718 with open(swfile, 'w') as f:
2719 json.dump(data, f)
2720 # Also configure the S directory
2721 self.sdir = os.path.join(self.unpackdir, 'S')
2722 self.d.setVar('S', self.sdir)
2723 return swfile
2724
2725 @skipIfNoNpm()
2726 @skipIfNoNetwork()
2727 def test_npmsw(self):
2728 swfile = self.create_shrinkwrap_file({
2729 'dependencies': {
2730 'array-flatten': {
2731 'version': '1.1.1',
2732 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz',
2733 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=',
2734 'dependencies': {
2735 'content-type': {
2736 'version': 'https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz',
2737 'integrity': 'sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==',
2738 'dependencies': {
2739 'cookie': {
2740 'version': 'git+https://github.com/jshttp/cookie.git#aec1177c7da67e3b3273df96cf476824dbc9ae09',
2741 'from': 'git+https://github.com/jshttp/cookie.git'
2742 }
2743 }
2744 }
2745 }
2746 }
2747 }
2748 })
2749 fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d)
2750 fetcher.download()
2751 self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'array-flatten-1.1.1.tgz')))
2752 self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'content-type-1.0.4.tgz')))
2753 self.assertTrue(os.path.exists(os.path.join(self.dldir, 'git2', 'github.com.jshttp.cookie.git')))
2754 fetcher.unpack(self.unpackdir)
2755 self.assertTrue(os.path.exists(os.path.join(self.sdir, 'npm-shrinkwrap.json')))
2756 self.assertTrue(os.path.exists(os.path.join(self.sdir, 'node_modules', 'array-flatten', 'package.json')))
2757 self.assertTrue(os.path.exists(os.path.join(self.sdir, 'node_modules', 'array-flatten', 'node_modules', 'content-type', 'package.json')))
2758 self.assertTrue(os.path.exists(os.path.join(self.sdir, 'node_modules', 'array-flatten', 'node_modules', 'content-type', 'node_modules', 'cookie', 'package.json')))
2759
2760 @skipIfNoNpm()
2761 @skipIfNoNetwork()
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06002762 def test_npmsw_git(self):
2763 swfile = self.create_shrinkwrap_file({
2764 'dependencies': {
2765 'cookie': {
2766 'version': 'github:jshttp/cookie.git#aec1177c7da67e3b3273df96cf476824dbc9ae09',
2767 'from': 'github:jshttp/cookie.git'
2768 }
2769 }
2770 })
2771 fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d)
2772 fetcher.download()
2773 self.assertTrue(os.path.exists(os.path.join(self.dldir, 'git2', 'github.com.jshttp.cookie.git')))
2774
2775 swfile = self.create_shrinkwrap_file({
2776 'dependencies': {
2777 'cookie': {
2778 'version': 'jshttp/cookie.git#aec1177c7da67e3b3273df96cf476824dbc9ae09',
2779 'from': 'jshttp/cookie.git'
2780 }
2781 }
2782 })
2783 fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d)
2784 fetcher.download()
2785 self.assertTrue(os.path.exists(os.path.join(self.dldir, 'git2', 'github.com.jshttp.cookie.git')))
2786
2787 swfile = self.create_shrinkwrap_file({
2788 'dependencies': {
2789 'nodejs': {
2790 'version': 'gitlab:gitlab-examples/nodejs.git#892a1f16725e56cc3a2cb0d677be42935c8fc262',
2791 'from': 'gitlab:gitlab-examples/nodejs'
2792 }
2793 }
2794 })
2795 fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d)
2796 fetcher.download()
2797 self.assertTrue(os.path.exists(os.path.join(self.dldir, 'git2', 'gitlab.com.gitlab-examples.nodejs.git')))
2798
2799 @skipIfNoNpm()
2800 @skipIfNoNetwork()
Andrew Geissler82c905d2020-04-13 13:39:40 -05002801 def test_npmsw_dev(self):
2802 swfile = self.create_shrinkwrap_file({
2803 'dependencies': {
2804 'array-flatten': {
2805 'version': '1.1.1',
2806 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz',
2807 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI='
2808 },
2809 'content-type': {
2810 'version': '1.0.4',
2811 'resolved': 'https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz',
2812 'integrity': 'sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==',
2813 'dev': True
2814 }
2815 }
2816 })
2817 # Fetch with dev disabled
2818 fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d)
2819 fetcher.download()
2820 self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'array-flatten-1.1.1.tgz')))
2821 self.assertFalse(os.path.exists(os.path.join(self.dldir, 'npm2', 'content-type-1.0.4.tgz')))
2822 # Fetch with dev enabled
2823 fetcher = bb.fetch.Fetch(['npmsw://' + swfile + ';dev=1'], self.d)
2824 fetcher.download()
2825 self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'array-flatten-1.1.1.tgz')))
2826 self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'content-type-1.0.4.tgz')))
2827
2828 @skipIfNoNpm()
2829 @skipIfNoNetwork()
2830 def test_npmsw_destsuffix(self):
2831 swfile = self.create_shrinkwrap_file({
2832 'dependencies': {
2833 'array-flatten': {
2834 'version': '1.1.1',
2835 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz',
2836 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI='
2837 }
2838 }
2839 })
2840 fetcher = bb.fetch.Fetch(['npmsw://' + swfile + ';destsuffix=foo/bar'], self.d)
2841 fetcher.download()
2842 fetcher.unpack(self.unpackdir)
2843 self.assertTrue(os.path.exists(os.path.join(self.unpackdir, 'foo', 'bar', 'node_modules', 'array-flatten', 'package.json')))
2844
2845 def test_npmsw_no_network_no_tarball(self):
2846 swfile = self.create_shrinkwrap_file({
2847 'dependencies': {
2848 'array-flatten': {
2849 'version': '1.1.1',
2850 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz',
2851 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI='
2852 }
2853 }
2854 })
2855 self.d.setVar('BB_NO_NETWORK', '1')
2856 fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d)
2857 with self.assertRaises(bb.fetch2.NetworkAccess):
2858 fetcher.download()
2859
2860 @skipIfNoNpm()
2861 @skipIfNoNetwork()
2862 def test_npmsw_no_network_with_tarball(self):
2863 # Fetch once to get a tarball
2864 fetcher = bb.fetch.Fetch(['npm://registry.npmjs.org;package=array-flatten;version=1.1.1'], self.d)
2865 fetcher.download()
2866 # Disable network access
2867 self.d.setVar('BB_NO_NETWORK', '1')
2868 # Fetch again
2869 swfile = self.create_shrinkwrap_file({
2870 'dependencies': {
2871 'array-flatten': {
2872 'version': '1.1.1',
2873 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz',
2874 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI='
2875 }
2876 }
2877 })
2878 fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d)
2879 fetcher.download()
2880 fetcher.unpack(self.unpackdir)
2881 self.assertTrue(os.path.exists(os.path.join(self.sdir, 'node_modules', 'array-flatten', 'package.json')))
2882
2883 @skipIfNoNpm()
2884 @skipIfNoNetwork()
2885 def test_npmsw_npm_reusability(self):
2886 # Fetch once with npmsw
2887 swfile = self.create_shrinkwrap_file({
2888 'dependencies': {
2889 'array-flatten': {
2890 'version': '1.1.1',
2891 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz',
2892 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI='
2893 }
2894 }
2895 })
2896 fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d)
2897 fetcher.download()
2898 # Disable network access
2899 self.d.setVar('BB_NO_NETWORK', '1')
2900 # Fetch again with npm
2901 fetcher = bb.fetch.Fetch(['npm://registry.npmjs.org;package=array-flatten;version=1.1.1'], self.d)
2902 fetcher.download()
2903 fetcher.unpack(self.unpackdir)
2904 self.assertTrue(os.path.exists(os.path.join(self.unpackdir, 'npm', 'package.json')))
2905
2906 @skipIfNoNpm()
2907 @skipIfNoNetwork()
2908 def test_npmsw_bad_checksum(self):
2909 # Try to fetch with bad checksum
2910 swfile = self.create_shrinkwrap_file({
2911 'dependencies': {
2912 'array-flatten': {
2913 'version': '1.1.1',
2914 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz',
2915 'integrity': 'sha1-gfNEp2hqgLTFKT6P3AsBYMgsBqg='
2916 }
2917 }
2918 })
2919 fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d)
2920 with self.assertRaises(bb.fetch2.FetchError):
2921 fetcher.download()
2922 # Fetch correctly to get a tarball
2923 swfile = self.create_shrinkwrap_file({
2924 'dependencies': {
2925 'array-flatten': {
2926 'version': '1.1.1',
2927 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz',
2928 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI='
2929 }
2930 }
2931 })
2932 fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d)
2933 fetcher.download()
2934 localpath = os.path.join(self.dldir, 'npm2', 'array-flatten-1.1.1.tgz')
2935 self.assertTrue(os.path.exists(localpath))
2936 # Modify the tarball
2937 bad = b'bad checksum'
2938 with open(localpath, 'wb') as f:
2939 f.write(bad)
2940 # Verify that the tarball is fetched again
2941 fetcher.download()
2942 badsum = hashlib.sha1(bad).hexdigest()
2943 self.assertTrue(os.path.exists(localpath + '_bad-checksum_' + badsum))
2944 self.assertTrue(os.path.exists(localpath))
2945
2946 @skipIfNoNpm()
2947 @skipIfNoNetwork()
2948 def test_npmsw_premirrors(self):
2949 # Fetch once to get a tarball
2950 fetcher = bb.fetch.Fetch(['npm://registry.npmjs.org;package=array-flatten;version=1.1.1'], self.d)
2951 ud = fetcher.ud[fetcher.urls[0]]
2952 fetcher.download()
2953 self.assertTrue(os.path.exists(ud.localpath))
2954 # Setup the mirror
2955 mirrordir = os.path.join(self.tempdir, 'mirror')
2956 bb.utils.mkdirhier(mirrordir)
2957 os.replace(ud.localpath, os.path.join(mirrordir, os.path.basename(ud.localpath)))
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002958 self.d.setVar('PREMIRRORS', 'https?$://.*/.* file://%s/' % mirrordir)
Andrew Geissler82c905d2020-04-13 13:39:40 -05002959 self.d.setVar('BB_FETCH_PREMIRRORONLY', '1')
2960 # Fetch again
2961 self.assertFalse(os.path.exists(ud.localpath))
2962 swfile = self.create_shrinkwrap_file({
2963 'dependencies': {
2964 'array-flatten': {
2965 'version': '1.1.1',
2966 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz',
2967 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI='
2968 }
2969 }
2970 })
2971 fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d)
2972 fetcher.download()
2973 self.assertTrue(os.path.exists(ud.localpath))
2974
2975 @skipIfNoNpm()
2976 @skipIfNoNetwork()
2977 def test_npmsw_mirrors(self):
2978 # Fetch once to get a tarball
2979 fetcher = bb.fetch.Fetch(['npm://registry.npmjs.org;package=array-flatten;version=1.1.1'], self.d)
2980 ud = fetcher.ud[fetcher.urls[0]]
2981 fetcher.download()
2982 self.assertTrue(os.path.exists(ud.localpath))
2983 # Setup the mirror
2984 mirrordir = os.path.join(self.tempdir, 'mirror')
2985 bb.utils.mkdirhier(mirrordir)
2986 os.replace(ud.localpath, os.path.join(mirrordir, os.path.basename(ud.localpath)))
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002987 self.d.setVar('MIRRORS', 'https?$://.*/.* file://%s/' % mirrordir)
Andrew Geissler82c905d2020-04-13 13:39:40 -05002988 # Fetch again with invalid url
2989 self.assertFalse(os.path.exists(ud.localpath))
2990 swfile = self.create_shrinkwrap_file({
2991 'dependencies': {
2992 'array-flatten': {
2993 'version': '1.1.1',
2994 'resolved': 'https://invalid',
2995 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI='
2996 }
2997 }
2998 })
2999 fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d)
3000 fetcher.download()
3001 self.assertTrue(os.path.exists(ud.localpath))
Andrew Geisslerc926e172021-05-07 16:11:35 -05003002
3003class GitSharedTest(FetcherTest):
3004 def setUp(self):
3005 super(GitSharedTest, self).setUp()
Andrew Geissler028142b2023-05-05 11:29:21 -05003006 self.recipe_url = "git://git.openembedded.org/bitbake;branch=master;protocol=https"
Andrew Geisslerc926e172021-05-07 16:11:35 -05003007 self.d.setVar('SRCREV', '82ea737a0b42a8b53e11c9cde141e9e9c0bd8c40')
Andrew Geisslerfc113ea2023-03-31 09:59:46 -05003008 self.d.setVar("__BBSRCREV_SEEN", "1")
Andrew Geisslerc926e172021-05-07 16:11:35 -05003009
3010 @skipIfNoNetwork()
3011 def test_shared_unpack(self):
3012 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
3013
3014 fetcher.download()
3015 fetcher.unpack(self.unpackdir)
3016 alt = os.path.join(self.unpackdir, 'git/.git/objects/info/alternates')
3017 self.assertTrue(os.path.exists(alt))
3018
3019 @skipIfNoNetwork()
3020 def test_noshared_unpack(self):
3021 self.d.setVar('BB_GIT_NOSHARED', '1')
3022 self.unpackdir += '_noshared'
3023 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
3024
3025 fetcher.download()
3026 fetcher.unpack(self.unpackdir)
3027 alt = os.path.join(self.unpackdir, 'git/.git/objects/info/alternates')
3028 self.assertFalse(os.path.exists(alt))
Andrew Geissler78b72792022-06-14 06:47:25 -05003029
3030
3031class FetchPremirroronlyLocalTest(FetcherTest):
3032
3033 def setUp(self):
3034 super(FetchPremirroronlyLocalTest, self).setUp()
3035 self.mirrordir = os.path.join(self.tempdir, "mirrors")
3036 os.mkdir(self.mirrordir)
3037 self.reponame = "bitbake"
3038 self.gitdir = os.path.join(self.tempdir, "git", self.reponame)
Andrew Geissler028142b2023-05-05 11:29:21 -05003039 self.recipe_url = "git://git.fake.repo/bitbake;branch=master;protocol=https"
Andrew Geissler78b72792022-06-14 06:47:25 -05003040 self.d.setVar("BB_FETCH_PREMIRRORONLY", "1")
3041 self.d.setVar("BB_NO_NETWORK", "1")
3042 self.d.setVar("PREMIRRORS", self.recipe_url + " " + "file://{}".format(self.mirrordir) + " \n")
3043
3044 def make_git_repo(self):
3045 self.mirrorname = "git2_git.fake.repo.bitbake.tar.gz"
3046 recipeurl = "git:/git.fake.repo/bitbake"
3047 os.makedirs(self.gitdir)
Andrew Geissler8f840682023-07-21 09:09:43 -05003048 self.git_init(cwd=self.gitdir)
Andrew Geissler78b72792022-06-14 06:47:25 -05003049 for i in range(0):
3050 self.git_new_commit()
3051 bb.process.run('tar -czvf {} .'.format(os.path.join(self.mirrordir, self.mirrorname)), cwd = self.gitdir)
3052
3053 def git_new_commit(self):
3054 import random
3055 testfilename = "bibake-fetch.test"
3056 os.unlink(os.path.join(self.mirrordir, self.mirrorname))
3057 with open(os.path.join(self.gitdir, testfilename), "w") as testfile:
3058 testfile.write("Useless random data {}".format(random.random()))
3059 self.git("add {}".format(testfilename), self.gitdir)
3060 self.git("commit -a -m \"This random commit {}. I'm useless.\"".format(random.random()), self.gitdir)
3061 bb.process.run('tar -czvf {} .'.format(os.path.join(self.mirrordir, self.mirrorname)), cwd = self.gitdir)
3062 return self.git("rev-parse HEAD", self.gitdir).strip()
3063
3064 def test_mirror_commit_nonexistent(self):
3065 self.make_git_repo()
3066 self.d.setVar("SRCREV", "0"*40)
3067 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
3068 with self.assertRaises(bb.fetch2.NetworkAccess):
3069 fetcher.download()
3070
3071 def test_mirror_commit_exists(self):
3072 self.make_git_repo()
3073 self.d.setVar("SRCREV", self.git_new_commit())
3074 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
3075 fetcher.download()
3076 fetcher.unpack(self.unpackdir)
3077
3078 def test_mirror_tarball_nonexistent(self):
3079 self.d.setVar("SRCREV", "0"*40)
3080 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
3081 with self.assertRaises(bb.fetch2.NetworkAccess):
3082 fetcher.download()
3083
3084class FetchPremirroronlyNetworkTest(FetcherTest):
3085
3086 def setUp(self):
3087 super(FetchPremirroronlyNetworkTest, self).setUp()
3088 self.mirrordir = os.path.join(self.tempdir, "mirrors")
3089 os.mkdir(self.mirrordir)
3090 self.reponame = "fstests"
3091 self.clonedir = os.path.join(self.tempdir, "git")
3092 self.gitdir = os.path.join(self.tempdir, "git", "{}.git".format(self.reponame))
Andrew Geissler028142b2023-05-05 11:29:21 -05003093 self.recipe_url = "git://git.yoctoproject.org/fstests;protocol=https"
Andrew Geissler78b72792022-06-14 06:47:25 -05003094 self.d.setVar("BB_FETCH_PREMIRRORONLY", "1")
3095 self.d.setVar("BB_NO_NETWORK", "0")
3096 self.d.setVar("PREMIRRORS", self.recipe_url + " " + "file://{}".format(self.mirrordir) + " \n")
3097
3098 def make_git_repo(self):
3099 import shutil
3100 self.mirrorname = "git2_git.yoctoproject.org.fstests.tar.gz"
3101 os.makedirs(self.clonedir)
3102 self.git("clone --bare --shallow-since=\"01.01.2013\" {}".format(self.recipe_url), self.clonedir)
3103 bb.process.run('tar -czvf {} .'.format(os.path.join(self.mirrordir, self.mirrorname)), cwd = self.gitdir)
3104 shutil.rmtree(self.clonedir)
3105
3106 @skipIfNoNetwork()
3107 def test_mirror_tarball_updated(self):
3108 self.make_git_repo()
3109 ## Upstream commit is in the mirror
3110 self.d.setVar("SRCREV", "49d65d53c2bf558ae6e9185af0f3af7b79d255ec")
3111 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
3112 fetcher.download()
3113
3114 @skipIfNoNetwork()
3115 def test_mirror_tarball_outdated(self):
3116 self.make_git_repo()
3117 ## Upstream commit not in the mirror
3118 self.d.setVar("SRCREV", "15413486df1f5a5b5af699b6f3ba5f0984e52a9f")
3119 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
3120 with self.assertRaises(bb.fetch2.NetworkAccess):
3121 fetcher.download()
Andrew Geissler615f2f12022-07-15 14:00:58 -05003122
Andrew Geisslerc5535c92023-01-27 16:10:19 -06003123class FetchPremirroronlyMercurialTest(FetcherTest):
3124 """ Test for premirrors with mercurial repos
3125 the test covers also basic hg:// clone (see fetch_and_create_tarball
3126 """
3127 def skipIfNoHg():
3128 import shutil
3129 if not shutil.which('hg'):
3130 return unittest.skip('Mercurial not installed')
3131 return lambda f: f
3132
3133 def setUp(self):
3134 super(FetchPremirroronlyMercurialTest, self).setUp()
3135 self.mirrordir = os.path.join(self.tempdir, "mirrors")
3136 os.mkdir(self.mirrordir)
3137 self.reponame = "libgnt"
3138 self.clonedir = os.path.join(self.tempdir, "hg")
3139 self.recipe_url = "hg://keep.imfreedom.org/libgnt;module=libgnt"
3140 self.d.setVar("SRCREV", "53e8b422faaf")
3141 self.mirrorname = "hg_libgnt_keep.imfreedom.org_.libgnt.tar.gz"
3142
3143 def fetch_and_create_tarball(self):
3144 """
3145 Ask bitbake to download repo and prepare mirror tarball for us
3146 """
3147 self.d.setVar("BB_GENERATE_MIRROR_TARBALLS", "1")
3148 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
3149 fetcher.download()
3150 mirrorfile = os.path.join(self.d.getVar("DL_DIR"), self.mirrorname)
3151 self.assertTrue(os.path.exists(mirrorfile), "Mirror tarball {} has not been created".format(mirrorfile))
3152 ## moving tarball to mirror directory
3153 os.rename(mirrorfile, os.path.join(self.mirrordir, self.mirrorname))
3154 self.d.setVar("BB_GENERATE_MIRROR_TARBALLS", "0")
3155
3156
3157 @skipIfNoNetwork()
3158 @skipIfNoHg()
3159 def test_premirror_mercurial(self):
3160 self.fetch_and_create_tarball()
3161 self.d.setVar("PREMIRRORS", self.recipe_url + " " + "file://{}".format(self.mirrordir) + " \n")
3162 self.d.setVar("BB_FETCH_PREMIRRORONLY", "1")
3163 self.d.setVar("BB_NO_NETWORK", "1")
3164 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
3165 fetcher.download()
3166
Andrew Geissler615f2f12022-07-15 14:00:58 -05003167class FetchPremirroronlyBrokenTarball(FetcherTest):
3168
3169 def setUp(self):
3170 super(FetchPremirroronlyBrokenTarball, self).setUp()
3171 self.mirrordir = os.path.join(self.tempdir, "mirrors")
3172 os.mkdir(self.mirrordir)
3173 self.reponame = "bitbake"
3174 self.gitdir = os.path.join(self.tempdir, "git", self.reponame)
Andrew Geissler028142b2023-05-05 11:29:21 -05003175 self.recipe_url = "git://git.fake.repo/bitbake;protocol=https"
Andrew Geissler615f2f12022-07-15 14:00:58 -05003176 self.d.setVar("BB_FETCH_PREMIRRORONLY", "1")
3177 self.d.setVar("BB_NO_NETWORK", "1")
3178 self.d.setVar("PREMIRRORS", self.recipe_url + " " + "file://{}".format(self.mirrordir) + " \n")
3179 self.mirrorname = "git2_git.fake.repo.bitbake.tar.gz"
3180 with open(os.path.join(self.mirrordir, self.mirrorname), 'w') as targz:
3181 targz.write("This is not tar.gz file!")
3182
3183 def test_mirror_broken_download(self):
3184 import sys
3185 self.d.setVar("SRCREV", "0"*40)
3186 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
Andrew Geissler8f840682023-07-21 09:09:43 -05003187 with self.assertRaises(bb.fetch2.FetchError), self.assertLogs() as logs:
Andrew Geissler615f2f12022-07-15 14:00:58 -05003188 fetcher.download()
Andrew Geissler8f840682023-07-21 09:09:43 -05003189 output = "".join(logs.output)
3190 self.assertFalse(" not a git repository (or any parent up to mount point /)" in output)