You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.5 KiB
90 lines
2.5 KiB
# Copyright (c) 2019 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.
|
|
"""
|
|
This profiler will take a screenshot at the specified interval.
|
|
"""
|
|
|
|
import os, subprocess
|
|
import threading, time
|
|
import logging
|
|
from autotest_lib.client.bin import profiler
|
|
|
|
|
|
class screenshot(profiler.profiler):
|
|
""" Profiler for running screenshot """
|
|
|
|
version = 1
|
|
|
|
def initialize(self, interval=300):
|
|
"""Initializes the screenshot profiler.
|
|
|
|
Args:
|
|
interval (int): How often to take a screenshot in seconds
|
|
"""
|
|
self.interval = interval
|
|
|
|
def start(self, test):
|
|
self.thread = ScreenshotThread(interval=self.interval, test=test)
|
|
|
|
self.thread.start()
|
|
|
|
def stop(self, test):
|
|
self.thread.stop()
|
|
|
|
|
|
class ScreenshotThread(threading.Thread):
|
|
""" Thread that runs screenshot at the specified interval """
|
|
|
|
def __init__(self, interval, test):
|
|
threading.Thread.__init__(self)
|
|
self.stopped = threading.Event()
|
|
self.interval = interval
|
|
self.test = test
|
|
|
|
def run(self):
|
|
logging.info("screenshot thread starting")
|
|
|
|
sleep_time = 0
|
|
|
|
while not self.stopped.wait(sleep_time):
|
|
start_time = time.time()
|
|
|
|
path = os.path.join(self.test.profdir,
|
|
"screenshot-%d.png" % (int(start_time)))
|
|
|
|
# Don't use graphics_utils because we can't control the suffix
|
|
cmd = ['screenshot', path]
|
|
|
|
logging.debug("Taking screenshot")
|
|
|
|
process = subprocess.Popen(
|
|
cmd, stderr=subprocess.PIPE, close_fds=True)
|
|
|
|
_, stderr = process.communicate()
|
|
|
|
if process.returncode:
|
|
# If the screen is turned off, screenshot will fail
|
|
logging.info('screenshot failed. code: %d, error: %s ',
|
|
process.returncode, stderr)
|
|
|
|
end_time = time.time()
|
|
|
|
sleep_time = self.interval - (end_time - start_time)
|
|
|
|
if sleep_time < 0:
|
|
sleep_time = 0
|
|
|
|
def stop(self):
|
|
""" Stops the thread """
|
|
logging.info("Stopping screenshot thread")
|
|
|
|
self.stopped.set()
|
|
|
|
# Only block for five seconds to not hold up the test shutdown.
|
|
# It's very unlikely that the screenshot command will take more
|
|
# than a second.
|
|
self.join(5)
|
|
|
|
logging.info("screenshot thread stopped")
|