import socket

import requests

import tests.common
from tests.common import eq, stop_server


server = None


def setup():
  global server
  server = tests.common.start_server("tests/s_asgi.py")
  if not server:
    return 1
  return 0


def setup_module(module):
  assert setup() == 0


def test_asgi_http():
  r = requests.get("http://localhost:8080/")
  eq(r.status_code, 200)
  eq(r.text, "hello asgi")
  eq(r.headers["content-type"], "text/plain")

  r = requests.post("http://localhost:8080/echo", data=b"posted")
  eq(r.status_code, 200)
  eq(r.content, b"posted")

  sock = socket.create_connection(("127.0.0.1", 8080), timeout=3)
  try:
    sock.sendall(
      b"GET /scope?x=1 HTTP/1.1\r\n"
      b"Host: localhost\r\n"
      b"X-Dup: one\r\n"
      b"X-Dup: two\r\n"
      b"\r\n"
    )
    data = sock.recv(4096)
    assert b"\r\n\r\nGET|/scope|/scope|x=1|2|True" in data, data
  finally:
    sock.close()


def test_chunked_request_body():
  sock = socket.create_connection(("127.0.0.1", 8080), timeout=3)
  try:
    sock.sendall(
      b"POST /echo HTTP/1.1\r\n"
      b"Host: localhost\r\n"
      b"Transfer-Encoding: chunked\r\n"
      b"\r\n"
      b"4\r\nWiki\r\n"
      b"5\r\npedia\r\n"
      b"0\r\n\r\n"
    )
    data = sock.recv(4096)
    assert b"\r\n\r\nWikipedia" in data, data
  finally:
    sock.close()


def teardown():
  global server
  proc = server
  server = None
  stop_server(proc)
  if proc is not None:
    try:
      proc.wait(timeout=2)
    except Exception:
      pass
    if proc.stdout:
      proc.stdout.close()
    if proc.stderr:
      proc.stderr.close()


def teardown_module(module):
  teardown()
