
                             S r SSKJr  SSKJr  SSKJr  SSKJr  SSKrSSKJr  SSK	J
r
  SS	KJr  SS
KJr  SSKJr  \R"                  (       a  \r " S S\5      r " S S\5      r " S S\5      rg)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                   .    \ rS rSrSrSS jrS rS rSrg)	
MockObject3   z-Defines a mock cloud storage provider object.c                     Xl         X l        g N)root_objectcontents)selfr   r   s      -platform/gsutil/gslib/tests/mock_cloud_api.py__init__MockObject.__init__6   s    "M    c                     U R                   R                  < SU R                   R                  < SU R                   R                  < 3$ )N/#)r   bucketname
generationr   s    r   __str__MockObject.__str__:   s8    ))00$2B2B2G2G))446 6r   c                     [        U 5      $ r   )strr   s    r   __repr__MockObject.__repr__>   s    t9r   )r   r   N )	__name__
__module____qualname____firstlineno____doc__r   r   r#   __static_attributes__ r   r   r   r   3   s    56r   r   c                   6    \ rS rSrSrSS jrS	S jrS	S jrSrg)

MockBucketB   z-Defines a mock cloud storage provider bucket.c                 |    [         R                  " U[         R                  R                  US9S9U l        0 U l        g )N)enabled)r   
versioning)apitools_messagesBucketVersioningValuer   objects)r   bucket_name	versioneds      r   r   MockBucket.__init__E   s9    (//$++;;I;NPD
 DLr   c           	      \    U R                  [        [        R                  " UUS95      5      $ )N)r   r   )CreateObjectWithMetadatar   r4   Object)r   object_namer   s      r   CreateObjectMockBucket.CreateObjectM   s3    (($++5=? 	@A Ar   c                    UR                   nU R                  R                  (       Ga4  U R                  R                  R                  (       Ga  UR                   U R                  ;   a  SU R                  U   ;   a  U R                  U   S   R                  R
                  S-   Ul        SU R                  U   ;  a  / U R                  U   S'   U R                  U   S   R                  U R                  U   S   5        OrSU R                  U   ;   aH  U R                  U   S   (       a1  U R                  U   S   S   R                  R
                  S-   Ul        OSUl        0 U R                  U'   [        XS9nX@R                  U   S'   U$ )a+  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   r9   r   )r   r   r3   r2   r7   r   appendr   )r   apitools_objectr   r>   
new_objects        r   r<   #MockBucket.CreateObjectWithMetadataR   sj    "&&K###(8(8(C(C(K(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;O?J(2LLf%r   )r7   r   N)Fr%   )	r'   r(   r)   r*   r+   r   r?   r<   r,   r-   r   r   r/   r/   B   s    5A
(r   r/   c                   R    \ rS rSrSrSS jrS rS rSS jrSS jr	   SS	 jr
S
rg)MockCloudApi}   zrSimple mock service for buckets/objects that implements Cloud API.

Also includes some setup functions for tests.
c                 <    0 U l         Xl        [        5       U l        g r   )bucketsproviderr   status_queue)r   rO   s     r   r   MockCloudApi.__init__   s    DLM,.Dr   c                 l    XR                   ;   a  [        SU-  SS9e[        U5      U R                   U'   g)<Creates a simple bucket without exercising the API directly.Bucket %s already exists.  statusNrN   r   r/   r   r8   s     r   MockCreateBucketMockCloudApi.MockCreateBucket   s7    ll"8;F$') ) *; 7DLLr   c                 j    XR                   ;   a  [        SU-  SS9e[        USS9U R                   U'   g)rS   rT   rU   rV   T)r9   NrX   rY   s     r   MockCreateVersionedBucket&MockCloudApi.MockCreateVersionedBucket   s9    ll"8;F$') ) *;$ GDLLr   c                 |    XR                   ;  a  U R                  U5        U R                   U   R                  X#S9  g)6Creates an object without exercising the API directly.rE   N)rN   rZ   r?   )r   r8   r>   r   s       r   MockCreateObjectMockCloudApi.MockCreateObject   s4    ,,&
K(LL**;*Jr   c                 ,   UR                   (       d   S5       eUR                  (       d   S5       eUR                   U R                  ;  a  U R                  UR                   5        U R                  UR                      R	                  XS9R
                  $ )r`   z#No bucket specified for mock objectz(No object name specified for mock objectrE   )r   r   rN   rZ   r<   r   )r   rG   r   s      r   MockCreateObjectWithMetadata)MockCloudApi.MockCreateObjectWithMetadata   s    !!H#HH!K!KKT\\1
O223<<../HH I ,,7K8r   Nc                    U(       a  [        U5      nXR                  ;   Ga.  U R                  U   nX&R                  ;   a  UR                  U   (       a  U(       a  SUR                  U   ;   aA  UR                  U   S    H+  nUR                  R                  U:X  d  M  UR                  s  $    SUR                  U   ;   aF  UR                  U   S   R                  R                  U:X  a  UR                  U   S   R                  $ O/SUR                  U   ;   a  UR                  U   S   R                  $ [        SU R                  UU5      e[        SU R                  U5      e)z,See CloudApi class for function doc strings.r9   rB   i  )longrN   r7   r   r   r   rO   r
   )r   r8   r>   r   rO   fieldsr   objs           r   GetObjectMetadataMockCloudApi.GetObjectMetadata   s4    
#jll"||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   )rN   rO   rP   )gsr%   )NNN)r'   r(   r)   r*   r+   r   rZ   r]   ra   rd   rj   r,   r-   r   r   rK   rK   }   s3    
/
8HK8 $(!%#Ir   rK   )r+   
__future__r   r   r   r   sixgslib.cloud_apir   gslib.discard_messages_queuer   "gslib.third_party.storage_apitoolsr	   r4   gslib.utils.translation_helperr
   r   PY3intrg   objectr   r/   rK   r-   r   r   <module>rv      s_   ( ' %  ' 
 , = W H H77	$ 8 8vDI6 DIr   