# Copyright (c) 2011 The Chromium OS Authors. All rights res.
# 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, utils
from autotest_lib.client.common_lib import error

class realtimecomm_GTalkLmiCamera(test.test):
    version = 1
    camera_measurement = {}
   
    def run_once(self):
        camtool = os.path.join(self.bindir, 'camtool')
        if not os.path.exists(camtool):
            raise error.TestFail('Missing camtool binary. Make sure gtalk has '
                                 'been emerged.')

        # Run camera.
        test_cmd = "%s capture --duration 60 --histogram --norender" % camtool
        result = utils.system_output(test_cmd)

        # Get average frame per second.
        fps = re.search("with fps\:(\d+) requested", result, re.M);
        if fps and fps.group(1):
            self.camera_measurement['fps'] = int(fps.group(1))
        else:
            raise error.TestFail("No fps. Camtool output: %s" % result)

        # Get start up latency.
        latency = re.search("Camera start-up time\: (\d+)ms", result, re.M);
        if latency and latency.group(1):
            self.camera_measurement['latency'] = int(latency.group(1))
        else:
            raise error.TestFail("No latency. Camtool output: %s" % result)

        # Get jerkiness.
        jerkiness = re.search("Jerkiness: ([0-9]+\.[0-9]*)\%", result, re.M);
        if jerkiness and jerkiness.group(1):
            self.camera_measurement['jerkiness'] = float(jerkiness.group(1))
        else:
            raise error.TestFail("No jerkiness. Camtool output: %s" % result)

        # Report camera measurement.
        self.write_perf_keyval(self.camera_measurement)
