# Copyright 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

DEPS = [
  'gsutil',
  'recipe_engine/path',
]


def RunSteps(api):
  """Move things around in a loop!"""
  local_file = api.path['tmp_base'].join('boom')
  bucket = 'example'
  cloud_file = 'some/random/path/to/boom'

  api.gsutil.upload(local_file, bucket, cloud_file,
      metadata={
        'Test-Field': 'value',
        'Remove-Me': None,
        'x-custom-field': 'custom-value',
        'Cache-Control': 'no-cache',
      },
      unauthenticated_url=True)

  # Upload without retry wrapper.
  api.gsutil.upload(local_file, bucket, cloud_file,
      metadata={
        'Test-Field': 'value',
        'Remove-Me': None,
        'x-custom-field': 'custom-value',
        'Cache-Control': 'no-cache',
      },
      unauthenticated_url=True,
      parallel_upload=True,
      multithreaded=True,
      use_retry_wrapper=False)

  # Upload directory contents.
  api.gsutil.upload(
      api.path['tmp_base'],
      bucket,
      'some/random/path',
      args=['-r'],
      name='upload -r')
  api.gsutil.upload(
      api.path['tmp_base'],
      bucket,
      'some/other/random/path',
      args=['--recursive'],
      name='upload --recursive')

  api.gsutil(['cp',
                    'gs://%s/some/random/path/**' % bucket,
                    'gs://%s/staging' % bucket])

  api.gsutil(['cp',
                    'gs://%s/some/random/path/**' % bucket,
                    'gs://%s/staging' % bucket], version='3.25')

  api.gsutil.download_url(
      'https://storage.cloud.google.com/' + bucket + '/' + cloud_file,
      local_file,
      name='gsutil download url')

  # Non-normalized URL.
  try:
    api.gsutil.download_url(
        'https://someotherservice.localhost',
        local_file,
        name='gsutil download url')
  except AssertionError:
    pass

  new_cloud_file = 'staging/to/boom'
  new_local_file = api.path['tmp_base'].join('erang')
  api.gsutil.download(bucket, new_cloud_file, new_local_file)

  private_key_file = 'path/to/key'
  _signed_url = api.gsutil.signurl(private_key_file, bucket, cloud_file,
                                  name='signed url')
  api.gsutil.remove_url('gs://%s/%s' % (bucket, new_cloud_file))

  api.gsutil.list('gs://%s/foo' % bucket)
  api.gsutil.copy(bucket, cloud_file, bucket, new_cloud_file)

  api.gsutil.cat('gs://%s/foo' % bucket)

  api.gsutil.stat('gs://%s/foo' % bucket)

def GenTests(api):
  yield api.test('basic')
