|
@@ -0,0 +1,132 @@
|
|
|
|
+#!/usr/bin/env vpython3
|
|
|
|
+# Copyright (c) 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 metadata.dependency_metadata as dm
|
|
|
|
+import metadata.fields.known as known_fields
|
|
|
|
+import metadata.fields.types as field_types
|
|
|
|
+import metadata.validation_result as vr
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+class DependencyValidationTest(unittest.TestCase):
|
|
|
|
+ def test_repeated_field(self):
|
|
|
|
+ """Check that a validation error is returned for a repeated field."""
|
|
|
|
+ dependency = dm.DependencyMetadata()
|
|
|
|
+ dependency.add_entry(known_fields.NAME.get_name(), "Test repeated field")
|
|
|
|
+ dependency.add_entry(known_fields.URL.get_name(), "https://www.example.com")
|
|
|
|
+ dependency.add_entry(known_fields.VERSION.get_name(), "1.0.0")
|
|
|
|
+ dependency.add_entry(known_fields.LICENSE.get_name(), "Public Domain")
|
|
|
|
+ dependency.add_entry(known_fields.LICENSE_FILE.get_name(), "LICENSE")
|
|
|
|
+ dependency.add_entry(known_fields.SECURITY_CRITICAL.get_name(), "no")
|
|
|
|
+ dependency.add_entry(known_fields.SHIPPED.get_name(), "no")
|
|
|
|
+ dependency.add_entry(known_fields.NAME.get_name(), "again")
|
|
|
|
+
|
|
|
|
+ results = dependency.validate(
|
|
|
|
+ source_file_dir=os.path.join(_THIS_DIR, "data"),
|
|
|
|
+ repo_root_dir=_THIS_DIR,
|
|
|
|
+ )
|
|
|
|
+ self.assertEqual(len(results), 1)
|
|
|
|
+ self.assertTrue(isinstance(results[0], vr.ValidationError))
|
|
|
|
+ self.assertDictEqual(results[0].get_all_tags(),
|
|
|
|
+ {"reason": "repeated field"})
|
|
|
|
+
|
|
|
|
+ def test_required_field(self):
|
|
|
|
+ """Check that a validation error is returned for a missing field."""
|
|
|
|
+ dependency = dm.DependencyMetadata()
|
|
|
|
+ dependency.add_entry(known_fields.SHIPPED.get_name(), "no")
|
|
|
|
+ dependency.add_entry(known_fields.SECURITY_CRITICAL.get_name(), "no")
|
|
|
|
+ dependency.add_entry(known_fields.LICENSE_FILE.get_name(), "LICENSE")
|
|
|
|
+ dependency.add_entry(known_fields.LICENSE.get_name(), "Public Domain")
|
|
|
|
+ dependency.add_entry(known_fields.VERSION.get_name(), "1.0.0")
|
|
|
|
+ dependency.add_entry(known_fields.NAME.get_name(), "Test missing field")
|
|
|
|
+ # Leave URL field unspecified.
|
|
|
|
+
|
|
|
|
+ results = dependency.validate(
|
|
|
|
+ source_file_dir=os.path.join(_THIS_DIR, "data"),
|
|
|
|
+ repo_root_dir=_THIS_DIR,
|
|
|
|
+ )
|
|
|
|
+ self.assertEqual(len(results), 1)
|
|
|
|
+ self.assertTrue(isinstance(results[0], vr.ValidationError))
|
|
|
|
+ self.assertDictEqual(results[0].get_all_tags(),
|
|
|
|
+ {"reason": "missing required field"})
|
|
|
|
+
|
|
|
|
+ def test_invalid_field(self):
|
|
|
|
+ """Check field validation issues are returned."""
|
|
|
|
+ dependency = dm.DependencyMetadata()
|
|
|
|
+ dependency.add_entry(known_fields.URL.get_name(), "https://www.example.com")
|
|
|
|
+ dependency.add_entry(known_fields.NAME.get_name(), "Test invalid field")
|
|
|
|
+ dependency.add_entry(known_fields.VERSION.get_name(), "1.0.0")
|
|
|
|
+ dependency.add_entry(known_fields.LICENSE_FILE.get_name(), "LICENSE")
|
|
|
|
+ dependency.add_entry(known_fields.LICENSE.get_name(), "Public domain")
|
|
|
|
+ dependency.add_entry(known_fields.SHIPPED.get_name(), "no")
|
|
|
|
+ dependency.add_entry(known_fields.SECURITY_CRITICAL.get_name(), "test")
|
|
|
|
+
|
|
|
|
+ results = dependency.validate(
|
|
|
|
+ source_file_dir=os.path.join(_THIS_DIR, "data"),
|
|
|
|
+ repo_root_dir=_THIS_DIR,
|
|
|
|
+ )
|
|
|
|
+ self.assertEqual(len(results), 1)
|
|
|
|
+ self.assertTrue(isinstance(results[0], vr.ValidationError))
|
|
|
|
+ self.assertDictEqual(results[0].get_all_tags(),
|
|
|
|
+ {"field": known_fields.SECURITY_CRITICAL.get_name()})
|
|
|
|
+
|
|
|
|
+ def test_invalid_license_file_path(self):
|
|
|
|
+ """Check license file path validation issues are returned."""
|
|
|
|
+ dependency = dm.DependencyMetadata()
|
|
|
|
+ dependency.add_entry(known_fields.NAME.get_name(), "Test license file path")
|
|
|
|
+ dependency.add_entry(known_fields.URL.get_name(), "https://www.example.com")
|
|
|
|
+ dependency.add_entry(known_fields.VERSION.get_name(), "1.0.0")
|
|
|
|
+ dependency.add_entry(known_fields.LICENSE.get_name(), "Public domain")
|
|
|
|
+ dependency.add_entry(known_fields.LICENSE_FILE.get_name(),
|
|
|
|
+ "MISSING-LICENSE")
|
|
|
|
+ dependency.add_entry(known_fields.SECURITY_CRITICAL.get_name(), "no")
|
|
|
|
+ dependency.add_entry(known_fields.SHIPPED.get_name(), "no")
|
|
|
|
+
|
|
|
|
+ results = dependency.validate(
|
|
|
|
+ source_file_dir=os.path.join(_THIS_DIR, "data"),
|
|
|
|
+ repo_root_dir=_THIS_DIR,
|
|
|
|
+ )
|
|
|
|
+ self.assertEqual(len(results), 1)
|
|
|
|
+ self.assertTrue(isinstance(results[0], vr.ValidationError))
|
|
|
|
+ self.assertDictEqual(results[0].get_all_tags(),
|
|
|
|
+ {"field": known_fields.LICENSE_FILE.get_name()})
|
|
|
|
+
|
|
|
|
+ def test_multiple_validation_issues(self):
|
|
|
|
+ """Check all validation issues are returned."""
|
|
|
|
+ dependency = dm.DependencyMetadata()
|
|
|
|
+ dependency.add_entry(known_fields.NAME.get_name(), "Test multiple errors")
|
|
|
|
+ # Leave URL field unspecified.
|
|
|
|
+ dependency.add_entry(known_fields.VERSION.get_name(), "1.0.0")
|
|
|
|
+ dependency.add_entry(known_fields.LICENSE.get_name(), "Public domain")
|
|
|
|
+ dependency.add_entry(known_fields.LICENSE_FILE.get_name(),
|
|
|
|
+ "MISSING-LICENSE")
|
|
|
|
+ dependency.add_entry(known_fields.SECURITY_CRITICAL.get_name(), "test")
|
|
|
|
+ dependency.add_entry(known_fields.SHIPPED.get_name(), "no")
|
|
|
|
+ dependency.add_entry(known_fields.NAME.get_name(), "again")
|
|
|
|
+
|
|
|
|
+ # Check 4 validation results are returned, for:
|
|
|
|
+ # - missing field;
|
|
|
|
+ # - invalid license file path;
|
|
|
|
+ # - invalid yes/no field value; and
|
|
|
|
+ # - repeated field entry.
|
|
|
|
+ results = dependency.validate(
|
|
|
|
+ source_file_dir=os.path.join(_THIS_DIR, "data"),
|
|
|
|
+ repo_root_dir=_THIS_DIR,
|
|
|
|
+ )
|
|
|
|
+ self.assertEqual(len(results), 4)
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+if __name__ == "__main__":
|
|
|
|
+ unittest.main()
|