1# Copyright (C) 2010 Chris Jerdonek (cjerdonek@webkit.org)
2#
3# Redistribution and use in source and binary forms, with or without
4# modification, are permitted provided that the following conditions
5# are met:
6# 1.  Redistributions of source code must retain the above copyright
7#     notice, this list of conditions and the following disclaimer.
8# 2.  Redistributions in binary form must reproduce the above copyright
9#     notice, this list of conditions and the following disclaimer in the
10#     documentation and/or other materials provided with the distribution.
11#
12# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
13# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
14# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
15# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
16# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
17# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
18# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
19# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
20# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
21# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22
23"""Unit tests for main.py."""
24
25import os
26import unittest
27
28from main import change_directory
29from webkitpy.style_references import LogTesting
30
31
32class ChangeDirectoryTest(unittest.TestCase):
33
34    """Tests change_directory()."""
35
36    _original_directory = "/original"
37    _checkout_root = "/WebKit"
38
39    class _MockOs(object):
40
41        """A mock os module for unit testing."""
42
43        def __init__(self, test_case):
44            self._test_case = test_case
45            self._current_directory = \
46                ChangeDirectoryTest._original_directory
47
48        def chdir(self, current_directory):
49            self._current_directory = current_directory
50
51        def assertCurrentDirectory(self, expected_directory):
52            self._test_case.assertEquals(expected_directory,
53                                         self._current_directory)
54
55    def setUp(self):
56        self._log = LogTesting.setUp(self)
57        self._mock_os = self._MockOs(self)
58
59    def tearDown(self):
60        self._log.tearDown()
61
62    # This method is a convenient wrapper for change_working_directory() that
63    # passes the mock_os for this unit testing class.
64    def _change_directory(self, paths, checkout_root):
65        return change_directory(paths=paths,
66                                checkout_root=checkout_root,
67                                mock_os=self._mock_os)
68
69    def _assert_result(self, actual_return_value, expected_return_value,
70                       expected_log_messages, expected_current_directory):
71        self.assertEquals(actual_return_value, expected_return_value)
72        self._log.assertMessages(expected_log_messages)
73        self._mock_os.assertCurrentDirectory(expected_current_directory)
74
75    def test_checkout_root_none_paths_none(self):
76        self.assertRaises(Exception, self._change_directory,
77                          checkout_root=None, paths=None)
78        self._log.assertMessages([])
79        self._mock_os.assertCurrentDirectory(self._original_directory)
80
81    def test_checkout_root_none(self):
82        paths = self._change_directory(checkout_root=None,
83                                       paths=["path1"])
84        log_messages = [
85"""WARNING: WebKit checkout root not found:
86  Path-dependent style checks may not work correctly.
87  See the help documentation for more info.
88"""]
89        self._assert_result(paths, ["path1"], log_messages,
90                            self._original_directory)
91
92    def test_paths_none(self):
93        paths = self._change_directory(checkout_root=self._checkout_root,
94                                       paths=None)
95        self._assert_result(paths, None, [], self._checkout_root)
96
97    def test_paths_convertible(self):
98        paths=["/WebKit/foo1.txt",
99               "/WebKit/foo2.txt"]
100        paths = self._change_directory(checkout_root=self._checkout_root,
101                                       paths=paths)
102        self._assert_result(paths, ["foo1.txt", "foo2.txt"], [],
103                            self._checkout_root)
104
105    def test_with_scm_paths_unconvertible(self):
106        paths=["/WebKit/foo1.txt",
107               "/outside/foo2.txt"]
108        paths = self._change_directory(checkout_root=self._checkout_root,
109                                       paths=paths)
110        log_messages = [
111"""WARNING: Path-dependent style checks may not work correctly:
112
113  One of the given paths is outside the WebKit checkout of the current
114  working directory:
115
116    Path: /outside/foo2.txt
117    Checkout root: /WebKit
118
119  Pass only files below the checkout root to ensure correct results.
120  See the help documentation for more info.
121
122"""]
123        self._assert_result(paths, paths, log_messages,
124                            self._original_directory)
125