# Copyright (c) 2011 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, os, re
from autotest_lib.client.bin import utils
from autotest_lib.client.common_lib import error
from autotest_lib.client.bin import test

class kernel_NVMapCompactor(test.test):
    version = 1
    preserve_srcdir = True

    def run_once(self, options='' ):
        dep = 'nvmap_compactor'
        dep_dir = os.path.join(self.autodir, 'deps', dep)
        self.job.install_pkg(dep, 'dep', dep_dir)

        exedir = os.path.join(self.autodir, 'deps', dep)

        cmd = '%s/nvmap_carveout_compactor %s' % (exedir, options)

        # If UI is running, we must stop it and restore later.
        status_output = utils.system_output('initctl status ui')
        # If chrome is running, result will be similar to:
        #   ui start/running, process 11895
        logging.info('initctl status ui returns: %s', status_output)
        need_restart_ui = status_output.startswith('ui start')

        # If UI is just stopped or if there's no known X session, we have to
        # start a new one. For factory test, it provides X (DISPLAY) so we can
        # reuse it.
        if need_restart_ui or (not os.getenv('DISPLAY')):
            cmd = 'X :0 & sleep 1; DISPLAY=:0 %s; kill $!' % cmd

        if need_restart_ui:
            utils.system('initctl stop ui', ignore_status=True)

        try:
            summary = utils.system_output(cmd, retain_output=True)
        finally:
            if need_restart_ui:
                utils.system('initctl start ui')

        errors = 'FAIL' in summary
        run_through = 'SUCCESS' in summary
        if errors or (not run_through):
            raise error.TestFail('Test Failed')


