# 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, re

from autotest_lib.client.bin import test
from autotest_lib.client.common_lib import error, utils
from autotest_lib.client.cros.graphics import graphics_utils

class graphics_Gbm(test.test):
    """
    Test the gbm implementation.
    """
    version = 1
    preserve_srcdir = True
    GSC = None

    def setup(self):
        os.chdir(self.srcdir)
        utils.make('clean')
        utils.make('all')

    def initialize(self):
        self.GSC = graphics_utils.GraphicsStateChecker()

    def cleanup(self):
        if self.GSC:
            self.GSC.finalize()

    def run_once(self):
        cmd = os.path.join(self.srcdir, 'gbmtest')
        cmd = graphics_utils.xcommand(cmd)
        result = utils.run(cmd,
                           stderr_is_expected = False,
                           stdout_tee = utils.TEE_TO_LOGS,
                           stderr_tee = utils.TEE_TO_LOGS,
                           ignore_status = True)
        report = re.findall(r'[  PASSED  ]', result.stdout)
        if not report:
            raise error.TestFail('Gbm test failed (' + result.stdout + ')')

