# 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()