blob: 023d32f1f598a1f83e28ad1b0b6b285c09e23a64 [file] [log] [blame]
# Copyright 2015 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.
import array
import logging
import unittest
import common
from autotest_lib.client.cros.cellular.mbim_compliance import mbim_constants
from autotest_lib.client.cros.cellular.mbim_compliance import mbim_data_transfer
class TestMbimDeviceContext(object):
""" Dummy device context. """
pass
class TestMbimDescriptorCache(object):
""" Dummy MBIM descriptor cache. """
pass
class TestMbimEndpointDescriptor(object):
""" Dummy MBIM endpoint descriptor. """
pass
class MBIMMessageTestCase(unittest.TestCase):
""" Test cases for verifying MBIMDataTransfer class and MBIMNtb class. """
def test_ntb_generation(self):
""" Verifies the NTB frame generation from the given payload. """
ntb = mbim_data_transfer.MBIMNtb(mbim_constants.NTB_FORMAT_32)
payload = [array.array('B', [0x45, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0xBC, 0xB4, 0x7F, 0x00,
0x00, 0x01, 0x7F, 0x00, 0x00, 0x02, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E,
0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
0x76, 0x77, 0x61, 0x62, 0x63, 0x64, 0x65,
0x66, 0x67, 0x68, 0x69, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00])]
ntb_frame = ntb.generate_ntb(payload, 1024, 32, 0, 1)
verify_ntb_frame = array.array('B', [0x6E, 0x63, 0x6D, 0x68, 0x10,
0x00, 0x00, 0x00, 0x90, 0x00,
0x00, 0x00, 0x70, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x45, 0x00, 0x00,
0x46, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0xBC, 0xB4, 0x7F,
0x00, 0x00, 0x01, 0x7F, 0x00,
0x00, 0x02, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01,
0x61, 0x62, 0x63, 0x64, 0x65,
0x66, 0x67, 0x68, 0x69, 0x6A,
0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
0x70, 0x71, 0x72, 0x73, 0x74,
0x75, 0x76, 0x77, 0x61, 0x62,
0x63, 0x64, 0x65, 0x66, 0x67,
0x68, 0x69, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x69, 0x70, 0x73,
0x00, 0x20, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x20, 0x00,
0x00, 0x00, 0x50, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00])
self.assertEqual(ntb_frame, verify_ntb_frame)
def test_ntb_parsing(self):
""" Verifies the NTB frame parsing from the given NTB frame. """
ntb = mbim_data_transfer.MBIMNtb(mbim_constants.NTB_FORMAT_32)
ntb_frame = array.array('B', [0x6E, 0x63, 0x6D, 0x68, 0x10,
0x00, 0x01, 0x00, 0x90, 0x00,
0x00, 0x00, 0x70, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x45, 0x00, 0x00,
0x46, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0xBC, 0xB4, 0x7F,
0x00, 0x00, 0x01, 0x7F, 0x00,
0x00, 0x02, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01,
0x61, 0x62, 0x63, 0x64, 0x65,
0x66, 0x67, 0x68, 0x69, 0x6A,
0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
0x70, 0x71, 0x72, 0x73, 0x74,
0x75, 0x76, 0x77, 0x61, 0x62,
0x63, 0x64, 0x65, 0x66, 0x67,
0x68, 0x69, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x69, 0x70, 0x73,
0x00, 0x20, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x20, 0x00,
0x00, 0x00, 0x50, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00])
nth, ndp, ndp_entries, payload = ntb.parse_ntb(ntb_frame)
verify_payload = [array.array('B', [0x45, 0x00, 0x00, 0x46, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0xBC, 0xB4,
0x7F, 0x00, 0x00, 0x01, 0x7F, 0x00,
0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x61, 0x62,
0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E,
0x6F, 0x70, 0x71, 0x72, 0x73, 0x74,
0x75, 0x76, 0x77, 0x61, 0x62, 0x63,
0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00])]
# Verify the fields of the headers and payload
self.assertEqual(nth.signature, mbim_data_transfer.NTH_SIGNATURE_32)
self.assertEqual(nth.header_length, 16)
self.assertEqual(nth.sequence_number, 1)
self.assertEqual(nth.block_length, 144)
self.assertEqual(nth.fp_index, 112)
self.assertEqual(ndp.signature, mbim_data_transfer.NDP_SIGNATURE_IPS_32)
self.assertEqual(ndp.length, 32)
self.assertEqual(ndp.next_ndp_index, 0)
self.assertEqual(ndp_entries[0].datagram_index, 32)
self.assertEqual(ndp_entries[0].datagram_length, 80)
self.assertEqual(ndp_entries[1].datagram_index, 0)
self.assertEqual(ndp_entries[1].datagram_length, 0)
self.assertEqual(payload, verify_payload)
def test_data_transfer_object_creation(self):
""" Verifies the Data transfer object creation. """
device_context = TestMbimDeviceContext()
device_context.device = 1
device_context.max_out_data_transfer_size = 100
device_context.max_in_data_transfer_size = 100
device_context.out_data_transfer_divisor = 32
device_context.out_data_transfer_payload_remainder = 0
device_context.descriptor_cache = TestMbimDescriptorCache()
device_context.descriptor_cache.mbim_data_interface = (
TestMbimDescriptorCache())
device_context.descriptor_cache.bulk_in_endpoint = (
TestMbimDescriptorCache())
device_context.descriptor_cache.bulk_out_endpoint = (
TestMbimDescriptorCache())
device_context.descriptor_cache.mbim_data_interface.bInterfaceNumber = 0
device_context.descriptor_cache.bulk_in_endpoint.bEndpointAddress = 0
device_context.descriptor_cache.bulk_out_endpoint.bEndpointAddress = 0
data_transfer = mbim_data_transfer.MBIMDataTransfer(device_context)
def test_data_transfer_send(self):
""" Verifies the send_data_packets API in data transfer. """
#TODO(rpius): Need to come up with a way to unittest the data transfer
def test_data_transfer_received(self):
""" Verifies the receive_data_packets API in data transfer. """
#TODO(rpius): Need to come up with a way to unittest the data transfer
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG)
unittest.main()