From 9c1c1e609d02725597c0b7639eed2dba0b3581c4 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 26 Oct 2022 21:00:15 +0200 Subject: [PATCH] Finish pogreb tests and fix some issues --- node/storage/keys.go | 14 +++- node/storage/liststorage_test.go | 6 +- node/storage/spacestorage.go | 8 +-- node/storage/spacestorage_test.go | 104 ++++++++++++++++++++++++++++++ node/storage/treestorage_test.go | 14 ++-- 5 files changed, 131 insertions(+), 15 deletions(-) create mode 100644 node/storage/spacestorage_test.go diff --git a/node/storage/keys.go b/node/storage/keys.go index 85dd46aa..e21a7140 100644 --- a/node/storage/keys.go +++ b/node/storage/keys.go @@ -62,5 +62,17 @@ func (s spaceKeys) HeaderKey() []byte { } func isRootIdKey(key string) bool { - return strings.HasPrefix(key, "t/") && strings.HasSuffix(key, "heads") + return strings.HasPrefix(key, "t/") && strings.HasSuffix(key, "/heads") +} + +func getRootId(key string) string { + prefixLen := 2 // len("t/") + suffixLen := 6 // len("/heads") + rootLen := len(key) - suffixLen - prefixLen + sBuf := strings.Builder{} + sBuf.Grow(rootLen) + for i := prefixLen; i < prefixLen+rootLen; i++ { + sBuf.WriteByte(key[i]) + } + return sBuf.String() } diff --git a/node/storage/liststorage_test.go b/node/storage/liststorage_test.go index f0a35471..ad6371ab 100644 --- a/node/storage/liststorage_test.go +++ b/node/storage/liststorage_test.go @@ -8,7 +8,7 @@ import ( "testing" ) -func (fx *fixture) testListInDB(t *testing.T, store storage.ListStorage, root *aclrecordproto.RawACLRecordWithId, head string) { +func testListInDB(t *testing.T, store storage.ListStorage, root *aclrecordproto.RawACLRecordWithId, head string) { require.Equal(t, store.ID(), root.Id) aclRoot, err := store.Root() @@ -28,7 +28,7 @@ func TestListStorage_Create(t *testing.T) { aclRoot := &aclrecordproto.RawACLRecordWithId{Payload: []byte("root"), Id: "someRootId"} listStore, err := createListStorage(fx.db, aclRoot) require.NoError(t, err) - fx.testListInDB(t, listStore, aclRoot, aclRoot.Id) + testListInDB(t, listStore, aclRoot, aclRoot.Id) } func TestListStorage_Methods(t *testing.T) { @@ -43,7 +43,7 @@ func TestListStorage_Methods(t *testing.T) { defer fx.stop(t) listStore, err := newListStorage(fx.db) require.NoError(t, err) - fx.testListInDB(t, listStore, aclRoot, aclRoot.Id) + testListInDB(t, listStore, aclRoot, aclRoot.Id) t.Run("set head", func(t *testing.T) { head := "newHead" diff --git a/node/storage/spacestorage.go b/node/storage/spacestorage.go index fc2f073a..eed05609 100644 --- a/node/storage/spacestorage.go +++ b/node/storage/spacestorage.go @@ -88,8 +88,8 @@ func createSpaceStorage(rootPath string, payload spacestorage.SpaceStorageCreate } defer func() { - log.With(zap.String("id", payload.SpaceHeaderWithId.Id), zap.Error(err)).Warn("failed to create storage") if err != nil { + log.With(zap.String("id", payload.SpaceHeaderWithId.Id), zap.Error(err)).Warn("failed to create storage") db.Close() } }() @@ -156,13 +156,13 @@ func (s *spaceStorage) SpaceHeader() (header *spacesyncproto.RawSpaceHeaderWithI func (s *spaceStorage) StoredIds() (ids []string, err error) { index := s.objDb.Items() - key, val, err := index.Next() + key, _, err := index.Next() for err == nil { strKey := string(key) if isRootIdKey(strKey) { - ids = append(ids, string(val)) + ids = append(ids, getRootId(strKey)) } - key, val, err = index.Next() + key, _, err = index.Next() } if err != pogreb.ErrIterationDone { diff --git a/node/storage/spacestorage_test.go b/node/storage/spacestorage_test.go new file mode 100644 index 00000000..562185ca --- /dev/null +++ b/node/storage/spacestorage_test.go @@ -0,0 +1,104 @@ +package storage + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + "github.com/stretchr/testify/require" + "os" + "strconv" + "testing" +) + +func spaceTestPayload() spacestorage.SpaceStorageCreatePayload { + header := &spacesyncproto.RawSpaceHeaderWithId{ + RawHeader: []byte("header"), + Id: "headerId", + } + aclRoot := &aclrecordproto.RawACLRecordWithId{ + Payload: []byte("aclRoot"), + Id: "aclRootId", + } + return spacestorage.SpaceStorageCreatePayload{ + RecWithId: aclRoot, + SpaceHeaderWithId: header, + } +} + +func testSpaceInDB(t *testing.T, store spacestorage.SpaceStorage, payload spacestorage.SpaceStorageCreatePayload) { + header, err := store.SpaceHeader() + require.NoError(t, err) + require.Equal(t, payload.SpaceHeaderWithId, header) + + aclStorage, err := store.ACLStorage() + require.NoError(t, err) + testListInDB(t, aclStorage, payload.RecWithId, payload.RecWithId.Id) +} + +func TestSpaceStorage_Create(t *testing.T) { + dir, err := os.MkdirTemp("", "") + require.NoError(t, err) + + payload := spaceTestPayload() + store, err := createSpaceStorage(dir, payload) + require.NoError(t, err) + defer func() { + require.NoError(t, store.Close()) + }() + + testSpaceInDB(t, store, payload) +} + +func TestSpaceStorage_NewAndCreateTree(t *testing.T) { + dir, err := os.MkdirTemp("", "") + require.NoError(t, err) + + payload := spaceTestPayload() + store, err := createSpaceStorage(dir, payload) + require.NoError(t, err) + require.NoError(t, store.Close()) + + store, err = newSpaceStorage(dir, payload.SpaceHeaderWithId.Id) + require.NoError(t, err) + defer func() { + require.NoError(t, store.Close()) + }() + testSpaceInDB(t, store, payload) + + t.Run("create tree and get tree", func(t *testing.T) { + payload := treeTestPayload() + treeStore, err := store.CreateTreeStorage(payload) + require.NoError(t, err) + testTreePayloadInDB(t, treeStore, payload) + + otherStore, err := store.TreeStorage(payload.RootRawChange.Id) + require.NoError(t, err) + testTreePayloadInDB(t, otherStore, payload) + }) +} + +func TestSpaceStorage_StoredIds(t *testing.T) { + dir, err := os.MkdirTemp("", "") + require.NoError(t, err) + + payload := spaceTestPayload() + store, err := createSpaceStorage(dir, payload) + require.NoError(t, err) + defer func() { + require.NoError(t, store.Close()) + }() + + n := 5 + var ids []string + for i := 0; i < n; i++ { + treePayload := treeTestPayload() + treePayload.RootRawChange.Id += strconv.Itoa(i) + ids = append(ids, treePayload.RootRawChange.Id) + _, err := store.CreateTreeStorage(treePayload) + require.NoError(t, err) + } + + storedIds, err := store.StoredIds() + require.NoError(t, err) + require.Equal(t, ids, storedIds) +} diff --git a/node/storage/treestorage_test.go b/node/storage/treestorage_test.go index c5e6feca..c063a97e 100644 --- a/node/storage/treestorage_test.go +++ b/node/storage/treestorage_test.go @@ -38,7 +38,11 @@ func (fx *fixture) open(t *testing.T) { require.NoError(t, err) } -func (fx *fixture) testTreePayloadInDB(t *testing.T, store storage.TreeStorage, payload storage.TreeStorageCreatePayload) { +func (fx *fixture) stop(t *testing.T) { + require.NoError(t, fx.db.Close()) +} + +func testTreePayloadInDB(t *testing.T, store storage.TreeStorage, payload storage.TreeStorageCreatePayload) { require.Equal(t, payload.RootRawChange.Id, store.ID()) root, err := store.Root() @@ -57,10 +61,6 @@ func (fx *fixture) testTreePayloadInDB(t *testing.T, store storage.TreeStorage, return } -func (fx *fixture) stop(t *testing.T) { - require.NoError(t, fx.db.Close()) -} - func TestTreeStorage_Create(t *testing.T) { fx := newFixture(t) fx.open(t) @@ -69,7 +69,7 @@ func TestTreeStorage_Create(t *testing.T) { payload := treeTestPayload() store, err := createTreeStorage(fx.db, payload) require.NoError(t, err) - fx.testTreePayloadInDB(t, store, payload) + testTreePayloadInDB(t, store, payload) } func TestTreeStorage_Methods(t *testing.T) { @@ -84,7 +84,7 @@ func TestTreeStorage_Methods(t *testing.T) { defer fx.stop(t) store, err := newTreeStorage(fx.db, payload.RootRawChange.Id) require.NoError(t, err) - fx.testTreePayloadInDB(t, store, payload) + testTreePayloadInDB(t, store, payload) t.Run("update heads", func(t *testing.T) { newHeads := []string{"a", "b"}