#!/usr/bin/env python
# Copyright (C) 2010 Google Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1.  Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
# 2.  Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

"""Unit tests for deduplicate_tests.py."""

import deduplicate_tests
import os
import unittest
import webkitpy.common.checkout.scm as scm


class MockExecutive(object):
    last_run_command = []
    response = ''

    class Executive(object):
        def run_command(self,
                        args,
                        cwd=None,
                        input=None,
                        error_handler=None,
                        return_exit_code=False,
                        return_stderr=True,
                        decode_output=True):
            MockExecutive.last_run_command += [args]
            return MockExecutive.response


class ListDuplicatesTest(unittest.TestCase):
    def setUp(self):
        MockExecutive.last_run_command = []
        MockExecutive.response = ''
        deduplicate_tests.executive = MockExecutive
        self._original_cwd = os.getcwd()
        checkout_root = scm.find_checkout_root()
        self.assertNotEqual(checkout_root, None)
        os.chdir(checkout_root)

    def tearDown(self):
        os.chdir(self._original_cwd)

    def test_parse_git_output(self):
        git_output = (
            '100644 blob 5053240b3353f6eb39f7cb00259785f16d121df2\tLayoutTests/mac/foo-expected.txt\n'
            '100644 blob a004548d107ecc4e1ea08019daf0a14e8634a1ff\tLayoutTests/platform/chromium/foo-expected.txt\n'
            '100644 blob d6bb0bc762e3aec5df03b5c04485b2cb3b65ffb1\tLayoutTests/platform/chromium-linux/foo-expected.txt\n'
            '100644 blob abcdebc762e3aec5df03b5c04485b2cb3b65ffb1\tLayoutTests/platform/chromium-linux/animage.png\n'
            '100644 blob d6bb0bc762e3aec5df03b5c04485b2cb3b65ffb1\tLayoutTests/platform/chromium-win/foo-expected.txt\n'
            '100644 blob abcdebc762e3aec5df03b5c04485b2cb3b65ffb1\tLayoutTests/platform/chromium-win/animage.png\n'
            '100644 blob 4303df5389ca87cae83dd3236b8dd84e16606517\tLayoutTests/platform/mac/foo-expected.txt\n')
        hashes = deduplicate_tests.parse_git_output(git_output, '*')
        expected = {('mac/foo-expected.txt', '5053240b3353f6eb39f7cb00259785f16d121df2'): set(['mac/foo-expected.txt']),
                    ('animage.png', 'abcdebc762e3aec5df03b5c04485b2cb3b65ffb1'): set(['platform/chromium-linux/animage.png', 'platform/chromium-win/animage.png']),
                    ('foo-expected.txt', '4303df5389ca87cae83dd3236b8dd84e16606517'): set(['platform/mac/foo-expected.txt']),
                    ('foo-expected.txt', 'd6bb0bc762e3aec5df03b5c04485b2cb3b65ffb1'): set(['platform/chromium-linux/foo-expected.txt', 'platform/chromium-win/foo-expected.txt']),
                    ('foo-expected.txt', 'a004548d107ecc4e1ea08019daf0a14e8634a1ff'): set(['platform/chromium/foo-expected.txt'])}
        self.assertEquals(expected, hashes)

        hashes = deduplicate_tests.parse_git_output(git_output, '*.png')
        expected = {('animage.png', 'abcdebc762e3aec5df03b5c04485b2cb3b65ffb1'): set(['platform/chromium-linux/animage.png', 'platform/chromium-win/animage.png'])}
        self.assertEquals(expected, hashes)

    def test_extract_platforms(self):
        self.assertEquals({'foo': 'platform/foo/bar',
                           'zoo': 'platform/zoo/com'},
                           deduplicate_tests.extract_platforms(['platform/foo/bar', 'platform/zoo/com']))
        self.assertEquals({'foo': 'platform/foo/bar',
                           deduplicate_tests._BASE_PLATFORM: 'what/'},
                           deduplicate_tests.extract_platforms(['platform/foo/bar', 'what/']))

    def test_has_intermediate_results(self):
        test_cases = (
            # If we found a duplicate in our first fallback, we have no
            # intermediate results.
            (False, ('fast/foo-expected.txt',
                     ['chromium-win', 'chromium', 'base'],
                     'chromium-win-win7',
                     lambda path: True)),
            # Since chromium-win has a result, we have an intermediate result.
            (True,  ('fast/foo-expected.txt',
                     ['chromium-win', 'chromium', 'base'],
                     'chromium',
                     lambda path: True)),
            # There are no intermediate results.
            (False, ('fast/foo-expected.txt',
                     ['chromium-win', 'chromium', 'base'],
                     'chromium',
                     lambda path: False)),
            # There are no intermediate results since a result for chromium is
            # our duplicate file.
            (False, ('fast/foo-expected.txt',
                     ['chromium-win', 'chromium', 'base'],
                     'chromium',
                     lambda path: path == 'LayoutTests/platform/chromium/fast/foo-expected.txt')),
            # We have an intermediate result in 'chromium' even though our
            # duplicate is with the file in 'base'.
            (True,  ('fast/foo-expected.txt',
                     ['chromium-win', 'chromium', 'base'],
                     'base',
                     lambda path: path == 'LayoutTests/platform/chromium/fast/foo-expected.txt')),
            # We have an intermediate result in 'chromium-win' even though our
            # duplicate is in 'base'.
            (True,  ('fast/foo-expected.txt',
                     ['chromium-win', 'chromium', 'base'],
                     'base',
                     lambda path: path == 'LayoutTests/platform/chromium-win/fast/foo-expected.txt')),
        )
        for expected, inputs in test_cases:
            self.assertEquals(expected,
                deduplicate_tests.has_intermediate_results(*inputs))

    def test_unique(self):
        MockExecutive.response = (
            '100644 blob 5053240b3353f6eb39f7cb00259785f16d121df2\tLayoutTests/mac/foo-expected.txt\n'
            '100644 blob a004548d107ecc4e1ea08019daf0a14e8634a1ff\tLayoutTests/platform/chromium/foo-expected.txt\n'
            '100644 blob abcd0bc762e3aec5df03b5c04485b2cb3b65ffb1\tLayoutTests/platform/chromium-linux/foo-expected.txt\n'
            '100644 blob d6bb0bc762e3aec5df03b5c04485b2cb3b65ffb1\tLayoutTests/platform/chromium-win/foo-expected.txt\n'
            '100644 blob 4303df5389ca87cae83dd3236b8dd84e16606517\tLayoutTests/platform/mac/foo-expected.txt\n')
        result = deduplicate_tests.deduplicate('*')
        self.assertEquals(1, len(MockExecutive.last_run_command))
        self.assertEquals(('git', 'ls-tree', '-r', 'HEAD', 'LayoutTests'), MockExecutive.last_run_command[-1])
        self.assertEquals(0, len(result))

    def test_duplicates(self):
        MockExecutive.response = (
            '100644 blob 5053240b3353f6eb39f7cb00259785f16d121df2\tLayoutTests/mac/foo-expected.txt\n'
            '100644 blob a004548d107ecc4e1ea08019daf0a14e8634a1ff\tLayoutTests/platform/chromium/foo-expected.txt\n'
            '100644 blob d6bb0bc762e3aec5df03b5c04485b2cb3b65ffb1\tLayoutTests/platform/chromium-linux/foo-expected.txt\n'
            '100644 blob abcdebc762e3aec5df03b5c04485b2cb3b65ffb1\tLayoutTests/platform/chromium-linux/animage.png\n'
            '100644 blob d6bb0bc762e3aec5df03b5c04485b2cb3b65ffb1\tLayoutTests/platform/chromium-win/foo-expected.txt\n'
            '100644 blob abcdebc762e3aec5df03b5c04485b2cb3b65ffb1\tLayoutTests/platform/chromium-win/animage.png\n'
            '100644 blob 4303df5389ca87cae83dd3236b8dd84e16606517\tLayoutTests/platform/mac/foo-expected.txt\n')

        result = deduplicate_tests.deduplicate('*')
        self.assertEquals(1, len(MockExecutive.last_run_command))
        self.assertEquals(('git', 'ls-tree', '-r', 'HEAD', 'LayoutTests'), MockExecutive.last_run_command[-1])
        self.assertEquals(2, len(result))
        self.assertEquals({'test': 'animage.png',
                           'path': 'LayoutTests/platform/chromium-linux/animage.png',
                           'fallback': 'chromium-win',
                           'platform': 'chromium-linux-x86'},
                          result[0])
        self.assertEquals({'test': 'foo-expected.txt',
                           'path': 'LayoutTests/platform/chromium-linux/foo-expected.txt',
                           'fallback': 'chromium-win',
                           'platform': 'chromium-linux-x86'},
                          result[1])

        result = deduplicate_tests.deduplicate('*.txt')
        self.assertEquals(2, len(MockExecutive.last_run_command))
        self.assertEquals(('git', 'ls-tree', '-r', 'HEAD', 'LayoutTests'), MockExecutive.last_run_command[-1])
        self.assertEquals(1, len(result))
        self.assertEquals({'test': 'foo-expected.txt',
                           'path': 'LayoutTests/platform/chromium-linux/foo-expected.txt',
                           'fallback': 'chromium-win',
                           'platform': 'chromium-linux-x86'},
                          result[0])

        result = deduplicate_tests.deduplicate('*.png')
        self.assertEquals(3, len(MockExecutive.last_run_command))
        self.assertEquals(('git', 'ls-tree', '-r', 'HEAD', 'LayoutTests'), MockExecutive.last_run_command[-1])
        self.assertEquals(1, len(result))
        self.assertEquals({'test': 'animage.png',
                           'path': 'LayoutTests/platform/chromium-linux/animage.png',
                           'fallback': 'chromium-win',
                           'platform': 'chromium-linux-x86'},
                          result[0])

    def test_get_relative_test_path(self):
        checkout_root = scm.find_checkout_root()
        layout_test_dir = os.path.join(checkout_root, 'LayoutTests')
        test_cases = (
            ('platform/mac/test.html',
             ('platform/mac/test.html', layout_test_dir)),
            ('LayoutTests/platform/mac/test.html',
             ('platform/mac/test.html', checkout_root)),
            (None,
             ('platform/mac/test.html', os.path.join(checkout_root, 'Source', 'WebCore'))),
            ('test.html',
             ('platform/mac/test.html', os.path.join(layout_test_dir, 'platform/mac'))),
            (None,
             ('platform/mac/test.html', os.path.join(layout_test_dir, 'platform/win'))),
        )
        for expected, inputs in test_cases:
            self.assertEquals(expected,
                              deduplicate_tests.get_relative_test_path(*inputs))

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