| # 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") |