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