# Copyright 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""A test which verifies the function of hardware JPEG encode accelerator."""

import logging
import os
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/'
TEST_IMAGE_PATH = 'jpeg_test/bali_640x360_P420.yuv'

class video_JpegEncodeAccelerator(chrome_binary_test.ChromeBinaryTest):
    """
    This test is a wrapper of the chrome unittest binary:
    jpeg_encode_accelerator_unittest.
    """

    version = 1
    binary = 'jpeg_encode_accelerator_unittest'

    @helper_logger.video_log_wrapper
    @chrome_binary_test.nuke_chrome
    def run_once(self, capability, gtest_filter=None):
        """
        Runs jpeg_encode_accelerator_unittest on the device.

        @param capability: Capability required for executing this test.
        @param gtest_filter: test case filter.

        @raises: error.TestFail for jpeg_encode_accelerator_unittest failures.
        """
        device_capability.DeviceCapability().ensure_capability(capability)

        url = DOWNLOAD_BASE + TEST_IMAGE_PATH
        local_path = os.path.join(self.bindir, os.path.basename(TEST_IMAGE_PATH))
        file_utils.download_file(url, local_path)

        cmd_line_list = [helper_logger.chrome_vmodule_flag()]
        if gtest_filter:
            cmd_line_list.append('--gtest_filter="%s"' % gtest_filter)

        cmd_line = ' '.join(cmd_line_list)
        self.run_chrome_test_binary(self.binary, cmd_line)
