| #!/usr/bin/env python3 |
| # Copyright 2023 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import os |
| import sys |
| import unittest |
| |
| _THIS_DIR = os.path.abspath(os.path.dirname(__file__)) |
| # The repo's root directory. |
| _ROOT_DIR = os.path.abspath(os.path.join(_THIS_DIR, "..", "..")) |
| |
| # Add the repo's root directory for clearer imports. |
| sys.path.insert(0, _ROOT_DIR) |
| |
| import gclient_utils |
| import metadata.parse |
| |
| |
| class ParseTest(unittest.TestCase): |
| def test_parse_single(self): |
| """Check parsing works for a single dependency's metadata.""" |
| filepath = os.path.join(_THIS_DIR, "data", |
| "README.chromium.test.single-valid") |
| content = gclient_utils.FileRead(filepath) |
| all_metadata = metadata.parse.parse_content(content) |
| |
| self.assertEqual(len(all_metadata), 1) |
| self.assertListEqual( |
| all_metadata[0].get_entries(), |
| [ |
| ("Name", "Test-A README for Chromium metadata"), |
| ("Short Name", "metadata-test-valid"), |
| ("URL", "https://www.example.com/metadata,\n" |
| " https://www.example.com/parser"), |
| ("Unknown Field", |
| "Should be extracted into a field, because the preceding URL\n" |
| " field is structured, thus terminated by another field-like\n" |
| " line, even if the field name isn't well known to us." |
| ), |
| ("Version", "1.0.12"), |
| ("Date", "2020-12-03"), |
| ("License", "Apache, 2.0 and MIT"), |
| ("License File", "LICENSE"), |
| ("Security Critical", "yes"), |
| ("Shipped", "yes"), |
| ("CPEPrefix", "unknown"), |
| ("Description", "A test metadata file, with a\n" |
| " multi-line description."), |
| ("Local Modifications", "None."), |
| ], |
| ) |
| |
| def test_parse_multiple(self): |
| """Check parsing works for multiple dependencies' metadata.""" |
| filepath = os.path.join(_THIS_DIR, "data", |
| "README.chromium.test.multi-invalid") |
| content = gclient_utils.FileRead(filepath) |
| all_metadata = metadata.parse.parse_content(content) |
| |
| # Dependency metadata with no entries at all are ignored. |
| self.assertEqual(len(all_metadata), 3) |
| |
| # Check entries are added according to fields being one-liners. |
| self.assertListEqual( |
| all_metadata[0].get_entries(), |
| [ |
| ("Name", |
| "Test-A README for Chromium metadata (0 errors, 0 warnings)"), |
| ("Short Name", "metadata-test-valid"), |
| ("URL", "https://www.example.com/metadata,\n" |
| " https://www.example.com/parser"), |
| ("Version", "1.0.12"), |
| ("Date", "2020-12-03"), |
| ("License", "Apache, 2.0 and MIT"), |
| ("License File", "LICENSE"), |
| ("Security Critical", "yes"), |
| ("Shipped", "yes"), |
| ("CPEPrefix", "unknown"), |
| ("Description", "A test metadata file, with a\n" |
| " multi-line description."), |
| ("Local Modifications", "None,\nEXCEPT:\n* nothing."), |
| ], |
| ) |
| |
| # Check the parser handles different casing for field names, and |
| # strips leading and trailing whitespace from values. |
| self.assertListEqual( |
| all_metadata[1].get_entries(), |
| [ |
| ("Name", |
| "Test-B README for Chromium metadata (4 errors, 1 warning)"), |
| ("SHORT NAME", "metadata-test-invalid"), |
| ("URL", "file://home/drive/chromium/src/metadata"), |
| ("Version", "0"), |
| ("Date", "2020-12-03"), |
| ("License", "MIT"), |
| ("Security critical", "yes"), |
| ("Shipped", "Yes"), |
| ("Description", ""), |
| ("Local Modifications", "None."), |
| ], |
| ) |
| |
| # Check repeated fields persist in the metadata's entries. |
| self.assertListEqual( |
| all_metadata[2].get_entries(), |
| [ |
| ("Name", |
| "Test-C README for Chromium metadata (5 errors, 1 warning)"), |
| ("URL", "https://www.example.com/first"), |
| ("URL", "https://www.example.com/second"), |
| ("Version", "N/A"), |
| ("Date", "2020-12-03"), |
| ("License", "Custom license"), |
| ("Security Critical", "yes"), |
| ("Description", "Test metadata with multiple entries for one " |
| "field, and\nmissing a mandatory field."), |
| ], |
| ) |
| |
| def test_parse_multiple_local_modifications(self): |
| """Check parsing works for multiple dependencies, each with different local modifications.""" |
| filepath = os.path.join( |
| _THIS_DIR, "data", "README.chromium.test.multi-local-modifications") |
| content = gclient_utils.FileRead(filepath) |
| all_metadata = metadata.parse.parse_content(content) |
| |
| self.assertEqual(len(all_metadata), 4) |
| |
| self.assertListEqual( |
| all_metadata[0].get_entries(), |
| [ |
| ("Name", "Test package 1"), |
| ("Local Modifications", |
| "1. Modified X file\n2. Deleted Y file"), |
| ], |
| ) |
| |
| self.assertListEqual( |
| all_metadata[1].get_entries(), |
| [ |
| ("Name", "Test package 2"), |
| ("Local Modifications", "None"), |
| ], |
| ) |
| |
| self.assertListEqual( |
| all_metadata[2].get_entries(), |
| [ |
| ("Name", "Test package 3"), |
| ("Local Modifications", "None."), |
| ], |
| ) |
| |
| self.assertListEqual( |
| all_metadata[3].get_entries(), |
| [ |
| ("Name", "Test package 4"), |
| ("Local Modifications", "None,\nExcept modified file X."), |
| ], |
| ) |
| |
| if __name__ == "__main__": |
| unittest.main() |