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