# Copyright (c) 2012 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.

from autotest_lib.client.bin import test
import logging, os, subprocess, time

CONN_MANAGER = 'shill'

tests = [ 'crash-mm-0', 'crash-modem-0', 'crash-modem-1', 'crash-modem-2',
          'crash-modem-3', 'crash-modem-4', 'crash-modem-5', 'crash-modem-6',
          'fail-mm-0', 'fail-modem-0', 'fail-modem-1', 'fail-modem-2',
          'fail-modem-3', 'fail-modem-4', 'fail-modem-5', 'fail-modem-6',
          'timeout-modem-0' ]

class network_ConnmanCromoCrash(test.test):
    version = 1

    def callproc(self, *args):
        proc = subprocess.Popen(args, stdout=subprocess.PIPE)
        (out, err) = proc.communicate()
        if proc.returncode:
            raise RuntimeError('callproc %s failed: %d' % (args[0],
                               proc.returncode))
        return str(out)

    def veth(self, *args):
        self.callproc('/usr/local/lib/flimflam/test/veth', *args)

    def run(self, test):
        oldpid = self.callproc('pgrep', CONN_MANAGER).replace("\n", ' ')
        self.callproc('chmod', '755', self.bindir)
        self.callproc('chmod', '755', self.srcdir)
        self.callproc('chmod', '755', '%s/%s' % (self.srcdir, 'common.py'))
        self.callproc('chmod', '755', '%s/%s' % (self.srcdir, test))
        proc = subprocess.Popen(['/sbin/minijail0', '-u', 'cromo', '-g',
                                 'cromo', '/usr/bin/env', 'python',
                                 '%s/%s' % (self.srcdir, test)],
                                stdout=subprocess.PIPE,
                                stderr=subprocess.STDOUT)
        (out, err) = proc.communicate()
        if out:
            out = out.replace("\n", ' ')
        if err:
            err = err.replace("\n", ' ')
        if proc.returncode:
            raise RuntimeError('Subprocess %s failed: %d %s %s' % (
                               test, proc.returncode, out, err))
        time.sleep(2)
        newpid = self.callproc('pgrep', CONN_MANAGER).replace("\n", ' ')
        if newpid != oldpid:
            raise RuntimeError('%s pid changed: %s != %s' % (
                               CONN_MANAGER, oldpid, newpid))

    def run_once(self):
        cromo_was_running = True
        try:
            self.callproc('initctl', 'stop', 'cromo')
        except RuntimeError:
            cromo_was_running = False
            # It's okay if cromo's not running beforehand.
            pass
        time.sleep(3)
        try:
            for t in tests:
                logging.info('Running %s' % t)
                try:
                    self.veth('setup', 'pseudomodem0', '172.16.1')
                    self.run(t)
                finally:
                    self.veth('teardown', 'pseudomodem0')
        finally:
            if cromo_was_running:
                self.callproc('initctl', 'start', 'cromo')
