xref: /rk3399_rockchip-uboot/test/py/u_boot_console_sandbox.py (revision d201506cca782c54309b488170623094f252aab5)
1*d201506cSStephen Warren# Copyright (c) 2015 Stephen Warren
2*d201506cSStephen Warren# Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
3*d201506cSStephen Warren#
4*d201506cSStephen Warren# SPDX-License-Identifier: GPL-2.0
5*d201506cSStephen Warren
6*d201506cSStephen Warren# Logic to interact with the sandbox port of U-Boot, running as a sub-process.
7*d201506cSStephen Warren
8*d201506cSStephen Warrenimport time
9*d201506cSStephen Warrenfrom u_boot_spawn import Spawn
10*d201506cSStephen Warrenfrom u_boot_console_base import ConsoleBase
11*d201506cSStephen Warren
12*d201506cSStephen Warrenclass ConsoleSandbox(ConsoleBase):
13*d201506cSStephen Warren    '''Represents a connection to a sandbox U-Boot console, executed as a sub-
14*d201506cSStephen Warren    process.'''
15*d201506cSStephen Warren
16*d201506cSStephen Warren    def __init__(self, log, config):
17*d201506cSStephen Warren        '''Initialize a U-Boot console connection.
18*d201506cSStephen Warren
19*d201506cSStephen Warren        Args:
20*d201506cSStephen Warren            log: A multiplexed_log.Logfile instance.
21*d201506cSStephen Warren            config: A "configuration" object as defined in conftest.py.
22*d201506cSStephen Warren
23*d201506cSStephen Warren        Returns:
24*d201506cSStephen Warren            Nothing.
25*d201506cSStephen Warren        '''
26*d201506cSStephen Warren
27*d201506cSStephen Warren        super(ConsoleSandbox, self).__init__(log, config, max_fifo_fill=1024)
28*d201506cSStephen Warren
29*d201506cSStephen Warren    def get_spawn(self):
30*d201506cSStephen Warren        '''Connect to a fresh U-Boot instance.
31*d201506cSStephen Warren
32*d201506cSStephen Warren        A new sandbox process is created, so that U-Boot begins running from
33*d201506cSStephen Warren        scratch.
34*d201506cSStephen Warren
35*d201506cSStephen Warren        Args:
36*d201506cSStephen Warren            None.
37*d201506cSStephen Warren
38*d201506cSStephen Warren        Returns:
39*d201506cSStephen Warren            A u_boot_spawn.Spawn object that is attached to U-Boot.
40*d201506cSStephen Warren        '''
41*d201506cSStephen Warren
42*d201506cSStephen Warren        return Spawn([self.config.build_dir + '/u-boot'])
43*d201506cSStephen Warren
44*d201506cSStephen Warren    def kill(self, sig):
45*d201506cSStephen Warren        '''Send a specific Unix signal to the sandbox process.
46*d201506cSStephen Warren
47*d201506cSStephen Warren        Args:
48*d201506cSStephen Warren            sig: The Unix signal to send to the process.
49*d201506cSStephen Warren
50*d201506cSStephen Warren        Returns:
51*d201506cSStephen Warren            Nothing.
52*d201506cSStephen Warren        '''
53*d201506cSStephen Warren
54*d201506cSStephen Warren        self.ensure_spawned()
55*d201506cSStephen Warren        self.log.action('kill %d' % sig)
56*d201506cSStephen Warren        self.p.kill(sig)
57*d201506cSStephen Warren
58*d201506cSStephen Warren    def validate_exited(self):
59*d201506cSStephen Warren        '''Determine whether the sandbox process has exited.
60*d201506cSStephen Warren
61*d201506cSStephen Warren        If required, this function waits a reasonable time for the process to
62*d201506cSStephen Warren        exit.
63*d201506cSStephen Warren
64*d201506cSStephen Warren        Args:
65*d201506cSStephen Warren            None.
66*d201506cSStephen Warren
67*d201506cSStephen Warren        Returns:
68*d201506cSStephen Warren            Boolean indicating whether the process has exited.
69*d201506cSStephen Warren        '''
70*d201506cSStephen Warren
71*d201506cSStephen Warren        p = self.p
72*d201506cSStephen Warren        self.p = None
73*d201506cSStephen Warren        for i in xrange(100):
74*d201506cSStephen Warren            ret = not p.isalive()
75*d201506cSStephen Warren            if ret:
76*d201506cSStephen Warren                break
77*d201506cSStephen Warren            time.sleep(0.1)
78*d201506cSStephen Warren        p.close()
79*d201506cSStephen Warren        return ret
80