1#!/usr/bin/env python3
2#
3# Copyright (c) 2021 Nordic Semiconductor ASA
4#
5# SPDX-License-Identifier: Apache-2.0
6
7from sys import version
8from unittest import TestCase, main
9from pathlib import Path
10from subprocess import Popen, PIPE
11from datetime import date, timedelta
12from re import escape
13
14p_script_dir = Path(__file__).absolute().parents[0]
15p_root = p_script_dir.parents[1]
16p_VERSION = p_root / "zcbor" / "VERSION"
17p_release_notes = p_root / "RELEASE_NOTES.md"
18p_migration_guide = p_root / "MIGRATION_GUIDE.md"
19p_HEAD_REF = p_script_dir / "HEAD_REF"
20
21
22class VersionTest(TestCase):
23    def test_version_num(self):
24        """For release branches - Test that all version numbers have been updated."""
25        current_branch = Popen(['git', 'branch', '--show-current'],
26                               stdout=PIPE).communicate()[0].decode("utf-8").strip()
27        if not current_branch:
28            current_branch = p_HEAD_REF.read_text(encoding="utf-8")
29        self.assertRegex(
30            current_branch, r"release/\d+\.\d+\.\d+",
31            "This test is meant to be run on a release branch on the form 'release/x.y.z'.")
32
33        version_number = current_branch.replace("release/", "")
34        version_number_no_bugfix = ".".join(version_number.split(".")[:-1])
35        self.assertRegex(
36            version_number, r'\d+\.\d+\.(?!99)\d+',
37            "Releases cannot have the x.y.99 development bugfix release number.")
38        self.assertEqual(
39            version_number, p_VERSION.read_text(encoding="utf-8"),
40            f"{p_VERSION} has not been updated to the correct version number.")
41        tomorrow = date.today() + timedelta(days=1)
42        self.assertRegex(
43            p_release_notes.read_text(encoding="utf-8").splitlines()[0],
44            escape(r"# zcbor v. " + version_number)
45            + fr" \(({date.today():%Y-%m-%d}|{tomorrow:%Y-%m-%d})\)",
46            f"{p_release_notes} has not been updated with the correct version number or date.")
47        self.assertRegex(
48            p_migration_guide.read_text(encoding="utf-8").splitlines()[0],
49            escape(r"# zcbor v. " + version_number_no_bugfix) + r"\.\d",
50            f"{p_migration_guide} has not been updated with the correct minor/major version num.")
51
52        tags_stdout, _ = Popen(['git', 'tag'], stdout=PIPE).communicate()
53        tags = tags_stdout.decode("utf-8").strip().splitlines()
54        self.assertNotIn(
55            version_number, tags,
56            "Version number already exists as a tag. Has the version number been updated?")
57
58
59if __name__ == "__main__":
60    main()
61