xref: /aosp_15_r20/external/toolchain-utils/llvm_tools/manifest_utils_unittest.py (revision 760c253c1ed00ce9abd48f8546f08516e57485fe)
1*760c253cSXin Li#!/usr/bin/env python3
2*760c253cSXin Li# Copyright 2023 The ChromiumOS Authors
3*760c253cSXin Li# Use of this source code is governed by a BSD-style license that can be
4*760c253cSXin Li# found in the LICENSE file.
5*760c253cSXin Li
6*760c253cSXin Li"""Provides utilities to read and edit the ChromiumOS Manifest entries.
7*760c253cSXin Li
8*760c253cSXin LiWhile this code reads and edits the internal manifest, it should only operate
9*760c253cSXin Lion toolchain projects (llvm-project, etc.) which are public.
10*760c253cSXin Li"""
11*760c253cSXin Li
12*760c253cSXin Liimport unittest
13*760c253cSXin Lifrom xml.etree import ElementTree
14*760c253cSXin Li
15*760c253cSXin Liimport manifest_utils
16*760c253cSXin Li
17*760c253cSXin Li
18*760c253cSXin LiMANIFEST_FIXTURE = """<?xml version="1.0" encoding="UTF-8"?>
19*760c253cSXin Li<manifest>
20*760c253cSXin Li  <!-- Comment that should not be removed.
21*760c253cSXin Li       Multiple lines. -->
22*760c253cSXin Li  <include name="_remotes.xml" />
23*760c253cSXin Li  <default revision="refs/heads/main"
24*760c253cSXin Li           remote="cros"
25*760c253cSXin Li           sync-j="8" />
26*760c253cSXin Li
27*760c253cSXin Li  <include name="_kernel_upstream.xml" />
28*760c253cSXin Li
29*760c253cSXin Li  <!-- Common projects for developing CrOS. -->
30*760c253cSXin Li  <project path="src/repohooks"
31*760c253cSXin Li           name="chromiumos/repohooks"
32*760c253cSXin Li           groups="minilayout,paygen,firmware,buildtools,labtools,crosvm" />
33*760c253cSXin Li  <repo-hooks in-project="chromiumos/repohooks"
34*760c253cSXin Li              enabled-list="pre-upload" />
35*760c253cSXin Li  <project path="chromite"
36*760c253cSXin Li           name="chromiumos/chromite"
37*760c253cSXin Li           groups="minilayout,paygen,firmware,buildtools,chromeos-admin">
38*760c253cSXin Li    <copyfile src="AUTHORS" dest="AUTHORS" />
39*760c253cSXin Li    <copyfile src="LICENSE" dest="LICENSE" />
40*760c253cSXin Li  </project>
41*760c253cSXin Li  <project path="src/third_party/llvm-project"
42*760c253cSXin Li           name="external/github.com/llvm/llvm-project"
43*760c253cSXin Li           groups="notdefault,bazel"
44*760c253cSXin Li           revision="abcd" />
45*760c253cSXin Li  <project path="chromite/third_party/pyelftools"
46*760c253cSXin Li           name="chromiumos/third_party/pyelftools"
47*760c253cSXin Li           revision="refs/heads/chromeos-0.22"
48*760c253cSXin Li           groups="minilayout,paygen,firmware,buildtools" />
49*760c253cSXin Li</manifest>
50*760c253cSXin Li"""
51*760c253cSXin Li
52*760c253cSXin Li
53*760c253cSXin Liclass TestManifestUtils(unittest.TestCase):
54*760c253cSXin Li    """Test manifest_utils."""
55*760c253cSXin Li
56*760c253cSXin Li    def test_update_chromeos_manifest(self):
57*760c253cSXin Li        root = ElementTree.fromstring(
58*760c253cSXin Li            MANIFEST_FIXTURE,
59*760c253cSXin Li            parser=manifest_utils.make_xmlparser(),
60*760c253cSXin Li        )
61*760c253cSXin Li        manifest_utils.update_chromeos_manifest_tree("wxyz", root)
62*760c253cSXin Li        string_root1 = ElementTree.tostring(root)
63*760c253cSXin Li        self.assertRegex(
64*760c253cSXin Li            str(string_root1, encoding="utf-8"),
65*760c253cSXin Li            r'revision="wxyz"',
66*760c253cSXin Li        )
67*760c253cSXin Li        self.assertRegex(
68*760c253cSXin Li            str(string_root1, encoding="utf-8"),
69*760c253cSXin Li            r"<!-- Comment that should not be removed.",
70*760c253cSXin Li        )
71*760c253cSXin Li        self.assertNotRegex(
72*760c253cSXin Li            str(string_root1, encoding="utf-8"),
73*760c253cSXin Li            r'revision="abcd"',
74*760c253cSXin Li        )
75*760c253cSXin Li        # Check idempotence.
76*760c253cSXin Li        manifest_utils.update_chromeos_manifest_tree("wxyz", root)
77*760c253cSXin Li        string_root2 = ElementTree.tostring(root)
78*760c253cSXin Li        self.assertEqual(string_root1, string_root2)
79*760c253cSXin Li
80*760c253cSXin Li    def test_extract_current_llvm_hash(self):
81*760c253cSXin Li        root = ElementTree.fromstring(
82*760c253cSXin Li            MANIFEST_FIXTURE,
83*760c253cSXin Li            parser=manifest_utils.make_xmlparser(),
84*760c253cSXin Li        )
85*760c253cSXin Li        self.assertEqual(
86*760c253cSXin Li            manifest_utils.extract_current_llvm_hash_from_xml(root),
87*760c253cSXin Li            "abcd",
88*760c253cSXin Li        )
89*760c253cSXin Li
90*760c253cSXin Li
91*760c253cSXin Liif __name__ == "__main__":
92*760c253cSXin Li    unittest.main()
93