xref: /OK3568_Linux_fs/u-boot/test/py/tests/test_hush_if_test.py (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun# Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
2*4882a593Smuzhiyun#
3*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun# Test operation of the "if" shell command.
6*4882a593Smuzhiyun
7*4882a593Smuzhiyunimport os
8*4882a593Smuzhiyunimport os.path
9*4882a593Smuzhiyunimport pytest
10*4882a593Smuzhiyun
11*4882a593Smuzhiyunpytestmark = pytest.mark.buildconfigspec('hush_parser')
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun# The list of "if test" conditions to test.
14*4882a593Smuzhiyunsubtests = (
15*4882a593Smuzhiyun    # Base if functionality.
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun    ('true', True),
18*4882a593Smuzhiyun    ('false', False),
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun    # Basic operators.
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun    ('test aaa = aaa', True),
23*4882a593Smuzhiyun    ('test aaa = bbb', False),
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun    ('test aaa != bbb', True),
26*4882a593Smuzhiyun    ('test aaa != aaa', False),
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun    ('test aaa < bbb', True),
29*4882a593Smuzhiyun    ('test bbb < aaa', False),
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun    ('test bbb > aaa', True),
32*4882a593Smuzhiyun    ('test aaa > bbb', False),
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun    ('test 123 -eq 123', True),
35*4882a593Smuzhiyun    ('test 123 -eq 456', False),
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun    ('test 123 -ne 456', True),
38*4882a593Smuzhiyun    ('test 123 -ne 123', False),
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun    ('test 123 -lt 456', True),
41*4882a593Smuzhiyun    ('test 123 -lt 123', False),
42*4882a593Smuzhiyun    ('test 456 -lt 123', False),
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun    ('test 123 -le 456', True),
45*4882a593Smuzhiyun    ('test 123 -le 123', True),
46*4882a593Smuzhiyun    ('test 456 -le 123', False),
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun    ('test 456 -gt 123', True),
49*4882a593Smuzhiyun    ('test 123 -gt 123', False),
50*4882a593Smuzhiyun    ('test 123 -gt 456', False),
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun    ('test 456 -ge 123', True),
53*4882a593Smuzhiyun    ('test 123 -ge 123', True),
54*4882a593Smuzhiyun    ('test 123 -ge 456', False),
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun    ('test -z ""', True),
57*4882a593Smuzhiyun    ('test -z "aaa"', False),
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun    ('test -n "aaa"', True),
60*4882a593Smuzhiyun    ('test -n ""', False),
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun    # Inversion of simple tests.
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun    ('test ! aaa = aaa', False),
65*4882a593Smuzhiyun    ('test ! aaa = bbb', True),
66*4882a593Smuzhiyun    ('test ! ! aaa = aaa', True),
67*4882a593Smuzhiyun    ('test ! ! aaa = bbb', False),
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun    # Binary operators.
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun    ('test aaa != aaa -o bbb != bbb', False),
72*4882a593Smuzhiyun    ('test aaa != aaa -o bbb = bbb', True),
73*4882a593Smuzhiyun    ('test aaa = aaa -o bbb != bbb', True),
74*4882a593Smuzhiyun    ('test aaa = aaa -o bbb = bbb', True),
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun    ('test aaa != aaa -a bbb != bbb', False),
77*4882a593Smuzhiyun    ('test aaa != aaa -a bbb = bbb', False),
78*4882a593Smuzhiyun    ('test aaa = aaa -a bbb != bbb', False),
79*4882a593Smuzhiyun    ('test aaa = aaa -a bbb = bbb', True),
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun    # Inversion within binary operators.
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun    ('test ! aaa != aaa -o ! bbb != bbb', True),
84*4882a593Smuzhiyun    ('test ! aaa != aaa -o ! bbb = bbb', True),
85*4882a593Smuzhiyun    ('test ! aaa = aaa -o ! bbb != bbb', True),
86*4882a593Smuzhiyun    ('test ! aaa = aaa -o ! bbb = bbb', False),
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun    ('test ! ! aaa != aaa -o ! ! bbb != bbb', False),
89*4882a593Smuzhiyun    ('test ! ! aaa != aaa -o ! ! bbb = bbb', True),
90*4882a593Smuzhiyun    ('test ! ! aaa = aaa -o ! ! bbb != bbb', True),
91*4882a593Smuzhiyun    ('test ! ! aaa = aaa -o ! ! bbb = bbb', True),
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun    # -z operator.
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun    ('test -z "$ut_var_nonexistent"', True),
96*4882a593Smuzhiyun    ('test -z "$ut_var_exists"', False),
97*4882a593Smuzhiyun)
98*4882a593Smuzhiyun
99*4882a593Smuzhiyundef exec_hush_if(u_boot_console, expr, result):
100*4882a593Smuzhiyun    """Execute a shell "if" command, and validate its result."""
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun    config = u_boot_console.config.buildconfig
103*4882a593Smuzhiyun    maxargs = int(config.get('config_sys_maxargs', '0'))
104*4882a593Smuzhiyun    args = len(expr.split(' ')) - 1
105*4882a593Smuzhiyun    if args > maxargs:
106*4882a593Smuzhiyun        u_boot_console.log.warning('CONFIG_SYS_MAXARGS too low; need ' +
107*4882a593Smuzhiyun            str(args))
108*4882a593Smuzhiyun        pytest.skip()
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun    cmd = 'if ' + expr + '; then echo true; else echo false; fi'
111*4882a593Smuzhiyun    response = u_boot_console.run_command(cmd)
112*4882a593Smuzhiyun    assert response.strip() == str(result).lower()
113*4882a593Smuzhiyun
114*4882a593Smuzhiyundef test_hush_if_test_setup(u_boot_console):
115*4882a593Smuzhiyun    """Set up environment variables used during the "if" tests."""
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun    u_boot_console.run_command('setenv ut_var_nonexistent')
118*4882a593Smuzhiyun    u_boot_console.run_command('setenv ut_var_exists 1')
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun@pytest.mark.buildconfigspec('cmd_echo')
121*4882a593Smuzhiyun@pytest.mark.parametrize('expr,result', subtests)
122*4882a593Smuzhiyundef test_hush_if_test(u_boot_console, expr, result):
123*4882a593Smuzhiyun    """Test a single "if test" condition."""
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun    exec_hush_if(u_boot_console, expr, result)
126*4882a593Smuzhiyun
127*4882a593Smuzhiyundef test_hush_if_test_teardown(u_boot_console):
128*4882a593Smuzhiyun    """Clean up environment variables used during the "if" tests."""
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun    u_boot_console.run_command('setenv ut_var_exists')
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun# We might test this on real filesystems via UMS, DFU, 'save', etc.
133*4882a593Smuzhiyun# Of those, only UMS currently allows file removal though.
134*4882a593Smuzhiyun@pytest.mark.buildconfigspec('cmd_echo')
135*4882a593Smuzhiyun@pytest.mark.boardspec('sandbox')
136*4882a593Smuzhiyundef test_hush_if_test_host_file_exists(u_boot_console):
137*4882a593Smuzhiyun    """Test the "if test -e" shell command."""
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun    test_file = u_boot_console.config.result_dir + \
140*4882a593Smuzhiyun        '/creating_this_file_breaks_u_boot_tests'
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun    try:
143*4882a593Smuzhiyun        os.unlink(test_file)
144*4882a593Smuzhiyun    except:
145*4882a593Smuzhiyun        pass
146*4882a593Smuzhiyun    assert not os.path.exists(test_file)
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun    expr = 'test -e hostfs - ' + test_file
149*4882a593Smuzhiyun    exec_hush_if(u_boot_console, expr, False)
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun    try:
152*4882a593Smuzhiyun        with file(test_file, 'wb'):
153*4882a593Smuzhiyun            pass
154*4882a593Smuzhiyun        assert os.path.exists(test_file)
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun        expr = 'test -e hostfs - ' + test_file
157*4882a593Smuzhiyun        exec_hush_if(u_boot_console, expr, True)
158*4882a593Smuzhiyun    finally:
159*4882a593Smuzhiyun        os.unlink(test_file)
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun    expr = 'test -e hostfs - ' + test_file
162*4882a593Smuzhiyun    exec_hush_if(u_boot_console, expr, False)
163