From 1acbc14c34f264e0158436dc3d0265d500848462 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Wed, 30 Apr 2025 13:29:20 -0400 Subject: manifest: generalize --json as --format= This will make it easier to add more formats without exploding the common --xxx space and checking a large set of boolean flags. Also fill out the test coverage while we're here. Bug: b/412725063 Change-Id: I754013dc6cb3445f8a0979cefec599d55dafdcff Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/471941 Reviewed-by: Gavin Mak Commit-Queue: Mike Frysinger Tested-by: Mike Frysinger --- tests/test_subcmds_manifest.py | 156 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 tests/test_subcmds_manifest.py (limited to 'tests/test_subcmds_manifest.py') diff --git a/tests/test_subcmds_manifest.py b/tests/test_subcmds_manifest.py new file mode 100644 index 00000000..9b1ffb30 --- /dev/null +++ b/tests/test_subcmds_manifest.py @@ -0,0 +1,156 @@ +# Copyright (C) 2025 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Unittests for the subcmds/manifest.py module.""" + +import json +from pathlib import Path +from unittest import mock + +import manifest_xml +from subcmds import manifest + + +_EXAMPLE_MANIFEST = """\ + + + + + + + +""" + + +def _get_cmd(repodir: Path) -> manifest.Manifest: + """Instantiate a manifest command object to test.""" + manifests_git = repodir / "manifests.git" + manifests_git.mkdir() + (manifests_git / "config").write_text( + """ +[remote "origin"] +\turl = http://localhost/manifest +""" + ) + client = manifest_xml.RepoClient(repodir=str(repodir)) + git_event_log = mock.MagicMock(ErrorEvent=mock.Mock(return_value=None)) + return manifest.Manifest( + repodir=client.repodir, + client=client, + manifest=client.manifest, + outer_client=client, + outer_manifest=client.manifest, + git_event_log=git_event_log, + ) + + +def test_output_format_xml_file(tmp_path): + """Test writing XML to a file.""" + path = tmp_path / "manifest.xml" + path.write_text(_EXAMPLE_MANIFEST) + outpath = tmp_path / "output.xml" + cmd = _get_cmd(tmp_path) + opt, args = cmd.OptionParser.parse_args(["--output-file", str(outpath)]) + cmd.Execute(opt, args) + # Normalize the output a bit as we don't exactly care. + normalize = lambda data: "\n".join( + x.strip() for x in data.splitlines() if x.strip() + ) + assert ( + normalize(outpath.read_text()) + == """ + + + + + +""" + ) + + +def test_output_format_xml_stdout(tmp_path, capsys): + """Test writing XML to stdout.""" + path = tmp_path / "manifest.xml" + path.write_text(_EXAMPLE_MANIFEST) + cmd = _get_cmd(tmp_path) + opt, args = cmd.OptionParser.parse_args(["--format", "xml"]) + cmd.Execute(opt, args) + # Normalize the output a bit as we don't exactly care. + normalize = lambda data: "\n".join( + x.strip() for x in data.splitlines() if x.strip() + ) + stdout = capsys.readouterr().out + assert ( + normalize(stdout) + == """ + + + + + +""" + ) + + +def test_output_format_json(tmp_path, capsys): + """Test writing JSON.""" + path = tmp_path / "manifest.xml" + path.write_text(_EXAMPLE_MANIFEST) + cmd = _get_cmd(tmp_path) + opt, args = cmd.OptionParser.parse_args(["--format", "json"]) + cmd.Execute(opt, args) + obj = json.loads(capsys.readouterr().out) + assert obj == { + "default": {"remote": "test-remote", "revision": "refs/heads/main"}, + "project": [{"name": "repohooks", "path": "src/repohooks"}], + "remote": [{"fetch": "http://localhost", "name": "test-remote"}], + "repo-hooks": {"enabled-list": "a b", "in-project": "repohooks"}, + } + + +def test_output_format_json_pretty(tmp_path, capsys): + """Test writing pretty JSON.""" + path = tmp_path / "manifest.xml" + path.write_text(_EXAMPLE_MANIFEST) + cmd = _get_cmd(tmp_path) + opt, args = cmd.OptionParser.parse_args(["--format", "json", "--pretty"]) + cmd.Execute(opt, args) + stdout = capsys.readouterr().out + assert ( + stdout + == """\ +{ + "default": { + "remote": "test-remote", + "revision": "refs/heads/main" + }, + "project": [ + { + "name": "repohooks", + "path": "src/repohooks" + } + ], + "remote": [ + { + "fetch": "http://localhost", + "name": "test-remote" + } + ], + "repo-hooks": { + "enabled-list": "a b", + "in-project": "repohooks" + } +} +""" + ) -- cgit v1.2.3-54-g00ecf