taler-deployment

Deployment scripts and configuration files
Log | Files | Refs | README

test_build_grouping.py (5986B)


      1 #!/usr/bin/env python3
      2 
      3 # This file is in the public domain.
      4 
      5 import importlib.machinery
      6 import importlib.util
      7 import sys
      8 import unittest
      9 from dataclasses import replace
     10 from io import StringIO
     11 from pathlib import Path
     12 from types import SimpleNamespace
     13 from unittest.mock import patch
     14 
     15 ROOT = Path(__file__).parents[1]
     16 sys.path.insert(0, str(ROOT))
     17 sys.path.insert(0, str(ROOT / "buildscripts"))
     18 LOADER = importlib.machinery.SourceFileLoader("taler_pkg", str(ROOT / "taler-pkg"))
     19 SPEC = importlib.util.spec_from_loader(LOADER.name, LOADER)
     20 TALER_PKG = importlib.util.module_from_spec(SPEC)
     21 LOADER.exec_module(TALER_PKG)
     22 
     23 from package_config import parse_config  # noqa: E402
     24 
     25 
     26 class BuildGroupingTests(unittest.TestCase):
     27     def test_libmicrohttpd_is_built_before_gnunet(self):
     28         buildorder = TALER_PKG.buildsort(TALER_PKG.components)
     29 
     30         self.assertLess(buildorder.index("libmicrohttpd"), buildorder.index("gnunet"))
     31 
     32     def test_typescript_packages_share_one_group(self):
     33         buildorder = TALER_PKG.buildsort(TALER_PKG.components)
     34         typescript_packages = {
     35             name
     36             for name in TALER_PKG.components
     37             if TALER_PKG.config.packages[name].repository == "typescript-core"
     38         }
     39 
     40         groups = TALER_PKG.group_components(typescript_packages, buildorder)
     41 
     42         self.assertEqual(1, len(groups))
     43         self.assertEqual(typescript_packages, set(groups[0]))
     44 
     45     def test_different_tags_create_different_groups(self):
     46         original = TALER_PKG.config
     47         packages = dict(original.packages)
     48         packages["taler-wallet-cli"] = replace(
     49             packages["taler-wallet-cli"], tag="v9.9.9"
     50         )
     51         TALER_PKG.config = replace(original, packages=packages)
     52         try:
     53             selected = {"taler-wallet-cli", "taler-harness"}
     54             groups = TALER_PKG.group_components(
     55                 selected, TALER_PKG.buildsort(TALER_PKG.components)
     56             )
     57         finally:
     58             TALER_PKG.config = original
     59 
     60         self.assertEqual(2, len(groups))
     61         self.assertEqual(selected, {group[0] for group in groups})
     62 
     63     def test_generic_packages_remain_isolated(self):
     64         selected = {"anastasis", "anastasis-gtk"}
     65 
     66         groups = TALER_PKG.group_components(
     67             selected, TALER_PKG.buildsort(TALER_PKG.components)
     68         )
     69 
     70         self.assertEqual([["anastasis"], ["anastasis-gtk"]], groups)
     71 
     72     def test_non_workspace_packages_remain_isolated(self):
     73         original = TALER_PKG.config
     74         TALER_PKG.config = parse_config(
     75             {
     76                 "repositories": {
     77                     "overlay": {
     78                         "url": "git://example.test/overlay.git",
     79                         "builder": "debian-overlay",
     80                     }
     81                 },
     82                 "packages": {
     83                     "overlay-one": {"repository": "overlay", "tag": "v1.0.0"},
     84                     "overlay-two": {"repository": "overlay", "tag": "v1.0.0"},
     85                 },
     86             }
     87         )
     88         try:
     89             selected = {"overlay-one", "overlay-two"}
     90             groups = TALER_PKG.group_components(
     91                 selected, TALER_PKG.buildsort(sorted(selected))
     92             )
     93         finally:
     94             TALER_PKG.config = original
     95 
     96         self.assertEqual([["overlay-one"], ["overlay-two"]], groups)
     97 
     98     def test_upgrade_queries_a_shared_repository_once(self):
     99         arguments = SimpleNamespace(
    100             components=["taler-wallet-cli", "taler-harness"],
    101             dev=True,
    102             dry=True,
    103         )
    104         with (
    105             patch.object(
    106                 TALER_PKG,
    107                 "list_remote_tags",
    108                 return_value=["v1.6.33-dev.2", "v1.6.33-dev.3"],
    109             ) as list_remote_tags,
    110             patch("sys.stdout", new_callable=StringIO),
    111         ):
    112             TALER_PKG.upgrade(arguments)
    113 
    114         list_remote_tags.assert_called_once()
    115 
    116     def test_default_upgrade_skips_pinned_packages(self):
    117         original = TALER_PKG.config
    118         TALER_PKG.config = parse_config(
    119             {
    120                 "repositories": {"repo": {"url": "git://example.test/repo.git"}},
    121                 "packages": {
    122                     "pinned": {
    123                         "repository": "repo",
    124                         "tag": "v1.0.0",
    125                         "auto_upgrade": False,
    126                     }
    127                 },
    128             }
    129         )
    130         arguments = SimpleNamespace(components=[], dev=False, dry=True)
    131         try:
    132             with (
    133                 patch.object(TALER_PKG, "list_remote_tags") as list_remote_tags,
    134                 patch("sys.stdout", new_callable=StringIO) as stdout,
    135             ):
    136                 TALER_PKG.upgrade(arguments)
    137         finally:
    138             TALER_PKG.config = original
    139 
    140         list_remote_tags.assert_not_called()
    141         self.assertIn("automatic upgrades disabled", stdout.getvalue())
    142 
    143     def test_explicit_upgrade_includes_pinned_packages(self):
    144         original = TALER_PKG.config
    145         TALER_PKG.config = parse_config(
    146             {
    147                 "repositories": {"repo": {"url": "git://example.test/repo.git"}},
    148                 "packages": {
    149                     "pinned": {
    150                         "repository": "repo",
    151                         "tag": "v1.0.0",
    152                         "auto_upgrade": False,
    153                     }
    154                 },
    155             }
    156         )
    157         arguments = SimpleNamespace(components=["pinned"], dev=False, dry=True)
    158         try:
    159             with (
    160                 patch.object(
    161                     TALER_PKG, "list_remote_tags", return_value=["v1.0.1"]
    162                 ) as list_remote_tags,
    163                 patch("sys.stdout", new_callable=StringIO) as stdout,
    164             ):
    165                 TALER_PKG.upgrade(arguments)
    166         finally:
    167             TALER_PKG.config = original
    168 
    169         list_remote_tags.assert_called_once()
    170         self.assertIn("pinned v1.0.0 -> v1.0.1", stdout.getvalue())
    171 
    172 
    173 if __name__ == "__main__":
    174     unittest.main()