1#!/usr/bin/env python3
2#
3#  Copyright (c) 2019, The OpenThread Authors.
4#  All rights reserved.
5#
6#  Redistribution and use in source and binary forms, with or without
7#  modification, are permitted provided that the following conditions are met:
8#  1. Redistributions of source code must retain the above copyright
9#     notice, this list of conditions and the following disclaimer.
10#  2. Redistributions in binary form must reproduce the above copyright
11#     notice, this list of conditions and the following disclaimer in the
12#     documentation and/or other materials provided with the distribution.
13#  3. Neither the name of the copyright holder nor the
14#     names of its contributors may be used to endorse or promote products
15#     derived from this software without specific prior written permission.
16#
17#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27#  POSSIBILITY OF SUCH DAMAGE.
28#
29
30from builtins import input
31
32
33class Inspector:
34    """This class provides a way to inspect node status of a test case.
35
36    USAGE:
37        `#` mode
38            This is selection mode. You may select the node to inspect here.
39
40            `list`      - list available nodes.
41            `exit`      - end inspecting, continue running test case.
42            <numbers>   - select the node with id <number>. This will result in enter `>  mode.
43
44        `>` mode
45            This is node mode. You may run OpenThread CLI here.
46            `exit`      - go back to `#` mode.
47
48    EXAMPLE:
49        #
50        # 1
51        > state
52        leader
53        > exit
54        # 2
55        > panid
56        face
57        > exit
58        # exit
59    """
60
61    def __init__(self, test_case):
62        """ Initialize a inspector.
63
64        Args:
65            test_case: The test case to inspect
66        """
67        self.test_case = test_case
68
69    def inspect_node(self, nodeid):
70        """ Inspect the node with the given nodeid.
71
72        Args:
73            nodeid: key in self.test_case.nodes.
74        """
75        node = self.test_case.nodes[nodeid]
76        while True:
77            line = input('> ')
78            if not line:
79                continue
80
81            if line == 'exit':
82                break
83            else:
84                node.send_command(line)
85                node._expect('Done')
86
87    def inspect(self):
88        """ Start inspecting.
89        """
90        while True:
91            line = input('# ')
92            if not line:
93                continue
94
95            if line.isdigit():
96                self.inspect_node(int(line))
97            elif line == 'list':
98                print(self.test_case.nodes.keys())
99            elif line == 'exit':
100                break
101