blob: 0c5ff6dcd17a7fb70cb3dd3253567455ea1ba98b [file] [log] [blame]
import subprocess
import fnmatch
import os
import sys
import psutil
import socket
def network_interface_should_exist(name):
if name not in psutil.net_if_addrs():
raise Exception('Network interface {} not found.'.format(name))
def network_interface_should_be_up(name):
network_interface_should_exist(name)
if sys.platform == "linux": # psutil marks tap interface as down, erroneously
proc = subprocess.Popen(['ip', 'addr', 'show', name, 'up'], stdout=subprocess.PIPE)
(output, err) = proc.communicate()
exit_code = proc.wait()
if exit_code != 0 or len(output) == 0:
raise Exception('Network interface {} is not up.'.format(name))
else:
if not (name in psutil.net_if_stats() and psutil.net_if_stats()[name].isup):
raise Exception('Network interface {} is not up.'.format(name))
def network_interface_should_have_address(name, address):
network_interface_should_exist(name)
if not (sys.platform == "win32" or sys.platform == "cygwin"):
# On Windows, the status of TAP interface depends on the
# signals sent to the device file using the DeviceIoControl
# function from Win32 API. For this reason it is the Renode
# that sets the up/down status instead - and as such for the
# automated testing this check is skipped on Windows.
network_interface_should_be_up(name)
ifaddresses = psutil.net_if_addrs()[name]
addresses = []
for addr in ifaddresses:
if addr.family == socket.AF_INET:
addresses.append(addr.address)
if address not in addresses:
raise Exception('Network interface {0} does not have address {1}.'.format(name, address))
def list_files_in_directory_recursively(directory_name, pattern, excludes=None):
files = []
for root, dirnames, filenames in os.walk(directory_name, topdown=True):
if excludes and os.path.basename(root) in excludes:
# this is an `os.walk` trick: when using `topdown=True`
# you can modify `dirnames` in place to tell `os.walk`
# which folders to visit; in this case - visit nothing
dirnames[:] = []
continue
for filename in fnmatch.filter(filenames, pattern):
files.append(os.path.join(root, filename))
return files