# 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]