普通文本  |  102行  |  2.69 KB

#!/usr/bin/python

# 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()