| OLD | NEW |
| 1 #!/usr/bin/python2.4 | 1 #!/usr/bin/python2.4 |
| 2 # Copyright 2009, Google Inc. | 2 # Copyright 2009, Google Inc. |
| 3 # All rights reserved. | 3 # All rights reserved. |
| 4 # | 4 # |
| 5 # Redistribution and use in source and binary forms, with or without | 5 # Redistribution and use in source and binary forms, with or without |
| 6 # modification, are permitted provided that the following conditions are | 6 # modification, are permitted provided that the following conditions are |
| 7 # met: | 7 # met: |
| 8 # | 8 # |
| 9 # * Redistributions of source code must retain the above copyright | 9 # * Redistributions of source code must retain the above copyright |
| 10 # notice, this list of conditions and the following disclaimer. | 10 # notice, this list of conditions and the following disclaimer. |
| (...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 377 self.sel_port, | 377 self.sel_port, |
| 378 browser + browser_path_with_space, | 378 browser + browser_path_with_space, |
| 379 server_url) | 379 server_url) |
| 380 | 380 |
| 381 new_session.start() | 381 new_session.start() |
| 382 new_session.set_timeout(self.sel_timeout) | 382 new_session.set_timeout(self.sel_timeout) |
| 383 | 383 |
| 384 return new_session | 384 return new_session |
| 385 | 385 |
| 386 | 386 |
| 387 def TestBrowser(session_builder, browser, test_list): | 387 def TestBrowser(session_builder, browser, test_list, verbose): |
| 388 """Runs Selenium tests for a specific browser. | 388 """Runs Selenium tests for a specific browser. |
| 389 | 389 |
| 390 Args: | 390 Args: |
| 391 session_builder: session_builder for creating new selenium sessions. | 391 session_builder: session_builder for creating new selenium sessions. |
| 392 browser: selenium browser name (eg. *iexplore, *firefox). | 392 browser: selenium browser name (eg. *iexplore, *firefox). |
| 393 test_list: list of tests. | 393 test_list: list of tests. |
| 394 | 394 |
| 395 Returns: | 395 Returns: |
| 396 summary_result: result of test runners. | 396 summary_result: result of test runners. |
| 397 """ | 397 """ |
| 398 print "Testing %s..." % browser | 398 print "Testing %s..." % browser |
| 399 | 399 |
| 400 summary_result = test_runner.TestResult(test_runner.StringBuffer(), browser) | 400 summary_result = test_runner.TestResult(test_runner.StringBuffer(), browser, |
| 401 verbose) |
| 401 | 402 |
| 402 # Fill up the selenium test queue. | 403 # Fill up the selenium test queue. |
| 403 test_queue = Queue.Queue() | 404 test_queue = Queue.Queue() |
| 404 for test in test_list: | 405 for test in test_list: |
| 405 test_queue.put(test) | 406 test_queue.put(test) |
| 406 | 407 |
| 407 | 408 |
| 408 pdiff_queue = None | 409 pdiff_queue = None |
| 409 if FLAGS.screenshots: | 410 if FLAGS.screenshots: |
| 410 # Need to do screen comparisons. | 411 # Need to do screen comparisons. |
| 411 # |pdiff_queue| is the queue of perceptual diff tests that need to be done. | 412 # |pdiff_queue| is the queue of perceptual diff tests that need to be done. |
| 412 # This queue is added to by individual slenium test runners. | 413 # This queue is added to by individual slenium test runners. |
| 413 # |pdiff_result_queue| is the result of the perceptual diff tests. | 414 # |pdiff_result_queue| is the result of the perceptual diff tests. |
| 414 pdiff_queue = Queue.Queue() | 415 pdiff_queue = Queue.Queue() |
| 415 pdiff_result_queue = Queue.Queue() | 416 pdiff_result_queue = Queue.Queue() |
| 416 pdiff_worker = test_runner.PDiffTestRunner(pdiff_queue, | 417 pdiff_worker = test_runner.PDiffTestRunner(pdiff_queue, |
| 417 pdiff_result_queue, | 418 pdiff_result_queue, |
| 418 browser) | 419 browser, verbose) |
| 419 pdiff_worker.start() | 420 pdiff_worker.start() |
| 420 | 421 |
| 421 # Start initial selenium test runner. | 422 # Start initial selenium test runner. |
| 422 worker = test_runner.SeleniumTestRunner(session_builder, browser, | 423 worker = test_runner.SeleniumTestRunner(session_builder, browser, |
| 423 test_queue, pdiff_queue) | 424 test_queue, pdiff_queue, |
| 425 verbose) |
| 424 worker.start() | 426 worker.start() |
| 425 | 427 |
| 426 # Run through all selenium tests. | 428 # Run through all selenium tests. |
| 427 while not worker.IsCompletelyDone(): | 429 while not worker.IsCompletelyDone(): |
| 428 if worker.IsTesting() and worker.IsPastDeadline(): | 430 if worker.IsTesting() and worker.IsPastDeadline(): |
| 429 # Test has taken more than allotted. Abort and go to next test. | 431 # Test has taken more than allotted. Abort and go to next test. |
| 430 worker.AbortTest() | 432 worker.AbortTest() |
| 431 | 433 |
| 432 elif worker.DidFinishTest(): | 434 elif worker.DidFinishTest(): |
| 433 # Do this so that a worker does not grab test off queue till we tell it.
| 435 # Do this so that a worker does not grab test off queue till we tell it.
|
| 434 result = worker.Continue() | 436 result = worker.Continue() |
| 435 result.printAll(sys.stdout) | 437 result.printAll(sys.stdout) |
| 436 summary_result.merge(result) | 438 summary_result.merge(result) |
| 439 |
| 440 # Sleep here for a brief time. This thread is polling the worker thread. |
| 441 # We cannot wait for a message from the worker thread because the worker |
| 442 # may hang on a bad test. We also do not want to sleep till the test's |
| 443 # deadline because the test may finish before then. |
| 444 time.sleep(.1) |
| 437 | 445 |
| 438 if FLAGS.screenshots: | 446 if FLAGS.screenshots: |
| 439 # Finish screenshot comparisons. | 447 # Finish screenshot comparisons. |
| 440 pdiff_worker.EndTesting() | 448 pdiff_worker.EndTesting() |
| 441 while not pdiff_worker.IsCompletelyDone(): | 449 while not pdiff_worker.IsCompletelyDone(): |
| 442 time.sleep(1) | 450 time.sleep(1) |
| 443 | 451 |
| 444 # Be careful here, make sure no one else is editing |pdiff_reult_queue|. | 452 # Be careful here, make sure no one else is editing |pdiff_reult_queue|. |
| 445 while not pdiff_result_queue.empty(): | 453 while not pdiff_result_queue.empty(): |
| 446 result = pdiff_result_queue.get() | 454 result = pdiff_result_queue.get() |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 499 sample = sample.strip() | 507 sample = sample.strip() |
| 500 if not sample or sample[0] == ";" or sample[0] == "#": | 508 if not sample or sample[0] == ";" or sample[0] == "#": |
| 501 continue | 509 continue |
| 502 | 510 |
| 503 arguments = sample.split() | 511 arguments = sample.split() |
| 504 test_type = arguments[0].lower() | 512 test_type = arguments[0].lower() |
| 505 test_path = arguments[1] | 513 test_path = arguments[1] |
| 506 options = arguments[2:] | 514 options = arguments[2:] |
| 507 | 515 |
| 508 # TODO: Add filter based on test_type | 516 # TODO: Add filter based on test_type |
| 517 test_skipped = False |
| 509 if test_path.startswith("Test"): | 518 if test_path.startswith("Test"): |
| 510 name = test_path | 519 name = test_path |
| 511 else: | 520 else: |
| 512 # Need to make a name. | 521 # Need to make a name. |
| 513 name = ("Test" + prefix + re.sub("\W", "_", test_path) + | 522 name = ("Test" + prefix + re.sub("\W", "_", test_path) + |
| 514 test_type.capitalize()) | 523 test_type.capitalize()) |
| 515 | 524 # Only test suffixes for generic tests. That is how it has always worked. |
| 525 if test_suffixes and not MatchesSuffix(name, test_suffixes): |
| 526 test_skipped = True |
| 527 |
| 528 if test_prefix_filter and not name.startswith(test_prefix_filter): |
| 529 test_skipped = True |
| 530 |
| 516 # Only execute this test if the current browser is not in the list | 531 # Only execute this test if the current browser is not in the list |
| 517 # of skipped browsers. | 532 # of skipped browsers. |
| 518 test_skipped = False | |
| 519 screenshot_count = 0 | 533 screenshot_count = 0 |
| 520 for option in options: | 534 for option in options: |
| 521 if option.startswith("except"): | 535 if option.startswith("except"): |
| 522 skipped_platforms = selenium_utilities.GetArgument(option) | 536 skipped_platforms = selenium_utilities.GetArgument(option) |
| 523 if not skipped_platforms is None: | 537 if not skipped_platforms is None: |
| 524 skipped_platforms = skipped_platforms.split(",") | 538 skipped_platforms = skipped_platforms.split(",") |
| 525 if browser in skipped_platforms: | 539 if browser in skipped_platforms: |
| 526 test_skipped = True | 540 test_skipped = True |
| 527 elif option.startswith("screenshots"): | 541 elif option.startswith("screenshots"): |
| 528 screenshot_count += int(selenium_utilities.GetArgument(option)) | 542 screenshot_count += int(selenium_utilities.GetArgument(option)) |
| 529 elif option.startswith("screenshot"): | 543 elif option.startswith("screenshot"): |
| 530 screenshot_count += 1 | 544 screenshot_count += 1 |
| 531 | 545 |
| 532 if (test_prefix_filter and not name.startswith(test_prefix_filter) or | |
| 533 test_suffixes and not MatchesSuffix(name, test_suffixes)): | |
| 534 test_skipped = True | |
| 535 | |
| 536 if not test_skipped: | 546 if not test_skipped: |
| 537 # Add a test method with this name if it doesn't exist. | 547 # Add a test method with this name if it doesn't exist. |
| 538 if not (hasattr(module, name) and callable(getattr(module, name))): | 548 if not (hasattr(module, name) and callable(getattr(module, name))): |
| 539 setattr(module, name, module.GenericTest) | 549 setattr(module, name, module.GenericTest) |
| 540 | 550 |
| 541 new_test = module(name, browser, path_to_html, test_type, test_path, | 551 new_test = module(name, browser, path_to_html, test_type, test_path, |
| 542 options) | 552 options) |
| 543 | 553 |
| 544 if screenshot_count and FLAGS.screenshots: | 554 if screenshot_count and FLAGS.screenshots: |
| 545 pdiff_name = name + 'Screenshots' | 555 pdiff_name = name + 'Screenshots' |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 647 http_server.http_port, | 657 http_server.http_port, |
| 648 FLAGS.browserpath) | 658 FLAGS.browserpath) |
| 649 | 659 |
| 650 all_tests_passed = True | 660 all_tests_passed = True |
| 651 # Test browsers. | 661 # Test browsers. |
| 652 for browser in FLAGS.browser: | 662 for browser in FLAGS.browser: |
| 653 if browser in set(selenium_constants.SELENIUM_BROWSER_SET): | 663 if browser in set(selenium_constants.SELENIUM_BROWSER_SET): |
| 654 test_list = GetTestsForBrowser(browser, FLAGS.testprefix, | 664 test_list = GetTestsForBrowser(browser, FLAGS.testprefix, |
| 655 FLAGS.testsuffixes) | 665 FLAGS.testsuffixes) |
| 656 | 666 |
| 657 result = TestBrowser(session_builder, browser, test_list) | 667 result = TestBrowser(session_builder, browser, test_list, FLAGS.verbose) |
| 658 | 668 |
| 659 if not result.wasSuccessful(): | 669 if not result.wasSuccessful(): |
| 660 all_tests_passed = False | 670 all_tests_passed = False |
| 661 | 671 |
| 662 # Log non-succesful tests, for convenience. | 672 # Log non-succesful tests, for convenience. |
| 663 print "" | 673 print "" |
| 664 print "Failures for %s:" % browser | 674 print "Failures for %s:" % browser |
| 665 print "[Selenium tests]" | 675 print "[Selenium tests]" |
| 666 for entry in test_list: | 676 for entry in test_list: |
| 667 if type(entry) == tuple: | 677 if type(entry) == tuple: |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 725 | 735 |
| 726 # Setup the LD_LIBRARY_PATH on Linux. | 736 # Setup the LD_LIBRARY_PATH on Linux. |
| 727 if sys.platform[:5] == "linux": | 737 if sys.platform[:5] == "linux": |
| 728 if os.environ.get("LD_LIBRARY_PATH"): | 738 if os.environ.get("LD_LIBRARY_PATH"): |
| 729 os.environ["LD_LIBRARY_PATH"] = os.pathsep.join( | 739 os.environ["LD_LIBRARY_PATH"] = os.pathsep.join( |
| 730 [os.environ["LD_LIBRARY_PATH"], os.path.normpath(FLAGS.product_dir)]) | 740 [os.environ["LD_LIBRARY_PATH"], os.path.normpath(FLAGS.product_dir)]) |
| 731 else: | 741 else: |
| 732 os.environ["LD_LIBRARY_PATH"] = os.path.normpath(FLAGS.product_dir) | 742 os.environ["LD_LIBRARY_PATH"] = os.path.normpath(FLAGS.product_dir) |
| 733 | 743 |
| 734 sys.exit(main(remaining_argv)) | 744 sys.exit(main(remaining_argv)) |
| OLD | NEW |