blob: 42a6da3f933c11de3da4fbd7170e4c934134ac0d [file] [log] [blame]
# Copyright (C) 2016 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
import logging
import time
from google import protobuf
from acts import asserts
from acts_contrib.test_utils.bt.BtMetricsBaseTest import BtMetricsBaseTest
from acts_contrib.test_utils.bt.bt_test_utils import clear_bonded_devices
from acts_contrib.test_utils.bt.bt_test_utils import pair_pri_to_sec
from acts_contrib.test_utils.bt.bt_test_utils import reset_bluetooth
from acts_contrib.test_utils.bt.protos import bluetooth_pb2
from acts.utils import get_current_epoch_time, sync_device_time
class BtMetricsTest(BtMetricsBaseTest):
def __init__(self, controllers):
BtMetricsBaseTest.__init__(self, controllers)
self.iterations = 1
def setup_class(self):
return super(BtMetricsTest, self).setup_class()
def setup_test(self):
# Reset bluetooth
reset_bluetooth(self.android_devices)
for ad in self.android_devices:
if not clear_bonded_devices(ad):
logging.error("Failed to unbound device")
return False
# Sync device time for timestamp comparison
sync_device_time(ad)
return super(BtMetricsTest, self).setup_test()
def test_pairing_metric(self):
"""Test if a pairing event generates the correct metric entry
This test tries to pair two Bluetooth devices and dumps metrics after
pairing. A correctly implemented stack should record 8 pairing events.
Steps:
1. Start pairing between two Bluetooth devices
2. After pairing is done, dump and parse the metrics
3. Compare the number of pairing events and the time stamp of the
pairing event
Expected Result:
No errors, 8 pairing events should be generated
Returns:
Pass if True
Fail if False
TAGS: Classic
Priority: 1
"""
time_bonds = []
for n in range(self.iterations):
start_time = get_current_epoch_time()
self.log.info("Pair bluetooth iteration {}.".format(n + 1))
if (not pair_pri_to_sec(
self.android_devices[0],
self.android_devices[1],
attempts=1,
auto_confirm=False)):
self.log.error("Failed to bond devices.")
return False
end_time = get_current_epoch_time()
time_bonds.append((start_time, end_time))
# A device bond will trigger a number of system routines that need
# to settle before unbond
time.sleep(2)
for ad in self.android_devices:
if not clear_bonded_devices(ad):
return False
# Necessary sleep time for entries to update unbonded state
time.sleep(2)
bonded_devices = ad.droid.bluetoothGetBondedDevices()
if len(bonded_devices) > 0:
self.log.error("Failed to unbond devices: {}".format(
bonded_devices))
return False
end_time = get_current_epoch_time()
bluetooth_logs, bluetooth_logs_ascii = \
self.collect_bluetooth_manager_metrics_logs(
[self.android_devices[0]])
bluetooth_log = bluetooth_logs[0]
bluetooth_log_ascii = bluetooth_logs_ascii[0]
asserts.assert_equal(
len(bluetooth_log.pair_event), 8, extras=bluetooth_log_ascii)
for pair_event in bluetooth_log.pair_event:
t = pair_event.event_time_millis
asserts.assert_true(start_time <= t <= end_time,
"Event time %d not within limit [%d, %d]" %
(t, start_time, end_time))
device_info = pair_event.device_paired_with
asserts.assert_true(device_info, "Device info is none")
asserts.assert_equal(device_info.device_type,
bluetooth_pb2.DeviceInfo.DEVICE_TYPE_BREDR,
"Device type does not match")
def test_bluetooth_metrics_parsing(self):
"""Test if metrics could be dumped and parsed
This test simply dumps Bluetooth metrics and print out the ASCII
representation
Steps:
1. For the first Android device, dump metrics
2. Parse and print metrics in INFO log using ASCII format
Expected Result:
No errors, metrics should be printed to INFO log
Returns:
Pass if True
Fail if False
TAGS: Classic
Priority: 1
"""
bluetooth_logs, bluetooth_logs_ascii = \
self.collect_bluetooth_manager_metrics_logs(
[self.android_devices[0]])
bluetooth_log = bluetooth_logs[0]
self.log.info(protobuf.text_format.MessageToString(bluetooth_log))
return True