| #!/usr/bin/python2 |
| # Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Configuration for cell emulator tests.""" |
| import copy, unittest |
| |
| CELLS = {} |
| |
| # TODO(rochberg): Need some way to subset this list for long/short tests |
| |
| LTE_TECHNOLOGIES = ['LTE'] |
| GENERIC_GSM_TECHNOLOGIES = ['GPRS', 'EGPRS', 'WCDMA', 'HSDPA', 'HSUPA', |
| 'HSDUPA', 'HSPA_PLUS'] |
| |
| ICERA_TECHNOLOGIES = GENERIC_GSM_TECHNOLOGIES[:] |
| ICERA_TECHNOLOGIES.remove('HSPA_PLUS') |
| |
| GOBI_3000_TECHNOLOGIES = GENERIC_GSM_TECHNOLOGIES + ['CDMA_2000', 'EVDO_1X'] |
| |
| GOBI_2000_TECHNOLOGIES = GOBI_3000_TECHNOLOGIES[:] |
| GOBI_2000_TECHNOLOGIES.remove('HSPA_PLUS') |
| |
| # TODO(thieule): Make HSPA_PLUS work with autotest (crosbug.com/32621). |
| GENERIC_GSM_TECHNOLOGIES.remove('HSPA_PLUS') |
| GOBI_3000_TECHNOLOGIES.remove('HSPA_PLUS') |
| |
| def combine_trees(a_original, b): |
| """Combines two dict-of-dict trees, favoring the second.""" |
| try: |
| a = copy.copy(a_original) |
| for (key_b, value_b) in b.iteritems(): |
| a[key_b] = combine_trees(a.get(key_b, None), value_b) |
| except AttributeError: # one argument wasn't a dict. B wins. |
| return b |
| return a |
| |
| |
| def MakeDefaultCallBoxConfig(specifics): |
| base = { |
| "type": "8960-prologix", |
| # IP addresses and netmask for the air-side of the |
| # basestation network. |
| "bs_addresses": [ |
| "192.168.2.2", |
| "192.168.2.3" |
| ], |
| "bs_netmask": "255.255.0.0", |
| |
| "gpib_adapter": { |
| "gpib_address": 14, |
| "ip_port": 1234 |
| }, |
| # DNS addresses for the UE. You do not need a |
| # working DNS server at this address, but you must |
| # have a machine there to send ICMP Port |
| # Unreachable messages, so the DNS lookups will |
| # fail quickly) |
| "ue_dns_addresses": [ |
| "192.168.2.254", |
| "192.168.2.254" |
| ], |
| "ue_rf_addresses": [ |
| "192.168.2.4", |
| "192.168.2.5" |
| ] |
| } |
| return combine_trees(base, specifics) |
| |
| def MakeDefaultPerfServer(specifics): |
| rf_address = "192.168.2.254" |
| base = { |
| "rf_address": rf_address, |
| "upload_url": "http://%s/upload" % (rf_address), |
| "download_url_format_string": ("http://%s/download?size=%%(size)s" % |
| rf_address), |
| } |
| return combine_trees(base, specifics) |
| |
| |
| CELLS['cam'] = { |
| "basestations": [ |
| MakeDefaultCallBoxConfig({ |
| "gpib_adapter": { |
| "address": "172.31.206.171", |
| }, |
| }) |
| ], |
| "duts": [ |
| { |
| "address": "172.31.206.145", |
| "name": "ad-hoc-usb", |
| "technologies": GOBI_2000_TECHNOLOGIES, |
| "rf_switch_port": 3, |
| }, |
| { |
| "address": "172.31.206.146", |
| "name": "y3300", |
| "technologies": GENERIC_GSM_TECHNOLOGIES, |
| "rf_switch_port": 0, |
| } |
| ], |
| |
| "perfserver": MakeDefaultPerfServer({ |
| "name": "perfserver-cam", |
| "address": "172.31.206.153", |
| "ethernet_mac": "e8:11:32:cb:bb:95 ", |
| }), |
| |
| "http_connectivity": { |
| # "url" should point to a URL that fetches a page small enough |
| # to be comfortably kept in memory. If |
| # "url_required_contents" is present, it points to a string |
| # that must be present in the the fetched data. |
| |
| "url": "http://192.168.2.254/connectivity/index.html", |
| "url_required_contents": "Chromium", |
| }, |
| "rf_switch": { |
| "type": "ether_io", |
| "address": "172.31.206.172", |
| "ethernet_mac": "00:11:ba:02:12:83", |
| } |
| } |
| |
| CELLS['mtv'] = { |
| "basestations": [ |
| MakeDefaultCallBoxConfig({ |
| "gpib_adapter": { |
| "type":'8960', |
| "address": "172.22.50.118", |
| "ethernet_mac": "00:21:69:01:06:46", |
| } |
| }), |
| MakeDefaultCallBoxConfig({ |
| "type":'pxt', |
| "gpib_adapter": { |
| "address": "172.22.50.244", |
| "ethernet_mac": "00:21:69:01:0a:11", |
| # ddns-hostname "chromeos1-rack1-pxt-gpib"; |
| } |
| }) |
| ], |
| |
| |
| #chromeos1-rack1-pxt / 172.22.50.243 |
| #chromeos1-rack2-rfswitch2 / 172.22.50.229 |
| #pixel 172.22.50.86 chromeos1-rack2-host6 |
| |
| "duts": [ |
| { |
| "address": "172.22.50.86", |
| "ethernet_mac": "00:0e:c6:89:9d:18", |
| "name": "link-lte", |
| "technologies": LTE_TECHNOLOGIES, |
| "location": "rack2-host6", |
| "rf_switch_port": 1, |
| }, |
| { |
| "address": "172.22.50.187", |
| "ethernet_mac": "00:00:00:00:08:4b", |
| "name": "alex-gobi-2000", |
| "technologies": GOBI_2000_TECHNOLOGIES, |
| "location": "rack2-host0", |
| "rf_switch_port": 0, |
| }, |
| { |
| "address": "172.22.50.85", |
| "ethernet_mac": "00:00:00:00:00:c8", |
| "name": "alex-gobi-3000", |
| "technologies": GOBI_3000_TECHNOLOGIES, |
| "location": "rack2-host4", |
| "rf_switch_port": 1, |
| }, |
| { |
| "address": "172.22.50.191", |
| "ethernet_mac": "c0:c1:c0:4b:d7:4f", |
| "name": "alex-y3300", |
| "technologies": ICERA_TECHNOLOGIES, |
| "location": "rack2-host1", |
| "rf_switch_port": 3, |
| }, |
| { |
| "address": "172.22.50.89", |
| "ethernet_mac": "58:6d:8f:50:ae:55", |
| "name": "alex-y3400", |
| "technologies": ICERA_TECHNOLOGIES, |
| "location": "rack2-host5", |
| "rf_switch_port": 2, |
| }, |
| ], |
| |
| "perfserver": MakeDefaultPerfServer({ |
| "name": "perfserver-mtv", |
| "address": "172.22.50.246", |
| "ethernet_mac": "c4:54:44:2a:1a:8b", |
| }), |
| |
| # Used for tests that check web connectivity |
| "http_connectivity": { |
| "url": "http://192.168.2.254/connectivity/index.html", |
| "url_required_contents": "Chromium", |
| }, |
| "rf_switch": { |
| "type": "ether_io", |
| "name": "rf-switch-1-mtv", |
| "ethernet_mac": "00:11:BA:02:12:82", |
| "address": "172.22.50.88", |
| } |
| } |
| |
| |
| class TestCombineTrees(unittest.TestCase): |
| def test_simple(self): |
| self.assertEqual({1:2, 3:4, 5:6}, |
| combine_trees({1:2, 3:4}, {5:6})) |
| |
| def test_override_simple(self): |
| self.assertEqual({1:3}, |
| combine_trees({1:2},{1:3})) |
| |
| def test_join_nested(self): |
| self.assertEqual({1:{2:3, 3:4}}, |
| combine_trees({1:{2:3}},{1:{3:4}})) |
| |
| def test_override_in_nested(self): |
| self.assertEqual({1:{2:4}}, |
| combine_trees({1:{2:3}},{1:{2:4}})) |
| |
| def test_override_different_types(self): |
| self.assertEqual({1:{2:4}}, |
| combine_trees({1:'rhinoceros'},{1:{2:4}})) |
| self.assertEqual({1:'rhinoceros'}, |
| combine_trees({1:{2:4}},{1:'rhinoceros'})) |
| |
| def test_two_level(self): |
| self.assertEqual({1:{2:{3:4, 5:6}}}, |
| combine_trees({1:{2:{3:4}}},{1:{2:{5:6}}})) |
| |
| def test_none(self): |
| self.assertEqual({1:None}, |
| combine_trees({1:2}, {1:None})) |
| self.assertEqual({1:None}, |
| combine_trees({1:None}, {})) |
| self.assertEqual({1:2}, |
| combine_trees({1:None}, {1:2})) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |