1 # -*- coding: utf-8 -*- 2 # Copyright 2013 Google Inc. All Rights Reserved. 3 # 4 # Licensed under the Apache License, Version 2.0 (the "License"); 5 # you may not use this file except in compliance with the License. 6 # You may obtain a copy of the License at 7 # 8 # http://www.apache.org/licenses/LICENSE-2.0 9 # 10 # Unless required by applicable law or agreed to in writing, software 11 # distributed under the License is distributed on an "AS IS" BASIS, 12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 # See the License for the specific language governing permissions and 14 # limitations under the License. 15 """Tests for du command.""" 16 17 from __future__ import absolute_import 18 19 import gslib.tests.testcase as testcase 20 from gslib.tests.testcase.integration_testcase import SkipForS3 21 from gslib.tests.util import ObjectToURI as suri 22 from gslib.util import Retry 23 24 25 class TestDu(testcase.GsUtilIntegrationTestCase): 26 """Integration tests for du command.""" 27 28 def _create_nested_subdir(self): 29 """Creates a nested subdirectory for use by tests in this module.""" 30 bucket_uri = self.CreateBucket() 31 obj_uris = [] 32 obj_uris.append(self.CreateObject( 33 bucket_uri=bucket_uri, object_name='sub1/five', contents='5five')) 34 obj_uris.append(self.CreateObject( 35 bucket_uri=bucket_uri, object_name='sub1/four', contents='four')) 36 obj_uris.append(self.CreateObject( 37 bucket_uri=bucket_uri, object_name='sub1/sub2/five', contents='5five')) 38 obj_uris.append(self.CreateObject( 39 bucket_uri=bucket_uri, object_name='sub1/sub2/four', contents='four')) 40 self.AssertNObjectsInBucket(bucket_uri, 4) 41 return bucket_uri, obj_uris 42 43 def test_object(self): 44 obj_uri = self.CreateObject(contents='foo') 45 # Use @Retry as hedge against bucket listing eventual consistency. 46 @Retry(AssertionError, tries=3, timeout_secs=1) 47 def _Check(): 48 stdout = self.RunGsUtil(['du', suri(obj_uri)], return_stdout=True) 49 self.assertEqual(stdout, '%-10s %s\n' % (3, suri(obj_uri))) 50 _Check() 51 52 def test_bucket(self): 53 bucket_uri = self.CreateBucket() 54 obj_uri = self.CreateObject(bucket_uri=bucket_uri, contents='foo') 55 # Use @Retry as hedge against bucket listing eventual consistency. 56 @Retry(AssertionError, tries=3, timeout_secs=1) 57 def _Check(): 58 stdout = self.RunGsUtil(['du', suri(bucket_uri)], return_stdout=True) 59 self.assertEqual(stdout, '%-10s %s\n' % (3, suri(obj_uri))) 60 _Check() 61 62 def test_subdirs(self): 63 """Tests that subdirectory sizes are correctly calculated and listed.""" 64 bucket_uri, obj_uris = self._create_nested_subdir() 65 66 # Use @Retry as hedge against bucket listing eventual consistency. 67 @Retry(AssertionError, tries=3, timeout_secs=1) 68 def _Check(): 69 stdout = self.RunGsUtil(['du', suri(bucket_uri)], return_stdout=True) 70 self.assertSetEqual(set(stdout.splitlines()), set([ 71 '%-10s %s' % (5, suri(obj_uris[0])), 72 '%-10s %s' % (4, suri(obj_uris[1])), 73 '%-10s %s' % (5, suri(obj_uris[2])), 74 '%-10s %s' % (4, suri(obj_uris[3])), 75 '%-10s %s/sub1/sub2/' % (9, suri(bucket_uri)), 76 '%-10s %s/sub1/' % (18, suri(bucket_uri)), 77 ])) 78 _Check() 79 80 def test_multi_args(self): 81 """Tests running du with multiple command line arguments.""" 82 bucket_uri = self.CreateBucket() 83 obj_uri1 = self.CreateObject(bucket_uri=bucket_uri, contents='foo') 84 obj_uri2 = self.CreateObject(bucket_uri=bucket_uri, contents='foo2') 85 # Use @Retry as hedge against bucket listing eventual consistency. 86 @Retry(AssertionError, tries=3, timeout_secs=1) 87 def _Check(): 88 stdout = self.RunGsUtil(['du', suri(obj_uri1), suri(obj_uri2)], 89 return_stdout=True) 90 self.assertSetEqual(set(stdout.splitlines()), set([ 91 '%-10s %s' % (3, suri(obj_uri1)), 92 '%-10s %s' % (4, suri(obj_uri2)), 93 ])) 94 _Check() 95 96 def test_total(self): 97 """Tests total size listing via the -c flag.""" 98 bucket_uri = self.CreateBucket() 99 obj_uri1 = self.CreateObject(bucket_uri=bucket_uri, contents='foo') 100 obj_uri2 = self.CreateObject(bucket_uri=bucket_uri, contents='zebra') 101 # Use @Retry as hedge against bucket listing eventual consistency. 102 @Retry(AssertionError, tries=3, timeout_secs=1) 103 def _Check(): 104 stdout = self.RunGsUtil(['du', '-c', suri(bucket_uri)], 105 return_stdout=True) 106 self.assertSetEqual(set(stdout.splitlines()), set([ 107 '%-10s %s' % (3, suri(obj_uri1)), 108 '%-10s %s' % (5, suri(obj_uri2)), 109 '%-10s total' % 8, 110 ])) 111 _Check() 112 113 def test_human_readable(self): 114 obj_uri = self.CreateObject(contents='x' * 2048) 115 # Use @Retry as hedge against bucket listing eventual consistency. 116 @Retry(AssertionError, tries=3, timeout_secs=1) 117 def _Check(): 118 stdout = self.RunGsUtil(['du', '-h', suri(obj_uri)], return_stdout=True) 119 self.assertEqual(stdout, '%-10s %s\n' % ('2 KiB', suri(obj_uri))) 120 _Check() 121 122 def test_summary(self): 123 """Tests summary listing with the -s flag.""" 124 bucket_uri1, _ = self._create_nested_subdir() 125 bucket_uri2, _ = self._create_nested_subdir() 126 127 # Use @Retry as hedge against bucket listing eventual consistency. 128 @Retry(AssertionError, tries=3, timeout_secs=1) 129 def _Check(): 130 stdout = self.RunGsUtil([ 131 'du', '-s', suri(bucket_uri1), suri(bucket_uri2)], return_stdout=True) 132 self.assertSetEqual(set(stdout.splitlines()), set([ 133 '%-10s %s' % (18, suri(bucket_uri1)), 134 '%-10s %s' % (18, suri(bucket_uri2)), 135 ])) 136 _Check() 137 138 def test_subdir_summary(self): 139 """Tests summary listing with the -s flag on a subdirectory.""" 140 bucket_uri1, _ = self._create_nested_subdir() 141 bucket_uri2, _ = self._create_nested_subdir() 142 subdir1 = suri(bucket_uri1, 'sub1') 143 subdir2 = suri(bucket_uri2, 'sub1') 144 145 # Use @Retry as hedge against bucket listing eventual consistency. 146 @Retry(AssertionError, tries=3, timeout_secs=1) 147 def _Check(): 148 stdout = self.RunGsUtil( 149 ['du', '-s', subdir1, subdir2], return_stdout=True) 150 self.assertSetEqual(set(stdout.splitlines()), set([ 151 '%-10s %s' % (18, subdir1), 152 '%-10s %s' % (18, subdir2), 153 ])) 154 _Check() 155 156 @SkipForS3('S3 lists versions in reverse order.') 157 def test_versioned(self): 158 """Tests listing all versions with the -a flag.""" 159 bucket_uri = self.CreateVersionedBucket() 160 object_uri1 = self.CreateObject( 161 bucket_uri=bucket_uri, object_name='foo', contents='foo') 162 object_uri2 = self.CreateObject( 163 bucket_uri=bucket_uri, object_name='foo', contents='foo2') 164 165 # Use @Retry as hedge against bucket listing eventual consistency. 166 @Retry(AssertionError, tries=3, timeout_secs=1) 167 def _Check1(): 168 stdout = self.RunGsUtil(['du', suri(bucket_uri)], return_stdout=True) 169 self.assertEqual(stdout, '%-10s %s\n' % (4, suri(object_uri2))) 170 _Check1() 171 172 # Use @Retry as hedge against bucket listing eventual consistency. 173 @Retry(AssertionError, tries=3, timeout_secs=1) 174 def _Check2(): 175 stdout = self.RunGsUtil(['du', '-a', suri(bucket_uri)], 176 return_stdout=True) 177 self.assertSetEqual(set(stdout.splitlines()), set([ 178 '%-10s %s#%s' % ( 179 3, suri(object_uri1), object_uri1.generation), 180 '%-10s %s#%s' % ( 181 4, suri(object_uri2), object_uri2.generation), 182 ])) 183 _Check2() 184 185 def test_null_endings(self): 186 """Tests outputting 0-endings with the -0 flag.""" 187 bucket_uri = self.CreateBucket() 188 obj_uri1 = self.CreateObject(bucket_uri=bucket_uri, contents='foo') 189 obj_uri2 = self.CreateObject(bucket_uri=bucket_uri, contents='zebra') 190 # Use @Retry as hedge against bucket listing eventual consistency. 191 @Retry(AssertionError, tries=3, timeout_secs=1) 192 def _Check(): 193 stdout = self.RunGsUtil(['du', '-0c', suri(bucket_uri)], 194 return_stdout=True) 195 self.assertSetEqual(set(stdout.split('\0')), set([ 196 '%-10s %s' % (3, suri(obj_uri1)), 197 '%-10s %s' % (5, suri(obj_uri2)), 198 '%-10s total' % 8, 199 '' 200 ])) 201 _Check() 202 203 def test_excludes(self): 204 """Tests exclude pattern excluding certain file paths.""" 205 bucket_uri, obj_uris = self._create_nested_subdir() 206 207 # Use @Retry as hedge against bucket listing eventual consistency. 208 @Retry(AssertionError, tries=3, timeout_secs=1) 209 def _Check(): 210 stdout = self.RunGsUtil([ 211 'du', '-e', '*sub2/five*', '-e', '*sub1/four', 212 suri(bucket_uri)], return_stdout=True) 213 self.assertSetEqual(set(stdout.splitlines()), set([ 214 '%-10s %s' % (5, suri(obj_uris[0])), 215 '%-10s %s' % (4, suri(obj_uris[3])), 216 '%-10s %s/sub1/sub2/' % (4, suri(bucket_uri)), 217 '%-10s %s/sub1/' % (9, suri(bucket_uri)), 218 ])) 219 _Check() 220 221 def test_excludes_file(self): 222 """Tests file exclusion with the -X flag.""" 223 bucket_uri, obj_uris = self._create_nested_subdir() 224 fpath = self.CreateTempFile(contents='*sub2/five*\n*sub1/four') 225 226 # Use @Retry as hedge against bucket listing eventual consistency. 227 @Retry(AssertionError, tries=3, timeout_secs=1) 228 def _Check(): 229 stdout = self.RunGsUtil([ 230 'du', '-X', fpath, suri(bucket_uri)], return_stdout=True) 231 self.assertSetEqual(set(stdout.splitlines()), set([ 232 '%-10s %s' % (5, suri(obj_uris[0])), 233 '%-10s %s' % (4, suri(obj_uris[3])), 234 '%-10s %s/sub1/sub2/' % (4, suri(bucket_uri)), 235 '%-10s %s/sub1/' % (9, suri(bucket_uri)), 236 ])) 237 _Check() 238