Home | History | Annotate | Download | only in car_bt
      1 #/usr/bin/env python3.4
      2 #
      3 # Copyright (C) 2016 The Android Open Source Project
      4 #
      5 # Licensed under the Apache License, Version 2.0 (the "License"); you may not
      6 # use this file except in compliance with the License. You may obtain a copy of
      7 # the License at
      8 #
      9 # http://www.apache.org/licenses/LICENSE-2.0
     10 #
     11 # Unless required by applicable law or agreed to in writing, software
     12 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
     13 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
     14 # License for the specific language governing permissions and limitations under
     15 # the License.
     16 """
     17 Automated tests for the testing send and receive SMS commands in MAP profile.
     18 """
     19 
     20 import time
     21 import queue
     22 
     23 import acts
     24 from acts.test_decorators import test_tracker_info
     25 from acts.test_utils.bt.BluetoothBaseTest import BluetoothBaseTest
     26 from acts.test_utils.bt.BluetoothCarHfpBaseTest import BluetoothCarHfpBaseTest
     27 from acts.test_utils.bt import bt_test_utils
     28 from acts.test_utils.bt import BtEnum
     29 from acts.test_utils.tel.tel_defines import EventSmsReceived
     30 from acts.test_utils.tel.tel_defines import EventSmsSentSuccess
     31 from acts.test_utils.tel.tel_defines import EventSmsDeliverSuccess
     32 from acts.test_utils.tel.tel_test_utils import get_phone_number
     33 from acts.test_utils.tel.tel_test_utils import toggle_airplane_mode_by_adb
     34 
     35 EVENT_MAP_MESSAGE_RECEIVED = "MapMessageReceived"
     36 TIMEOUT = 2000
     37 MESSAGE_TO_SEND = "Don't text and Drive!"
     38 
     39 SEND_FAILED_NO_MCE = 1
     40 SEND_FAILED_NO_NETWORK = 2
     41 
     42 
     43 class BtCarMapMceTest(BluetoothCarHfpBaseTest):
     44     def setup_class(self):
     45         if not super(BtCarMapMceTest, self).setup_class():
     46             return False
     47         # MAP roles
     48         # Carkit device
     49         self.MCE = self.hf
     50         # Phone device
     51         self.MSE = self.ag
     52         # Remote device
     53         self.REMOTE = self.re
     54         time.sleep(4)
     55         return True
     56 
     57     def message_delivered(self, device):
     58         try:
     59             self.MCE.ed.pop_event(EventSmsDeliverSuccess, 15)
     60         except queue.Empty:
     61             self.log.error("Message failed to be delivered.")
     62             return False
     63         return True
     64 
     65     def send_message(self, remotes):
     66         self.REMOTE.droid.smsStartTrackingIncomingSmsMessage()
     67         destinations = []
     68         for phone in remotes:
     69             destinations.append("tel:{}".format(
     70                 get_phone_number(self.log, phone)))
     71         self.log.info(destinations)
     72         self.MCE.droid.mapSendMessage(
     73             self.MSE.droid.bluetoothGetLocalAddress(), destinations,
     74             MESSAGE_TO_SEND)
     75         try:
     76             self.MCE.ed.pop_event(EventSmsSentSuccess, 15)
     77         except queue.Empty:
     78             self.MCE.log.error("Message failed to send.")
     79             return False
     80 
     81         try:
     82             receivedMessage = self.REMOTE.ed.pop_event(EventSmsReceived, 15)
     83             self.REMOTE.log.info("Received a message: {}".format(
     84                 receivedMessage['data']['Text']))
     85         except queue.Empty:
     86             self.REMOTE.log.error("Remote did not receive message.")
     87             return False
     88 
     89         if MESSAGE_TO_SEND != receivedMessage['data']['Text']:
     90             self.log.error("Messages don't match.")
     91             self.log.error("Sent     {}".format(MESSAGE_TO_SEND))
     92             self.log.error("Received {}".format(receivedMessage['data'][
     93                 'Text']))
     94             return False
     95         return True
     96 
     97     @test_tracker_info(uuid='0858347a-e649-4f18-85b6-6990cc311dee')
     98     @BluetoothBaseTest.bt_test_wrap
     99     def test_send_message(self):
    100         bt_test_utils.connect_pri_to_sec(
    101             self.MCE, self.MSE, set([BtEnum.BluetoothProfile.MAP_MCE.value]))
    102         return self.send_message([self.REMOTE])
    103 
    104     @test_tracker_info(uuid='b25caa53-3c7f-4cfa-a0ec-df9a8f925fe5')
    105     @BluetoothBaseTest.bt_test_wrap
    106     def test_receive_message(self):
    107         bt_test_utils.connect_pri_to_sec(
    108             self.MCE, self.MSE, set([BtEnum.BluetoothProfile.MAP_MCE.value]))
    109         self.MSE.log.info("Start Tracking SMS.")
    110         self.MSE.droid.smsStartTrackingIncomingSmsMessage()
    111         self.REMOTE.log.info("Ready to send")
    112         self.REMOTE.droid.smsSendTextMessage(
    113             get_phone_number(self.log, self.MSE), "test_receive_message",
    114             False)
    115         self.MCE.log.info("Check inbound Messages.")
    116         receivedMessage = self.MCE.ed.pop_event(EVENT_MAP_MESSAGE_RECEIVED, 15)
    117         self.MCE.log.info(receivedMessage['data'])
    118         return True
    119 
    120     @test_tracker_info(uuid='5b7b3ded-0a1a-470f-b119-9a03bc092805')
    121     @BluetoothBaseTest.bt_test_wrap
    122     def test_send_message_failure_no_cellular(self):
    123         if not toggle_airplane_mode_by_adb(self.log, self.MSE, True):
    124             return False
    125         bt_test_utils.reset_bluetooth([self.MSE])
    126         bt_test_utils.connect_pri_to_sec(
    127             self.MCE, self.MSE, set([BtEnum.BluetoothProfile.MAP_MCE.value]))
    128         return not self.send_message([self.REMOTE])
    129 
    130     @test_tracker_info(uuid='19444142-1d07-47dc-860b-f435cba46fca')
    131     @BluetoothBaseTest.bt_test_wrap
    132     def test_send_message_failure_no_map_connection(self):
    133         return not self.send_message([self.REMOTE])
    134 
    135     @test_tracker_info(uuid='c7e569c0-9f6c-49a4-8132-14bc544ccb53')
    136     @BluetoothBaseTest.bt_test_wrap
    137     def test_send_message_failure_no_bluetooth(self):
    138         if not toggle_airplane_mode_by_adb(self.log, self.MSE, True):
    139             return False
    140         try:
    141             bt_test_utils.connect_pri_to_sec(
    142                 self.MCE, self.MSE,
    143                 set([BtEnum.BluetoothProfile.MAP_MCE.value]))
    144         except acts.controllers.android.SL4AAPIError:
    145             self.MCE.log.info("Failed to connect as expected")
    146         return not self.send_message([self.REMOTE])
    147 
    148     @test_tracker_info(uuid='8cdb4a54-3f18-482f-be3d-acda9c4cbeed')
    149     @BluetoothBaseTest.bt_test_wrap
    150     def test_disconnect_failure_send_message(self):
    151         connected = bt_test_utils.connect_pri_to_sec(
    152             self.MCE, self.MSE, set([BtEnum.BluetoothProfile.MAP_MCE.value]))
    153         addr = self.MSE.droid.bluetoothGetLocalAddress()
    154         if bt_test_utils.is_map_mce_device_connected(self.MCE, addr):
    155             connected = True
    156         disconnected = bt_test_utils.disconnect_pri_from_sec(
    157             self.MCE, self.MSE, [BtEnum.BluetoothProfile.MAP_MCE.value])
    158         # Grace time for the disconnection to complete.
    159         time.sleep(3)
    160         if not bt_test_utils.is_map_mce_device_connected(self.MCE, addr):
    161             disconnected = True
    162         self.MCE.log.info("Connected = {}, Disconnected = {}".format(
    163             connected, disconnected))
    164         return connected and disconnected and not self.send_message(
    165             [self.REMOTE])
    166 
    167     @test_tracker_info(uuid='2d79a896-b1c1-4fb7-9924-db8b5c698be5')
    168     @BluetoothBaseTest.bt_test_wrap
    169     def manual_test_send_message_to_contact(self):
    170         bt_test_utils.connect_pri_to_sec(
    171             self.MCE, self.MSE, set([BtEnum.BluetoothProfile.MAP_MCE.value]))
    172         contacts = self.MCE.droid.contactsGetContactIds()
    173         self.log.info(contacts)
    174         selected_contact = self.MCE.droid.contactsDisplayContactPickList()
    175         if selected_contact:
    176             return self.MCE.droid.mapSendMessage(
    177                 self.MSE.droid.bluetoothGetLocalAddress(),
    178                 selected_contact['data'], "Don't Text and Drive!")
    179         return False
    180 
    181     @test_tracker_info(uuid='8ce9a7dd-3b5e-4aee-a897-30740e2439c3')
    182     @BluetoothBaseTest.bt_test_wrap
    183     def test_send_message_to_multiple_phones(self):
    184         bt_test_utils.connect_pri_to_sec(
    185             self.MCE, self.MSE, set([BtEnum.BluetoothProfile.MAP_MCE.value]))
    186         return self.send_message([self.REMOTE, self.REMOTE])
    187