#!/usr/bin/env python3.8
# Copyright 2020 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.
from tempfile import TemporaryDirectory
import os
import unittest

from verify_cts_deps import VerifyCtsDeps


class CtsVerifyDepsTests(unittest.TestCase):

    def test_init(self):
        root_build_dir = os.getcwd()
        cts_file = 'test.this_is_cts'
        invoker_label = "//sdk/cts/build:verify_cts_deps_test"
        deps = ['//zircon/public/lib/zxtest:zxtest']
        allowed_cts_dirs = ['//sdk/*']

        try:
            VerifyCtsDeps(
                root_build_dir, cts_file, invoker_label, deps, deps,
                allowed_cts_dirs)
        except Exception as e:
            self.assertTrue(False, e)

        with self.assertRaises(ValueError):
            VerifyCtsDeps(
                '', cts_file, invoker_label, deps, deps, allowed_cts_dirs)
        with self.assertRaises(ValueError):
            VerifyCtsDeps(
                '/this/path/doesnt/exist', cts_file, invoker_label, deps, deps,
                allowed_cts_dirs)
        with self.assertRaises(ValueError):
            VerifyCtsDeps(
                root_build_dir, '', invoker_label, deps, deps, allowed_cts_dirs)
        with self.assertRaises(ValueError):
            VerifyCtsDeps(
                root_build_dir, cts_file, '', deps, deps, allowed_cts_dirs)
        with self.assertRaises(ValueError):
            VerifyCtsDeps(
                root_build_dir, cts_file, invoker_label, [], deps,
                allowed_cts_dirs)
        with self.assertRaises(ValueError):
            VerifyCtsDeps(
                root_build_dir, cts_file, invoker_label, deps, [],
                allowed_cts_dirs)
        with self.assertRaises(ValueError):
            VerifyCtsDeps(
                root_build_dir, cts_file, invoker_label, deps, deps, [])

    def test_get_file_path(self):
        root_build_dir = os.getcwd()
        cts_file = 'test.this_is_cts'
        invoker_label = "//sdk/cts/build:verify_cts_deps_test"
        deps = ['//zircon/public/lib/zxtest:zxtest']
        allowed_cts_dirs = ['//sdk/*']
        cts_element = VerifyCtsDeps(
            root_build_dir, cts_file, invoker_label, deps, deps,
            allowed_cts_dirs)

        dep = '//zircon/public/lib/zxtest:zxtest'
        self.assertEqual(
            root_build_dir + '/cts/zircon/public/lib/zxtest/zxtest.this_is_cts',
            cts_element.get_file_path(dep))

        dep = '//zircon/public/lib/zxtest'
        self.assertEqual(
            root_build_dir + '/cts/zircon/public/lib/zxtest/zxtest.this_is_cts',
            cts_element.get_file_path(dep))

        dep = '//sdk'
        self.assertEqual(
            root_build_dir + '/cts/sdk/sdk.this_is_cts',
            cts_element.get_file_path(dep))

    def test_verify_deps(self):
        root_build_dir = os.getcwd()
        cts_file = 'test.this_is_cts'
        invoker_label = "//sdk/cts/build:verify_cts_deps_test"
        allowed_cts_deps = ['//zircon/public/lib/zxtest:zxtest']
        allowed_cts_dirs = ['//sdk/*']

        cts_element = VerifyCtsDeps(
            root_build_dir, cts_file, invoker_label, allowed_cts_deps,
            allowed_cts_deps, allowed_cts_dirs)
        self.assertListEqual(cts_element.verify_deps(), [])

        deps = ['//this/dep/isnt/allowed/in:cts']
        cts_element = VerifyCtsDeps(
            root_build_dir, cts_file, invoker_label, deps, allowed_cts_deps,
            allowed_cts_dirs)
        self.assertListEqual(cts_element.verify_deps(), deps)

        deps = [
            '//this/dep/isnt/allowed/in:cts', '//this/dep/isnt/allowed/in:cts2'
        ]
        cts_element = VerifyCtsDeps(
            root_build_dir, cts_file, invoker_label, deps, allowed_cts_deps,
            allowed_cts_dirs)
        self.assertListEqual(cts_element.verify_deps(), deps)

        deps = ['//sdk/this/is/a/real:target']
        cts_element = VerifyCtsDeps(
            root_build_dir, cts_file, invoker_label, deps, allowed_cts_deps,
            allowed_cts_dirs)
        self.assertListEqual(cts_element.verify_deps(), [])

        deps = [
            '//sdk/this/is/a/real:target',
            '//zircon/public/lib/zxtest:zxtest',
        ]
        cts_element = VerifyCtsDeps(
            root_build_dir, cts_file, invoker_label, deps, allowed_cts_deps,
            allowed_cts_dirs)
        self.assertListEqual(cts_element.verify_deps(), [])

    def test_create_cts_dep_file(self):
        root_build_dir = os.getcwd()
        invoker_label = "//sdk/cts/build:verify_cts_deps_test"
        deps = ['//sdk:sdk', '//zircon/public/lib/zxtest:zxtest']
        allowed_cts_deps = ['//zircon/public/lib/zxtest:zxtest']
        allowed_cts_dirs = ['//sdk/*']

        with TemporaryDirectory() as cts_file:
            cts_file += '/create_cts_dep_file.this_is_cts'
            cts_element = VerifyCtsDeps(
                root_build_dir, cts_file, invoker_label, deps, allowed_cts_deps,
                allowed_cts_dirs)
            cts_element.create_cts_dep_file()
            self.assertTrue(os.path.exists(cts_file))
            with open(cts_file) as f:
                lines = [line.strip() for line in f.readlines()]
                self.assertListEqual(deps, lines)

        with TemporaryDirectory() as cts_file:
            cts_file += '/cts/create_cts_dep_file.this_is_cts'
            cts_element = VerifyCtsDeps(
                root_build_dir, cts_file, invoker_label, deps, allowed_cts_deps,
                allowed_cts_dirs)
            cts_element.create_cts_dep_file()
            self.assertTrue(os.path.exists(cts_file))
            with open(cts_file) as f:
                lines = [line.strip() for line in f.readlines()]
                self.assertListEqual(deps, lines)


if __name__ == '__main__':
    unittest.main()
