Refactored invariant checking.

geesefs-0-30-9
Aaron Jacobs 2015-03-02 14:37:01 +11:00
parent a0a0963c49
commit 1b65aaf887
2 changed files with 38 additions and 13 deletions

View File

@ -5,7 +5,6 @@ package memfs
import (
"fmt"
"reflect"
"github.com/jacobsa/fuse"
"github.com/jacobsa/fuse/fuseutil"
@ -58,6 +57,11 @@ func NewMemFS(
}
func (fs *memFS) checkInvariants() {
// Check general inode invariants.
for i := range fs.inodes {
fs.inodes[i].checkInvariants()
}
// Check reserved inodes.
for i := 0; i < fuse.RootInodeID; i++ {
var inode *inode = &fs.inodes[i]
@ -67,27 +71,32 @@ func (fs *memFS) checkInvariants() {
}
// Check the root inode.
fs.inodes[fuse.RootInodeID].impl.(*dir)
_ = fs.inodes[fuse.RootInodeID].impl.(*memDir)
// Check inodes, building our own set of free IDs.
freeIDsEncountered := make(map[fuse.InodeID]struct{})
for i := range fs.inodes {
for i := fuse.RootInodeID + 1; i < len(fs.inodes); i++ {
var inode *inode = &fs.inodes[i]
if inode.impl == nil {
freeIDsEncountered[i] = struct{}{}
freeIDsEncountered[fuse.InodeID(i)] = struct{}{}
continue
}
// Check for known types.
switch inode.impl.(type) {
case *memFile:
case *memDir:
default:
panic(fmt.Sprintf("Unknown inode type: %v", reflect.TypeOf(inode.impl)))
}
}
panic("TODO")
// Check fs.freeInodes.
if len(fs.freeInodes) != len(freeIDsEncountered) {
panic(
fmt.Sprintf(
"Length mismatch: %v vs. %v",
len(fs.freeInodes),
len(freeIDsEncountered)))
}
for _, id := range fs.freeInodes {
if _, ok := freeIDsEncountered[id]; !ok {
panic(fmt.Sprintf("Unexected free inode ID: %v", id))
}
}
}
func (fs *memFS) Init(

View File

@ -3,6 +3,11 @@
package memfs
import (
"fmt"
"reflect"
)
// Common attributes for files and directories.
//
// TODO(jacobsa): Add tests for interacting with a file/directory after it has
@ -15,3 +20,14 @@ type inode struct {
// INVARIANT: impl is nil, or of type *memFile or *memDir
impl interface{}
}
func (inode *inode) checkInvariants() {
switch inode.impl.(type) {
case nil:
case *memFile:
case *memDir:
default:
panic(
fmt.Sprintf("Unexpected inode impl type: %v", reflect.TypeOf(inode.impl)))
}
}