#!/usr/bin/env vpython3
# Copyright (c) 2011 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Unit tests for watchlists.py."""

# pylint: disable=E1103,no-value-for-parameter,protected-access

import os
import sys
import unittest

if sys.version_info.major == 2:
  import mock
else:
  from unittest import mock

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

import watchlists


class WatchlistsTest(unittest.TestCase):

  def setUp(self):
    super(WatchlistsTest, self).setUp()
    mock.patch('watchlists.Watchlists._HasWatchlistsFile').start()
    mock.patch('watchlists.Watchlists._ContentsOfWatchlistsFile').start()
    mock.patch('watchlists.logging.error').start()
    self.addCleanup(mock.patch.stopall)

  def testMissingWatchlistsFileOK(self):
    """Test that we act gracefully if WATCHLISTS file is missing."""
    watchlists.Watchlists._HasWatchlistsFile.return_value = False

    wl = watchlists.Watchlists('/some/random/path')
    self.assertEqual(wl.GetWatchersForPaths(['some_path']), [])

  def testGarbledWatchlistsFileOK(self):
    """Test that we act gracefully if WATCHLISTS file is garbled."""
    contents = 'some garbled and unwanted text'
    watchlists.Watchlists._HasWatchlistsFile.return_value = True
    watchlists.Watchlists._ContentsOfWatchlistsFile.return_value = contents

    wl = watchlists.Watchlists('/a/path')
    self.assertEqual(wl.GetWatchersForPaths(['some_path']), [])

  def testNoWatchers(self):
    contents = \
      """{
        'WATCHLIST_DEFINITIONS': {
          'a_module': {
            'filepath': 'a_module',
          },
        },

        'WATCHLISTS': {
          'a_module': [],
        },
      } """
    watchlists.Watchlists._HasWatchlistsFile.return_value = True
    watchlists.Watchlists._ContentsOfWatchlistsFile.return_value = contents

    wl = watchlists.Watchlists('/a/path')
    self.assertEqual(wl.GetWatchersForPaths(['a_module']), [])

  def testValidWatcher(self):
    watchers = ['abc@def.com', 'x1@xyz.org']
    contents = \
      """{
        'WATCHLIST_DEFINITIONS': {
          'a_module': {
            'filepath': 'a_module',
          },
        },
        'WATCHLISTS': {
          'a_module': %s,
        },
      } """ % watchers
    watchlists.Watchlists._HasWatchlistsFile.return_value = True
    watchlists.Watchlists._ContentsOfWatchlistsFile.return_value = contents

    wl = watchlists.Watchlists('/a/path')
    self.assertEqual(wl.GetWatchersForPaths(['a_module']), watchers)

  def testMultipleWatchlistsTrigger(self):
    """Test that multiple watchlists can get triggered for one filepath."""
    contents = \
      """{
        'WATCHLIST_DEFINITIONS': {
          'mac': {
            'filepath': 'mac',
          },
          'views': {
            'filepath': 'views',
          },
        },
        'WATCHLISTS': {
          'mac': ['x1@chromium.org'],
          'views': ['x2@chromium.org'],
        },
      } """
    watchlists.Watchlists._HasWatchlistsFile.return_value = True
    watchlists.Watchlists._ContentsOfWatchlistsFile.return_value = contents

    wl = watchlists.Watchlists('/a/path')
    self.assertEqual(wl.GetWatchersForPaths(['file_views_mac']),
        ['x1@chromium.org', 'x2@chromium.org'])

  def testDuplicateWatchers(self):
    """Test that multiple watchlists can get triggered for one filepath."""
    watchers = ['someone@chromium.org']
    contents = \
      """{
        'WATCHLIST_DEFINITIONS': {
          'mac': {
            'filepath': 'mac',
          },
          'views': {
            'filepath': 'views',
          },
        },
        'WATCHLISTS': {
          'mac': %s,
          'views': %s,
        },
      } """ % (watchers, watchers)
    watchlists.Watchlists._HasWatchlistsFile.return_value = True
    watchlists.Watchlists._ContentsOfWatchlistsFile.return_value = contents

    wl = watchlists.Watchlists('/a/path')
    self.assertEqual(wl.GetWatchersForPaths(['file_views_mac']), watchers)

  def testWinPathWatchers(self):
    """Test watchers for a windows path (containing backward slashes)."""
    watchers = ['abc@def.com', 'x1@xyz.org']
    contents = \
      """{
        'WATCHLIST_DEFINITIONS': {
          'browser': {
            'filepath': 'chrome/browser/.*',
          },
        },
        'WATCHLISTS': {
          'browser': %s,
        },
      } """ % watchers
    saved_sep = watchlists.os.sep
    watchlists.os.sep = '\\'  # to pose as win32
    watchlists.Watchlists._HasWatchlistsFile.return_value = True
    watchlists.Watchlists._ContentsOfWatchlistsFile.return_value = contents

    wl = watchlists.Watchlists(r'a\path')
    returned_watchers = wl.GetWatchersForPaths(
          [r'chrome\browser\renderer_host\render_widget_host.h'])
    watchlists.os.sep = saved_sep  # revert back os.sep before asserts
    self.assertEqual(returned_watchers, watchers)


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