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