Exemple #1
0
    def run_internal(self):
        """ Run CM_03 test. """
        # Precondition
        _, _ = mbim_open_generic_sequence.MBIMOpenGenericSequence(
            self.test_context).run()
        # Step 1
        open_message, response_message = (
            mbim_open_generic_sequence.MBIMOpenGenericSequence(
                self.test_context).run())

        # Validate function's behaviour for an unsynchronized MBIM_OPEN_MSG.
        if response_message.message_type == mbim_constants.MBIM_CLOSE_DONE:
            mbim_errors.log_and_raise(mbim_errors.MBIMComplianceAssertionError,
                                      'mbim1.0:9.3.1#1')
    def run_precondition(self, ntb_format):
        """
        Runs all the precondition sequences for data transfer tests.

        @param ntb_format: Whether to send/receive an NTB16 or NTB32 frame.
                Possible values: NTB_FORMAT_16, NTB_FORMAT_32 (mbim_constants)
        @returns tuple of (desc_sequence, open_sequence, connect_sequence) where,
                desc_sequence - Handle to run the get descriptor sequence.
                open_sequence - Handle to run the open sequence.
                connect_sequence - Handle to run the connect sequence.

        """
        desc_sequence = get_descriptors_sequence.GetDescriptorsSequence(
            self.device_context)
        descriptors = desc_sequence.run()
        self.device_context.update_descriptor_cache(descriptors)
        open_sequence = mbim_open_generic_sequence.MBIMOpenGenericSequence(
            self.device_context)
        open_sequence.run(ntb_format=ntb_format)
        connect_seq = connect_sequence.ConnectSequence(self.device_context)
        connect_seq.run()

        # Devices may not support SetNtbFormat(), so fail the NTB32 tests on
        # such devices.
        if ((ntb_format == mbim_constants.NTB_FORMAT_32)
                and (self.device_context.current_ntb_format != ntb_format)):
            mbim_errors.log_and_raise(
                mbim_errors.MBIMComplianceFrameworkError,
                'Device does not support NTB 32 format.')

        return (desc_sequence, open_sequence, connect_seq)
Exemple #3
0
    def run_internal(self):
        """ Run CM_05 test. """
        # Precondition
        mbim_open_generic_sequence.MBIMOpenGenericSequence(
            self.test_context).run()

        caps_command_message = mbim_control.MBIMCommandMessage(
            device_service_id=mbim_constants.UUID_BASIC_CONNECT.bytes,
            cid=mbim_constants.MBIM_CID_DEVICE_CAPS,
            command_type=mbim_constants.COMMAND_TYPE_QUERY,
            information_buffer_length=0)
        caps_packets = caps_command_message.generate_packets()
        services_command_message = mbim_control.MBIMCommandMessage(
            device_service_id=mbim_constants.UUID_BASIC_CONNECT.bytes,
            cid=mbim_constants.MBIM_CID_DEVICE_SERVICES,
            command_type=mbim_constants.COMMAND_TYPE_QUERY,
            information_buffer_length=0)
        services_packets = services_command_message.generate_packets()
        self.caps_transaction_id = caps_command_message.transaction_id
        self.services_transaction_id = services_command_message.transaction_id
        self.channel = mbim_channel.MBIMChannel(
            {
                'idVendor': self.test_context.id_vendor,
                'idProduct': self.test_context.id_product
            }, self.test_context.mbim_communication_interface.bInterfaceNumber,
            self.test_context.interrupt_endpoint.bEndpointAddress,
            self.test_context.mbim_functional.wMaxControlMessage)
        # Step 1
        self.channel.unidirectional_transaction(*caps_packets)
        # Step 2
        self.channel.unidirectional_transaction(*services_packets)

        utils.poll_for_condition(
            self._get_response_packets,
            timeout=5,
            exception=mbim_errors.MBIMComplianceChannelError(
                'Failed to retrieve the response packets to specific '
                'control messages.'))

        self.channel.close()
        caps_response_message = mbim_control.parse_response_packets(
            self.caps_response_packet)
        services_response_message = mbim_control.parse_response_packets(
            self.services_response_packet)

        # Step 3
        if not ((caps_response_message.transaction_id
                 == caps_command_message.transaction_id) and
                (caps_response_message.device_service_id
                 == caps_command_message.device_service_id)
                and caps_response_message.cid == caps_command_message.cid and
                (services_command_message.transaction_id
                 == services_response_message.transaction_id) and
                (services_command_message.device_service_id
                 == services_response_message.device_service_id) and
                services_command_message.cid == services_response_message.cid):
            mbim_errors.log_and_raise(mbim_errors.MBIMComplianceAssertionError,
                                      'mbim1.0:8.1.2#2')
Exemple #4
0
    def run_internal(self):
        """ Run CM_13 test. """
        # Precondition
        mbim_open_generic_sequence.MBIMOpenGenericSequence(
                self.test_context).run()
        connect_sequence.ConnectSequence(self.test_context).run()
        mbim_close_sequence.MBIMCloseSequence(self.test_context).run()
        mbim_open_generic_sequence.MBIMOpenGenericSequence(
                self.test_context).run()

        # Step 1
        connect_info_structure = mbim_data.MBIMConnectInfoStructure(
                session_id=0,
                activation_state=0,
                voice_call_state=0,
                ip_type=0,
                context_type=mbim_constants.MBIM_CONTEXT_TYPE_NONE.bytes,
                nw_error=0)
        command_message = mbim_control.MBIMCommandMessage(
                message_length=84,
                total_fragments=1,
                current_fragment=0,
                device_service_id=mbim_constants.UUID_BASIC_CONNECT.bytes,
                cid=mbim_constants.MBIM_CID_CONNECT,
                command_type=mbim_constants.COMMAND_TYPE_QUERY,
                information_buffer_length=36,
                information_buffer=connect_info_structure.pack())
        packets = command_message.generate_packets()
        channel = mbim_channel.MBIMChannel(
                {'idVendor': self.test_context.id_vendor,
                 'idProduct': self.test_context.id_product},
                self.test_context.mbim_communication_interface.bInterfaceNumber,
                self.test_context.interrupt_endpoint.bEndpointAddress,
                self.test_context.mbim_functional.wMaxControlMessage)
        response_packets = channel.bidirectional_transaction(*packets)
        channel.close()

        # Step 2
        response_message = mbim_control.parse_response_packets(response_packets)

        # Step 3
        if (response_message.status_codes !=
            mbim_constants.MBIM_STATUS_CONTEXT_NOT_ACTIVATED):
            mbim_errors.log_and_raise(mbim_errors.MBIMComplianceAssertionError,
                                      'mbim1.0:9.3.2#3')
Exemple #5
0
    def run_internal(self):
        """ Run CM_03 test. """
        # Precondition
        descriptors = get_descriptors_sequence.GetDescriptorsSequence(
            self.device_context).run()
        self.device_context.update_descriptor_cache(descriptors)
        mbim_open_generic_sequence.MBIMOpenGenericSequence(
            self.device_context).run()

        # Step 1
        _, response_message = (
            mbim_open_generic_sequence.MBIMOpenGenericSequence(
                self.device_context).run())

        # Validate function's behaviour for an unsynchronized MBIM_OPEN_MSG.
        if response_message.message_type == mbim_constants.MBIM_CLOSE_DONE:
            mbim_errors.log_and_raise(mbim_errors.MBIMComplianceAssertionError,
                                      'mbim1.0:9.3.1#1')
Exemple #6
0
    def run_internal(self):
        """ Run CM_10 test. """
        # Precondition
        mbim_open_generic_sequence.MBIMOpenGenericSequence(
                self.test_context).run()

        # Step 1
        close_message, response_message = mbim_close_sequence.MBIMCloseSequence(
                self.test_context).run()
Exemple #7
0
    def run_internal(self):
        """ Run CM_02 test. """
        # Step 1
        open_message, response_message = (
            mbim_open_generic_sequence.MBIMOpenGenericSequence(
                self.test_context).run())

        # Validate message length of response to MBIM_OPEN_MESSAGE.
        if response_message.message_length < 0x0C:
            mbim_errors.log_and_raise(mbim_errors.MBIMComplianceAssertionError,
                                      'mbim1.0:9.1#2')
    def run_internal(self):
        """ Run the CM_01 test. """
        # Precondition.
        descriptors = get_descriptors_sequence.GetDescriptorsSequence(
            self.device_context).run()
        self.device_context.update_descriptor_cache(descriptors)

        # Step 1
        open_message, response_message = (
            mbim_open_generic_sequence.MBIMOpenGenericSequence(
                self.device_context).run())
Exemple #9
0
    def run_internal(self):
        """ Run CM_10 test. """
        # Precondition
        descriptors = get_descriptors_sequence.GetDescriptorsSequence(
            self.device_context).run()
        self.device_context.update_descriptor_cache(descriptors)
        mbim_open_generic_sequence.MBIMOpenGenericSequence(
            self.device_context).run()

        # Step 1
        close_message, response_message = mbim_close_sequence.MBIMCloseSequence(
            self.device_context).run()
    def run_internal(self):
        """ Run CM_06 test. """
        # Precondition
        mbim_open_generic_sequence.MBIMOpenGenericSequence(
            self.test_context).run()

        # Step 1
        command_message, response_message = (
            mbim_cid_device_caps_sequence.MBIMCIDDeviceCapsSequence(
                self.test_context).run())
        if response_message.status_codes != mbim_constants.MBIM_STATUS_SUCCESS:
            mbim_errors.log_and_raise(mbim_errors.MBIMComplianceAssertionError,
                                      'mbim1.0:9.4.5#1')
Exemple #11
0
    def run_internal(self):
        """ Run CM_04 test. """
        # Precondition
        mbim_open_generic_sequence.MBIMOpenGenericSequence(
                self.test_context).run()

        # Step 1
        command_message, response_message = (
                mbim_cid_device_caps_sequence.MBIMCIDDeviceCapsSequence(
                        self.test_context).run())
        # Validate |transaction_id| in the response to MBIM_COMMAND_MSG.
        if response_message.transaction_id != command_message.transaction_id:
            mbim_errors.log_and_raise(mbim_errors.MBIMComplianceAssertionError,
                                      'mbim1.0:9.4.3')
Exemple #12
0
    def run_internal(self):
        """ Run CM_09 test. """
        # Precondition
        mbim_open_generic_sequence.MBIMOpenGenericSequence(
            self.test_context).run()

        # Step 1
        _, _, notifications = (connect_sequence.ConnectSequence(
            self.test_context).run())

        # Step 2
        for notification in notifications:
            if notification.transaction_id != 0:
                mbim_errors.log_and_raise(
                    mbim_errors.MBIMComplianceAssertionError, 'mbim1.0:9.1#1')
    def run_internal(self):
        """ Run the CM_02 test. """
        # Precondition.
        descriptors = get_descriptors_sequence.GetDescriptorsSequence(
            self.device_context).run()
        self.device_context.update_descriptor_cache(descriptors)

        # Step 1
        _, response_message = (
            mbim_open_generic_sequence.MBIMOpenGenericSequence(
                self.device_context).run())

        # Validate message length of response to MBIM_OPEN_MESSAGE.
        if response_message.message_length < 0x0C:
            mbim_errors.log_and_raise(mbim_errors.MBIMComplianceAssertionError,
                                      'mbim1.0:9.1#2')
    def run_internal(self):
        """ Run CM_15 test. """
        # Precondition
        descriptors = get_descriptors_sequence.GetDescriptorsSequence(
                self.device_context).run()
        self.device_context.update_descriptor_cache(descriptors)
        open_sequence = mbim_open_generic_sequence.MBIMOpenGenericSequence(
                self.device_context)
        open_sequence.run(max_control_transfer_size=64)

        # Step 1
        caps_sequence = mbim_cid_device_caps_sequence.MBIMCIDDeviceCapsSequence(
                self.device_context)
        _, response_message = caps_sequence.run()
        if not isinstance(response_message,
                          mbim_command_message.MBIMDeviceCapsInfo):
            mbim_errors.log_and_raise(mbim_errors.MBIMComplianceAssertionError,
                                      'mbim1.0:9.2')
Exemple #15
0
    def run_internal(self):
        """ Run CM_09 test. """
        # Precondition
        descriptors = get_descriptors_sequence.GetDescriptorsSequence(
            self.device_context).run()
        self.device_context.update_descriptor_cache(descriptors)
        mbim_open_generic_sequence.MBIMOpenGenericSequence(
            self.device_context).run()

        # Step 1
        _, _, notifications = (connect_sequence.ConnectSequence(
            self.device_context).run())

        # Step 2
        for notification in notifications:
            if notification.transaction_id != 0:
                mbim_errors.log_and_raise(
                    mbim_errors.MBIMComplianceAssertionError, 'mbim1.0:9.1#1')
Exemple #16
0
    def run_internal(self):
        """ Run CM_14 test. """
        # Precondition
        descriptors = get_descriptors_sequence.GetDescriptorsSequence(
            self.device_context).run()
        self.device_context.update_descriptor_cache(descriptors)
        mbim_open_generic_sequence.MBIMOpenGenericSequence(
            self.device_context).run()
        mbim_close_sequence.MBIMCloseSequence(self.device_context).run()

        # Step 1
        _, response_message, _ = (connect_sequence.ConnectSequence(
            self.device_context).run(raise_exception_on_failure=False))

        # Step 2
        if ((response_message.message_type !=
             mbim_constants.MBIM_FUNCTION_ERROR_MSG)
                or (response_message.message_length != 16)):
            mbim_errors.log_and_raise(mbim_errors.MBIMComplianceAssertionError,
                                      'mbim1.0:9.3.4#2')
Exemple #17
0
    def run_internal(self):
        """ Run CM_08 test. """
        # Precondition
        descriptors = get_descriptors_sequence.GetDescriptorsSequence(
            self.device_context).run()
        self.device_context.update_descriptor_cache(descriptors)
        mbim_open_generic_sequence.MBIMOpenGenericSequence(
            self.device_context).run()

        # Step 1
        device_context = self.device_context
        descriptor_cache = device_context.descriptor_cache
        command_message = mbim_message_request.MBIMCommand(
            device_service_id=mbim_constants.UUID_BASIC_CONNECT.bytes,
            cid=mbim_constants.MBIM_CID_RADIO_STATE,
            command_type=mbim_constants.COMMAND_TYPE_SET,
            information_buffer_length=4,
            payload_buffer=array.array('B', struct.pack('I', 2)))
        packets = mbim_message_request.generate_request_packets(
            command_message, device_context.max_control_transfer_size)
        channel = mbim_channel.MBIMChannel(
            device_context._device,
            descriptor_cache.mbim_communication_interface.bInterfaceNumber,
            descriptor_cache.interrupt_endpoint.bEndpointAddress,
            device_context.max_control_transfer_size)
        response_packets = channel.bidirectional_transaction(*packets)
        channel.close()

        # Step 2
        response_message = mbim_message_response.parse_response_packets(
            response_packets)

        # Step 3
        if ((response_message.message_type != mbim_constants.MBIM_COMMAND_DONE)
                or (response_message.status_codes
                    == mbim_constants.MBIM_STATUS_SUCCESS)
                or response_message.information_buffer_length != 0):
            mbim_errors.log_and_raise(mbim_errors.MBIMComplianceAssertionError,
                                      'mbim1.0:9.4.5#3')
Exemple #18
0
    def run_internal(self):
        """ Run ERR_04 test. """
        # Precondition
        descriptors = get_descriptors_sequence.GetDescriptorsSequence(
            self.device_context).run()
        self.device_context.update_descriptor_cache(descriptors)
        open_sequence = mbim_open_generic_sequence.MBIMOpenGenericSequence(
            self.device_context)
        open_sequence.run(max_control_transfer_size=64)

        # Step 1
        request_message, response_message, _ = (
            connect_sequence.ConnectSequence(self.device_context).run(
                introduce_error_in_packets_order=[1, 0, 2],
                raise_exception_on_failure=False))

        # Step 2
        if ((response_message.transaction_id != request_message.transaction_id)
                or (response_message.message_type
                    == mbim_constants.MBIM_COMMAND_DONE)):
            mbim_errors.log_and_raise(mbim_errors.MBIMComplianceAssertionError,
                                      'mbim1.0:9.3.4.2#3')
Exemple #19
0
    def run_internal(self):
        """ Run CM_07 test. """
        # Precondition
        descriptors = get_descriptors_sequence.GetDescriptorsSequence(
            self.device_context).run()
        self.device_context.update_descriptor_cache(descriptors)
        mbim_open_generic_sequence.MBIMOpenGenericSequence(
            self.device_context).run()

        # Step 1
        # 255 is an unsupported CID.
        device_context = self.device_context
        descriptor_cache = device_context.descriptor_cache
        command_message = mbim_message_request.MBIMCommand(
            device_service_id=mbim_constants.UUID_BASIC_CONNECT.bytes,
            cid=255,
            command_type=mbim_constants.COMMAND_TYPE_QUERY,
            information_buffer_length=0)
        packets = mbim_message_request.generate_request_packets(
            command_message, device_context.max_control_transfer_size)
        channel = mbim_channel.MBIMChannel(
            device_context._device,
            descriptor_cache.mbim_communication_interface.bInterfaceNumber,
            descriptor_cache.interrupt_endpoint.bEndpointAddress,
            device_context.max_control_transfer_size)
        response_packets = channel.bidirectional_transaction(*packets)
        channel.close()

        # Step 2
        response_message = mbim_message_response.parse_response_packets(
            response_packets)

        # Step 3
        if (response_message.message_type != mbim_constants.MBIM_COMMAND_DONE
                or (response_message.status_codes !=
                    mbim_constants.MBIM_STATUS_NO_DEVICE_SUPPORT)):
            mbim_errors.log_and_raise(mbim_errors.MBIMComplianceAssertionError,
                                      'mbim1.0:9.4.5#2')
    def run_internal(self):
        """ Run CM_08 test. """
        # Precondition
        mbim_open_generic_sequence.MBIMOpenGenericSequence(
            self.test_context).run()

        # Step 1
        command_message = mbim_control.MBIMCommandMessage(
            message_length=52,
            total_fragments=1,
            current_fragment=0,
            device_service_id=mbim_constants.UUID_BASIC_CONNECT.bytes,
            cid=mbim_constants.MBIM_CID_RADIO_STATE,
            command_type=mbim_constants.COMMAND_TYPE_SET,
            information_buffer_length=4,
            information_buffer=array.array('B', struct.pack('I', 2)))
        packets = command_message.generate_packets()
        channel = mbim_channel.MBIMChannel(
            {
                'idVendor': self.test_context.id_vendor,
                'idProduct': self.test_context.id_product
            }, self.test_context.mbim_communication_interface.bInterfaceNumber,
            self.test_context.interrupt_endpoint.bEndpointAddress,
            self.test_context.mbim_functional.wMaxControlMessage)
        response_packets = channel.bidirectional_transaction(*packets)
        channel.close()

        # Step 2
        response_message = mbim_control.parse_response_packets(
            response_packets)

        # Step 3
        if ((response_message.message_type != mbim_constants.MBIM_COMMAND_DONE)
                or (response_message.status_codes
                    == mbim_constants.MBIM_STATUS_SUCCESS)
                or response_message.information_buffer_length != 0):
            mbim_errors.log_and_raise(mbim_errors.MBIMComplianceAssertionError,
                                      'mbim1.0:9.4.5#3')
Exemple #21
0
    def run_internal(self):
        """ Run ERR_02 test. """
        # Precondition
        descriptors = get_descriptors_sequence.GetDescriptorsSequence(
            self.device_context).run()
        self.device_context.update_descriptor_cache(descriptors)
        open_sequence = mbim_open_generic_sequence.MBIMOpenGenericSequence(
            self.device_context)
        open_sequence.run(max_control_transfer_size=64)

        # Step 1
        request_message, response_message, _ = (
            connect_sequence.ConnectSequence(self.device_context).run(
                introduce_error_in_packets_order=[1, 0, 2],
                raise_exception_on_failure=False))

        # Step 2
        if ((response_message.message_type !=
             mbim_constants.MBIM_FUNCTION_ERROR_MSG)
                or (response_message.error_status_code !=
                    mbim_constants.MBIM_ERROR_FRAGMENT_OUT_OF_SEQUENCE)):
            mbim_errors.log_and_raise(mbim_errors.MBIMComplianceAssertionError,
                                      'mbim1.0:9.3.4#3')
Exemple #22
0
    def run_internal(self):
        """ Run ERR_05 test. """
        # Precondition
        descriptors = get_descriptors_sequence.GetDescriptorsSequence(
                self.device_context).run()
        self.device_context.update_descriptor_cache(descriptors)
        open_sequence = mbim_open_generic_sequence.MBIMOpenGenericSequence(
                self.device_context)
        open_sequence.run(max_control_transfer_size=64)

        # Step 1
        request_message, first_response_message, notifications = (
                connect_sequence.ConnectSequence(self.device_context).run(
                        introduce_error_in_packets_order=[1, 1],
                        raise_exception_on_failure=False))

        if len(notifications) > 1:
            mbim_errors.log_and_raise(
                    mbim_errors.MBIMComplianceTestError,
                    'Not expecting more than 1 pending response.')
        second_response_message = notifications[0]

        # Step 2
        if (((first_response_message.transaction_id !=
              request_message.transaction_id) or
             (first_response_message.message_type !=
              mbim_constants.MBIM_FUNCTION_ERROR_MSG) or
             (first_response_message.error_status_code !=
              mbim_constants.MBIM_ERROR_FRAGMENT_OUT_OF_SEQUENCE)) or
            ((second_response_message.transaction_id !=
              request_message.transaction_id) or
             (second_response_message.message_type !=
              mbim_constants.MBIM_FUNCTION_ERROR_MSG) or
             (second_response_message.error_status_code !=
              mbim_constants.MBIM_ERROR_FRAGMENT_OUT_OF_SEQUENCE))):
            mbim_errors.log_and_raise(mbim_errors.MBIMComplianceAssertionError,
                                      'mbim1.0:9.3.4.2#4')
    def run_internal(self):
        """ Run CM_07 test. """
        # Precondition
        mbim_open_generic_sequence.MBIMOpenGenericSequence(
            self.test_context).run()

        # Step 1
        # 255 is an unsupported CID.
        command_message = mbim_control.MBIMCommandMessage(
            message_length=48,
            total_fragments=1,
            current_fragment=0,
            device_service_id=mbim_constants.UUID_BASIC_CONNECT.bytes,
            cid=255,
            command_type=mbim_constants.COMMAND_TYPE_QUERY,
            information_buffer_length=0)
        packets = command_message.generate_packets()
        channel = mbim_channel.MBIMChannel(
            {
                'idVendor': self.test_context.id_vendor,
                'idProduct': self.test_context.id_product
            }, self.test_context.mbim_communication_interface.bInterfaceNumber,
            self.test_context.interrupt_endpoint.bEndpointAddress,
            self.test_context.mbim_functional.wMaxControlMessage)
        response_packets = channel.bidirectional_transaction(*packets)
        channel.close()

        # Step 2
        response_message = mbim_control.parse_response_packets(
            response_packets)

        # Step 3
        if (response_message.message_type != mbim_constants.MBIM_COMMAND_DONE
                or (response_message.status_codes !=
                    mbim_constants.MBIM_STATUS_NO_DEVICE_SUPPORT)):
            mbim_errors.log_and_raise(mbim_errors.MBIMComplianceAssertionError,
                                      'mbim1.0:9.4.5#2')
Exemple #24
0
    def run_internal(self):
        """ Run the CM_01 test. """
        # Precondition.
        desc_sequence = get_descriptors_sequence.GetDescriptorsSequence(
            self.device_context)
        descriptors = desc_sequence.run()
        self.device_context.update_descriptor_cache(descriptors)
        open_sequence = mbim_open_generic_sequence.MBIMOpenGenericSequence(
            self.device_context)
        open_sequence.run()
        caps_sequence = mbim_cid_device_caps_sequence.MBIMCIDDeviceCapsSequence(
            self.device_context)
        _, caps_response = caps_sequence.run()

        # Step1
        if (caps_response.cellular_class
                & mbim_constants.CELLULAR_CLASS_MASK_CDMA):
            if not ((caps_response.control_caps
                     & mbim_constants.CTRL_CAPS_MASK_CDMA_MOBILE_IP) or
                    (caps_response.control_caps
                     & mbim_constants.CTRL_CAPS_MASK_CDMA_SIMPLE_IP)):
                mbim_errors.log_and_raise(
                    mbim_errors.MBIMComplianceAssertionError,
                    'mbim1.0:10.5.1.3#1')
Exemple #25
0
 def run_internal(self):
     """ Run CM_01 test. """
     # Step 1
     open_message, response_message = (
         mbim_open_generic_sequence.MBIMOpenGenericSequence(
             self.test_context).run())
Exemple #26
0
    def run_internal(self):
        """ Run CM_05 test. """
        # Precondition
        descriptors = get_descriptors_sequence.GetDescriptorsSequence(
            self.device_context).run()
        self.device_context.update_descriptor_cache(descriptors)
        mbim_open_generic_sequence.MBIMOpenGenericSequence(
            self.device_context).run()

        device_context = self.device_context
        descriptor_cache = device_context.descriptor_cache
        self.channel = mbim_channel.MBIMChannel(
            device_context._device,
            descriptor_cache.mbim_communication_interface.bInterfaceNumber,
            descriptor_cache.interrupt_endpoint.bEndpointAddress,
            device_context.max_control_transfer_size)

        # Step 1
        caps_command_message = mbim_command_message.MBIMDeviceCapsQuery()
        caps_packets = mbim_message_request.generate_request_packets(
            caps_command_message, device_context.max_control_transfer_size)
        self.caps_transaction_id = caps_command_message.transaction_id
        self.channel.unidirectional_transaction(*caps_packets)

        # Step 2
        services_command_message = (
            mbim_command_message.MBIMDeviceServicesQuery())
        services_packets = mbim_message_request.generate_request_packets(
            services_command_message, device_context.max_control_transfer_size)
        self.services_transaction_id = services_command_message.transaction_id
        self.channel.unidirectional_transaction(*services_packets)

        # Step 3
        utils.poll_for_condition(
            self._get_response_packets,
            timeout=5,
            exception=mbim_errors.MBIMComplianceChannelError(
                'Failed to retrieve the response packets to specific '
                'control messages.'))
        self.channel.close()

        caps_response_message = self.caps_response
        services_response_message = self.services_response
        is_caps_message_valid = isinstance(
            caps_response_message, mbim_command_message.MBIMDeviceCapsInfo)
        is_services_message_valid = isinstance(
            services_response_message,
            mbim_command_message.MBIMDeviceServicesInfo)
        if not ((is_caps_message_valid and is_services_message_valid) and
                (caps_response_message.transaction_id
                 == caps_command_message.transaction_id) and
                (caps_response_message.device_service_id
                 == caps_command_message.device_service_id)
                and caps_response_message.cid == caps_command_message.cid and
                (services_command_message.transaction_id
                 == services_response_message.transaction_id) and
                (services_command_message.device_service_id
                 == services_response_message.device_service_id) and
                services_command_message.cid == services_response_message.cid):
            mbim_errors.log_and_raise(mbim_errors.MBIMComplianceAssertionError,
                                      'mbim1.0:8.1.2#2')