| # Copyright (c) 2014 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 datetime |
| import math |
| import random |
| |
| from autotest_lib.client.cros.video import method_logger |
| |
| |
| @method_logger.log |
| def generate_interval_sequence(start, stop, interval_in_s): |
| """ |
| Generates a list of timestamps sequence given the configuration. |
| |
| If specified upper limit would coincide as the last value it will be |
| included in the list. |
| |
| We use this method when we are capturing golden images for a particular |
| video. We would typically specify an interval of a second and then store |
| obtained those golden images in a server. |
| |
| @param start: timedelta, start time. |
| @param stop: timedelta, stop_time. |
| @param interval_in_s: Time gap between two successive timestamps. |
| |
| @returns a list of timedelta values specifying points in time to take a |
| screenshot. |
| |
| """ |
| |
| start_total_ms = int(start.total_seconds() * 1000) |
| stop_total_ms = int(stop.total_seconds() * 1000) |
| interval_total_ms = interval_in_s * 1000 |
| duration_total_ms = stop_total_ms - start_total_ms |
| |
| if interval_total_ms > duration_total_ms: |
| raise ValueError('Interval too large. Duration = %ms, interval = %ms', |
| duration_total_ms, interval_total_ms) |
| |
| # xrange is exclusive of upper limit, add 1 second so that we include |
| # the stop time |
| return [datetime.timedelta(milliseconds=x) for x in |
| xrange(start_total_ms, |
| stop_total_ms + 1, |
| interval_total_ms)] |
| |
| |
| @method_logger.log |
| def generate_random_sequence(start, stop, samples_per_min): |
| """ |
| Generates a list of random values per given configuration. |
| |
| @param start: timedelta, start time. |
| @param stop: timedelta, stop time. |
| @param samples_per_min: int, number of values to get per minute. |
| |
| This method exists because we need to capture images at random time |
| instances. We need to do that so as to maximize the chance of catching a |
| glitch that we wouldn't otherwise catch if we captured in a wrong interval. |
| |
| @returns a list of random values between start and stop as per |
| 'samples_per_min' configuration. |
| |
| """ |
| start_total_s = int(start.total_seconds()) |
| |
| stop_total_s = int(stop.total_seconds()) |
| |
| duration = stop_total_s - start_total_s |
| |
| # Round up the total number of samples. e.g: 8.5 becomes 9 |
| |
| total_num_samples = int( |
| math.ceil((samples_per_min * duration) / 60.0)) |
| |
| # xrange is exclusive of upper limit, add 1 second so that we include |
| # the stop time |
| randomized_time_seq = random.sample(xrange(start_total_s, stop_total_s + 1), |
| total_num_samples) |
| |
| return [datetime.timedelta(seconds=t) for t in randomized_time_seq] |