Home | History | Annotate | Download | only in functional
      1 #!/usr/bin/env python
      2 # Copyright (c) 2011 The Chromium 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 from email.MIMEText import MIMEText
      7 import logging
      8 import os
      9 import re
     10 import smtplib
     11 import sys
     12 import urllib
     13 
     14 import pyauto_functional
     15 import pyauto
     16 
     17 sys.path.append(os.path.join(pyauto.PyUITest.DataDir(), 'pyauto_private',
     18                 'chromeos', 'network'))
     19 from gsm_sim_info import SIM, PROVIDER_TXT_SERVER
     20 
     21 
     22 class ChromeosTxtMsgSanity(pyauto.PyUITest):
     23     """Tests for ChromeOS text message handling"""
     24 
     25     def _SendText(self, mail_server, sender, phone_number,
     26                    mobile_provider, msg):
     27         """Sends a text message to a specific phone
     28 
     29         Args:
     30             mail_server: An SMTP instance.
     31             sender: Sender's email address.
     32             phone_number: The phone number the txt message is directed to.
     33             mobile_provider: A cellular provider defined in
     34                              gsm_sim_info.PROVIDER_TXT_SERVER
     35             msg: The message to be sent.
     36 
     37         """
     38         recipient = ('%s@%s' % (phone_number,
     39                      PROVIDER_TXT_SERVER[mobile_provider]))
     40         self._SendMail(mail_server, sender, recipient, None, msg)
     41 
     42     def _SendMail(self, mail_server, sender, recipients,
     43                    msg_subject, msg_body):
     44         """Sends an email using the provided smtp connection
     45 
     46         Args:
     47             mail_server: An SMTP instace.
     48             sender: Senders email address.
     49             recipients: Recipients email address.
     50             msg_subject: The subject line of the email.
     51             msg_body: The body of the email.
     52         """
     53         msg = MIMEText(msg_body)
     54         msg['To'] = recipients
     55         msg['From'] = sender
     56         if msg_subject:
     57             msg['Subject'] = msg_subject
     58         mail_server.sendmail(sender, recipients, msg.as_string())
     59 
     60     def _GetGmailServerInstance(self, email, password):
     61         """Creates an SMTP connection with the gmail mail server
     62 
     63         Args:
     64             email: A gmail address.
     65             password: The password for the gmail address.
     66 
     67         Returns:
     68             An SMTP connection instance.
     69         """
     70         mail_server = smtplib.SMTP('smtp.gmail.com', 587)
     71         mail_server.starttls()
     72         mail_server.ehlo()
     73         mail_server.login(email, password)
     74         return mail_server
     75 
     76     def _GetIMSI(self):
     77         """Obtains the IMSI by running modem status
     78 
     79         Returns:
     80             IMSI of device
     81         """
     82         modem_status = os.popen('modem status').read()
     83         imsi = re.search('IMSI:\s(\d+)', modem_status)
     84         if not imsi:
     85             raise Exception('GSM Modem not detected in device')
     86         return imsi.groups()[0]
     87 
     88     def _GetSIMInfo(self):
     89         """Returns information necessary to send messages
     90 
     91         Returns:
     92             A dictionary with the following format
     93             {
     94                 'mdn' : <phone number>,
     95                 'carrier': <carrier name>
     96             }
     97         """
     98         imsi = self._GetIMSI()
     99         sim_info = SIM.get(imsi, {})
    100         if not sim_info:
    101             raise Exception('Phone number for sim with IMSI=%s is not '
    102                             'recognized within config file' % imsi)
    103         return sim_info
    104 
    105     def setUp(self):
    106         # Connect to cellular service if not already connected.
    107         pyauto.PyUITest.setUp(self)
    108         connected_cellular = self.NetworkScan().get('connected_cellular')
    109         if not connected_cellular:
    110             self.ConnectToCellularNetwork()
    111             if not self.NetworkScan().get('connected_cellular'):
    112                 raise Exception('Could not connect to cellular service.')
    113         else:
    114             logging.debug('Already connected to cellular service %s' %
    115                           connected_cellular)
    116 
    117         # Obtain sender, recipient, and SMTP instance.
    118         self.credentials = self.GetPrivateInfo()['test_account_with_smtp']
    119         self.sim = self._GetSIMInfo()
    120         self.mail_server = self._GetGmailServerInstance(
    121                              self.credentials['username'],
    122                              self.credentials['password'])
    123 
    124     def tearDown(self):
    125         self.DisconnectFromCellularNetwork()
    126         self.mail_server.close()
    127         for window in range(len(self.GetActiveNotifications())):
    128             self.CloseNotification(window)
    129         pyauto.PyUITest.tearDown(self)
    130 
    131     def testTxtMsgNotification(self):
    132         """Notifications are displayed for text messages"""
    133         msg = 'This is the text message'
    134         self._SendText(self.mail_server, self.credentials['username'],
    135                         self.sim['mdn'], self.sim['carrier'], msg)
    136         self.WaitForNotificationCount(1)
    137         notification_result = self.GetActiveNotifications()[0]['content_url']
    138         self.assertTrue(re.search(urllib.pathname2url(msg),
    139                         notification_result), 'Invalid message was displayed.  '
    140                         'Expected "%s" but did not find it"' % msg)
    141 
    142     def testLongTxtMsgNotification(self):
    143         """Notifications are displayed for long (>160 char) text messages."""
    144         long_msg = 'This is a really long message with spaces. Testing to '\
    145                    'make sure that chromeos is able to catch it and '\
    146                    'create a notifications for this message.'
    147         self._SendText(self.mail_server, self.credentials['username'],
    148                         self.sim['mdn'], self.sim['carrier'], long_msg)
    149         self.WaitForNotificationCount(1)
    150 
    151         # GetActiveNotifications throws an exception if the text message never
    152         # arrives.
    153         txt_msg = self.GetActiveNotifications()[0]
    154         txt_msg = txt_windows[0]['content_url']
    155         self.assertTrue(re.search(urllib.pathname2url(long_msg),
    156                         txt_msg), 'Invalid message was displayed. '
    157                         'Expected "%s" but did not find it"' % long_msg)
    158 
    159 
    160 if __name__ == '__main__':
    161     pyauto_functional.Main()
    162