# Copyright 2017 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 logging
import os

from autotest_lib.client.bin import utils
from autotest_lib.client.common_lib import file_utils
from autotest_lib.client.cros import chrome_binary_test
from autotest_lib.client.cros.video import device_capability
from autotest_lib.client.cros.video import helper_logger


DOWNLOAD_BASE = ('http://commondatastorage.googleapis.com'
                 '/chromiumos-test-assets-public/')
BINARY = 'video_decode_accelerator_unittest'

class video_VDASanity(chrome_binary_test.ChromeBinaryTest):
    """
    VDA sanity autotest runs binary video_decode_accelerator_unittest on a list
    of videos.
    """
    version = 1

    @helper_logger.video_log_wrapper
    @chrome_binary_test.nuke_chrome
    def run_once(self, test_cases, capability):
        device_capability.DeviceCapability().ensure_capability(capability)
        for (path, width, height, frame_num, frag_num, profile) in test_cases:
            video_path = os.path.join(self.bindir, 'video.download')
            test_video_data = '%s:%d:%d:%d:%d:%d:%d:%d' % (
                video_path, width, height, frame_num, frag_num, 0, 0, profile)
            try:
                self._download_video(path, video_path)
                self._run_test_case(test_video_data)
            finally:
                self._remove_if_exists(video_path)

    def _download_video(self, download_path, local_file):
        url = DOWNLOAD_BASE + download_path
        logging.info('Downloading "%s" to "%s"', url, local_file)
        file_utils.download_file(url, local_file)

    def _run_test_case(self, test_video_data):
        cmd_line_list = [
            '--test_video_data="%s"' % test_video_data,
            '--gtest_filter=VideoDecodeAcceleratorTest.NoCrash',
            helper_logger.chrome_vmodule_flag(),
            '--ozone-platform=gbm',
        ]
        cmd_line = ' '.join(cmd_line_list)
        self.run_chrome_test_binary(BINARY, cmd_line)

    def _remove_if_exists(self, filepath):
        try:
            os.remove(filepath)
        except OSError:
            pass
