xref: /aosp_15_r20/external/openthread/tools/harness-automation/autothreadharness/harness_controller.py (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
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