• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2014 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import unittest
6
7import mock
8
9from telemetry.core import platform
10from telemetry import decorators
11from telemetry.internal.browser import possible_browser
12
13
14class FakeTest(object):
15
16  def SetEnabledStrings(self, enabled_strings):
17    enabled_attr_name = decorators.EnabledAttributeName(self)
18    setattr(self, enabled_attr_name, enabled_strings)
19
20  def SetDisabledStrings(self, disabled_strings):
21    # pylint: disable=attribute-defined-outside-init
22    disabled_attr_name = decorators.DisabledAttributeName(self)
23    setattr(self, disabled_attr_name, disabled_strings)
24
25
26class TestDisableDecorators(unittest.TestCase):
27
28  def testDisabledStringOnFunction(self):
29
30    @decorators.Disabled('bar')
31    def Sum():
32      return 1 + 1
33
34    self.assertEquals({'bar'}, decorators.GetDisabledAttributes(Sum))
35
36    @decorators.Disabled('bar')
37    @decorators.Disabled('baz')
38    @decorators.Disabled('bart', 'baz')
39    def Product():
40      return 1 * 1
41
42    self.assertEquals({'bar', 'bart', 'baz'},
43                      decorators.GetDisabledAttributes(Product))
44
45  def testDisabledStringOnClass(self):
46
47    @decorators.Disabled('windshield')
48    class Ford(object):
49      pass
50
51    self.assertEquals({'windshield'}, decorators.GetDisabledAttributes(Ford))
52
53    @decorators.Disabled('windows', 'Drive')
54    @decorators.Disabled('wheel')
55    @decorators.Disabled('windows')
56    class Honda(object):
57      pass
58
59    self.assertEquals({'windshield'}, decorators.GetDisabledAttributes(Ford))
60    self.assertEquals({'wheel', 'Drive', 'windows'},
61                      decorators.GetDisabledAttributes(Honda))
62
63  def testDisabledStringOnSubClass(self):
64
65    @decorators.Disabled('windshield')
66    class Car(object):
67      pass
68
69    class Ford(Car):
70      pass
71
72    self.assertEquals({'windshield'}, decorators.GetDisabledAttributes(Car))
73    self.assertFalse(decorators.GetDisabledAttributes(Ford))
74
75    @decorators.Disabled('windows', 'Drive')
76    @decorators.Disabled('wheel')
77    @decorators.Disabled('windows')
78    class Honda(Car):
79      pass
80
81    self.assertFalse(decorators.GetDisabledAttributes(Ford))
82    self.assertEquals({'windshield'}, decorators.GetDisabledAttributes(Car))
83    self.assertEquals({'wheel', 'Drive', 'windows'},
84                      decorators.GetDisabledAttributes(Honda))
85
86  def testDisabledStringOnMethod(self):
87
88    class Ford(object):
89
90      @decorators.Disabled('windshield')
91      def Drive(self):
92        pass
93
94    self.assertEquals({'windshield'},
95                      decorators.GetDisabledAttributes(Ford().Drive))
96
97    class Honda(object):
98
99      @decorators.Disabled('windows', 'Drive')
100      @decorators.Disabled('wheel')
101      @decorators.Disabled('windows')
102      def Drive(self):
103        pass
104
105    self.assertEquals({'wheel', 'Drive', 'windows'},
106                      decorators.GetDisabledAttributes(Honda().Drive))
107    self.assertEquals({'windshield'},
108                      decorators.GetDisabledAttributes(Ford().Drive))
109
110    class Accord(Honda):
111
112      def Drive(self):
113        pass
114
115    class Explorer(Ford):
116      pass
117
118    self.assertEquals({'wheel', 'Drive', 'windows'},
119                      decorators.GetDisabledAttributes(Honda().Drive))
120    self.assertEquals({'windshield'},
121                      decorators.GetDisabledAttributes(Ford().Drive))
122    self.assertEquals({'windshield'},
123                      decorators.GetDisabledAttributes(Explorer().Drive))
124    self.assertFalse(decorators.GetDisabledAttributes(Accord().Drive))
125
126
127class TestEnableDecorators(unittest.TestCase):
128
129  def testEnabledStringOnFunction(self):
130
131    @decorators.Enabled('minus', 'power')
132    def Sum():
133      return 1 + 1
134
135    self.assertEquals({'minus', 'power'}, decorators.GetEnabledAttributes(Sum))
136
137    @decorators.Enabled('dot')
138    @decorators.Enabled('product')
139    @decorators.Enabled('product', 'dot')
140    def Product():
141      return 1 * 1
142
143    self.assertEquals({'dot', 'product'},
144                      decorators.GetEnabledAttributes(Product))
145
146  def testEnabledStringOnClass(self):
147
148    @decorators.Enabled('windshield', 'light')
149    class Ford(object):
150      pass
151
152    self.assertEquals({'windshield', 'light'},
153                      decorators.GetEnabledAttributes(Ford))
154
155    @decorators.Enabled('wheel', 'Drive')
156    @decorators.Enabled('wheel')
157    @decorators.Enabled('windows')
158    class Honda(object):
159      pass
160
161    self.assertEquals({'wheel', 'Drive', 'windows'},
162                      decorators.GetEnabledAttributes(Honda))
163    self.assertEquals({'windshield', 'light'},
164                      decorators.GetEnabledAttributes(Ford))
165
166  def testEnabledStringOnSubClass(self):
167
168    @decorators.Enabled('windshield')
169    class Car(object):
170      pass
171
172    class Ford(Car):
173      pass
174
175    self.assertEquals({'windshield'}, decorators.GetEnabledAttributes(Car))
176    self.assertFalse(decorators.GetEnabledAttributes(Ford))
177
178    @decorators.Enabled('windows', 'Drive')
179    @decorators.Enabled('wheel')
180    @decorators.Enabled('windows')
181    class Honda(Car):
182      pass
183
184    self.assertFalse(decorators.GetEnabledAttributes(Ford))
185    self.assertEquals({'windshield'}, decorators.GetEnabledAttributes(Car))
186    self.assertEquals({'wheel', 'Drive', 'windows'},
187                      decorators.GetEnabledAttributes(Honda))
188
189  def testEnabledStringOnMethod(self):
190
191    class Ford(object):
192
193      @decorators.Enabled('windshield')
194      def Drive(self):
195        pass
196
197    self.assertEquals({'windshield'},
198                      decorators.GetEnabledAttributes(Ford().Drive))
199
200    class Honda(object):
201
202      @decorators.Enabled('windows', 'Drive')
203      @decorators.Enabled('wheel', 'Drive')
204      @decorators.Enabled('windows')
205      def Drive(self):
206        pass
207
208    self.assertEquals({'wheel', 'Drive', 'windows'},
209                      decorators.GetEnabledAttributes(Honda().Drive))
210
211    class Accord(Honda):
212
213      def Drive(self):
214        pass
215
216    class Explorer(Ford):
217      pass
218
219    self.assertEquals({'wheel', 'Drive', 'windows'},
220                      decorators.GetEnabledAttributes(Honda().Drive))
221    self.assertEquals({'windshield'},
222                      decorators.GetEnabledAttributes(Ford().Drive))
223    self.assertEquals({'windshield'},
224                      decorators.GetEnabledAttributes(Explorer().Drive))
225    self.assertFalse(decorators.GetEnabledAttributes(Accord().Drive))
226
227
228class TestOwnerDecorators(unittest.TestCase):
229
230  def testOwnerStringOnClass(self):
231
232    @decorators.Owner(emails=['owner@chromium.org'])
233    class Ford(object):
234      pass
235
236    self.assertEquals(['owner@chromium.org'], decorators.GetEmails(Ford))
237
238    @decorators.Owner(emails=['owner2@chromium.org'])
239    @decorators.Owner(component='component')
240    class Honda(object):
241      pass
242
243    self.assertEquals(['owner2@chromium.org'], decorators.GetEmails(Honda))
244    self.assertEquals('component', decorators.GetComponent(Honda))
245    self.assertEquals(['owner@chromium.org'], decorators.GetEmails(Ford))
246
247
248  def testOwnerStringOnSubClass(self):
249
250    @decorators.Owner(emails=['owner@chromium.org'], component='comp')
251    class Car(object):
252      pass
253
254    class Ford(Car):
255      pass
256
257    self.assertEquals(['owner@chromium.org'], decorators.GetEmails(Car))
258    self.assertEquals('comp', decorators.GetComponent(Car))
259    self.assertFalse(decorators.GetEmails(Ford))
260    self.assertFalse(decorators.GetComponent(Ford))
261
262
263  def testOwnerWithDuplicateAttributeSetting(self):
264
265    with self.assertRaises(AssertionError):
266      @decorators.Owner(emails=['owner2@chromium.org'])
267      @decorators.Owner(emails=['owner@chromium.org'], component='comp')
268      class Car(object):
269        pass
270
271      self.assertEquals(['owner@chromium.org'], decorators.GetEmails(Car))
272
273
274class TestShouldSkip(unittest.TestCase):
275
276  def setUp(self):
277    fake_platform = mock.Mock(spec_set=platform.Platform)
278    fake_platform.GetOSName.return_value = 'os_name'
279    fake_platform.GetOSVersionName.return_value = 'os_version_name'
280
281    self.possible_browser = mock.Mock(spec_set=possible_browser.PossibleBrowser)
282    self.possible_browser.browser_type = 'browser_type'
283    self.possible_browser.platform = fake_platform
284    self.possible_browser.supports_tab_control = False
285
286  def testEnabledStrings(self):
287    test = FakeTest()
288
289    # When no enabled_strings is given, everything should be enabled.
290    self.assertFalse(decorators.ShouldSkip(test, self.possible_browser)[0])
291
292    test.SetEnabledStrings(['os_name'])
293    self.assertFalse(decorators.ShouldSkip(test, self.possible_browser)[0])
294
295    test.SetEnabledStrings(['another_os_name'])
296    self.assertTrue(decorators.ShouldSkip(test, self.possible_browser)[0])
297
298    test.SetEnabledStrings(['os_version_name'])
299    self.assertFalse(decorators.ShouldSkip(test, self.possible_browser)[0])
300
301    test.SetEnabledStrings(['os_name', 'another_os_name'])
302    self.assertFalse(decorators.ShouldSkip(test, self.possible_browser)[0])
303
304    test.SetEnabledStrings(['another_os_name', 'os_name'])
305    self.assertFalse(decorators.ShouldSkip(test, self.possible_browser)[0])
306
307    test.SetEnabledStrings(['another_os_name', 'another_os_version_name'])
308    self.assertTrue(decorators.ShouldSkip(test, self.possible_browser)[0])
309
310    test.SetEnabledStrings(['os_name-reference'])
311    self.assertTrue(decorators.ShouldSkip(test, self.possible_browser)[0])
312
313    test.SetEnabledStrings(['another_os_name-reference'])
314    self.assertTrue(decorators.ShouldSkip(test, self.possible_browser)[0])
315
316    test.SetEnabledStrings(['os_version_name-reference'])
317    self.assertTrue(decorators.ShouldSkip(test, self.possible_browser)[0])
318
319    test.SetEnabledStrings(['os_name-reference', 'another_os_name-reference'])
320    self.assertTrue(decorators.ShouldSkip(test, self.possible_browser)[0])
321
322    test.SetEnabledStrings(['another_os_name-reference', 'os_name-reference'])
323    self.assertTrue(decorators.ShouldSkip(test, self.possible_browser)[0])
324
325    test.SetEnabledStrings(['another_os_name-reference',
326                            'another_os_version_name-reference'])
327    self.assertTrue(decorators.ShouldSkip(test, self.possible_browser)[0])
328
329  def testDisabledStrings(self):
330    test = FakeTest()
331
332    # When no disabled_strings is given, nothing should be disabled.
333    self.assertFalse(decorators.ShouldSkip(test, self.possible_browser)[0])
334
335    test.SetDisabledStrings(['os_name'])
336    self.assertTrue(decorators.ShouldSkip(test, self.possible_browser)[0])
337
338    test.SetDisabledStrings(['another_os_name'])
339    self.assertFalse(decorators.ShouldSkip(test, self.possible_browser)[0])
340
341    test.SetDisabledStrings(['os_version_name'])
342    self.assertTrue(decorators.ShouldSkip(test, self.possible_browser)[0])
343
344    test.SetDisabledStrings(['os_name', 'another_os_name'])
345    self.assertTrue(decorators.ShouldSkip(test, self.possible_browser)[0])
346
347    test.SetDisabledStrings(['another_os_name', 'os_name'])
348    self.assertTrue(decorators.ShouldSkip(test, self.possible_browser)[0])
349
350    test.SetDisabledStrings(['another_os_name', 'another_os_version_name'])
351    self.assertFalse(decorators.ShouldSkip(test, self.possible_browser)[0])
352
353    test.SetDisabledStrings(['reference'])
354    self.assertFalse(decorators.ShouldSkip(test, self.possible_browser)[0])
355
356    test.SetDisabledStrings(['os_name-reference'])
357    self.assertFalse(decorators.ShouldSkip(test, self.possible_browser)[0])
358
359    test.SetDisabledStrings(['another_os_name-reference'])
360    self.assertFalse(decorators.ShouldSkip(test, self.possible_browser)[0])
361
362    test.SetDisabledStrings(['os_version_name-reference'])
363    self.assertFalse(decorators.ShouldSkip(test, self.possible_browser)[0])
364
365    test.SetDisabledStrings(['os_name-reference', 'another_os_name-reference'])
366    self.assertFalse(decorators.ShouldSkip(test, self.possible_browser)[0])
367
368    test.SetDisabledStrings(['another_os_name-reference', 'os_name-reference'])
369    self.assertFalse(decorators.ShouldSkip(test, self.possible_browser)[0])
370
371    test.SetDisabledStrings(['another_os_name-reference',
372                             'another_os_version_name-reference'])
373    self.assertFalse(decorators.ShouldSkip(test, self.possible_browser)[0])
374
375  def testReferenceEnabledStrings(self):
376    self.possible_browser.browser_type = 'reference'
377    test = FakeTest()
378
379    # When no enabled_strings is given, everything should be enabled.
380    self.assertFalse(decorators.ShouldSkip(test, self.possible_browser)[0])
381
382    test.SetEnabledStrings(['os_name-reference'])
383    self.assertFalse(decorators.ShouldSkip(test, self.possible_browser)[0])
384
385    test.SetEnabledStrings(['another_os_name-reference'])
386    self.assertTrue(decorators.ShouldSkip(test, self.possible_browser)[0])
387
388    test.SetEnabledStrings(['os_version_name-reference'])
389    self.assertFalse(decorators.ShouldSkip(test, self.possible_browser)[0])
390
391    test.SetEnabledStrings(['os_name-reference', 'another_os_name-reference'])
392    self.assertFalse(decorators.ShouldSkip(test, self.possible_browser)[0])
393
394    test.SetEnabledStrings(['another_os_name-reference', 'os_name-reference'])
395    self.assertFalse(decorators.ShouldSkip(test, self.possible_browser)[0])
396
397    test.SetEnabledStrings(['another_os_name-reference',
398                            'another_os_version_name-reference'])
399    self.assertTrue(decorators.ShouldSkip(test, self.possible_browser)[0])
400
401  def testReferenceDisabledStrings(self):
402    self.possible_browser.browser_type = 'reference'
403    test = FakeTest()
404
405    # When no disabled_strings is given, nothing should be disabled.
406    self.assertFalse(decorators.ShouldSkip(test, self.possible_browser)[0])
407
408    test.SetDisabledStrings(['reference'])
409    self.assertTrue(decorators.ShouldSkip(test, self.possible_browser)[0])
410
411    test.SetDisabledStrings(['os_name-reference'])
412    self.assertTrue(decorators.ShouldSkip(test, self.possible_browser)[0])
413
414    test.SetDisabledStrings(['another_os_name-reference'])
415    self.assertFalse(decorators.ShouldSkip(test, self.possible_browser)[0])
416
417    test.SetDisabledStrings(['os_version_name-reference'])
418    self.assertTrue(decorators.ShouldSkip(test, self.possible_browser)[0])
419
420    test.SetDisabledStrings(['os_name-reference', 'another_os_name-reference'])
421    self.assertTrue(decorators.ShouldSkip(test, self.possible_browser)[0])
422
423    test.SetDisabledStrings(['another_os_name-reference', 'os_name-reference'])
424    self.assertTrue(decorators.ShouldSkip(test, self.possible_browser)[0])
425
426    test.SetDisabledStrings(['another_os_name-reference',
427                             'another_os_version_name-reference'])
428    self.assertFalse(decorators.ShouldSkip(test, self.possible_browser)[0])
429
430
431class TestDeprecation(unittest.TestCase):
432
433  @mock.patch('warnings.warn')
434  def testFunctionDeprecation(self, warn_mock):
435
436    @decorators.Deprecated(2015, 12, 1)
437    def Foo(x):
438      return x
439
440    Foo(1)
441    warn_mock.assert_called_with(
442        'Function Foo is deprecated. It will no longer be supported on '
443        'December 01, 2015. Please remove it or switch to an alternative '
444        'before that time. \n',
445        stacklevel=4)
446
447  @mock.patch('warnings.warn')
448  def testMethodDeprecated(self, warn_mock):
449
450    class Bar(object):
451
452      @decorators.Deprecated(2015, 12, 1, 'Testing only.')
453      def Foo(self, x):
454        return x
455
456    Bar().Foo(1)
457    warn_mock.assert_called_with(
458        'Function Foo is deprecated. It will no longer be supported on '
459        'December 01, 2015. Please remove it or switch to an alternative '
460        'before that time. Testing only.\n',
461        stacklevel=4)
462
463  @mock.patch('warnings.warn')
464  def testClassWithoutInitDefinedDeprecated(self, warn_mock):
465
466    @decorators.Deprecated(2015, 12, 1)
467    class Bar(object):
468
469      def Foo(self, x):
470        return x
471
472    Bar().Foo(1)
473    warn_mock.assert_called_with(
474        'Class Bar is deprecated. It will no longer be supported on '
475        'December 01, 2015. Please remove it or switch to an alternative '
476        'before that time. \n',
477        stacklevel=4)
478
479  @mock.patch('warnings.warn')
480  def testClassWithInitDefinedDeprecated(self, warn_mock):
481
482    @decorators.Deprecated(2015, 12, 1)
483    class Bar(object):
484
485      def __init__(self):
486        pass
487
488      def Foo(self, x):
489        return x
490
491    Bar().Foo(1)
492    warn_mock.assert_called_with(
493        'Class Bar is deprecated. It will no longer be supported on '
494        'December 01, 2015. Please remove it or switch to an alternative '
495        'before that time. \n',
496        stacklevel=4)
497
498  @mock.patch('warnings.warn')
499  def testInheritedClassDeprecated(self, warn_mock):
500
501    class Ba(object):
502      pass
503
504    @decorators.Deprecated(2015, 12, 1)
505    class Bar(Ba):
506
507      def Foo(self, x):
508        return x
509
510    class Baz(Bar):
511      pass
512
513    Baz().Foo(1)
514    warn_mock.assert_called_with(
515        'Class Bar is deprecated. It will no longer be supported on '
516        'December 01, 2015. Please remove it or switch to an alternative '
517        'before that time. \n',
518        stacklevel=4)
519
520  def testReturnValue(self):
521
522    class Bar(object):
523
524      @decorators.Deprecated(2015, 12, 1, 'Testing only.')
525      def Foo(self, x):
526        return x
527
528    self.assertEquals(5, Bar().Foo(5))
529