# 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.

"""GoogleAuthServer unittest."""

import os, unittest, urllib

import constants as chromeos_constants
from auth_server import GoogleAuthServer

class test_auth_server(unittest.TestCase):
    def setUp(self):
        print "starting"
        self._normal_port = 50020
        self._ssl_port = 50030
        creds_path = (os.path.dirname(os.path.realpath( __file__)) +
                      '/httpd_unittest_server')

        self._test_server = GoogleAuthServer(port=self._normal_port,
                                             ssl_port=self._ssl_port,
                                             cert_path=(creds_path+'.pem'),
                                             key_path=(creds_path+'.key'))
        self._test_server.run()


    def tearDown(self):
        print "tearing down"
        self._test_server.stop()


    def test_client_login(self):
        args = urllib.urlencode({'Email': 'me@example.com', 'Passwd': 'fake'})
        try:
            cl_resp = urllib.urlopen(
                'https://localhost:%s%s' %
                (self._ssl_port, chromeos_constants.CLIENT_LOGIN_URL),
                args).read()
        except IOError:
            pass
        self._test_server.wait_for_client_login()
        return cl_resp


    def test_issue_token(self):
        args = self.test_client_login().replace('\n','&')
        try:
            it_resp = urllib.urlopen('https://localhost:%s%s' %
                                     (self._ssl_port,
                                      chromeos_constants.ISSUE_AUTH_TOKEN_URL),
                                     args).read()
        except IOError:
            pass
        self._test_server.wait_for_issue_token()
        return it_resp


    def test_token_auth(self):
        args = self.test_issue_token()
        try:
            ta_format = ('https://localhost:%s%s?auth=%s&' +
                         'continue=https://localhost:%s/webhp')
            urllib.urlopen(
                ta_format % (self._ssl_port,
                             chromeos_constants.TOKEN_AUTH_URL,
                             args,
                             self._ssl_port)).read()
        except IOError:
            pass
        self._test_server.wait_for_test_over()
