Project

General

Profile

« Previous | Next » 

Revision 496d90f7

Added by koszko over 1 year ago

make it easier to reuse/cache foreign package files when building a Hydrilla source package multiple times

View differences:

conftest.py
9 9

  
10 10
import pytest
11 11
import pkgutil
12
from tempfile import TemporaryDirectory
13
from typing import Iterable
12 14

  
13 15
here = Path(__file__).resolve().parent
14 16
sys.path.insert(0, str(here / 'src'))
......
67 69
    for module in modules_to_process:
68 70
        if hasattr(module, '_'):
69 71
            monkeypatch.setattr(module, '_', lambda message: message)
72

  
73
@pytest.fixture
74
def tmpdir() -> Iterable[Path]:
75
    """
76
    Provide test case with a temporary directory that will be automatically
77
    deleted after the test.
78
    """
79
    with TemporaryDirectory() as tmpdir:
80
        yield Path(tmpdir)
src/hydrilla/builder/local_apt.py
286 286
        yield setup_local_apt(td, list, keys)
287 287

  
288 288
def download_apt_packages(list: SourcesList, keys: [str], packages: [str],
289
                          destination_dir: Path, with_deps=False) -> [str]:
289
                          destination_dir: Path, with_deps: bool) -> [str]:
290 290
    """
291 291
    Set up a local APT, update it using the specified sources.list configuration
292 292
    and use it to download the specified packages.
......
380 380
        if foreign_packages is None:
381 381
            archives = td / 'archives'
382 382
            archives.mkdir()
383
        else:
384
            archives = foreign_packages / 'apt'
385
            archives.mkdir(exist_ok=True)
383 386

  
387
        if [*archives.glob('*.deb')] == []:
384 388
            sources_list = SourcesList(piggyback_def.get('sources_list', []),
385 389
                                       piggyback_def.get('distribution'))
386 390
            packages = piggyback_def['packages']
......
397 401
                destination_dir=archives,
398 402
                with_deps=with_deps
399 403
            )
400
        else:
401
            archives = foreign_packages / 'apt'
402 404

  
403 405
        for deb in archives.glob('*.deb'):
404 406
            command = ['dpkg-deb', '-x', str(deb), str(root)]
tests/test_build.py
176 176

  
177 177
expected = [*expected_resources, expected_mapping, expected_source_description]
178 178

  
179
@pytest.fixture
180
def tmpdir() -> Iterable[str]:
181
    """
182
    Provide test case with a temporary directory that will be automatically
183
    deleted after the test.
184
    """
185
    with TemporaryDirectory() as tmpdir:
186
        yield Path(tmpdir)
187

  
188 179
def run_reuse(command, **kwargs):
189 180
    """
190 181
    Instead of running a 'reuse' command, check if 'mock_reuse_missing' file
......
677 668
    error_type, error_regex = sample_source_make_errors
678 669

  
679 670
    dstdir = Path(tmpdir) / 'dstdir'
680
    tmpdir = Path(tmpdir) / 'example'
681

  
682 671
    dstdir.mkdir(exist_ok=True)
683
    tmpdir.mkdir(exist_ok=True)
684 672

  
685 673
    with pytest.raises(error_type, match=error_regex):
686 674
        build.Build(sample_source, Path('index.json'))\
tests/test_local_apt.py
341 341
    destination.mkdir()
342 342

  
343 343
    local_apt.download_apt_packages(sources_list, local_apt.default_keys,
344
                                    ['libjs-mathjax'], destination)
344
                                    ['libjs-mathjax'], destination, False)
345 345

  
346 346
    libjs_mathjax_path = destination / 'libjs-mathjax_0%3a2.7.9+dfsg-1_all.deb'
347 347
    fonts_mathjax_path = destination / 'fonts-mathjax_0%3a2.7.9+dfsg-1_all.deb'
......
418 418

  
419 419
    with pytest.raises(local_apt.AptError, match=error_regex):
420 420
        local_apt.download_apt_packages(sources_list, local_apt.default_keys,
421
                                        ['libjs-mathjax'], destination)
421
                                        ['libjs-mathjax'], destination, False)
422 422

  
423 423
    assert [*destination.iterdir()] == []
424 424

  
......
469 469

  
470 470
    with pytest.raises(local_apt.AptError, match=error_regex):
471 471
        local_apt.download_apt_packages(sources_list, local_apt.default_keys,
472
                                        ['libjs-mathjax'], destination)
472
                                        ['libjs-mathjax'], destination, False)
473 473

  
474 474
    assert [*destination.iterdir()] == []
475 475

  
......
499 499

  
500 500
    with pytest.raises(local_apt.AptError, match=error_regex):
501 501
        local_apt.download_apt_packages(sources_list, local_apt.default_keys,
502
                                        ['libjs-mathjax'], destination)
502
                                        ['libjs-mathjax'], destination, False)
503 503

  
504 504
    assert [*destination.iterdir()] == []
505 505

  
......
572 572
        'base_depends': True,
573 573
        'identity': 'nabia',
574 574
        'props': {'distribution': 'nabia', 'dependencies': False},
575
        'all_keys': local_apt.default_keys
575
        'all_keys': local_apt.default_keys,
576
        'prepared_directory': False
576 577
    },
577 578
    {
578 579
        'with_deps': True,
......
586 587
            'depend_on_base_packages': False
587 588
        },
588 589
        'all_keys': [*local_apt.default_keys, 'AB' * 20],
590
        'prepared_directory': True
589 591
    }
590 592
])
591 593
@pytest.mark.usefixtures('mock_download_packages', 'mock_subprocess_run')
592
def test_piggybacked_system_download(params):
594
def test_piggybacked_system_download(params, tmpdir):
593 595
    """
594 596
    Verify that the piggybacked_system() function properly downloads and unpacks
595 597
    APT packages.
596 598
    """
599
    foreign_packages_dir = tmpdir if params['prepared_directory'] else None
600

  
597 601
    with local_apt.piggybacked_system({
598 602
            'system': 'apt',
599 603
            **params['props'],
600 604
            'packages': ['some-bin-package', 'another-package=1.1-2']
601
    }, None) as piggybacked:
605
    }, foreign_packages_dir) as piggybacked:
602 606
        expected_depends = [{'identifier': 'apt-common-licenses'}] \
603 607
            if params['base_depends'] else []
604 608
        assert piggybacked.package_must_depend == expected_depends
......
626 630
            else:
627 631
                assert path.read_text() == f'dummy {path.name}'
628 632

  
633
            if foreign_packages_dir is not None:
634
                assert path.parent == foreign_packages_dir / 'apt'
635

  
629 636
        license_files = {*piggybacked.package_license_files}
630 637

  
631 638
        assert license_files == {
......
654 661

  
655 662
    assert not root.exists()
656 663

  
664
    if foreign_packages_dir:
665
        assert [*tmpdir.iterdir()] == [tmpdir / 'apt']
666

  
657 667
@pytest.mark.subprocess_run(local_apt, run_dpkg_deb)
658 668
@pytest.mark.usefixtures('mock_subprocess_run')
659 669
def test_piggybacked_system_no_download():

Also available in: Unified diff