| # Copyright 2013 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. |
| |
| """Decide if this device is selected for certain sampling tests. |
| |
| Description |
| ----------- |
| For some sampling tests, the tests should only be run for a subset of |
| DUTs by a given sampling rate. This test uses a hash of the WLAN MAC |
| address (wlan0 or mlan0) to decide if we should sample this device or |
| not, and writes a "True" or "False" to the device data with the |
| (optionally) specified key. |
| |
| Test Procedure |
| -------------- |
| This is an automated test without user interaction. |
| |
| Dependency |
| ---------- |
| Need the device to have a WiFi interface with non-fixed MAC address. |
| |
| Examples |
| -------- |
| To select about 10% of the devices and mark devices selected as |
| 'selected_for_sampling' in device data, add this in test list:: |
| |
| { |
| "pytest_name": "select_for_sampling", |
| "args": { |
| "rate": 0.1 |
| } |
| } |
| |
| To select about 20% of the devices, and mark using 'run_audio' key:: |
| |
| { |
| "pytest_name": "select_for_sampling", |
| "args": { |
| "rate": 0.2, |
| "device_data_key": "run_audio" |
| } |
| } |
| """ |
| |
| import hashlib |
| import logging |
| import unittest |
| |
| import factory_common # pylint: disable=unused-import |
| from cros.factory.test import device_data |
| from cros.factory.test import event_log # TODO(chuntsen): Deprecate event log. |
| from cros.factory.testlog import testlog |
| from cros.factory.utils.arg_utils import Arg |
| from cros.factory.utils import net_utils |
| |
| |
| class SelectForSamplingTest(unittest.TestCase): |
| ARGS = [ |
| Arg('rate', float, |
| 'Sampling rate (0 to never select any devices, 1 to select all, ' |
| '0.2 to select 20% of devices, etc.)'), |
| Arg('device_data_key', str, |
| 'Key in the device data dictionary', |
| default='selected_for_sampling'), |
| ] |
| |
| def runTest(self): |
| self.assertGreaterEqual(self.args.rate, 0.0) |
| self.assertLessEqual(self.args.rate, 1.0) |
| |
| mac_address = net_utils.GetWLANMACAddress() |
| digest = hashlib.md5(mac_address).hexdigest() |
| value = int(digest, 16) |
| |
| max_value = 16 ** len(digest) |
| fraction = value * 1.0 / max_value |
| |
| selected = fraction < self.args.rate |
| |
| logging.info('MAC address hash (as a fraction of 1): %.5f', fraction) |
| logging.info('Sampling rate: %.5f', self.args.rate) |
| logging.info('Selected: %r', selected) |
| |
| event_log.Log('select_for_sampling', |
| device_data_key=self.args.device_data_key, |
| fraction=fraction, rate=self.args.rate, selected=selected) |
| |
| testlog.LogParam('selected', selected) |
| testlog.CheckNumericParam('fraction', fraction, max=self.args.rate) |
| |
| device_data.UpdateDeviceData({self.args.device_data_key: selected}) |