text: """Proxy tests.
  
  Tests do modify `os.environ` global states. Each test must be run in separate
  process. Must use `pytest --forked` or similar technique.
  """
  
  from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  
  import httplib2
  import mock
  import os
  import pytest
  import socket
  import tests
  from six.moves import urllib
  
  
  def _raise_name_not_known_error(*args, **kwargs):
      raise socket.gaierror(socket.EAI_NONAME, "Name or service not known")
  
  
  def test_from_url():
      pi = httplib2.proxy_info_from_url("http://myproxy.example.com")
      assert pi.proxy_host == "myproxy.example.com"
      assert pi.proxy_port == 80
      assert pi.proxy_user is None
  
  
  def test_from_url_ident():
      pi = httplib2.proxy_info_from_url("http://zoidberg:fish@someproxy:99")
      assert pi.proxy_host == "someproxy"
      assert pi.proxy_port == 99
      assert pi.proxy_user == "zoidberg"
      assert pi.proxy_pass == "fish"
  
  
  def test_from_env():
      os.environ["http_proxy"] = "http://myproxy.example.com:8080"
      pi = httplib2.proxy_info_from_environment()
      assert pi.proxy_host == "myproxy.example.com"
      assert pi.proxy_port == 8080
  
  
  def test_from_env_https():
      os.environ["http_proxy"] = "http://myproxy.example.com:80"
      os.environ["https_proxy"] = "http://myproxy.example.com:81"
      pi = httplib2.proxy_info_from_environment("https")
      assert pi.proxy_host == "myproxy.example.com"
      assert pi.proxy_port == 81
  
  
  def test_from_env_none():
      os.environ.clear()
      pi = httplib2.proxy_info_from_environment()
      assert pi is None
  
  
  def test_applies_to():
      os.environ["http_proxy"] = "http://myproxy.example.com:80"
      os.environ["https_proxy"] = "http://myproxy.example.com:81"
      os.environ["no_proxy"] = "localhost,example.com,.wildcard"
      pi = httplib2.proxy_info_from_environment()
      assert not pi.applies_to("localhost")
      assert pi.applies_to("www.google.com")
      assert pi.applies_to("prefixlocalhost")
      assert pi.applies_to("www.example.com")
      assert pi.applies_to("sub.example.com")
      assert not pi.applies_to("sub.wildcard")
      assert not pi.applies_to("pub.sub.wildcard")
  
  
  def test_noproxy_trailing_comma():
      os.environ["http_proxy"] = "http://myproxy.example.com:80"
      os.environ["no_proxy"] = "localhost,other.host,"
      pi = httplib2.proxy_info_from_environment()
      assert not pi.applies_to("localhost")
      assert not pi.applies_to("other.host")
      assert pi.applies_to("example.domain")
  
  
  def test_noproxy_star():
      os.environ["http_proxy"] = "http://myproxy.example.com:80"
      os.environ["NO_PROXY"] = "*"
      pi = httplib2.proxy_info_from_environment()
      for host in ("localhost", "169.254.38.192", "www.google.com"):
          assert not pi.applies_to(host)
  
  
  def test_headers():
      headers = {"key0": "val0", "key1": "val1"}
      pi = httplib2.ProxyInfo(
          httplib2.socks.PROXY_TYPE_HTTP, "localhost", 1234, proxy_headers=headers
      )
      assert pi.proxy_headers == headers
  
  
  @pytest.mark.skipif(
      os.environ.get("TRAVIS_PYTHON_VERSION") in ("2.7", "pypy"),
      reason="Fails on Travis py27/pypy, works elsewhere. "
      "See https://travis-ci.org/httplib2/httplib2/jobs/408769880.",
  )
  @mock.patch("socket.socket.connect", spec=True)
  def test_server_not_found_error_is_raised_for_invalid_hostname(mock_socket_connect):
      """Invalidates https://github.com/httplib2/httplib2/pull/100."""
      mock_socket_connect.side_effect = _raise_name_not_known_error
      http = httplib2.Http(
          proxy_info=httplib2.ProxyInfo(
              httplib2.socks.PROXY_TYPE_HTTP, "255.255.255.255", 8001
          )
      )
      with tests.assert_raises(httplib2.ServerNotFoundError):
          http.request("http://invalid.hostname.foo.bar/", "GET")
  
  
  def test_auth_str_bytes():
      # https://github.com/httplib2/httplib2/pull/115
      # Proxy-Authorization b64encode() TypeError: a bytes-like object is required, not 'str'
      with tests.server_const_http(request_count=2) as uri:
          uri_parsed = urllib.parse.urlparse(uri)
          http = httplib2.Http(
              proxy_info=httplib2.ProxyInfo(
                  httplib2.socks.PROXY_TYPE_HTTP,
                  proxy_host=uri_parsed.hostname,
                  proxy_port=uri_parsed.port,
                  proxy_rdns=True,
                  proxy_user=u"user_str",
                  proxy_pass=u"pass_str",
              )
          )
          response, _ = http.request(uri, "GET")
          assert response.status == 200
  
      with tests.server_const_http(request_count=2) as uri:
          uri_parsed = urllib.parse.urlparse(uri)
          http = httplib2.Http(
              proxy_info=httplib2.ProxyInfo(
                  httplib2.socks.PROXY_TYPE_HTTP,
                  proxy_host=uri_parsed.hostname,
                  proxy_port=uri_parsed.port,
                  proxy_rdns=True,
                  proxy_user=b"user_bytes",
                  proxy_pass=b"pass_bytes",
              )
          )
          response, _ = http.request(uri, "GET")
          assert response.status == 200
  