# Copyright 2017 The LUCI Authors. All rights reserved.
# Use of this source code is governed under the Apache License, Version 2.0
# that can be found in the LICENSE file.

DEPS = [
  'context',
  'path',
  'step',
  'url',
]

# NOTE: These examples *probably work*. They're not run as part of regular
# production testing, but they do access live resources that are available
# and functional at the time of writing this.
#
# If this test actually fails, please adjust the URLs to achieve the same
# effect.
TEST_HTTPS_URL = 'https://chromium.org'
TEST_HTTP_URL = 'http://chromium.org'
TEST_ERROR_URL = 'http://httpstat.us/500'
TEST_JSON_URL = 'https://chromium.googlesource.com/infra/infra?format=JSON'
TEST_BAD_CERTS = [
    'https://wrong.host.badssl.com/',
    'https://expired.badssl.com/',
]

def RunSteps(api):
  assert api.url.quote('~foo') == '%7Efoo'
  assert api.url.unquote('%7Efoo') == '~foo'
  assert api.url.urlencode({'foo': 'bar'}) == 'foo=bar'

  # get_file
  dest = api.path['start_dir'].join('download.bin')
  v = api.url.get_file(TEST_HTTPS_URL, dest,
                       headers={'Authorization': 'thing'})
  assert str(v.output) == str(dest)

  # get_text (HTTP)
  v = api.url.get_text(TEST_HTTP_URL, default_test_data='will be overridden')
  assert v.method == 'GET'
  assert 'The Chromium Projects' in v.output
  assert v.size == len(v.output)
  assert v.status_code == 200

  v = api.url.get_text(TEST_HTTP_URL, default_test_data='The Chromium Projects')
  assert 'The Chromium Projects' in v.output
  assert v.size == len(v.output)
  assert v.status_code == 200

  # get_json (HTTPS)
  v = api.url.get_json(TEST_JSON_URL, log=True,
      strip_prefix=api.url.GERRIT_JSON_PREFIX)
  assert isinstance(v.output, dict)
  assert v.status_code == 200

  v = api.url.get_json(TEST_JSON_URL,
      strip_prefix=api.url.GERRIT_JSON_PREFIX,
      default_test_data={'pants': 'shirt'})
  assert isinstance(v.output, dict)
  assert v.status_code == 200

  # Check error conditions.
  def raises(fn, exc):
    raised = None
    try:
      fn()
    except exc as e:
      raised = e
    assert raised, 'Did not raise [%s]' % (exc,)
    return raised

  def test_error():
    api.url.get_text(TEST_ERROR_URL, step_name='error', transient_retry=4)
  exc = raises(test_error, api.url.HTTPError)
  assert exc.response.error_body == '500 Internal Server Error'

  def test_infra_error():
    with api.context(infra_steps=True):
      api.url.get_text(TEST_ERROR_URL, step_name='infra error',
                       transient_retry=False)
  exc = raises(test_infra_error, api.url.InfraHTTPError)
  assert exc.response.error_body == '500 Internal Server Error'

  def test_auth_over_http():
    api.url.get_text('http://foo/bar/text/error',
                     headers={'Authorization': 'SECRET'})
  raises(test_auth_over_http, ValueError)

  for bad_cert in TEST_BAD_CERTS:
    def test_bad_cert():
      api.url.get_text(bad_cert)
    raises(test_bad_cert, api.step.StepFailure)


def GenTests(api):
  def get(url):
    return 'GET %s' % (url,)

  test = (
      api.test('basic') +
      api.url.text(get(TEST_HTTP_URL), '<html>The Chromium Projects</html>') +
      api.url.json(get(TEST_JSON_URL), {'is_json': True}) +

      api.url.error('error', 500, body='500 Internal Server Error') +
      api.url.error('infra error', 500, body='500 Internal Server Error')
  )
  for bad_cert in TEST_BAD_CERTS:
    test += api.step_data('GET ' + bad_cert, retcode=1)
  yield test
