blob: 22de38c8cc9fd4b6e3596a385c589aafd5b6c3d7 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package util_test
import (
"bytes"
"reflect"
"testing"
"v.io/v23/security/access"
"v.io/v23/verror"
_ "v.io/x/ref/runtime/factories/generic"
sbtu "v.io/x/ref/services/syncbase/testutil"
"v.io/x/sensorlog_lite/internal/util"
)
func TestCreateOrOpenDB(t *testing.T) {
_, ctxOwner, sbName, rootPrincipal, cleanup := sbtu.SetupOrDieCustom("one", "syncbase/one", nil)
defer cleanup()
ctxGuest := sbtu.NewCtx(ctxOwner, rootPrincipal, "two")
// Try to open app/db (create both) as guest, fail with ErrNoAccess.
if _, err := util.CreateOrOpenDB(ctxGuest, sbName); verror.ErrorID(err) != verror.ErrNoAccess.ID {
t.Errorf("CreateOrOpenDB should have failed with ErrNoAccess, got error: %v", err)
}
// Open app/db (create both) as owner.
dbOwner, err := util.CreateOrOpenDB(ctxOwner, sbName)
if err != nil {
t.Fatalf("CreateOrOpenDB should have succeeded, got error: %v", err)
}
// Open existing app/db as guest.
if _, err := util.CreateOrOpenDB(ctxGuest, sbName); err != nil {
t.Errorf("CreateOrOpenDB should have succeeded, got error: %v", err)
}
// Destroy db (but not app) to simulate interrupted creation.
if err := dbOwner.Destroy(ctxOwner); err != nil {
t.Errorf("dbOwner.Destroy should have succeeded, got error: %v", err)
}
// Try to open app/db (create db) as guest, fail with ErrNoAccess.
if _, err := util.CreateOrOpenDB(ctxGuest, sbName); verror.ErrorID(err) != verror.ErrNoAccess.ID {
t.Errorf("CreateOrOpenDB should have failed with ErrNoAccess, got error: %v", err)
}
// Open app/db (recreate db) as owner.
dbOwner, err = util.CreateOrOpenDB(ctxOwner, sbName)
if err != nil {
t.Fatalf("CreateOrOpenDB should have succeeded, got error: %v", err)
}
// Open recreated app/db as guest.
if _, err := util.CreateOrOpenDB(ctxGuest, sbName); err != nil {
t.Errorf("CreateOrOpenDB should have succeeded, got error: %v", err)
}
// Expect db permissions with full access for owner, resolve only for others.
expectPerms, err := access.ReadPermissions(bytes.NewBufferString(`{
"Admin":{"In":["root/one"]},
"Read":{"In":["root/one"]},
"Write":{"In":["root/one"]},
"Debug":{"In":["root/one"]},
"Resolve":{"In":["..."]}
}`))
if err != nil {
t.Fatalf("ReadPermissions should have succeeded, got error: %v", err)
}
if perms, _, err := dbOwner.GetPermissions(ctxOwner); err != nil {
t.Errorf("GetPermissions should have succeeded, got error: %v", err)
} else if got, want := perms, expectPerms; !reflect.DeepEqual(got, want) {
t.Errorf("Unexpected database permissions: got %v, want %v", got, want)
}
}