blob: 3b705371f072b4f13448b2fda40ec6994e0e11f8 [file] [log] [blame]
package auditor
import (
"fmt"
"io/ioutil"
"os"
"path"
"reflect"
"testing"
"time"
"veyron/security/audit"
"veyron2/rt"
"veyron2/security"
)
func TestFileAuditor(t *testing.T) {
r := rt.Init()
defer r.Cleanup()
// Setup a directory where the audit logs will be stored.
dir, err := ioutil.TempDir("", "TestFileAuditor")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(dir)
prefix := path.Join(dir, "log")
auditor, err := NewFileAuditor(prefix)
if err != nil {
t.Fatal(err)
}
provider, _ := r.NewIdentity("provider")
provider = audit.NewPrivateID(provider, auditor)
blessee := func() security.PublicID {
priv, _ := r.NewIdentity("blessee")
return priv.PublicID()
}()
// Bless a bunch of names
for idx, name := range []string{"brucewayne", "batman", "bugsbunny", "daffyduck", "batman", "bugsbunny", "brucewayne"} {
if _, err := provider.Bless(blessee, name, time.Hour, nil); err != nil {
t.Fatalf("Bless(#%d, %v, ...) failed: %v", idx, name, err)
}
}
tests := []struct {
Filter string
Want []string
}{
{"", []string{"brucewayne", "batman", "bugsbunny", "daffyduck", "batman", "bugsbunny", "brucewayne"}},
{"/", []string{"brucewayne", "batman", "bugsbunny", "daffyduck", "batman", "bugsbunny", "brucewayne"}},
{"batman", []string{"batman", "batman"}},
{"daffyduck", []string{"daffyduck"}},
{"elmerfudd", []string{}},
}
for _, test := range tests {
ch, err := ReadAuditLog(prefix, test.Filter)
if err != nil {
t.Errorf("ReadAuditLog(%q, %q) failed: %v", prefix, test.Filter, err)
continue
}
channelloop:
for i, want := range test.Want {
got := <-ch
testinfo := fmt.Sprintf("in test %+v (%d/%d)", test, i, len(want))
if got.Method != "Bless" {
t.Errorf("Got %q, wanted the Bless method %s", got, testinfo)
break channelloop
}
if arg := got.Arguments[0]; !reflect.DeepEqual(arg, blessee) {
t.Errorf("First argument was %v, wanted %v", arg, blessee, testinfo)
break channelloop
}
if arg := got.Arguments[1].(string); arg != want {
t.Errorf("Second argument was %v, wanted %v %s", arg, want, testinfo)
break channelloop
}
}
select {
case entry, open := <-ch:
if open {
for _ = range ch {
// Drain the channel to prevent the producer goroutines from being leaked.
}
t.Errorf("Got more entries that expected (such as %v) for test %+v", entry, test)
}
default:
}
}
}