# Copyright (c) 2013 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, utils
from autotest_lib.client.common_lib import error
from autotest_lib.client.cros import backchannel, network

from autotest_lib.client.cros.cellular import cellular, cell_tools, environment

import contextlib, logging, re, socket, string, time, urllib2

from autotest_lib.client.cros import flimflam_test_path
import flimflam, routing, mm

# Cellular smoke test and documentation for writing cell tests

class cellular_Smoke(test.test):
    version = 1

    # The autotest infrastructure calls run_once.  The control file
    # fetches the JSON lab config and passes it in as a python object

    def run_once(self, config, technology):
        # The DefaultCellularTestContext builds:
        #  * a backchannel ethernet context.  This makes a virtual
        #    device that connects the DUT to the test infrastructure.
        #    It has restrictive routes and is outside of flimflam's
        #    control.  This makes the tests resilient to flimflam
        #    restarts and helps to ensure that the test is actually
        #    sending traffic on the cellular link
        #  * an OtherDeviceShutdownContext, which shuts down other
        #    network devices on the host.  Again, this is to ensure
        #    that test traffic goes over the modem
        #  * A cellular test environment context, which lets us
        #    interact with the cell network.

        with environment.DefaultCellularTestContext(config) as c:
            env = c.env
            flim = flimflam.FlimFlam()
            env.StartDefault(technology)
            network.ResetAllModems(flim)
            cell_tools.PrepareModemForTechnology('', technology)

            # TODO(rochberg) Need to figure out what isn't settling here.
            # Going to wait 'til after ResetAllModems changes land.
            time.sleep(10)

            # Clear all errors before we start.
            # Resetting the modem above may have caused some errors on the
            # 8960 (eg. lost connection, etc).
            env.emulator.ClearErrors()

            service = env.CheckedConnectToCellular()
            env.CheckHttpConnectivity()
            env.CheckedDisconnectFromCellular(service)
