Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(192)

Unified Diff: tools/telemetry/telemetry/core/webpagereplay.py

Issue 464343004: [Telemetry] Use WaitFor in webpagereplay.py. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/telemetry/telemetry/core/webpagereplay.py
diff --git a/tools/telemetry/telemetry/core/webpagereplay.py b/tools/telemetry/telemetry/core/webpagereplay.py
index 92211f86ae0b6d68b58e897aa6997f6a98fc0156..5b45ff654abb69ecbcafbe088a7c628873d50ad6 100644
--- a/tools/telemetry/telemetry/core/webpagereplay.py
+++ b/tools/telemetry/telemetry/core/webpagereplay.py
@@ -14,9 +14,10 @@ import re
import signal
import subprocess
import sys
-import time
import urllib
+from telemetry.core import util
+
_CHROME_SRC_DIR = os.path.abspath(os.path.join(
os.path.dirname(__file__), os.pardir, os.pardir, os.pardir, os.pardir))
REPLAY_DIR = os.path.join(
@@ -150,46 +151,38 @@ class ReplayServer(object):
os.makedirs(log_dir)
return open(self.log_path, 'w')
- def WaitForStart(self, timeout):
+ def IsStarted(self):
"""Checks to see if the server is up and running."""
port_re = re.compile(
'.*?(?P<protocol>[A-Z]+) server started on (?P<host>.*):(?P<port>\d+)')
- start_time = time.time()
- elapsed_time = 0
- while elapsed_time < timeout:
- if self.replay_process.poll() is not None:
- break # The process has exited.
-
- # Read the ports from the WPR log.
- if not self.http_port or not self.https_port or not self.dns_port:
- with open(self.log_path) as f:
- for line in f.readlines():
- m = port_re.match(line.strip())
- if m:
- if not self.http_port and m.group('protocol') == 'HTTP':
- self.http_port = int(m.group('port'))
- elif not self.https_port and m.group('protocol') == 'HTTPS':
- self.https_port = int(m.group('port'))
- elif not self.dns_port and m.group('protocol') == 'DNS':
- self.dns_port = int(m.group('port'))
-
- # Try to connect to the WPR ports.
- if self.http_port and self.https_port:
- try:
- up_url = '%s://%s:%s/web-page-replay-generate-200'
- http_up_url = up_url % ('http', self._replay_host, self.http_port)
- https_up_url = up_url % ('https', self._replay_host, self.https_port)
- if (200 == urllib.urlopen(http_up_url, None, {}).getcode() and
- 200 == urllib.urlopen(https_up_url, None, {}).getcode()):
- return True
- except IOError:
- pass
-
- poll_interval = min(max(elapsed_time / 10., .1), 5)
- time.sleep(poll_interval)
- elapsed_time = time.time() - start_time
+ if self.replay_process.poll() is not None:
+ return False
+ # Read the ports from the WPR log.
+ if not self.http_port or not self.https_port or not self.dns_port:
+ with open(self.log_path) as f:
+ for line in f.readlines():
+ m = port_re.match(line.strip())
+ if m:
+ if not self.http_port and m.group('protocol') == 'HTTP':
+ self.http_port = int(m.group('port'))
+ elif not self.https_port and m.group('protocol') == 'HTTPS':
+ self.https_port = int(m.group('port'))
+ elif not self.dns_port and m.group('protocol') == 'DNS':
+ self.dns_port = int(m.group('port'))
+
+ # Try to connect to the WPR ports.
+ if self.http_port and self.https_port:
+ try:
+ up_url = '%s://%s:%s/web-page-replay-generate-200'
+ http_up_url = up_url % ('http', self._replay_host, self.http_port)
+ https_up_url = up_url % ('https', self._replay_host, self.https_port)
+ if (200 == urllib.urlopen(http_up_url, None, {}).getcode() and
+ 200 == urllib.urlopen(https_up_url, None, {}).getcode()):
+ return True
+ except IOError:
+ pass
return False
def StartServer(self):
@@ -209,7 +202,9 @@ class ReplayServer(object):
kwargs['preexec_fn'] = ResetInterruptHandler
self.replay_process = subprocess.Popen(cmd_line, **kwargs)
- if not self.WaitForStart(30):
+ try:
+ util.WaitFor(self.IsStarted, 30)
+ except util.TimeoutException:
with open(self.log_path) as f:
log = f.read()
raise ReplayNotStartedError(
@@ -217,33 +212,32 @@ class ReplayServer(object):
def StopServer(self):
"""Stop Web Page Replay."""
- if self.replay_process:
- logging.debug('Trying to stop Web-Page-Replay gracefully')
+ if not self.replay_process:
+ return
+
+ logging.debug('Trying to stop Web-Page-Replay gracefully')
+ try:
+ urllib.urlopen('http://%s:%s/web-page-replay-command-exit' % (
+ self._replay_host, self.http_port), None, {}).close()
+ except IOError:
+ # IOError is possible because the server might exit without response.
+ pass
+
+ try:
+ util.WaitFor(lambda: self.replay_process.poll() is not None, 10)
+ except util.TimeoutException:
try:
- urllib.urlopen('http://%s:%s/web-page-replay-command-exit' % (
- self._replay_host, self.http_port), None, {}).close()
- except IOError:
- # IOError is possible because the server might exit without response.
- pass
-
- start_time = time.time()
- while time.time() - start_time < 10: # Timeout after 10 seconds.
- if self.replay_process.poll() is not None:
- break
- time.sleep(1)
- else:
+ # Use a SIGINT so that it can do graceful cleanup.
+ self.replay_process.send_signal(signal.SIGINT)
+ except: # pylint: disable=W0702
+ # On Windows, we are left with no other option than terminate().
+ if 'no-dns_forwarding' not in self.replay_options:
+ logging.warning('DNS configuration might not be restored!')
try:
- # Use a SIGINT so that it can do graceful cleanup.
- self.replay_process.send_signal(signal.SIGINT)
+ self.replay_process.terminate()
except: # pylint: disable=W0702
- # On Windows, we are left with no other option than terminate().
- if 'no-dns_forwarding' not in self.replay_options:
- logging.warning('DNS configuration might not be restored!')
- try:
- self.replay_process.terminate()
- except: # pylint: disable=W0702
- pass
- self.replay_process.wait()
+ pass
+ self.replay_process.wait()
def __enter__(self):
"""Add support for with-statement."""
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698