From 1b65aaf88752ef0fd83ad3b6965e18c6aa866435 Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Mon, 2 Mar 2015 14:37:01 +1100 Subject: [PATCH] Refactored invariant checking. --- samples/memfs/fs.go | 35 ++++++++++++++++++++++------------- samples/memfs/inode.go | 16 ++++++++++++++++ 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/samples/memfs/fs.go b/samples/memfs/fs.go index ffe376d..9193964 100644 --- a/samples/memfs/fs.go +++ b/samples/memfs/fs.go @@ -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( diff --git a/samples/memfs/inode.go b/samples/memfs/inode.go index 91cad95..d3ae224 100644 --- a/samples/memfs/inode.go +++ b/samples/memfs/inode.go @@ -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))) + } +}