From f2790cb57425030958e416d0d0119a42b0af152f Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 26 Oct 2022 12:55:47 +0200 Subject: [PATCH] Change tree methods and start adding tree tests --- client/storage/liststorage.go | 4 +- client/storage/spacestorage.go | 4 +- client/storage/treestorage.go | 24 ++++----- common/commonspace/service.go | 4 +- common/commonspace/storage/storage.go | 8 +-- common/commonspace/synctree/synctree.go | 1 - common/pkg/acl/list/list.go | 12 ++--- common/pkg/acl/storage/inmemory.go | 17 +++--- common/pkg/acl/storage/liststorage.go | 2 +- common/pkg/acl/storage/provider.go | 1 - common/pkg/acl/storage/storage.go | 5 -- common/pkg/acl/storage/treestorage.go | 2 +- .../acllistbuilder/liststoragebuilder.go | 4 +- common/pkg/acl/tree/objecttree_test.go | 8 +-- common/pkg/acl/tree/objecttreefactory.go | 19 +++---- node/storage/liststorage.go | 4 +- node/storage/spacestorage.go | 4 +- node/storage/treestorage.go | 28 +++++----- node/storage/treestorage_test.go | 54 +++++++++++++++++++ 19 files changed, 120 insertions(+), 85 deletions(-) delete mode 100644 common/pkg/acl/storage/storage.go create mode 100644 node/storage/treestorage_test.go diff --git a/client/storage/liststorage.go b/client/storage/liststorage.go index 3d784c31..6fad213d 100644 --- a/client/storage/liststorage.go +++ b/client/storage/liststorage.go @@ -77,8 +77,8 @@ func createListStorage(spaceId string, db *badger.DB, txn *badger.Txn, root *acl return } -func (l *listStorage) ID() (string, error) { - return l.id, nil +func (l *listStorage) ID() string { + return l.id } func (l *listStorage) Root() (*aclrecordproto.RawACLRecordWithId, error) { diff --git a/client/storage/spacestorage.go b/client/storage/spacestorage.go index f0b65045..58f43482 100644 --- a/client/storage/spacestorage.go +++ b/client/storage/spacestorage.go @@ -77,8 +77,8 @@ func createSpaceStorage(db *badger.DB, payload spacestorage.SpaceStorageCreatePa return } -func (s *spaceStorage) ID() (string, error) { - return s.spaceId, nil +func (s *spaceStorage) ID() string { + return s.spaceId } func (s *spaceStorage) TreeStorage(id string) (storage2.TreeStorage, error) { diff --git a/client/storage/treestorage.go b/client/storage/treestorage.go index bede0bc5..60c74c9f 100644 --- a/client/storage/treestorage.go +++ b/client/storage/treestorage.go @@ -2,7 +2,7 @@ package storage import ( "context" - storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + storage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" "github.com/dgraph-io/badger/v3" ) @@ -14,7 +14,7 @@ type treeStorage struct { root *treechangeproto.RawTreeChangeWithId } -func newTreeStorage(db *badger.DB, spaceId, treeId string) (ts storage2.TreeStorage, err error) { +func newTreeStorage(db *badger.DB, spaceId, treeId string) (ts storage.TreeStorage, err error) { keys := newTreeKeys(spaceId, treeId) err = db.View(func(txn *badger.Txn) error { _, err := txn.Get(keys.RootIdKey()) @@ -43,14 +43,14 @@ func newTreeStorage(db *badger.DB, spaceId, treeId string) (ts storage2.TreeStor return } -func createTreeStorage(db *badger.DB, spaceId string, payload storage2.TreeStorageCreatePayload) (ts storage2.TreeStorage, err error) { - keys := newTreeKeys(spaceId, payload.TreeId) +func createTreeStorage(db *badger.DB, spaceId string, payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { + keys := newTreeKeys(spaceId, payload.RootRawChange.Id) if hasDB(db, keys.RootIdKey()) { - err = storage2.ErrTreeExists + err = storage.ErrTreeExists return } err = db.Update(func(txn *badger.Txn) error { - heads := storage2.CreateHeadsPayload(payload.Heads) + heads := storage.CreateHeadsPayload(payload.Heads) for _, ch := range payload.Changes { err = txn.Set(keys.RawChangeKey(ch.Id), ch.GetRawChange()) @@ -85,8 +85,8 @@ func createTreeStorage(db *badger.DB, spaceId string, payload storage2.TreeStora return } -func (t *treeStorage) ID() (string, error) { - return t.id, nil +func (t *treeStorage) ID() string { + return t.id } func (t *treeStorage) Root() (raw *treechangeproto.RawTreeChangeWithId, err error) { @@ -97,16 +97,16 @@ func (t *treeStorage) Heads() (heads []string, err error) { headsBytes, err := getDB(t.db, t.keys.HeadsKey()) if err != nil { if err == badger.ErrKeyNotFound { - err = storage2.ErrUnknownTreeId + err = storage.ErrUnknownTreeId } return } - heads = storage2.ParseHeads(headsBytes) + heads = storage.ParseHeads(headsBytes) return } func (t *treeStorage) SetHeads(heads []string) (err error) { - payload := storage2.CreateHeadsPayload(heads) + payload := storage.CreateHeadsPayload(heads) return putDB(t.db, t.keys.HeadsKey(), payload) } @@ -118,7 +118,7 @@ func (t *treeStorage) GetRawChange(ctx context.Context, id string) (raw *treecha res, err := getDB(t.db, t.keys.RawChangeKey(id)) if err != nil { if err == badger.ErrKeyNotFound { - err = storage2.ErrUnknownTreeId + err = storage.ErrUnknownTreeId } return } diff --git a/common/commonspace/service.go b/common/commonspace/service.go index 53e22aee..8ab4d9f5 100644 --- a/common/commonspace/service.go +++ b/common/commonspace/service.go @@ -64,7 +64,7 @@ func (s *service) CreateSpace( return } - return store.ID() + return store.ID(), nil } func (s *service) DeriveSpace( @@ -79,7 +79,7 @@ func (s *service) DeriveSpace( return } - return store.ID() + return store.ID(), nil } func (s *service) GetSpace(ctx context.Context, id string) (Space, error) { diff --git a/common/commonspace/storage/storage.go b/common/commonspace/storage/storage.go index eeee74a2..a469a4b1 100644 --- a/common/commonspace/storage/storage.go +++ b/common/commonspace/storage/storage.go @@ -6,7 +6,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" - storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + storage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" ) const CName = "commonspace.storage" @@ -15,9 +15,9 @@ var ErrSpaceStorageExists = errors.New("space storage exists") var ErrSpaceStorageMissing = errors.New("space storage missing") type SpaceStorage interface { - storage2.Storage - storage2.Provider - ACLStorage() (storage2.ListStorage, error) + storage.Provider + ID() string + ACLStorage() (storage.ListStorage, error) SpaceHeader() (*spacesyncproto.RawSpaceHeaderWithId, error) StoredIds() ([]string, error) Close() error diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index c8e17602..451b9a16 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -149,7 +149,6 @@ func BuildSyncTreeOrGetRemote(ctx context.Context, id string, deps BuildDeps) (t fullSyncResp := resp.GetContent().GetFullSyncResponse() payload := storage.TreeStorageCreatePayload{ - TreeId: id, RootRawChange: resp.RootChange, Changes: fullSyncResp.Changes, Heads: fullSyncResp.Heads, diff --git a/common/pkg/acl/list/list.go b/common/pkg/acl/list/list.go index a86b2bc8..147d2224 100644 --- a/common/pkg/acl/list/list.go +++ b/common/pkg/acl/list/list.go @@ -50,20 +50,14 @@ type aclList struct { } func BuildACLListWithIdentity(acc *account.AccountData, storage storage.ListStorage) (ACLList, error) { - id, err := storage.ID() - if err != nil { - return nil, err - } + id := storage.ID() builder := newACLStateBuilderWithIdentity(acc) return build(id, builder, newACLRecordBuilder(id, common.NewKeychain()), storage) } func BuildACLList(storage storage.ListStorage) (ACLList, error) { - id, err := storage.ID() - if err != nil { - return nil, err - } - return build(id, newACLStateBuilder(), newACLRecordBuilder(id, common.NewKeychain()), storage) + id := storage.ID() + return build(storage.ID(), newACLStateBuilder(), newACLRecordBuilder(id, common.NewKeychain()), storage) } func build(id string, stateBuilder *aclStateBuilder, recBuilder ACLRecordBuilder, storage storage.ListStorage) (list ACLList, err error) { diff --git a/common/pkg/acl/storage/inmemory.go b/common/pkg/acl/storage/inmemory.go index 11843de7..5c39e94d 100644 --- a/common/pkg/acl/storage/inmemory.go +++ b/common/pkg/acl/storage/inmemory.go @@ -56,10 +56,10 @@ func (i *inMemoryACLListStorage) AddRawRecord(ctx context.Context, rec *aclrecor panic("implement me") } -func (i *inMemoryACLListStorage) ID() (string, error) { +func (i *inMemoryACLListStorage) ID() string { i.RLock() defer i.RUnlock() - return i.id, nil + return i.id } type inMemoryTreeStorage struct { @@ -72,7 +72,6 @@ type inMemoryTreeStorage struct { } func NewInMemoryTreeStorage( - treeId string, root *treechangeproto.RawTreeChangeWithId, heads []string, changes []*treechangeproto.RawTreeChangeWithId) (TreeStorage, error) { @@ -80,10 +79,10 @@ func NewInMemoryTreeStorage( for _, ch := range changes { allChanges[ch.Id] = ch } - allChanges[treeId] = root + allChanges[root.Id] = root return &inMemoryTreeStorage{ - id: treeId, + id: root.Id, root: root, heads: heads, changes: allChanges, @@ -96,10 +95,10 @@ func (t *inMemoryTreeStorage) HasChange(ctx context.Context, id string) (bool, e return exists, nil } -func (t *inMemoryTreeStorage) ID() (string, error) { +func (t *inMemoryTreeStorage) ID() string { t.RLock() defer t.RUnlock() - return t.id, nil + return t.id } func (t *inMemoryTreeStorage) Root() (*treechangeproto.RawTreeChangeWithId, error) { @@ -159,12 +158,12 @@ func (i *inMemoryStorageProvider) TreeStorage(id string) (TreeStorage, error) { func (i *inMemoryStorageProvider) CreateTreeStorage(payload TreeStorageCreatePayload) (TreeStorage, error) { i.Lock() defer i.Unlock() - res, err := NewInMemoryTreeStorage(payload.TreeId, payload.RootRawChange, payload.Heads, payload.Changes) + res, err := NewInMemoryTreeStorage(payload.RootRawChange, payload.Heads, payload.Changes) if err != nil { return nil, err } - i.objects[payload.TreeId] = res + i.objects[payload.RootRawChange.Id] = res return res, nil } diff --git a/common/pkg/acl/storage/liststorage.go b/common/pkg/acl/storage/liststorage.go index 42f80110..81bb43cc 100644 --- a/common/pkg/acl/storage/liststorage.go +++ b/common/pkg/acl/storage/liststorage.go @@ -12,7 +12,7 @@ var ErrACLExists = errors.New("acl already exists") var ErrUnknownRecord = errors.New("record doesn't exist") type ListStorage interface { - Storage + ID() string Root() (*aclrecordproto.RawACLRecordWithId, error) Head() (string, error) SetHead(headId string) error diff --git a/common/pkg/acl/storage/provider.go b/common/pkg/acl/storage/provider.go index da46ab41..51b53b4f 100644 --- a/common/pkg/acl/storage/provider.go +++ b/common/pkg/acl/storage/provider.go @@ -10,7 +10,6 @@ var ErrTreeExists = errors.New("tree already exists") var ErrUnkownChange = errors.New("change doesn't exist") type TreeStorageCreatePayload struct { - TreeId string RootRawChange *treechangeproto.RawTreeChangeWithId Changes []*treechangeproto.RawTreeChangeWithId Heads []string diff --git a/common/pkg/acl/storage/storage.go b/common/pkg/acl/storage/storage.go deleted file mode 100644 index 42af1815..00000000 --- a/common/pkg/acl/storage/storage.go +++ /dev/null @@ -1,5 +0,0 @@ -package storage - -type Storage interface { - ID() (string, error) -} diff --git a/common/pkg/acl/storage/treestorage.go b/common/pkg/acl/storage/treestorage.go index 76332399..751dd1d9 100644 --- a/common/pkg/acl/storage/treestorage.go +++ b/common/pkg/acl/storage/treestorage.go @@ -6,7 +6,7 @@ import ( ) type TreeStorage interface { - Storage + ID() string Root() (*treechangeproto.RawTreeChangeWithId, error) Heads() ([]string, error) SetHeads(heads []string) error diff --git a/common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go b/common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go index cf515bfd..6777777c 100644 --- a/common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go +++ b/common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go @@ -120,8 +120,8 @@ func (t *ACLListStorageBuilder) AddRawRecord(ctx context.Context, rec *aclrecord panic("implement me") } -func (t *ACLListStorageBuilder) ID() (string, error) { - return t.id, nil +func (t *ACLListStorageBuilder) ID() string { + return t.id } func (t *ACLListStorageBuilder) GetRawRecords() []*aclrecordproto2.RawACLRecordWithId { diff --git a/common/pkg/acl/tree/objecttree_test.go b/common/pkg/acl/tree/objecttree_test.go index e2a2b028..da9f2364 100644 --- a/common/pkg/acl/tree/objecttree_test.go +++ b/common/pkg/acl/tree/objecttree_test.go @@ -3,7 +3,7 @@ package tree import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" - storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + storage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/testutils/acllistbuilder" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" "github.com/stretchr/testify/assert" @@ -53,9 +53,9 @@ func (c *mockChangeCreator) createRaw(id, aclId, snapshotId string, isSnapshot b } } -func (c *mockChangeCreator) createNewTreeStorage(treeId, aclHeadId string) storage2.TreeStorage { +func (c *mockChangeCreator) createNewTreeStorage(treeId, aclHeadId string) storage.TreeStorage { root := c.createRoot(treeId, aclHeadId) - treeStorage, _ := storage2.NewInMemoryTreeStorage(treeId, root, []string{root.Id}, []*treechangeproto.RawTreeChangeWithId{root}) + treeStorage, _ := storage.NewInMemoryTreeStorage(root, []string{root.Id}, []*treechangeproto.RawTreeChangeWithId{root}) return treeStorage } @@ -95,7 +95,7 @@ func (m *mockChangeValidator) ValidateFullTree(tree *Tree, aclList list.ACLList) type testTreeContext struct { aclList list.ACLList - treeStorage storage2.TreeStorage + treeStorage storage.TreeStorage changeBuilder *mockChangeBuilder changeCreator *mockChangeCreator objTree ObjectTree diff --git a/common/pkg/acl/tree/objecttreefactory.go b/common/pkg/acl/tree/objecttreefactory.go index 94459020..ca097505 100644 --- a/common/pkg/acl/tree/objecttreefactory.go +++ b/common/pkg/acl/tree/objecttreefactory.go @@ -3,7 +3,7 @@ package tree import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/common" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" - storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + storage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric" @@ -20,7 +20,7 @@ type ObjectTreeCreatePayload struct { Identity []byte } -func BuildObjectTree(treeStorage storage2.TreeStorage, aclList list.ACLList) (ObjectTree, error) { +func BuildObjectTree(treeStorage storage.TreeStorage, aclList list.ACLList) (ObjectTree, error) { rootChange, err := treeStorage.Root() if err != nil { return nil, err @@ -32,14 +32,14 @@ func BuildObjectTree(treeStorage storage2.TreeStorage, aclList list.ACLList) (Ob func CreateDerivedObjectTree( payload ObjectTreeCreatePayload, aclList list.ACLList, - createStorage storage2.TreeStorageCreatorFunc) (objTree ObjectTree, err error) { + createStorage storage.TreeStorageCreatorFunc) (objTree ObjectTree, err error) { return createObjectTree(payload, 0, nil, aclList, createStorage) } func CreateObjectTree( payload ObjectTreeCreatePayload, aclList list.ACLList, - createStorage storage2.TreeStorageCreatorFunc) (objTree ObjectTree, err error) { + createStorage storage.TreeStorageCreatorFunc) (objTree ObjectTree, err error) { bytes := make([]byte, 32) _, err = rand.Read(bytes) if err != nil { @@ -53,7 +53,7 @@ func createObjectTree( timestamp int64, seed []byte, aclList list.ACLList, - createStorage storage2.TreeStorageCreatorFunc) (objTree ObjectTree, err error) { + createStorage storage.TreeStorageCreatorFunc) (objTree ObjectTree, err error) { aclList.RLock() aclHeadId := aclList.Head().Id aclList.RUnlock() @@ -77,8 +77,7 @@ func createObjectTree( } // create storage - st, err := createStorage(storage2.TreeStorageCreatePayload{ - TreeId: raw.Id, + st, err := createStorage(storage.TreeStorageCreatePayload{ RootRawChange: raw, Changes: []*treechangeproto.RawTreeChangeWithId{raw}, Heads: []string{raw.Id}, @@ -127,11 +126,7 @@ func buildObjectTree(deps objectTreeDeps) (ObjectTree, error) { } } - objTree.id, err = objTree.treeStorage.ID() - if err != nil { - return nil, err - } - + objTree.id = objTree.treeStorage.ID() objTree.root, err = objTree.treeStorage.Root() if err != nil { return nil, err diff --git a/node/storage/liststorage.go b/node/storage/liststorage.go index c3ba4f92..1247b2e8 100644 --- a/node/storage/liststorage.go +++ b/node/storage/liststorage.go @@ -82,8 +82,8 @@ func createListStorage(db *pogreb.DB, root *aclrecordproto.RawACLRecordWithId) ( return } -func (l *listStorage) ID() (string, error) { - return l.id, nil +func (l *listStorage) ID() string { + return l.id } func (l *listStorage) Root() (*aclrecordproto.RawACLRecordWithId, error) { diff --git a/node/storage/spacestorage.go b/node/storage/spacestorage.go index f82d85ba..fc2f073a 100644 --- a/node/storage/spacestorage.go +++ b/node/storage/spacestorage.go @@ -129,8 +129,8 @@ func createSpaceStorage(rootPath string, payload spacestorage.SpaceStorageCreate return } -func (s *spaceStorage) ID() (string, error) { - return s.spaceId, nil +func (s *spaceStorage) ID() string { + return s.spaceId } func (s *spaceStorage) TreeStorage(id string) (storage2.TreeStorage, error) { diff --git a/node/storage/treestorage.go b/node/storage/treestorage.go index 7ad33aa1..9b92379d 100644 --- a/node/storage/treestorage.go +++ b/node/storage/treestorage.go @@ -3,7 +3,7 @@ package storage import ( "context" "github.com/akrylysov/pogreb" - storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + storage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" ) @@ -14,14 +14,14 @@ type treeStorage struct { root *treechangeproto.RawTreeChangeWithId } -func newTreeStorage(db *pogreb.DB, treeId string) (ts storage2.TreeStorage, err error) { +func newTreeStorage(db *pogreb.DB, treeId string) (ts storage.TreeStorage, err error) { keys := newTreeKeys(treeId) heads, err := db.Get(keys.HeadsKey()) if err != nil { return } if heads == nil { - err = storage2.ErrUnknownTreeId + err = storage.ErrUnknownTreeId return } @@ -30,7 +30,7 @@ func newTreeStorage(db *pogreb.DB, treeId string) (ts storage2.TreeStorage, err return } if root == nil { - err = storage2.ErrUnknownTreeId + err = storage.ErrUnknownTreeId return } @@ -47,18 +47,18 @@ func newTreeStorage(db *pogreb.DB, treeId string) (ts storage2.TreeStorage, err return } -func createTreeStorage(db *pogreb.DB, payload storage2.TreeStorageCreatePayload) (ts storage2.TreeStorage, err error) { - keys := newTreeKeys(payload.TreeId) +func createTreeStorage(db *pogreb.DB, payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { + keys := newTreeKeys(payload.RootRawChange.Id) has, err := db.Has(keys.HeadsKey()) if err != nil { return } if has { - err = storage2.ErrTreeExists + err = storage.ErrTreeExists return } - heads := storage2.CreateHeadsPayload(payload.Heads) + heads := storage.CreateHeadsPayload(payload.Heads) for _, ch := range payload.Changes { err = db.Put(keys.RawChangeKey(ch.Id), ch.GetRawChange()) @@ -86,8 +86,8 @@ func createTreeStorage(db *pogreb.DB, payload storage2.TreeStorageCreatePayload) return } -func (t *treeStorage) ID() (string, error) { - return t.id, nil +func (t *treeStorage) ID() string { + return t.id } func (t *treeStorage) Root() (raw *treechangeproto.RawTreeChangeWithId, err error) { @@ -100,15 +100,15 @@ func (t *treeStorage) Heads() (heads []string, err error) { return } if headsBytes == nil { - err = storage2.ErrUnknownTreeId + err = storage.ErrUnknownTreeId return } - heads = storage2.ParseHeads(headsBytes) + heads = storage.ParseHeads(headsBytes) return } func (t *treeStorage) SetHeads(heads []string) (err error) { - payload := storage2.CreateHeadsPayload(heads) + payload := storage.CreateHeadsPayload(heads) return t.db.Put(t.keys.HeadsKey(), payload) } @@ -122,7 +122,7 @@ func (t *treeStorage) GetRawChange(ctx context.Context, id string) (raw *treecha return } if res == nil { - err = storage2.ErrUnkownChange + err = storage.ErrUnkownChange } raw = &treechangeproto.RawTreeChangeWithId{ diff --git a/node/storage/treestorage_test.go b/node/storage/treestorage_test.go new file mode 100644 index 00000000..07d33165 --- /dev/null +++ b/node/storage/treestorage_test.go @@ -0,0 +1,54 @@ +package storage + +import ( + "context" + "github.com/akrylysov/pogreb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" + "github.com/stretchr/testify/require" + "os" + "testing" +) + +type fixture struct { + db *pogreb.DB +} + +func newFixture(t *testing.T) *fixture { + dir, err := os.MkdirTemp("", "") + require.NoError(t, err) + db, err := pogreb.Open(dir, nil) + require.NoError(t, err) + return &fixture{db: db} +} + +func (fx *fixture) stop(t *testing.T) { + require.NoError(t, fx.db.Close()) +} + +func TestTreeStorage_CreateTreeStorage(t *testing.T) { + fx := newFixture(t) + defer fx.stop(t) + + rootRawChange := &treechangeproto.RawTreeChangeWithId{RawChange: []byte("some"), Id: "rootId"} + otherChange := &treechangeproto.RawTreeChangeWithId{RawChange: []byte("some other"), Id: "otherId"} + changes := []*treechangeproto.RawTreeChangeWithId{rootRawChange, otherChange} + payload := storage.TreeStorageCreatePayload{ + RootRawChange: rootRawChange, + Changes: changes, + Heads: []string{rootRawChange.Id}, + } + store, err := createTreeStorage(fx.db, payload) + require.NoError(t, err) + require.Equal(t, payload.RootRawChange.Id, store.ID()) + + root, err := store.Root() + require.NoError(t, err) + require.Equal(t, root, rootRawChange) + + for _, ch := range changes { + dbCh, err := store.GetRawChange(context.Background(), ch.Id) + require.NoError(t, err) + require.Equal(t, ch, dbCh) + } +}