Changeset 129891 in webkit


Ignore:
Timestamp:
Sep 28, 2012 6:57:53 AM (12 years ago)
Author:
kkristof@inf.u-szeged.hu
Message:

[NRWT] XvfbDriver should choose the next free display
https://bugs.webkit.org/show_bug.cgi?id=88414

Reviewed by Dirk Pranke.

This change how the XvfbDriver choose the next display. Before
this the choosing are based on the worker number but it caused
errors when several nrwt run on the same time. This add process
based free diplay search.

  • Scripts/webkitpy/layout_tests/port/xvfbdriver.py:

(XvfbDriver.init):
(XvfbDriver._next_free_display):
(XvfbDriver._start):
(XvfbDriver.stop):

  • Scripts/webkitpy/layout_tests/port/xvfbdriver_unittest.py:

(XvfbDriverTest.make_driver):
(XvfbDriverTest.test_start_no_pixel_tests):
(XvfbDriverTest.test_start_pixel_tests):
(XvfbDriverTest.test_start_arbitrary_worker_number):
(XvfbDriverTest.test_next_free_display):
(XvfbDriverTest):
(XvfbDriverTest.test_start_next_worker):

Location:
trunk/Tools
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Tools/ChangeLog

    r129888 r129891  
     12012-09-28  Kristóf Kosztyó  <kkristof@inf.u-szeged.hu>
     2
     3        [NRWT] XvfbDriver should choose the next free display
     4        https://bugs.webkit.org/show_bug.cgi?id=88414
     5
     6        Reviewed by Dirk Pranke.
     7
     8        This change how the XvfbDriver choose the next display. Before
     9        this the choosing are based on the worker number but it caused
     10        errors when several nrwt run on the same time. This add process
     11        based free diplay search.
     12
     13        * Scripts/webkitpy/layout_tests/port/xvfbdriver.py:
     14        (XvfbDriver.__init__):
     15        (XvfbDriver._next_free_display):
     16        (XvfbDriver._start):
     17        (XvfbDriver.stop):
     18        * Scripts/webkitpy/layout_tests/port/xvfbdriver_unittest.py:
     19        (XvfbDriverTest.make_driver):
     20        (XvfbDriverTest.test_start_no_pixel_tests):
     21        (XvfbDriverTest.test_start_pixel_tests):
     22        (XvfbDriverTest.test_start_arbitrary_worker_number):
     23        (XvfbDriverTest.test_next_free_display):
     24        (XvfbDriverTest):
     25        (XvfbDriverTest.test_start_next_worker):
     26
    1272012-09-28  Huang Dongsung  <luxtella@company100.net>
    228
  • trunk/Tools/Scripts/webkitpy/layout_tests/port/xvfbdriver.py

    r128596 r129891  
    2929import logging
    3030import os
     31import re
    3132
    3233from webkitpy.layout_tests.port.server_process import ServerProcess
    3334from webkitpy.layout_tests.port.driver import Driver
     35from webkitpy.common.system.file_lock import FileLock
    3436
    3537_log = logging.getLogger(__name__)
     
    3739
    3840class XvfbDriver(Driver):
     41    def __init__(self, *args, **kwargs):
     42        Driver.__init__(self, *args, **kwargs)
     43        self._guard_lock = None
     44
     45    def _next_free_display(self):
     46        running_pids = self._port.host.executive.run_command(['ps', '-eo', 'comm,command'])
     47        reserved_screens = set()
     48        for pid in running_pids.split('\n'):
     49            match = re.match('(Xvfb|Xorg).*\s:(?P<screen_number>\d+)', pid)
     50            if match:
     51                reserved_screens.add(int(match.group('screen_number')))
     52        for i in range(99):
     53            if i not in reserved_screens:
     54                _guard_lock_file = self._port.host.filesystem.join('/tmp', 'WebKitXvfb.lock.%i' % i)
     55                self._guard_lock = FileLock(_guard_lock_file)
     56                if self._guard_lock.acquire_lock():
     57                    return i
     58
    3959    def _start(self, pixel_tests, per_test_args):
    40 
    41         # Collect the number of X servers running already and make
    42         # sure our Xvfb process doesn't clash with any of them.
    43         def x_filter(process_name):
    44             return process_name.find("Xorg") > -1
    45 
    46         running_displays = len(self._port.host.executive.running_pids(x_filter))
    47 
    4860        # Use even displays for pixel tests and odd ones otherwise. When pixel tests are disabled,
    4961        # DriverProxy creates two drivers, one for normal and the other for ref tests. Both have
    5062        # the same worker number, so this prevents them from using the same Xvfb instance.
    51         display_id = self._worker_number * 2 + running_displays
    52         if pixel_tests:
    53             display_id += 1
     63        display_id = self._next_free_display()
    5464        self._lock_file = "/tmp/.X%d-lock" % display_id
    5565
     
    7282    def stop(self):
    7383        super(XvfbDriver, self).stop()
     84        if self._guard_lock:
     85            self._guard_lock.release_lock()
     86            self._guard_lock = None
    7487        if getattr(self, '_xvfb_process', None):
    7588            self._port.host.executive.kill_process(self._xvfb_process.pid)
  • trunk/Tools/Scripts/webkitpy/layout_tests/port/xvfbdriver_unittest.py

    r127849 r129891  
    3131from webkitpy.common.system.deprecated_logging import log
    3232from webkitpy.common.system.filesystem_mock import MockFileSystem
     33from webkitpy.common.system.executive_mock import MockExecutive2
    3334from webkitpy.common.system.outputcapture import OutputCapture
    3435from webkitpy.common.system.systemhost_mock import MockSystemHost
     
    4041
    4142class XvfbDriverTest(unittest.TestCase):
    42     def make_driver(self, worker_number=0, xorg_running=False):
    43         port = Port(host=MockSystemHost(log_executive=True), config=MockConfig())
     43    def make_driver(self, worker_number=0, xorg_running=False, executive=None):
     44        port = Port(host=MockSystemHost(log_executive=True, executive=executive), config=MockConfig())
    4445        port._server_process_constructor = MockServerProcess
    4546        if xorg_running:
     
    6263    def test_start_no_pixel_tests(self):
    6364        driver = self.make_driver()
    64         expected_stderr = "MOCK running_pids: []\nMOCK popen: ['Xvfb', ':0', '-screen', '0', '800x600x24', '-nolisten', 'tcp']\n"
     65        expected_stderr = "MOCK run_command: ['ps', '-eo', 'comm,command'], cwd=None\nMOCK popen: ['Xvfb', ':0', '-screen', '0', '800x600x24', '-nolisten', 'tcp']\n"
    6566        self.assertDriverStartSuccessful(driver, expected_stderr=expected_stderr, expected_display=":0")
    6667        self.cleanup_driver(driver)
     
    6869    def test_start_pixel_tests(self):
    6970        driver = self.make_driver()
    70         expected_stderr = "MOCK running_pids: []\nMOCK popen: ['Xvfb', ':1', '-screen', '0', '800x600x24', '-nolisten', 'tcp']\n"
    71         self.assertDriverStartSuccessful(driver, expected_stderr=expected_stderr, expected_display=":1", pixel_tests=True)
     71        expected_stderr = "MOCK run_command: ['ps', '-eo', 'comm,command'], cwd=None\nMOCK popen: ['Xvfb', ':0', '-screen', '0', '800x600x24', '-nolisten', 'tcp']\n"
     72        self.assertDriverStartSuccessful(driver, expected_stderr=expected_stderr, expected_display=":0", pixel_tests=True)
    7273        self.cleanup_driver(driver)
    7374
    7475    def test_start_arbitrary_worker_number(self):
    7576        driver = self.make_driver(worker_number=17)
    76         expected_stderr = "MOCK running_pids: []\nMOCK popen: ['Xvfb', ':35', '-screen', '0', '800x600x24', '-nolisten', 'tcp']\n"
    77         self.assertDriverStartSuccessful(driver, expected_stderr=expected_stderr, expected_display=":35", pixel_tests=True)
     77        expected_stderr = "MOCK run_command: ['ps', '-eo', 'comm,command'], cwd=None\nMOCK popen: ['Xvfb', ':0', '-screen', '0', '800x600x24', '-nolisten', 'tcp']\n"
     78        self.assertDriverStartSuccessful(driver, expected_stderr=expected_stderr, expected_display=":0", pixel_tests=True)
    7879        self.cleanup_driver(driver)
    7980
    80     def test_start_existing_xorg_process(self):
    81         driver = self.make_driver(xorg_running=True)
    82         expected_stderr = "MOCK running_pids: [108]\nMOCK popen: ['Xvfb', ':1', '-screen', '0', '800x600x24', '-nolisten', 'tcp']\n"
    83         self.assertDriverStartSuccessful(driver, expected_stderr=expected_stderr, expected_display=":1")
     81    def test_next_free_display(self):
     82        output = "Xorg            /usr/bin/X :0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch -background none\nXvfb            Xvfb :1 -screen 0 800x600x24 -nolisten tcp"
     83        executive = MockExecutive2(output)
     84        driver = self.make_driver(executive=executive)
     85        self.assertEqual(driver._next_free_display(), 2)
     86        self.cleanup_driver(driver)
     87        output = "Xvfb            Xvfb :0 -screen 0 800x600x24 -nolisten tcp"
     88        executive = MockExecutive2(output)
     89        driver = self.make_driver(executive=executive)
     90        self.assertEqual(driver._next_free_display(), 1)
     91        self.cleanup_driver(driver)
     92        output = "Xvfb            Xvfb :1 -screen 0 800x600x24 -nolisten tcp\nXvfb            Xvfb :0 -screen 0 800x600x24 -nolisten tcp\nXvfb            Xvfb :3 -screen 0 800x600x24 -nolisten tcp"
     93        executive = MockExecutive2(output)
     94        driver = self.make_driver(executive=executive)
     95        self.assertEqual(driver._next_free_display(), 2)
     96        self.cleanup_driver(driver)
     97
     98    def test_start_next_worker(self):
     99        driver = self.make_driver()
     100        driver._next_free_display = lambda: 0
     101        expected_stderr = "MOCK popen: ['Xvfb', ':0', '-screen', '0', '800x600x24', '-nolisten', 'tcp']\n"
     102        self.assertDriverStartSuccessful(driver, expected_stderr=expected_stderr, expected_display=":0", pixel_tests=True)
     103        self.cleanup_driver(driver)
     104        driver = self.make_driver()
     105        driver._next_free_display = lambda: 3
     106        expected_stderr = "MOCK popen: ['Xvfb', ':3', '-screen', '0', '800x600x24', '-nolisten', 'tcp']\n"
     107        self.assertDriverStartSuccessful(driver, expected_stderr=expected_stderr, expected_display=":3", pixel_tests=True)
    84108        self.cleanup_driver(driver)
    85109
Note: See TracChangeset for help on using the changeset viewer.