Home | History | Annotate | Download | only in webpagereplay
      1 #!/usr/bin/env python
      2 # Copyright 2011 Google Inc. All Rights Reserved.
      3 #
      4 # Licensed under the Apache License, Version 2.0 (the "License");
      5 # you may not use this file except in compliance with the License.
      6 # You may obtain a copy of the License at
      7 #
      8 #      http://www.apache.org/licenses/LICENSE-2.0
      9 #
     10 # Unless required by applicable law or agreed to in writing, software
     11 # distributed under the License is distributed on an "AS IS" BASIS,
     12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 # See the License for the specific language governing permissions and
     14 # limitations under the License.
     15 
     16 """Unit tests for platformsettings.
     17 
     18 Usage:
     19 $ ./platformsettings_test.py
     20 """
     21 
     22 import unittest
     23 
     24 import platformsettings
     25 
     26 WINDOWS_7_IP = '172.11.25.170'
     27 WINDOWS_7_MAC = '00-1A-44-DA-88-C0'
     28 WINDOWS_7_IPCONFIG = """
     29 Windows IP Configuration
     30 
     31    Host Name . . . . . . . . . . . . : THEHOST1-W
     32    Primary Dns Suffix  . . . . . . . : something.example.com
     33    Node Type . . . . . . . . . . . . : Hybrid
     34    IP Routing Enabled. . . . . . . . : No
     35    WINS Proxy Enabled. . . . . . . . : No
     36    DNS Suffix Search List. . . . . . : example.com
     37                                        another.example.com
     38 
     39 Ethernet adapter Local Area Connection:
     40 
     41    Connection-specific DNS Suffix  . : somethingexample.com
     42    Description . . . . . . . . . . . : Int PRO/1000 MT Network Connection
     43    Physical Address. . . . . . . . . : %(mac_addr)s
     44    DHCP Enabled. . . . . . . . . . . : Yes
     45    Autoconfiguration Enabled . . . . : Yes
     46    IPv6 Address. . . . . . . . . . . : 1234:0:1000:1200:839f:d256:3a6c:210(Preferred)
     47    Temporary IPv6 Address. . . . . . : 2143:0:2100:1800:38f9:2d65:a3c6:120(Preferred)
     48    Link-local IPv6 Address . . . . . : abcd::1234:1a33:b2cc:238%%18(Preferred)
     49    IPv4 Address. . . . . . . . . . . : %(ip_addr)s(Preferred)
     50    Subnet Mask . . . . . . . . . . . : 255.255.248.0
     51    Lease Obtained. . . . . . . . . . : Thursday, April 28, 2011 9:40:22 PM
     52    Lease Expires . . . . . . . . . . : Tuesday, May 10, 2011 12:15:48 PM
     53    Default Gateway . . . . . . . . . : abcd::2:37ee:ef70:56%%18
     54                                        172.11.25.254
     55    DHCP Server . . . . . . . . . . . : 172.11.22.33
     56    DNS Servers . . . . . . . . . . . : 8.8.4.4
     57    NetBIOS over Tcpip. . . . . . . . : Enabled
     58 """ % {'ip_addr': WINDOWS_7_IP, 'mac_addr': WINDOWS_7_MAC}
     59 
     60 WINDOWS_XP_IP = '172.1.2.3'
     61 WINDOWS_XP_MAC = '00-34-B8-1F-FA-70'
     62 WINDOWS_XP_IPCONFIG = """
     63 Windows IP Configuration
     64 
     65         Host Name . . . . . . . . . . . . : HOSTY-0
     66         Primary Dns Suffix  . . . . . . . :
     67         Node Type . . . . . . . . . . . . : Unknown
     68         IP Routing Enabled. . . . . . . . : No
     69         WINS Proxy Enabled. . . . . . . . : No
     70         DNS Suffix Search List. . . . . . : example.com
     71 
     72 Ethernet adapter Local Area Connection 2:
     73 
     74         Connection-specific DNS Suffix  . : example.com
     75         Description . . . . . . . . . . . : Int Adapter (PILA8470B)
     76         Physical Address. . . . . . . . . : %(mac_addr)s
     77         Dhcp Enabled. . . . . . . . . . . : Yes
     78         Autoconfiguration Enabled . . . . : Yes
     79         IP Address. . . . . . . . . . . . : %(ip_addr)s
     80         Subnet Mask . . . . . . . . . . . : 255.255.254.0
     81         Default Gateway . . . . . . . . . : 172.1.2.254
     82         DHCP Server . . . . . . . . . . . : 172.1.3.241
     83         DNS Servers . . . . . . . . . . . : 172.1.3.241
     84                                             8.8.8.8
     85                                             8.8.4.4
     86         Lease Obtained. . . . . . . . . . : Thursday, April 07, 2011 9:14:55 AM
     87         Lease Expires . . . . . . . . . . : Thursday, April 07, 2011 1:14:55 PM
     88 """ % {'ip_addr': WINDOWS_XP_IP, 'mac_addr': WINDOWS_XP_MAC}
     89 
     90 
     91 # scutil show State:/Network/Global/IPv4
     92 OSX_IPV4_STATE = """
     93 <dictionary> {
     94   PrimaryInterface : en1
     95   PrimaryService : 8824452C-FED4-4C09-9256-40FB146739E0
     96   Router : 192.168.1.1
     97 }
     98 """
     99 
    100 # scutil show State:/Network/Service/[PRIMARY_SERVICE_KEY]/DNS
    101 OSX_DNS_STATE_LION = """
    102 <dictionary> {
    103   DomainName : mtv.corp.google.com
    104   SearchDomains : <array> {
    105     0 : mtv.corp.google.com
    106     1 : corp.google.com
    107     2 : prod.google.com
    108     3 : prodz.google.com
    109     4 : google.com
    110   }
    111   ServerAddresses : <array> {
    112     0 : 172.72.255.1
    113     1 : 172.49.117.57
    114     2 : 172.54.116.57
    115   }
    116 }
    117 """
    118 
    119 OSX_DNS_STATE_SNOW_LEOPARD = """
    120 <dictionary> {
    121   ServerAddresses : <array> {
    122     0 : 172.27.1.1
    123     1 : 172.94.117.57
    124     2 : 172.45.116.57
    125   }
    126   DomainName : mtv.corp.google.com
    127   SearchDomains : <array> {
    128     0 : mtv.corp.google.com
    129     1 : corp.google.com
    130     2 : prod.google.com
    131     3 : prodz.google.com
    132     4 : google.com
    133   }
    134 }
    135 """
    136 
    137 
    138 class SystemProxyTest(unittest.TestCase):
    139 
    140   def test_basic(self):
    141     system_proxy = platformsettings.SystemProxy(None, None)
    142     self.assertEqual(None, system_proxy.host)
    143     self.assertEqual(None, system_proxy.port)
    144     self.assertFalse(system_proxy)
    145 
    146   def test_from_url_empty(self):
    147     system_proxy = platformsettings.SystemProxy.from_url('')
    148     self.assertEqual(None, system_proxy.host)
    149     self.assertEqual(None, system_proxy.port)
    150     self.assertFalse(system_proxy)
    151 
    152   def test_from_url_basic(self):
    153     system_proxy = platformsettings.SystemProxy.from_url('http://pxy.com:8888/')
    154     self.assertEqual('pxy.com', system_proxy.host)
    155     self.assertEqual(8888, system_proxy.port)
    156     self.assertTrue(system_proxy)
    157 
    158   def test_from_url_no_port(self):
    159     system_proxy = platformsettings.SystemProxy.from_url('http://pxy.com/')
    160     self.assertEqual('pxy.com', system_proxy.host)
    161     self.assertEqual(None, system_proxy.port)
    162     self.assertTrue(system_proxy)
    163 
    164   def test_from_url_empty_string(self):
    165     system_proxy = platformsettings.SystemProxy.from_url('')
    166     self.assertEqual(None, system_proxy.host)
    167     self.assertEqual(None, system_proxy.port)
    168     self.assertFalse(system_proxy)
    169 
    170   def test_from_url_bad_string(self):
    171     system_proxy = platformsettings.SystemProxy.from_url('foo:80')
    172     self.assertEqual(None, system_proxy.host)
    173     self.assertEqual(None, system_proxy.port)
    174     self.assertFalse(system_proxy)
    175 
    176 
    177 class HasSniTest(unittest.TestCase):
    178   def test_has_sni(self):
    179     # Check that no exception is raised.
    180     platformsettings.HasSniSupport()
    181 
    182 
    183 # pylint: disable=abstract-method
    184 class Win7Settings(platformsettings._WindowsPlatformSettings):
    185   @classmethod
    186   def _ipconfig(cls, *args):
    187     if args == ('/all',):
    188       return WINDOWS_7_IPCONFIG
    189     raise RuntimeError
    190 
    191 class WinXpSettings(platformsettings._WindowsPlatformSettings):
    192   @classmethod
    193   def _ipconfig(cls, *args):
    194     if args == ('/all',):
    195       return WINDOWS_XP_IPCONFIG
    196     raise RuntimeError
    197 
    198 
    199 class WindowsPlatformSettingsTest(unittest.TestCase):
    200   def test_get_mac_address_xp(self):
    201     self.assertEqual(WINDOWS_XP_MAC,
    202                      WinXpSettings()._get_mac_address(WINDOWS_XP_IP))
    203 
    204   def test_get_mac_address_7(self):
    205     self.assertEqual(WINDOWS_7_MAC,
    206                      Win7Settings()._get_mac_address(WINDOWS_7_IP))
    207 
    208 
    209 class OsxSettings(platformsettings._OsxPlatformSettings):
    210   def __init__(self):
    211     super(OsxSettings, self).__init__()
    212     self.ipv4_state = OSX_IPV4_STATE
    213     self.dns_state = None  # varies by test
    214 
    215   def _scutil(self, cmd):
    216     if cmd == 'show State:/Network/Global/IPv4':
    217       return self.ipv4_state
    218     elif cmd.startswith('show State:/Network/Service/'):
    219       return self.dns_state
    220     raise RuntimeError("Unrecognized cmd: %s", cmd)
    221 
    222 
    223 class OsxPlatformSettingsTest(unittest.TestCase):
    224   def setUp(self):
    225     self.settings = OsxSettings()
    226 
    227   def test_get_primary_nameserver_lion(self):
    228     self.settings.dns_state = OSX_DNS_STATE_LION
    229     self.assertEqual('172.72.255.1', self.settings._get_primary_nameserver())
    230 
    231   def test_get_primary_nameserver_snow_leopard(self):
    232     self.settings.dns_state = OSX_DNS_STATE_SNOW_LEOPARD
    233     self.assertEqual('172.27.1.1', self.settings._get_primary_nameserver())
    234 
    235   def test_get_primary_nameserver_unexpected_ipv4_state_raises(self):
    236     self.settings.ipv4_state = 'Some error'
    237     self.settings.dns_state = OSX_DNS_STATE_SNOW_LEOPARD
    238     self.assertRaises(platformsettings.DnsReadError,
    239                       self.settings._get_primary_nameserver)
    240 
    241   def test_get_primary_nameserver_unexpected_dns_state_raises(self):
    242     self.settings.dns_state = 'Some other error'
    243     self.assertRaises(platformsettings.DnsReadError,
    244                       self.settings._get_primary_nameserver)
    245 
    246 
    247 if __name__ == '__main__':
    248   unittest.main()
    249