1*9c5db199SXin Li# Copyright 2016 The Chromium OS Authors. All rights reserved. 2*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be 3*9c5db199SXin Li# found in the LICENSE file. 4*9c5db199SXin Li 5*9c5db199SXin Li"""Tester feedback backend service implementation.""" 6*9c5db199SXin Li 7*9c5db199SXin Liimport SimpleXMLRPCServer 8*9c5db199SXin Liimport multiprocessing 9*9c5db199SXin Li 10*9c5db199SXin Liimport feedback_delegate 11*9c5db199SXin Liimport request_multiplexer 12*9c5db199SXin Li 13*9c5db199SXin Li# TODO(garnold) Load query delegate implementations as they become available 14*9c5db199SXin Li# (b/26769927). 15*9c5db199SXin Li# pylint: disable=unused-import 16*9c5db199SXin Liimport audio_query_delegate_impl 17*9c5db199SXin Li 18*9c5db199SXin Li 19*9c5db199SXin Liclass FeedbackService(object): 20*9c5db199SXin Li """The feedback service main object.""" 21*9c5db199SXin Li 22*9c5db199SXin Li def __init__(self): 23*9c5db199SXin Li self._multiplexer = None 24*9c5db199SXin Li self._server_port = 0 25*9c5db199SXin Li self._server_process = None 26*9c5db199SXin Li self._running = False 27*9c5db199SXin Li 28*9c5db199SXin Li 29*9c5db199SXin Li @property 30*9c5db199SXin Li def server_port(self): 31*9c5db199SXin Li """Returns the service listening port.""" 32*9c5db199SXin Li return self._server_port 33*9c5db199SXin Li 34*9c5db199SXin Li 35*9c5db199SXin Li def start(self): 36*9c5db199SXin Li """Starts the feedback service.""" 37*9c5db199SXin Li if self._running: 38*9c5db199SXin Li return 39*9c5db199SXin Li 40*9c5db199SXin Li # Start the feedback request multiplexer. 41*9c5db199SXin Li self._multiplexer = request_multiplexer.FeedbackRequestMultiplexer() 42*9c5db199SXin Li self._multiplexer.start() 43*9c5db199SXin Li 44*9c5db199SXin Li # Start the feedback delegate RPC server. 45*9c5db199SXin Li rpc_server = SimpleXMLRPCServer.SimpleXMLRPCServer(('localhost', 0)) 46*9c5db199SXin Li rpc_server.register_instance( 47*9c5db199SXin Li feedback_delegate.FeedbackDelegate(self._multiplexer)) 48*9c5db199SXin Li self._server_port = rpc_server.server_address[1] 49*9c5db199SXin Li self._server_process = multiprocessing.Process( 50*9c5db199SXin Li target=rpc_server.serve_forever) 51*9c5db199SXin Li self._server_process.start() 52*9c5db199SXin Li 53*9c5db199SXin Li self._running = True 54*9c5db199SXin Li 55*9c5db199SXin Li 56*9c5db199SXin Li def stop(self): 57*9c5db199SXin Li """Stops the feedback service.""" 58*9c5db199SXin Li if not self._running: 59*9c5db199SXin Li return 60*9c5db199SXin Li 61*9c5db199SXin Li # Stop the RPC server. 62*9c5db199SXin Li self._server_process.terminate() 63*9c5db199SXin Li self._server_process.join() 64*9c5db199SXin Li self._server_port = 0 65*9c5db199SXin Li 66*9c5db199SXin Li # Stop the multiplexer. 67*9c5db199SXin Li self._multiplexer.stop() 68*9c5db199SXin Li 69*9c5db199SXin Li self._running = False 70