Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11)

Side by Side Diff: tests/owners_unittest.py

Issue 9621012: Show a list of directories missing OWNER reviewers on upload, and show directories rather than file… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools/
Patch Set: Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « presubmit_canned_checks.py ('k') | tests/presubmit_unittest.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2011 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 26 matching lines...) Expand all
37 '/OWNERS': owners_file(owners.EVERYONE), 37 '/OWNERS': owners_file(owners.EVERYONE),
38 '/base/vlog.h': '', 38 '/base/vlog.h': '',
39 '/chrome/OWNERS': owners_file(ben, brett), 39 '/chrome/OWNERS': owners_file(ben, brett),
40 '/chrome/gpu/OWNERS': owners_file(ken), 40 '/chrome/gpu/OWNERS': owners_file(ken),
41 '/chrome/gpu/gpu_channel.h': '', 41 '/chrome/gpu/gpu_channel.h': '',
42 '/chrome/renderer/OWNERS': owners_file(peter), 42 '/chrome/renderer/OWNERS': owners_file(peter),
43 '/chrome/renderer/gpu/gpu_channel_host.h': '', 43 '/chrome/renderer/gpu/gpu_channel_host.h': '',
44 '/chrome/renderer/safe_browsing/scorer.h': '', 44 '/chrome/renderer/safe_browsing/scorer.h': '',
45 '/content/OWNERS': owners_file(john, darin, comment='foo', noparent=True), 45 '/content/OWNERS': owners_file(john, darin, comment='foo', noparent=True),
46 '/content/content.gyp': '', 46 '/content/content.gyp': '',
47 '/content/bar/foo.cc': '',
48 '/content/baz/OWNERS': owners_file(brett),
49 '/content/baz/froboz.h': '',
47 '/content/views/OWNERS': owners_file(ben, john, owners.EVERYONE, 50 '/content/views/OWNERS': owners_file(ben, john, owners.EVERYONE,
48 noparent=True), 51 noparent=True),
49 }) 52 })
50 53
51 54
52 class OwnersDatabaseTest(unittest.TestCase): 55 class OwnersDatabaseTest(unittest.TestCase):
53 def setUp(self): 56 def setUp(self):
54 self.repo = test_repo() 57 self.repo = test_repo()
55 self.files = self.repo.files 58 self.files = self.repo.files
56 self.root = '/' 59 self.root = '/'
57 self.fopen = self.repo.open_for_reading 60 self.fopen = self.repo.open_for_reading
58 61
59 def db(self, root=None, fopen=None, os_path=None): 62 def db(self, root=None, fopen=None, os_path=None):
60 root = root or self.root 63 root = root or self.root
61 fopen = fopen or self.fopen 64 fopen = fopen or self.fopen
62 os_path = os_path or self.repo 65 os_path = os_path or self.repo
63 return owners.Database(root, fopen, os_path) 66 return owners.Database(root, fopen, os_path)
64 67
65 def test_constructor(self): 68 def test_constructor(self):
66 self.assertNotEquals(self.db(), None) 69 self.assertNotEquals(self.db(), None)
67 70
68 def assert_covered_by(self, files, reviewers): 71 def test_dirs_not_covered_by__valid_inputs(self):
69 db = self.db()
70 self.assertTrue(db.files_are_covered_by(set(files), set(reviewers)))
71
72 def test_covered_by__everyone(self):
73 self.assert_covered_by(['DEPS'], [john])
74 self.assert_covered_by(['DEPS'], [darin])
75
76 def test_covered_by__explicit(self):
77 self.assert_covered_by(['content/content.gyp'], [john])
78 self.assert_covered_by(['chrome/gpu/OWNERS'], [ken])
79
80 def test_covered_by__owners_plus_everyone(self):
81 self.assert_covered_by(['/content/views/OWNERS'], [ben])
82 self.assert_covered_by(['/content/views/OWNERS'], [ken])
83
84 def test_covered_by__owners_propagates_down(self):
85 self.assert_covered_by(['chrome/gpu/OWNERS'], [ben])
86
87 def test_covered_by__no_file_in_dir(self):
88 self.assert_covered_by(['/chrome/renderer/gpu/gpu_channel_host.h'], [peter])
89
90 def assert_not_covered_by(self, files, reviewers, unreviewed_files):
91 db = self.db()
92 self.assertEquals(db.files_not_covered_by(set(files), set(reviewers)),
93 set(unreviewed_files))
94
95 def test_not_covered_by__need_at_least_one_reviewer(self):
96 self.assert_not_covered_by(['DEPS'], [], ['DEPS'])
97
98 def test_not_covered_by__owners_propagates_down(self):
99 self.assert_not_covered_by(
100 ['chrome/gpu/gpu_channel.h', 'chrome/renderer/gpu/gpu_channel_host.h'],
101 [ben], [])
102
103 def test_not_covered_by__partial_covering(self):
104 self.assert_not_covered_by(
105 ['content/content.gyp', 'chrome/renderer/gpu/gpu_channel_host.h'],
106 [peter], ['content/content.gyp'])
107
108 def test_not_covered_by__set_noparent_works(self):
109 self.assert_not_covered_by(['content/content.gyp'], [ben],
110 ['content/content.gyp'])
111
112 def test_not_covered_by__valid_inputs(self):
113 db = self.db() 72 db = self.db()
114 73
115 # Check that we're passed in a sequence that isn't a string. 74 # Check that we're passed in a sequence that isn't a string.
116 self.assertRaises(AssertionError, db.files_not_covered_by, 'foo', []) 75 self.assertRaises(AssertionError, db.directories_not_covered_by, 'foo', [])
117 if hasattr(owners.collections, 'Iterable'): 76 if hasattr(owners.collections, 'Iterable'):
118 self.assertRaises(AssertionError, db.files_not_covered_by, 77 self.assertRaises(AssertionError, db.directories_not_covered_by,
119 (f for f in ['x', 'y']), []) 78 (f for f in ['x', 'y']), [])
120 79
121 # Check that the files are under the root. 80 # Check that the files are under the root.
122 db.root = '/checkout' 81 db.root = '/checkout'
123 self.assertRaises(AssertionError, db.files_not_covered_by, ['/OWNERS'], 82 self.assertRaises(AssertionError, db.directories_not_covered_by,
124 []) 83 ['/OWNERS'], [])
125 db.root = '/' 84 db.root = '/'
126 85
127 # Check invalid email address. 86 # Check invalid email address.
128 self.assertRaises(AssertionError, db.files_not_covered_by, ['OWNERS'], 87 self.assertRaises(AssertionError, db.directories_not_covered_by,
129 ['foo']) 88 ['OWNERS'], ['foo'])
130 89
90 def assert_dirs_not_covered_by(self, files, reviewers, unreviewed_dirs):
91 db = self.db()
92 self.assertEquals(
93 db.directories_not_covered_by(set(files), set(reviewers)),
94 set(unreviewed_dirs))
95
96 def test_dirs_not_covered_by__owners_propagates_down(self):
97 self.assert_dirs_not_covered_by(
98 ['chrome/gpu/gpu_channel.h', 'chrome/renderer/gpu/gpu_channel_host.h'],
99 [ben], [])
100
101 def test_dirs_not_covered_by__partial_covering(self):
102 self.assert_dirs_not_covered_by(
103 ['content/content.gyp', 'chrome/renderer/gpu/gpu_channel_host.h'],
104 [peter], ['content'])
105
106 def test_dirs_not_covered_by__set_noparent_works(self):
107 self.assert_dirs_not_covered_by(['content/content.gyp'], [ben],
108 ['content'])
109
110 def test_dirs_not_covered_by__no_reviewer(self):
111 self.assert_dirs_not_covered_by(
112 ['content/content.gyp', 'chrome/renderer/gpu/gpu_channel_host.h'],
113 [], ['content'])
114
115 def test_dirs_not_covered_by__combines_directories(self):
116 self.assert_dirs_not_covered_by(['content/content.gyp',
117 'content/bar/foo.cc',
118 'chrome/renderer/gpu/gpu_channel_host.h'],
119 [peter],
120 ['content'])
121
122 def test_dirs_not_covered_by__multiple_directories(self):
123 self.assert_dirs_not_covered_by(
124 ['content/content.gyp', # Not covered
125 'content/bar/foo.cc', # Not covered (combines in)
126 'content/baz/froboz.h', # Not covered
127 'chrome/gpu/gpu_channel.h', # Owned by ken
128 'chrome/renderer/gpu/gpu_channel_host.h' # Owned by * via parent
129 ],
130 [ken],
131 ['content', 'content/baz'])
131 132
132 def assert_reviewers_for(self, files, expected_reviewers): 133 def assert_reviewers_for(self, files, expected_reviewers):
133 db = self.db() 134 db = self.db()
134 self.assertEquals(db.reviewers_for(set(files)), set(expected_reviewers)) 135 self.assertEquals(db.reviewers_for(set(files)), set(expected_reviewers))
135 136
136 def test_reviewers_for__basic_functionality(self): 137 def test_reviewers_for__basic_functionality(self):
137 self.assert_reviewers_for(['chrome/gpu/gpu_channel.h'], 138 self.assert_reviewers_for(['chrome/gpu/gpu_channel.h'],
138 [ken, ben, brett, owners.EVERYONE]) 139 [ken, ben, brett, owners.EVERYONE])
139 140
140 def test_reviewers_for__set_noparent_works(self): 141 def test_reviewers_for__set_noparent_works(self):
(...skipping 30 matching lines...) Expand all
171 172
172 def test_syntax_error__unknown_set(self): 173 def test_syntax_error__unknown_set(self):
173 self.assert_syntax_error('set myfatherisbillgates\n') 174 self.assert_syntax_error('set myfatherisbillgates\n')
174 175
175 def test_syntax_error__bad_email(self): 176 def test_syntax_error__bad_email(self):
176 self.assert_syntax_error('ben\n') 177 self.assert_syntax_error('ben\n')
177 178
178 179
179 if __name__ == '__main__': 180 if __name__ == '__main__':
180 unittest.main() 181 unittest.main()
OLDNEW
« no previous file with comments | « presubmit_canned_checks.py ('k') | tests/presubmit_unittest.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698