#!/usr/bin/python
# 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()