# Copyright 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 os.path

from autotest_lib.client.common_lib import error
from autotest_lib.client.cros import chrome_binary_test
from autotest_lib.client.cros.graphics import graphics_utils

class graphics_GLES2ConformChrome(chrome_binary_test.ChromeBinaryTest):
    """
    Run the Khronos GLES2 Conformance test suite against the Chrome GPU command
    buffer.
    """
    version = 1
    GSC = None
    BINARY = 'gles2_conform_test'

    def initialize(self):
        super(graphics_GLES2ConformChrome, self).initialize()
        self.GSC = graphics_utils.GraphicsStateChecker()

    def cleanup(self):
        super(graphics_GLES2ConformChrome, self).cleanup()
        if self.GSC:
            keyvals = self.GSC.get_memory_keyvals()
            for key, val in keyvals.iteritems():
                self.output_perf_value(description=key, value=val,
                                       units='bytes', higher_is_better=False)
            self.GSC.finalize()
            self.write_perf_keyval(keyvals)

    def run_once(self):
        if not os.path.exists(self.get_chrome_binary_path(self.BINARY)):
            raise error.TestFail('%s not found. Use internal Chrome sources!' %
                                 self.BINARY)

        self.run_chrome_test_binary(self.BINARY)
