# 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