# Copyright 2015 The Chromium 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
import time

from autotest_lib.client.bin import test, utils
from autotest_lib.client.common_lib import error
from autotest_lib.client.common_lib.cros import chrome
from autotest_lib.client.common_lib.cros.network import interface

_CLIENT_COMPLETE_FLAG = '/tmp/network_FirewallHolePunch'

class network_FirewallHolePunch(test.test):
    """Tests that controls an app that can open ports."""
    version = 1
    preserve_srcdir = True


    def setup(self):
        """Sets the current directory so the app can be accessed."""
        os.chdir(self.srcdir)
        self.extension_path = os.path.join(os.path.dirname(__file__),
                                           'src/tcpserver')


    def wait_for_server_command(self):
        """Waits for the server to send a command.

        @returns True if the server responds to the request; False otherwise.

        """
        for i in range(30):
            result = utils.run('ls %s' %  _CLIENT_COMPLETE_FLAG,
                               ignore_status=True)
            if result.exit_status != 0:
                return True
            time.sleep(1)
        return False


    def interpret_command(self, command, test_error):
        """Takes the string command and performs the appropriate action.

        @param command: the command string
        @param test_error: string of the test error message


        @raises TestError if the server does not set the flag or if an
                invalid command is passed.
        """
        if self.wait_for_server_command() is False:
            raise error.TestError(test_error)

        if command == 'launch app':
            self.extension = self.cr.get_extension(self.extension_path)
            self.extension.ExecuteJavaScript('tcpUI.create();')
        elif command == 'start server':
            script = str('tcpUI.startServer("%s", %d);' %
                         (self.ip_address, self.port))
            self.extension.ExecuteJavaScript(script)
        elif command == 'stop server':
            self.extension.ExecuteJavaScript('tcpUI.stopServer();')
        elif command == 'exit app':
            script = 'commandWindow.contentWindow.close();'
            self.extension.ExecuteJavaScript(script)
            self.extension.ExecuteJavaScript('close();')
        elif command == 'logout':
            self.cr.browser.Close()
        elif command == 'login':
            flag = '--enable-firewall-hole-punching'
            self.cr = chrome.Chrome(extension_paths=[self.extension_path],
                                    extra_browser_args=flag)
        else:
            raise error.TestError('Invalid client command passed.')

        utils.run('touch %s' % _CLIENT_COMPLETE_FLAG)


    def run_once(self, test_sequence=None, port=8888):
        """Runs the integration test."""

        # Throw if no test sequence
        if not test_sequence:
            raise error.TestError('No test sequence was passed to client.')

        # Get the IP Address of the DUT
        ethernet = interface.Interface.get_connected_ethernet_interface()
        self.ip_address = ethernet.ipv4_address
        self.port = port

        self.cr = None
        self.extension = None

        for command in test_sequence:
            self.interpret_command(command['client_command'],
                                   command['client_error'])

