| OLD | NEW | 
|---|
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python | 
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be | 
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. | 
| 5 | 5 | 
| 6 """Unit tests for owners.py.""" | 6 """Unit tests for owners.py.""" | 
| 7 | 7 | 
| 8 import os | 8 import os | 
| 9 import sys | 9 import sys | 
| 10 import unittest | 10 import unittest | 
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 73     fopen = fopen or self.fopen | 73     fopen = fopen or self.fopen | 
| 74     os_path = os_path or self.repo | 74     os_path = os_path or self.repo | 
| 75     glob = glob or self.glob | 75     glob = glob or self.glob | 
| 76     return owners.Database(root, fopen, os_path, glob) | 76     return owners.Database(root, fopen, os_path, glob) | 
| 77 | 77 | 
| 78 | 78 | 
| 79 class OwnersDatabaseTest(_BaseTestCase): | 79 class OwnersDatabaseTest(_BaseTestCase): | 
| 80   def test_constructor(self): | 80   def test_constructor(self): | 
| 81     self.assertNotEquals(self.db(), None) | 81     self.assertNotEquals(self.db(), None) | 
| 82 | 82 | 
| 83   def test_dirs_not_covered_by__valid_inputs(self): | 83   def test_files_not_covered_by__valid_inputs(self): | 
| 84     db = self.db() | 84     db = self.db() | 
| 85 | 85 | 
| 86     # Check that we're passed in a sequence that isn't a string. | 86     # Check that we're passed in a sequence that isn't a string. | 
| 87     self.assertRaises(AssertionError, db.directories_not_covered_by, 'foo', []) | 87     self.assertRaises(AssertionError, db.files_not_covered_by, 'foo', []) | 
| 88     if hasattr(owners.collections, 'Iterable'): | 88     if hasattr(owners.collections, 'Iterable'): | 
| 89       self.assertRaises(AssertionError, db.directories_not_covered_by, | 89       self.assertRaises(AssertionError, db.files_not_covered_by, | 
| 90                         (f for f in ['x', 'y']), []) | 90                         (f for f in ['x', 'y']), []) | 
| 91 | 91 | 
| 92     # Check that the files are under the root. | 92     # Check that the files are under the root. | 
| 93     db.root = '/checkout' | 93     db.root = '/checkout' | 
| 94     self.assertRaises(AssertionError, db.directories_not_covered_by, | 94     self.assertRaises(AssertionError, db.files_not_covered_by, | 
| 95                       ['/OWNERS'], []) | 95                       ['/OWNERS'], []) | 
| 96     db.root = '/' | 96     db.root = '/' | 
| 97 | 97 | 
| 98     # Check invalid email address. | 98     # Check invalid email address. | 
| 99     self.assertRaises(AssertionError, db.directories_not_covered_by, | 99     self.assertRaises(AssertionError, db.files_not_covered_by, | 
| 100                       ['OWNERS'], ['foo']) | 100                       ['OWNERS'], ['foo']) | 
| 101 | 101 | 
| 102   def assert_dirs_not_covered_by(self, files, reviewers, unreviewed_dirs): | 102   def assert_files_not_covered_by(self, files, reviewers, unreviewed_files): | 
| 103     db = self.db() | 103     db = self.db() | 
| 104     self.assertEquals( | 104     self.assertEquals(db.files_not_covered_by(set(files), set(reviewers)), | 
| 105         db.directories_not_covered_by(set(files), set(reviewers)), | 105                       set(unreviewed_files)) | 
| 106         set(unreviewed_dirs)) |  | 
| 107 | 106 | 
| 108   def test_dirs_not_covered_by__owners_propagates_down(self): | 107   def test_files_not_covered_by__owners_propagates_down(self): | 
| 109     self.assert_dirs_not_covered_by( | 108     self.assert_files_not_covered_by( | 
| 110       ['chrome/gpu/gpu_channel.h', 'chrome/renderer/gpu/gpu_channel_host.h'], | 109       ['chrome/gpu/gpu_channel.h', 'chrome/renderer/gpu/gpu_channel_host.h'], | 
| 111       [ben], []) | 110       [ben], []) | 
| 112 | 111 | 
| 113   def test_dirs_not_covered_by__partial_covering(self): | 112   def test_files_not_covered_by__partial_covering(self): | 
| 114     self.assert_dirs_not_covered_by( | 113     self.assert_files_not_covered_by( | 
| 115       ['content/content.gyp', 'chrome/renderer/gpu/gpu_channel_host.h'], | 114       ['content/content.gyp', 'chrome/renderer/gpu/gpu_channel_host.h'], | 
| 116       [peter], ['content']) | 115       [peter], ['content/content.gyp']) | 
| 117 | 116 | 
| 118   def test_dirs_not_covered_by__set_noparent_works(self): | 117   def test_files_not_covered_by__set_noparent_works(self): | 
| 119     self.assert_dirs_not_covered_by(['content/content.gyp'], [ben], | 118     self.assert_files_not_covered_by(['content/content.gyp'], [ben], | 
| 120                                     ['content']) | 119                                     ['content/content.gyp']) | 
| 121 | 120 | 
| 122   def test_dirs_not_covered_by__no_reviewer(self): | 121   def test_files_not_covered_by__no_reviewer(self): | 
| 123     self.assert_dirs_not_covered_by( | 122     self.assert_files_not_covered_by( | 
| 124       ['content/content.gyp', 'chrome/renderer/gpu/gpu_channel_host.h'], | 123       ['content/content.gyp', 'chrome/renderer/gpu/gpu_channel_host.h'], | 
| 125       [], ['content']) | 124       [], ['content/content.gyp']) | 
| 126 | 125 | 
| 127   def test_dirs_not_covered_by__combines_directories(self): | 126   def test_files_not_covered_by__combines_directories(self): | 
| 128     self.assert_dirs_not_covered_by(['content/content.gyp', | 127     self.assert_files_not_covered_by(['content/content.gyp', | 
| 129                                      'content/bar/foo.cc', | 128                                      'content/bar/foo.cc', | 
| 130                                      'chrome/renderer/gpu/gpu_channel_host.h'], | 129                                      'chrome/renderer/gpu/gpu_channel_host.h'], | 
| 131                                     [peter], | 130                                     [peter], | 
| 132                                     ['content']) | 131                                     ['content/content.gyp', | 
|  | 132                                      'content/bar/foo.cc']) | 
| 133 | 133 | 
| 134   def test_dirs_not_covered_by__multiple_directories(self): | 134   def test_files_not_covered_by__multiple_directories(self): | 
| 135     self.assert_dirs_not_covered_by( | 135     self.assert_files_not_covered_by( | 
| 136         ['content/content.gyp',                    # Not covered | 136         ['content/content.gyp',                    # Not covered | 
| 137          'content/bar/foo.cc',                     # Not covered (combines in) | 137          'content/bar/foo.cc',                     # Not covered (combines in) | 
| 138          'content/baz/froboz.h',                   # Not covered | 138          'content/baz/froboz.h',                   # Not covered | 
| 139          'chrome/gpu/gpu_channel.h',               # Owned by ken | 139          'chrome/gpu/gpu_channel.h',               # Owned by ken | 
| 140          'chrome/renderer/gpu/gpu_channel_host.h'  # Owned by * via parent | 140          'chrome/renderer/gpu/gpu_channel_host.h'  # Owned by * via parent | 
| 141         ], | 141         ], | 
| 142         [ken], | 142         [ken], | 
| 143         ['content', 'content/baz']) | 143         ['content/content.gyp', 'content/bar/foo.cc', 'content/baz/froboz.h']) | 
| 144 | 144 | 
| 145   def test_per_file(self): | 145   def test_per_file(self): | 
| 146     # brett isn't allowed to approve ugly.cc | 146     # brett isn't allowed to approve ugly.cc | 
| 147     self.files['/content/baz/OWNERS'] = owners_file(brett, | 147     self.files['/content/baz/OWNERS'] = owners_file(brett, | 
| 148         lines=['per-file ugly.*=tom@example.com']) | 148         lines=['per-file ugly.*=tom@example.com']) | 
| 149     self.assert_dirs_not_covered_by(['content/baz/ugly.cc'], | 149     self.assert_files_not_covered_by(['content/baz/ugly.cc'], | 
| 150                                     [brett], | 150                                     [brett], | 
| 151                                     []) | 151                                     []) | 
| 152 | 152 | 
| 153     # tom is allowed to approve ugly.cc, but not froboz.h | 153     # tom is allowed to approve ugly.cc, but not froboz.h | 
| 154     self.assert_dirs_not_covered_by(['content/baz/ugly.cc'], | 154     self.assert_files_not_covered_by(['content/baz/ugly.cc'], | 
| 155                                     [tom], | 155                                     [tom], | 
| 156                                     []) | 156                                     []) | 
| 157     self.assert_dirs_not_covered_by(['content/baz/froboz.h'], | 157     self.assert_files_not_covered_by(['content/baz/froboz.h'], | 
| 158                                     [tom], | 158                                     [tom], | 
| 159                                     ['content/baz']) | 159                                     ['content/baz/froboz.h']) | 
| 160 | 160 | 
| 161   def test_per_file_with_spaces(self): | 161   def test_per_file_with_spaces(self): | 
| 162     # This is the same as test_per_file(), except that we include spaces | 162     # This is the same as test_per_file(), except that we include spaces | 
| 163     # on the per-file line. brett isn't allowed to approve ugly.cc; | 163     # on the per-file line. brett isn't allowed to approve ugly.cc; | 
| 164     # tom is allowed to approve ugly.cc, but not froboz.h | 164     # tom is allowed to approve ugly.cc, but not froboz.h | 
| 165     self.files['/content/baz/OWNERS'] = owners_file(brett, | 165     self.files['/content/baz/OWNERS'] = owners_file(brett, | 
| 166         lines=['per-file ugly.* = tom@example.com']) | 166         lines=['per-file ugly.* = tom@example.com']) | 
| 167     self.assert_dirs_not_covered_by(['content/baz/ugly.cc'], | 167     self.assert_files_not_covered_by(['content/baz/ugly.cc'], | 
| 168                                     [brett], | 168                                     [brett], | 
| 169                                     []) | 169                                     []) | 
| 170 | 170 | 
| 171     self.assert_dirs_not_covered_by(['content/baz/ugly.cc'], | 171     self.assert_files_not_covered_by(['content/baz/ugly.cc'], | 
| 172                                     [tom], | 172                                     [tom], | 
| 173                                     []) | 173                                     []) | 
| 174     self.assert_dirs_not_covered_by(['content/baz/froboz.h'], | 174     self.assert_files_not_covered_by(['content/baz/froboz.h'], | 
| 175                                     [tom], | 175                                     [tom], | 
| 176                                     ['content/baz']) | 176                                     ['content/baz/froboz.h']) | 
| 177 | 177 | 
| 178   def test_per_file__set_noparent(self): | 178   def test_per_file__set_noparent(self): | 
| 179     self.files['/content/baz/OWNERS'] = owners_file(brett, | 179     self.files['/content/baz/OWNERS'] = owners_file(brett, | 
| 180         lines=['per-file ugly.*=tom@example.com', | 180         lines=['per-file ugly.*=tom@example.com', | 
| 181                'per-file ugly.*=set noparent']) | 181                'per-file ugly.*=set noparent']) | 
| 182 | 182 | 
| 183     # brett isn't allowed to approve ugly.cc | 183     # brett isn't allowed to approve ugly.cc | 
| 184     self.assert_dirs_not_covered_by(['content/baz/ugly.cc'], | 184     self.assert_files_not_covered_by(['content/baz/ugly.cc'], | 
| 185                                     [brett], | 185                                     [brett], | 
| 186                                     ['content/baz/ugly.cc']) | 186                                     ['content/baz/ugly.cc']) | 
| 187 | 187 | 
| 188     # tom is allowed to approve ugly.cc, but not froboz.h | 188     # tom is allowed to approve ugly.cc, but not froboz.h | 
| 189     self.assert_dirs_not_covered_by(['content/baz/ugly.cc'], | 189     self.assert_files_not_covered_by(['content/baz/ugly.cc'], | 
| 190                                     [tom], | 190                                     [tom], | 
| 191                                     []) | 191                                     []) | 
| 192 | 192 | 
| 193     self.assert_dirs_not_covered_by(['content/baz/froboz.h'], | 193     self.assert_files_not_covered_by(['content/baz/froboz.h'], | 
| 194                                     [tom], | 194                                     [tom], | 
| 195                                     ['content/baz']) | 195                                     ['content/baz/froboz.h']) | 
| 196 | 196 | 
| 197   def test_per_file_wildcard(self): | 197   def test_per_file_wildcard(self): | 
| 198     self.files['/OWNERS'] = 'per-file DEPS=*\n' | 198     self.files['/OWNERS'] = 'per-file DEPS=*\n' | 
| 199     self.assert_dirs_not_covered_by(['DEPS'], [brett], []) | 199     self.assert_files_not_covered_by(['DEPS'], [brett], []) | 
| 200 | 200 | 
| 201   def test_mock_relpath(self): | 201   def test_mock_relpath(self): | 
| 202     # This test ensures the mock relpath has the arguments in the right | 202     # This test ensures the mock relpath has the arguments in the right | 
| 203     # order; this should probably live someplace else. | 203     # order; this should probably live someplace else. | 
| 204     self.assertEquals(self.repo.relpath('foo/bar.c', 'foo/'), 'bar.c') | 204     self.assertEquals(self.repo.relpath('foo/bar.c', 'foo/'), 'bar.c') | 
| 205     self.assertEquals(self.repo.relpath('/bar.c', '/'), 'bar.c') | 205     self.assertEquals(self.repo.relpath('/bar.c', '/'), 'bar.c') | 
| 206 | 206 | 
| 207   def test_per_file_glob_across_dirs_not_allowed(self): | 207   def test_per_file_glob_across_dirs_not_allowed(self): | 
| 208     self.files['/OWNERS'] = 'per-file content/*=john@example.org\n' | 208     self.files['/OWNERS'] = 'per-file content/*=john@example.org\n' | 
| 209     self.assertRaises(owners.SyntaxErrorInOwnersFile, | 209     self.assertRaises(owners.SyntaxErrorInOwnersFile, | 
| 210         self.db().directories_not_covered_by, ['DEPS'], [brett]) | 210         self.db().files_not_covered_by, ['DEPS'], [brett]) | 
| 211 | 211 | 
| 212   def assert_syntax_error(self, owners_file_contents): | 212   def assert_syntax_error(self, owners_file_contents): | 
| 213     db = self.db() | 213     db = self.db() | 
| 214     self.files['/foo/OWNERS'] = owners_file_contents | 214     self.files['/foo/OWNERS'] = owners_file_contents | 
| 215     self.files['/foo/DEPS'] = '' | 215     self.files['/foo/DEPS'] = '' | 
| 216     try: | 216     try: | 
| 217       db.reviewers_for(['foo/DEPS']) | 217       db.reviewers_for(['foo/DEPS']) | 
| 218       self.fail()  # pragma: no cover | 218       self.fail()  # pragma: no cover | 
| 219     except owners.SyntaxErrorInOwnersFile, e: | 219     except owners.SyntaxErrorInOwnersFile, e: | 
| 220       self.assertTrue(str(e).startswith('/foo/OWNERS:1')) | 220       self.assertTrue(str(e).startswith('/foo/OWNERS:1')) | 
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 386                       ('chrome/browser', 2)], | 386                       ('chrome/browser', 2)], | 
| 387                 ken: [('chrome/gpu', 1)], | 387                 ken: [('chrome/gpu', 1)], | 
| 388                 peter: [('chrome/renderer', 1)], | 388                 peter: [('chrome/renderer', 1)], | 
| 389                 brett: [('chrome/browser', 1)]}, | 389                 brett: [('chrome/browser', 1)]}, | 
| 390                ['chrome/gpu', 'chrome/renderer', | 390                ['chrome/gpu', 'chrome/renderer', | 
| 391                 'chrome/browser'], | 391                 'chrome/browser'], | 
| 392                ben) | 392                ben) | 
| 393 | 393 | 
| 394 if __name__ == '__main__': | 394 if __name__ == '__main__': | 
| 395   unittest.main() | 395   unittest.main() | 
| OLD | NEW | 
|---|