| #!/usr/bin/env python3 | 
 | # | 
 | # Copyright 2013 The Flutter 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 | 
 | from deps_parser import VarImpl | 
 |  | 
 | SCRIPT_DIR = os.path.dirname(sys.argv[0]) | 
 | CHECKOUT_ROOT = os.path.realpath(os.path.join(SCRIPT_DIR, '..')) | 
 | DEPS = os.path.join(CHECKOUT_ROOT, 'DEPS') | 
 | UPSTREAM_PREFIX = 'upstream_' | 
 |  | 
 |  | 
 | class TestDepsParserMethods(unittest.TestCase): | 
 |   # Extract both mirrored dep names and URLs & | 
 |   # upstream names and URLs from DEPs file. | 
 |   def setUp(self):  # lower-camel-case for the python unittest framework | 
 |     # Read the content. | 
 |     with open(DEPS, 'r') as file: | 
 |       deps_content = file.read() | 
 |  | 
 |     local_scope_mirror = {} | 
 |     var = VarImpl(local_scope_mirror) | 
 |     global_scope_mirror = { | 
 |         'Var': var.lookup, | 
 |         'deps_os': {}, | 
 |     } | 
 |  | 
 |     # Eval the content. | 
 |     exec(deps_content, global_scope_mirror, local_scope_mirror) | 
 |  | 
 |     # Extract the upstream URLs | 
 |     # vars contains more than just upstream URLs | 
 |     # however the upstream URLs are prefixed with 'upstream_' | 
 |     upstream = local_scope_mirror.get('vars') | 
 |     self.upstream_urls = upstream | 
 |  | 
 |     # Extract the deps and filter. | 
 |     deps = local_scope_mirror.get('deps', {}) | 
 |     filtered_deps = [] | 
 |     for _, dep in deps.items(): | 
 |       # We currently do not support packages or cipd which are represented | 
 |       # as dictionaries. | 
 |       if isinstance(dep, str): | 
 |         filtered_deps.append(dep) | 
 |     self.deps = filtered_deps | 
 |  | 
 |   def test_each_dep_has_upstream_url(self): | 
 |     # For each DEP in the deps file, check for an associated upstream URL in deps file. | 
 |     for dep in self.deps: | 
 |       dep_repo = dep.split('@')[0] | 
 |       dep_name = dep_repo.split('/')[-1].split('.')[0] | 
 |       # vulkan-deps and khronos do not have one upstream URL | 
 |       # all other deps should have an associated upstream URL for vuln scanning purposes | 
 |       if dep_name not in ('vulkan-deps', 'khronos'): | 
 |         # Add the prefix on the dep name when searching for the upstream entry. | 
 |         self.assertTrue( | 
 |             UPSTREAM_PREFIX + dep_name in self.upstream_urls, | 
 |             msg=dep_name + ' not found in upstream URL list. ' + | 
 |             'Each dep in the "deps" section of DEPS file must have associated upstream URL' | 
 |         ) | 
 |  | 
 |   def test_each_upstream_url_has_dep(self): | 
 |     # Parse DEPS into dependency names. | 
 |     deps_names = [] | 
 |     for dep in self.deps: | 
 |       dep_repo = dep.split('@')[0] | 
 |       dep_name = dep_repo.split('/')[-1].split('.')[0] | 
 |       deps_names.append(dep_name) | 
 |  | 
 |     # For each upstream URL dep, check it exists as in DEPS. | 
 |     for upsream_dep in self.upstream_urls: | 
 |       # Only test on upstream deps in vars section which start with the upstream prefix | 
 |       if upsream_dep.startswith(UPSTREAM_PREFIX): | 
 |         # Strip the prefix to check that it has a corresponding dependency in the DEPS file | 
 |         self.assertTrue( | 
 |             upsream_dep[len(UPSTREAM_PREFIX):] in deps_names, | 
 |             msg=upsream_dep + ' from upstream list not found in DEPS. ' + | 
 |             'Each upstream URL in DEPS file must have an associated dep in the "deps" section' | 
 |         ) | 
 |  | 
 |  | 
 | if __name__ == '__main__': | 
 |   unittest.main() |