#!/usr/bin/env vpython3

# Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.

import ast
import os
import unittest

import check_package_boundaries

MSG_FORMAT = 'ERROR:check_package_boundaries.py: Unexpected %s.'
TESTDATA_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)),
                            'testdata')


def ReadPylFile(file_path):
  with open(file_path) as f:
    return ast.literal_eval(f.read())


class UnitTest(unittest.TestCase):
  def _RunTest(self, test_dir, check_all_build_files=False):
    build_files = [os.path.join(test_dir, 'BUILD.gn')]
    if check_all_build_files:
      build_files = None

    messages = []
    for violation in check_package_boundaries.CheckPackageBoundaries(
        test_dir, build_files):
      build_file_path = os.path.relpath(violation.build_file_path, test_dir)
      build_file_path = build_file_path.replace(os.path.sep, '/')
      messages.append(violation._replace(build_file_path=build_file_path))

    expected_messages = ReadPylFile(os.path.join(test_dir, 'expected.pyl'))
    self.assertListEqual(sorted(expected_messages), sorted(messages))

  def testNoErrors(self):
    self._RunTest(os.path.join(TESTDATA_DIR, 'no_errors'))

  def testMultipleErrorsSingleTarget(self):
    self._RunTest(os.path.join(TESTDATA_DIR, 'multiple_errors_single_target'))

  def testMultipleErrorsMultipleTargets(self):
    self._RunTest(os.path.join(TESTDATA_DIR,
                               'multiple_errors_multiple_targets'))

  def testCommonPrefix(self):
    self._RunTest(os.path.join(TESTDATA_DIR, 'common_prefix'))

  def testAllBuildFiles(self):
    self._RunTest(os.path.join(TESTDATA_DIR, 'all_build_files'), True)

  def testSanitizeFilename(self):
    # The `dangerous_filename` test case contains a directory with '++' in its
    # name. If it's not properly escaped, a regex error would be raised.
    self._RunTest(os.path.join(TESTDATA_DIR, 'dangerous_filename'), True)

  def testRelativeFilename(self):
    test_dir = os.path.join(TESTDATA_DIR, 'all_build_files')
    with self.assertRaises(AssertionError):
      check_package_boundaries.CheckPackageBoundaries(test_dir, ["BUILD.gn"])


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