Home | History | Annotate | Download | only in cellular
      1 #!/usr/bin/python
      2 # Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
      3 # Use of this source code is governed by a BSD-style license that can be
      4 # found in the LICENSE file.
      5 
      6 """Configuration for cell emulator tests."""
      7 import copy, unittest
      8 
      9 CELLS = {}
     10 
     11 # TODO(rochberg):  Need some way to subset this list for long/short tests
     12 
     13 LTE_TECHNOLOGIES = ['LTE']
     14 GENERIC_GSM_TECHNOLOGIES = ['GPRS', 'EGPRS', 'WCDMA', 'HSDPA', 'HSUPA',
     15                             'HSDUPA', 'HSPA_PLUS']
     16 
     17 ICERA_TECHNOLOGIES = GENERIC_GSM_TECHNOLOGIES[:]
     18 ICERA_TECHNOLOGIES.remove('HSPA_PLUS')
     19 
     20 GOBI_3000_TECHNOLOGIES = GENERIC_GSM_TECHNOLOGIES + ['CDMA_2000', 'EVDO_1X']
     21 
     22 GOBI_2000_TECHNOLOGIES = GOBI_3000_TECHNOLOGIES[:]
     23 GOBI_2000_TECHNOLOGIES.remove('HSPA_PLUS')
     24 
     25 # TODO(thieule): Make HSPA_PLUS work with autotest (crosbug.com/32621).
     26 GENERIC_GSM_TECHNOLOGIES.remove('HSPA_PLUS')
     27 GOBI_3000_TECHNOLOGIES.remove('HSPA_PLUS')
     28 
     29 def combine_trees(a_original, b):
     30     """Combines two dict-of-dict trees, favoring the second."""
     31     try:
     32         a = copy.copy(a_original)
     33         for (key_b, value_b) in b.iteritems():
     34             a[key_b] = combine_trees(a.get(key_b, None), value_b)
     35     except AttributeError:  # one argument wasn't a dict.  B wins.
     36         return b
     37     return a
     38 
     39 
     40 def MakeDefaultCallBoxConfig(specifics):
     41     base = {
     42             "type": "8960-prologix",
     43             # IP addresses and netmask for the air-side of the
     44             # basestation network.
     45             "bs_addresses": [
     46                 "192.168.2.2",
     47                 "192.168.2.3"
     48                 ],
     49             "bs_netmask": "255.255.0.0",
     50 
     51             "gpib_adapter": {
     52                 "gpib_address": 14,
     53                 "ip_port": 1234
     54                 },
     55             # DNS addresses for the UE.  You do not need a
     56             # working DNS server at this address, but you must
     57             # have a machine there to send ICMP Port
     58             # Unreachable messages, so the DNS lookups will
     59             # fail quickly)
     60             "ue_dns_addresses": [
     61                 "192.168.2.254",
     62                 "192.168.2.254"
     63                 ],
     64             "ue_rf_addresses": [
     65                 "192.168.2.4",
     66                 "192.168.2.5"
     67                 ]
     68             }
     69     return combine_trees(base, specifics)
     70 
     71 def MakeDefaultPerfServer(specifics):
     72     rf_address = "192.168.2.254"
     73     base = {
     74         "rf_address": rf_address,
     75         "upload_url": "http://%s/upload" % (rf_address),
     76         "download_url_format_string": ("http://%s/download?size=%%(size)s" %
     77                                        rf_address),
     78         }
     79     return combine_trees(base, specifics)
     80 
     81 
     82 CELLS['cam'] = {
     83     "basestations": [
     84         MakeDefaultCallBoxConfig({
     85             "gpib_adapter": {
     86                 "address": "172.31.206.171",
     87                 },
     88             })
     89         ],
     90     "duts": [
     91         {
     92             "address": "172.31.206.145",
     93             "name": "ad-hoc-usb",
     94             "technologies": GOBI_2000_TECHNOLOGIES,
     95             "rf_switch_port": 3,
     96             },
     97         {
     98             "address": "172.31.206.146",
     99             "name": "y3300",
    100             "technologies": GENERIC_GSM_TECHNOLOGIES,
    101             "rf_switch_port": 0,
    102             }
    103         ],
    104 
    105     "perfserver": MakeDefaultPerfServer({
    106         "name": "perfserver-cam",
    107         "address": "172.31.206.153",
    108         "ethernet_mac": "e8:11:32:cb:bb:95 ",
    109         }),
    110 
    111     "http_connectivity": {
    112         # "url" should point to a URL that fetches a page small enough
    113         # to be comfortably kept in memory.  If
    114         # "url_required_contents" is present, it points to a string
    115         # that must be present in the the fetched data.
    116 
    117         "url": "http://192.168.2.254/connectivity/index.html",
    118         "url_required_contents": "Chromium",
    119         },
    120     "rf_switch": {
    121         "type": "ether_io",
    122         "address":  "172.31.206.172",
    123         "ethernet_mac": "00:11:ba:02:12:83",
    124         }
    125     }
    126 
    127 CELLS['mtv'] = {
    128     "basestations": [
    129         MakeDefaultCallBoxConfig({
    130             "gpib_adapter": {
    131               "type":'8960',
    132               "address": "172.22.50.118",
    133               "ethernet_mac": "00:21:69:01:06:46",
    134               }
    135             }),
    136         MakeDefaultCallBoxConfig({
    137           "type":'pxt',
    138           "gpib_adapter": {
    139               "address": "172.22.50.244",
    140               "ethernet_mac": "00:21:69:01:0a:11",
    141               # ddns-hostname "chromeos1-rack1-pxt-gpib";
    142             }
    143         })
    144         ],
    145 
    146 
    147 #chromeos1-rack1-pxt / 172.22.50.243
    148 #chromeos1-rack2-rfswitch2 / 172.22.50.229
    149 #pixel 172.22.50.86 chromeos1-rack2-host6
    150 
    151     "duts": [
    152          {
    153              "address": "172.22.50.86",
    154              "ethernet_mac": "00:0e:c6:89:9d:18",
    155              "name": "link-lte",
    156              "technologies": LTE_TECHNOLOGIES,
    157              "location": "rack2-host6",
    158              "rf_switch_port": 1,
    159              },
    160         {
    161             "address": "172.22.50.187",
    162             "ethernet_mac": "00:00:00:00:08:4b",
    163             "name": "alex-gobi-2000",
    164             "technologies": GOBI_2000_TECHNOLOGIES,
    165             "location": "rack2-host0",
    166             "rf_switch_port": 0,
    167             },
    168         {
    169             "address": "172.22.50.85",
    170             "ethernet_mac": "00:00:00:00:00:c8",
    171             "name": "alex-gobi-3000",
    172             "technologies": GOBI_3000_TECHNOLOGIES,
    173             "location": "rack2-host4",
    174             "rf_switch_port": 1,
    175             },
    176         {
    177             "address": "172.22.50.191",
    178             "ethernet_mac": "c0:c1:c0:4b:d7:4f",
    179             "name": "alex-y3300",
    180             "technologies": ICERA_TECHNOLOGIES,
    181             "location": "rack2-host1",
    182             "rf_switch_port": 3,
    183             },
    184         {
    185             "address": "172.22.50.89",
    186             "ethernet_mac": "58:6d:8f:50:ae:55",
    187             "name": "alex-y3400",
    188             "technologies": ICERA_TECHNOLOGIES,
    189             "location": "rack2-host5",
    190             "rf_switch_port": 2,
    191             },
    192         ],
    193 
    194     "perfserver": MakeDefaultPerfServer({
    195         "name": "perfserver-mtv",
    196         "address": "172.22.50.246",
    197         "ethernet_mac": "c4:54:44:2a:1a:8b",
    198         }),
    199 
    200     # Used for tests that check web connectivity
    201     "http_connectivity": {
    202         "url": "http://192.168.2.254/connectivity/index.html",
    203         "url_required_contents": "Chromium",
    204         },
    205     "rf_switch": {
    206         "type": "ether_io",
    207         "name": "rf-switch-1-mtv",
    208         "ethernet_mac": "00:11:BA:02:12:82",
    209         "address":  "172.22.50.88",
    210         }
    211     }
    212 
    213 
    214 class TestCombineTrees(unittest.TestCase):
    215     def test_simple(self):
    216         self.assertEqual({1:2, 3:4, 5:6},
    217                          combine_trees({1:2, 3:4}, {5:6}))
    218 
    219     def test_override_simple(self):
    220         self.assertEqual({1:3},
    221                          combine_trees({1:2},{1:3}))
    222 
    223     def test_join_nested(self):
    224         self.assertEqual({1:{2:3, 3:4}},
    225                          combine_trees({1:{2:3}},{1:{3:4}}))
    226 
    227     def test_override_in_nested(self):
    228         self.assertEqual({1:{2:4}},
    229                          combine_trees({1:{2:3}},{1:{2:4}}))
    230 
    231     def test_override_different_types(self):
    232         self.assertEqual({1:{2:4}},
    233                          combine_trees({1:'rhinoceros'},{1:{2:4}}))
    234         self.assertEqual({1:'rhinoceros'},
    235                          combine_trees({1:{2:4}},{1:'rhinoceros'}))
    236 
    237     def test_two_level(self):
    238         self.assertEqual({1:{2:{3:4, 5:6}}},
    239                          combine_trees({1:{2:{3:4}}},{1:{2:{5:6}}}))
    240 
    241     def test_none(self):
    242         self.assertEqual({1:None},
    243                          combine_trees({1:2}, {1:None}))
    244         self.assertEqual({1:None},
    245                          combine_trees({1:None}, {}))
    246         self.assertEqual({1:2},
    247                          combine_trees({1:None}, {1:2}))
    248 
    249 
    250 if __name__ == '__main__':
    251     unittest.main()
    252