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

Side by Side Diff: third_party/gsutil/gslib/tests/test_naming.py

Issue 12317103: Added gsutil to depot tools (Closed) Base URL: https://chromium.googlesource.com/chromium/tools/depot_tools.git@master
Patch Set: added readme Created 7 years, 9 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 # Copyright 2010 Google Inc. All Rights Reserved.
2 #
3 # Permission is hereby granted, free of charge, to any person obtaining a
4 # copy of this software and associated documentation files (the
5 # "Software"), to deal in the Software without restriction, including
6 # without limitation the rights to use, copy, modify, merge, publish, dis-
7 # tribute, sublicense, and/or sell copies of the Software, and to permit
8 # persons to whom the Software is furnished to do so, subject to the fol-
9 # lowing conditions:
10 #
11 # The above copyright notice and this permission notice shall be included
12 # in all copies or substantial portions of the Software.
13 #
14 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
16 # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
17 # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18 # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20 # IN THE SOFTWARE.
21
22 """Tests for gsutil naming logic.
23 The test code in this file runs against an in-memory storage service mock,
24 so runs very quickly. This is valuable for testing changes that impact the
25 naming rules, since those rules are complex and it's useful to be able to
26 make small incremental changes and rerun the tests frequently. Additional
27 end-to-end tests (which send traffic to the production Google Cloud Storage
28 service) are available via the gsutil test command.
29 """
30
31 import gzip
32 import os
33 import posixpath
34 import StringIO
35
36 import boto
37 from boto.exception import StorageResponseError
38 from boto import storage_uri
39
40 from gslib.commands import cp
41 from gslib.exception import CommandException
42 import gslib.tests.testcase as testcase
43 from gslib.tests.util import ObjectToURI as suri
44
45
46 class GsutilNamingTests(testcase.GsUtilUnitTestCase):
47 """gsutil command method test suite"""
48
49 def testGetPathBeforeFinalDir(self):
50 """Tests _GetPathBeforeFinalDir() (unit test)"""
51 self.assertEqual('gs://',
52 cp._GetPathBeforeFinalDir(storage_uri('gs://bucket/')))
53 self.assertEqual('gs://bucket',
54 cp._GetPathBeforeFinalDir(storage_uri('gs://bucket/dir/')))
55 self.assertEqual('gs://bucket',
56 cp._GetPathBeforeFinalDir(storage_uri('gs://bucket/dir')))
57 self.assertEqual('gs://bucket/dir',
58 cp._GetPathBeforeFinalDir(
59 storage_uri('gs://bucket/dir/obj')))
60 src_dir = self.CreateTempDir()
61 subdir = os.path.join(src_dir, 'subdir')
62 os.mkdir(subdir)
63 self.assertEqual(suri(src_dir),
64 cp._GetPathBeforeFinalDir(storage_uri(suri(subdir))))
65
66 def testCopyingTopLevelFileToBucket(self):
67 """Tests copying one top-level file to a bucket"""
68 src_file = self.CreateTempFile(file_name='f0')
69 dst_bucket_uri = self.CreateBucket()
70 self.RunCommand('cp', [src_file, suri(dst_bucket_uri)])
71 actual = list(self._test_wildcard_iterator(
72 suri(dst_bucket_uri, '**')).IterUris())
73 self.assertEqual(1, len(actual))
74 self.assertEqual('f0', actual[0].object_name)
75
76 def testCopyingAbsolutePathDirToBucket(self):
77 """Tests recursively copying absolute path directory to a bucket"""
78 dst_bucket_uri = self.CreateBucket()
79 src_dir_root = self.CreateTempDir(test_files=[
80 'f0', 'f1', 'f2.txt', ('dir0', 'dir1', 'nested')])
81 self.RunCommand('cp', ['-R', src_dir_root, suri(dst_bucket_uri)])
82 actual = set(str(u) for u in self._test_wildcard_iterator(
83 suri(dst_bucket_uri, '**')).IterUris())
84 src_tmpdir = os.path.split(src_dir_root)[1]
85 expected = set([
86 suri(dst_bucket_uri, src_tmpdir, 'f0'),
87 suri(dst_bucket_uri, src_tmpdir, 'f1'),
88 suri(dst_bucket_uri, src_tmpdir, 'f2.txt'),
89 suri(dst_bucket_uri, src_tmpdir, 'dir0', 'dir1', 'nested')])
90 self.assertEqual(expected, actual)
91
92 def testCopyingRelativePathDirToBucket(self):
93 """Tests recursively copying relative directory to a bucket"""
94 dst_bucket_uri = self.CreateBucket()
95 src_dir = self.CreateTempDir(test_files=[('dir0', 'f1')])
96 self.RunCommand('cp', ['-R', 'dir0', suri(dst_bucket_uri)], cwd=src_dir)
97 actual = set(str(u) for u in self._test_wildcard_iterator(
98 suri(dst_bucket_uri, '**')).IterUris())
99 expected = set([suri(dst_bucket_uri, 'dir0', 'f1')])
100 self.assertEqual(expected, actual)
101
102 def testCopyingRelPathSubDirToBucketSubdirWithDollarFolderObj(self):
103 """Tests recursively copying relative sub-directory to bucket subdir
104 signified by a $folder$ object"""
105 # Create a $folder$ object to simulate a folder created by GCS manager (or
106 # various other tools), which gsutil understands to mean there is a folder
107 # into which the object is being copied.
108 dst_bucket_uri = self.CreateBucket()
109 self.CreateObject(bucket_uri=dst_bucket_uri, object_name='abc_$folder$',
110 contents='')
111 src_dir = self.CreateTempDir(test_files=[('dir0', 'dir1', 'f1')])
112 self.RunCommand('cp', ['-R', os.path.join('dir0', 'dir1'),
113 suri(dst_bucket_uri, 'abc')], cwd=src_dir)
114 actual = set(str(u) for u in self._test_wildcard_iterator(
115 suri(dst_bucket_uri, '**')).IterUris())
116 expected = set([suri(dst_bucket_uri, 'abc_$folder$'),
117 suri(dst_bucket_uri, 'abc', 'dir1', 'f1')])
118 self.assertEqual(expected, actual)
119
120 def testCopyingRelativePathSubDirToBucketSubdirSignifiedBySlash(self):
121 """Tests recursively copying relative sub-directory to bucket subdir
122 signified by a / object"""
123 dst_bucket_uri = self.CreateBucket()
124 src_dir = self.CreateTempDir(test_files=[('dir0', 'dir1', 'f1')])
125 self.RunCommand('cp', ['-R', os.path.join('dir0', 'dir1'),
126 suri(dst_bucket_uri, 'abc') + '/'], cwd=src_dir)
127 actual = set(str(u) for u in self._test_wildcard_iterator(
128 suri(dst_bucket_uri, '**')).IterUris())
129 expected = set([suri(dst_bucket_uri, 'abc', 'dir1', 'f1')])
130 self.assertEqual(expected, actual)
131
132 def testCopyingRelativePathSubDirToBucket(self):
133 """Tests recursively copying relative sub-directory to a bucket"""
134 dst_bucket_uri = self.CreateBucket()
135 src_dir = self.CreateTempDir(test_files=[('dir0', 'dir1', 'f1')])
136 self.RunCommand('cp', ['-R', os.path.join('dir0', 'dir1'),
137 suri(dst_bucket_uri)], cwd=src_dir)
138 actual = set(str(u) for u in self._test_wildcard_iterator(
139 suri(dst_bucket_uri, '**')).IterUris())
140 expected = set([suri(dst_bucket_uri, 'dir1', 'f1')])
141 self.assertEqual(expected, actual)
142
143 def testCopyingDotSlashToBucket(self):
144 """Tests copying ./ to a bucket produces expected naming"""
145 # When running a command like gsutil cp -r . gs://dest we expect the dest
146 # obj names to be of the form gs://dest/abc, not gs://dest/./abc.
147 dst_bucket_uri = self.CreateBucket()
148 src_dir = self.CreateTempDir(test_files=['foo'])
149 for rel_src_dir in ['.', '.%s' % os.sep]:
150 self.RunCommand('cp', ['-R', rel_src_dir, suri(dst_bucket_uri)],
151 cwd=src_dir)
152 actual = set(str(u) for u in self._test_wildcard_iterator(
153 suri(dst_bucket_uri, '**')).IterUris())
154 expected = set([suri(dst_bucket_uri, 'foo')])
155 self.assertEqual(expected, actual)
156
157 def testCopyingDirContainingOneFileToBucket(self):
158 """Tests copying a directory containing 1 file to a bucket.
159 We test this case to ensure that correct bucket handling isn't dependent
160 on the copy being treated as a multi-source copy.
161 """
162 dst_bucket_uri = self.CreateBucket()
163 src_dir = self.CreateTempDir(test_files=[('dir0', 'dir1', 'foo')])
164 self.RunCommand('cp', ['-R', os.path.join(src_dir, 'dir0', 'dir1'),
165 suri(dst_bucket_uri)])
166 actual = list((str(u) for u in self._test_wildcard_iterator(
167 suri(dst_bucket_uri, '**')).IterUris()))
168 self.assertEqual(1, len(actual))
169 self.assertEqual(suri(dst_bucket_uri, 'dir1', 'foo'), actual[0])
170
171 def testCopyingBucketToDir(self):
172 """Tests copying from a bucket to a directory"""
173 src_bucket_uri = self.CreateBucket(test_objects=['foo', 'dir/foo2'])
174 dst_dir = self.CreateTempDir()
175 self.RunCommand('cp', ['-R', suri(src_bucket_uri), dst_dir])
176 actual = set(str(u) for u in self._test_wildcard_iterator(
177 '%s%s**' % (dst_dir, os.sep)).IterUris())
178 expected = set([suri(dst_dir, src_bucket_uri.bucket_name, 'foo'),
179 suri(dst_dir, src_bucket_uri.bucket_name, 'dir', 'foo2')])
180 self.assertEqual(expected, actual)
181
182 def testCopyingBucketToBucket(self):
183 """Tests copying from a bucket-only URI to a bucket"""
184 src_bucket_uri = self.CreateBucket(test_objects=['foo', 'dir/foo2'])
185 dst_bucket_uri = self.CreateBucket()
186 self.RunCommand('cp', ['-R', suri(src_bucket_uri), suri(dst_bucket_uri)])
187 actual = set(str(u) for u in self._test_wildcard_iterator(
188 suri(dst_bucket_uri, '**')).IterUris())
189 expected = set([
190 suri(dst_bucket_uri, src_bucket_uri.bucket_name, 'foo'),
191 suri(dst_bucket_uri, src_bucket_uri.bucket_name, 'dir', 'foo2')])
192 self.assertEqual(expected, actual)
193
194 def testCopyingDirectoryToDirectory(self):
195 """Tests copying from a directory to a directory"""
196 src_dir = self.CreateTempDir(test_files=['foo', ('dir', 'foo2')])
197 dst_dir = self.CreateTempDir()
198 self.RunCommand('cp', ['-R', src_dir, dst_dir])
199 actual = set(str(u) for u in self._test_wildcard_iterator(
200 '%s%s**' % (dst_dir, os.sep)).IterUris())
201 src_dir_base = os.path.split(src_dir)[1]
202 expected = set([suri(dst_dir, src_dir_base, 'foo'),
203 suri(dst_dir, src_dir_base, 'dir', 'foo2')])
204 self.assertEqual(expected, actual)
205
206 def testCopyingFilesAndDirNonRecursive(self):
207 """Tests copying containing files and a directory without -R"""
208 src_dir = self.CreateTempDir(test_files=['foo', 'bar', ('d1', 'f2'),
209 ('d2', 'f3'), ('d3', 'd4', 'f4')])
210 dst_dir = self.CreateTempDir()
211 self.RunCommand('cp', ['%s%s*' % (src_dir, os.sep), dst_dir])
212 actual = set(str(u) for u in self._test_wildcard_iterator(
213 '%s%s**' % (dst_dir, os.sep)).IterUris())
214 expected = set([suri(dst_dir, 'foo'), suri(dst_dir, 'bar')])
215 self.assertEqual(expected, actual)
216
217 def testCopyingFileToDir(self):
218 """Tests copying one file to a directory"""
219 src_file = self.CreateTempFile(file_name='foo')
220 dst_dir = self.CreateTempDir()
221 self.RunCommand('cp', [src_file, dst_dir])
222 actual = list(self._test_wildcard_iterator(
223 '%s%s*' % (dst_dir, os.sep)).IterUris())
224 self.assertEqual(1, len(actual))
225 self.assertEqual(suri(dst_dir, 'foo'), actual[0].uri)
226
227 def testCopyingFileToObjectWithConsecutiveSlashes(self):
228 """Tests copying a file to an object containing consecutive slashes"""
229 src_file = self.CreateTempFile(file_name='f0')
230 dst_bucket_uri = self.CreateBucket()
231 self.RunCommand('cp', [src_file, suri(dst_bucket_uri) + '//obj'])
232 actual = list(self._test_wildcard_iterator(
233 suri(dst_bucket_uri, '**')).IterUris())
234 self.assertEqual(1, len(actual))
235 self.assertEqual('/obj', actual[0].object_name)
236
237 def testCopyingCompressedFileToBucket(self):
238 """Tests copying one file with compression to a bucket"""
239 src_file = self.CreateTempFile(contents='plaintext', file_name='f2.txt')
240 dst_bucket_uri = self.CreateBucket()
241 self.RunCommand('cp', ['-z', 'txt', src_file, suri(dst_bucket_uri)],)
242 actual = list(str(u) for u in self._test_wildcard_iterator(
243 suri(dst_bucket_uri, '*')).IterUris())
244 self.assertEqual(1, len(actual))
245 expected_dst_uri = dst_bucket_uri.clone_replace_name('f2.txt')
246 self.assertEqual(expected_dst_uri.uri, actual[0])
247 dst_key = expected_dst_uri.get_key()
248 dst_key.open_read()
249 self.assertEqual('gzip', dst_key.content_encoding)
250 contents = dst_key.read()
251 f = gzip.GzipFile(fileobj=StringIO.StringIO(contents), mode='rb')
252 try:
253 self.assertEqual(f.read(), 'plaintext')
254 finally:
255 f.close()
256
257 def testCopyingObjectToObject(self):
258 """Tests copying an object to an object"""
259 src_bucket_uri = self.CreateBucket(test_objects=['obj'])
260 dst_bucket_uri = self.CreateBucket()
261 self.RunCommand('cp', [suri(src_bucket_uri, 'obj'), suri(dst_bucket_uri)])
262 actual = list(self._test_wildcard_iterator(
263 suri(dst_bucket_uri, '*')).IterUris())
264 self.assertEqual(1, len(actual))
265 self.assertEqual('obj', actual[0].object_name)
266
267 def testCopyingObjsAndFilesToDir(self):
268 """Tests copying objects and files to a directory"""
269 src_bucket_uri = self.CreateBucket(test_objects=['f1'])
270 src_dir = self.CreateTempDir(test_files=['f2'])
271 dst_dir = self.CreateTempDir()
272 self.RunCommand('cp', ['-R', suri(src_bucket_uri, '**'),
273 os.path.join(src_dir, '**'), dst_dir])
274 actual = set(str(u) for u in self._test_wildcard_iterator(
275 os.path.join(dst_dir, '**')).IterUris())
276 expected = set([suri(dst_dir, 'f1'), suri(dst_dir, 'f2')])
277 self.assertEqual(expected, actual)
278
279 def testCopyingObjToDot(self):
280 """Tests that copying an object to . or ./ downloads to correct name"""
281 src_bucket_uri = self.CreateBucket(test_objects=['f1'])
282 dst_dir = self.CreateTempDir()
283 for final_char in ('/', ''):
284 self.RunCommand('cp', [suri(src_bucket_uri, 'f1'), '.%s' % final_char],
285 cwd=dst_dir)
286 actual = set()
287 for dirname, dirnames, filenames in os.walk(dst_dir):
288 for subdirname in dirnames:
289 actual.add(os.path.join(dirname, subdirname))
290 for filename in filenames:
291 actual.add(os.path.join(dirname, filename))
292 expected = set([os.path.join(dst_dir, 'f1')])
293 self.assertEqual(expected, actual)
294
295 def testCopyingObjsAndFilesToBucket(self):
296 """Tests copying objects and files to a bucket"""
297 src_bucket_uri = self.CreateBucket(test_objects=['f1'])
298 src_dir = self.CreateTempDir(test_files=['f2'])
299 dst_bucket_uri = self.CreateBucket()
300 self.RunCommand('cp', ['-R', suri(src_bucket_uri, '**'),
301 '%s%s**' % (src_dir, os.sep), suri(dst_bucket_uri)])
302 actual = set(str(u) for u in self._test_wildcard_iterator(
303 suri(dst_bucket_uri, '**')).IterUris())
304 expected = set([suri(dst_bucket_uri, 'f1'), suri(dst_bucket_uri, 'f2')])
305 self.assertEqual(expected, actual)
306
307 def testAttemptDirCopyWithoutRecursion(self):
308 """Tests copying a directory without -R"""
309 src_dir = self.CreateTempDir(test_files=1)
310 dst_dir = self.CreateTempDir()
311 try:
312 self.RunCommand('cp', [src_dir, dst_dir])
313 self.fail('Did not get expected CommandException')
314 except CommandException, e:
315 self.assertIn('No URIs matched', e.reason)
316
317 def testAttemptCopyingProviderOnlySrc(self):
318 """Attempts to copy a src specified as a provider-only URI"""
319 src_bucket_uri = self.CreateBucket()
320 try:
321 self.RunCommand('cp', ['gs://', suri(src_bucket_uri)])
322 self.fail('Did not get expected CommandException')
323 except CommandException, e:
324 self.assertIn('provider-only', e.reason)
325
326 def testAttemptCopyingOverlappingSrcDstFile(self):
327 """Attempts to an object atop itself"""
328 src_file = self.CreateTempFile()
329 try:
330 self.RunCommand('cp', [src_file, src_file])
331 self.fail('Did not get expected CommandException')
332 except CommandException, e:
333 self.assertIn('are the same file - abort', e.reason)
334
335 def testAttemptCopyingToMultiMatchWildcard(self):
336 """Attempts to copy where dst wildcard matches >1 obj"""
337 src_bucket_uri = self.CreateBucket()
338 try:
339 self.RunCommand('cp', [suri(src_bucket_uri, 'obj0'),
340 suri(src_bucket_uri, '*')])
341 self.fail('Did not get expected CommandException')
342 except CommandException, e:
343 self.assertNotEqual(e.reason.find('must match exactly 1 URI'), -1)
344
345 def testAttemptCopyingMultiObjsToFile(self):
346 """Attempts to copy multiple objects to a file"""
347 src_bucket_uri = self.CreateBucket(test_objects=2)
348 dst_file = self.CreateTempFile()
349 try:
350 self.RunCommand('cp', ['-R', suri(src_bucket_uri, '*'), dst_file])
351 self.fail('Did not get expected CommandException')
352 except CommandException, e:
353 self.assertIn('must name a directory, bucket, or', e.reason)
354
355 def testAttemptCopyingWithFileDirConflict(self):
356 """Attempts to copy objects that cause a file/directory conflict"""
357 # Create objects with name conflicts (a/b and a). Use 'dst' bucket because
358 # it gets cleared after each test.
359 bucket_uri = self.CreateBucket()
360 self.CreateObject(bucket_uri=bucket_uri, object_name='a')
361 self.CreateObject(bucket_uri=bucket_uri, object_name='b/a')
362 dst_dir = self.CreateTempDir()
363 try:
364 self.RunCommand('cp', ['-R', suri(bucket_uri), dst_dir])
365 self.fail('Did not get expected CommandException')
366 except CommandException, e:
367 self.assertNotEqual('exists where a directory needs to be created',
368 e.reason)
369
370 def testAttemptCopyingWithDirFileConflict(self):
371 """Attempts to copy an object that causes a directory/file conflict"""
372 # Create an object that conflicts with dest subdir.
373 tmpdir = self.CreateTempDir()
374 os.mkdir(os.path.join(tmpdir, 'abc'))
375 src_uri = self.CreateObject(object_name='abc', contents='bar')
376 try:
377 self.RunCommand('cp', [suri(src_uri), tmpdir + '/'])
378 self.fail('Did not get expected CommandException')
379 except CommandException, e:
380 self.assertNotEqual('where the file needs to be created', e.reason)
381
382 def testWildcardMoveWithinBucket(self):
383 """Attempts to move using src wildcard that overlaps dest object.
384 We want to ensure that this doesn't stomp the result data. See the
385 comment starting with 'Expand wildcards before' in commands/mv.py
386 for details.
387 """
388 dst_bucket_uri = self.CreateBucket(test_objects=['old'])
389 self.RunCommand('mv', [suri(dst_bucket_uri, 'old*'),
390 suri(dst_bucket_uri, 'new')])
391 actual = set(str(u) for u in self._test_wildcard_iterator(
392 suri(dst_bucket_uri, '**')).IterUris())
393 expected = set([suri(dst_bucket_uri, 'new')])
394 self.assertEqual(expected, actual)
395
396 def testLsNonExistentObjectWithPrefixName(self):
397 """Test ls of non-existent obj that matches prefix of existing objs"""
398 # Use an object name that matches a prefix of other names at that level, to
399 # ensure the ls subdir handling logic doesn't pick up anything extra.
400 src_bucket_uri = self.CreateBucket()
401 try:
402 output = self.RunCommand('ls', [suri(src_bucket_uri, 'obj')],
403 return_stdout=True)
404 except CommandException, e:
405 self.assertIn('No such object', e.reason)
406
407 def testLsBucketNonRecursive(self):
408 """Test that ls of a bucket returns expected results"""
409 src_bucket_uri = self.CreateBucket(test_objects=['foo1', 'd0/foo2',
410 'd1/d2/foo3'])
411 output = self.RunCommand('ls', [suri(src_bucket_uri, '*')],
412 return_stdout=True)
413 expected = set([suri(src_bucket_uri, 'foo1'),
414 suri(src_bucket_uri, 'd1', ':'),
415 suri(src_bucket_uri, 'd1', 'd2') + src_bucket_uri.delim,
416 suri(src_bucket_uri, 'd0', ':'),
417 suri(src_bucket_uri, 'd0', 'foo2')])
418 expected.add('') # Blank line between subdir listings.
419 actual = set(output.split('\n'))
420 self.assertEqual(expected, actual)
421
422 def testLsBucketRecursive(self):
423 """Test that ls -R of a bucket returns expected results"""
424 src_bucket_uri = self.CreateBucket(test_objects=['foo1', 'd0/foo2',
425 'd1/d2/foo3'])
426 output = self.RunCommand('ls', ['-R', suri(src_bucket_uri, '*')],
427 return_stdout=True)
428 expected = set([suri(src_bucket_uri, 'foo1'),
429 suri(src_bucket_uri, 'd1', ':'),
430 suri(src_bucket_uri, 'd1', 'd2', ':'),
431 suri(src_bucket_uri, 'd1', 'd2', 'foo3'),
432 suri(src_bucket_uri, 'd0', ':'),
433 suri(src_bucket_uri, 'd0', 'foo2')])
434 expected.add('') # Blank line between subdir listings.
435 actual = set(output.split('\n'))
436 self.assertEqual(expected, actual)
437
438 def testLsBucketRecursiveWithLeadingSlashObjectName(self):
439 """Test that ls -R of a bucket with an object that has leading slash"""
440 dst_bucket_uri = self.CreateBucket(test_objects=['f0'])
441 output = self.RunCommand('ls', ['-R', suri(dst_bucket_uri) + '*'],
442 return_stdout=True)
443 expected = set([suri(dst_bucket_uri, 'f0')])
444 expected.add('') # Blank line between subdir listings.
445 actual = set(output.split('\n'))
446 self.assertEqual(expected, actual)
447
448 def testLsBucketSubdirNonRecursive(self):
449 """Test that ls of a bucket subdir returns expected results"""
450 src_bucket_uri = self.CreateBucket(test_objects=['src_subdir/foo',
451 'src_subdir/nested/foo2'])
452 output = self.RunCommand('ls', [suri(src_bucket_uri, 'src_subdir')],
453 return_stdout=True)
454 expected = set([
455 suri(src_bucket_uri, 'src_subdir', 'foo'),
456 suri(src_bucket_uri, 'src_subdir', 'nested') + src_bucket_uri.delim])
457 expected.add('') # Blank line between subdir listings.
458 actual = set(output.split('\n'))
459 self.assertEqual(expected, actual)
460
461 def testLsBucketSubdirRecursive(self):
462 """Test that ls -R of a bucket subdir returns expected results"""
463 src_bucket_uri = self.CreateBucket(test_objects=['src_subdir/foo',
464 'src_subdir/nested/foo2'])
465 for final_char in ('/', ''):
466 output = self.RunCommand(
467 'ls', ['-R', suri(src_bucket_uri, 'src_subdir') + final_char],
468 return_stdout=True)
469 expected = set([
470 suri(src_bucket_uri, 'src_subdir', ':'),
471 suri(src_bucket_uri, 'src_subdir', 'foo'),
472 suri(src_bucket_uri, 'src_subdir', 'nested', ':'),
473 suri(src_bucket_uri, 'src_subdir', 'nested', 'foo2')])
474 expected.add('') # Blank line between subdir listings.
475 actual = set(output.split('\n'))
476 self.assertEqual(expected, actual)
477
478 def testSetAclOnBucketRuns(self):
479 """Test that the setacl command basically runs"""
480 # We don't test reading back the acl (via getacl command) because at present
481 # MockStorageService doesn't translate canned ACLs into actual ACL XML.
482 src_bucket_uri = self.CreateBucket()
483 self.RunCommand('setacl', ['private', suri(src_bucket_uri)])
484
485 def testSetAclOnWildcardNamedBucketRuns(self):
486 """Test that setacl basically runs against wildcard-named bucket"""
487 # We don't test reading back the acl (via getacl command) because at present
488 # MockStorageService doesn't translate canned ACLs into actual ACL XML.
489 src_bucket_uri = self.CreateBucket(test_objects=['f0'])
490 self.RunCommand('setacl', ['private', suri(src_bucket_uri)[:-2] + '*'])
491
492 def testSetAclOnObjectRuns(self):
493 """Test that the setacl command basically runs"""
494 src_bucket_uri = self.CreateBucket(test_objects=['f0'])
495 self.RunCommand('setacl', ['private', suri(src_bucket_uri, '*')])
496
497 def testSetDefAclOnBucketRuns(self):
498 """Test that the setdefacl command basically runs"""
499 src_bucket_uri = self.CreateBucket()
500 self.RunCommand('setdefacl', ['private', suri(src_bucket_uri)])
501
502 def testSetDefAclOnObjectFails(self):
503 """Test that the setdefacl command fails when run against an object"""
504 src_bucket_uri = self.CreateBucket()
505 try:
506 self.RunCommand('setdefacl', ['private', suri(src_bucket_uri, '*')])
507 self.fail('Did not get expected CommandException')
508 except CommandException, e:
509 self.assertIn('URI must name a bucket', e.reason)
510
511 def testMinusDOptionWorks(self):
512 """Tests using gsutil -D option"""
513 src_file = self.CreateTempFile(file_name='f0')
514 dst_bucket_uri = self.CreateBucket()
515 self.RunCommand('cp', [src_file, suri(dst_bucket_uri)], debug=3)
516 actual = list(self._test_wildcard_iterator(
517 suri(dst_bucket_uri, '*')).IterUris())
518 self.assertEqual(1, len(actual))
519 self.assertEqual('f0', actual[0].object_name)
520
521 def DownloadTestHelper(self, func):
522 """
523 Test resumable download with custom test function to distort downloaded
524 data. We expect an exception to be raised and the dest file to be removed.
525 """
526 object_uri = self.CreateObject()
527 dst_dir = self.CreateTempDir()
528 try:
529 self.RunCommand('cp', [suri(object_uri), dst_dir], test_method=func)
530 self.fail('Did not get expected CommandException')
531 except CommandException:
532 self.assertFalse(os.listdir(dst_dir))
533 except:
534 self.fail('Unexpected exception raised')
535
536 def testDownloadWithObjectSizeChange(self):
537 """
538 Test resumable download on an object that changes size before the
539 downloaded file's checksum is validated.
540 """
541 def append(fp):
542 """Append a byte at end of an open file and flush contents."""
543 fp.seek(0,2)
544 fp.write('x')
545 fp.flush()
546 self.DownloadTestHelper(append)
547
548 def testDownloadWithFileContentChange(self):
549 """
550 Tests resumable download on an object where the file content changes
551 before the downloaded file's checksum is validated.
552 """
553 def overwrite(fp):
554 """Overwrite first byte in an open file and flush contents."""
555 fp.seek(0)
556 fp.write('x')
557 fp.flush()
558 self.DownloadTestHelper(overwrite)
559
560 def testFlatCopyingObjsAndFilesToBucketSubDir(self):
561 """Tests copying flatly listed objects and files to bucket subdir"""
562 src_bucket_uri = self.CreateBucket(test_objects=['f0', 'd0/f1', 'd1/d2/f2'])
563 src_dir = self.CreateTempDir(test_files=['f3', ('d3', 'f4'),
564 ('d4', 'd5', 'f5')])
565 dst_bucket_uri = self.CreateBucket(test_objects=['dst_subdir0/existing',
566 'dst_subdir1/existing'])
567 # Test with and without final slash on dest subdir.
568 for i, final_char in enumerate(('/', '')):
569 self.RunCommand(
570 'cp', ['-R', suri(src_bucket_uri, '**'), os.path.join(src_dir, '**'),
571 suri(dst_bucket_uri, 'dst_subdir%d' % i) + final_char])
572
573 actual = set(str(u) for u in self._test_wildcard_iterator(
574 suri(dst_bucket_uri, '**')).IterUris())
575 expected = set()
576 for i in range(2):
577 expected.add(suri(dst_bucket_uri, 'dst_subdir%d' % i, 'existing'))
578 for j in range(6):
579 expected.add(suri(dst_bucket_uri, 'dst_subdir%d' % i, 'f%d' % j))
580 self.assertEqual(expected, actual)
581
582 def testRecursiveCopyObjsAndFilesToExistingBucketSubDir(self):
583 """Tests recursive copy of objects and files to existing bucket subdir"""
584 src_bucket_uri = self.CreateBucket(test_objects=['f0', 'nested/f1'])
585 dst_bucket_uri = self.CreateBucket(test_objects=[
586 'dst_subdir0/existing_obj', 'dst_subdir1/existing_obj'])
587 src_dir = self.CreateTempDir(test_files=['f2', ('nested', 'f3')])
588 # Test with and without final slash on dest subdir.
589 for i, final_char in enumerate(('/', '')):
590 self.RunCommand(
591 'cp', ['-R', suri(src_bucket_uri), src_dir,
592 suri(dst_bucket_uri, 'dst_subdir%d' % i) + final_char])
593 actual = set(str(u) for u in self._test_wildcard_iterator(
594 suri(dst_bucket_uri, 'dst_subdir%d' % i, '**')).IterUris())
595 tmp_dirname = os.path.split(src_dir)[1]
596 bucketname = src_bucket_uri.bucket_name
597 expected = set([
598 suri(dst_bucket_uri, 'dst_subdir%d' % i, 'existing_obj'),
599 suri(dst_bucket_uri, 'dst_subdir%d' % i, bucketname, 'f0'),
600 suri(dst_bucket_uri, 'dst_subdir%d' % i, bucketname, 'nested', 'f1'),
601 suri(dst_bucket_uri, 'dst_subdir%d' % i, tmp_dirname, 'f2'),
602 suri(dst_bucket_uri, 'dst_subdir%d' % i, tmp_dirname, 'nested', 'f3')
603 ])
604 self.assertEqual(expected, actual)
605
606 def testRecursiveCopyObjsAndFilesToNonExistentBucketSubDir(self):
607 """Tests recursive copy of objs + files to non-existent bucket subdir"""
608 src_bucket_uri = self.CreateBucket(test_objects=['f0', 'nested/f1'])
609 src_dir = self.CreateTempDir(test_files=['f2', ('nested', 'f3')])
610 dst_bucket_uri = self.CreateBucket()
611 x = ['-R', src_dir, suri(src_bucket_uri),
612 suri(dst_bucket_uri, 'dst_subdir')]
613 stdout = self.RunCommand(
614 'cp', x, return_stdout=True)
615 actual = set(str(u) for u in self._test_wildcard_iterator(
616 suri(dst_bucket_uri, '**')).IterUris())
617 expected = set([suri(dst_bucket_uri, 'dst_subdir', 'f0'),
618 suri(dst_bucket_uri, 'dst_subdir', 'nested', 'f1'),
619 suri(dst_bucket_uri, 'dst_subdir', 'f2'),
620 suri(dst_bucket_uri, 'dst_subdir', 'nested', 'f3')])
621 self.assertEqual(expected, actual)
622
623 def testCopyingBucketSubDirToDir(self):
624 """Tests copying a bucket subdir to a directory"""
625 src_bucket_uri = self.CreateBucket(test_objects=['src_subdir/obj'])
626 dst_dir = self.CreateTempDir()
627 # Test with and without final slash on dest subdir.
628 for (final_src_char, final_dst_char) in (
629 ('', ''), ('', '/'), ('/', ''), ('/', '/') ):
630 self.RunCommand(
631 'cp', ['-R', suri(src_bucket_uri, 'src_subdir') + final_src_char,
632 dst_dir + final_dst_char])
633 actual = set(str(u) for u in self._test_wildcard_iterator(
634 '%s%s**' % (dst_dir, os.sep)).IterUris())
635 expected = set([suri(dst_dir, 'src_subdir', 'obj')])
636 self.assertEqual(expected, actual)
637
638 def testCopyingWildcardSpecifiedBucketSubDirToExistingDir(self):
639 """Tests copying a wildcard-specified bucket subdir to a directory"""
640 src_bucket_uri = self.CreateBucket(
641 test_objects=['src_sub0dir/foo', 'src_sub1dir/foo', 'src_sub2dir/foo',
642 'src_sub3dir/foo'])
643 dst_dir = self.CreateTempDir()
644 # Test with and without final slash on dest subdir.
645 for i, (final_src_char, final_dst_char) in enumerate((
646 ('', ''), ('', '/'), ('/', ''), ('/', '/') )):
647 self.RunCommand(
648 'cp', ['-R', suri(src_bucket_uri, 'src_sub%d*' % i) + final_src_char,
649 dst_dir + final_dst_char])
650 actual = set(str(u) for u in self._test_wildcard_iterator(
651 os.path.join(dst_dir, 'src_sub%ddir' % i, '**')).IterUris())
652 expected = set([suri(dst_dir, 'src_sub%ddir' % i, 'foo')])
653 self.assertEqual(expected, actual)
654
655 def testCopyingBucketSubDirToDirFailsWithoutMinusR(self):
656 """Tests for failure when attempting bucket subdir copy without -R"""
657 src_bucket_uri = self.CreateBucket(test_objects=['src_subdir/obj'])
658 dst_dir = self.CreateTempDir()
659 try:
660 self.RunCommand(
661 'cp', [suri(src_bucket_uri, 'src_subdir'), dst_dir])
662 self.fail('Did not get expected CommandException')
663 except CommandException, e:
664 self.assertIn('does not exist', e.reason)
665
666 def testCopyingBucketSubDirToBucketSubDir(self):
667 """Tests copying a bucket subdir to another bucket subdir"""
668 src_bucket_uri = self.CreateBucket(
669 test_objects=['src_subdir_%d/obj' % i for i in range(4)])
670 dst_bucket_uri = self.CreateBucket(
671 test_objects=['dst_subdir_%d/obj2' % i for i in range(4)])
672 # Test with and without final slash on dest subdir.
673 for i, (final_src_char, final_dst_char) in enumerate((
674 ('', ''), ('', '/'), ('/', ''), ('/', '/') )):
675 self.RunCommand(
676 'cp', ['-R', suri(src_bucket_uri, 'src_subdir_%d' % i) + final_src_cha r,
677 suri(dst_bucket_uri, 'dst_subdir_%d' % i) + final_dst_char])
678 actual = set(str(u) for u in self._test_wildcard_iterator(
679 suri(dst_bucket_uri, 'dst_subdir_%d' % i, '**')).IterUris())
680 expected = set([suri(dst_bucket_uri, 'dst_subdir_%d' % i,
681 'src_subdir_%d' % i, 'obj'),
682 suri(dst_bucket_uri, 'dst_subdir_%d' % i, 'obj2')])
683 self.assertEqual(expected, actual)
684
685 def testCopyingBucketSubDirToBucketSubDirWithNested(self):
686 """Tests copying a bucket subdir to another bucket subdir with nesting."""
687 src_bucket_uri = self.CreateBucket(
688 test_objects=['src_subdir_%d/obj' % i for i in range(4)] +
689 ['src_subdir_%d/nested/obj' % i for i in range(4)])
690 dst_bucket_uri = self.CreateBucket(
691 test_objects=['dst_subdir_%d/obj2' % i for i in range(4)])
692 # Test with and without final slash on dest subdir.
693 for i, (final_src_char, final_dst_char) in enumerate((
694 ('', ''), ('', '/'), ('/', ''), ('/', '/') )):
695 self.RunCommand(
696 'cp', ['-R', suri(src_bucket_uri, 'src_subdir_%d' % i) + final_src_cha r,
697 suri(dst_bucket_uri, 'dst_subdir_%d' % i) + final_dst_char])
698 actual = set(str(u) for u in self._test_wildcard_iterator(
699 suri(dst_bucket_uri, 'dst_subdir_%d' % i, '**')).IterUris())
700 expected = set([suri(dst_bucket_uri, 'dst_subdir_%d' % i,
701 'src_subdir_%d' % i, 'obj'),
702 suri(dst_bucket_uri, 'dst_subdir_%d' % i,
703 'src_subdir_%d' % i, 'nested', 'obj'),
704 suri(dst_bucket_uri, 'dst_subdir_%d' % i, 'obj2')])
705 self.assertEqual(expected, actual)
706
707 def testMovingBucketSubDirToExistingBucketSubDir(self):
708 """Tests moving a bucket subdir to a existing bucket subdir"""
709 src_objs = ['foo']
710 for i in range(4):
711 src_objs.extend(['src_subdir%d/foo2' % i, 'src_subdir%d/nested/foo3' % i])
712 src_bucket_uri = self.CreateBucket(test_objects=src_objs)
713 dst_bucket_uri = self.CreateBucket(
714 test_objects=['dst_subdir%d/existing' % i for i in range(4)])
715 # Test with and without final slash on dest subdir.
716 for i, (final_src_char, final_dst_char) in enumerate((
717 ('', ''), ('', '/'), ('/', ''), ('/', '/') )):
718 self.RunCommand(
719 'mv', [suri(src_bucket_uri, 'src_subdir%d' % i) + final_src_char,
720 suri(dst_bucket_uri, 'dst_subdir%d' % i) + final_dst_char])
721
722 actual = set(str(u) for u in self._test_wildcard_iterator(
723 suri(dst_bucket_uri, '**')).IterUris())
724 expected = set()
725 for i in range(4):
726 expected.add(suri(dst_bucket_uri, 'dst_subdir%d' % i, 'existing'))
727 expected.add(suri(dst_bucket_uri, 'dst_subdir%d' % i, 'src_subdir%d' %i,
728 'foo2'))
729 expected.add(suri(dst_bucket_uri, 'dst_subdir%d' % i, 'src_subdir%d' %i,
730 'nested', 'foo3'))
731 self.assertEqual(expected, actual)
732
733 def testCopyingObjectToBucketSubDir(self):
734 """Tests copying an object to a bucket subdir"""
735 src_bucket_uri = self.CreateBucket(test_objects=['obj0'])
736 dst_bucket_uri = self.CreateBucket(test_objects=['dir0/existing',
737 'dir1/existing'])
738 # Test with and without final slash on dest subdir.
739 for i, final_dst_char in enumerate(('', '/')):
740 self.RunCommand('cp', [
741 suri(src_bucket_uri, 'obj0'),
742 suri(dst_bucket_uri, 'dir%d' % i) + final_dst_char])
743 actual = set(str(u) for u in self._test_wildcard_iterator(
744 suri(dst_bucket_uri, 'dir%d' % i, '**')).IterUris())
745 expected = set([suri(dst_bucket_uri, 'dir%d' % i, 'obj0'),
746 suri(dst_bucket_uri, 'dir%d' % i, 'existing')])
747 self.assertEqual(expected, actual)
748
749 def testCopyingWildcardedFilesToBucketSubDir(self):
750 """Tests copying wildcarded files to a bucket subdir"""
751 dst_bucket_uri = self.CreateBucket(test_objects=['subdir0/existing',
752 'subdir1/existing'])
753 src_dir = self.CreateTempDir(test_files=['f0', 'f1', 'f2'])
754 # Test with and without final slash on dest subdir.
755 for i, final_dst_char in enumerate(('', '/')):
756 self.RunCommand(
757 'cp', [os.path.join(src_dir, 'f?'),
758 suri(dst_bucket_uri, 'subdir%d' % i) + final_dst_char])
759 actual = set(str(u) for u in self._test_wildcard_iterator(
760 suri(dst_bucket_uri, 'subdir%d' % i, '**')).IterUris())
761 expected = set([suri(dst_bucket_uri, 'subdir%d' % i, 'existing'),
762 suri(dst_bucket_uri, 'subdir%d' % i, 'f0'),
763 suri(dst_bucket_uri, 'subdir%d' % i, 'f1'),
764 suri(dst_bucket_uri, 'subdir%d' % i, 'f2')])
765 self.assertEqual(expected, actual)
766
767 def testCopyingOneNestedFileToBucketSubDir(self):
768 """Tests copying one nested file to a bucket subdir"""
769 dst_bucket_uri = self.CreateBucket(test_objects=['d0/placeholder',
770 'd1/placeholder'])
771 src_dir = self.CreateTempDir(test_files=[('d3', 'd4', 'nested', 'f1')])
772 # Test with and without final slash on dest subdir.
773 for i, final_dst_char in enumerate(('', '/')):
774 self.RunCommand('cp', ['-r', suri(src_dir, 'd3'),
775 suri(dst_bucket_uri, 'd%d' % i) + final_dst_char])
776 actual = set(str(u) for u in self._test_wildcard_iterator(
777 suri(dst_bucket_uri, '**')).IterUris())
778 expected = set([
779 suri(dst_bucket_uri, 'd0', 'placeholder'),
780 suri(dst_bucket_uri, 'd1', 'placeholder'),
781 suri(dst_bucket_uri, 'd0', 'd3', 'd4', 'nested', 'f1'),
782 suri(dst_bucket_uri, 'd1', 'd3', 'd4', 'nested', 'f1')])
783 self.assertEqual(expected, actual)
784
785 def testMovingWildcardedFilesToNonExistentBucketSubDir(self):
786 """Tests moving files to a non-existent bucket subdir"""
787 # This tests for how we allow users to do something like:
788 # gsutil cp *.txt gs://bucket/dir
789 # where *.txt matches more than 1 file and gs://bucket/dir
790 # doesn't exist as a subdir.
791 #
792 src_bucket_uri = self.CreateBucket(test_objects=[
793 'f0f0', 'f0f1', 'f1f0', 'f1f1'])
794 dst_bucket_uri = self.CreateBucket(test_objects=[
795 'dst_subdir0/existing_obj', 'dst_subdir1/existing_obj'])
796 # Test with and without final slash on dest subdir.
797 for i, final_dst_char in enumerate(('', '/')):
798 # Copy some files into place in dst bucket.
799 self.RunCommand(
800 'cp', [suri(src_bucket_uri, 'f%df?' % i),
801 suri(dst_bucket_uri, 'dst_subdir%d' % i) + final_dst_char])
802 # Now do the move test.
803 self.RunCommand(
804 'mv', [suri(src_bucket_uri, 'f%d*' % i),
805 suri(dst_bucket_uri, 'nonexisting%d' % i) + final_dst_char])
806
807 actual = set(str(u) for u in self._test_wildcard_iterator(
808 suri(dst_bucket_uri, '**')).IterUris())
809 expected = set([
810 suri(dst_bucket_uri, 'dst_subdir0', 'existing_obj'),
811 suri(dst_bucket_uri, 'dst_subdir0', 'f0f0'),
812 suri(dst_bucket_uri, 'dst_subdir0', 'f0f1'),
813 suri(dst_bucket_uri, 'nonexisting0', 'f0f0'),
814 suri(dst_bucket_uri, 'nonexisting0', 'f0f1'),
815 suri(dst_bucket_uri, 'dst_subdir1', 'existing_obj'),
816 suri(dst_bucket_uri, 'dst_subdir1', 'f1f0'),
817 suri(dst_bucket_uri, 'dst_subdir1', 'f1f1'),
818 suri(dst_bucket_uri, 'nonexisting1', 'f1f0'),
819 suri(dst_bucket_uri, 'nonexisting1', 'f1f1')])
820 self.assertEqual(expected, actual)
821
822 def testMovingObjectToBucketSubDir(self):
823 """Tests moving an object to a bucket subdir"""
824 src_bucket_uri = self.CreateBucket(test_objects=['obj0', 'obj1'])
825 dst_bucket_uri = self.CreateBucket(test_objects=[
826 'dst_subdir0/existing_obj', 'dst_subdir1/existing_obj'])
827 # Test with and without final slash on dest subdir.
828 for i, final_dst_char in enumerate(('', '/')):
829 self.RunCommand(
830 'mv', [suri(src_bucket_uri, 'obj%d' % i),
831 suri(dst_bucket_uri, 'dst_subdir%d' % i) + final_dst_char])
832
833 actual = set(str(u) for u in self._test_wildcard_iterator(
834 suri(dst_bucket_uri, '**')).IterUris())
835 expected = set([
836 suri(dst_bucket_uri, 'dst_subdir0', 'existing_obj'),
837 suri(dst_bucket_uri, 'dst_subdir0', 'obj0'),
838 suri(dst_bucket_uri, 'dst_subdir1', 'existing_obj'),
839 suri(dst_bucket_uri, 'dst_subdir1', 'obj1')])
840 self.assertEqual(expected, actual)
841
842 actual = set(str(u) for u in self._test_wildcard_iterator(
843 suri(src_bucket_uri, '**')).IterUris())
844 self.assertEqual(actual, set())
845
846 def testWildcardSrcSubDirMoveDisallowed(self):
847 """Tests moving a bucket subdir specified by wildcard is disallowed"""
848 src_bucket_uri = self.CreateBucket(test_objects=['dir/foo1'])
849 dst_bucket_uri = self.CreateBucket(test_objects=['dir/foo2'])
850 try:
851 self.RunCommand(
852 'mv', [suri(src_bucket_uri, 'dir*'), suri(dst_bucket_uri, 'dir')])
853 self.fail('Did not get expected CommandException')
854 except CommandException, e:
855 self.assertIn('mv command disallows naming', e.reason)
856
857 def testMovingBucketSubDirToNonExistentBucketSubDir(self):
858 """Tests moving a bucket subdir to a non-existent bucket subdir"""
859 src_bucket = self.CreateBucket(test_objects=[
860 'foo', 'src_subdir0/foo2', 'src_subdir0/nested/foo3',
861 'src_subdir1/foo2', 'src_subdir1/nested/foo3'])
862 dst_bucket = self.CreateBucket()
863 # Test with and without final slash on dest subdir.
864 for i, final_src_char in enumerate(('', '/')):
865 self.RunCommand(
866 'mv', [suri(src_bucket, 'src_subdir%d' % i) + final_src_char,
867 suri(dst_bucket, 'dst_subdir%d' % i)])
868
869 actual = set(str(u) for u in self._test_wildcard_iterator(
870 suri(dst_bucket, '**')).IterUris())
871 # Unlike the case with copying, with mv we expect renaming to occur
872 # at the level of the src subdir, vs appending that subdir beneath the
873 # dst subdir like is done for copying.
874 expected = set([suri(dst_bucket, 'dst_subdir0', 'foo2'),
875 suri(dst_bucket, 'dst_subdir1', 'foo2'),
876 suri(dst_bucket, 'dst_subdir0', 'nested', 'foo3'),
877 suri(dst_bucket, 'dst_subdir1', 'nested', 'foo3')])
878 self.assertEqual(expected, actual)
879
880 def testRemovingBucketSubDir(self):
881 """Tests removing a bucket subdir"""
882 dst_bucket_uri = self.CreateBucket(test_objects=[
883 'f0', 'dir0/f1', 'dir0/nested/f2', 'dir1/f1', 'dir1/nested/f2'])
884 # Test with and without final slash on dest subdir.
885 for i, final_src_char in enumerate(('', '/')):
886 # Test removing bucket subdir.
887 self.RunCommand(
888 'rm', ['-R', suri(dst_bucket_uri, 'dir%d' % i) + final_src_char])
889 actual = set(str(u) for u in self._test_wildcard_iterator(
890 suri(dst_bucket_uri, '**')).IterUris())
891 expected = set([suri(dst_bucket_uri, 'f0')])
892 self.assertEqual(expected, actual)
893
894 def testRecursiveRemoveObjsInBucket(self):
895 """Tests removing all objects in bucket via rm -R gs://bucket"""
896 bucket_uris = [
897 self.CreateBucket(test_objects=['f0', 'dir/f1', 'dir/nested/f2']),
898 self.CreateBucket(test_objects=['f0', 'dir/f1', 'dir/nested/f2'])]
899 # Test with and without final slash on dest subdir.
900 for i, final_src_char in enumerate(('', '/')):
901 # Test removing all objects via rm -R.
902 self.RunCommand('rm', ['-R', suri(bucket_uris[i]) + final_src_char])
903 actual = set(str(u) for u in self._test_wildcard_iterator(
904 suri(bucket_uris[i], '**')).IterUris())
905 self.assertEqual(actual, set())
906
907 def FinalObjNameComponent(self, uri):
908 """For gs://bucket/abc/def/ghi returns ghi."""
909 return uri.uri.rpartition('/')[-1]
910
911
912 # TODO: These should all be moved to their own test_*.py testing files.
913 class GsUtilCommandTests(testcase.GsUtilUnitTestCase):
914 """Basic sanity check tests to make sure commands run."""
915
916 def testDisableLoggingCommandRuns(self):
917 """Test that the disablelogging command basically runs"""
918 src_bucket_uri = self.CreateBucket()
919 self.RunCommand('disablelogging', [suri(src_bucket_uri)])
920
921 def testEnableLoggingCommandRuns(self):
922 """Test that the enablelogging command basically runs"""
923 src_bucket_uri = self.CreateBucket()
924 self.RunCommand('enablelogging', ['-b', 'gs://log_bucket',
925 suri(src_bucket_uri)])
926
927 def testHelpCommandDoesntRaise(self):
928 """Test that the help command doesn't raise (sanity checks all help)"""
929 # Unset PAGER if defined, so help output paginating into $PAGER doesn't
930 # cause test to pause.
931 if 'PAGER' in os.environ:
932 del os.environ['PAGER']
933 self.RunCommand('help', [])
934
935 def testCatCommandRuns(self):
936 """Test that the cat command basically runs"""
937 src_uri = self.CreateObject(contents='foo')
938 stdout = self.RunCommand('cat', [suri(src_uri)], return_stdout=True)
939 self.assertEqual(stdout, 'foo')
940
941 def testGetAclCommandRuns(self):
942 """Test that the getacl command basically runs"""
943 src_bucket_uri = self.CreateBucket()
944 self.RunCommand('getacl', [suri(src_bucket_uri)])
945
946 def testGetDefAclCommandRuns(self):
947 """Test that the getdefacl command basically runs"""
948 src_bucket_uri = self.CreateBucket()
949 self.RunCommand('getacl', [suri(src_bucket_uri)])
950
951 def testGetLoggingCommandRuns(self):
952 """Test that the getlogging command basically runs"""
953 src_bucket_uri = self.CreateBucket()
954 self.RunCommand('getlogging', [suri(src_bucket_uri)])
955
956 def testMakeBucketsCommand(self):
957 """Test mb on existing bucket"""
958 dst_bucket_uri = self.CreateBucket()
959 try:
960 self.RunCommand('mb', [suri(dst_bucket_uri)])
961 self.fail('Did not get expected StorageCreateError')
962 except boto.exception.StorageCreateError, e:
963 self.assertEqual(e.status, 409)
964
965 def testRemoveBucketsCommand(self):
966 """Test rb on non-existent bucket"""
967 dst_bucket_uri = self.CreateBucket()
968 try:
969 self.RunCommand(
970 'rb', ['gs://non_existent_%s' % dst_bucket_uri.bucket_name])
971 self.fail('Did not get expected StorageResponseError')
972 except boto.exception.StorageResponseError, e:
973 self.assertEqual(e.status, 404)
974
975 def testRemoveObjsCommand(self):
976 """Test rm command on non-existent object"""
977 dst_bucket_uri = self.CreateBucket()
978 try:
979 self.RunCommand('rm', [suri(dst_bucket_uri, 'non_existent')])
980 self.fail('Did not get expected WildcardException')
981 except StorageResponseError, e:
982 self.assertIn('Not Found', e.reason)
983
984 # Now that gsutil ver computes a checksum it adds 1-3 seconds to test run
985 # time (for in memory mocked tests that otherwise take ~ 0.1 seconds). Since
986 # it provides very little test value, we're leaving this test commented out.
987 #def testVerCommmandRuns(self):
988 # """Test that the Ver command basically runs"""
989 # self.RunCommand('ver', [])
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698