#!/usr/bin/python2

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

"""HTTPlistener unittest."""

import logging, os, sys, threading, urllib, unittest

from httpd import HTTPListener, SecureHTTPListener

GET_TEST_PATH = '/get_test'

def run_get_test(test_server, url):
    err = 1
    get_done = test_server.add_wait_url(GET_TEST_PATH)
    get_resp = ''
    try:
        get_resp = urllib.urlopen(url).read()
    except IOError, e:
        pass
    if not (get_done.is_set() and get_resp):
        print 'FAILED'
    else:
        print 'PASSED'
        err = 0
    return err


def test():
    test_server = HTTPListener(8000, docroot='/tmp')
    post_done = test_server.add_wait_url("/post_test",
                                         matchParams={'test': 'passed'})
    def _Spam():
        while not post_done.is_set():
            print 'TEST: server running'
            post_done.wait()
        return
    test_server.run()
    t = threading.Thread(target=_Spam).start()
    params = urllib.urlencode({'test': 'passed'})
    err = 1

    # TODO(seano): This test doesn't seem to pass.
    post_resp = ''
    try:
        post_resp = urllib.urlopen('http://localhost:8000/post_test',
                                   params).read()
    except IOError, e:
        pass
    if not (post_done.is_set() and
            test_server.get_form_entries()['test'] != 'passed'):
        print 'FAILED'
    else:
        print 'PASSED'
        err = 0


    err = run_get_test(test_server, 'http://localhost:8000' + GET_TEST_PATH)
    test_server.stop()
    if err != 0:
        return err

    creds_path = (os.path.dirname(os.path.realpath( __file__)) +
                  '/httpd_unittest_server')
    ssl_port=50000
    test_server = SecureHTTPListener(port=ssl_port,
                                     cert_path=(creds_path+'.pem'),
                                     key_path=(creds_path+'.key'))
    test_server.run()
    err = run_get_test(test_server,
                       'https://localhost:%d%s' % (ssl_port, GET_TEST_PATH))
    test_server.stop()
    return err


def run_server():
    """Example method showing how to start a HTTPListener."""
    test_server = HTTPListener(8000, docroot='/tmp')
    latch = test_server.add_wait_url('/quitquitquit')
    test_server.run()
    logging.info('server started')
    while not latch.is_set():
        try:
            latch.wait(1)
        except KeyboardInterrupt:
            sys.exit()
    test_server.stop()
    return


if __name__ == '__main__':
    if len(sys.argv) > 1:
        run_server()
    else:
        test()


if __name__ == '__main__':
    unittest.main()
