#!/usr/bin/env python # Copyright 2011 Google Inc. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Unit tests for platformsettings. Usage: $ ./platformsettings_test.py """ import unittest import platformsettings WINDOWS_7_IP = '172.11.25.170' WINDOWS_7_MAC = '00-1A-44-DA-88-C0' WINDOWS_7_IPCONFIG = """ Windows IP Configuration Host Name . . . . . . . . . . . . : THEHOST1-W Primary Dns Suffix . . . . . . . : something.example.com Node Type . . . . . . . . . . . . : Hybrid IP Routing Enabled. . . . . . . . : No WINS Proxy Enabled. . . . . . . . : No DNS Suffix Search List. . . . . . : example.com another.example.com Ethernet adapter Local Area Connection: Connection-specific DNS Suffix . : somethingexample.com Description . . . . . . . . . . . : Int PRO/1000 MT Network Connection Physical Address. . . . . . . . . : %(mac_addr)s DHCP Enabled. . . . . . . . . . . : Yes Autoconfiguration Enabled . . . . : Yes IPv6 Address. . . . . . . . . . . : 1234:0:1000:1200:839f:d256:3a6c:210(Preferred) Temporary IPv6 Address. . . . . . : 2143:0:2100:1800:38f9:2d65:a3c6:120(Preferred) Link-local IPv6 Address . . . . . : abcd::1234:1a33:b2cc:238%%18(Preferred) IPv4 Address. . . . . . . . . . . : %(ip_addr)s(Preferred) Subnet Mask . . . . . . . . . . . : 255.255.248.0 Lease Obtained. . . . . . . . . . : Thursday, April 28, 2011 9:40:22 PM Lease Expires . . . . . . . . . . : Tuesday, May 10, 2011 12:15:48 PM Default Gateway . . . . . . . . . : abcd::2:37ee:ef70:56%%18 172.11.25.254 DHCP Server . . . . . . . . . . . : 172.11.22.33 DNS Servers . . . . . . . . . . . : 8.8.4.4 NetBIOS over Tcpip. . . . . . . . : Enabled """ % {'ip_addr': WINDOWS_7_IP, 'mac_addr': WINDOWS_7_MAC} WINDOWS_XP_IP = '172.1.2.3' WINDOWS_XP_MAC = '00-34-B8-1F-FA-70' WINDOWS_XP_IPCONFIG = """ Windows IP Configuration Host Name . . . . . . . . . . . . : HOSTY-0 Primary Dns Suffix . . . . . . . : Node Type . . . . . . . . . . . . : Unknown IP Routing Enabled. . . . . . . . : No WINS Proxy Enabled. . . . . . . . : No DNS Suffix Search List. . . . . . : example.com Ethernet adapter Local Area Connection 2: Connection-specific DNS Suffix . : example.com Description . . . . . . . . . . . : Int Adapter (PILA8470B) Physical Address. . . . . . . . . : %(mac_addr)s Dhcp Enabled. . . . . . . . . . . : Yes Autoconfiguration Enabled . . . . : Yes IP Address. . . . . . . . . . . . : %(ip_addr)s Subnet Mask . . . . . . . . . . . : 255.255.254.0 Default Gateway . . . . . . . . . : 172.1.2.254 DHCP Server . . . . . . . . . . . : 172.1.3.241 DNS Servers . . . . . . . . . . . : 172.1.3.241 8.8.8.8 8.8.4.4 Lease Obtained. . . . . . . . . . : Thursday, April 07, 2011 9:14:55 AM Lease Expires . . . . . . . . . . : Thursday, April 07, 2011 1:14:55 PM """ % {'ip_addr': WINDOWS_XP_IP, 'mac_addr': WINDOWS_XP_MAC} # scutil show State:/Network/Global/IPv4 OSX_IPV4_STATE = """ <dictionary> { PrimaryInterface : en1 PrimaryService : 8824452C-FED4-4C09-9256-40FB146739E0 Router : 192.168.1.1 } """ # scutil show State:/Network/Service/[PRIMARY_SERVICE_KEY]/DNS OSX_DNS_STATE_LION = """ <dictionary> { DomainName : mtv.corp.google.com SearchDomains : <array> { 0 : mtv.corp.google.com 1 : corp.google.com 2 : prod.google.com 3 : prodz.google.com 4 : google.com } ServerAddresses : <array> { 0 : 172.72.255.1 1 : 172.49.117.57 2 : 172.54.116.57 } } """ OSX_DNS_STATE_SNOW_LEOPARD = """ <dictionary> { ServerAddresses : <array> { 0 : 172.27.1.1 1 : 172.94.117.57 2 : 172.45.116.57 } DomainName : mtv.corp.google.com SearchDomains : <array> { 0 : mtv.corp.google.com 1 : corp.google.com 2 : prod.google.com 3 : prodz.google.com 4 : google.com } } """ class SystemProxyTest(unittest.TestCase): def test_basic(self): system_proxy = platformsettings.SystemProxy(None, None) self.assertEqual(None, system_proxy.host) self.assertEqual(None, system_proxy.port) self.assertFalse(system_proxy) def test_from_url_empty(self): system_proxy = platformsettings.SystemProxy.from_url('') self.assertEqual(None, system_proxy.host) self.assertEqual(None, system_proxy.port) self.assertFalse(system_proxy) def test_from_url_basic(self): system_proxy = platformsettings.SystemProxy.from_url('http://pxy.com:8888/') self.assertEqual('pxy.com', system_proxy.host) self.assertEqual(8888, system_proxy.port) self.assertTrue(system_proxy) def test_from_url_no_port(self): system_proxy = platformsettings.SystemProxy.from_url('http://pxy.com/') self.assertEqual('pxy.com', system_proxy.host) self.assertEqual(None, system_proxy.port) self.assertTrue(system_proxy) def test_from_url_empty_string(self): system_proxy = platformsettings.SystemProxy.from_url('') self.assertEqual(None, system_proxy.host) self.assertEqual(None, system_proxy.port) self.assertFalse(system_proxy) def test_from_url_bad_string(self): system_proxy = platformsettings.SystemProxy.from_url('foo:80') self.assertEqual(None, system_proxy.host) self.assertEqual(None, system_proxy.port) self.assertFalse(system_proxy) class HasSniTest(unittest.TestCase): def test_has_sni(self): # Check that no exception is raised. platformsettings.HasSniSupport() # pylint: disable=abstract-method class Win7Settings(platformsettings._WindowsPlatformSettings): @classmethod def _ipconfig(cls, *args): if args == ('/all',): return WINDOWS_7_IPCONFIG raise RuntimeError class WinXpSettings(platformsettings._WindowsPlatformSettings): @classmethod def _ipconfig(cls, *args): if args == ('/all',): return WINDOWS_XP_IPCONFIG raise RuntimeError class WindowsPlatformSettingsTest(unittest.TestCase): def test_get_mac_address_xp(self): self.assertEqual(WINDOWS_XP_MAC, WinXpSettings()._get_mac_address(WINDOWS_XP_IP)) def test_get_mac_address_7(self): self.assertEqual(WINDOWS_7_MAC, Win7Settings()._get_mac_address(WINDOWS_7_IP)) class OsxSettings(platformsettings._OsxPlatformSettings): def __init__(self): super(OsxSettings, self).__init__() self.ipv4_state = OSX_IPV4_STATE self.dns_state = None # varies by test def _scutil(self, cmd): if cmd == 'show State:/Network/Global/IPv4': return self.ipv4_state elif cmd.startswith('show State:/Network/Service/'): return self.dns_state raise RuntimeError("Unrecognized cmd: %s", cmd) class OsxPlatformSettingsTest(unittest.TestCase): def setUp(self): self.settings = OsxSettings() def test_get_primary_nameserver_lion(self): self.settings.dns_state = OSX_DNS_STATE_LION self.assertEqual('172.72.255.1', self.settings._get_primary_nameserver()) def test_get_primary_nameserver_snow_leopard(self): self.settings.dns_state = OSX_DNS_STATE_SNOW_LEOPARD self.assertEqual('172.27.1.1', self.settings._get_primary_nameserver()) def test_get_primary_nameserver_unexpected_ipv4_state_raises(self): self.settings.ipv4_state = 'Some error' self.settings.dns_state = OSX_DNS_STATE_SNOW_LEOPARD self.assertRaises(platformsettings.DnsReadError, self.settings._get_primary_nameserver) def test_get_primary_nameserver_unexpected_dns_state_raises(self): self.settings.dns_state = 'Some other error' self.assertRaises(platformsettings.DnsReadError, self.settings._get_primary_nameserver) if __name__ == '__main__': unittest.main()