blob: 37cb1fff56a44d0578328c5b32d2f0ca5be80239 [file] [log] [blame]
# Copyright 2014 The Chromium 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 logging
import sys
from telemetry.util.mac import keychain_helper
from telemetry.value import histogram_util
from telemetry.value import scalar
from metrics import Metric
class KeychainMetric(Metric):
"""KeychainMetric gathers keychain statistics from the browser object.
This includes the number of times that the keychain was accessed.
"""
DISPLAY_NAME = 'OSX_Keychain_Access'
HISTOGRAM_NAME = 'OSX.Keychain.Access'
@staticmethod
def _CheckKeychainConfiguration():
"""On OSX, it is possible for a misconfigured keychain to cause the
Telemetry tests to stall.
This method confirms that the keychain is in a sane state that will
not cause this behavior. Three conditions are checked:
- The keychain is unlocked.
- The keychain will not auto-lock after a period of time.
- The ACLs are correctly configured on the relevant keychain items.
"""
warning_suffix = ('which will cause some Telemetry tests to stall when run'
' on a headless machine (e.g. perf bot).')
if keychain_helper.IsKeychainLocked():
logging.warning('The default keychain is locked, %s', warning_suffix)
if keychain_helper.DoesKeychainHaveTimeout():
logging.warning('The default keychain is configured to automatically'
' lock itself have a period of time, %s', warning_suffix)
chrome_acl_configured = (keychain_helper.
IsKeychainConfiguredForBotsWithChrome())
chromium_acl_configured = (keychain_helper.
IsKeychainConfiguredForBotsWithChromium())
acl_warning = ('A commonly used %s key stored in the default keychain does'
' not give decryption access to all applications, %s')
if not chrome_acl_configured:
logging.warning(acl_warning, 'Chrome', warning_suffix)
if not chromium_acl_configured:
logging.warning(acl_warning, 'Chromium', warning_suffix)
@classmethod
def CustomizeBrowserOptions(cls, options):
"""Adds a browser argument that allows for the collection of keychain
metrics. Has no effect on non-Mac platforms.
"""
if sys.platform != 'darwin':
return
KeychainMetric._CheckKeychainConfiguration()
options.AppendExtraBrowserArgs(['--enable-stats-collection-bindings'])
def AddResults(self, tab, results):
"""Adds the number of times that the keychain was accessed to |results|.
Has no effect on non-Mac platforms.
"""
if sys.platform != 'darwin':
return
access_count = histogram_util.GetHistogramSum(
histogram_util.BROWSER_HISTOGRAM, KeychainMetric.HISTOGRAM_NAME, tab)
results.AddValue(scalar.ScalarValue(
results.current_page, KeychainMetric.DISPLAY_NAME, 'count',
access_count))