add directory size calculations
This commit is contained in:
		
							
								
								
									
										43
									
								
								dir.go
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								dir.go
									
									
									
									
									
								
							| @@ -20,9 +20,14 @@ type directoryHandle struct { | |||||||
| } | } | ||||||
|  |  | ||||||
| func (d *directoryHandle) Stat() (fs.FileInfo, error) { | func (d *directoryHandle) Stat() (fs.FileInfo, error) { | ||||||
|  | 	sz, err := d.dir.Size() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return &fileInfo{ | 	return &fileInfo{ | ||||||
| 		name: d.dir.name, | 		name: d.dir.name, | ||||||
| 		size: 4096, | 		size: sz, | ||||||
| 		mode: d.dir.mode | fs.ModeDir, | 		mode: d.dir.mode | fs.ModeDir, | ||||||
| 	}, nil | 	}, nil | ||||||
| } | } | ||||||
| @@ -34,3 +39,39 @@ func (d *directoryHandle) Read(data []byte) (int, error) { | |||||||
| func (d *directoryHandle) Close() error { | func (d *directoryHandle) Close() error { | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (d *directory) Size() (int64, error) { | ||||||
|  | 	sum := int64(0) | ||||||
|  | 	for _, e := range d.children { | ||||||
|  | 		switch v := e.(type) { | ||||||
|  | 		case *directory: | ||||||
|  | 			dir := v | ||||||
|  | 			sz, err := dir.Size() | ||||||
|  | 			if err != nil { | ||||||
|  | 				return 0, err | ||||||
|  | 			} | ||||||
|  | 			sum += sz | ||||||
|  |  | ||||||
|  | 		case *MockFile: | ||||||
|  | 			f := v | ||||||
|  | 			f.open = true | ||||||
|  | 			stat, err := f.Stat() | ||||||
|  | 			if err != nil { | ||||||
|  | 				return 0, err | ||||||
|  | 			} | ||||||
|  | 			sum += stat.Size() | ||||||
|  | 			f.open = false | ||||||
|  |  | ||||||
|  | 		case *File: | ||||||
|  | 			f := v | ||||||
|  | 			f.open = true | ||||||
|  | 			stat, err := f.Stat() | ||||||
|  | 			if err != nil { | ||||||
|  | 				return 0, err | ||||||
|  | 			} | ||||||
|  | 			sum += stat.Size() | ||||||
|  | 			f.open = false | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return sum, nil | ||||||
|  | } | ||||||
|   | |||||||
							
								
								
									
										52
									
								
								vfs_test.go
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								vfs_test.go
									
									
									
									
									
								
							| @@ -44,13 +44,13 @@ func TestVFS_Basic(t *testing.T) { | |||||||
|  |  | ||||||
| func TestVFS_MockFile(t *testing.T) { | func TestVFS_MockFile(t *testing.T) { | ||||||
| 	vfs := NewVFS() | 	vfs := NewVFS() | ||||||
| 	path := "test.txt" | 	p := "test.txt" | ||||||
| 	sz := int64(8096) | 	sz := int64(8096) | ||||||
|  |  | ||||||
| 	err := vfs.CreateMockFile(path, sz, 0666) | 	err := vfs.CreateMockFile(p, sz, 0666) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
|  |  | ||||||
| 	fp, err := vfs.Open(path) | 	fp, err := vfs.Open(p) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
|  |  | ||||||
| 	stat, err := fp.Stat() | 	stat, err := fp.Stat() | ||||||
| @@ -60,3 +60,49 @@ func TestVFS_MockFile(t *testing.T) { | |||||||
| 	err = fp.Close() | 	err = fp.Close() | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func TestVFS_DirSize(t *testing.T) { | ||||||
|  | 	vfs := NewVFS() | ||||||
|  |  | ||||||
|  | 	err := vfs.MkdirAll("root/one", 0777) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  |  | ||||||
|  | 	err = vfs.MkdirAll("root/two", 0777) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  |  | ||||||
|  | 	files := []string{ | ||||||
|  | 		"root/one/f1", | ||||||
|  | 		"root/one/f2", | ||||||
|  | 		"root/two/f1", | ||||||
|  | 		"root/two/f2", | ||||||
|  | 		"root/two/f3", | ||||||
|  | 		"root/two/f4", | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	sz := int64(1) | ||||||
|  | 	for _, file := range files { | ||||||
|  | 		err = vfs.CreateMockFile(file, sz, 0666) | ||||||
|  | 		assert.NoError(t, err) | ||||||
|  |  | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	fp, err := vfs.Open("root/one") | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  |  | ||||||
|  | 	stat, err := fp.Stat() | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	assert.Equal(t, stat.Size(), int64(2)) | ||||||
|  |  | ||||||
|  | 	err = fp.Close() | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  |  | ||||||
|  | 	fp, err = vfs.Open("root/two") | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  |  | ||||||
|  | 	stat, err = fp.Stat() | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	assert.Equal(t, stat.Size(), int64(4)) | ||||||
|  |  | ||||||
|  | 	err = fp.Close() | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user