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