1*e5bb279fSStephen Warren# Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved. 2*e5bb279fSStephen Warren# 3*e5bb279fSStephen Warren# SPDX-License-Identifier: GPL-2.0 4*e5bb279fSStephen Warren 5*e5bb279fSStephen Warren# Test various network-related functionality, such as the dhcp, ping, and 6*e5bb279fSStephen Warren# tftpboot commands. 7*e5bb279fSStephen Warren 8*e5bb279fSStephen Warrenimport pytest 9*e5bb279fSStephen Warrenimport u_boot_utils 10*e5bb279fSStephen Warren 11*e5bb279fSStephen Warren''' 12*e5bb279fSStephen WarrenNote: This test relies on boardenv_* containing configuration values to define 13*e5bb279fSStephen Warrenwhich the network environment available for testing. Without this, this test 14*e5bb279fSStephen Warrenwill be automatically skipped. 15*e5bb279fSStephen Warren 16*e5bb279fSStephen WarrenFor example: 17*e5bb279fSStephen Warren 18*e5bb279fSStephen Warren# Any commands that need to be executed prior to testing, 19*e5bb279fSStephen Warren# to get the network hardware into an operational state. 20*e5bb279fSStephen Warren# 21*e5bb279fSStephen Warren# If no commands are required, this variable may be omitted, or set to an 22*e5bb279fSStephen Warren# empty list. 23*e5bb279fSStephen Warrenenv__net_pre_commands = [ 24*e5bb279fSStephen Warren "usb start", 25*e5bb279fSStephen Warren] 26*e5bb279fSStephen Warren 27*e5bb279fSStephen Warren# True if a DHCP server is attached to the network, and should be tested. 28*e5bb279fSStephen Warren# If DHCP testing is not possible or desired, this variable may be omitted or 29*e5bb279fSStephen Warren# set to False. 30*e5bb279fSStephen Warrenenv__net_dhcp_server = True 31*e5bb279fSStephen Warren 32*e5bb279fSStephen Warren# A list of environment variables that should be set in order to configure a 33*e5bb279fSStephen Warren# static IP. If solely relying on DHCP, this variable may be omitted or set to 34*e5bb279fSStephen Warren# an empty list. 35*e5bb279fSStephen Warrenenv__net_static_env_vars = [ 36*e5bb279fSStephen Warren ("ipaddr", "10.0.0.100"), 37*e5bb279fSStephen Warren ("netmask", "255.255.255.0"), 38*e5bb279fSStephen Warren ("serverip", "10.0.0.1"), 39*e5bb279fSStephen Warren] 40*e5bb279fSStephen Warren 41*e5bb279fSStephen Warren# Details regarding a file that may be read from a TFTP server. This variable 42*e5bb279fSStephen Warren# may be omitted or set to None if TFTP testing is not possible or desired. 43*e5bb279fSStephen Warrenenv__net_tftp_readable_file = { 44*e5bb279fSStephen Warren "fn": "ubtest-readable.bin", 45*e5bb279fSStephen Warren "size": 5058624, 46*e5bb279fSStephen Warren "crc32": "c2244b26", 47*e5bb279fSStephen Warren} 48*e5bb279fSStephen Warren''' 49*e5bb279fSStephen Warren 50*e5bb279fSStephen Warrennet_set_up = False 51*e5bb279fSStephen Warren 52*e5bb279fSStephen Warrendef test_net_pre_commands(u_boot_console): 53*e5bb279fSStephen Warren '''Execute any commands required to enable network hardware. 54*e5bb279fSStephen Warren 55*e5bb279fSStephen Warren These commands are provided by the boardenv_* file; see the comment at the 56*e5bb279fSStephen Warren beginning of this file. 57*e5bb279fSStephen Warren ''' 58*e5bb279fSStephen Warren 59*e5bb279fSStephen Warren cmds = u_boot_console.config.env.get('env__net_pre_commands', None) 60*e5bb279fSStephen Warren if not cmds: 61*e5bb279fSStephen Warren pytest.skip('No network pre-commands defined') 62*e5bb279fSStephen Warren 63*e5bb279fSStephen Warren for cmd in cmds: 64*e5bb279fSStephen Warren u_boot_console.run_command(cmd) 65*e5bb279fSStephen Warren 66*e5bb279fSStephen Warren@pytest.mark.buildconfigspec('cmd_dhcp') 67*e5bb279fSStephen Warrendef test_net_dhcp(u_boot_console): 68*e5bb279fSStephen Warren '''Test the dhcp command. 69*e5bb279fSStephen Warren 70*e5bb279fSStephen Warren The boardenv_* file may be used to enable/disable this test; see the 71*e5bb279fSStephen Warren comment at the beginning of this file. 72*e5bb279fSStephen Warren ''' 73*e5bb279fSStephen Warren 74*e5bb279fSStephen Warren test_dhcp = u_boot_console.config.env.get('env__net_dhcp_server', False) 75*e5bb279fSStephen Warren if not test_dhcp: 76*e5bb279fSStephen Warren pytest.skip('No DHCP server available') 77*e5bb279fSStephen Warren 78*e5bb279fSStephen Warren u_boot_console.run_command('setenv autoload no') 79*e5bb279fSStephen Warren output = u_boot_console.run_command('dhcp') 80*e5bb279fSStephen Warren assert 'DHCP client bound to address ' in output 81*e5bb279fSStephen Warren 82*e5bb279fSStephen Warren global net_set_up 83*e5bb279fSStephen Warren net_set_up = True 84*e5bb279fSStephen Warren 85*e5bb279fSStephen Warren@pytest.mark.buildconfigspec('net') 86*e5bb279fSStephen Warrendef test_net_setup_static(u_boot_console): 87*e5bb279fSStephen Warren '''Set up a static IP configuration. 88*e5bb279fSStephen Warren 89*e5bb279fSStephen Warren The configuration is provided by the boardenv_* file; see the comment at 90*e5bb279fSStephen Warren the beginning of this file. 91*e5bb279fSStephen Warren ''' 92*e5bb279fSStephen Warren 93*e5bb279fSStephen Warren env_vars = u_boot_console.config.env.get('env__net_static_env_vars', None) 94*e5bb279fSStephen Warren if not env_vars: 95*e5bb279fSStephen Warren pytest.skip('No static network configuration is defined') 96*e5bb279fSStephen Warren 97*e5bb279fSStephen Warren for (var, val) in env_vars: 98*e5bb279fSStephen Warren u_boot_console.run_command('setenv %s %s' % (var, val)) 99*e5bb279fSStephen Warren 100*e5bb279fSStephen Warren global net_set_up 101*e5bb279fSStephen Warren net_set_up = True 102*e5bb279fSStephen Warren 103*e5bb279fSStephen Warren@pytest.mark.buildconfigspec('cmd_ping') 104*e5bb279fSStephen Warrendef test_net_ping(u_boot_console): 105*e5bb279fSStephen Warren '''Test the ping command. 106*e5bb279fSStephen Warren 107*e5bb279fSStephen Warren The $serverip (as set up by either test_net_dhcp or test_net_setup_static) 108*e5bb279fSStephen Warren is pinged. The test validates that the host is alive, as reported by the 109*e5bb279fSStephen Warren ping command's output. 110*e5bb279fSStephen Warren ''' 111*e5bb279fSStephen Warren 112*e5bb279fSStephen Warren if not net_set_up: 113*e5bb279fSStephen Warren pytest.skip("Network not initialized") 114*e5bb279fSStephen Warren 115*e5bb279fSStephen Warren output = u_boot_console.run_command('ping $serverip') 116*e5bb279fSStephen Warren assert 'is alive' in output 117*e5bb279fSStephen Warren 118*e5bb279fSStephen Warren@pytest.mark.buildconfigspec('cmd_net') 119*e5bb279fSStephen Warrendef test_net_tftpboot(u_boot_console): 120*e5bb279fSStephen Warren '''Test the tftpboot command. 121*e5bb279fSStephen Warren 122*e5bb279fSStephen Warren A file is downloaded from the TFTP server, its size and optionally its 123*e5bb279fSStephen Warren CRC32 are validated. 124*e5bb279fSStephen Warren 125*e5bb279fSStephen Warren The details of the file to download are provided by the boardenv_* file; 126*e5bb279fSStephen Warren see the comment at the beginning of this file. 127*e5bb279fSStephen Warren ''' 128*e5bb279fSStephen Warren 129*e5bb279fSStephen Warren if not net_set_up: 130*e5bb279fSStephen Warren pytest.skip("Network not initialized") 131*e5bb279fSStephen Warren 132*e5bb279fSStephen Warren f = u_boot_console.config.env.get('env__net_tftp_readable_file', None) 133*e5bb279fSStephen Warren if not f: 134*e5bb279fSStephen Warren pytest.skip('No TFTP readable file to read') 135*e5bb279fSStephen Warren 136*e5bb279fSStephen Warren addr = u_boot_utils.find_ram_base(u_boot_console) 137*e5bb279fSStephen Warren fn = f['fn'] 138*e5bb279fSStephen Warren output = u_boot_console.run_command('tftpboot %x %s' % (addr, fn)) 139*e5bb279fSStephen Warren expected_text = 'Bytes transferred = ' 140*e5bb279fSStephen Warren sz = f.get('size', None) 141*e5bb279fSStephen Warren if sz: 142*e5bb279fSStephen Warren expected_text += '%d' % sz 143*e5bb279fSStephen Warren assert expected_text in output 144*e5bb279fSStephen Warren 145*e5bb279fSStephen Warren expected_crc = f.get('crc32', None) 146*e5bb279fSStephen Warren if not expected_crc: 147*e5bb279fSStephen Warren return 148*e5bb279fSStephen Warren 149*e5bb279fSStephen Warren if u_boot_console.config.buildconfig.get('config_cmd_crc32', 'n') != 'y': 150*e5bb279fSStephen Warren return 151*e5bb279fSStephen Warren 152*e5bb279fSStephen Warren output = u_boot_console.run_command('crc32 %x $filesize' % addr) 153*e5bb279fSStephen Warren assert expected_crc in output 154