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

Unified Diff: mojo/tools/mopy/background_app_group.py

Issue 878933003: Move the apptest runner and parts of mopy to the public SDK. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 11 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 | « mojo/tools/mopy/android.py ('k') | mojo/tools/mopy/config.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: mojo/tools/mopy/background_app_group.py
diff --git a/mojo/tools/mopy/background_app_group.py b/mojo/tools/mopy/background_app_group.py
deleted file mode 100755
index 2e3eae006aed13881d48a707f6b07fa6c35ee317..0000000000000000000000000000000000000000
--- a/mojo/tools/mopy/background_app_group.py
+++ /dev/null
@@ -1,157 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import logging
-import os
-import subprocess
-import time
-import sys
-
-import mopy.paths
-
-from shutil import copyfileobj, rmtree
-from signal import SIGTERM
-from tempfile import mkdtemp, TemporaryFile
-
-
-class TimeoutError(Exception):
- """Allows distinction between timeout failures and generic OSErrors."""
- pass
-
-
-def _poll_for_condition(
- condition, max_seconds=10, sleep_interval=0.1, desc='[unnamed condition]'):
- """Poll until a condition becomes true.
-
- Arguments:
- condition: callable taking no args and returning bool.
- max_seconds: maximum number of seconds to wait.
- Might bail up to sleep_interval seconds early.
- sleep_interval: number of seconds to sleep between polls.
- desc: description put in TimeoutError.
-
- Returns:
- The true value that caused the poll loop to terminate.
-
- Raises:
- TimeoutError if condition doesn't become true before max_seconds is reached.
- """
- start_time = time.time()
- while time.time() + sleep_interval - start_time <= max_seconds:
- value = condition()
- if value:
- return value
- time.sleep(sleep_interval)
-
- raise TimeoutError('Timed out waiting for condition: %s' % desc)
-
-
-class _BackgroundShell(object):
- """Manages a mojo_shell instance that listens for external applications."""
-
- def __init__(self, mojo_shell_path, shell_args=None):
- """In a background process, run a shell at mojo_shell_path listening
- for external apps on an instance-specific socket.
-
- Arguments:
- mojo_shell_path: path to the mojo_shell binary to run.
- shell_args: a list of arguments to pass to mojo_shell.
-
- Raises:
- a TimeoutError if the shell takes too long to create the socket.
- """
- self._tempdir = mkdtemp(prefix='background_shell_')
- self._socket_path = os.path.join(self._tempdir, 'socket')
- self._output_file = TemporaryFile()
-
- shell_command = [mojo_shell_path,
- '--enable-external-applications=' + self._socket_path]
- if shell_args:
- shell_command += shell_args
- logging.getLogger().debug(shell_command)
-
- self._shell = subprocess.Popen(shell_command, stdout=self._output_file,
- stderr=subprocess.STDOUT)
- _poll_for_condition(lambda: os.path.exists(self._socket_path),
- desc="External app socket creation.")
-
-
- def __del__(self):
- if self._shell:
- self._shell.terminate()
- self._shell.wait()
- if self._shell.returncode != -SIGTERM:
- copyfileobj(self._output_file, sys.stdout)
- rmtree(self._tempdir)
-
-
- @property
- def socket_path(self):
- """The path of the socket where the shell is listening for external apps."""
- return self._socket_path
-
-
-class BackgroundAppGroup(object):
- """Manages a group of mojo apps running in the background."""
-
- def __init__(self, paths, app_urls, shell_args=None):
- """In a background process, spins up mojo_shell with external
- applications enabled, passing an optional list of extra arguments.
- Then, launches apps indicated by app_urls in the background.
- The apps and shell are automatically torn down upon destruction.
-
- Arguments:
- paths: a mopy.paths.Paths object.
- app_urls: a list of URLs for apps to run via mojo_launcher.
- shell_args: a list of arguments to pass to mojo_shell.
-
- Raises:
- a TimeoutError if the shell takes too long to begin running.
- """
- self._shell = _BackgroundShell(paths.mojo_shell_path, shell_args)
-
- # Run apps defined by app_urls in the background.
- self._apps = []
- for app_url in app_urls:
- launch_command = [
- paths.mojo_launcher_path,
- '--shell-path=' + self._shell.socket_path,
- '--app-url=' + app_url,
- '--app-path=' + paths.FileFromUrl(app_url),
- '--vmodule=*/mojo/shell/*=2']
- logging.getLogger().debug(launch_command)
- app_output_file = TemporaryFile()
- self._apps.append((app_output_file,
- subprocess.Popen(launch_command,
- stdout=app_output_file,
- stderr=subprocess.STDOUT)))
-
-
- def __del__(self):
- self._StopApps()
-
-
- def __enter__(self):
- return self
-
-
- def __exit__(self, ex_type, ex_value, traceback):
- self._StopApps()
-
-
- def _StopApps(self):
- """Terminate all background apps."""
- for output_file, app in self._apps:
- app.terminate()
- app.wait()
- if app.returncode != -SIGTERM:
- copyfileobj(output_file, sys.stdout)
- self._apps = []
-
-
- @property
- def socket_path(self):
- """The path of the socket where the shell is listening for external apps."""
- return self._shell._socket_path
« no previous file with comments | « mojo/tools/mopy/android.py ('k') | mojo/tools/mopy/config.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698