141 lines
4.3 KiB
Python
Executable file
141 lines
4.3 KiB
Python
Executable file
#!/usr/bin/python
|
|
|
|
#
|
|
# Copyright (C) 2011 The Android Open Source Project
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
|
|
|
|
import logging
|
|
import logging.handlers
|
|
import optparse
|
|
import sys
|
|
import syslog
|
|
import time
|
|
|
|
import dbus
|
|
import flimflam
|
|
|
|
options = None
|
|
|
|
|
|
def SetupSyslog():
|
|
syslog_handler = logging.handlers.SysLogHandler(address='/dev/log')
|
|
formatter = logging.Formatter('%(pathname)s: %(message)s')
|
|
syslog_handler.setFormatter(formatter)
|
|
syslog_handler.setLevel(syslog.LOG_WARNING)
|
|
logging.getLogger().addHandler(syslog_handler)
|
|
logging.getLogger().addHandler(logging.StreamHandler())
|
|
|
|
|
|
def GetService(service_name):
|
|
flim = flimflam.FlimFlam(dbus.SystemBus())
|
|
service = flim.FindElementByNameSubstring('Service', service_name)
|
|
if not service:
|
|
logging.error('Could not find service %s' % service_name)
|
|
sys.exit(1)
|
|
return (flim, service)
|
|
|
|
|
|
def Cycle(service_name, iteration):
|
|
try:
|
|
(flim, service) = GetService(service_name)
|
|
|
|
(connect_success, _) = flim.ConnectService(service=service,
|
|
retry=False,
|
|
assoc_timeout=30)
|
|
time.sleep(options.sleep_after_connect)
|
|
|
|
(disconnect_state, _) = flim.DisconnectService(service)
|
|
time.sleep(options.sleep_after_disconnect)
|
|
|
|
disconnect_success = (disconnect_state == 'idle')
|
|
to_return = connect_success and disconnect_success
|
|
|
|
if not to_return:
|
|
logging.error('Failure at iteration %d: Connect:%-6s '
|
|
'Disconnect:%-6s' %
|
|
(iteration, connect_success, disconnect_success))
|
|
return to_return
|
|
|
|
except dbus.exceptions.DBusException, e:
|
|
logging.error('Unexpected DBus exception: %s' % e)
|
|
return False
|
|
|
|
|
|
def main():
|
|
SetupSyslog()
|
|
|
|
parser = optparse.OptionParser(usage='usage: %prog [options] service-name')
|
|
parser.set_defaults(keep_going=False)
|
|
|
|
parser.add_option('--continue', action='store_true', dest='keep_going',
|
|
help='continue after an error')
|
|
|
|
parser.add_option('--sleep_after_connect', default=0.5, type='float',
|
|
help='Time (in seconds) to sleep after connect')
|
|
|
|
parser.add_option('--sleep_after_disconnect', default=0, type='float',
|
|
help='Time (in seconds) to sleep after connect')
|
|
|
|
parser.add_option('--limit', default=0, type='int',
|
|
help='Number of iterations to run (0 for infinite)')
|
|
|
|
|
|
global options
|
|
(options, remaining) = parser.parse_args()
|
|
|
|
if len(remaining) < 1:
|
|
parser.error('Must supply a service name')
|
|
|
|
(service_name, ) = remaining
|
|
|
|
(flim, service) = GetService(service_name)
|
|
flim.DisconnectService(service)
|
|
|
|
total = 0
|
|
success = 0
|
|
while options.limit == 0 or total < options.limit:
|
|
rc = Cycle(service_name, total)
|
|
total += 1
|
|
if rc:
|
|
success += 1
|
|
|
|
message = (
|
|
'Fail rate %1.3f Pass %-5d Fail %-5d Total %-5d' %
|
|
(float(total - success) / total, success, total - success, total))
|
|
|
|
if (total % 10) == 0:
|
|
# Not really a warning, but we want to get this into syslog
|
|
logging.warning(message)
|
|
else:
|
|
print message
|
|
|
|
if not rc:
|
|
if options.keep_going:
|
|
# Don't want to run in a tight loop for a persistent failure
|
|
sleep_time = 10
|
|
logging.warning('Sleeping %d seconds' % sleep_time)
|
|
time.sleep(sleep_time)
|
|
else:
|
|
logging.error('Exiting on failure')
|
|
sys.exit(1)
|
|
print 'connect-disconnect: Success'
|
|
|
|
|
|
if __name__ == '__main__':
|
|
try:
|
|
main()
|
|
except KeyboardInterrupt:
|
|
sys.exit(1)
|