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

    # TODO(johnshamoon): Verify that _sdk.meta.json doesn't exist when it
    # shouldn't.
    def test_get_sdk_meta_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 = '//sdk/lib/fdio:fdio'
        self.assertEqual(root_build_dir + '/gen/sdk/lib/fdio/fdio_sdk.meta.json',
                         cts_element.get_sdk_meta_path(dep))

        dep = '//sdk/lib/fdio'
        self.assertEqual(root_build_dir + '/gen/sdk/lib/fdio/fdio_sdk.meta.json',
                         cts_element.get_sdk_meta_path(dep))

        dep = '//sdk'
        self.assertEqual(root_build_dir + '/gen/sdk/sdk_sdk.meta.json',
                         cts_element.get_sdk_meta_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()
