# Copyright 2015 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.
import time
from autotest_lib.client.common_lib import error
from autotest_lib.client.common_lib import utils
from autotest_lib.client.common_lib.cros import dbus_send
SERVICE_NAME = 'org.chromium.peerd'
DBUS_PATH_MANAGER = '/org/chromium/peerd/Manager'
DBUS_PATH_SELF = '/org/chromium/peerd/Self'
DBUS_INTERFACE_MANAGER = 'org.chromium.peerd.Manager'
DBUS_INTERFACE_PEER = 'org.chromium.peerd.Peer'
DBUS_INTERFACE_SERVICE = 'org.chromium.peerd.Service'
OBJECT_MANAGER_PATH = '/org/chromium/peerd'
SERVICE_PROPERTY_SERVICE_ID = 'ServiceId'
def confirm_peerd_up(service_name=SERVICE_NAME, timeout_seconds=10, host=None):
"""Confirm that an instance of peerd is running.
@param service_name: string name of DBus connection to look for peerd on.
Defaults to the well known peerd bus name.
@param timeout_seconds: number of seconds to wait for peerd to answer
queries.
@param host: Host object if peerd is running on a remote host.
"""
start_time = time.time()
while time.time() - start_time < timeout_seconds:
result = dbus_send.dbus_send(
service_name, DBUS_INTERFACE_MANAGER, DBUS_PATH_MANAGER,
'Ping', host=host, tolerate_failures=True)
if result is not None and result.response == 'Hello world!':
return
time.sleep(0.5)
raise error.TestFail('Timed out before peerd at %s started.' % service_name)
class PeerdConfig(object):
"""An object that knows how to restart peerd in various configurations."""
def __init__(self, mdns_prefix=None, verbosity_level=None):
"""Construct a peerd configuration.
@param verbosity_level: int level of log verbosity from peerd (e.g. 0
will log INFO level, 3 is verbosity level 3).
@param mdns_prefix: string prefix for mDNS records. Will be ignored if
using that prefix causes name conflicts.
"""
self.mdns_prefix = mdns_prefix
self.verbosity_level = verbosity_level
def restart_with_config(self, host=None, timeout_seconds=10):
"""Restart peerd with this config.
@param host: Host object if peerd is running on a remote host.
@param timeout_seconds: number of seconds to wait for peerd to start.
Pass None to return without confirming peerd startup.
"""
run = utils.run if host is None else host.run
flag_list = []
if self.verbosity_level is not None:
flag_list.append('PEERD_LOG_LEVEL=%d' % self.verbosity_level)
if self.mdns_prefix is not None:
flag_list.append('PEERD_INITIAL_MDNS_PREFIX=%s' % self.mdns_prefix)
run('stop peerd', ignore_status=True)
run('start peerd %s' % ' '.join(flag_list))
if timeout_seconds is None:
return
confirm_peerd_up(service_name=SERVICE_NAME,
timeout_seconds=timeout_seconds,
host=host)