Commit Diff


commit - 08929296955e1e20335c988ec086374a27d9798a
commit + 3993ce191a9f45ba6e35664f655860c64411a2c5
blob - eac48c7629e0b0b5adca38ef6855c8f6823f7e53
blob + 347605671f5ebbe68dd9cd885afd8d698b99e271
--- dir.go
+++ dir.go
@@ -20,9 +20,14 @@ type directoryHandle struct {
 }
 
 func (d *directoryHandle) Stat() (fs.FileInfo, error) {
+	sz, err := d.dir.Size()
+	if err != nil {
+		return nil, err
+	}
+
 	return &fileInfo{
 		name: d.dir.name,
-		size: 4096,
+		size: sz,
 		mode: d.dir.mode | fs.ModeDir,
 	}, nil
 }
@@ -34,3 +39,39 @@ func (d *directoryHandle) Read(data []byte) (int, erro
 func (d *directoryHandle) Close() error {
 	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
+}
blob - f9798ea716c4a97b5630e85b72f900ee49b2858f
blob + 6053970e504c914f3828b214df85539135e3825e
--- vfs_test.go
+++ vfs_test.go
@@ -44,13 +44,13 @@ func TestVFS_Basic(t *testing.T) {
 
 func TestVFS_MockFile(t *testing.T) {
 	vfs := NewVFS()
-	path := "test.txt"
+	p := "test.txt"
 	sz := int64(8096)
 
-	err := vfs.CreateMockFile(path, sz, 0666)
+	err := vfs.CreateMockFile(p, sz, 0666)
 	assert.NoError(t, err)
 
-	fp, err := vfs.Open(path)
+	fp, err := vfs.Open(p)
 	assert.NoError(t, err)
 
 	stat, err := fp.Stat()
@@ -60,3 +60,49 @@ func TestVFS_MockFile(t *testing.T) {
 	err = fp.Close()
 	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)
+}