#!/usr/bin/env fuchsia-vendored-python
# Copyright 2021 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 argparse
import os
import sys
import unittest
from unittest import mock
from parameterized import parameterized

import fidl_api_mapper

parser = argparse.ArgumentParser()
parser.add_argument(
    "--test_dir_path", help="Path to the test data directory.", required=True
)
args = parser.parse_args()

TEST_DIR_PATH = args.test_dir_path
TEST_FILE_NAME = "fidl.h"

# The python_host_test build rule calls `unittest.main`.
# So we need to get rid of the test arguments in order
# to prevent them from interfering with `unittest`'s args.
#
# Pop twice to get rid of the `--test_dir_path` flag and
# its value.
sys.argv.pop()
sys.argv.pop()


class DwarfdumpStreamingParserTest(unittest.TestCase):
    @parameterized.expand(
        [
            (
                "not_subprogram_skipped",
                [
                    "0x01:         DW_TAG_member",
                    '  DW_AT_name   ("member_name")',
                    "  DW_AT_decl_line   (1)",
                    "",
                ],
                {},
            ),
            (
                "one_subprogram",
                [
                    "0x01:         DW_TAG_subprogram",
                    '  DW_AT_name   ("function_name")',
                    "  DW_AT_decl_line   (1)",
                    "",
                ],
                {
                    "0x01": {
                        "DW_AT_name": '"function_name"',
                        "DW_AT_decl_line": "1",
                    }
                },
            ),
            (
                "two_subprograms_sandwiching_non_subprogram",
                [
                    "0x01:         DW_TAG_subprogram",
                    '  DW_AT_name   ("function_name_1")',
                    "  DW_AT_decl_line   (1)",
                    "",
                    "0x99:         DW_TAG_member",
                    '  DW_AT_name   ("member_name")',
                    "  DW_AT_decl_line   (1)",
                    "",
                    "0x02:         DW_TAG_subprogram",
                    '  DW_AT_name   ("function_name_2")',
                    "  DW_AT_decl_line   (2)",
                    "",
                ],
                {
                    "0x01": {
                        "DW_AT_name": '"function_name_1"',
                        "DW_AT_decl_line": "1",
                    },
                    "0x02": {
                        "DW_AT_name": '"function_name_2"',
                        "DW_AT_decl_line": "2",
                    },
                },
            ),
        ]
    )
    def test_parse_line(self, name, dwarfdump_lines, expected_subprograms_dict):
        parser = fidl_api_mapper.DwarfdumpStreamingParser()
        for line in dwarfdump_lines:
            parser.parse_line(line)
        self.assertEqual(parser.get_subprograms(), expected_subprograms_dict)


class FidlApiResolverTest(unittest.TestCase):
    TEST_DATA_PATH = "unknown"

    FIDL_HEADER_FILE_CONTENT = "\n".join(
        [
            "// cts-coverage-fidl-name:line_2",
            "first_method()",
            "// cts-coverage-fidl-name:line_4",
            "middle_method()",
            "non_fidl_method()",
            "// cts-coverage-fidl-name:line_7",
            "last_method()",
        ]
    )

    @parameterized.expand(
        [
            ("empty_subprograms_dict", {}, {}, {}),
            (
                "successfully_resolved_first_line",
                {
                    "0x1": {
                        "DW_AT_decl_file": '"fidl.h"',
                        "DW_AT_decl_line": "2",
                        "DW_AT_linkage_name": '"mangled_name"',
                    }
                },
                {},
                {"mangled_name": "line_2"},
            ),
            (
                "successfully_resolved_middle_line",
                {
                    "0x1": {
                        "DW_AT_decl_file": '"fidl.h"',
                        "DW_AT_decl_line": "4",
                        "DW_AT_linkage_name": '"mangled_name"',
                    }
                },
                {},
                {"mangled_name": "line_4"},
            ),
            (
                "successfully_resolved_last_line",
                {
                    "0x1": {
                        "DW_AT_decl_file": '"fidl.h"',
                        "DW_AT_decl_line": "7",
                        "DW_AT_linkage_name": '"mangled_name"',
                    }
                },
                {},
                {"mangled_name": "line_7"},
            ),
            (
                "non_annotated_function_is_skipped",
                {
                    "0x1": {
                        "DW_AT_decl_file": '"fidl.h"',
                        "DW_AT_decl_line": "5",
                        "DW_AT_linkage_name": '"mangled_name"',
                    }
                },
                {},
                {},
            ),
            (
                "line_number_too_large",
                {
                    "0x1": {
                        "DW_AT_decl_file": '"fidl.h"',
                        "DW_AT_decl_line": "100",
                        "DW_AT_linkage_name": '"mangled_name"',
                    }
                },
                {},
                {},
            ),
            (
                "subprogram_missing_filepath",
                {
                    "0x1": {
                        "DW_AT_decl_line": "1",
                        "DW_AT_linkage_name": '"mangled_name"',
                    }
                },
                {},
                {},
            ),
            (
                "subprogram_missing_line_number",
                {
                    "0x1": {
                        "DW_AT_decl_file": '"fidl.h"',
                        "DW_AT_linkage_name": '"mangled_name"',
                    }
                },
                {},
                {},
            ),
            (
                "subprogram_is_not_in_fidl_header",
                {
                    "0x1": {
                        "DW_AT_decl_file": '"fidl.cc"',
                        "DW_AT_decl_line": "1",
                        "DW_AT_linkage_name": '"mangled_name"',
                    }
                },
                {},
                {},
            ),
            (
                "subprogram_missing_mangled_name",
                {
                    "0x1": {
                        "DW_AT_decl_file": '"fidl.h"',
                        "DW_AT_decl_line": "1",
                    }
                },
                {},
                {},
            ),
            (
                "subprogram_already_in_mapping",
                {
                    "0x1": {
                        "DW_AT_decl_file": '"fidl.h"',
                        "DW_AT_decl_line": "1",
                        "DW_AT_linkage_name": '"mangled_name"',
                    }
                },
                {"mangled_name": "fidl_api_name"},
                {"mangled_name": "fidl_api_name"},
            ),
        ]
    )
    def test_add_new_mappings(
        self, name, subprograms_dict, input_mapping_dict, expect_mapping_dict
    ):
        resolver = fidl_api_mapper.FidlApiResolver(
            subprograms_dict, input_mapping_dict
        )
        with mock.patch(
            "builtins.open",
            mock.mock_open(read_data=self.FIDL_HEADER_FILE_CONTENT),
        ):
            resolver.add_new_mappings()
        self.assertEqual(input_mapping_dict, expect_mapping_dict)

    def test_add_new_mappings_snapshot_fidl_file(self):
        # This testcase differs from "test_add_new_mappings" in that it uses
        # a real generated FIDL binding header file snapshotted at a particular
        # revision. So there's no need to mock the content of the file and we
        # can just directly read it instead.
        testdata_path = os.path.join(TEST_DIR_PATH, "snapshot", TEST_FILE_NAME)
        subprograms_dict = {
            "0x1": {
                "DW_AT_decl_file": '"%s"' % testdata_path,
                "DW_AT_decl_line": "652",
                "DW_AT_linkage_name": '"mangled_name"',
            }
        }
        expect_mapping_dict = {
            "mangled_name": "fuchsia.diagnostics.stream/Source.RetireBuffer"
        }
        mapping_dict = {}

        resolver = fidl_api_mapper.FidlApiResolver(
            subprograms_dict, mapping_dict
        )
        resolver.add_new_mappings()
        self.assertEqual(mapping_dict, expect_mapping_dict)

    def test_add_new_mappings_generated_fidl_file(self):
        # Test against generated fidl headers from the current build.
        # Since the line of function declaration can change, we can just
        # the following assertions:
        #    1) At least 1 mapping can be added from iterating through all
        #       lines in the generated fidl header.
        #    2) No crashes from iterating all lines.
        testdata_path = os.path.join(TEST_DIR_PATH, "generated", TEST_FILE_NAME)
        num_lines = len(open(testdata_path).readlines())

        subprograms_dict = {}
        mapping_dict = {}
        for line_num in range(1, num_lines + 1):
            subprograms_dict = {
                "0x1": {
                    "DW_AT_decl_file": '"%s"' % testdata_path,
                    "DW_AT_decl_line": "%d" % line_num,
                    "DW_AT_linkage_name": '"mangled_name_%d"' % line_num,
                }
            }
            resolver = fidl_api_mapper.FidlApiResolver(
                subprograms_dict, mapping_dict
            )
            resolver.add_new_mappings()
        self.assertTrue(mapping_dict)
