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