# Copyright (c) 2010 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 errno, logging, os, stat, time
from autotest_lib.client.bin import utils
from autotest_lib.client.common_lib import error
from autotest_lib.client.cros import constants, cros_ui, cros_ui_test
from autotest_lib.client.cros import httpd, login, pyauto_test

def respond_with_cookies(handler, url_args):
    """Responds with a Set-Cookie header to any GET request, and redirects
    to a chosen URL.
    """
    handler.send_response(303)
    handler.send_header('Set-Cookie', 'name=value')
    handler.send_header('Location', url_args['continue'][0])
    handler.end_headers()
    handler.wfile.write('Got form data:\n')
    handler.wfile.write('%s:\n' % url_args)


class login_ChromeProfileSanitary(cros_ui_test.UITest):
    version = 1


    def __get_cookies_mtime(self):
        try:
            cookies_info = os.stat(constants.LOGIN_PROFILE + '/Cookies')
            return cookies_info[stat.ST_MTIME]
        except OSError as e:
            if e.errno == errno.ENOENT:
                return None
            raise


    def initialize(self, creds='$default'):
        spec = 'http://localhost:8000'
        path = '/set_cookie'
        self._wait_path = '/test_over'
        self._test_url = spec + path + '?continue=' + spec + self._wait_path
        self._testServer = httpd.HTTPListener(8000, docroot=self.srcdir)
        self._testServer.add_url_handler('/set_cookie', respond_with_cookies)
        self._testServer.run()
        super(login_ChromeProfileSanitary, self).initialize(creds)


    def cleanup(self):
        self._testServer.stop()
        cros_ui_test.UITest.cleanup(self)


    def run_once(self, timeout=10):
        # Get Default/Cookies mtime.
        cookies_mtime = self.__get_cookies_mtime()

        # Wait for chrome to show, then "crash" it.
        utils.nuke_process_by_name(constants.BROWSER, with_prejudice=True)

        # Re-connect to automation channel.
        self.pyauto.setUp()

        # Navigate to site that leaves cookies.
        if not self.logged_in():
            raise error.TestError('Logged out unexpectedly!')
        latch = self._testServer.add_wait_url(self._wait_path)
        self.pyauto.NavigateToURL(self._test_url)
        latch.wait(timeout)  # Redundant, but not a problem.
        if not latch.is_set():
            raise error.TestError('Never received callback from browser.')

        # Ensure chrome writes state to disk.
        self.logout()
        self.login()

        # Check mtime of Default/Cookies.  If changed, KABLOOEY.
        new_cookies_mtime = self.__get_cookies_mtime()

        if new_cookies_mtime and cookies_mtime != new_cookies_mtime:
            raise error.TestFail('Cookies in Default profile changed!')
