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