blob: 937ebcfd390d4d501169f39055902b299ca6ae58 [file] [log] [blame]
#!/usr/bin/env fuchsia-vendored-python
# Copyright 2019 The Fuchsia 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 check_deps
import shutil
import tempfile
import unittest
areas = [
'src/rockets',
'src/rockets/nozzles',
'src/planets',
]
# Test case format: [ label, expected_area ]
area_for_label_cases = [
['', ''],
['/', ''],
['//', ''],
['//:root_target', ''],
['//src', ''],
['//src/', ''],
['//src/rockets', '//src/rockets'],
['//src/rockets/nozzles/core', '//src/rockets/nozzles'],
['//src/rockets:foo', '//src/rockets'],
['//src/planets:ledger_tests.manifest', '//src/planets'],
['//something/public/lib/fxl:fxl', ''],
]
# Test case format: [ label, dependency, testonly ]
# Allowable dependency patterns from layout.md:
# //build
# //buildtools
# //sdk
# //third_party
# (../)+lib/
# (../)+testing/ for testonly targets
allowable_dep_cases = [
['//src/rockets/nozzles', '//build/toolchain:something'],
['//src/rockets/nozzles', '//buildtools/fuel_meter'],
['//src/rockets:foo', '//sdk/lib/widgets'],
['//src/planets/star_data', '//third_party/astrolabe'],
['//src/rockets/nozzles',
'//src/lib/nova:lib(//buildtools/toolchain:some_other_toolchain)'],
]
# Test case format: [ label, dependency ]
disallowed_dep_cases = [
['//src/rockets:foo', '//src/planets:bar'],
['//src/rockets/nozzles', '//something/lib/foobar'],
['//src/rockets/tests:rocket_tests', '//src/rockets/nozzles/lib:stardata'],
['//src/rockets/nozzles/widgets:helper', '//src/rockets/libations/qux'],
]
class TestCheckdepsMethods(unittest.TestCase):
def setUp(self):
self.test_dir = tempfile.mkdtemp()
for area in areas:
area_owners_file = os.path.join(self.test_dir, area, 'OWNERS')
os.makedirs(os.path.dirname(area_owners_file))
with open(area_owners_file, 'w') as f:
f.write('\n')
def tearDown(self):
shutil.rmtree(self.test_dir)
def test_area_for_label(self):
for test in area_for_label_cases:
label_area = check_deps.area_for_label(self.test_dir, test[0])
self.assertEqual(label_area, test[1])
def test_dep_allowed(self):
ignore_exclusions = False
testonly = False
for case in allowable_dep_cases:
label = case[0]
label_area = check_deps.area_for_label(self.test_dir, label)
dep = case[1]
dep_area = check_deps.area_for_label(self.test_dir, dep)
msg = '%s (area %s) should be allowed to depend on %s (area %s)' % (
label, label_area, dep, dep_area)
allowed = check_deps.dep_allowed(
label, label_area, dep, dep_area, testonly, ignore_exclusions)
self.assertTrue(allowed, msg=msg)
def test_dep_disallowed(self):
ignore_exclusions = False
testonly = False
for case in disallowed_dep_cases:
label = case[0]
label_area = check_deps.area_for_label(self.test_dir, label)
dep = case[1]
dep_area = check_deps.area_for_label(self.test_dir, dep)
msg = '%s should not be allowed to depend on %s' % (label, dep)
allowed = check_deps.dep_allowed(
label, label_area, dep, dep_area, testonly, ignore_exclusions)
self.assertFalse(allowed, msg=msg)
def test_testonly_deps(self):
ignore_exceptions = False
testonly_label = "//src/rockets/nozzles/tests:flange_test"
testonly_area = check_deps.area_for_label(
self.test_dir, testonly_label)
prod_label = "//src/rockets/nozzles/flange"
prod_area = check_deps.area_for_label(self.test_dir, prod_label)
dep_label = "//src/rockets/testing:surrogate_oxidizer"
dep_area = check_deps.area_for_label(self.test_dir, dep_label)
msg = "%s (area %s) is testonly and should be allowed to depend on %s (area %s)" % (testonly_label,
testonly_area, dep_label, dep_area)
self.assertTrue(
check_deps.dep_allowed(
testonly_label, testonly_area, dep_label, dep_area,
True, ignore_exceptions),
msg=msg)
msg = "%s in area %s is not testonly and should not be allowed to depend on %s in area %s" % (
prod_label, prod_area, dep_label, dep_area)
self.assertFalse(
check_deps.dep_allowed(
prod_label, prod_area, dep_label, dep_area,
False, ignore_exceptions),
msg=msg)
if __name__ == '__main__':
unittest.main()