Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(155)

Side by Side Diff: third_party/gsutil/third_party/boto/tests/integration/s3/test_multipart.py

Issue 1377933002: [catapult] - Copy Telemetry's gsutilz over to third_party. (Closed) Base URL: https://github.com/catapult-project/catapult.git@master
Patch Set: Rename to gsutil. Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2011 Mitch Garnaat http://garnaat.org/
4 # All rights reserved.
5 #
6 # Permission is hereby granted, free of charge, to any person obtaining a
7 # copy of this software and associated documentation files (the
8 # "Software"), to deal in the Software without restriction, including
9 # without limitation the rights to use, copy, modify, merge, publish, dis-
10 # tribute, sublicense, and/or sell copies of the Software, and to permit
11 # persons to whom the Software is furnished to do so, subject to the fol-
12 # lowing conditions:
13 #
14 # The above copyright notice and this permission notice shall be included
15 # in all copies or substantial portions of the Software.
16 #
17 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
19 # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
20 # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21 # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
23 # IN THE SOFTWARE.
24
25 """
26 Some unit tests for the S3 MultiPartUpload
27 """
28
29 # Note:
30 # Multipart uploads require at least one part. If you upload
31 # multiple parts then all parts except the last part has to be
32 # bigger than 5M. Hence we just use 1 part so we can keep
33 # things small and still test logic.
34
35 import os
36 import unittest
37 import time
38 from boto.compat import StringIO
39
40 import mock
41
42 import boto
43 from boto.s3.connection import S3Connection
44
45
46 class S3MultiPartUploadTest(unittest.TestCase):
47 s3 = True
48
49 def setUp(self):
50 self.conn = S3Connection(is_secure=False)
51 self.bucket_name = 'multipart-%d' % int(time.time())
52 self.bucket = self.conn.create_bucket(self.bucket_name)
53
54 def tearDown(self):
55 for key in self.bucket:
56 key.delete()
57 self.bucket.delete()
58
59 def test_abort(self):
60 key_name = u"テスト"
61 mpu = self.bucket.initiate_multipart_upload(key_name)
62 mpu.cancel_upload()
63
64 def test_complete_ascii(self):
65 key_name = "test"
66 mpu = self.bucket.initiate_multipart_upload(key_name)
67 fp = StringIO("small file")
68 mpu.upload_part_from_file(fp, part_num=1)
69 fp.close()
70 cmpu = mpu.complete_upload()
71 self.assertEqual(cmpu.key_name, key_name)
72 self.assertNotEqual(cmpu.etag, None)
73
74 def test_complete_japanese(self):
75 key_name = u"テスト"
76 mpu = self.bucket.initiate_multipart_upload(key_name)
77 fp = StringIO("small file")
78 mpu.upload_part_from_file(fp, part_num=1)
79 fp.close()
80 cmpu = mpu.complete_upload()
81 self.assertEqual(cmpu.key_name, key_name)
82 self.assertNotEqual(cmpu.etag, None)
83
84 def test_list_japanese(self):
85 key_name = u"テスト"
86 mpu = self.bucket.initiate_multipart_upload(key_name)
87 rs = self.bucket.list_multipart_uploads()
88 # New bucket, so only one upload expected
89 lmpu = next(iter(rs))
90 self.assertEqual(lmpu.id, mpu.id)
91 self.assertEqual(lmpu.key_name, key_name)
92 # Abort using the one returned in the list
93 lmpu.cancel_upload()
94
95 def test_list_multipart_uploads(self):
96 key_name = u"テスト"
97 mpus = []
98 mpus.append(self.bucket.initiate_multipart_upload(key_name))
99 mpus.append(self.bucket.initiate_multipart_upload(key_name))
100 rs = self.bucket.list_multipart_uploads()
101 # uploads (for a key) are returned in time initiated asc order
102 for lmpu in rs:
103 ompu = mpus.pop(0)
104 self.assertEqual(lmpu.key_name, ompu.key_name)
105 self.assertEqual(lmpu.id, ompu.id)
106 self.assertEqual(0, len(mpus))
107
108 def test_get_all_multipart_uploads(self):
109 key1 = 'a'
110 key2 = 'b/c'
111 mpu1 = self.bucket.initiate_multipart_upload(key1)
112 mpu2 = self.bucket.initiate_multipart_upload(key2)
113 rs = self.bucket.get_all_multipart_uploads(prefix='b/', delimiter='/')
114 for lmpu in rs:
115 # only expect upload for key2 (mpu2) returned
116 self.assertEqual(lmpu.key_name, mpu2.key_name)
117 self.assertEqual(lmpu.id, mpu2.id)
118
119 def test_four_part_file(self):
120 key_name = "k"
121 contents = "01234567890123456789"
122 sfp = StringIO(contents)
123
124 # upload 20 bytes in 4 parts of 5 bytes each
125 mpu = self.bucket.initiate_multipart_upload(key_name)
126 mpu.upload_part_from_file(sfp, part_num=1, size=5)
127 mpu.upload_part_from_file(sfp, part_num=2, size=5)
128 mpu.upload_part_from_file(sfp, part_num=3, size=5)
129 mpu.upload_part_from_file(sfp, part_num=4, size=5)
130 sfp.close()
131
132 etags = {}
133 pn = 0
134 for part in mpu:
135 pn += 1
136 self.assertEqual(5, part.size)
137 etags[pn] = part.etag
138 self.assertEqual(pn, 4)
139 # etags for 01234
140 self.assertEqual(etags[1], etags[3])
141 # etags for 56789
142 self.assertEqual(etags[2], etags[4])
143 # etag 01234 != etag 56789
144 self.assertNotEqual(etags[1], etags[2])
145
146 # parts are too small to compete as each part must
147 # be a min of 5MB so so we'll assume that is enough
148 # testing and abort the upload.
149 mpu.cancel_upload()
150
151 # mpu.upload_part_from_file() now returns the uploaded part
152 # which makes the etag available. Confirm the etag is
153 # available and equal to the etag returned by the parts list.
154 def test_etag_of_parts(self):
155 key_name = "etagtest"
156 mpu = self.bucket.initiate_multipart_upload(key_name)
157 fp = StringIO("small file")
158 # upload 2 parts and save each part
159 uparts = []
160 uparts.append(mpu.upload_part_from_file(fp, part_num=1, size=5))
161 uparts.append(mpu.upload_part_from_file(fp, part_num=2))
162 fp.close()
163 # compare uploaded parts etag to listed parts
164 pn = 0
165 for lpart in mpu:
166 self.assertEqual(uparts[pn].etag, lpart.etag)
167 pn += 1
168 # Can't complete 2 small parts so just clean up.
169 mpu.cancel_upload()
170
171
172 class S3MultiPartUploadSigV4Test(unittest.TestCase):
173 s3 = True
174
175 def setUp(self):
176 self.env_patch = mock.patch('os.environ', {'S3_USE_SIGV4': True})
177 self.env_patch.start()
178 self.conn = boto.s3.connect_to_region('us-west-2')
179 self.bucket_name = 'multipart-%d' % int(time.time())
180 self.bucket = self.conn.create_bucket(self.bucket_name,
181 location='us-west-2')
182
183 def tearDown(self):
184 for key in self.bucket:
185 key.delete()
186 self.bucket.delete()
187 self.env_patch.stop()
188
189 def test_initiate_multipart(self):
190 key_name = "multipart"
191 multipart_upload = self.bucket.initiate_multipart_upload(key_name)
192 multipart_uploads = self.bucket.get_all_multipart_uploads()
193 for upload in multipart_uploads:
194 # Check that the multipart upload was created.
195 self.assertEqual(upload.key_name, multipart_upload.key_name)
196 self.assertEqual(upload.id, multipart_upload.id)
197 multipart_upload.cancel_upload()
198
199 def test_upload_part_by_size(self):
200 key_name = "k"
201 contents = "01234567890123456789"
202 sfp = StringIO(contents)
203
204 # upload 20 bytes in 4 parts of 5 bytes each
205 mpu = self.bucket.initiate_multipart_upload(key_name)
206 mpu.upload_part_from_file(sfp, part_num=1, size=5)
207 mpu.upload_part_from_file(sfp, part_num=2, size=5)
208 mpu.upload_part_from_file(sfp, part_num=3, size=5)
209 mpu.upload_part_from_file(sfp, part_num=4, size=5)
210 sfp.close()
211
212 etags = {}
213 pn = 0
214 for part in mpu:
215 pn += 1
216 self.assertEqual(5, part.size)
217 etags[pn] = part.etag
218 self.assertEqual(pn, 4)
219 # etags for 01234
220 self.assertEqual(etags[1], etags[3])
221 # etags for 56789
222 self.assertEqual(etags[2], etags[4])
223 # etag 01234 != etag 56789
224 self.assertNotEqual(etags[1], etags[2])
225
226 # parts are too small to complete as each part must
227 # be a min of 5MB so so we'll assume that is enough
228 # testing and abort the upload.
229 mpu.cancel_upload()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698