Changeset 129891 in webkit
- Timestamp:
- Sep 28, 2012 6:57:53 AM (12 years ago)
- Location:
- trunk/Tools
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Tools/ChangeLog
r129888 r129891 1 2012-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 1 27 2012-09-28 Huang Dongsung <luxtella@company100.net> 2 28 -
trunk/Tools/Scripts/webkitpy/layout_tests/port/xvfbdriver.py
r128596 r129891 29 29 import logging 30 30 import os 31 import re 31 32 32 33 from webkitpy.layout_tests.port.server_process import ServerProcess 33 34 from webkitpy.layout_tests.port.driver import Driver 35 from webkitpy.common.system.file_lock import FileLock 34 36 35 37 _log = logging.getLogger(__name__) … … 37 39 38 40 class 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 39 59 def _start(self, pixel_tests, per_test_args): 40 41 # Collect the number of X servers running already and make42 # sure our Xvfb process doesn't clash with any of them.43 def x_filter(process_name):44 return process_name.find("Xorg") > -145 46 running_displays = len(self._port.host.executive.running_pids(x_filter))47 48 60 # Use even displays for pixel tests and odd ones otherwise. When pixel tests are disabled, 49 61 # DriverProxy creates two drivers, one for normal and the other for ref tests. Both have 50 62 # 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() 54 64 self._lock_file = "/tmp/.X%d-lock" % display_id 55 65 … … 72 82 def stop(self): 73 83 super(XvfbDriver, self).stop() 84 if self._guard_lock: 85 self._guard_lock.release_lock() 86 self._guard_lock = None 74 87 if getattr(self, '_xvfb_process', None): 75 88 self._port.host.executive.kill_process(self._xvfb_process.pid) -
trunk/Tools/Scripts/webkitpy/layout_tests/port/xvfbdriver_unittest.py
r127849 r129891 31 31 from webkitpy.common.system.deprecated_logging import log 32 32 from webkitpy.common.system.filesystem_mock import MockFileSystem 33 from webkitpy.common.system.executive_mock import MockExecutive2 33 34 from webkitpy.common.system.outputcapture import OutputCapture 34 35 from webkitpy.common.system.systemhost_mock import MockSystemHost … … 40 41 41 42 class 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()) 44 45 port._server_process_constructor = MockServerProcess 45 46 if xorg_running: … … 62 63 def test_start_no_pixel_tests(self): 63 64 driver = self.make_driver() 64 expected_stderr = "MOCK run ning_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" 65 66 self.assertDriverStartSuccessful(driver, expected_stderr=expected_stderr, expected_display=":0") 66 67 self.cleanup_driver(driver) … … 68 69 def test_start_pixel_tests(self): 69 70 driver = self.make_driver() 70 expected_stderr = "MOCK run ning_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) 72 73 self.cleanup_driver(driver) 73 74 74 75 def test_start_arbitrary_worker_number(self): 75 76 driver = self.make_driver(worker_number=17) 76 expected_stderr = "MOCK run ning_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) 78 79 self.cleanup_driver(driver) 79 80 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) 84 108 self.cleanup_driver(driver) 85 109
Note: See TracChangeset
for help on using the changeset viewer.