| # Copyright 2016 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Tester feedback backend service implementation.""" |
| |
| import SimpleXMLRPCServer |
| import multiprocessing |
| |
| import feedback_delegate |
| import request_multiplexer |
| |
| # TODO(garnold) Load query delegate implementations as they become available |
| # (b/26769927). |
| # pylint: disable=unused-import |
| import audio_query_delegate_impl |
| |
| |
| class FeedbackService(object): |
| """The feedback service main object.""" |
| |
| def __init__(self): |
| self._multiplexer = None |
| self._server_port = 0 |
| self._server_process = None |
| self._running = False |
| |
| |
| @property |
| def server_port(self): |
| """Returns the service listening port.""" |
| return self._server_port |
| |
| |
| def start(self): |
| """Starts the feedback service.""" |
| if self._running: |
| return |
| |
| # Start the feedback request multiplexer. |
| self._multiplexer = request_multiplexer.FeedbackRequestMultiplexer() |
| self._multiplexer.start() |
| |
| # Start the feedback delegate RPC server. |
| rpc_server = SimpleXMLRPCServer.SimpleXMLRPCServer(('localhost', 0)) |
| rpc_server.register_instance( |
| feedback_delegate.FeedbackDelegate(self._multiplexer)) |
| self._server_port = rpc_server.server_address[1] |
| self._server_process = multiprocessing.Process( |
| target=rpc_server.serve_forever) |
| self._server_process.start() |
| |
| self._running = True |
| |
| |
| def stop(self): |
| """Stops the feedback service.""" |
| if not self._running: |
| return |
| |
| # Stop the RPC server. |
| self._server_process.terminate() |
| self._server_process.join() |
| self._server_port = 0 |
| |
| # Stop the multiplexer. |
| self._multiplexer.stop() |
| |
| self._running = False |