
                             d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlZddlmZ ddl	m
Z
 dd	lmZ dd
lmZ ddlmZ ej"                  reZ G d de      Z G d de      Z G d de      Zy)a  Implements a simple mock gsutil Cloud API for unit testing.

gsutil 4 was primarily unit-tested using boto/gsutil 3's mock storage_uri class,
since it was possible that changing out the underlying mocks would have had
subtly different behavior and increased the risk of breaking back-compat.

Most unit and integration tests in gsutil 4 still set up the test objects with
storage_uris and boto, and the unit tests interact with test objects via
storage uris and boto.

This testing approach ties our tests heavily to boto; extending the
boto mocks is difficult because it requires checking into boto. This also
makes the unit test coverage boto-specific in several cases.

MockCloudApi was initially written to cover some parallel composite upload
cases that the boto mocks couldn't handle. It is not yet a full implementation.
Eventually, we can move to full a mock Cloud API implementation. However, we
need to ensure we don't lose boto coverage from mock storage_uri.
    )absolute_import)print_function)division)unicode_literalsN)ServiceException)DiscardMessagesQueue)storage_v1_messages)CreateBucketNotFoundException)CreateObjectNotFoundExceptionc                   $    e Zd ZdZddZd Zd Zy)
MockObjectz-Defines a mock cloud storage provider object.c                      || _         || _        y N)root_objectcontents)selfr   r   s      -platform/gsutil/gslib/tests/mock_cloud_api.py__init__zMockObject.__init__6   s    "DDM    c                     | j                   j                  d| j                   j                  d| j                   j                  S )N/#)r   bucketname
generationr   s    r   __str__zMockObject.__str__:   s8    ))00$2B2B2G2G))446 6r   c                     t        |       S r   )strr   s    r   __repr__zMockObject.__repr__>   s    t9r   N )__name__
__module____qualname____doc__r   r   r     r   r   r   r   3   s    56r   r   c                   (    e Zd ZdZddZddZddZy)
MockBucketz-Defines a mock cloud storage provider bucket.c                     t        j                  |t         j                  j                  |            | _        i | _        y )N)enabled)r   
versioning)apitools_messagesBucketVersioningValuer   objects)r   bucket_name	versioneds      r   r   zMockBucket.__init__E   s9    (//$++;;I;NPD
 DLr   c                 `    | j                  t        t        j                  ||                  S )N)r   r   )CreateObjectWithMetadatar   r-   Object)r   object_namer   s      r   CreateObjectzMockBucket.CreateObjectM   s3    (($++5=? 	@A Ar   c                    |j                   }| j                  j                  r"| j                  j                  j                  r|j                   | j                  v rd| j                  |   v r| j                  |   d   j                  j
                  dz   |_        d| j                  |   vrg | j                  |   d<   | j                  |   d   j                  | j                  |   d          nkd| j                  |   v rZ| j                  |   d   rH| j                  |   d   d   j                  j
                  dz   |_        nd|_        i | j                  |<   t        ||      }|| j                  |   d<   |S )aK  Creates an object in the bucket according to the input metadata.

    This will create a new object version (ignoring the generation specified
    in the input object).

    Args:
      apitools_object: apitools Object.
      contents: optional object contents.

    Returns:
      apitools Object representing created object.
    live   r2   r   )r   r   r,   r+   r0   r   appendr   )r   apitools_objectr   r6   
new_objects        r   r4   z#MockBucket.CreateObjectWithMetadataR   sg    "&&K##(8(8(C(C(K(K,	4<<,	, LL%f-99DDqH 	" dll;7735$,,{
#K
0[!+.55LL%f-	/4<<44LL%k2 LL%k226BBMM 	"
 $%o "$dll;Oh?J(2DLLf%r   N)Fr!   )r#   r$   r%   r&   r   r7   r4   r'   r   r   r)   r)   B   s    5A
(r   r)   c                   B    e Zd ZdZd	dZd Zd Zd
dZd
dZ	 	 	 ddZ	y)MockCloudApizvSimple mock service for buckets/objects that implements Cloud API.

  Also includes some setup functions for tests.
  c                 >    i | _         || _        t               | _        y r   )bucketsproviderr   status_queue)r   rD   s     r   r   zMockCloudApi.__init__   s    DLDM,.Dr   c                 p    || j                   v rt        d|z  d      t        |      | j                   |<   y)<Creates a simple bucket without exercising the API directly.Bucket %s already exists.  statusNrC   r   r)   r   r1   s     r   MockCreateBucketzMockCloudApi.MockCreateBucket   s9    dll"8;F$') ) *; 7DLLr   c                 t    || j                   v rt        d|z  d      t        |d      | j                   |<   y)rG   rH   rI   rJ   T)r2   NrL   rM   s     r   MockCreateVersionedBucketz&MockCloudApi.MockCreateVersionedBucket   s;    dll"8;F$') ) *;$ GDLLr   c                     || j                   vr| j                  |       | j                   |   j                  ||       y)6Creates an object without exercising the API directly.r<   N)rC   rN   r7   )r   r1   r6   r   s       r   MockCreateObjectzMockCloudApi.MockCreateObject   s8    $,,&
K(LL**;*Jr   c                    |j                   sJ d       |j                  sJ d       |j                   | j                  vr| j                  |j                          | j                  |j                      j	                  ||      j
                  S )rR   z#No bucket specified for mock objectz(No object name specified for mock objectr<   )r   r   rC   rN   r4   r   )r   r>   r   s      r   MockCreateObjectWithMetadataz)MockCloudApi.MockCreateObjectWithMetadata   s    !!H#HH!K!KKT\\1
O223<<../HH( I ,,7K8r   Nc                    |rt        |      }|| j                  v r| j                  |   }||j                  v r|j                  |   r|rd|j                  |   v r>|j                  |   d   D ])  }|j                  j                  |k(  s|j                  c S  d|j                  |   v rr|j                  |   d   j                  j                  |k(  rI|j                  |   d   j                  S d|j                  |   v r|j                  |   d   j                  S t        d| j                  ||      t        d| j                  |      )z,See CloudApi class for function doc strings.r2   r9   i  )longrC   r0   r   r   r   rD   r
   )r   r1   r6   r   rD   fieldsr   objs           r   GetObjectMetadatazMockCloudApi.GetObjectMetadata   s7    
#jdll"||K(f		&6>>++FFNN;77~~k2;?++z9& @ v~~k22{+F3??JJ^^K08DDD v~~k22>>+.v6BBB)#t}}k*57 7
'T]]K
HHr   )gsr!   )NNN)
r#   r$   r%   r&   r   rN   rP   rS   rU   rZ   r'   r   r   rA   rA   }   s3    
/
8HK8 $(!%#Ir   rA   )r&   
__future__r   r   r   r   sixgslib.cloud_apir   gslib.discard_messages_queuer   "gslib.third_party.storage_apitoolsr	   r-   gslib.utils.translation_helperr
   r   PY3intrW   objectr   r)   rA   r'   r   r   <module>re      s_   ( ' %  ' 
 , = W H H77	$ 8 8vDI6 DIr   