Skip to content

Commit 298a692

Browse files
Merge pull request #155 from jannero/free_space
Fix disk usage calculations when too large file is created
2 parents 315d635 + 1c486a8 commit 298a692

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed

fake_filesystem_test.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4165,6 +4165,25 @@ def setUp(self):
41654165
self.filesystem = fake_filesystem.FakeFilesystem(path_separator='!', total_size=100)
41664166
self.os = fake_filesystem.FakeOsModule(self.filesystem)
41674167

4168+
def testDiskUsageOnFileCreation(self):
4169+
fake_open = fake_filesystem.FakeFileOpen(self.filesystem)
4170+
4171+
total_size = 100
4172+
self.filesystem.AddMountPoint('mount', total_size)
4173+
def create_too_large_file():
4174+
with fake_open('!mount!file', 'w') as dest:
4175+
dest.write('a' * (total_size + 1))
4176+
4177+
self.assertRaises((OSError, IOError), create_too_large_file)
4178+
4179+
self.assertEqual(0, self.filesystem.GetDiskUsage('!mount').used)
4180+
4181+
with fake_open('!mount!file', 'w') as dest:
4182+
dest.write('a' * total_size)
4183+
4184+
self.assertEqual(total_size, self.filesystem.GetDiskUsage('!mount').used)
4185+
4186+
41684187
def testFileSystemSizeAfterLargeFileCreation(self):
41694188
filesystem = fake_filesystem.FakeFilesystem(path_separator='!',
41704189
total_size=1024 * 1024 * 1024 * 100)
@@ -4203,29 +4222,45 @@ def testFileSystemSizeAfterDirectoryRemoval(self):
42034222
self.assertEqual((100, 40, 60), self.filesystem.GetDiskUsage())
42044223

42054224
def testCreatingFileWithFittingContent(self):
4225+
initial_usage = self.filesystem.GetDiskUsage()
4226+
42064227
try:
42074228
self.filesystem.CreateFile('!foo!bar', contents=b'a' * 100)
42084229
except IOError:
42094230
self.fail('File with contents fitting into disk space could not be written.')
42104231

4232+
self.assertEqual(initial_usage.used + 100, self.filesystem.GetDiskUsage().used)
4233+
42114234
def testCreatingFileWithContentTooLarge(self):
42124235
def create_large_file():
42134236
self.filesystem.CreateFile('!foo!bar', contents=b'a' * 101)
42144237

4238+
initial_usage = self.filesystem.GetDiskUsage()
4239+
42154240
self.assertRaises(IOError, create_large_file)
42164241

4242+
self.assertEqual(initial_usage, self.filesystem.GetDiskUsage())
4243+
42174244
def testCreatingFileWithFittingSize(self):
4245+
initial_usage = self.filesystem.GetDiskUsage()
4246+
42184247
try:
42194248
self.filesystem.CreateFile('!foo!bar', st_size=100)
42204249
except IOError:
42214250
self.fail('File with size fitting into disk space could not be written.')
42224251

4252+
self.assertEqual(initial_usage.used + 100, self.filesystem.GetDiskUsage().used)
4253+
42234254
def testCreatingFileWithSizeTooLarge(self):
4255+
initial_usage = self.filesystem.GetDiskUsage()
4256+
42244257
def create_large_file():
42254258
self.filesystem.CreateFile('!foo!bar', st_size=101)
42264259

42274260
self.assertRaises(IOError, create_large_file)
42284261

4262+
self.assertEqual(initial_usage, self.filesystem.GetDiskUsage())
4263+
42294264
def testResizeFileWithFittingSize(self):
42304265
file_object = self.filesystem.CreateFile('!foo!bar', st_size=50)
42314266
try:

pyfakefs/fake_filesystem.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -308,10 +308,10 @@ def _SetInitialContents(self, contents, encoding):
308308
if self.byte_contents:
309309
self.SetSize(0)
310310
current_size = self.st_size or 0
311+
if self.filesystem:
312+
self.filesystem.ChangeDiskUsage(st_size - current_size, self.name, self.st_dev)
311313
self.byte_contents = contents
312314
self.st_size = st_size
313-
if self.filesystem:
314-
self.filesystem.ChangeDiskUsage(self.st_size - current_size, self.name, self.st_dev)
315315
self.epoch += 1
316316

317317
def SetContents(self, contents, encoding=None):

0 commit comments

Comments
 (0)