import time
from tornado import gen
from tornado.httpclient import AsyncHTTPClient
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from tornado.options import define, options, parse_command_line
from tornado.testing import bind_unused_port
from tornado.web import Application, RequestHandler
import tornado_http2.client
import tornado_http2.server


define('n', default=1000)
define('versions', multiple=True, default=['1', '2'])


class HelloHandler(RequestHandler):
    def get(self):
        self.write("Hello world")


@gen.coroutine
def benchmark(version):
    app = Application([('/', HelloHandler)])
    if version == 1:
        server = HTTPServer(app)
        client = AsyncHTTPClient()
    elif version == 2:
        server = tornado_http2.server.CleartextHTTP2Server(app)
        client = tornado_http2.client.ForceHTTP2Client()

    sock, port = bind_unused_port()
    try:
        server.add_socket(sock)
        url = 'http://localhost:%d/' % port

        start = time.time()
        for i in range(options.n):
            yield client.fetch(url)
        end = time.time()
        return end - start
    finally:
        server.stop()
        sock.close()


def print_result(label, elapsed):
    print('HTTP/%s: %d requests in %0.3fs: %f QPS' % (label, options.n, elapsed,
          options.n / elapsed))


@gen.coroutine
def main():
    options.logging = "warning"
    parse_command_line()

    for version in options.versions:
        elapsed = yield benchmark(int(version))
        print_result(version, elapsed)

if __name__ == '__main__':
    IOLoop.current().run_sync(main)