blob: 1cc4e865ec93d158b98f8533b9b0909efb1aa84e [file] [log] [blame]
#!/usr/bin/python
# Copyright (c) 2011 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.
#
# Implement a pseudo gsm modem.
#
# This modem mimics a GSM modem and allows a user test shill, flimflam
# and UI behaviors when a supported SIM is inserted into the device.
#
# Flimflam Testing
# ================
# To test when running flimflam you can either use an extra ethernet
# port as the pseudo modem network interface, you you create a virtual
# interface.
#
# To use eth0 as your pseudo modem rename it pseudo-modem0:
# # backchannel setup eth0 pseudo-modem0
#
# and then run the fake modem program:
# # fake-gsm-modem tmobile
#
# When done, clean up with:
# # backchannel teardown eth0 pseudo-modem0
#
# Alternatively, you can create a virtual interface which will not
# route packets anywhere, but will allow dhcp to succeed:
# # ip link add name pseudo-modem0 type veth peer name pseudomodem0p
#
# When done, clean up with:
# # ip link del pseudo-modem0
#
# Shill Testing
# ================
# To test when running shill, create a virtual interface called
# pseudomodem0:
#
# # veth pseudomodem0 172.16.1
#
# then run the fake modem program:
# # fake-gsm-modem -c tmobile --shill --smscount 3 --sms_signal 5
#
# which will start the fake GSM modem and cause shill to receive 3 new SMS
# notifications. Don't pass --smscount and --sms_signal, if you don't want to
# simulate SMS.
#
# when done, clean up with:
# # veth teardown pseudomodem0
#
import glib
import gobject
from optparse import OptionParser
import os
import string
import sys
import dbus
import dbus.mainloop.glib
import_path = os.environ.get('SYSROOT', '/usr/local') + '/usr/lib/flimflam/test'
sys.path.append(import_path)
import flimflam_test
GSM_Modem = flimflam_test.GSM_Modem
ModemManager = flimflam_test.ModemManager
SIM = flimflam_test.SIM
DEFAULT_CARRIER = 'att'
# A list of the supported carriers.
SIM_LIST = {
# Format for adding sims to the dictionary:
# <Carrier_Name> : SIM( mcc_country = <country>,
# mnc = <MNC>,
# operator_name = <operator name>,
# msin = <MSIN>,
# mcc = <MCC>
#
# MCC value is favored over the mcc_country if both are
# provided.
'att' : SIM('us', '090', 'AT&T'),
'tmobile' : SIM('us', '026', 'T-Mobile'),
'simyo' : SIM('de', '03', 'simyo'),
'movistar' : SIM('es', '07', 'Movistar'),
'sfr' : SIM('fr', '10', 'SFR'),
'three' : SIM('gb', '20', '3'),
'threeita' : SIM('it', '99', '3ITA'),
'kpn' : SIM('nl', '08', 'KPN'),
}
def make_sms(index, text):
return {
'index': index,
'text' : text or 'Test SMS at %s' % index,
'number' : '+16175046925',
'timestamp' : '110919163047-04',
'smsc' : '+12063130028'
}
def main():
usage = '''
Run fake-gsm-modem to simulate a gsm modem with different sims.
This can be used to simpilify the verification process of UI features
that use overseas sims.
To Use:
1) Device should be read/write and running a test image.
2) sudo mv /etc/init/cromo.conf
3) Reboot Device
4) Connect device using ethernet port and obtain <eth interface name>
5) cd /usr/local/lib/flimflam/test
6) ./backchannel setup <eth iface name> pseudo-modem0
7) ./fake-gsm-modem [--carrier=<carrier name>] &
'''
parser = OptionParser(usage=usage)
parser.add_option('-c', '--carrier', dest='carrier_name',
metavar='<carrier name>',
help='<carrier name> := att | tmobile | simyo | '
'movistar | sfr | three | threeita | kpn')
parser.add_option('-s', '--smscount', dest='sms_count',
default=0,
metavar='<smscount>',
help='<smscount> := integer')
parser.add_option('-S', '--sms_signal', dest='sms_signal',
default=0,
metavar='<delay>',
help='<delay> := integer number of seconds')
parser.add_option('-t', '--text', dest='sms_text',
default=None,
metavar='<text>',
help='<text> := text for sms messages')
parser.add_option('-f', '--file', dest='filename',
default=None,
metavar='<filename>',
help='<filename> := file with text for sms messages')
parser.add_option('-i', '--shill', dest='shill',
default=False,
action="store_true",
help='use shill device names instead of flimflam names.')
(options, _) = parser.parse_args()
if not options.carrier_name:
options.carrier_name = DEFAULT_CARRIER
sim_card = SIM_LIST[string.lower(options.carrier_name)]
smses = {}
if options.filename:
f = open(options.filename, 'r')
for index, line in enumerate(f.readlines()):
line = line.strip()
if line:
smses[index] = make_sms(index, line)
else:
for index in xrange(int(options.sms_count)):
smses[index] = make_sms(index, options.sms_text)
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
bus = dbus.SystemBus()
_ = dbus.service.BusName(flimflam_test.CMM, bus)
manager = ModemManager(bus, flimflam_test.OCMM)
device = 'pseudo-modem0'
if options.shill:
device = 'pseudomodem0'
if options.sms_signal == 0:
initial_smses = smses
else:
initial_smses = {}
testmodem0 = GSM_Modem(manager, '/TestModem/0', gsm_sim=sim_card,
smses=initial_smses, device=device)
if options.sms_signal:
def AddSmses():
for sms in smses.values():
testmodem0.AddSMS(sms)
glib.timeout_add(1000*int(options.sms_signal), AddSmses)
mainloop = gobject.MainLoop()
print "Running test modemmanager."
mainloop.run()
if __name__ == '__main__':
main()