1# -*- coding: utf-8 -*-
2# MinIO Python Library for Amazon S3 Compatible Cloud Storage,
3# (C) 2015, 2016 MinIO, Inc.
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9#     http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17import mock
18
19from nose.tools import eq_
20from unittest import TestCase
21
22from minio import Minio
23from minio.api import _DEFAULT_USER_AGENT
24
25from .minio_mocks import MockResponse, MockConnection
26
27class ListIncompleteUploadsTest(TestCase):
28    @mock.patch('urllib3.PoolManager')
29    def test_empty_list_uploads_test(self, mock_connection):
30        mock_data = '''<?xml version="1.0"?>
31                       <ListMultipartUploadsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
32                         <Bucket>golang</Bucket>
33                         <KeyMarker/>
34                         <UploadIdMarker/>
35                         <NextKeyMarker/>
36                         <NextUploadIdMarker/>
37                         <EncodingType/>
38                         <MaxUploads>1000</MaxUploads>
39                         <IsTruncated>false</IsTruncated>
40                         <Prefix/>
41                         <Delimiter/>
42                       </ListMultipartUploadsResult>
43                    '''
44        mock_server = MockConnection()
45        mock_connection.return_value = mock_server
46        mock_server.mock_add_request(
47            MockResponse('GET',
48                         'https://localhost:9000/bucket/?max-uploads=1000&prefix=&uploads=',
49                         {'User-Agent': _DEFAULT_USER_AGENT}, 200, content=mock_data))
50        client = Minio('localhost:9000')
51        upload_iter = client._list_incomplete_uploads('bucket', '', True, False)
52        uploads = []
53        for upload in upload_iter:
54            uploads.append(upload)
55        eq_(0, len(uploads))
56
57    @mock.patch('urllib3.PoolManager')
58    def test_list_uploads_works(self, mock_connection):
59        mock_data = '''<?xml version="1.0"?>
60                       <ListMultipartUploadsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
61                         <Bucket>golang</Bucket>
62                         <KeyMarker/>
63                         <UploadIdMarker/>
64                         <NextKeyMarker>keymarker</NextKeyMarker>
65                         <NextUploadIdMarker>uploadidmarker</NextUploadIdMarker>
66                         <EncodingType/>
67                         <MaxUploads>1000</MaxUploads>
68                         <IsTruncated>false</IsTruncated>
69                         <Upload>
70                           <Key>go1.4.2</Key>
71                           <UploadId>uploadid</UploadId>
72                           <Initiator>
73                             <ID/>
74                             <DisplayName/>
75                           </Initiator>
76                           <Owner>
77                             <ID/>
78                             <DisplayName/>
79                           </Owner>
80                           <StorageClass/>
81                           <Initiated>2015-05-30T14:43:35.349Z</Initiated>
82                         </Upload>
83                         <Upload>
84                           <Key>go1.5.0</Key>
85                           <UploadId>uploadid2</UploadId>
86                           <Initiator>
87                             <ID/>
88                             <DisplayName/>
89                           </Initiator>
90                           <Owner>
91                             <ID/>
92                             <DisplayName/>
93                           </Owner>
94                           <StorageClass/>
95                           <Initiated>2015-05-30T15:00:07.759Z</Initiated>
96                         </Upload>
97                         <Prefix/>
98                         <Delimiter/>
99                       </ListMultipartUploadsResult>
100                    '''
101        mock_server = MockConnection()
102        mock_connection.return_value = mock_server
103        mock_server.mock_add_request(
104            MockResponse('GET',
105                         'https://localhost:9000/bucket/?delimiter=%2F&max-uploads=1000&prefix=&uploads=',
106                         {'User-Agent': _DEFAULT_USER_AGENT},
107                         200, content=mock_data))
108
109        client = Minio('localhost:9000')
110        upload_iter = client._list_incomplete_uploads('bucket', '', False, False)
111        uploads = []
112        for upload in upload_iter:
113            uploads.append(upload)
114        eq_(2, len(uploads))
115
116    @mock.patch('urllib3.PoolManager')
117    def test_list_multipart_uploads_works(self, mock_connection):
118        mock_data1 = '''<?xml version="1.0"?>
119                        <ListMultipartUploadsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
120                          <Bucket>golang</Bucket>
121                          <KeyMarker/>
122                          <UploadIdMarker/>
123                          <NextKeyMarker>keymarker</NextKeyMarker>
124                          <NextUploadIdMarker>uploadidmarker</NextUploadIdMarker>
125                          <EncodingType/>
126                          <MaxUploads>1000</MaxUploads>
127                          <IsTruncated>true</IsTruncated>
128                          <Upload>
129                            <Key>go1.4.2</Key>
130                            <UploadId>uploadid</UploadId>
131                            <Initiator>
132                              <ID/>
133                              <DisplayName/>
134                            </Initiator>
135                            <Owner>
136                              <ID/>
137                              <DisplayName/>
138                            </Owner>
139                            <StorageClass/>
140                            <Initiated>2015-05-30T14:43:35.349Z</Initiated>
141                          </Upload>
142                          <Upload>
143                            <Key>go1.5.0</Key>
144                            <UploadId>uploadid2</UploadId>
145                            <Initiator>
146                              <ID/>
147                              <DisplayName/>
148                            </Initiator>
149                            <Owner>
150                              <ID/>
151                              <DisplayName/>
152                            </Owner>
153                            <StorageClass/>
154                            <Initiated>2015-05-30T15:00:07.759Z</Initiated>
155                          </Upload>
156                          <Prefix/>
157                          <Delimiter/>
158                        </ListMultipartUploadsResult>
159                     '''
160        mock_data2 = '''<?xml version="1.0"?>
161                        <ListMultipartUploadsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
162                          <Bucket>golang</Bucket>
163                          <KeyMarker/>
164                          <UploadIdMarker/>
165                          <NextKeyMarker/>
166                          <NextUploadIdMarker/>
167                          <EncodingType/>
168                          <MaxUploads>1000</MaxUploads>
169                          <IsTruncated>false</IsTruncated>
170                          <Upload>
171                            <Key>go1.4.2</Key>
172                            <UploadId>uploadid</UploadId>
173                            <Initiator>
174                              <ID/>
175                              <DisplayName/>
176                            </Initiator>
177                            <Owner>
178                              <ID/>
179                              <DisplayName/>
180                            </Owner>
181                            <StorageClass/>
182                            <Initiated>2015-05-30T14:43:35.349Z</Initiated>
183                          </Upload>
184                          <Upload>
185                            <Key>go1.5.0</Key>
186                            <UploadId>uploadid2</UploadId>
187                            <Initiator>
188                              <ID/>
189                              <DisplayName/>
190                            </Initiator>
191                            <Owner>
192                              <ID/>
193                              <DisplayName/>
194                            </Owner>
195                            <StorageClass/>
196                            <Initiated>2015-05-30T15:00:07.759Z</Initiated>
197                          </Upload>
198                          <Prefix/>
199                          <Delimiter/>
200                        </ListMultipartUploadsResult>
201                     '''
202        mock_server = MockConnection()
203        mock_connection.return_value = mock_server
204        mock_server.mock_add_request(
205            MockResponse('GET',
206                         'https://localhost:9000/bucket/?max-uploads=1000&prefix=&uploads=',
207                         {'User-Agent': _DEFAULT_USER_AGENT}, 200, content=mock_data1))
208
209        client = Minio('localhost:9000')
210        upload_iter = client._list_incomplete_uploads('bucket', '', True, False)
211        uploads = []
212        for upload in upload_iter:
213            mock_server.mock_add_request(MockResponse('GET',
214                                                      'https://localhost:9000/bucket/?'
215                                                      'key-marker=keymarker&'
216                                                      'max-uploads=1000&prefix=&'
217                                                      'upload-id-marker=uploadidmarker&uploads=',
218                                                      {'User-Agent': _DEFAULT_USER_AGENT}, 200, content=mock_data2))
219            uploads.append(upload)
220
221        eq_(4, len(uploads))
222