1*cfb92d14SAndroid Build Coastguard Worker#!/usr/bin/env python 2*cfb92d14SAndroid Build Coastguard Worker# 3*cfb92d14SAndroid Build Coastguard Worker# Copyright (c) 2016, The OpenThread Authors. 4*cfb92d14SAndroid Build Coastguard Worker# All rights reserved. 5*cfb92d14SAndroid Build Coastguard Worker# 6*cfb92d14SAndroid Build Coastguard Worker# Redistribution and use in source and binary forms, with or without 7*cfb92d14SAndroid Build Coastguard Worker# modification, are permitted provided that the following conditions are met: 8*cfb92d14SAndroid Build Coastguard Worker# 1. Redistributions of source code must retain the above copyright 9*cfb92d14SAndroid Build Coastguard Worker# notice, this list of conditions and the following disclaimer. 10*cfb92d14SAndroid Build Coastguard Worker# 2. Redistributions in binary form must reproduce the above copyright 11*cfb92d14SAndroid Build Coastguard Worker# notice, this list of conditions and the following disclaimer in the 12*cfb92d14SAndroid Build Coastguard Worker# documentation and/or other materials provided with the distribution. 13*cfb92d14SAndroid Build Coastguard Worker# 3. Neither the name of the copyright holder nor the 14*cfb92d14SAndroid Build Coastguard Worker# names of its contributors may be used to endorse or promote products 15*cfb92d14SAndroid Build Coastguard Worker# derived from this software without specific prior written permission. 16*cfb92d14SAndroid Build Coastguard Worker# 17*cfb92d14SAndroid Build Coastguard Worker# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18*cfb92d14SAndroid Build Coastguard Worker# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*cfb92d14SAndroid Build Coastguard Worker# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*cfb92d14SAndroid Build Coastguard Worker# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 21*cfb92d14SAndroid Build Coastguard Worker# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22*cfb92d14SAndroid Build Coastguard Worker# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23*cfb92d14SAndroid Build Coastguard Worker# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24*cfb92d14SAndroid Build Coastguard Worker# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25*cfb92d14SAndroid Build Coastguard Worker# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26*cfb92d14SAndroid Build Coastguard Worker# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27*cfb92d14SAndroid Build Coastguard Worker# POSSIBILITY OF SUCH DAMAGE. 28*cfb92d14SAndroid Build Coastguard Worker# 29*cfb92d14SAndroid Build Coastguard Worker 30*cfb92d14SAndroid Build Coastguard Workerimport ConfigParser 31*cfb92d14SAndroid Build Coastguard Workerimport logging 32*cfb92d14SAndroid Build Coastguard Workerimport os 33*cfb92d14SAndroid Build Coastguard Workerimport subprocess 34*cfb92d14SAndroid Build Coastguard Workerimport time 35*cfb92d14SAndroid Build Coastguard Worker 36*cfb92d14SAndroid Build Coastguard Workerfrom autothreadharness import settings 37*cfb92d14SAndroid Build Coastguard Worker 38*cfb92d14SAndroid Build Coastguard Workerlogger = logging.getLogger(__name__) 39*cfb92d14SAndroid Build Coastguard Worker 40*cfb92d14SAndroid Build Coastguard WorkerHARNESS_SVN_VERSION_R44 = 1471 41*cfb92d14SAndroid Build Coastguard Worker"""int: this is the first published release that miniweb was removed from Harness""" 42*cfb92d14SAndroid Build Coastguard Worker 43*cfb92d14SAndroid Build Coastguard Worker 44*cfb92d14SAndroid Build Coastguard Workerdef _try_kill(proc): 45*cfb92d14SAndroid Build Coastguard Worker logger.info('Try kill process') 46*cfb92d14SAndroid Build Coastguard Worker times = 1 47*cfb92d14SAndroid Build Coastguard Worker 48*cfb92d14SAndroid Build Coastguard Worker while proc.poll() is None: 49*cfb92d14SAndroid Build Coastguard Worker proc.kill() 50*cfb92d14SAndroid Build Coastguard Worker 51*cfb92d14SAndroid Build Coastguard Worker time.sleep(5) 52*cfb92d14SAndroid Build Coastguard Worker 53*cfb92d14SAndroid Build Coastguard Worker if proc.poll() is not None: 54*cfb92d14SAndroid Build Coastguard Worker logger.info('Process has been killed') 55*cfb92d14SAndroid Build Coastguard Worker break 56*cfb92d14SAndroid Build Coastguard Worker 57*cfb92d14SAndroid Build Coastguard Worker logger.info('Trial %d failed', times) 58*cfb92d14SAndroid Build Coastguard Worker times += 1 59*cfb92d14SAndroid Build Coastguard Worker 60*cfb92d14SAndroid Build Coastguard Worker if times > 3: 61*cfb92d14SAndroid Build Coastguard Worker raise SystemExit() 62*cfb92d14SAndroid Build Coastguard Worker 63*cfb92d14SAndroid Build Coastguard Worker 64*cfb92d14SAndroid Build Coastguard Workerclass HarnessController(object): 65*cfb92d14SAndroid Build Coastguard Worker """Harness service control 66*cfb92d14SAndroid Build Coastguard Worker 67*cfb92d14SAndroid Build Coastguard Worker This controls harness service, including the harness back-end and front-end. 68*cfb92d14SAndroid Build Coastguard Worker """ 69*cfb92d14SAndroid Build Coastguard Worker 70*cfb92d14SAndroid Build Coastguard Worker harness = None 71*cfb92d14SAndroid Build Coastguard Worker """harness back-end""" 72*cfb92d14SAndroid Build Coastguard Worker 73*cfb92d14SAndroid Build Coastguard Worker miniweb = None 74*cfb92d14SAndroid Build Coastguard Worker """harness front-end""" 75*cfb92d14SAndroid Build Coastguard Worker 76*cfb92d14SAndroid Build Coastguard Worker def __init__(self, result_dir=None): 77*cfb92d14SAndroid Build Coastguard Worker self.result_dir = result_dir 78*cfb92d14SAndroid Build Coastguard Worker self.harness_file = '' 79*cfb92d14SAndroid Build Coastguard Worker 80*cfb92d14SAndroid Build Coastguard Worker harness_info = ConfigParser.ConfigParser() 81*cfb92d14SAndroid Build Coastguard Worker harness_info.read('%s\\info.ini' % settings.HARNESS_HOME) 82*cfb92d14SAndroid Build Coastguard Worker self.version = harness_info.getint('Thread_Harness_Info', 'SVN') 83*cfb92d14SAndroid Build Coastguard Worker 84*cfb92d14SAndroid Build Coastguard Worker def start(self): 85*cfb92d14SAndroid Build Coastguard Worker logger.info('Starting harness service') 86*cfb92d14SAndroid Build Coastguard Worker if self.harness: 87*cfb92d14SAndroid Build Coastguard Worker logger.warning('Harness already started') 88*cfb92d14SAndroid Build Coastguard Worker else: 89*cfb92d14SAndroid Build Coastguard Worker env = dict( 90*cfb92d14SAndroid Build Coastguard Worker os.environ, 91*cfb92d14SAndroid Build Coastguard Worker PYTHONPATH='%s\\Thread_Harness;%s\\ThirdParty\\hsdk-python\\src' % 92*cfb92d14SAndroid Build Coastguard Worker (settings.HARNESS_HOME, settings.HARNESS_HOME), 93*cfb92d14SAndroid Build Coastguard Worker ) 94*cfb92d14SAndroid Build Coastguard Worker 95*cfb92d14SAndroid Build Coastguard Worker self.harness_file = '%s\\harness-%s.log' % (self.result_dir, time.strftime('%Y%m%d%H%M%S')) 96*cfb92d14SAndroid Build Coastguard Worker with open(self.harness_file, 'w') as harness_out: 97*cfb92d14SAndroid Build Coastguard Worker self.harness = subprocess.Popen( 98*cfb92d14SAndroid Build Coastguard Worker [ 99*cfb92d14SAndroid Build Coastguard Worker settings.HARNESS_HOME + '\\Python27\\python.exe', 100*cfb92d14SAndroid Build Coastguard Worker settings.HARNESS_HOME + '\\Thread_Harness\\Run.py', 101*cfb92d14SAndroid Build Coastguard Worker ], 102*cfb92d14SAndroid Build Coastguard Worker cwd=settings.HARNESS_HOME, 103*cfb92d14SAndroid Build Coastguard Worker stdout=harness_out, 104*cfb92d14SAndroid Build Coastguard Worker stderr=harness_out, 105*cfb92d14SAndroid Build Coastguard Worker env=env, 106*cfb92d14SAndroid Build Coastguard Worker ) 107*cfb92d14SAndroid Build Coastguard Worker time.sleep(2) 108*cfb92d14SAndroid Build Coastguard Worker 109*cfb92d14SAndroid Build Coastguard Worker if self.version >= HARNESS_SVN_VERSION_R44: 110*cfb92d14SAndroid Build Coastguard Worker return 111*cfb92d14SAndroid Build Coastguard Worker 112*cfb92d14SAndroid Build Coastguard Worker if self.miniweb: 113*cfb92d14SAndroid Build Coastguard Worker logger.warning('Miniweb already started') 114*cfb92d14SAndroid Build Coastguard Worker else: 115*cfb92d14SAndroid Build Coastguard Worker with open('%s\\miniweb-%s.log' % (self.result_dir, time.strftime('%Y%m%d%H%M%S')), 'w') as miniweb_out: 116*cfb92d14SAndroid Build Coastguard Worker self.miniweb = subprocess.Popen( 117*cfb92d14SAndroid Build Coastguard Worker [settings.HARNESS_HOME + '\\MiniWeb\\miniweb.exe'], 118*cfb92d14SAndroid Build Coastguard Worker stdout=miniweb_out, 119*cfb92d14SAndroid Build Coastguard Worker stderr=miniweb_out, 120*cfb92d14SAndroid Build Coastguard Worker cwd=settings.HARNESS_HOME + '\\MiniWeb', 121*cfb92d14SAndroid Build Coastguard Worker ) 122*cfb92d14SAndroid Build Coastguard Worker 123*cfb92d14SAndroid Build Coastguard Worker def stop(self): 124*cfb92d14SAndroid Build Coastguard Worker logger.info('Stopping harness service') 125*cfb92d14SAndroid Build Coastguard Worker 126*cfb92d14SAndroid Build Coastguard Worker if self.harness: 127*cfb92d14SAndroid Build Coastguard Worker _try_kill(self.harness) 128*cfb92d14SAndroid Build Coastguard Worker self.harness = None 129*cfb92d14SAndroid Build Coastguard Worker else: 130*cfb92d14SAndroid Build Coastguard Worker logger.warning('Harness not started yet') 131*cfb92d14SAndroid Build Coastguard Worker 132*cfb92d14SAndroid Build Coastguard Worker if self.version >= HARNESS_SVN_VERSION_R44: 133*cfb92d14SAndroid Build Coastguard Worker return 134*cfb92d14SAndroid Build Coastguard Worker 135*cfb92d14SAndroid Build Coastguard Worker if self.miniweb: 136*cfb92d14SAndroid Build Coastguard Worker _try_kill(self.miniweb) 137*cfb92d14SAndroid Build Coastguard Worker self.miniweb = None 138*cfb92d14SAndroid Build Coastguard Worker else: 139*cfb92d14SAndroid Build Coastguard Worker logger.warning('Miniweb not started yet') 140*cfb92d14SAndroid Build Coastguard Worker 141*cfb92d14SAndroid Build Coastguard Worker def tail(self): 142*cfb92d14SAndroid Build Coastguard Worker with open(self.harness_file) as harness_out: 143*cfb92d14SAndroid Build Coastguard Worker harness_out.seek(-100, 2) 144*cfb92d14SAndroid Build Coastguard Worker return ''.join(harness_out.readlines()) 145*cfb92d14SAndroid Build Coastguard Worker 146*cfb92d14SAndroid Build Coastguard Worker def __del__(self): 147*cfb92d14SAndroid Build Coastguard Worker self.stop() 148