Home | History | Annotate | Download | only in cellular_MbimComplianceControlRequest
      1 # Copyright 2015 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 
      6 import common
      7 from autotest_lib.client.bin import utils
      8 from autotest_lib.client.cros.cellular.mbim_compliance import mbim_channel
      9 from autotest_lib.client.cros.cellular.mbim_compliance \
     10         import mbim_command_message
     11 from autotest_lib.client.cros.cellular.mbim_compliance import mbim_errors
     12 from autotest_lib.client.cros.cellular.mbim_compliance \
     13         import mbim_message_request
     14 from autotest_lib.client.cros.cellular.mbim_compliance \
     15         import mbim_message_response
     16 from autotest_lib.client.cros.cellular.mbim_compliance \
     17         import mbim_test_base
     18 from autotest_lib.client.cros.cellular.mbim_compliance.sequences \
     19         import get_descriptors_sequence
     20 from autotest_lib.client.cros.cellular.mbim_compliance.sequences \
     21         import mbim_open_generic_sequence
     22 
     23 
     24 class cellular_MbimComplianceCM05(mbim_test_base.MbimTestBase):
     25     """
     26     CM_05 Validation for modem's responses to two consecutive MBIM command
     27     messages are correct with regards to |transaction_id|, |service_id| and
     28     |cid|.
     29 
     30     This test verifies that the function uses separate transactions to deliver
     31     control message responses.
     32 
     33     Reference:
     34         [1] Universal Serial Bus Communication Class MBIM Compliance Testing: 39
     35         http://www.usb.org/developers/docs/devclass_docs/MBIM-Compliance-1.0.pdf
     36     """
     37     version = 1
     38 
     39     def run_internal(self):
     40         """ Run CM_05 test. """
     41         # Precondition
     42         descriptors = get_descriptors_sequence.GetDescriptorsSequence(
     43                 self.device_context).run()
     44         self.device_context.update_descriptor_cache(descriptors)
     45         mbim_open_generic_sequence.MBIMOpenGenericSequence(
     46                 self.device_context).run()
     47 
     48         device_context = self.device_context
     49         descriptor_cache = device_context.descriptor_cache
     50         self.channel = mbim_channel.MBIMChannel(
     51                 device_context._device,
     52                 descriptor_cache.mbim_communication_interface.bInterfaceNumber,
     53                 descriptor_cache.interrupt_endpoint.bEndpointAddress,
     54                 device_context.max_control_transfer_size)
     55 
     56         # Step 1
     57         caps_command_message = mbim_command_message.MBIMDeviceCapsQuery()
     58         caps_packets = mbim_message_request.generate_request_packets(
     59                 caps_command_message,
     60                 device_context.max_control_transfer_size)
     61         self.caps_transaction_id = caps_command_message.transaction_id
     62         self.channel.unidirectional_transaction(*caps_packets)
     63 
     64         # Step 2
     65         services_command_message = (
     66                 mbim_command_message.MBIMDeviceServicesQuery())
     67         services_packets = mbim_message_request.generate_request_packets(
     68                 services_command_message,
     69                 device_context.max_control_transfer_size)
     70         self.services_transaction_id = services_command_message.transaction_id
     71         self.channel.unidirectional_transaction(*services_packets)
     72 
     73         # Step 3
     74         utils.poll_for_condition(
     75                 self._get_response_packets,
     76                 timeout=5,
     77                 exception=mbim_errors.MBIMComplianceChannelError(
     78                         'Failed to retrieve the response packets to specific '
     79                         'control messages.'))
     80         self.channel.close()
     81 
     82         caps_response_message = self.caps_response
     83         services_response_message = self.services_response
     84         is_caps_message_valid = isinstance(
     85                 caps_response_message,
     86                 mbim_command_message.MBIMDeviceCapsInfo)
     87         is_services_message_valid = isinstance(
     88                 services_response_message,
     89                 mbim_command_message.MBIMDeviceServicesInfo)
     90         if not ((is_caps_message_valid and is_services_message_valid) and
     91                 (caps_response_message.transaction_id ==
     92                  caps_command_message.transaction_id) and
     93                 (caps_response_message.device_service_id ==
     94                  caps_command_message.device_service_id) and
     95                 caps_response_message.cid == caps_command_message.cid and
     96                 (services_command_message.transaction_id ==
     97                  services_response_message.transaction_id) and
     98                 (services_command_message.device_service_id ==
     99                  services_response_message.device_service_id) and
    100                 services_command_message.cid == services_response_message.cid):
    101             mbim_errors.log_and_raise(mbim_errors.MBIMComplianceAssertionError,
    102                                       'mbim1.0:8.1.2#2')
    103 
    104 
    105     def _get_response_packets(self):
    106         """
    107         Condition method for |poll_for_condition| to check the retrieval of
    108         target packets.
    109 
    110         @returns True if both caps response packet and services response packet
    111                 are received, False otherwise.
    112 
    113         """
    114         packets = self.channel.get_outstanding_packets()
    115         self.caps_response = None
    116         self.services_response = None
    117         for packet in packets:
    118             message_response = mbim_message_response.parse_response_packets(
    119                     packet)
    120             if message_response.transaction_id == self.caps_transaction_id:
    121                 self.caps_response = message_response
    122             elif message_response.transaction_id == self.services_transaction_id:
    123                 self.services_response = message_response
    124             if self.caps_response and self.services_response:
    125                 return True
    126         return False
    127