blob: 20593764fd14131e047df93a4df8462635f87420 [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'}),
Andrew Geissler028142b2023-05-05 11:29:21 -05001345 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 -05001346 }
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001347 # we require a pathname to encodeurl but users can still pass such urls to
1348 # decodeurl and we need to handle them
1349 decodedata = datatable.copy()
1350 decodedata.update({
Brad Bishop1a4b7ee2018-12-16 17:11:34 -08001351 "http://somesite.net;someparam=1": ('http', 'somesite.net', '/', '', '', {'someparam': '1'}),
Patrick Williams2390b1b2022-11-03 13:47:49 -05001352 "npmsw://some.registry.url;package=@pkg;version=latest": ('npmsw', 'some.registry.url', '/', '', '', {'package': '@pkg', 'version': 'latest'}),
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001353 })
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001354
1355 def test_decodeurl(self):
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001356 for k, v in self.decodedata.items():
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001357 result = bb.fetch.decodeurl(k)
1358 self.assertEqual(result, v)
1359
1360 def test_encodeurl(self):
1361 for k, v in self.datatable.items():
1362 result = bb.fetch.encodeurl(v)
1363 self.assertEqual(result, k)
1364
1365class FetchLatestVersionTest(FetcherTest):
1366
1367 test_git_uris = {
1368 # version pattern "X.Y.Z"
Andrew Geissler595f6302022-01-24 19:11:47 +00001369 ("mx-1.0", "git://github.com/clutter-project/mx.git;branch=mx-1.4;protocol=https", "9b1db6b8060bd00b121a692f942404a24ae2960f", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001370 : "1.99.4",
1371 # version pattern "vX.Y"
Andrew Geisslerd25ed322020-06-27 00:28:28 -05001372 # mirror of git.infradead.org since network issues interfered with testing
Andrew Geissler028142b2023-05-05 11:29:21 -05001373 ("mtd-utils", "git://git.yoctoproject.org/mtd-utils.git;branch=master;protocol=https", "ca39eb1d98e736109c64ff9c1aa2a6ecca222d8f", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001374 : "1.5.0",
1375 # version pattern "pkg_name-X.Y"
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001376 # mirror of git://anongit.freedesktop.org/git/xorg/proto/presentproto since network issues interfered with testing
Andrew Geissler028142b2023-05-05 11:29:21 -05001377 ("presentproto", "git://git.yoctoproject.org/bbfetchtests-presentproto;branch=master;protocol=https", "24f3a56e541b0a9e6c6ee76081f441221a120ef9", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001378 : "1.0",
1379 # version pattern "pkg_name-vX.Y.Z"
Andrew Geissler028142b2023-05-05 11:29:21 -05001380 ("dtc", "git://git.yoctoproject.org/bbfetchtests-dtc.git;branch=master;protocol=https", "65cc4d2748a2c2e6f27f1cf39e07a5dbabd80ebf", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001381 : "1.4.0",
1382 # combination version pattern
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001383 ("sysprof", "git://gitlab.gnome.org/GNOME/sysprof.git;protocol=https;branch=master", "cd44ee6644c3641507fb53b8a2a69137f2971219", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001384 : "1.2.0",
1385 ("u-boot-mkimage", "git://git.denx.de/u-boot.git;branch=master;protocol=git", "62c175fbb8a0f9a926c88294ea9f7e88eb898f6c", "")
1386 : "2014.01",
1387 # version pattern "yyyymmdd"
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001388 ("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 -05001389 : "20120614",
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001390 # packages with a valid UPSTREAM_CHECK_GITTAGREGEX
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001391 # mirror of git://anongit.freedesktop.org/xorg/driver/xf86-video-omap since network issues interfered with testing
Andrew Geissler028142b2023-05-05 11:29:21 -05001392 ("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 -05001393 : "0.4.3",
Andrew Geissler028142b2023-05-05 11:29:21 -05001394 ("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 -05001395 : "11.0.0",
Andrew Geissler595f6302022-01-24 19:11:47 +00001396 ("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 -05001397 : "1.3.59",
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001398 ("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 -05001399 : "3.82+dbg0.9",
1400 }
1401
1402 test_wget_uris = {
Andrew Geissler82c905d2020-04-13 13:39:40 -05001403 #
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001404 # packages with versions inside directory name
Andrew Geissler82c905d2020-04-13 13:39:40 -05001405 #
1406 # http://kernel.org/pub/linux/utils/util-linux/v2.23/util-linux-2.24.2.tar.bz2
1407 ("util-linux", "/pub/linux/utils/util-linux/v2.23/util-linux-2.24.2.tar.bz2", "", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001408 : "2.24.2",
Andrew Geissler82c905d2020-04-13 13:39:40 -05001409 # http://www.abisource.com/downloads/enchant/1.6.0/enchant-1.6.0.tar.gz
1410 ("enchant", "/downloads/enchant/1.6.0/enchant-1.6.0.tar.gz", "", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001411 : "1.6.0",
Andrew Geissler82c905d2020-04-13 13:39:40 -05001412 # http://www.cmake.org/files/v2.8/cmake-2.8.12.1.tar.gz
1413 ("cmake", "/files/v2.8/cmake-2.8.12.1.tar.gz", "", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001414 : "2.8.12.1",
Andrew Geissler517393d2023-01-13 08:55:19 -06001415 # https://download.gnome.org/sources/libxml2/2.9/libxml2-2.9.14.tar.xz
1416 ("libxml2", "/software/libxml2/2.9/libxml2-2.9.14.tar.xz", "", "")
1417 : "2.10.3",
Andrew Geissler82c905d2020-04-13 13:39:40 -05001418 #
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001419 # packages with versions only in current directory
Andrew Geissler82c905d2020-04-13 13:39:40 -05001420 #
Andrew Geisslereff27472021-10-29 15:35:00 -05001421 # https://downloads.yoctoproject.org/releases/eglibc/eglibc-2.18-svnr23787.tar.bz2
Andrew Geissler82c905d2020-04-13 13:39:40 -05001422 ("eglic", "/releases/eglibc/eglibc-2.18-svnr23787.tar.bz2", "", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001423 : "2.19",
Andrew Geisslereff27472021-10-29 15:35:00 -05001424 # https://downloads.yoctoproject.org/releases/gnu-config/gnu-config-20120814.tar.bz2
Andrew Geissler82c905d2020-04-13 13:39:40 -05001425 ("gnu-config", "/releases/gnu-config/gnu-config-20120814.tar.bz2", "", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001426 : "20120814",
Andrew Geissler82c905d2020-04-13 13:39:40 -05001427 #
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001428 # packages with "99" in the name of possible version
Andrew Geissler82c905d2020-04-13 13:39:40 -05001429 #
1430 # http://freedesktop.org/software/pulseaudio/releases/pulseaudio-4.0.tar.xz
1431 ("pulseaudio", "/software/pulseaudio/releases/pulseaudio-4.0.tar.xz", "", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001432 : "5.0",
Andrew Geissler82c905d2020-04-13 13:39:40 -05001433 # http://xorg.freedesktop.org/releases/individual/xserver/xorg-server-1.15.1.tar.bz2
1434 ("xserver-xorg", "/releases/individual/xserver/xorg-server-1.15.1.tar.bz2", "", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001435 : "1.15.1",
Andrew Geissler82c905d2020-04-13 13:39:40 -05001436 #
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001437 # packages with valid UPSTREAM_CHECK_URI and UPSTREAM_CHECK_REGEX
Andrew Geissler82c905d2020-04-13 13:39:40 -05001438 #
1439 # http://www.cups.org/software/1.7.2/cups-1.7.2-source.tar.bz2
1440 # https://github.com/apple/cups/releases
Andrew Geissler5199d832021-09-24 16:47:35 -05001441 ("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 -05001442 : "2.0.0",
Andrew Geissler82c905d2020-04-13 13:39:40 -05001443 # http://download.oracle.com/berkeley-db/db-5.3.21.tar.gz
1444 # http://ftp.debian.org/debian/pool/main/d/db5.3/
Andrew Geissler5199d832021-09-24 16:47:35 -05001445 ("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 -04001446 : "5.3.10",
Andrew Geissler595f6302022-01-24 19:11:47 +00001447 #
1448 # packages where the tarball compression changed in the new version
1449 #
1450 # http://ftp.debian.org/debian/pool/main/m/minicom/minicom_2.7.1.orig.tar.gz
1451 ("minicom", "/debian/pool/main/m/minicom/minicom_2.7.1.orig.tar.gz", "", "")
1452 : "2.8",
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001453 }
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001454
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001455 @skipIfNoNetwork()
1456 def test_git_latest_versionstring(self):
1457 for k, v in self.test_git_uris.items():
1458 self.d.setVar("PN", k[0])
1459 self.d.setVar("SRCREV", k[2])
1460 self.d.setVar("UPSTREAM_CHECK_GITTAGREGEX", k[3])
1461 ud = bb.fetch2.FetchData(k[1], self.d)
1462 pupver= ud.method.latest_versionstring(ud, self.d)
1463 verstring = pupver[0]
Brad Bishop316dfdd2018-06-25 12:45:53 -04001464 self.assertTrue(verstring, msg="Could not find upstream version for %s" % k[0])
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001465 r = bb.utils.vercmp_string(v, verstring)
1466 self.assertTrue(r == -1 or r == 0, msg="Package %s, version: %s <= %s" % (k[0], v, verstring))
1467
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001468 def test_wget_latest_versionstring(self):
Andrew Geissler82c905d2020-04-13 13:39:40 -05001469 testdata = os.path.dirname(os.path.abspath(__file__)) + "/fetch-testdata"
1470 server = HTTPService(testdata)
1471 server.start()
1472 port = server.port
1473 try:
1474 for k, v in self.test_wget_uris.items():
1475 self.d.setVar("PN", k[0])
1476 checkuri = ""
1477 if k[2]:
1478 checkuri = "http://localhost:%s/" % port + k[2]
1479 self.d.setVar("UPSTREAM_CHECK_URI", checkuri)
1480 self.d.setVar("UPSTREAM_CHECK_REGEX", k[3])
1481 url = "http://localhost:%s/" % port + k[1]
1482 ud = bb.fetch2.FetchData(url, self.d)
1483 pupver = ud.method.latest_versionstring(ud, self.d)
1484 verstring = pupver[0]
1485 self.assertTrue(verstring, msg="Could not find upstream version for %s" % k[0])
1486 r = bb.utils.vercmp_string(v, verstring)
1487 self.assertTrue(r == -1 or r == 0, msg="Package %s, version: %s <= %s" % (k[0], v, verstring))
1488 finally:
1489 server.stop()
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001490
1491
1492class FetchCheckStatusTest(FetcherTest):
Andrew Geisslereff27472021-10-29 15:35:00 -05001493 test_wget_uris = ["https://downloads.yoctoproject.org/releases/sato/sato-engine-0.1.tar.gz",
1494 "https://downloads.yoctoproject.org/releases/sato/sato-engine-0.2.tar.gz",
1495 "https://downloads.yoctoproject.org/releases/sato/sato-engine-0.3.tar.gz",
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001496 "https://yoctoproject.org/",
Andrew Geissler95ac1b82021-03-31 14:34:31 -05001497 "https://docs.yoctoproject.org",
Andrew Geisslereff27472021-10-29 15:35:00 -05001498 "https://downloads.yoctoproject.org/releases/opkg/opkg-0.1.7.tar.gz",
1499 "https://downloads.yoctoproject.org/releases/opkg/opkg-0.3.0.tar.gz",
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001500 "ftp://sourceware.org/pub/libffi/libffi-1.20.tar.gz",
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001501 # GitHub releases are hosted on Amazon S3, which doesn't support HEAD
1502 "https://github.com/kergoth/tslib/releases/download/1.1/tslib-1.1.tar.xz"
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001503 ]
1504
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001505 @skipIfNoNetwork()
1506 def test_wget_checkstatus(self):
1507 fetch = bb.fetch2.Fetch(self.test_wget_uris, self.d)
1508 for u in self.test_wget_uris:
1509 with self.subTest(url=u):
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001510 ud = fetch.ud[u]
1511 m = ud.method
1512 ret = m.checkstatus(fetch, ud, self.d)
1513 self.assertTrue(ret, msg="URI %s, can't check status" % (u))
1514
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001515 @skipIfNoNetwork()
1516 def test_wget_checkstatus_connection_cache(self):
1517 from bb.fetch2 import FetchConnectionCache
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001518
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001519 connection_cache = FetchConnectionCache()
1520 fetch = bb.fetch2.Fetch(self.test_wget_uris, self.d,
1521 connection_cache = connection_cache)
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001522
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001523 for u in self.test_wget_uris:
1524 with self.subTest(url=u):
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001525 ud = fetch.ud[u]
1526 m = ud.method
1527 ret = m.checkstatus(fetch, ud, self.d)
1528 self.assertTrue(ret, msg="URI %s, can't check status" % (u))
1529
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001530 connection_cache.close_connections()
1531
1532
1533class GitMakeShallowTest(FetcherTest):
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001534 def setUp(self):
1535 FetcherTest.setUp(self)
1536 self.gitdir = os.path.join(self.tempdir, 'gitshallow')
1537 bb.utils.mkdirhier(self.gitdir)
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001538 self.git_init()
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001539
1540 def assertRefs(self, expected_refs):
1541 actual_refs = self.git(['for-each-ref', '--format=%(refname)']).splitlines()
1542 full_expected = self.git(['rev-parse', '--symbolic-full-name'] + expected_refs).splitlines()
1543 self.assertEqual(sorted(full_expected), sorted(actual_refs))
1544
1545 def assertRevCount(self, expected_count, args=None):
1546 if args is None:
1547 args = ['HEAD']
1548 revs = self.git(['rev-list'] + args)
1549 actual_count = len(revs.splitlines())
1550 self.assertEqual(expected_count, actual_count, msg='Object count `%d` is not the expected `%d`' % (actual_count, expected_count))
1551
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001552 def make_shallow(self, args=None):
1553 if args is None:
1554 args = ['HEAD']
Brad Bishop316dfdd2018-06-25 12:45:53 -04001555 return bb.process.run([bb.fetch2.git.Git.make_shallow_path] + args, cwd=self.gitdir)
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001556
1557 def add_empty_file(self, path, msg=None):
1558 if msg is None:
1559 msg = path
1560 open(os.path.join(self.gitdir, path), 'w').close()
1561 self.git(['add', path])
1562 self.git(['commit', '-m', msg, path])
1563
1564 def test_make_shallow_single_branch_no_merge(self):
1565 self.add_empty_file('a')
1566 self.add_empty_file('b')
1567 self.assertRevCount(2)
1568 self.make_shallow()
1569 self.assertRevCount(1)
1570
1571 def test_make_shallow_single_branch_one_merge(self):
1572 self.add_empty_file('a')
1573 self.add_empty_file('b')
1574 self.git('checkout -b a_branch')
1575 self.add_empty_file('c')
1576 self.git('checkout master')
1577 self.add_empty_file('d')
1578 self.git('merge --no-ff --no-edit a_branch')
1579 self.git('branch -d a_branch')
1580 self.add_empty_file('e')
1581 self.assertRevCount(6)
1582 self.make_shallow(['HEAD~2'])
1583 self.assertRevCount(5)
1584
1585 def test_make_shallow_at_merge(self):
1586 self.add_empty_file('a')
1587 self.git('checkout -b a_branch')
1588 self.add_empty_file('b')
1589 self.git('checkout master')
1590 self.git('merge --no-ff --no-edit a_branch')
1591 self.git('branch -d a_branch')
1592 self.assertRevCount(3)
1593 self.make_shallow()
1594 self.assertRevCount(1)
1595
1596 def test_make_shallow_annotated_tag(self):
1597 self.add_empty_file('a')
1598 self.add_empty_file('b')
1599 self.git('tag -a -m a_tag a_tag')
1600 self.assertRevCount(2)
1601 self.make_shallow(['a_tag'])
1602 self.assertRevCount(1)
1603
1604 def test_make_shallow_multi_ref(self):
1605 self.add_empty_file('a')
1606 self.add_empty_file('b')
1607 self.git('checkout -b a_branch')
1608 self.add_empty_file('c')
1609 self.git('checkout master')
1610 self.add_empty_file('d')
1611 self.git('checkout -b a_branch_2')
1612 self.add_empty_file('a_tag')
1613 self.git('tag a_tag')
1614 self.git('checkout master')
1615 self.git('branch -D a_branch_2')
1616 self.add_empty_file('e')
1617 self.assertRevCount(6, ['--all'])
1618 self.make_shallow()
1619 self.assertRevCount(5, ['--all'])
1620
1621 def test_make_shallow_multi_ref_trim(self):
1622 self.add_empty_file('a')
1623 self.git('checkout -b a_branch')
1624 self.add_empty_file('c')
1625 self.git('checkout master')
1626 self.assertRevCount(1)
1627 self.assertRevCount(2, ['--all'])
1628 self.assertRefs(['master', 'a_branch'])
1629 self.make_shallow(['-r', 'master', 'HEAD'])
1630 self.assertRevCount(1, ['--all'])
1631 self.assertRefs(['master'])
1632
1633 def test_make_shallow_noop(self):
1634 self.add_empty_file('a')
1635 self.assertRevCount(1)
1636 self.make_shallow()
1637 self.assertRevCount(1)
1638
1639 @skipIfNoNetwork()
1640 def test_make_shallow_bitbake(self):
1641 self.git('remote add origin https://github.com/openembedded/bitbake')
1642 self.git('fetch --tags origin')
1643 orig_revs = len(self.git('rev-list --all').splitlines())
1644 self.make_shallow(['refs/tags/1.10.0'])
1645 self.assertRevCount(orig_revs - 1746, ['--all'])
1646
1647class GitShallowTest(FetcherTest):
1648 def setUp(self):
1649 FetcherTest.setUp(self)
1650 self.gitdir = os.path.join(self.tempdir, 'git')
1651 self.srcdir = os.path.join(self.tempdir, 'gitsource')
1652
1653 bb.utils.mkdirhier(self.srcdir)
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001654 self.git_init(cwd=self.srcdir)
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001655 self.d.setVar('WORKDIR', self.tempdir)
1656 self.d.setVar('S', self.gitdir)
1657 self.d.delVar('PREMIRRORS')
1658 self.d.delVar('MIRRORS')
1659
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001660 uri = 'git://%s;protocol=file;subdir=${S};branch=master' % self.srcdir
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001661 self.d.setVar('SRC_URI', uri)
1662 self.d.setVar('SRCREV', '${AUTOREV}')
1663 self.d.setVar('AUTOREV', '${@bb.fetch2.get_autorev(d)}')
1664
1665 self.d.setVar('BB_GIT_SHALLOW', '1')
1666 self.d.setVar('BB_GENERATE_MIRROR_TARBALLS', '0')
1667 self.d.setVar('BB_GENERATE_SHALLOW_TARBALLS', '1')
Andrew Geisslerfc113ea2023-03-31 09:59:46 -05001668 self.d.setVar("__BBSRCREV_SEEN", "1")
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001669
1670 def assertRefs(self, expected_refs, cwd=None):
1671 if cwd is None:
1672 cwd = self.gitdir
1673 actual_refs = self.git(['for-each-ref', '--format=%(refname)'], cwd=cwd).splitlines()
1674 full_expected = self.git(['rev-parse', '--symbolic-full-name'] + expected_refs, cwd=cwd).splitlines()
1675 self.assertEqual(sorted(set(full_expected)), sorted(set(actual_refs)))
1676
1677 def assertRevCount(self, expected_count, args=None, cwd=None):
1678 if args is None:
1679 args = ['HEAD']
1680 if cwd is None:
1681 cwd = self.gitdir
1682 revs = self.git(['rev-list'] + args, cwd=cwd)
1683 actual_count = len(revs.splitlines())
1684 self.assertEqual(expected_count, actual_count, msg='Object count `%d` is not the expected `%d`' % (actual_count, expected_count))
1685
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001686 def add_empty_file(self, path, cwd=None, msg=None):
1687 if msg is None:
1688 msg = path
1689 if cwd is None:
1690 cwd = self.srcdir
1691 open(os.path.join(cwd, path), 'w').close()
1692 self.git(['add', path], cwd)
1693 self.git(['commit', '-m', msg, path], cwd)
1694
1695 def fetch(self, uri=None):
1696 if uri is None:
Brad Bishop19323692019-04-05 15:28:33 -04001697 uris = self.d.getVar('SRC_URI').split()
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001698 uri = uris[0]
1699 d = self.d
1700 else:
1701 d = self.d.createCopy()
1702 d.setVar('SRC_URI', uri)
1703 uri = d.expand(uri)
1704 uris = [uri]
1705
1706 fetcher = bb.fetch2.Fetch(uris, d)
1707 fetcher.download()
1708 ud = fetcher.ud[uri]
1709 return fetcher, ud
1710
1711 def fetch_and_unpack(self, uri=None):
1712 fetcher, ud = self.fetch(uri)
1713 fetcher.unpack(self.d.getVar('WORKDIR'))
1714 assert os.path.exists(self.d.getVar('S'))
1715 return fetcher, ud
1716
1717 def fetch_shallow(self, uri=None, disabled=False, keepclone=False):
1718 """Fetch a uri, generating a shallow tarball, then unpack using it"""
1719 fetcher, ud = self.fetch_and_unpack(uri)
1720 assert os.path.exists(ud.clonedir), 'Git clone in DLDIR (%s) does not exist for uri %s' % (ud.clonedir, uri)
1721
1722 # Confirm that the unpacked repo is unshallow
1723 if not disabled:
1724 assert os.path.exists(os.path.join(self.dldir, ud.mirrortarballs[0]))
1725
1726 # fetch and unpack, from the shallow tarball
1727 bb.utils.remove(self.gitdir, recurse=True)
Andrew Geisslerc926e172021-05-07 16:11:35 -05001728 bb.process.run('chmod u+w -R "%s"' % ud.clonedir)
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001729 bb.utils.remove(ud.clonedir, recurse=True)
Brad Bishopf8caae32019-03-25 13:13:56 -04001730 bb.utils.remove(ud.clonedir.replace('gitsource', 'gitsubmodule'), recurse=True)
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001731
1732 # confirm that the unpacked repo is used when no git clone or git
1733 # mirror tarball is available
1734 fetcher, ud = self.fetch_and_unpack(uri)
1735 if not disabled:
1736 assert os.path.exists(os.path.join(self.gitdir, '.git', 'shallow')), 'Unpacked git repository at %s is not shallow' % self.gitdir
1737 else:
1738 assert not os.path.exists(os.path.join(self.gitdir, '.git', 'shallow')), 'Unpacked git repository at %s is shallow' % self.gitdir
1739 return fetcher, ud
1740
1741 def test_shallow_disabled(self):
1742 self.add_empty_file('a')
1743 self.add_empty_file('b')
1744 self.assertRevCount(2, cwd=self.srcdir)
1745
1746 self.d.setVar('BB_GIT_SHALLOW', '0')
1747 self.fetch_shallow(disabled=True)
1748 self.assertRevCount(2)
1749
1750 def test_shallow_nobranch(self):
1751 self.add_empty_file('a')
1752 self.add_empty_file('b')
1753 self.assertRevCount(2, cwd=self.srcdir)
1754
1755 srcrev = self.git('rev-parse HEAD', cwd=self.srcdir).strip()
1756 self.d.setVar('SRCREV', srcrev)
Brad Bishop19323692019-04-05 15:28:33 -04001757 uri = self.d.getVar('SRC_URI').split()[0]
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001758 uri = '%s;nobranch=1;bare=1' % uri
1759
1760 self.fetch_shallow(uri)
1761 self.assertRevCount(1)
1762
1763 # shallow refs are used to ensure the srcrev sticks around when we
1764 # have no other branches referencing it
1765 self.assertRefs(['refs/shallow/default'])
1766
1767 def test_shallow_default_depth_1(self):
1768 # Create initial git repo
1769 self.add_empty_file('a')
1770 self.add_empty_file('b')
1771 self.assertRevCount(2, cwd=self.srcdir)
1772
1773 self.fetch_shallow()
1774 self.assertRevCount(1)
1775
1776 def test_shallow_depth_0_disables(self):
1777 self.add_empty_file('a')
1778 self.add_empty_file('b')
1779 self.assertRevCount(2, cwd=self.srcdir)
1780
1781 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
1782 self.fetch_shallow(disabled=True)
1783 self.assertRevCount(2)
1784
1785 def test_shallow_depth_default_override(self):
1786 self.add_empty_file('a')
1787 self.add_empty_file('b')
1788 self.assertRevCount(2, cwd=self.srcdir)
1789
1790 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '2')
1791 self.d.setVar('BB_GIT_SHALLOW_DEPTH_default', '1')
1792 self.fetch_shallow()
1793 self.assertRevCount(1)
1794
1795 def test_shallow_depth_default_override_disable(self):
1796 self.add_empty_file('a')
1797 self.add_empty_file('b')
1798 self.add_empty_file('c')
1799 self.assertRevCount(3, cwd=self.srcdir)
1800
1801 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
1802 self.d.setVar('BB_GIT_SHALLOW_DEPTH_default', '2')
1803 self.fetch_shallow()
1804 self.assertRevCount(2)
1805
1806 def test_current_shallow_out_of_date_clone(self):
1807 # Create initial git repo
1808 self.add_empty_file('a')
1809 self.add_empty_file('b')
1810 self.add_empty_file('c')
1811 self.assertRevCount(3, cwd=self.srcdir)
1812
1813 # Clone and generate mirror tarball
1814 fetcher, ud = self.fetch()
1815
1816 # Ensure we have a current mirror tarball, but an out of date clone
1817 self.git('update-ref refs/heads/master refs/heads/master~1', cwd=ud.clonedir)
1818 self.assertRevCount(2, cwd=ud.clonedir)
1819
1820 # Fetch and unpack, from the current tarball, not the out of date clone
1821 bb.utils.remove(self.gitdir, recurse=True)
1822 fetcher, ud = self.fetch()
1823 fetcher.unpack(self.d.getVar('WORKDIR'))
1824 self.assertRevCount(1)
1825
1826 def test_shallow_single_branch_no_merge(self):
1827 self.add_empty_file('a')
1828 self.add_empty_file('b')
1829 self.assertRevCount(2, cwd=self.srcdir)
1830
1831 self.fetch_shallow()
1832 self.assertRevCount(1)
1833 assert os.path.exists(os.path.join(self.gitdir, 'a'))
1834 assert os.path.exists(os.path.join(self.gitdir, 'b'))
1835
1836 def test_shallow_no_dangling(self):
1837 self.add_empty_file('a')
1838 self.add_empty_file('b')
1839 self.assertRevCount(2, cwd=self.srcdir)
1840
1841 self.fetch_shallow()
1842 self.assertRevCount(1)
1843 assert not self.git('fsck --dangling')
1844
1845 def test_shallow_srcrev_branch_truncation(self):
1846 self.add_empty_file('a')
1847 self.add_empty_file('b')
1848 b_commit = self.git('rev-parse HEAD', cwd=self.srcdir).rstrip()
1849 self.add_empty_file('c')
1850 self.assertRevCount(3, cwd=self.srcdir)
1851
1852 self.d.setVar('SRCREV', b_commit)
1853 self.fetch_shallow()
1854
1855 # The 'c' commit was removed entirely, and 'a' was removed from history
1856 self.assertRevCount(1, ['--all'])
1857 self.assertEqual(self.git('rev-parse HEAD').strip(), b_commit)
1858 assert os.path.exists(os.path.join(self.gitdir, 'a'))
1859 assert os.path.exists(os.path.join(self.gitdir, 'b'))
1860 assert not os.path.exists(os.path.join(self.gitdir, 'c'))
1861
1862 def test_shallow_ref_pruning(self):
1863 self.add_empty_file('a')
1864 self.add_empty_file('b')
1865 self.git('branch a_branch', cwd=self.srcdir)
1866 self.assertRefs(['master', 'a_branch'], cwd=self.srcdir)
1867 self.assertRevCount(2, cwd=self.srcdir)
1868
1869 self.fetch_shallow()
1870
1871 self.assertRefs(['master', 'origin/master'])
1872 self.assertRevCount(1)
1873
1874 def test_shallow_submodules(self):
1875 self.add_empty_file('a')
1876 self.add_empty_file('b')
1877
1878 smdir = os.path.join(self.tempdir, 'gitsubmodule')
1879 bb.utils.mkdirhier(smdir)
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001880 self.git_init(cwd=smdir)
Brad Bishop1a4b7ee2018-12-16 17:11:34 -08001881 # Make this look like it was cloned from a remote...
1882 self.git('config --add remote.origin.url "%s"' % smdir, cwd=smdir)
1883 self.git('config --add remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"', cwd=smdir)
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001884 self.add_empty_file('asub', cwd=smdir)
Brad Bishopf8caae32019-03-25 13:13:56 -04001885 self.add_empty_file('bsub', cwd=smdir)
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001886
1887 self.git('submodule init', cwd=self.srcdir)
Patrick Williams2390b1b2022-11-03 13:47:49 -05001888 self.git('-c protocol.file.allow=always submodule add file://%s' % smdir, cwd=self.srcdir)
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001889 self.git('submodule update', cwd=self.srcdir)
1890 self.git('commit -m submodule -a', cwd=self.srcdir)
1891
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001892 uri = 'gitsm://%s;protocol=file;subdir=${S};branch=master' % self.srcdir
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001893 fetcher, ud = self.fetch_shallow(uri)
1894
Brad Bishopf8caae32019-03-25 13:13:56 -04001895 # Verify the main repository is shallow
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001896 self.assertRevCount(1)
Brad Bishopf8caae32019-03-25 13:13:56 -04001897
1898 # Verify the gitsubmodule directory is present
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001899 assert os.listdir(os.path.join(self.gitdir, 'gitsubmodule'))
1900
Brad Bishopf8caae32019-03-25 13:13:56 -04001901 # Verify the submodule is also shallow
1902 self.assertRevCount(1, cwd=os.path.join(self.gitdir, 'gitsubmodule'))
1903
Andrew Geissler82c905d2020-04-13 13:39:40 -05001904 def test_shallow_submodule_mirrors(self):
1905 self.add_empty_file('a')
1906 self.add_empty_file('b')
1907
1908 smdir = os.path.join(self.tempdir, 'gitsubmodule')
1909 bb.utils.mkdirhier(smdir)
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001910 self.git_init(cwd=smdir)
Andrew Geissler82c905d2020-04-13 13:39:40 -05001911 # Make this look like it was cloned from a remote...
1912 self.git('config --add remote.origin.url "%s"' % smdir, cwd=smdir)
1913 self.git('config --add remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"', cwd=smdir)
1914 self.add_empty_file('asub', cwd=smdir)
1915 self.add_empty_file('bsub', cwd=smdir)
1916
1917 self.git('submodule init', cwd=self.srcdir)
Patrick Williams2390b1b2022-11-03 13:47:49 -05001918 self.git('-c protocol.file.allow=always submodule add file://%s' % smdir, cwd=self.srcdir)
Andrew Geissler82c905d2020-04-13 13:39:40 -05001919 self.git('submodule update', cwd=self.srcdir)
1920 self.git('commit -m submodule -a', cwd=self.srcdir)
1921
1922 uri = 'gitsm://%s;protocol=file;subdir=${S}' % self.srcdir
1923
1924 # Fetch once to generate the shallow tarball
1925 fetcher, ud = self.fetch(uri)
1926
1927 # Set up the mirror
1928 mirrordir = os.path.join(self.tempdir, 'mirror')
Andrew Geisslerc926e172021-05-07 16:11:35 -05001929 bb.utils.rename(self.dldir, mirrordir)
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001930 self.d.setVar('PREMIRRORS', 'gitsm://.*/.* file://%s/' % mirrordir)
Andrew Geissler82c905d2020-04-13 13:39:40 -05001931
1932 # Fetch from the mirror
1933 bb.utils.remove(self.dldir, recurse=True)
1934 bb.utils.remove(self.gitdir, recurse=True)
1935 self.fetch_and_unpack(uri)
1936
1937 # Verify the main repository is shallow
1938 self.assertRevCount(1)
1939
1940 # Verify the gitsubmodule directory is present
1941 assert os.listdir(os.path.join(self.gitdir, 'gitsubmodule'))
1942
1943 # Verify the submodule is also shallow
1944 self.assertRevCount(1, cwd=os.path.join(self.gitdir, 'gitsubmodule'))
Brad Bishopf8caae32019-03-25 13:13:56 -04001945
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001946 if any(os.path.exists(os.path.join(p, 'git-annex')) for p in os.environ.get('PATH').split(':')):
1947 def test_shallow_annex(self):
1948 self.add_empty_file('a')
1949 self.add_empty_file('b')
1950 self.git('annex init', cwd=self.srcdir)
1951 open(os.path.join(self.srcdir, 'c'), 'w').close()
1952 self.git('annex add c', cwd=self.srcdir)
Andrew Geisslerc926e172021-05-07 16:11:35 -05001953 self.git('commit --author "Foo Bar <foo@bar>" -m annex-c -a', cwd=self.srcdir)
1954 bb.process.run('chmod u+w -R %s' % self.srcdir)
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001955
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00001956 uri = 'gitannex://%s;protocol=file;subdir=${S};branch=master' % self.srcdir
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001957 fetcher, ud = self.fetch_shallow(uri)
1958
1959 self.assertRevCount(1)
1960 assert './.git/annex/' in bb.process.run('tar -tzf %s' % os.path.join(self.dldir, ud.mirrortarballs[0]))[0]
1961 assert os.path.exists(os.path.join(self.gitdir, 'c'))
1962
1963 def test_shallow_multi_one_uri(self):
1964 # Create initial git repo
1965 self.add_empty_file('a')
1966 self.add_empty_file('b')
1967 self.git('checkout -b a_branch', cwd=self.srcdir)
1968 self.add_empty_file('c')
1969 self.add_empty_file('d')
1970 self.git('checkout master', cwd=self.srcdir)
1971 self.git('tag v0.0 a_branch', cwd=self.srcdir)
1972 self.add_empty_file('e')
1973 self.git('merge --no-ff --no-edit a_branch', cwd=self.srcdir)
1974 self.add_empty_file('f')
1975 self.assertRevCount(7, cwd=self.srcdir)
1976
Brad Bishop19323692019-04-05 15:28:33 -04001977 uri = self.d.getVar('SRC_URI').split()[0]
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001978 uri = '%s;branch=master,a_branch;name=master,a_branch' % uri
1979
1980 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
1981 self.d.setVar('BB_GIT_SHALLOW_REVS', 'v0.0')
1982 self.d.setVar('SRCREV_master', '${AUTOREV}')
1983 self.d.setVar('SRCREV_a_branch', '${AUTOREV}')
1984
1985 self.fetch_shallow(uri)
1986
1987 self.assertRevCount(5)
1988 self.assertRefs(['master', 'origin/master', 'origin/a_branch'])
1989
1990 def test_shallow_multi_one_uri_depths(self):
1991 # Create initial git repo
1992 self.add_empty_file('a')
1993 self.add_empty_file('b')
1994 self.git('checkout -b a_branch', cwd=self.srcdir)
1995 self.add_empty_file('c')
1996 self.add_empty_file('d')
1997 self.git('checkout master', cwd=self.srcdir)
1998 self.add_empty_file('e')
1999 self.git('merge --no-ff --no-edit a_branch', cwd=self.srcdir)
2000 self.add_empty_file('f')
2001 self.assertRevCount(7, cwd=self.srcdir)
2002
Brad Bishop19323692019-04-05 15:28:33 -04002003 uri = self.d.getVar('SRC_URI').split()[0]
Brad Bishopd7bf8c12018-02-25 22:55:05 -05002004 uri = '%s;branch=master,a_branch;name=master,a_branch' % uri
2005
2006 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
2007 self.d.setVar('BB_GIT_SHALLOW_DEPTH_master', '3')
2008 self.d.setVar('BB_GIT_SHALLOW_DEPTH_a_branch', '1')
2009 self.d.setVar('SRCREV_master', '${AUTOREV}')
2010 self.d.setVar('SRCREV_a_branch', '${AUTOREV}')
2011
2012 self.fetch_shallow(uri)
2013
2014 self.assertRevCount(4, ['--all'])
2015 self.assertRefs(['master', 'origin/master', 'origin/a_branch'])
2016
2017 def test_shallow_clone_preferred_over_shallow(self):
2018 self.add_empty_file('a')
2019 self.add_empty_file('b')
2020
2021 # Fetch once to generate the shallow tarball
2022 fetcher, ud = self.fetch()
2023 assert os.path.exists(os.path.join(self.dldir, ud.mirrortarballs[0]))
2024
2025 # Fetch and unpack with both the clonedir and shallow tarball available
2026 bb.utils.remove(self.gitdir, recurse=True)
2027 fetcher, ud = self.fetch_and_unpack()
2028
2029 # The unpacked tree should *not* be shallow
2030 self.assertRevCount(2)
2031 assert not os.path.exists(os.path.join(self.gitdir, '.git', 'shallow'))
2032
2033 def test_shallow_mirrors(self):
2034 self.add_empty_file('a')
2035 self.add_empty_file('b')
2036
2037 # Fetch once to generate the shallow tarball
2038 fetcher, ud = self.fetch()
2039 mirrortarball = ud.mirrortarballs[0]
2040 assert os.path.exists(os.path.join(self.dldir, mirrortarball))
2041
2042 # Set up the mirror
2043 mirrordir = os.path.join(self.tempdir, 'mirror')
2044 bb.utils.mkdirhier(mirrordir)
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002045 self.d.setVar('PREMIRRORS', 'git://.*/.* file://%s/' % mirrordir)
Brad Bishopd7bf8c12018-02-25 22:55:05 -05002046
Andrew Geisslerc926e172021-05-07 16:11:35 -05002047 bb.utils.rename(os.path.join(self.dldir, mirrortarball),
Brad Bishopd7bf8c12018-02-25 22:55:05 -05002048 os.path.join(mirrordir, mirrortarball))
2049
2050 # Fetch from the mirror
2051 bb.utils.remove(self.dldir, recurse=True)
2052 bb.utils.remove(self.gitdir, recurse=True)
2053 self.fetch_and_unpack()
2054 self.assertRevCount(1)
2055
2056 def test_shallow_invalid_depth(self):
2057 self.add_empty_file('a')
2058 self.add_empty_file('b')
2059
2060 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '-12')
2061 with self.assertRaises(bb.fetch2.FetchError):
2062 self.fetch()
2063
2064 def test_shallow_invalid_depth_default(self):
2065 self.add_empty_file('a')
2066 self.add_empty_file('b')
2067
2068 self.d.setVar('BB_GIT_SHALLOW_DEPTH_default', '-12')
2069 with self.assertRaises(bb.fetch2.FetchError):
2070 self.fetch()
2071
2072 def test_shallow_extra_refs(self):
2073 self.add_empty_file('a')
2074 self.add_empty_file('b')
2075 self.git('branch a_branch', cwd=self.srcdir)
2076 self.assertRefs(['master', 'a_branch'], cwd=self.srcdir)
2077 self.assertRevCount(2, cwd=self.srcdir)
2078
2079 self.d.setVar('BB_GIT_SHALLOW_EXTRA_REFS', 'refs/heads/a_branch')
2080 self.fetch_shallow()
2081
2082 self.assertRefs(['master', 'origin/master', 'origin/a_branch'])
2083 self.assertRevCount(1)
2084
2085 def test_shallow_extra_refs_wildcard(self):
2086 self.add_empty_file('a')
2087 self.add_empty_file('b')
2088 self.git('branch a_branch', cwd=self.srcdir)
2089 self.git('tag v1.0', cwd=self.srcdir)
2090 self.assertRefs(['master', 'a_branch', 'v1.0'], cwd=self.srcdir)
2091 self.assertRevCount(2, cwd=self.srcdir)
2092
2093 self.d.setVar('BB_GIT_SHALLOW_EXTRA_REFS', 'refs/tags/*')
2094 self.fetch_shallow()
2095
2096 self.assertRefs(['master', 'origin/master', 'v1.0'])
2097 self.assertRevCount(1)
2098
2099 def test_shallow_missing_extra_refs(self):
2100 self.add_empty_file('a')
2101 self.add_empty_file('b')
2102
2103 self.d.setVar('BB_GIT_SHALLOW_EXTRA_REFS', 'refs/heads/foo')
2104 with self.assertRaises(bb.fetch2.FetchError):
2105 self.fetch()
2106
2107 def test_shallow_missing_extra_refs_wildcard(self):
2108 self.add_empty_file('a')
2109 self.add_empty_file('b')
2110
2111 self.d.setVar('BB_GIT_SHALLOW_EXTRA_REFS', 'refs/tags/*')
2112 self.fetch()
2113
2114 def test_shallow_remove_revs(self):
2115 # Create initial git repo
2116 self.add_empty_file('a')
2117 self.add_empty_file('b')
2118 self.git('checkout -b a_branch', cwd=self.srcdir)
2119 self.add_empty_file('c')
2120 self.add_empty_file('d')
2121 self.git('checkout master', cwd=self.srcdir)
2122 self.git('tag v0.0 a_branch', cwd=self.srcdir)
2123 self.add_empty_file('e')
2124 self.git('merge --no-ff --no-edit a_branch', cwd=self.srcdir)
2125 self.git('branch -d a_branch', cwd=self.srcdir)
2126 self.add_empty_file('f')
2127 self.assertRevCount(7, cwd=self.srcdir)
2128
2129 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
2130 self.d.setVar('BB_GIT_SHALLOW_REVS', 'v0.0')
2131
2132 self.fetch_shallow()
2133
2134 self.assertRevCount(5)
2135
2136 def test_shallow_invalid_revs(self):
2137 self.add_empty_file('a')
2138 self.add_empty_file('b')
2139
2140 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
2141 self.d.setVar('BB_GIT_SHALLOW_REVS', 'v0.0')
2142
2143 with self.assertRaises(bb.fetch2.FetchError):
2144 self.fetch()
2145
Brad Bishop64c979e2019-11-04 13:55:29 -05002146 def test_shallow_fetch_missing_revs(self):
2147 self.add_empty_file('a')
2148 self.add_empty_file('b')
2149 fetcher, ud = self.fetch(self.d.getVar('SRC_URI'))
2150 self.git('tag v0.0 master', cwd=self.srcdir)
2151 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
2152 self.d.setVar('BB_GIT_SHALLOW_REVS', 'v0.0')
2153 self.fetch_shallow()
2154
2155 def test_shallow_fetch_missing_revs_fails(self):
2156 self.add_empty_file('a')
2157 self.add_empty_file('b')
2158 fetcher, ud = self.fetch(self.d.getVar('SRC_URI'))
2159 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
2160 self.d.setVar('BB_GIT_SHALLOW_REVS', 'v0.0')
2161
2162 with self.assertRaises(bb.fetch2.FetchError), self.assertLogs("BitBake.Fetcher", level="ERROR") as cm:
2163 self.fetch_shallow()
2164 self.assertIn("Unable to find revision v0.0 even from upstream", cm.output[0])
2165
Brad Bishopd7bf8c12018-02-25 22:55:05 -05002166 @skipIfNoNetwork()
2167 def test_bitbake(self):
Andrew Geissler595f6302022-01-24 19:11:47 +00002168 self.git('remote add --mirror=fetch origin https://github.com/openembedded/bitbake', cwd=self.srcdir)
Brad Bishopd7bf8c12018-02-25 22:55:05 -05002169 self.git('config core.bare true', cwd=self.srcdir)
2170 self.git('fetch', cwd=self.srcdir)
2171
2172 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
2173 # Note that the 1.10.0 tag is annotated, so this also tests
2174 # reference of an annotated vs unannotated tag
2175 self.d.setVar('BB_GIT_SHALLOW_REVS', '1.10.0')
2176
2177 self.fetch_shallow()
2178
2179 # Confirm that the history of 1.10.0 was removed
2180 orig_revs = len(self.git('rev-list master', cwd=self.srcdir).splitlines())
2181 revs = len(self.git('rev-list master').splitlines())
2182 self.assertNotEqual(orig_revs, revs)
2183 self.assertRefs(['master', 'origin/master'])
2184 self.assertRevCount(orig_revs - 1758)
Brad Bishop1a4b7ee2018-12-16 17:11:34 -08002185
2186 def test_that_unpack_throws_an_error_when_the_git_clone_nor_shallow_tarball_exist(self):
2187 self.add_empty_file('a')
2188 fetcher, ud = self.fetch()
2189 bb.utils.remove(self.gitdir, recurse=True)
2190 bb.utils.remove(self.dldir, recurse=True)
2191
2192 with self.assertRaises(bb.fetch2.UnpackError) as context:
2193 fetcher.unpack(self.d.getVar('WORKDIR'))
2194
2195 self.assertIn("No up to date source found", context.exception.msg)
2196 self.assertIn("clone directory not available or not up to date", context.exception.msg)
2197
2198 @skipIfNoNetwork()
2199 def test_that_unpack_does_work_when_using_git_shallow_tarball_but_tarball_is_not_available(self):
2200 self.d.setVar('SRCREV', 'e5939ff608b95cdd4d0ab0e1935781ab9a276ac0')
2201 self.d.setVar('BB_GIT_SHALLOW', '1')
2202 self.d.setVar('BB_GENERATE_SHALLOW_TARBALLS', '1')
Andrew Geissler028142b2023-05-05 11:29:21 -05002203 fetcher = bb.fetch.Fetch(["git://git.yoctoproject.org/fstests;branch=master;protocol=https"], self.d)
Brad Bishop1a4b7ee2018-12-16 17:11:34 -08002204 fetcher.download()
2205
2206 bb.utils.remove(self.dldir + "/*.tar.gz")
2207 fetcher.unpack(self.unpackdir)
2208
2209 dir = os.listdir(self.unpackdir + "/git/")
2210 self.assertIn("fstests.doap", dir)
Brad Bishop00e122a2019-10-05 11:10:57 -04002211
2212class GitLfsTest(FetcherTest):
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06002213 def skipIfNoGitLFS():
2214 import shutil
2215 if not shutil.which('git-lfs'):
2216 return unittest.skip('git-lfs not installed')
2217 return lambda f: f
2218
Brad Bishop00e122a2019-10-05 11:10:57 -04002219 def setUp(self):
2220 FetcherTest.setUp(self)
2221
2222 self.gitdir = os.path.join(self.tempdir, 'git')
2223 self.srcdir = os.path.join(self.tempdir, 'gitsource')
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002224
Brad Bishop00e122a2019-10-05 11:10:57 -04002225 self.d.setVar('WORKDIR', self.tempdir)
2226 self.d.setVar('S', self.gitdir)
2227 self.d.delVar('PREMIRRORS')
2228 self.d.delVar('MIRRORS')
2229
2230 self.d.setVar('SRCREV', '${AUTOREV}')
2231 self.d.setVar('AUTOREV', '${@bb.fetch2.get_autorev(d)}')
Andrew Geisslerfc113ea2023-03-31 09:59:46 -05002232 self.d.setVar("__BBSRCREV_SEEN", "1")
Brad Bishop00e122a2019-10-05 11:10:57 -04002233
2234 bb.utils.mkdirhier(self.srcdir)
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002235 self.git_init(cwd=self.srcdir)
Brad Bishop00e122a2019-10-05 11:10:57 -04002236 with open(os.path.join(self.srcdir, '.gitattributes'), 'wt') as attrs:
2237 attrs.write('*.mp3 filter=lfs -text')
2238 self.git(['add', '.gitattributes'], cwd=self.srcdir)
2239 self.git(['commit', '-m', "attributes", '.gitattributes'], cwd=self.srcdir)
2240
Andrew Geisslerd1e89492021-02-12 15:35:20 -06002241 def fetch(self, uri=None, download=True):
Brad Bishop00e122a2019-10-05 11:10:57 -04002242 uris = self.d.getVar('SRC_URI').split()
2243 uri = uris[0]
2244 d = self.d
2245
2246 fetcher = bb.fetch2.Fetch(uris, d)
Andrew Geisslerd1e89492021-02-12 15:35:20 -06002247 if download:
2248 fetcher.download()
Brad Bishop00e122a2019-10-05 11:10:57 -04002249 ud = fetcher.ud[uri]
2250 return fetcher, ud
2251
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06002252 def get_real_git_lfs_file(self):
2253 self.d.setVar('PATH', os.environ.get('PATH'))
2254 fetcher, ud = self.fetch()
2255 fetcher.unpack(self.d.getVar('WORKDIR'))
2256 unpacked_lfs_file = os.path.join(self.d.getVar('WORKDIR'), 'git', "Cat_poster_1.jpg")
2257 return unpacked_lfs_file
2258
2259 @skipIfNoGitLFS()
2260 @skipIfNoNetwork()
2261 def test_real_git_lfs_repo_succeeds_without_lfs_param(self):
2262 self.d.setVar('SRC_URI', "git://gitlab.com/gitlab-examples/lfs.git;protocol=https;branch=master")
2263 f = self.get_real_git_lfs_file()
2264 self.assertTrue(os.path.exists(f))
2265 self.assertEqual("c0baab607a97839c9a328b4310713307", bb.utils.md5_file(f))
2266
2267 @skipIfNoGitLFS()
2268 @skipIfNoNetwork()
2269 def test_real_git_lfs_repo_succeeds(self):
2270 self.d.setVar('SRC_URI', "git://gitlab.com/gitlab-examples/lfs.git;protocol=https;branch=master;lfs=1")
2271 f = self.get_real_git_lfs_file()
2272 self.assertTrue(os.path.exists(f))
2273 self.assertEqual("c0baab607a97839c9a328b4310713307", bb.utils.md5_file(f))
2274
2275 @skipIfNoGitLFS()
2276 @skipIfNoNetwork()
2277 def test_real_git_lfs_repo_succeeds(self):
2278 self.d.setVar('SRC_URI', "git://gitlab.com/gitlab-examples/lfs.git;protocol=https;branch=master;lfs=0")
2279 f = self.get_real_git_lfs_file()
2280 # This is the actual non-smudged placeholder file on the repo if git-lfs does not run
2281 lfs_file = (
2282 'version https://git-lfs.github.com/spec/v1\n'
2283 'oid sha256:34be66b1a39a1955b46a12588df9d5f6fc1da790e05cf01f3c7422f4bbbdc26b\n'
2284 'size 11423554\n'
2285 )
2286
2287 with open(f) as fh:
2288 self.assertEqual(lfs_file, fh.read())
2289
Brad Bishop00e122a2019-10-05 11:10:57 -04002290 def test_lfs_enabled(self):
2291 import shutil
2292
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002293 uri = 'git://%s;protocol=file;lfs=1;branch=master' % self.srcdir
Brad Bishop00e122a2019-10-05 11:10:57 -04002294 self.d.setVar('SRC_URI', uri)
2295
Andrew Geisslerd1e89492021-02-12 15:35:20 -06002296 # Careful: suppress initial attempt at downloading until
2297 # we know whether git-lfs is installed.
2298 fetcher, ud = self.fetch(uri=None, download=False)
Brad Bishop00e122a2019-10-05 11:10:57 -04002299 self.assertIsNotNone(ud.method._find_git_lfs)
2300
Andrew Geisslerd1e89492021-02-12 15:35:20 -06002301 # If git-lfs can be found, the unpack should be successful. Only
2302 # attempt this with the real live copy of git-lfs installed.
2303 if ud.method._find_git_lfs(self.d):
2304 fetcher.download()
2305 shutil.rmtree(self.gitdir, ignore_errors=True)
2306 fetcher.unpack(self.d.getVar('WORKDIR'))
Brad Bishop00e122a2019-10-05 11:10:57 -04002307
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06002308 old_find_git_lfs = ud.method._find_git_lfs
2309 try:
2310 # If git-lfs cannot be found, the unpack should throw an error
2311 with self.assertRaises(bb.fetch2.FetchError):
2312 fetcher.download()
2313 ud.method._find_git_lfs = lambda d: False
2314 shutil.rmtree(self.gitdir, ignore_errors=True)
2315 fetcher.unpack(self.d.getVar('WORKDIR'))
2316 finally:
2317 ud.method._find_git_lfs = old_find_git_lfs
Brad Bishop00e122a2019-10-05 11:10:57 -04002318
2319 def test_lfs_disabled(self):
2320 import shutil
2321
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002322 uri = 'git://%s;protocol=file;lfs=0;branch=master' % self.srcdir
Brad Bishop00e122a2019-10-05 11:10:57 -04002323 self.d.setVar('SRC_URI', uri)
2324
Andrew Geisslerd1e89492021-02-12 15:35:20 -06002325 # In contrast to test_lfs_enabled(), allow the implicit download
2326 # done by self.fetch() to occur here. The point of this test case
2327 # is to verify that the fetcher can survive even if the source
2328 # repository has Git LFS usage configured.
Brad Bishop00e122a2019-10-05 11:10:57 -04002329 fetcher, ud = self.fetch()
2330 self.assertIsNotNone(ud.method._find_git_lfs)
2331
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06002332 old_find_git_lfs = ud.method._find_git_lfs
2333 try:
2334 # If git-lfs can be found, the unpack should be successful. A
2335 # live copy of git-lfs is not required for this case, so
2336 # unconditionally forge its presence.
2337 ud.method._find_git_lfs = lambda d: True
2338 shutil.rmtree(self.gitdir, ignore_errors=True)
2339 fetcher.unpack(self.d.getVar('WORKDIR'))
2340 # If git-lfs cannot be found, the unpack should be successful
Brad Bishop00e122a2019-10-05 11:10:57 -04002341
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06002342 ud.method._find_git_lfs = lambda d: False
2343 shutil.rmtree(self.gitdir, ignore_errors=True)
2344 fetcher.unpack(self.d.getVar('WORKDIR'))
2345 finally:
2346 ud.method._find_git_lfs = old_find_git_lfs
Andrew Geissler82c905d2020-04-13 13:39:40 -05002347
Andrew Geisslerc3d88e42020-10-02 09:45:00 -05002348class GitURLWithSpacesTest(FetcherTest):
2349 test_git_urls = {
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002350 "git://tfs-example.org:22/tfs/example%20path/example.git;branch=master" : {
2351 'url': 'git://tfs-example.org:22/tfs/example%20path/example.git;branch=master',
Andrew Geisslerc3d88e42020-10-02 09:45:00 -05002352 'gitsrcname': 'tfs-example.org.22.tfs.example_path.example.git',
2353 'path': '/tfs/example path/example.git'
2354 },
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002355 "git://tfs-example.org:22/tfs/example%20path/example%20repo.git;branch=master" : {
2356 'url': 'git://tfs-example.org:22/tfs/example%20path/example%20repo.git;branch=master',
Andrew Geisslerc3d88e42020-10-02 09:45:00 -05002357 'gitsrcname': 'tfs-example.org.22.tfs.example_path.example_repo.git',
2358 'path': '/tfs/example path/example repo.git'
2359 }
2360 }
2361
2362 def test_urls(self):
2363
2364 # Set fake SRCREV to stop git fetcher from trying to contact non-existent git repo
2365 self.d.setVar('SRCREV', '82ea737a0b42a8b53e11c9cde141e9e9c0bd8c40')
2366
2367 for test_git_url, ref in self.test_git_urls.items():
2368
2369 fetcher = bb.fetch.Fetch([test_git_url], self.d)
2370 ud = fetcher.ud[fetcher.urls[0]]
2371
2372 self.assertEqual(ud.url, ref['url'])
2373 self.assertEqual(ud.path, ref['path'])
2374 self.assertEqual(ud.localfile, os.path.join(self.dldir, "git2", ref['gitsrcname']))
2375 self.assertEqual(ud.localpath, os.path.join(self.dldir, "git2", ref['gitsrcname']))
2376 self.assertEqual(ud.lockfile, os.path.join(self.dldir, "git2", ref['gitsrcname'] + '.lock'))
2377 self.assertEqual(ud.clonedir, os.path.join(self.dldir, "git2", ref['gitsrcname']))
2378 self.assertEqual(ud.fullmirror, os.path.join(self.dldir, "git2_" + ref['gitsrcname'] + '.tar.gz'))
2379
Andrew Geissler595f6302022-01-24 19:11:47 +00002380class CrateTest(FetcherTest):
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002381 @skipIfNoNetwork()
Andrew Geissler595f6302022-01-24 19:11:47 +00002382 def test_crate_url(self):
2383
2384 uri = "crate://crates.io/glob/0.2.11"
2385 self.d.setVar('SRC_URI', uri)
2386
2387 uris = self.d.getVar('SRC_URI').split()
2388 d = self.d
2389
2390 fetcher = bb.fetch2.Fetch(uris, self.d)
Andrew Geisslerfc113ea2023-03-31 09:59:46 -05002391 ud = fetcher.ud[fetcher.urls[0]]
2392
2393 self.assertIn("name", ud.parm)
Patrick Williams8e7b46e2023-05-01 14:19:06 -05002394 self.assertEqual(ud.parm["name"], "glob-0.2.11")
Andrew Geisslerfc113ea2023-03-31 09:59:46 -05002395 self.assertIn("downloadfilename", ud.parm)
2396 self.assertEqual(ud.parm["downloadfilename"], "glob-0.2.11.crate")
2397
Andrew Geissler595f6302022-01-24 19:11:47 +00002398 fetcher.download()
2399 fetcher.unpack(self.tempdir)
2400 self.assertEqual(sorted(os.listdir(self.tempdir)), ['cargo_home', 'download' , 'unpacked'])
2401 self.assertEqual(sorted(os.listdir(self.tempdir + "/download")), ['glob-0.2.11.crate', 'glob-0.2.11.crate.done'])
2402 self.assertTrue(os.path.exists(self.tempdir + "/cargo_home/bitbake/glob-0.2.11/.cargo-checksum.json"))
2403 self.assertTrue(os.path.exists(self.tempdir + "/cargo_home/bitbake/glob-0.2.11/src/lib.rs"))
2404
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002405 @skipIfNoNetwork()
Patrick Williamse760df82023-05-26 11:10:49 -05002406 def test_crate_url_matching_recipe(self):
2407
2408 self.d.setVar('BP', 'glob-0.2.11')
2409
2410 uri = "crate://crates.io/glob/0.2.11"
2411 self.d.setVar('SRC_URI', uri)
2412
2413 uris = self.d.getVar('SRC_URI').split()
2414 d = self.d
2415
2416 fetcher = bb.fetch2.Fetch(uris, self.d)
2417 ud = fetcher.ud[fetcher.urls[0]]
2418
2419 self.assertIn("name", ud.parm)
2420 self.assertEqual(ud.parm["name"], "glob-0.2.11")
2421 self.assertIn("downloadfilename", ud.parm)
2422 self.assertEqual(ud.parm["downloadfilename"], "glob-0.2.11.crate")
2423
2424 fetcher.download()
2425 fetcher.unpack(self.tempdir)
2426 self.assertEqual(sorted(os.listdir(self.tempdir)), ['download', 'glob-0.2.11', 'unpacked'])
2427 self.assertEqual(sorted(os.listdir(self.tempdir + "/download")), ['glob-0.2.11.crate', 'glob-0.2.11.crate.done'])
2428 self.assertTrue(os.path.exists(self.tempdir + "/glob-0.2.11/src/lib.rs"))
2429
2430 @skipIfNoNetwork()
Andrew Geisslerfc113ea2023-03-31 09:59:46 -05002431 def test_crate_url_params(self):
2432
2433 uri = "crate://crates.io/aho-corasick/0.7.20;name=aho-corasick-renamed"
2434 self.d.setVar('SRC_URI', uri)
2435
2436 uris = self.d.getVar('SRC_URI').split()
2437 d = self.d
2438
2439 fetcher = bb.fetch2.Fetch(uris, self.d)
2440 ud = fetcher.ud[fetcher.urls[0]]
2441
2442 self.assertIn("name", ud.parm)
2443 self.assertEqual(ud.parm["name"], "aho-corasick-renamed")
2444 self.assertIn("downloadfilename", ud.parm)
2445 self.assertEqual(ud.parm["downloadfilename"], "aho-corasick-0.7.20.crate")
2446
2447 fetcher.download()
2448 fetcher.unpack(self.tempdir)
2449 self.assertEqual(sorted(os.listdir(self.tempdir)), ['cargo_home', 'download' , 'unpacked'])
2450 self.assertEqual(sorted(os.listdir(self.tempdir + "/download")), ['aho-corasick-0.7.20.crate', 'aho-corasick-0.7.20.crate.done'])
2451 self.assertTrue(os.path.exists(self.tempdir + "/cargo_home/bitbake/aho-corasick-0.7.20/.cargo-checksum.json"))
2452 self.assertTrue(os.path.exists(self.tempdir + "/cargo_home/bitbake/aho-corasick-0.7.20/src/lib.rs"))
2453
2454 @skipIfNoNetwork()
Andrew Geissler595f6302022-01-24 19:11:47 +00002455 def test_crate_url_multi(self):
2456
2457 uri = "crate://crates.io/glob/0.2.11 crate://crates.io/time/0.1.35"
2458 self.d.setVar('SRC_URI', uri)
2459
2460 uris = self.d.getVar('SRC_URI').split()
2461 d = self.d
2462
2463 fetcher = bb.fetch2.Fetch(uris, self.d)
Andrew Geisslerfc113ea2023-03-31 09:59:46 -05002464 ud = fetcher.ud[fetcher.urls[0]]
2465
2466 self.assertIn("name", ud.parm)
Patrick Williams8e7b46e2023-05-01 14:19:06 -05002467 self.assertEqual(ud.parm["name"], "glob-0.2.11")
Andrew Geisslerfc113ea2023-03-31 09:59:46 -05002468 self.assertIn("downloadfilename", ud.parm)
2469 self.assertEqual(ud.parm["downloadfilename"], "glob-0.2.11.crate")
2470
2471 ud = fetcher.ud[fetcher.urls[1]]
2472 self.assertIn("name", ud.parm)
Patrick Williams8e7b46e2023-05-01 14:19:06 -05002473 self.assertEqual(ud.parm["name"], "time-0.1.35")
Andrew Geisslerfc113ea2023-03-31 09:59:46 -05002474 self.assertIn("downloadfilename", ud.parm)
2475 self.assertEqual(ud.parm["downloadfilename"], "time-0.1.35.crate")
2476
Andrew Geissler595f6302022-01-24 19:11:47 +00002477 fetcher.download()
2478 fetcher.unpack(self.tempdir)
2479 self.assertEqual(sorted(os.listdir(self.tempdir)), ['cargo_home', 'download' , 'unpacked'])
2480 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'])
2481 self.assertTrue(os.path.exists(self.tempdir + "/cargo_home/bitbake/glob-0.2.11/.cargo-checksum.json"))
2482 self.assertTrue(os.path.exists(self.tempdir + "/cargo_home/bitbake/glob-0.2.11/src/lib.rs"))
2483 self.assertTrue(os.path.exists(self.tempdir + "/cargo_home/bitbake/time-0.1.35/.cargo-checksum.json"))
2484 self.assertTrue(os.path.exists(self.tempdir + "/cargo_home/bitbake/time-0.1.35/src/lib.rs"))
2485
Andrew Geisslerfc113ea2023-03-31 09:59:46 -05002486 @skipIfNoNetwork()
2487 def test_crate_incorrect_cksum(self):
2488 uri = "crate://crates.io/aho-corasick/0.7.20"
2489 self.d.setVar('SRC_URI', uri)
Patrick Williams8e7b46e2023-05-01 14:19:06 -05002490 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 -05002491
2492 uris = self.d.getVar('SRC_URI').split()
2493
2494 fetcher = bb.fetch2.Fetch(uris, self.d)
Andrew Geissler8f840682023-07-21 09:09:43 -05002495 with self.assertRaisesRegex(bb.fetch2.FetchError, "Fetcher failure for URL"):
Andrew Geisslerfc113ea2023-03-31 09:59:46 -05002496 fetcher.download()
2497
Andrew Geissler82c905d2020-04-13 13:39:40 -05002498class NPMTest(FetcherTest):
2499 def skipIfNoNpm():
2500 import shutil
2501 if not shutil.which('npm'):
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002502 return unittest.skip('npm not installed')
Andrew Geissler82c905d2020-04-13 13:39:40 -05002503 return lambda f: f
2504
2505 @skipIfNoNpm()
2506 @skipIfNoNetwork()
2507 def test_npm(self):
2508 url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0'
2509 fetcher = bb.fetch.Fetch([url], self.d)
2510 ud = fetcher.ud[fetcher.urls[0]]
2511 fetcher.download()
2512 self.assertTrue(os.path.exists(ud.localpath))
2513 self.assertTrue(os.path.exists(ud.localpath + '.done'))
2514 self.assertTrue(os.path.exists(ud.resolvefile))
2515 fetcher.unpack(self.unpackdir)
2516 unpackdir = os.path.join(self.unpackdir, 'npm')
2517 self.assertTrue(os.path.exists(os.path.join(unpackdir, 'package.json')))
2518
2519 @skipIfNoNpm()
2520 @skipIfNoNetwork()
2521 def test_npm_bad_checksum(self):
2522 url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0'
2523 # Fetch once to get a tarball
2524 fetcher = bb.fetch.Fetch([url], self.d)
2525 ud = fetcher.ud[fetcher.urls[0]]
2526 fetcher.download()
2527 self.assertTrue(os.path.exists(ud.localpath))
2528 # Modify the tarball
2529 bad = b'bad checksum'
2530 with open(ud.localpath, 'wb') as f:
2531 f.write(bad)
2532 # Verify that the tarball is fetched again
2533 fetcher.download()
2534 badsum = hashlib.sha512(bad).hexdigest()
2535 self.assertTrue(os.path.exists(ud.localpath + '_bad-checksum_' + badsum))
2536 self.assertTrue(os.path.exists(ud.localpath))
2537
2538 @skipIfNoNpm()
2539 @skipIfNoNetwork()
2540 def test_npm_premirrors(self):
2541 url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0'
2542 # Fetch once to get a tarball
2543 fetcher = bb.fetch.Fetch([url], self.d)
2544 ud = fetcher.ud[fetcher.urls[0]]
2545 fetcher.download()
2546 self.assertTrue(os.path.exists(ud.localpath))
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002547
2548 # Setup the mirror by renaming the download directory
Andrew Geissler82c905d2020-04-13 13:39:40 -05002549 mirrordir = os.path.join(self.tempdir, 'mirror')
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002550 bb.utils.rename(self.dldir, mirrordir)
2551 os.mkdir(self.dldir)
2552
2553 # Configure the premirror to be used
2554 self.d.setVar('PREMIRRORS', 'https?$://.*/.* file://%s/npm2' % mirrordir)
Andrew Geissler82c905d2020-04-13 13:39:40 -05002555 self.d.setVar('BB_FETCH_PREMIRRORONLY', '1')
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002556
Andrew Geissler82c905d2020-04-13 13:39:40 -05002557 # Fetch again
2558 self.assertFalse(os.path.exists(ud.localpath))
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002559 # The npm fetcher doesn't handle that the .resolved file disappears
2560 # while the fetcher object exists, which it does when we rename the
2561 # download directory to "mirror" above. Thus we need a new fetcher to go
2562 # with the now empty download directory.
2563 fetcher = bb.fetch.Fetch([url], self.d)
2564 ud = fetcher.ud[fetcher.urls[0]]
Andrew Geissler82c905d2020-04-13 13:39:40 -05002565 fetcher.download()
2566 self.assertTrue(os.path.exists(ud.localpath))
2567
2568 @skipIfNoNpm()
2569 @skipIfNoNetwork()
Andrew Geissler5199d832021-09-24 16:47:35 -05002570 def test_npm_premirrors_with_specified_filename(self):
2571 url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0'
2572 # Fetch once to get a tarball
2573 fetcher = bb.fetch.Fetch([url], self.d)
2574 ud = fetcher.ud[fetcher.urls[0]]
2575 fetcher.download()
2576 self.assertTrue(os.path.exists(ud.localpath))
2577 # Setup the mirror
2578 mirrordir = os.path.join(self.tempdir, 'mirror')
2579 bb.utils.mkdirhier(mirrordir)
2580 mirrorfilename = os.path.join(mirrordir, os.path.basename(ud.localpath))
2581 os.replace(ud.localpath, mirrorfilename)
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002582 self.d.setVar('PREMIRRORS', 'https?$://.*/.* file://%s' % mirrorfilename)
Andrew Geissler5199d832021-09-24 16:47:35 -05002583 self.d.setVar('BB_FETCH_PREMIRRORONLY', '1')
2584 # Fetch again
2585 self.assertFalse(os.path.exists(ud.localpath))
2586 fetcher.download()
2587 self.assertTrue(os.path.exists(ud.localpath))
2588
2589 @skipIfNoNpm()
2590 @skipIfNoNetwork()
Andrew Geissler82c905d2020-04-13 13:39:40 -05002591 def test_npm_mirrors(self):
2592 # Fetch once to get a tarball
2593 url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0'
2594 fetcher = bb.fetch.Fetch([url], self.d)
2595 ud = fetcher.ud[fetcher.urls[0]]
2596 fetcher.download()
2597 self.assertTrue(os.path.exists(ud.localpath))
2598 # Setup the mirror
2599 mirrordir = os.path.join(self.tempdir, 'mirror')
2600 bb.utils.mkdirhier(mirrordir)
2601 os.replace(ud.localpath, os.path.join(mirrordir, os.path.basename(ud.localpath)))
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002602 self.d.setVar('MIRRORS', 'https?$://.*/.* file://%s/' % mirrordir)
Andrew Geissler82c905d2020-04-13 13:39:40 -05002603 # Update the resolved url to an invalid url
2604 with open(ud.resolvefile, 'r') as f:
2605 url = f.read()
2606 uri = URI(url)
2607 uri.path = '/invalid'
2608 with open(ud.resolvefile, 'w') as f:
2609 f.write(str(uri))
2610 # Fetch again
2611 self.assertFalse(os.path.exists(ud.localpath))
2612 fetcher.download()
2613 self.assertTrue(os.path.exists(ud.localpath))
2614
2615 @skipIfNoNpm()
2616 @skipIfNoNetwork()
2617 def test_npm_destsuffix_downloadfilename(self):
2618 url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0;destsuffix=foo/bar;downloadfilename=foo-bar.tgz'
2619 fetcher = bb.fetch.Fetch([url], self.d)
2620 fetcher.download()
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002621 self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'foo-bar.tgz')))
Andrew Geissler82c905d2020-04-13 13:39:40 -05002622 fetcher.unpack(self.unpackdir)
2623 unpackdir = os.path.join(self.unpackdir, 'foo', 'bar')
2624 self.assertTrue(os.path.exists(os.path.join(unpackdir, 'package.json')))
2625
2626 def test_npm_no_network_no_tarball(self):
2627 url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0'
2628 self.d.setVar('BB_NO_NETWORK', '1')
2629 fetcher = bb.fetch.Fetch([url], self.d)
2630 with self.assertRaises(bb.fetch2.NetworkAccess):
2631 fetcher.download()
2632
2633 @skipIfNoNpm()
2634 @skipIfNoNetwork()
2635 def test_npm_no_network_with_tarball(self):
2636 url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0'
2637 # Fetch once to get a tarball
2638 fetcher = bb.fetch.Fetch([url], self.d)
2639 fetcher.download()
2640 # Disable network access
2641 self.d.setVar('BB_NO_NETWORK', '1')
2642 # Fetch again
2643 fetcher.download()
2644 fetcher.unpack(self.unpackdir)
2645 unpackdir = os.path.join(self.unpackdir, 'npm')
2646 self.assertTrue(os.path.exists(os.path.join(unpackdir, 'package.json')))
2647
2648 @skipIfNoNpm()
2649 @skipIfNoNetwork()
2650 def test_npm_registry_alternate(self):
Andrew Geissler5199d832021-09-24 16:47:35 -05002651 url = 'npm://skimdb.npmjs.com;package=@savoirfairelinux/node-server-example;version=1.0.0'
Andrew Geissler82c905d2020-04-13 13:39:40 -05002652 fetcher = bb.fetch.Fetch([url], self.d)
2653 fetcher.download()
2654 fetcher.unpack(self.unpackdir)
2655 unpackdir = os.path.join(self.unpackdir, 'npm')
2656 self.assertTrue(os.path.exists(os.path.join(unpackdir, 'package.json')))
2657
2658 @skipIfNoNpm()
2659 @skipIfNoNetwork()
2660 def test_npm_version_latest(self):
2661 url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=latest'
2662 fetcher = bb.fetch.Fetch([url], self.d)
2663 fetcher.download()
2664 fetcher.unpack(self.unpackdir)
2665 unpackdir = os.path.join(self.unpackdir, 'npm')
2666 self.assertTrue(os.path.exists(os.path.join(unpackdir, 'package.json')))
2667
2668 @skipIfNoNpm()
2669 @skipIfNoNetwork()
2670 def test_npm_registry_invalid(self):
2671 url = 'npm://registry.invalid.org;package=@savoirfairelinux/node-server-example;version=1.0.0'
2672 fetcher = bb.fetch.Fetch([url], self.d)
2673 with self.assertRaises(bb.fetch2.FetchError):
2674 fetcher.download()
2675
2676 @skipIfNoNpm()
2677 @skipIfNoNetwork()
2678 def test_npm_package_invalid(self):
2679 url = 'npm://registry.npmjs.org;package=@savoirfairelinux/invalid;version=1.0.0'
2680 fetcher = bb.fetch.Fetch([url], self.d)
2681 with self.assertRaises(bb.fetch2.FetchError):
2682 fetcher.download()
2683
2684 @skipIfNoNpm()
2685 @skipIfNoNetwork()
2686 def test_npm_version_invalid(self):
2687 url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=invalid'
2688 with self.assertRaises(bb.fetch2.ParameterError):
2689 fetcher = bb.fetch.Fetch([url], self.d)
2690
2691 @skipIfNoNpm()
2692 @skipIfNoNetwork()
2693 def test_npm_registry_none(self):
2694 url = 'npm://;package=@savoirfairelinux/node-server-example;version=1.0.0'
2695 with self.assertRaises(bb.fetch2.MalformedUrl):
2696 fetcher = bb.fetch.Fetch([url], self.d)
2697
2698 @skipIfNoNpm()
2699 @skipIfNoNetwork()
2700 def test_npm_package_none(self):
2701 url = 'npm://registry.npmjs.org;version=1.0.0'
2702 with self.assertRaises(bb.fetch2.MissingParameterError):
2703 fetcher = bb.fetch.Fetch([url], self.d)
2704
2705 @skipIfNoNpm()
2706 @skipIfNoNetwork()
2707 def test_npm_version_none(self):
2708 url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example'
2709 with self.assertRaises(bb.fetch2.MissingParameterError):
2710 fetcher = bb.fetch.Fetch([url], self.d)
2711
2712 def create_shrinkwrap_file(self, data):
2713 import json
2714 datadir = os.path.join(self.tempdir, 'data')
2715 swfile = os.path.join(datadir, 'npm-shrinkwrap.json')
2716 bb.utils.mkdirhier(datadir)
2717 with open(swfile, 'w') as f:
2718 json.dump(data, f)
2719 # Also configure the S directory
2720 self.sdir = os.path.join(self.unpackdir, 'S')
2721 self.d.setVar('S', self.sdir)
2722 return swfile
2723
2724 @skipIfNoNpm()
2725 @skipIfNoNetwork()
2726 def test_npmsw(self):
2727 swfile = self.create_shrinkwrap_file({
2728 'dependencies': {
2729 'array-flatten': {
2730 'version': '1.1.1',
2731 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz',
2732 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=',
2733 'dependencies': {
2734 'content-type': {
2735 'version': 'https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz',
2736 'integrity': 'sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==',
2737 'dependencies': {
2738 'cookie': {
2739 'version': 'git+https://github.com/jshttp/cookie.git#aec1177c7da67e3b3273df96cf476824dbc9ae09',
2740 'from': 'git+https://github.com/jshttp/cookie.git'
2741 }
2742 }
2743 }
2744 }
2745 }
2746 }
2747 })
2748 fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d)
2749 fetcher.download()
2750 self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'array-flatten-1.1.1.tgz')))
2751 self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'content-type-1.0.4.tgz')))
2752 self.assertTrue(os.path.exists(os.path.join(self.dldir, 'git2', 'github.com.jshttp.cookie.git')))
2753 fetcher.unpack(self.unpackdir)
2754 self.assertTrue(os.path.exists(os.path.join(self.sdir, 'npm-shrinkwrap.json')))
2755 self.assertTrue(os.path.exists(os.path.join(self.sdir, 'node_modules', 'array-flatten', 'package.json')))
2756 self.assertTrue(os.path.exists(os.path.join(self.sdir, 'node_modules', 'array-flatten', 'node_modules', 'content-type', 'package.json')))
2757 self.assertTrue(os.path.exists(os.path.join(self.sdir, 'node_modules', 'array-flatten', 'node_modules', 'content-type', 'node_modules', 'cookie', 'package.json')))
2758
2759 @skipIfNoNpm()
2760 @skipIfNoNetwork()
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06002761 def test_npmsw_git(self):
2762 swfile = self.create_shrinkwrap_file({
2763 'dependencies': {
2764 'cookie': {
2765 'version': 'github:jshttp/cookie.git#aec1177c7da67e3b3273df96cf476824dbc9ae09',
2766 'from': 'github:jshttp/cookie.git'
2767 }
2768 }
2769 })
2770 fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d)
2771 fetcher.download()
2772 self.assertTrue(os.path.exists(os.path.join(self.dldir, 'git2', 'github.com.jshttp.cookie.git')))
2773
2774 swfile = self.create_shrinkwrap_file({
2775 'dependencies': {
2776 'cookie': {
2777 'version': 'jshttp/cookie.git#aec1177c7da67e3b3273df96cf476824dbc9ae09',
2778 'from': 'jshttp/cookie.git'
2779 }
2780 }
2781 })
2782 fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d)
2783 fetcher.download()
2784 self.assertTrue(os.path.exists(os.path.join(self.dldir, 'git2', 'github.com.jshttp.cookie.git')))
2785
2786 swfile = self.create_shrinkwrap_file({
2787 'dependencies': {
2788 'nodejs': {
2789 'version': 'gitlab:gitlab-examples/nodejs.git#892a1f16725e56cc3a2cb0d677be42935c8fc262',
2790 'from': 'gitlab:gitlab-examples/nodejs'
2791 }
2792 }
2793 })
2794 fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d)
2795 fetcher.download()
2796 self.assertTrue(os.path.exists(os.path.join(self.dldir, 'git2', 'gitlab.com.gitlab-examples.nodejs.git')))
2797
2798 @skipIfNoNpm()
2799 @skipIfNoNetwork()
Andrew Geissler82c905d2020-04-13 13:39:40 -05002800 def test_npmsw_dev(self):
2801 swfile = self.create_shrinkwrap_file({
2802 'dependencies': {
2803 'array-flatten': {
2804 'version': '1.1.1',
2805 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz',
2806 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI='
2807 },
2808 'content-type': {
2809 'version': '1.0.4',
2810 'resolved': 'https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz',
2811 'integrity': 'sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==',
2812 'dev': True
2813 }
2814 }
2815 })
2816 # Fetch with dev disabled
2817 fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d)
2818 fetcher.download()
2819 self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'array-flatten-1.1.1.tgz')))
2820 self.assertFalse(os.path.exists(os.path.join(self.dldir, 'npm2', 'content-type-1.0.4.tgz')))
2821 # Fetch with dev enabled
2822 fetcher = bb.fetch.Fetch(['npmsw://' + swfile + ';dev=1'], self.d)
2823 fetcher.download()
2824 self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'array-flatten-1.1.1.tgz')))
2825 self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'content-type-1.0.4.tgz')))
2826
2827 @skipIfNoNpm()
2828 @skipIfNoNetwork()
2829 def test_npmsw_destsuffix(self):
2830 swfile = self.create_shrinkwrap_file({
2831 'dependencies': {
2832 'array-flatten': {
2833 'version': '1.1.1',
2834 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz',
2835 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI='
2836 }
2837 }
2838 })
2839 fetcher = bb.fetch.Fetch(['npmsw://' + swfile + ';destsuffix=foo/bar'], self.d)
2840 fetcher.download()
2841 fetcher.unpack(self.unpackdir)
2842 self.assertTrue(os.path.exists(os.path.join(self.unpackdir, 'foo', 'bar', 'node_modules', 'array-flatten', 'package.json')))
2843
2844 def test_npmsw_no_network_no_tarball(self):
2845 swfile = self.create_shrinkwrap_file({
2846 'dependencies': {
2847 'array-flatten': {
2848 'version': '1.1.1',
2849 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz',
2850 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI='
2851 }
2852 }
2853 })
2854 self.d.setVar('BB_NO_NETWORK', '1')
2855 fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d)
2856 with self.assertRaises(bb.fetch2.NetworkAccess):
2857 fetcher.download()
2858
2859 @skipIfNoNpm()
2860 @skipIfNoNetwork()
2861 def test_npmsw_no_network_with_tarball(self):
2862 # Fetch once to get a tarball
2863 fetcher = bb.fetch.Fetch(['npm://registry.npmjs.org;package=array-flatten;version=1.1.1'], self.d)
2864 fetcher.download()
2865 # Disable network access
2866 self.d.setVar('BB_NO_NETWORK', '1')
2867 # Fetch again
2868 swfile = self.create_shrinkwrap_file({
2869 'dependencies': {
2870 'array-flatten': {
2871 'version': '1.1.1',
2872 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz',
2873 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI='
2874 }
2875 }
2876 })
2877 fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d)
2878 fetcher.download()
2879 fetcher.unpack(self.unpackdir)
2880 self.assertTrue(os.path.exists(os.path.join(self.sdir, 'node_modules', 'array-flatten', 'package.json')))
2881
2882 @skipIfNoNpm()
2883 @skipIfNoNetwork()
2884 def test_npmsw_npm_reusability(self):
2885 # Fetch once with npmsw
2886 swfile = self.create_shrinkwrap_file({
2887 'dependencies': {
2888 'array-flatten': {
2889 'version': '1.1.1',
2890 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz',
2891 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI='
2892 }
2893 }
2894 })
2895 fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d)
2896 fetcher.download()
2897 # Disable network access
2898 self.d.setVar('BB_NO_NETWORK', '1')
2899 # Fetch again with npm
2900 fetcher = bb.fetch.Fetch(['npm://registry.npmjs.org;package=array-flatten;version=1.1.1'], self.d)
2901 fetcher.download()
2902 fetcher.unpack(self.unpackdir)
2903 self.assertTrue(os.path.exists(os.path.join(self.unpackdir, 'npm', 'package.json')))
2904
2905 @skipIfNoNpm()
2906 @skipIfNoNetwork()
2907 def test_npmsw_bad_checksum(self):
2908 # Try to fetch with bad checksum
2909 swfile = self.create_shrinkwrap_file({
2910 'dependencies': {
2911 'array-flatten': {
2912 'version': '1.1.1',
2913 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz',
2914 'integrity': 'sha1-gfNEp2hqgLTFKT6P3AsBYMgsBqg='
2915 }
2916 }
2917 })
2918 fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d)
2919 with self.assertRaises(bb.fetch2.FetchError):
2920 fetcher.download()
2921 # Fetch correctly to get a tarball
2922 swfile = self.create_shrinkwrap_file({
2923 'dependencies': {
2924 'array-flatten': {
2925 'version': '1.1.1',
2926 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz',
2927 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI='
2928 }
2929 }
2930 })
2931 fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d)
2932 fetcher.download()
2933 localpath = os.path.join(self.dldir, 'npm2', 'array-flatten-1.1.1.tgz')
2934 self.assertTrue(os.path.exists(localpath))
2935 # Modify the tarball
2936 bad = b'bad checksum'
2937 with open(localpath, 'wb') as f:
2938 f.write(bad)
2939 # Verify that the tarball is fetched again
2940 fetcher.download()
2941 badsum = hashlib.sha1(bad).hexdigest()
2942 self.assertTrue(os.path.exists(localpath + '_bad-checksum_' + badsum))
2943 self.assertTrue(os.path.exists(localpath))
2944
2945 @skipIfNoNpm()
2946 @skipIfNoNetwork()
2947 def test_npmsw_premirrors(self):
2948 # Fetch once to get a tarball
2949 fetcher = bb.fetch.Fetch(['npm://registry.npmjs.org;package=array-flatten;version=1.1.1'], self.d)
2950 ud = fetcher.ud[fetcher.urls[0]]
2951 fetcher.download()
2952 self.assertTrue(os.path.exists(ud.localpath))
2953 # Setup the mirror
2954 mirrordir = os.path.join(self.tempdir, 'mirror')
2955 bb.utils.mkdirhier(mirrordir)
2956 os.replace(ud.localpath, os.path.join(mirrordir, os.path.basename(ud.localpath)))
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002957 self.d.setVar('PREMIRRORS', 'https?$://.*/.* file://%s/' % mirrordir)
Andrew Geissler82c905d2020-04-13 13:39:40 -05002958 self.d.setVar('BB_FETCH_PREMIRRORONLY', '1')
2959 # Fetch again
2960 self.assertFalse(os.path.exists(ud.localpath))
2961 swfile = self.create_shrinkwrap_file({
2962 'dependencies': {
2963 'array-flatten': {
2964 'version': '1.1.1',
2965 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz',
2966 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI='
2967 }
2968 }
2969 })
2970 fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d)
2971 fetcher.download()
2972 self.assertTrue(os.path.exists(ud.localpath))
2973
2974 @skipIfNoNpm()
2975 @skipIfNoNetwork()
2976 def test_npmsw_mirrors(self):
2977 # Fetch once to get a tarball
2978 fetcher = bb.fetch.Fetch(['npm://registry.npmjs.org;package=array-flatten;version=1.1.1'], self.d)
2979 ud = fetcher.ud[fetcher.urls[0]]
2980 fetcher.download()
2981 self.assertTrue(os.path.exists(ud.localpath))
2982 # Setup the mirror
2983 mirrordir = os.path.join(self.tempdir, 'mirror')
2984 bb.utils.mkdirhier(mirrordir)
2985 os.replace(ud.localpath, os.path.join(mirrordir, os.path.basename(ud.localpath)))
Andrew Geissler7e0e3c02022-02-25 20:34:39 +00002986 self.d.setVar('MIRRORS', 'https?$://.*/.* file://%s/' % mirrordir)
Andrew Geissler82c905d2020-04-13 13:39:40 -05002987 # Fetch again with invalid url
2988 self.assertFalse(os.path.exists(ud.localpath))
2989 swfile = self.create_shrinkwrap_file({
2990 'dependencies': {
2991 'array-flatten': {
2992 'version': '1.1.1',
2993 'resolved': 'https://invalid',
2994 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI='
2995 }
2996 }
2997 })
2998 fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d)
2999 fetcher.download()
3000 self.assertTrue(os.path.exists(ud.localpath))
Andrew Geisslerc926e172021-05-07 16:11:35 -05003001
3002class GitSharedTest(FetcherTest):
3003 def setUp(self):
3004 super(GitSharedTest, self).setUp()
Andrew Geissler028142b2023-05-05 11:29:21 -05003005 self.recipe_url = "git://git.openembedded.org/bitbake;branch=master;protocol=https"
Andrew Geisslerc926e172021-05-07 16:11:35 -05003006 self.d.setVar('SRCREV', '82ea737a0b42a8b53e11c9cde141e9e9c0bd8c40')
Andrew Geisslerfc113ea2023-03-31 09:59:46 -05003007 self.d.setVar("__BBSRCREV_SEEN", "1")
Andrew Geisslerc926e172021-05-07 16:11:35 -05003008
3009 @skipIfNoNetwork()
3010 def test_shared_unpack(self):
3011 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
3012
3013 fetcher.download()
3014 fetcher.unpack(self.unpackdir)
3015 alt = os.path.join(self.unpackdir, 'git/.git/objects/info/alternates')
3016 self.assertTrue(os.path.exists(alt))
3017
3018 @skipIfNoNetwork()
3019 def test_noshared_unpack(self):
3020 self.d.setVar('BB_GIT_NOSHARED', '1')
3021 self.unpackdir += '_noshared'
3022 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
3023
3024 fetcher.download()
3025 fetcher.unpack(self.unpackdir)
3026 alt = os.path.join(self.unpackdir, 'git/.git/objects/info/alternates')
3027 self.assertFalse(os.path.exists(alt))
Andrew Geissler78b72792022-06-14 06:47:25 -05003028
3029
3030class FetchPremirroronlyLocalTest(FetcherTest):
3031
3032 def setUp(self):
3033 super(FetchPremirroronlyLocalTest, self).setUp()
3034 self.mirrordir = os.path.join(self.tempdir, "mirrors")
3035 os.mkdir(self.mirrordir)
3036 self.reponame = "bitbake"
3037 self.gitdir = os.path.join(self.tempdir, "git", self.reponame)
Andrew Geissler028142b2023-05-05 11:29:21 -05003038 self.recipe_url = "git://git.fake.repo/bitbake;branch=master;protocol=https"
Andrew Geissler78b72792022-06-14 06:47:25 -05003039 self.d.setVar("BB_FETCH_PREMIRRORONLY", "1")
3040 self.d.setVar("BB_NO_NETWORK", "1")
3041 self.d.setVar("PREMIRRORS", self.recipe_url + " " + "file://{}".format(self.mirrordir) + " \n")
3042
3043 def make_git_repo(self):
3044 self.mirrorname = "git2_git.fake.repo.bitbake.tar.gz"
3045 recipeurl = "git:/git.fake.repo/bitbake"
3046 os.makedirs(self.gitdir)
Andrew Geissler8f840682023-07-21 09:09:43 -05003047 self.git_init(cwd=self.gitdir)
Andrew Geissler78b72792022-06-14 06:47:25 -05003048 for i in range(0):
3049 self.git_new_commit()
3050 bb.process.run('tar -czvf {} .'.format(os.path.join(self.mirrordir, self.mirrorname)), cwd = self.gitdir)
3051
3052 def git_new_commit(self):
3053 import random
3054 testfilename = "bibake-fetch.test"
3055 os.unlink(os.path.join(self.mirrordir, self.mirrorname))
3056 with open(os.path.join(self.gitdir, testfilename), "w") as testfile:
3057 testfile.write("Useless random data {}".format(random.random()))
3058 self.git("add {}".format(testfilename), self.gitdir)
3059 self.git("commit -a -m \"This random commit {}. I'm useless.\"".format(random.random()), self.gitdir)
3060 bb.process.run('tar -czvf {} .'.format(os.path.join(self.mirrordir, self.mirrorname)), cwd = self.gitdir)
3061 return self.git("rev-parse HEAD", self.gitdir).strip()
3062
3063 def test_mirror_commit_nonexistent(self):
3064 self.make_git_repo()
3065 self.d.setVar("SRCREV", "0"*40)
3066 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
3067 with self.assertRaises(bb.fetch2.NetworkAccess):
3068 fetcher.download()
3069
3070 def test_mirror_commit_exists(self):
3071 self.make_git_repo()
3072 self.d.setVar("SRCREV", self.git_new_commit())
3073 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
3074 fetcher.download()
3075 fetcher.unpack(self.unpackdir)
3076
3077 def test_mirror_tarball_nonexistent(self):
3078 self.d.setVar("SRCREV", "0"*40)
3079 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
3080 with self.assertRaises(bb.fetch2.NetworkAccess):
3081 fetcher.download()
3082
3083class FetchPremirroronlyNetworkTest(FetcherTest):
3084
3085 def setUp(self):
3086 super(FetchPremirroronlyNetworkTest, self).setUp()
3087 self.mirrordir = os.path.join(self.tempdir, "mirrors")
3088 os.mkdir(self.mirrordir)
3089 self.reponame = "fstests"
3090 self.clonedir = os.path.join(self.tempdir, "git")
3091 self.gitdir = os.path.join(self.tempdir, "git", "{}.git".format(self.reponame))
Andrew Geissler028142b2023-05-05 11:29:21 -05003092 self.recipe_url = "git://git.yoctoproject.org/fstests;protocol=https"
Andrew Geissler78b72792022-06-14 06:47:25 -05003093 self.d.setVar("BB_FETCH_PREMIRRORONLY", "1")
3094 self.d.setVar("BB_NO_NETWORK", "0")
3095 self.d.setVar("PREMIRRORS", self.recipe_url + " " + "file://{}".format(self.mirrordir) + " \n")
3096
3097 def make_git_repo(self):
3098 import shutil
3099 self.mirrorname = "git2_git.yoctoproject.org.fstests.tar.gz"
3100 os.makedirs(self.clonedir)
3101 self.git("clone --bare --shallow-since=\"01.01.2013\" {}".format(self.recipe_url), self.clonedir)
3102 bb.process.run('tar -czvf {} .'.format(os.path.join(self.mirrordir, self.mirrorname)), cwd = self.gitdir)
3103 shutil.rmtree(self.clonedir)
3104
3105 @skipIfNoNetwork()
3106 def test_mirror_tarball_updated(self):
3107 self.make_git_repo()
3108 ## Upstream commit is in the mirror
3109 self.d.setVar("SRCREV", "49d65d53c2bf558ae6e9185af0f3af7b79d255ec")
3110 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
3111 fetcher.download()
3112
3113 @skipIfNoNetwork()
3114 def test_mirror_tarball_outdated(self):
3115 self.make_git_repo()
3116 ## Upstream commit not in the mirror
3117 self.d.setVar("SRCREV", "15413486df1f5a5b5af699b6f3ba5f0984e52a9f")
3118 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
3119 with self.assertRaises(bb.fetch2.NetworkAccess):
3120 fetcher.download()
Andrew Geissler615f2f12022-07-15 14:00:58 -05003121
Andrew Geisslerc5535c92023-01-27 16:10:19 -06003122class FetchPremirroronlyMercurialTest(FetcherTest):
3123 """ Test for premirrors with mercurial repos
3124 the test covers also basic hg:// clone (see fetch_and_create_tarball
3125 """
3126 def skipIfNoHg():
3127 import shutil
3128 if not shutil.which('hg'):
3129 return unittest.skip('Mercurial not installed')
3130 return lambda f: f
3131
3132 def setUp(self):
3133 super(FetchPremirroronlyMercurialTest, self).setUp()
3134 self.mirrordir = os.path.join(self.tempdir, "mirrors")
3135 os.mkdir(self.mirrordir)
3136 self.reponame = "libgnt"
3137 self.clonedir = os.path.join(self.tempdir, "hg")
3138 self.recipe_url = "hg://keep.imfreedom.org/libgnt;module=libgnt"
3139 self.d.setVar("SRCREV", "53e8b422faaf")
3140 self.mirrorname = "hg_libgnt_keep.imfreedom.org_.libgnt.tar.gz"
3141
3142 def fetch_and_create_tarball(self):
3143 """
3144 Ask bitbake to download repo and prepare mirror tarball for us
3145 """
3146 self.d.setVar("BB_GENERATE_MIRROR_TARBALLS", "1")
3147 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
3148 fetcher.download()
3149 mirrorfile = os.path.join(self.d.getVar("DL_DIR"), self.mirrorname)
3150 self.assertTrue(os.path.exists(mirrorfile), "Mirror tarball {} has not been created".format(mirrorfile))
3151 ## moving tarball to mirror directory
3152 os.rename(mirrorfile, os.path.join(self.mirrordir, self.mirrorname))
3153 self.d.setVar("BB_GENERATE_MIRROR_TARBALLS", "0")
3154
3155
3156 @skipIfNoNetwork()
3157 @skipIfNoHg()
3158 def test_premirror_mercurial(self):
3159 self.fetch_and_create_tarball()
3160 self.d.setVar("PREMIRRORS", self.recipe_url + " " + "file://{}".format(self.mirrordir) + " \n")
3161 self.d.setVar("BB_FETCH_PREMIRRORONLY", "1")
3162 self.d.setVar("BB_NO_NETWORK", "1")
3163 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
3164 fetcher.download()
3165
Andrew Geissler615f2f12022-07-15 14:00:58 -05003166class FetchPremirroronlyBrokenTarball(FetcherTest):
3167
3168 def setUp(self):
3169 super(FetchPremirroronlyBrokenTarball, self).setUp()
3170 self.mirrordir = os.path.join(self.tempdir, "mirrors")
3171 os.mkdir(self.mirrordir)
3172 self.reponame = "bitbake"
3173 self.gitdir = os.path.join(self.tempdir, "git", self.reponame)
Andrew Geissler028142b2023-05-05 11:29:21 -05003174 self.recipe_url = "git://git.fake.repo/bitbake;protocol=https"
Andrew Geissler615f2f12022-07-15 14:00:58 -05003175 self.d.setVar("BB_FETCH_PREMIRRORONLY", "1")
3176 self.d.setVar("BB_NO_NETWORK", "1")
3177 self.d.setVar("PREMIRRORS", self.recipe_url + " " + "file://{}".format(self.mirrordir) + " \n")
3178 self.mirrorname = "git2_git.fake.repo.bitbake.tar.gz"
3179 with open(os.path.join(self.mirrordir, self.mirrorname), 'w') as targz:
3180 targz.write("This is not tar.gz file!")
3181
3182 def test_mirror_broken_download(self):
3183 import sys
3184 self.d.setVar("SRCREV", "0"*40)
3185 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
Andrew Geissler8f840682023-07-21 09:09:43 -05003186 with self.assertRaises(bb.fetch2.FetchError), self.assertLogs() as logs:
Andrew Geissler615f2f12022-07-15 14:00:58 -05003187 fetcher.download()
Andrew Geissler8f840682023-07-21 09:09:43 -05003188 output = "".join(logs.output)
3189 self.assertFalse(" not a git repository (or any parent up to mount point /)" in output)