|  | #!/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() |