#!/usr/bin/env python """ Unit-Tests for moznetwork """ import os import mock import mozinfo import moznetwork import re import subprocess import unittest def verify_ip_in_list(ip): """ Helper Method to check if `ip` is listed in Network Adresses returned by ipconfig/ifconfig, depending on the platform in use :param ip: IPv4 address in the xxx.xxx.xxx.xxx format as a string Example Usage: verify_ip_in_list('192.168.0.1') returns True if the `ip` is in the list of IPs in ipconfig/ifconfig """ # Regex to match IPv4 addresses. # 0-255.0-255.0-255.0-255, note order is important here. regexip = re.compile("((25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}" "(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)") if mozinfo.isLinux or mozinfo.isMac or mozinfo.isBsd: # if "/sbin/ifconfig" exist, use it because it may not be in the # PATH (at least on some linux platforms) if os.path.isfile('/sbin/ifconfig') and os.access('/sbin/ifconfig', os.X_OK): args = ['/sbin/ifconfig'] else: args = ["ifconfig"] if mozinfo.isWin: args = ["ipconfig"] ps = subprocess.Popen(args, stdout=subprocess.PIPE) standardoutput, standarderror = ps.communicate() # Generate a list of IPs by parsing the output of ip/ifconfig ip_list = [x.group() for x in re.finditer(regexip, standardoutput)] # Check if ip is in list if ip in ip_list: return True else: return False class TestGetIP(unittest.TestCase): def test_get_ip(self): """ Attempt to test the IP address returned by moznetwork.get_ip() is valid """ ip = moznetwork.get_ip() # Check the IP returned by moznetwork is in the list self.assertTrue(verify_ip_in_list(ip)) def test_get_ip_using_get_interface(self): """ Test that the control flow path for get_ip() using _get_interface_list() is works """ if mozinfo.isLinux or mozinfo.isMac: with mock.patch('socket.gethostbyname') as byname: # Force socket.gethostbyname to return None byname.return_value = None ip = moznetwork.get_ip() # Check the IP returned by moznetwork is in the list self.assertTrue(verify_ip_in_list(ip)) if __name__ == '__main__': unittest.main()