blob: dd96d163499f482291a42a678bfe2cfe24f9ce21 [file] [log] [blame]
#!/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()