# 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)

  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')
