Compare commits
1 Commits
main
...
fix-open-r
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
21a9ce6035 |
28
.github/workflows/coverage.yml
vendored
28
.github/workflows/coverage.yml
vendored
@ -17,20 +17,20 @@ jobs:
|
|||||||
- name: git config
|
- name: git config
|
||||||
run: git config --global url.https://${{ secrets.ANYTYPE_PAT }}@github.com/.insteadOf https://github.com/
|
run: git config --global url.https://${{ secrets.ANYTYPE_PAT }}@github.com/.insteadOf https://github.com/
|
||||||
|
|
||||||
# # cache {{
|
# cache {{
|
||||||
# - id: go-cache-paths
|
- id: go-cache-paths
|
||||||
# run: |
|
run: |
|
||||||
# echo "GOCACHE=$(go env GOCACHE)" >> $GITHUB_OUTPUT
|
echo "GOCACHE=$(go env GOCACHE)" >> $GITHUB_OUTPUT
|
||||||
# echo "GOMODCACHE=$(go env GOMODCACHE)" >> $GITHUB_OUTPUT
|
echo "GOMODCACHE=$(go env GOMODCACHE)" >> $GITHUB_OUTPUT
|
||||||
# - uses: actions/cache@v3
|
- uses: actions/cache@v3
|
||||||
# with:
|
with:
|
||||||
# path: |
|
path: |
|
||||||
# ${{ steps.go-cache-paths.outputs.GOCACHE }}
|
${{ steps.go-cache-paths.outputs.GOCACHE }}
|
||||||
# ${{ steps.go-cache-paths.outputs.GOMODCACHE }}
|
${{ steps.go-cache-paths.outputs.GOMODCACHE }}
|
||||||
# key: ${{ runner.os }}-go-${{ matrix.go-version }}-${{ hashFiles('**/go.sum') }}
|
key: ${{ runner.os }}-go-${{ matrix.go-version }}-${{ hashFiles('**/go.sum') }}
|
||||||
# restore-keys: |
|
restore-keys: |
|
||||||
# ${{ runner.os }}-go-${{ matrix.go-version }}-
|
${{ runner.os }}-go-${{ matrix.go-version }}-
|
||||||
# # }}
|
# }}
|
||||||
|
|
||||||
- name: deps
|
- name: deps
|
||||||
run: make deps
|
run: make deps
|
||||||
|
|||||||
43
README.md
43
README.md
@ -1,43 +0,0 @@
|
|||||||
# Any-Sync
|
|
||||||
Any-Sync is an open-source protocol designed to create high-performance, local-first, peer-to-peer, end-to-end encrypted applications that facilitate seamless collaboration among multiple users and devices.
|
|
||||||
|
|
||||||
By utilizing this protocol, users can rest assured that they retain complete control over their data and digital experience. They are empowered to freely transition between various service providers, or even opt to self-host the applications.
|
|
||||||
|
|
||||||
This ensures utmost flexibility and autonomy for users in managing their personal information and digital interactions.
|
|
||||||
|
|
||||||
## Introduction
|
|
||||||
Most existing information management tools are implemented on centralized client-server architecture or designed for an offline-first single-user usage. Either way there are trade-offs for users: they can face restricted freedoms and privacy violations or compromise on the functionality of tools to avoid this.
|
|
||||||
|
|
||||||
We believe this goes against fundamental digital freedoms and that a new generation of software is needed that will respect these freedoms, while providing best in-class user experience.
|
|
||||||
|
|
||||||
Our goal with `any-sync` is to develop a protocol that will enable the deployment of this software.
|
|
||||||
|
|
||||||
Features:
|
|
||||||
- Conflict-free data replication across multiple devices and agents
|
|
||||||
- Built-in end-to-end encryption
|
|
||||||
- Cryptographically verifiable history of changes
|
|
||||||
- Adoption to frequent operations (high performance)
|
|
||||||
- Reliable and scalable infrastructure
|
|
||||||
- Simultaneous support of p2p and remote communication
|
|
||||||
|
|
||||||
## Protocol explanation
|
|
||||||
Plese read the [overview](https://tech.anytype.io/any-sync/overview) of protocol entities and design.
|
|
||||||
|
|
||||||
## Implementation
|
|
||||||
|
|
||||||
You can find the various parts of the protocol implemented in Go in the following repositories:
|
|
||||||
- [`any-sync-node`](https://github.com/anyproto/any-sync-node) — implementation of a sync node responsible for storing spaces and objects.
|
|
||||||
- [`any-sync-filenode`](https://github.com/anyproto/any-sync-filenode) — implementation of a file node responsible for storing files.
|
|
||||||
- [`any-sync-coordinator`](https://github.com/anyproto/any-sync-coordinator) — implementation of a coordinator node responsible for network configuration management.
|
|
||||||
|
|
||||||
## Contribution
|
|
||||||
Thank you for your desire to develop Anytype together.
|
|
||||||
|
|
||||||
Currently, we're not ready to accept PRs, but we will in the nearest future.
|
|
||||||
|
|
||||||
Follow us on [Github](https://github.com/anyproto) and join the [Contributors Community](https://github.com/orgs/anyproto/discussions).
|
|
||||||
|
|
||||||
---
|
|
||||||
Made by Any — a Swiss association 🇨🇭
|
|
||||||
|
|
||||||
Licensed under [MIT License](./LICENSE).
|
|
||||||
@ -3,7 +3,7 @@ package mock_accountservice
|
|||||||
import (
|
import (
|
||||||
"github.com/anyproto/any-sync/accountservice"
|
"github.com/anyproto/any-sync/accountservice"
|
||||||
"github.com/anyproto/any-sync/commonspace/object/accountdata"
|
"github.com/anyproto/any-sync/commonspace/object/accountdata"
|
||||||
"go.uber.org/mock/gomock"
|
"github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
func NewAccountServiceWithAccount(ctrl *gomock.Controller, acc *accountdata.AccountKeys) *MockService {
|
func NewAccountServiceWithAccount(ctrl *gomock.Controller, acc *accountdata.AccountKeys) *MockService {
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import (
|
|||||||
|
|
||||||
app "github.com/anyproto/any-sync/app"
|
app "github.com/anyproto/any-sync/app"
|
||||||
accountdata "github.com/anyproto/any-sync/commonspace/object/accountdata"
|
accountdata "github.com/anyproto/any-sync/commonspace/object/accountdata"
|
||||||
gomock "go.uber.org/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockService is a mock of Service interface.
|
// MockService is a mock of Service interface.
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import (
|
|||||||
reflect "reflect"
|
reflect "reflect"
|
||||||
|
|
||||||
ldiff "github.com/anyproto/any-sync/app/ldiff"
|
ldiff "github.com/anyproto/any-sync/app/ldiff"
|
||||||
gomock "go.uber.org/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockDiff is a mock of Diff interface.
|
// MockDiff is a mock of Diff interface.
|
||||||
|
|||||||
@ -10,7 +10,7 @@ import (
|
|||||||
|
|
||||||
app "github.com/anyproto/any-sync/app"
|
app "github.com/anyproto/any-sync/app"
|
||||||
spacesyncproto "github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
spacesyncproto "github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
||||||
gomock "go.uber.org/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockCredentialProvider is a mock of CredentialProvider interface.
|
// MockCredentialProvider is a mock of CredentialProvider interface.
|
||||||
|
|||||||
@ -3,8 +3,8 @@ package deletionstate
|
|||||||
import (
|
import (
|
||||||
"github.com/anyproto/any-sync/commonspace/spacestorage"
|
"github.com/anyproto/any-sync/commonspace/spacestorage"
|
||||||
"github.com/anyproto/any-sync/commonspace/spacestorage/mock_spacestorage"
|
"github.com/anyproto/any-sync/commonspace/spacestorage/mock_spacestorage"
|
||||||
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"go.uber.org/mock/gomock"
|
|
||||||
"sort"
|
"sort"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import (
|
|||||||
|
|
||||||
app "github.com/anyproto/any-sync/app"
|
app "github.com/anyproto/any-sync/app"
|
||||||
deletionstate "github.com/anyproto/any-sync/commonspace/deletionstate"
|
deletionstate "github.com/anyproto/any-sync/commonspace/deletionstate"
|
||||||
gomock "go.uber.org/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockObjectDeletionState is a mock of ObjectDeletionState interface.
|
// MockObjectDeletionState is a mock of ObjectDeletionState interface.
|
||||||
|
|||||||
@ -3,13 +3,10 @@ package headsync
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/anyproto/any-sync/app/ldiff"
|
"github.com/anyproto/any-sync/app/ldiff"
|
||||||
"github.com/anyproto/any-sync/app/logger"
|
"github.com/anyproto/any-sync/app/logger"
|
||||||
"github.com/anyproto/any-sync/commonspace/credentialprovider"
|
"github.com/anyproto/any-sync/commonspace/credentialprovider"
|
||||||
"github.com/anyproto/any-sync/commonspace/deletionstate"
|
"github.com/anyproto/any-sync/commonspace/deletionstate"
|
||||||
"github.com/anyproto/any-sync/commonspace/object/acl/syncacl"
|
|
||||||
"github.com/anyproto/any-sync/commonspace/object/treemanager"
|
"github.com/anyproto/any-sync/commonspace/object/treemanager"
|
||||||
"github.com/anyproto/any-sync/commonspace/peermanager"
|
"github.com/anyproto/any-sync/commonspace/peermanager"
|
||||||
"github.com/anyproto/any-sync/commonspace/spacestorage"
|
"github.com/anyproto/any-sync/commonspace/spacestorage"
|
||||||
@ -17,8 +14,8 @@ import (
|
|||||||
"github.com/anyproto/any-sync/commonspace/syncstatus"
|
"github.com/anyproto/any-sync/commonspace/syncstatus"
|
||||||
"github.com/anyproto/any-sync/net/peer"
|
"github.com/anyproto/any-sync/net/peer"
|
||||||
"github.com/anyproto/any-sync/net/rpc/rpcerr"
|
"github.com/anyproto/any-sync/net/rpc/rpcerr"
|
||||||
"github.com/anyproto/any-sync/util/slice"
|
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
type DiffSyncer interface {
|
type DiffSyncer interface {
|
||||||
@ -41,7 +38,6 @@ func newDiffSyncer(hs *headSync) DiffSyncer {
|
|||||||
log: log,
|
log: log,
|
||||||
syncStatus: hs.syncStatus,
|
syncStatus: hs.syncStatus,
|
||||||
deletionState: hs.deletionState,
|
deletionState: hs.deletionState,
|
||||||
syncAcl: hs.syncAcl,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,7 +53,6 @@ type diffSyncer struct {
|
|||||||
credentialProvider credentialprovider.CredentialProvider
|
credentialProvider credentialprovider.CredentialProvider
|
||||||
syncStatus syncstatus.StatusUpdater
|
syncStatus syncstatus.StatusUpdater
|
||||||
treeSyncer treemanager.TreeSyncer
|
treeSyncer treemanager.TreeSyncer
|
||||||
syncAcl syncacl.SyncAcl
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *diffSyncer) Init() {
|
func (d *diffSyncer) Init() {
|
||||||
@ -121,7 +116,6 @@ func (d *diffSyncer) syncWithPeer(ctx context.Context, p peer.Peer) (err error)
|
|||||||
cl = d.clientFactory.Client(conn)
|
cl = d.clientFactory.Client(conn)
|
||||||
rdiff = NewRemoteDiff(d.spaceId, cl)
|
rdiff = NewRemoteDiff(d.spaceId, cl)
|
||||||
stateCounter = d.syncStatus.StateCounter()
|
stateCounter = d.syncStatus.StateCounter()
|
||||||
syncAclId = d.syncAcl.Id()
|
|
||||||
)
|
)
|
||||||
|
|
||||||
newIds, changedIds, removedIds, err := d.diff.Diff(ctx, rdiff)
|
newIds, changedIds, removedIds, err := d.diff.Diff(ctx, rdiff)
|
||||||
@ -144,29 +138,17 @@ func (d *diffSyncer) syncWithPeer(ctx context.Context, p peer.Peer) (err error)
|
|||||||
// not syncing ids which were removed through settings document
|
// not syncing ids which were removed through settings document
|
||||||
missingIds := d.deletionState.Filter(newIds)
|
missingIds := d.deletionState.Filter(newIds)
|
||||||
existingIds := append(d.deletionState.Filter(removedIds), d.deletionState.Filter(changedIds)...)
|
existingIds := append(d.deletionState.Filter(removedIds), d.deletionState.Filter(changedIds)...)
|
||||||
|
|
||||||
d.syncStatus.RemoveAllExcept(p.Id(), existingIds, stateCounter)
|
d.syncStatus.RemoveAllExcept(p.Id(), existingIds, stateCounter)
|
||||||
|
|
||||||
prevExistingLen := len(existingIds)
|
|
||||||
existingIds = slice.DiscardFromSlice(existingIds, func(s string) bool {
|
|
||||||
return s == syncAclId
|
|
||||||
})
|
|
||||||
// if we removed acl head from the list
|
|
||||||
if len(existingIds) < prevExistingLen {
|
|
||||||
if syncErr := d.syncAcl.SyncWithPeer(ctx, p.Id()); syncErr != nil {
|
|
||||||
log.Warn("failed to send acl sync message to peer", zap.String("aclId", syncAclId))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// treeSyncer should not get acl id, that's why we filter existing ids before
|
|
||||||
err = d.treeSyncer.SyncAll(ctx, p.Id(), existingIds, missingIds)
|
err = d.treeSyncer.SyncAll(ctx, p.Id(), existingIds, missingIds)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
d.log.Info("sync done:",
|
d.log.Info("sync done:", zap.Int("newIds", len(newIds)),
|
||||||
zap.Int("newIds", len(newIds)),
|
|
||||||
zap.Int("changedIds", len(changedIds)),
|
zap.Int("changedIds", len(changedIds)),
|
||||||
zap.Int("removedIds", len(removedIds)),
|
zap.Int("removedIds", len(removedIds)),
|
||||||
zap.Int("already deleted ids", totalLen-prevExistingLen-len(missingIds)),
|
zap.Int("already deleted ids", totalLen-len(existingIds)-len(missingIds)),
|
||||||
zap.String("peerId", p.Id()),
|
zap.String("peerId", p.Id()),
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|||||||
@ -14,8 +14,8 @@ import (
|
|||||||
"github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
"github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
||||||
"github.com/anyproto/any-sync/consensus/consensusproto"
|
"github.com/anyproto/any-sync/consensus/consensusproto"
|
||||||
"github.com/anyproto/any-sync/net/peer"
|
"github.com/anyproto/any-sync/net/peer"
|
||||||
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"go.uber.org/mock/gomock"
|
|
||||||
"storj.io/drpc"
|
"storj.io/drpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -109,7 +109,6 @@ func TestDiffSyncer(t *testing.T) {
|
|||||||
fx.initDiffSyncer(t)
|
fx.initDiffSyncer(t)
|
||||||
defer fx.stop()
|
defer fx.stop()
|
||||||
mPeer := mockPeer{}
|
mPeer := mockPeer{}
|
||||||
fx.aclMock.EXPECT().Id().AnyTimes().Return("aclId")
|
|
||||||
fx.peerManagerMock.EXPECT().
|
fx.peerManagerMock.EXPECT().
|
||||||
GetResponsiblePeers(gomock.Any()).
|
GetResponsiblePeers(gomock.Any()).
|
||||||
Return([]peer.Peer{mPeer}, nil)
|
Return([]peer.Peer{mPeer}, nil)
|
||||||
@ -123,26 +122,6 @@ func TestDiffSyncer(t *testing.T) {
|
|||||||
require.NoError(t, fx.diffSyncer.Sync(ctx))
|
require.NoError(t, fx.diffSyncer.Sync(ctx))
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("diff syncer sync, acl changed", func(t *testing.T) {
|
|
||||||
fx := newHeadSyncFixture(t)
|
|
||||||
fx.initDiffSyncer(t)
|
|
||||||
defer fx.stop()
|
|
||||||
mPeer := mockPeer{}
|
|
||||||
fx.aclMock.EXPECT().Id().AnyTimes().Return("aclId")
|
|
||||||
fx.peerManagerMock.EXPECT().
|
|
||||||
GetResponsiblePeers(gomock.Any()).
|
|
||||||
Return([]peer.Peer{mPeer}, nil)
|
|
||||||
fx.diffMock.EXPECT().
|
|
||||||
Diff(gomock.Any(), gomock.Eq(NewRemoteDiff(fx.spaceState.SpaceId, fx.clientMock))).
|
|
||||||
Return([]string{"new"}, []string{"changed"}, nil, nil)
|
|
||||||
fx.deletionStateMock.EXPECT().Filter([]string{"new"}).Return([]string{"new"}).Times(1)
|
|
||||||
fx.deletionStateMock.EXPECT().Filter([]string{"changed"}).Return([]string{"changed", "aclId"}).Times(1)
|
|
||||||
fx.deletionStateMock.EXPECT().Filter(nil).Return(nil).Times(1)
|
|
||||||
fx.treeSyncerMock.EXPECT().SyncAll(gomock.Any(), mPeer.Id(), []string{"changed"}, []string{"new"}).Return(nil)
|
|
||||||
fx.aclMock.EXPECT().SyncWithPeer(gomock.Any(), mPeer.Id()).Return(nil)
|
|
||||||
require.NoError(t, fx.diffSyncer.Sync(ctx))
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("diff syncer sync conf error", func(t *testing.T) {
|
t.Run("diff syncer sync conf error", func(t *testing.T) {
|
||||||
fx := newHeadSyncFixture(t)
|
fx := newHeadSyncFixture(t)
|
||||||
fx.initDiffSyncer(t)
|
fx.initDiffSyncer(t)
|
||||||
@ -160,7 +139,6 @@ func TestDiffSyncer(t *testing.T) {
|
|||||||
fx.initDiffSyncer(t)
|
fx.initDiffSyncer(t)
|
||||||
defer fx.stop()
|
defer fx.stop()
|
||||||
deletedId := "id"
|
deletedId := "id"
|
||||||
fx.aclMock.EXPECT().Id().AnyTimes().Return("aclId")
|
|
||||||
fx.deletionStateMock.EXPECT().Exists(deletedId).Return(true)
|
fx.deletionStateMock.EXPECT().Exists(deletedId).Return(true)
|
||||||
|
|
||||||
// this should not result in any mock being called
|
// this should not result in any mock being called
|
||||||
@ -174,7 +152,6 @@ func TestDiffSyncer(t *testing.T) {
|
|||||||
newId := "newId"
|
newId := "newId"
|
||||||
newHeads := []string{"h1", "h2"}
|
newHeads := []string{"h1", "h2"}
|
||||||
hash := "hash"
|
hash := "hash"
|
||||||
fx.aclMock.EXPECT().Id().AnyTimes().Return("aclId")
|
|
||||||
fx.diffMock.EXPECT().Set(ldiff.Element{
|
fx.diffMock.EXPECT().Set(ldiff.Element{
|
||||||
Id: newId,
|
Id: newId,
|
||||||
Head: concatStrings(newHeads),
|
Head: concatStrings(newHeads),
|
||||||
@ -189,7 +166,6 @@ func TestDiffSyncer(t *testing.T) {
|
|||||||
fx := newHeadSyncFixture(t)
|
fx := newHeadSyncFixture(t)
|
||||||
fx.initDiffSyncer(t)
|
fx.initDiffSyncer(t)
|
||||||
defer fx.stop()
|
defer fx.stop()
|
||||||
fx.aclMock.EXPECT().Id().AnyTimes().Return("aclId")
|
|
||||||
aclStorageMock := mock_liststorage.NewMockListStorage(fx.ctrl)
|
aclStorageMock := mock_liststorage.NewMockListStorage(fx.ctrl)
|
||||||
settingsStorage := mock_treestorage.NewMockTreeStorage(fx.ctrl)
|
settingsStorage := mock_treestorage.NewMockTreeStorage(fx.ctrl)
|
||||||
settingsId := "settingsId"
|
settingsId := "settingsId"
|
||||||
@ -235,7 +211,6 @@ func TestDiffSyncer(t *testing.T) {
|
|||||||
fx := newHeadSyncFixture(t)
|
fx := newHeadSyncFixture(t)
|
||||||
fx.initDiffSyncer(t)
|
fx.initDiffSyncer(t)
|
||||||
defer fx.stop()
|
defer fx.stop()
|
||||||
fx.aclMock.EXPECT().Id().AnyTimes().Return("aclId")
|
|
||||||
fx.peerManagerMock.EXPECT().
|
fx.peerManagerMock.EXPECT().
|
||||||
GetResponsiblePeers(gomock.Any()).
|
GetResponsiblePeers(gomock.Any()).
|
||||||
Return([]peer.Peer{mockPeer{}}, nil)
|
Return([]peer.Peer{mockPeer{}}, nil)
|
||||||
@ -251,7 +226,6 @@ func TestDiffSyncer(t *testing.T) {
|
|||||||
fx.initDiffSyncer(t)
|
fx.initDiffSyncer(t)
|
||||||
defer fx.stop()
|
defer fx.stop()
|
||||||
mPeer := mockPeer{}
|
mPeer := mockPeer{}
|
||||||
fx.aclMock.EXPECT().Id().AnyTimes().Return("aclId")
|
|
||||||
fx.peerManagerMock.EXPECT().
|
fx.peerManagerMock.EXPECT().
|
||||||
GetResponsiblePeers(gomock.Any()).
|
GetResponsiblePeers(gomock.Any()).
|
||||||
Return([]peer.Peer{mPeer}, nil)
|
Return([]peer.Peer{mPeer}, nil)
|
||||||
|
|||||||
@ -3,16 +3,12 @@ package headsync
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"sync/atomic"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/anyproto/any-sync/app"
|
"github.com/anyproto/any-sync/app"
|
||||||
"github.com/anyproto/any-sync/app/ldiff"
|
"github.com/anyproto/any-sync/app/ldiff"
|
||||||
"github.com/anyproto/any-sync/app/logger"
|
"github.com/anyproto/any-sync/app/logger"
|
||||||
config2 "github.com/anyproto/any-sync/commonspace/config"
|
config2 "github.com/anyproto/any-sync/commonspace/config"
|
||||||
"github.com/anyproto/any-sync/commonspace/credentialprovider"
|
"github.com/anyproto/any-sync/commonspace/credentialprovider"
|
||||||
"github.com/anyproto/any-sync/commonspace/deletionstate"
|
"github.com/anyproto/any-sync/commonspace/deletionstate"
|
||||||
"github.com/anyproto/any-sync/commonspace/object/acl/syncacl"
|
|
||||||
"github.com/anyproto/any-sync/commonspace/object/treemanager"
|
"github.com/anyproto/any-sync/commonspace/object/treemanager"
|
||||||
"github.com/anyproto/any-sync/commonspace/peermanager"
|
"github.com/anyproto/any-sync/commonspace/peermanager"
|
||||||
"github.com/anyproto/any-sync/commonspace/spacestate"
|
"github.com/anyproto/any-sync/commonspace/spacestate"
|
||||||
@ -25,6 +21,8 @@ import (
|
|||||||
"github.com/anyproto/any-sync/util/slice"
|
"github.com/anyproto/any-sync/util/slice"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"golang.org/x/exp/slices"
|
"golang.org/x/exp/slices"
|
||||||
|
"sync/atomic"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
var log = logger.NewNamed(CName)
|
var log = logger.NewNamed(CName)
|
||||||
@ -62,7 +60,6 @@ type headSync struct {
|
|||||||
credentialProvider credentialprovider.CredentialProvider
|
credentialProvider credentialprovider.CredentialProvider
|
||||||
syncStatus syncstatus.StatusService
|
syncStatus syncstatus.StatusService
|
||||||
deletionState deletionstate.ObjectDeletionState
|
deletionState deletionstate.ObjectDeletionState
|
||||||
syncAcl syncacl.SyncAcl
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func New() HeadSync {
|
func New() HeadSync {
|
||||||
@ -74,7 +71,6 @@ var createDiffSyncer = newDiffSyncer
|
|||||||
func (h *headSync) Init(a *app.App) (err error) {
|
func (h *headSync) Init(a *app.App) (err error) {
|
||||||
shared := a.MustComponent(spacestate.CName).(*spacestate.SpaceState)
|
shared := a.MustComponent(spacestate.CName).(*spacestate.SpaceState)
|
||||||
cfg := a.MustComponent("config").(config2.ConfigGetter)
|
cfg := a.MustComponent("config").(config2.ConfigGetter)
|
||||||
h.syncAcl = a.MustComponent(syncacl.CName).(syncacl.SyncAcl)
|
|
||||||
h.spaceId = shared.SpaceId
|
h.spaceId = shared.SpaceId
|
||||||
h.spaceIsDeleted = shared.SpaceIsDeleted
|
h.spaceIsDeleted = shared.SpaceIsDeleted
|
||||||
h.syncPeriod = cfg.GetSpace().SyncPeriod
|
h.syncPeriod = cfg.GetSpace().SyncPeriod
|
||||||
@ -96,7 +92,6 @@ func (h *headSync) Init(a *app.App) (err error) {
|
|||||||
return h.syncer.Sync(ctx)
|
return h.syncer.Sync(ctx)
|
||||||
}
|
}
|
||||||
h.periodicSync = periodicsync.NewPeriodicSync(h.syncPeriod, time.Minute, sync, h.log)
|
h.periodicSync = periodicsync.NewPeriodicSync(h.syncPeriod, time.Minute, sync, h.log)
|
||||||
h.syncAcl.SetHeadUpdater(h)
|
|
||||||
// TODO: move to run?
|
// TODO: move to run?
|
||||||
h.syncer.Init()
|
h.syncer.Init()
|
||||||
return nil
|
return nil
|
||||||
@ -182,10 +177,6 @@ func (h *headSync) fillDiff(objectIds []string) {
|
|||||||
Head: concatStrings(heads),
|
Head: concatStrings(heads),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
els = append(els, ldiff.Element{
|
|
||||||
Id: h.syncAcl.Id(),
|
|
||||||
Head: h.syncAcl.Head().Id,
|
|
||||||
})
|
|
||||||
h.diff.Set(els...)
|
h.diff.Set(els...)
|
||||||
if err := h.storage.WriteSpaceHash(h.diff.Hash()); err != nil {
|
if err := h.storage.WriteSpaceHash(h.diff.Hash()); err != nil {
|
||||||
h.log.Error("can't write space hash", zap.Error(err))
|
h.log.Error("can't write space hash", zap.Error(err))
|
||||||
|
|||||||
@ -11,9 +11,6 @@ import (
|
|||||||
"github.com/anyproto/any-sync/commonspace/deletionstate"
|
"github.com/anyproto/any-sync/commonspace/deletionstate"
|
||||||
"github.com/anyproto/any-sync/commonspace/deletionstate/mock_deletionstate"
|
"github.com/anyproto/any-sync/commonspace/deletionstate/mock_deletionstate"
|
||||||
"github.com/anyproto/any-sync/commonspace/headsync/mock_headsync"
|
"github.com/anyproto/any-sync/commonspace/headsync/mock_headsync"
|
||||||
"github.com/anyproto/any-sync/commonspace/object/acl/list"
|
|
||||||
"github.com/anyproto/any-sync/commonspace/object/acl/syncacl"
|
|
||||||
"github.com/anyproto/any-sync/commonspace/object/acl/syncacl/mock_syncacl"
|
|
||||||
"github.com/anyproto/any-sync/commonspace/object/tree/treestorage/mock_treestorage"
|
"github.com/anyproto/any-sync/commonspace/object/tree/treestorage/mock_treestorage"
|
||||||
"github.com/anyproto/any-sync/commonspace/object/treemanager"
|
"github.com/anyproto/any-sync/commonspace/object/treemanager"
|
||||||
"github.com/anyproto/any-sync/commonspace/object/treemanager/mock_treemanager"
|
"github.com/anyproto/any-sync/commonspace/object/treemanager/mock_treemanager"
|
||||||
@ -26,8 +23,8 @@ import (
|
|||||||
"github.com/anyproto/any-sync/commonspace/syncstatus"
|
"github.com/anyproto/any-sync/commonspace/syncstatus"
|
||||||
"github.com/anyproto/any-sync/nodeconf"
|
"github.com/anyproto/any-sync/nodeconf"
|
||||||
"github.com/anyproto/any-sync/nodeconf/mock_nodeconf"
|
"github.com/anyproto/any-sync/nodeconf/mock_nodeconf"
|
||||||
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"go.uber.org/mock/gomock"
|
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
@ -63,7 +60,6 @@ type headSyncFixture struct {
|
|||||||
treeSyncerMock *mock_treemanager.MockTreeSyncer
|
treeSyncerMock *mock_treemanager.MockTreeSyncer
|
||||||
diffMock *mock_ldiff.MockDiff
|
diffMock *mock_ldiff.MockDiff
|
||||||
clientMock *mock_spacesyncproto.MockDRPCSpaceSyncClient
|
clientMock *mock_spacesyncproto.MockDRPCSpaceSyncClient
|
||||||
aclMock *mock_syncacl.MockSyncAcl
|
|
||||||
headSync *headSync
|
headSync *headSync
|
||||||
diffSyncer *diffSyncer
|
diffSyncer *diffSyncer
|
||||||
}
|
}
|
||||||
@ -91,13 +87,9 @@ func newHeadSyncFixture(t *testing.T) *headSyncFixture {
|
|||||||
treeSyncerMock := mock_treemanager.NewMockTreeSyncer(ctrl)
|
treeSyncerMock := mock_treemanager.NewMockTreeSyncer(ctrl)
|
||||||
diffMock := mock_ldiff.NewMockDiff(ctrl)
|
diffMock := mock_ldiff.NewMockDiff(ctrl)
|
||||||
clientMock := mock_spacesyncproto.NewMockDRPCSpaceSyncClient(ctrl)
|
clientMock := mock_spacesyncproto.NewMockDRPCSpaceSyncClient(ctrl)
|
||||||
aclMock := mock_syncacl.NewMockSyncAcl(ctrl)
|
|
||||||
aclMock.EXPECT().Name().AnyTimes().Return(syncacl.CName)
|
|
||||||
aclMock.EXPECT().SetHeadUpdater(gomock.Any()).AnyTimes()
|
|
||||||
hs := &headSync{}
|
hs := &headSync{}
|
||||||
a := &app.App{}
|
a := &app.App{}
|
||||||
a.Register(spaceState).
|
a.Register(spaceState).
|
||||||
Register(aclMock).
|
|
||||||
Register(mockConfig{}).
|
Register(mockConfig{}).
|
||||||
Register(configurationMock).
|
Register(configurationMock).
|
||||||
Register(storageMock).
|
Register(storageMock).
|
||||||
@ -123,7 +115,6 @@ func newHeadSyncFixture(t *testing.T) *headSyncFixture {
|
|||||||
treeSyncerMock: treeSyncerMock,
|
treeSyncerMock: treeSyncerMock,
|
||||||
diffMock: diffMock,
|
diffMock: diffMock,
|
||||||
clientMock: clientMock,
|
clientMock: clientMock,
|
||||||
aclMock: aclMock,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -153,8 +144,6 @@ func TestHeadSync(t *testing.T) {
|
|||||||
treeMock := mock_treestorage.NewMockTreeStorage(fx.ctrl)
|
treeMock := mock_treestorage.NewMockTreeStorage(fx.ctrl)
|
||||||
fx.storageMock.EXPECT().StoredIds().Return(ids, nil)
|
fx.storageMock.EXPECT().StoredIds().Return(ids, nil)
|
||||||
fx.storageMock.EXPECT().TreeStorage(ids[0]).Return(treeMock, nil)
|
fx.storageMock.EXPECT().TreeStorage(ids[0]).Return(treeMock, nil)
|
||||||
fx.aclMock.EXPECT().Id().AnyTimes().Return("aclId")
|
|
||||||
fx.aclMock.EXPECT().Head().AnyTimes().Return(&list.AclRecord{Id: "headId"})
|
|
||||||
treeMock.EXPECT().Heads().Return([]string{"h1", "h2"}, nil)
|
treeMock.EXPECT().Heads().Return([]string{"h1", "h2"}, nil)
|
||||||
fx.diffMock.EXPECT().Set(ldiff.Element{
|
fx.diffMock.EXPECT().Set(ldiff.Element{
|
||||||
Id: "id1",
|
Id: "id1",
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import (
|
|||||||
context "context"
|
context "context"
|
||||||
reflect "reflect"
|
reflect "reflect"
|
||||||
|
|
||||||
gomock "go.uber.org/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockDiffSyncer is a mock of DiffSyncer interface.
|
// MockDiffSyncer is a mock of DiffSyncer interface.
|
||||||
|
|||||||
@ -10,7 +10,6 @@ import (
|
|||||||
"github.com/anyproto/any-sync/commonspace/object/accountdata"
|
"github.com/anyproto/any-sync/commonspace/object/accountdata"
|
||||||
"github.com/anyproto/any-sync/commonspace/object/acl/liststorage"
|
"github.com/anyproto/any-sync/commonspace/object/acl/liststorage"
|
||||||
"github.com/anyproto/any-sync/consensus/consensusproto"
|
"github.com/anyproto/any-sync/consensus/consensusproto"
|
||||||
"github.com/anyproto/any-sync/util/cidutil"
|
|
||||||
"github.com/anyproto/any-sync/util/crypto"
|
"github.com/anyproto/any-sync/util/crypto"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -45,10 +44,7 @@ type AclList interface {
|
|||||||
Records() []*AclRecord
|
Records() []*AclRecord
|
||||||
AclState() *AclState
|
AclState() *AclState
|
||||||
IsAfter(first string, second string) (bool, error)
|
IsAfter(first string, second string) (bool, error)
|
||||||
HasHead(head string) bool
|
|
||||||
Head() *AclRecord
|
Head() *AclRecord
|
||||||
|
|
||||||
RecordsAfter(ctx context.Context, id string) (records []*consensusproto.RawRecordWithId, err error)
|
|
||||||
Get(id string) (*AclRecord, error)
|
Get(id string) (*AclRecord, error)
|
||||||
GetIndex(idx int) (*AclRecord, error)
|
GetIndex(idx int) (*AclRecord, error)
|
||||||
Iterate(iterFunc IterFunc)
|
Iterate(iterFunc IterFunc)
|
||||||
@ -59,9 +55,8 @@ type AclList interface {
|
|||||||
|
|
||||||
ValidateRawRecord(record *consensusproto.RawRecord) (err error)
|
ValidateRawRecord(record *consensusproto.RawRecord) (err error)
|
||||||
AddRawRecord(rawRec *consensusproto.RawRecordWithId) (err error)
|
AddRawRecord(rawRec *consensusproto.RawRecordWithId) (err error)
|
||||||
AddRawRecords(rawRecords []*consensusproto.RawRecordWithId) (err error)
|
|
||||||
|
|
||||||
Close(ctx context.Context) (err error)
|
Close() (err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type aclList struct {
|
type aclList struct {
|
||||||
@ -200,16 +195,6 @@ func (a *aclList) ValidateRawRecord(rawRec *consensusproto.RawRecord) (err error
|
|||||||
return a.aclState.Validator().ValidateAclRecordContents(record)
|
return a.aclState.Validator().ValidateAclRecordContents(record)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *aclList) AddRawRecords(rawRecords []*consensusproto.RawRecordWithId) (err error) {
|
|
||||||
for _, rec := range rawRecords {
|
|
||||||
err = a.AddRawRecord(rec)
|
|
||||||
if err != nil && err != ErrRecordAlreadyExists {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *aclList) AddRawRecord(rawRec *consensusproto.RawRecordWithId) (err error) {
|
func (a *aclList) AddRawRecord(rawRec *consensusproto.RawRecordWithId) (err error) {
|
||||||
if _, ok := a.indexes[rawRec.Id]; ok {
|
if _, ok := a.indexes[rawRec.Id]; ok {
|
||||||
return ErrRecordAlreadyExists
|
return ErrRecordAlreadyExists
|
||||||
@ -261,11 +246,6 @@ func (a *aclList) Head() *AclRecord {
|
|||||||
return a.records[len(a.records)-1]
|
return a.records[len(a.records)-1]
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *aclList) HasHead(head string) bool {
|
|
||||||
_, exists := a.indexes[head]
|
|
||||||
return exists
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *aclList) Get(id string) (*AclRecord, error) {
|
func (a *aclList) Get(id string) (*AclRecord, error) {
|
||||||
recIdx, ok := a.indexes[id]
|
recIdx, ok := a.indexes[id]
|
||||||
if !ok {
|
if !ok {
|
||||||
@ -290,21 +270,6 @@ func (a *aclList) Iterate(iterFunc IterFunc) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *aclList) RecordsAfter(ctx context.Context, id string) (records []*consensusproto.RawRecordWithId, err error) {
|
|
||||||
recIdx, ok := a.indexes[id]
|
|
||||||
if !ok {
|
|
||||||
return nil, ErrNoSuchRecord
|
|
||||||
}
|
|
||||||
for i := recIdx + 1; i < len(a.records); i++ {
|
|
||||||
rawRec, err := a.storage.GetRawRecord(ctx, a.records[i].Id)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
records = append(records, rawRec)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *aclList) IterateFrom(startId string, iterFunc IterFunc) {
|
func (a *aclList) IterateFrom(startId string, iterFunc IterFunc) {
|
||||||
recIdx, ok := a.indexes[startId]
|
recIdx, ok := a.indexes[startId]
|
||||||
if !ok {
|
if !ok {
|
||||||
@ -317,21 +282,6 @@ func (a *aclList) IterateFrom(startId string, iterFunc IterFunc) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *aclList) Close(ctx context.Context) (err error) {
|
func (a *aclList) Close() (err error) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func WrapAclRecord(rawRec *consensusproto.RawRecord) *consensusproto.RawRecordWithId {
|
|
||||||
payload, err := rawRec.Marshal()
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
id, err := cidutil.NewCidFromBytes(payload)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
return &consensusproto.RawRecordWithId{
|
|
||||||
Payload: payload,
|
|
||||||
Id: id,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@ -7,10 +7,26 @@ import (
|
|||||||
"github.com/anyproto/any-sync/commonspace/object/accountdata"
|
"github.com/anyproto/any-sync/commonspace/object/accountdata"
|
||||||
"github.com/anyproto/any-sync/commonspace/object/acl/aclrecordproto"
|
"github.com/anyproto/any-sync/commonspace/object/acl/aclrecordproto"
|
||||||
"github.com/anyproto/any-sync/consensus/consensusproto"
|
"github.com/anyproto/any-sync/consensus/consensusproto"
|
||||||
|
"github.com/anyproto/any-sync/util/cidutil"
|
||||||
"github.com/anyproto/any-sync/util/crypto"
|
"github.com/anyproto/any-sync/util/crypto"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func wrapRecord(rawRec *consensusproto.RawRecord) *consensusproto.RawRecordWithId {
|
||||||
|
payload, err := rawRec.Marshal()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
id, err := cidutil.NewCidFromBytes(payload)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return &consensusproto.RawRecordWithId{
|
||||||
|
Payload: payload,
|
||||||
|
Id: id,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type aclFixture struct {
|
type aclFixture struct {
|
||||||
ownerKeys *accountdata.AccountKeys
|
ownerKeys *accountdata.AccountKeys
|
||||||
accountKeys *accountdata.AccountKeys
|
accountKeys *accountdata.AccountKeys
|
||||||
@ -55,7 +71,7 @@ func (fx *aclFixture) inviteAccount(t *testing.T, perms AclPermissions) {
|
|||||||
// building invite
|
// building invite
|
||||||
inv, err := ownerAcl.RecordBuilder().BuildInvite()
|
inv, err := ownerAcl.RecordBuilder().BuildInvite()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
inviteRec := WrapAclRecord(inv.InviteRec)
|
inviteRec := wrapRecord(inv.InviteRec)
|
||||||
fx.addRec(t, inviteRec)
|
fx.addRec(t, inviteRec)
|
||||||
|
|
||||||
// building request join
|
// building request join
|
||||||
@ -64,7 +80,7 @@ func (fx *aclFixture) inviteAccount(t *testing.T, perms AclPermissions) {
|
|||||||
InviteKey: inv.InviteKey,
|
InviteKey: inv.InviteKey,
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
requestJoinRec := WrapAclRecord(requestJoin)
|
requestJoinRec := wrapRecord(requestJoin)
|
||||||
fx.addRec(t, requestJoinRec)
|
fx.addRec(t, requestJoinRec)
|
||||||
|
|
||||||
// building request accept
|
// building request accept
|
||||||
@ -76,7 +92,7 @@ func (fx *aclFixture) inviteAccount(t *testing.T, perms AclPermissions) {
|
|||||||
// validate
|
// validate
|
||||||
err = ownerAcl.ValidateRawRecord(requestAccept)
|
err = ownerAcl.ValidateRawRecord(requestAccept)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
requestAcceptRec := WrapAclRecord(requestAccept)
|
requestAcceptRec := wrapRecord(requestAccept)
|
||||||
fx.addRec(t, requestAcceptRec)
|
fx.addRec(t, requestAcceptRec)
|
||||||
|
|
||||||
// checking acl state
|
// checking acl state
|
||||||
@ -116,13 +132,13 @@ func TestAclList_InviteRevoke(t *testing.T) {
|
|||||||
// building invite
|
// building invite
|
||||||
inv, err := fx.ownerAcl.RecordBuilder().BuildInvite()
|
inv, err := fx.ownerAcl.RecordBuilder().BuildInvite()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
inviteRec := WrapAclRecord(inv.InviteRec)
|
inviteRec := wrapRecord(inv.InviteRec)
|
||||||
fx.addRec(t, inviteRec)
|
fx.addRec(t, inviteRec)
|
||||||
|
|
||||||
// building invite revoke
|
// building invite revoke
|
||||||
inviteRevoke, err := fx.ownerAcl.RecordBuilder().BuildInviteRevoke(ownerState.lastRecordId)
|
inviteRevoke, err := fx.ownerAcl.RecordBuilder().BuildInviteRevoke(ownerState.lastRecordId)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
inviteRevokeRec := WrapAclRecord(inviteRevoke)
|
inviteRevokeRec := wrapRecord(inviteRevoke)
|
||||||
fx.addRec(t, inviteRevokeRec)
|
fx.addRec(t, inviteRevokeRec)
|
||||||
|
|
||||||
// checking acl state
|
// checking acl state
|
||||||
@ -143,7 +159,7 @@ func TestAclList_RequestDecline(t *testing.T) {
|
|||||||
// building invite
|
// building invite
|
||||||
inv, err := ownerAcl.RecordBuilder().BuildInvite()
|
inv, err := ownerAcl.RecordBuilder().BuildInvite()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
inviteRec := WrapAclRecord(inv.InviteRec)
|
inviteRec := wrapRecord(inv.InviteRec)
|
||||||
fx.addRec(t, inviteRec)
|
fx.addRec(t, inviteRec)
|
||||||
|
|
||||||
// building request join
|
// building request join
|
||||||
@ -152,13 +168,13 @@ func TestAclList_RequestDecline(t *testing.T) {
|
|||||||
InviteKey: inv.InviteKey,
|
InviteKey: inv.InviteKey,
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
requestJoinRec := WrapAclRecord(requestJoin)
|
requestJoinRec := wrapRecord(requestJoin)
|
||||||
fx.addRec(t, requestJoinRec)
|
fx.addRec(t, requestJoinRec)
|
||||||
|
|
||||||
// building request decline
|
// building request decline
|
||||||
requestDecline, err := ownerAcl.RecordBuilder().BuildRequestDecline(ownerState.lastRecordId)
|
requestDecline, err := ownerAcl.RecordBuilder().BuildRequestDecline(ownerState.lastRecordId)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
requestDeclineRec := WrapAclRecord(requestDecline)
|
requestDeclineRec := wrapRecord(requestDecline)
|
||||||
fx.addRec(t, requestDeclineRec)
|
fx.addRec(t, requestDeclineRec)
|
||||||
|
|
||||||
// checking acl state
|
// checking acl state
|
||||||
@ -182,7 +198,7 @@ func TestAclList_Remove(t *testing.T) {
|
|||||||
ReadKey: newReadKey,
|
ReadKey: newReadKey,
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
removeRec := WrapAclRecord(remove)
|
removeRec := wrapRecord(remove)
|
||||||
fx.addRec(t, removeRec)
|
fx.addRec(t, removeRec)
|
||||||
|
|
||||||
// checking acl state
|
// checking acl state
|
||||||
@ -209,7 +225,7 @@ func TestAclList_ReadKeyChange(t *testing.T) {
|
|||||||
newReadKey := crypto.NewAES()
|
newReadKey := crypto.NewAES()
|
||||||
readKeyChange, err := fx.ownerAcl.RecordBuilder().BuildReadKeyChange(newReadKey)
|
readKeyChange, err := fx.ownerAcl.RecordBuilder().BuildReadKeyChange(newReadKey)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
readKeyRec := WrapAclRecord(readKeyChange)
|
readKeyRec := wrapRecord(readKeyChange)
|
||||||
fx.addRec(t, readKeyRec)
|
fx.addRec(t, readKeyRec)
|
||||||
|
|
||||||
// checking acl state
|
// checking acl state
|
||||||
@ -239,7 +255,7 @@ func TestAclList_PermissionChange(t *testing.T) {
|
|||||||
Permissions: AclPermissions(aclrecordproto.AclUserPermissions_Writer),
|
Permissions: AclPermissions(aclrecordproto.AclUserPermissions_Writer),
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
permissionChangeRec := WrapAclRecord(permissionChange)
|
permissionChangeRec := wrapRecord(permissionChange)
|
||||||
fx.addRec(t, permissionChangeRec)
|
fx.addRec(t, permissionChangeRec)
|
||||||
|
|
||||||
// checking acl state
|
// checking acl state
|
||||||
@ -263,7 +279,7 @@ func TestAclList_RequestRemove(t *testing.T) {
|
|||||||
|
|
||||||
removeRequest, err := fx.accountAcl.RecordBuilder().BuildRequestRemove()
|
removeRequest, err := fx.accountAcl.RecordBuilder().BuildRequestRemove()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
removeRequestRec := WrapAclRecord(removeRequest)
|
removeRequestRec := wrapRecord(removeRequest)
|
||||||
fx.addRec(t, removeRequestRec)
|
fx.addRec(t, removeRequestRec)
|
||||||
|
|
||||||
recs := fx.accountAcl.AclState().RemoveRecords()
|
recs := fx.accountAcl.AclState().RemoveRecords()
|
||||||
@ -276,7 +292,7 @@ func TestAclList_RequestRemove(t *testing.T) {
|
|||||||
ReadKey: newReadKey,
|
ReadKey: newReadKey,
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
removeRec := WrapAclRecord(remove)
|
removeRec := wrapRecord(remove)
|
||||||
fx.addRec(t, removeRec)
|
fx.addRec(t, removeRec)
|
||||||
|
|
||||||
// checking acl state
|
// checking acl state
|
||||||
|
|||||||
@ -5,13 +5,12 @@
|
|||||||
package mock_list
|
package mock_list
|
||||||
|
|
||||||
import (
|
import (
|
||||||
context "context"
|
|
||||||
reflect "reflect"
|
reflect "reflect"
|
||||||
|
|
||||||
list "github.com/anyproto/any-sync/commonspace/object/acl/list"
|
list "github.com/anyproto/any-sync/commonspace/object/acl/list"
|
||||||
consensusproto "github.com/anyproto/any-sync/consensus/consensusproto"
|
consensusproto "github.com/anyproto/any-sync/consensus/consensusproto"
|
||||||
crypto "github.com/anyproto/any-sync/util/crypto"
|
crypto "github.com/anyproto/any-sync/util/crypto"
|
||||||
gomock "go.uber.org/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockAclList is a mock of AclList interface.
|
// MockAclList is a mock of AclList interface.
|
||||||
@ -65,32 +64,18 @@ func (mr *MockAclListMockRecorder) AddRawRecord(arg0 interface{}) *gomock.Call {
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddRawRecord", reflect.TypeOf((*MockAclList)(nil).AddRawRecord), arg0)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddRawRecord", reflect.TypeOf((*MockAclList)(nil).AddRawRecord), arg0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddRawRecords mocks base method.
|
|
||||||
func (m *MockAclList) AddRawRecords(arg0 []*consensusproto.RawRecordWithId) error {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "AddRawRecords", arg0)
|
|
||||||
ret0, _ := ret[0].(error)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddRawRecords indicates an expected call of AddRawRecords.
|
|
||||||
func (mr *MockAclListMockRecorder) AddRawRecords(arg0 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddRawRecords", reflect.TypeOf((*MockAclList)(nil).AddRawRecords), arg0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close mocks base method.
|
// Close mocks base method.
|
||||||
func (m *MockAclList) Close(arg0 context.Context) error {
|
func (m *MockAclList) Close() error {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "Close", arg0)
|
ret := m.ctrl.Call(m, "Close")
|
||||||
ret0, _ := ret[0].(error)
|
ret0, _ := ret[0].(error)
|
||||||
return ret0
|
return ret0
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close indicates an expected call of Close.
|
// Close indicates an expected call of Close.
|
||||||
func (mr *MockAclListMockRecorder) Close(arg0 interface{}) *gomock.Call {
|
func (mr *MockAclListMockRecorder) Close() *gomock.Call {
|
||||||
mr.mock.ctrl.T.Helper()
|
mr.mock.ctrl.T.Helper()
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockAclList)(nil).Close), arg0)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockAclList)(nil).Close))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get mocks base method.
|
// Get mocks base method.
|
||||||
@ -123,20 +108,6 @@ func (mr *MockAclListMockRecorder) GetIndex(arg0 interface{}) *gomock.Call {
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetIndex", reflect.TypeOf((*MockAclList)(nil).GetIndex), arg0)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetIndex", reflect.TypeOf((*MockAclList)(nil).GetIndex), arg0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// HasHead mocks base method.
|
|
||||||
func (m *MockAclList) HasHead(arg0 string) bool {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "HasHead", arg0)
|
|
||||||
ret0, _ := ret[0].(bool)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// HasHead indicates an expected call of HasHead.
|
|
||||||
func (mr *MockAclListMockRecorder) HasHead(arg0 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasHead", reflect.TypeOf((*MockAclList)(nil).HasHead), arg0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Head mocks base method.
|
// Head mocks base method.
|
||||||
func (m *MockAclList) Head() *list.AclRecord {
|
func (m *MockAclList) Head() *list.AclRecord {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
@ -282,21 +253,6 @@ func (mr *MockAclListMockRecorder) Records() *gomock.Call {
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Records", reflect.TypeOf((*MockAclList)(nil).Records))
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Records", reflect.TypeOf((*MockAclList)(nil).Records))
|
||||||
}
|
}
|
||||||
|
|
||||||
// RecordsAfter mocks base method.
|
|
||||||
func (m *MockAclList) RecordsAfter(arg0 context.Context, arg1 string) ([]*consensusproto.RawRecordWithId, error) {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "RecordsAfter", arg0, arg1)
|
|
||||||
ret0, _ := ret[0].([]*consensusproto.RawRecordWithId)
|
|
||||||
ret1, _ := ret[1].(error)
|
|
||||||
return ret0, ret1
|
|
||||||
}
|
|
||||||
|
|
||||||
// RecordsAfter indicates an expected call of RecordsAfter.
|
|
||||||
func (mr *MockAclListMockRecorder) RecordsAfter(arg0, arg1 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RecordsAfter", reflect.TypeOf((*MockAclList)(nil).RecordsAfter), arg0, arg1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Root mocks base method.
|
// Root mocks base method.
|
||||||
func (m *MockAclList) Root() *consensusproto.RawRecordWithId {
|
func (m *MockAclList) Root() *consensusproto.RawRecordWithId {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import (
|
|||||||
reflect "reflect"
|
reflect "reflect"
|
||||||
|
|
||||||
consensusproto "github.com/anyproto/any-sync/consensus/consensusproto"
|
consensusproto "github.com/anyproto/any-sync/consensus/consensusproto"
|
||||||
gomock "go.uber.org/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockListStorage is a mock of ListStorage interface.
|
// MockListStorage is a mock of ListStorage interface.
|
||||||
|
|||||||
@ -1,120 +0,0 @@
|
|||||||
//go:generate mockgen -destination mock_syncacl/mock_syncacl.go github.com/anyproto/any-sync/commonspace/object/acl/syncacl SyncAcl,SyncClient,RequestFactory,AclSyncProtocol
|
|
||||||
package syncacl
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/anyproto/any-sync/app/logger"
|
|
||||||
"github.com/anyproto/any-sync/commonspace/object/acl/list"
|
|
||||||
"github.com/anyproto/any-sync/consensus/consensusproto"
|
|
||||||
"go.uber.org/zap"
|
|
||||||
)
|
|
||||||
|
|
||||||
type AclSyncProtocol interface {
|
|
||||||
HeadUpdate(ctx context.Context, senderId string, update *consensusproto.LogHeadUpdate) (request *consensusproto.LogSyncMessage, err error)
|
|
||||||
FullSyncRequest(ctx context.Context, senderId string, request *consensusproto.LogFullSyncRequest) (response *consensusproto.LogSyncMessage, err error)
|
|
||||||
FullSyncResponse(ctx context.Context, senderId string, response *consensusproto.LogFullSyncResponse) (err error)
|
|
||||||
}
|
|
||||||
|
|
||||||
type aclSyncProtocol struct {
|
|
||||||
log logger.CtxLogger
|
|
||||||
spaceId string
|
|
||||||
aclList list.AclList
|
|
||||||
reqFactory RequestFactory
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *aclSyncProtocol) HeadUpdate(ctx context.Context, senderId string, update *consensusproto.LogHeadUpdate) (request *consensusproto.LogSyncMessage, err error) {
|
|
||||||
isEmptyUpdate := len(update.Records) == 0
|
|
||||||
log := a.log.With(
|
|
||||||
zap.String("senderId", senderId),
|
|
||||||
zap.String("update head", update.Head),
|
|
||||||
zap.Int("len(update records)", len(update.Records)))
|
|
||||||
log.DebugCtx(ctx, "received acl head update message")
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
if err != nil {
|
|
||||||
log.ErrorCtx(ctx, "acl head update finished with error", zap.Error(err))
|
|
||||||
} else if request != nil {
|
|
||||||
cnt := request.Content.GetFullSyncRequest()
|
|
||||||
log.DebugCtx(ctx, "returning acl full sync request", zap.String("request head", cnt.Head))
|
|
||||||
} else {
|
|
||||||
if !isEmptyUpdate {
|
|
||||||
log.DebugCtx(ctx, "acl head update finished correctly")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
if isEmptyUpdate {
|
|
||||||
headEquals := a.aclList.Head().Id == update.Head
|
|
||||||
log.DebugCtx(ctx, "is empty acl head update", zap.Bool("headEquals", headEquals))
|
|
||||||
if headEquals {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return a.reqFactory.CreateFullSyncRequest(a.aclList, update.Head)
|
|
||||||
}
|
|
||||||
if a.aclList.HasHead(update.Head) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err = a.aclList.AddRawRecords(update.Records)
|
|
||||||
if err == list.ErrIncorrectRecordSequence {
|
|
||||||
return a.reqFactory.CreateFullSyncRequest(a.aclList, update.Head)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *aclSyncProtocol) FullSyncRequest(ctx context.Context, senderId string, request *consensusproto.LogFullSyncRequest) (response *consensusproto.LogSyncMessage, err error) {
|
|
||||||
log := a.log.With(
|
|
||||||
zap.String("senderId", senderId),
|
|
||||||
zap.String("request head", request.Head),
|
|
||||||
zap.Int("len(request records)", len(request.Records)))
|
|
||||||
log.DebugCtx(ctx, "received acl full sync request message")
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
if err != nil {
|
|
||||||
log.ErrorCtx(ctx, "acl full sync request finished with error", zap.Error(err))
|
|
||||||
} else if response != nil {
|
|
||||||
cnt := response.Content.GetFullSyncResponse()
|
|
||||||
log.DebugCtx(ctx, "acl full sync response sent", zap.String("response head", cnt.Head), zap.Int("len(response records)", len(cnt.Records)))
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
if !a.aclList.HasHead(request.Head) {
|
|
||||||
if len(request.Records) > 0 {
|
|
||||||
// in this case we can try to add some records
|
|
||||||
err = a.aclList.AddRawRecords(request.Records)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// here it is impossible for us to do anything, we can't return records after head as defined in request, because we don't have it
|
|
||||||
return nil, list.ErrIncorrectRecordSequence
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return a.reqFactory.CreateFullSyncResponse(a.aclList, request.Head)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *aclSyncProtocol) FullSyncResponse(ctx context.Context, senderId string, response *consensusproto.LogFullSyncResponse) (err error) {
|
|
||||||
log := a.log.With(
|
|
||||||
zap.String("senderId", senderId),
|
|
||||||
zap.String("response head", response.Head),
|
|
||||||
zap.Int("len(response records)", len(response.Records)))
|
|
||||||
log.DebugCtx(ctx, "received acl full sync response message")
|
|
||||||
defer func() {
|
|
||||||
if err != nil {
|
|
||||||
log.ErrorCtx(ctx, "acl full sync response failed", zap.Error(err))
|
|
||||||
} else {
|
|
||||||
log.DebugCtx(ctx, "acl full sync response succeeded")
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
if a.aclList.HasHead(response.Head) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return a.aclList.AddRawRecords(response.Records)
|
|
||||||
}
|
|
||||||
|
|
||||||
func newAclSyncProtocol(spaceId string, aclList list.AclList, reqFactory RequestFactory) *aclSyncProtocol {
|
|
||||||
return &aclSyncProtocol{
|
|
||||||
log: log.With(zap.String("spaceId", spaceId), zap.String("aclId", aclList.Id())),
|
|
||||||
spaceId: spaceId,
|
|
||||||
aclList: aclList,
|
|
||||||
reqFactory: reqFactory,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,213 +0,0 @@
|
|||||||
package syncacl
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"github.com/anyproto/any-sync/app/logger"
|
|
||||||
"github.com/anyproto/any-sync/commonspace/object/acl/list"
|
|
||||||
"github.com/anyproto/any-sync/commonspace/object/acl/list/mock_list"
|
|
||||||
"github.com/anyproto/any-sync/commonspace/object/acl/syncacl/mock_syncacl"
|
|
||||||
"github.com/anyproto/any-sync/consensus/consensusproto"
|
|
||||||
"github.com/stretchr/testify/require"
|
|
||||||
"go.uber.org/mock/gomock"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
type aclSyncProtocolFixture struct {
|
|
||||||
log logger.CtxLogger
|
|
||||||
spaceId string
|
|
||||||
senderId string
|
|
||||||
aclId string
|
|
||||||
aclMock *mock_list.MockAclList
|
|
||||||
reqFactory *mock_syncacl.MockRequestFactory
|
|
||||||
ctrl *gomock.Controller
|
|
||||||
syncProtocol AclSyncProtocol
|
|
||||||
}
|
|
||||||
|
|
||||||
func newSyncProtocolFixture(t *testing.T) *aclSyncProtocolFixture {
|
|
||||||
ctrl := gomock.NewController(t)
|
|
||||||
aclList := mock_list.NewMockAclList(ctrl)
|
|
||||||
spaceId := "spaceId"
|
|
||||||
reqFactory := mock_syncacl.NewMockRequestFactory(ctrl)
|
|
||||||
aclList.EXPECT().Id().Return("aclId")
|
|
||||||
syncProtocol := newAclSyncProtocol(spaceId, aclList, reqFactory)
|
|
||||||
return &aclSyncProtocolFixture{
|
|
||||||
log: log,
|
|
||||||
spaceId: spaceId,
|
|
||||||
senderId: "senderId",
|
|
||||||
aclId: "aclId",
|
|
||||||
aclMock: aclList,
|
|
||||||
reqFactory: reqFactory,
|
|
||||||
ctrl: ctrl,
|
|
||||||
syncProtocol: syncProtocol,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fx *aclSyncProtocolFixture) stop() {
|
|
||||||
fx.ctrl.Finish()
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestHeadUpdate(t *testing.T) {
|
|
||||||
ctx := context.Background()
|
|
||||||
fullRequest := &consensusproto.LogSyncMessage{
|
|
||||||
Content: &consensusproto.LogSyncContentValue{
|
|
||||||
Value: &consensusproto.LogSyncContentValue_FullSyncRequest{
|
|
||||||
FullSyncRequest: &consensusproto.LogFullSyncRequest{},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
t.Run("head update non empty all heads added", func(t *testing.T) {
|
|
||||||
fx := newSyncProtocolFixture(t)
|
|
||||||
defer fx.stop()
|
|
||||||
chWithId := &consensusproto.RawRecordWithId{}
|
|
||||||
headUpdate := &consensusproto.LogHeadUpdate{
|
|
||||||
Head: "h1",
|
|
||||||
Records: []*consensusproto.RawRecordWithId{chWithId},
|
|
||||||
}
|
|
||||||
fx.aclMock.EXPECT().Id().AnyTimes().Return(fx.aclId)
|
|
||||||
fx.aclMock.EXPECT().HasHead("h1").Return(false)
|
|
||||||
fx.aclMock.EXPECT().AddRawRecords(headUpdate.Records).Return(nil)
|
|
||||||
req, err := fx.syncProtocol.HeadUpdate(ctx, fx.senderId, headUpdate)
|
|
||||||
require.Nil(t, req)
|
|
||||||
require.NoError(t, err)
|
|
||||||
})
|
|
||||||
t.Run("head update results in full request", func(t *testing.T) {
|
|
||||||
fx := newSyncProtocolFixture(t)
|
|
||||||
defer fx.stop()
|
|
||||||
chWithId := &consensusproto.RawRecordWithId{}
|
|
||||||
headUpdate := &consensusproto.LogHeadUpdate{
|
|
||||||
Head: "h1",
|
|
||||||
Records: []*consensusproto.RawRecordWithId{chWithId},
|
|
||||||
}
|
|
||||||
fx.aclMock.EXPECT().Id().AnyTimes().Return(fx.aclId)
|
|
||||||
fx.aclMock.EXPECT().HasHead("h1").Return(false)
|
|
||||||
fx.aclMock.EXPECT().AddRawRecords(headUpdate.Records).Return(list.ErrIncorrectRecordSequence)
|
|
||||||
fx.reqFactory.EXPECT().CreateFullSyncRequest(fx.aclMock, headUpdate.Head).Return(fullRequest, nil)
|
|
||||||
req, err := fx.syncProtocol.HeadUpdate(ctx, fx.senderId, headUpdate)
|
|
||||||
require.Equal(t, fullRequest, req)
|
|
||||||
require.NoError(t, err)
|
|
||||||
})
|
|
||||||
t.Run("head update old heads", func(t *testing.T) {
|
|
||||||
fx := newSyncProtocolFixture(t)
|
|
||||||
defer fx.stop()
|
|
||||||
chWithId := &consensusproto.RawRecordWithId{}
|
|
||||||
headUpdate := &consensusproto.LogHeadUpdate{
|
|
||||||
Head: "h1",
|
|
||||||
Records: []*consensusproto.RawRecordWithId{chWithId},
|
|
||||||
}
|
|
||||||
fx.aclMock.EXPECT().Id().AnyTimes().Return(fx.aclId)
|
|
||||||
fx.aclMock.EXPECT().HasHead("h1").Return(true)
|
|
||||||
req, err := fx.syncProtocol.HeadUpdate(ctx, fx.senderId, headUpdate)
|
|
||||||
require.Nil(t, req)
|
|
||||||
require.NoError(t, err)
|
|
||||||
})
|
|
||||||
t.Run("head update empty equals", func(t *testing.T) {
|
|
||||||
fx := newSyncProtocolFixture(t)
|
|
||||||
defer fx.stop()
|
|
||||||
headUpdate := &consensusproto.LogHeadUpdate{
|
|
||||||
Head: "h1",
|
|
||||||
}
|
|
||||||
fx.aclMock.EXPECT().Id().AnyTimes().Return(fx.aclId)
|
|
||||||
fx.aclMock.EXPECT().Head().Return(&list.AclRecord{Id: "h1"})
|
|
||||||
req, err := fx.syncProtocol.HeadUpdate(ctx, fx.senderId, headUpdate)
|
|
||||||
require.Nil(t, req)
|
|
||||||
require.NoError(t, err)
|
|
||||||
})
|
|
||||||
t.Run("head update empty results in full request", func(t *testing.T) {
|
|
||||||
fx := newSyncProtocolFixture(t)
|
|
||||||
defer fx.stop()
|
|
||||||
headUpdate := &consensusproto.LogHeadUpdate{
|
|
||||||
Head: "h1",
|
|
||||||
}
|
|
||||||
fx.aclMock.EXPECT().Id().AnyTimes().Return(fx.aclId)
|
|
||||||
fx.aclMock.EXPECT().Head().Return(&list.AclRecord{Id: "h2"})
|
|
||||||
fx.reqFactory.EXPECT().CreateFullSyncRequest(fx.aclMock, headUpdate.Head).Return(fullRequest, nil)
|
|
||||||
req, err := fx.syncProtocol.HeadUpdate(ctx, fx.senderId, headUpdate)
|
|
||||||
require.Equal(t, fullRequest, req)
|
|
||||||
require.NoError(t, err)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestFullSyncRequest(t *testing.T) {
|
|
||||||
ctx := context.Background()
|
|
||||||
fullResponse := &consensusproto.LogSyncMessage{
|
|
||||||
Content: &consensusproto.LogSyncContentValue{
|
|
||||||
Value: &consensusproto.LogSyncContentValue_FullSyncResponse{
|
|
||||||
FullSyncResponse: &consensusproto.LogFullSyncResponse{},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
t.Run("full sync request non empty all heads added", func(t *testing.T) {
|
|
||||||
fx := newSyncProtocolFixture(t)
|
|
||||||
defer fx.stop()
|
|
||||||
chWithId := &consensusproto.RawRecordWithId{}
|
|
||||||
fullRequest := &consensusproto.LogFullSyncRequest{
|
|
||||||
Head: "h1",
|
|
||||||
Records: []*consensusproto.RawRecordWithId{chWithId},
|
|
||||||
}
|
|
||||||
fx.aclMock.EXPECT().Id().AnyTimes().Return(fx.aclId)
|
|
||||||
fx.aclMock.EXPECT().HasHead("h1").Return(false)
|
|
||||||
fx.aclMock.EXPECT().AddRawRecords(fullRequest.Records).Return(nil)
|
|
||||||
fx.reqFactory.EXPECT().CreateFullSyncResponse(fx.aclMock, fullRequest.Head).Return(fullResponse, nil)
|
|
||||||
resp, err := fx.syncProtocol.FullSyncRequest(ctx, fx.senderId, fullRequest)
|
|
||||||
require.Equal(t, fullResponse, resp)
|
|
||||||
require.NoError(t, err)
|
|
||||||
})
|
|
||||||
t.Run("full sync request non empty head exists", func(t *testing.T) {
|
|
||||||
fx := newSyncProtocolFixture(t)
|
|
||||||
defer fx.stop()
|
|
||||||
chWithId := &consensusproto.RawRecordWithId{}
|
|
||||||
fullRequest := &consensusproto.LogFullSyncRequest{
|
|
||||||
Head: "h1",
|
|
||||||
Records: []*consensusproto.RawRecordWithId{chWithId},
|
|
||||||
}
|
|
||||||
fx.aclMock.EXPECT().Id().AnyTimes().Return(fx.aclId)
|
|
||||||
fx.aclMock.EXPECT().HasHead("h1").Return(true)
|
|
||||||
fx.reqFactory.EXPECT().CreateFullSyncResponse(fx.aclMock, fullRequest.Head).Return(fullResponse, nil)
|
|
||||||
resp, err := fx.syncProtocol.FullSyncRequest(ctx, fx.senderId, fullRequest)
|
|
||||||
require.Equal(t, fullResponse, resp)
|
|
||||||
require.NoError(t, err)
|
|
||||||
})
|
|
||||||
t.Run("full sync request empty head not exists", func(t *testing.T) {
|
|
||||||
fx := newSyncProtocolFixture(t)
|
|
||||||
defer fx.stop()
|
|
||||||
fullRequest := &consensusproto.LogFullSyncRequest{
|
|
||||||
Head: "h1",
|
|
||||||
}
|
|
||||||
fx.aclMock.EXPECT().Id().AnyTimes().Return(fx.aclId)
|
|
||||||
fx.aclMock.EXPECT().HasHead("h1").Return(false)
|
|
||||||
resp, err := fx.syncProtocol.FullSyncRequest(ctx, fx.senderId, fullRequest)
|
|
||||||
require.Nil(t, resp)
|
|
||||||
require.Error(t, list.ErrIncorrectRecordSequence, err)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestFullSyncResponse(t *testing.T) {
|
|
||||||
ctx := context.Background()
|
|
||||||
t.Run("full sync response no heads", func(t *testing.T) {
|
|
||||||
fx := newSyncProtocolFixture(t)
|
|
||||||
defer fx.stop()
|
|
||||||
chWithId := &consensusproto.RawRecordWithId{}
|
|
||||||
fullResponse := &consensusproto.LogFullSyncResponse{
|
|
||||||
Head: "h1",
|
|
||||||
Records: []*consensusproto.RawRecordWithId{chWithId},
|
|
||||||
}
|
|
||||||
fx.aclMock.EXPECT().Id().AnyTimes().Return(fx.aclId)
|
|
||||||
fx.aclMock.EXPECT().HasHead("h1").Return(false)
|
|
||||||
fx.aclMock.EXPECT().AddRawRecords(fullResponse.Records).Return(nil)
|
|
||||||
err := fx.syncProtocol.FullSyncResponse(ctx, fx.senderId, fullResponse)
|
|
||||||
require.NoError(t, err)
|
|
||||||
})
|
|
||||||
t.Run("full sync response has heads", func(t *testing.T) {
|
|
||||||
fx := newSyncProtocolFixture(t)
|
|
||||||
defer fx.stop()
|
|
||||||
chWithId := &consensusproto.RawRecordWithId{}
|
|
||||||
fullResponse := &consensusproto.LogFullSyncResponse{
|
|
||||||
Head: "h1",
|
|
||||||
Records: []*consensusproto.RawRecordWithId{chWithId},
|
|
||||||
}
|
|
||||||
fx.aclMock.EXPECT().Id().AnyTimes().Return(fx.aclId)
|
|
||||||
fx.aclMock.EXPECT().HasHead("h1").Return(true)
|
|
||||||
err := fx.syncProtocol.FullSyncResponse(ctx, fx.senderId, fullResponse)
|
|
||||||
require.NoError(t, err)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@ -1,5 +0,0 @@
|
|||||||
package headupdater
|
|
||||||
|
|
||||||
type HeadUpdater interface {
|
|
||||||
UpdateHeads(id string, heads []string)
|
|
||||||
}
|
|
||||||
@ -1,694 +0,0 @@
|
|||||||
// Code generated by MockGen. DO NOT EDIT.
|
|
||||||
// Source: github.com/anyproto/any-sync/commonspace/object/acl/syncacl (interfaces: SyncAcl,SyncClient,RequestFactory,AclSyncProtocol)
|
|
||||||
|
|
||||||
// Package mock_syncacl is a generated GoMock package.
|
|
||||||
package mock_syncacl
|
|
||||||
|
|
||||||
import (
|
|
||||||
context "context"
|
|
||||||
reflect "reflect"
|
|
||||||
|
|
||||||
app "github.com/anyproto/any-sync/app"
|
|
||||||
list "github.com/anyproto/any-sync/commonspace/object/acl/list"
|
|
||||||
headupdater "github.com/anyproto/any-sync/commonspace/object/acl/syncacl/headupdater"
|
|
||||||
spacesyncproto "github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
|
||||||
consensusproto "github.com/anyproto/any-sync/consensus/consensusproto"
|
|
||||||
crypto "github.com/anyproto/any-sync/util/crypto"
|
|
||||||
gomock "go.uber.org/mock/gomock"
|
|
||||||
)
|
|
||||||
|
|
||||||
// MockSyncAcl is a mock of SyncAcl interface.
|
|
||||||
type MockSyncAcl struct {
|
|
||||||
ctrl *gomock.Controller
|
|
||||||
recorder *MockSyncAclMockRecorder
|
|
||||||
}
|
|
||||||
|
|
||||||
// MockSyncAclMockRecorder is the mock recorder for MockSyncAcl.
|
|
||||||
type MockSyncAclMockRecorder struct {
|
|
||||||
mock *MockSyncAcl
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewMockSyncAcl creates a new mock instance.
|
|
||||||
func NewMockSyncAcl(ctrl *gomock.Controller) *MockSyncAcl {
|
|
||||||
mock := &MockSyncAcl{ctrl: ctrl}
|
|
||||||
mock.recorder = &MockSyncAclMockRecorder{mock}
|
|
||||||
return mock
|
|
||||||
}
|
|
||||||
|
|
||||||
// EXPECT returns an object that allows the caller to indicate expected use.
|
|
||||||
func (m *MockSyncAcl) EXPECT() *MockSyncAclMockRecorder {
|
|
||||||
return m.recorder
|
|
||||||
}
|
|
||||||
|
|
||||||
// AclState mocks base method.
|
|
||||||
func (m *MockSyncAcl) AclState() *list.AclState {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "AclState")
|
|
||||||
ret0, _ := ret[0].(*list.AclState)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// AclState indicates an expected call of AclState.
|
|
||||||
func (mr *MockSyncAclMockRecorder) AclState() *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AclState", reflect.TypeOf((*MockSyncAcl)(nil).AclState))
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddRawRecord mocks base method.
|
|
||||||
func (m *MockSyncAcl) AddRawRecord(arg0 *consensusproto.RawRecordWithId) error {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "AddRawRecord", arg0)
|
|
||||||
ret0, _ := ret[0].(error)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddRawRecord indicates an expected call of AddRawRecord.
|
|
||||||
func (mr *MockSyncAclMockRecorder) AddRawRecord(arg0 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddRawRecord", reflect.TypeOf((*MockSyncAcl)(nil).AddRawRecord), arg0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddRawRecords mocks base method.
|
|
||||||
func (m *MockSyncAcl) AddRawRecords(arg0 []*consensusproto.RawRecordWithId) error {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "AddRawRecords", arg0)
|
|
||||||
ret0, _ := ret[0].(error)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddRawRecords indicates an expected call of AddRawRecords.
|
|
||||||
func (mr *MockSyncAclMockRecorder) AddRawRecords(arg0 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddRawRecords", reflect.TypeOf((*MockSyncAcl)(nil).AddRawRecords), arg0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close mocks base method.
|
|
||||||
func (m *MockSyncAcl) Close(arg0 context.Context) error {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "Close", arg0)
|
|
||||||
ret0, _ := ret[0].(error)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close indicates an expected call of Close.
|
|
||||||
func (mr *MockSyncAclMockRecorder) Close(arg0 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockSyncAcl)(nil).Close), arg0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get mocks base method.
|
|
||||||
func (m *MockSyncAcl) Get(arg0 string) (*list.AclRecord, error) {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "Get", arg0)
|
|
||||||
ret0, _ := ret[0].(*list.AclRecord)
|
|
||||||
ret1, _ := ret[1].(error)
|
|
||||||
return ret0, ret1
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get indicates an expected call of Get.
|
|
||||||
func (mr *MockSyncAclMockRecorder) Get(arg0 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockSyncAcl)(nil).Get), arg0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetIndex mocks base method.
|
|
||||||
func (m *MockSyncAcl) GetIndex(arg0 int) (*list.AclRecord, error) {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "GetIndex", arg0)
|
|
||||||
ret0, _ := ret[0].(*list.AclRecord)
|
|
||||||
ret1, _ := ret[1].(error)
|
|
||||||
return ret0, ret1
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetIndex indicates an expected call of GetIndex.
|
|
||||||
func (mr *MockSyncAclMockRecorder) GetIndex(arg0 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetIndex", reflect.TypeOf((*MockSyncAcl)(nil).GetIndex), arg0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HandleMessage mocks base method.
|
|
||||||
func (m *MockSyncAcl) HandleMessage(arg0 context.Context, arg1 string, arg2 *spacesyncproto.ObjectSyncMessage) error {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "HandleMessage", arg0, arg1, arg2)
|
|
||||||
ret0, _ := ret[0].(error)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// HandleMessage indicates an expected call of HandleMessage.
|
|
||||||
func (mr *MockSyncAclMockRecorder) HandleMessage(arg0, arg1, arg2 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HandleMessage", reflect.TypeOf((*MockSyncAcl)(nil).HandleMessage), arg0, arg1, arg2)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HandleRequest mocks base method.
|
|
||||||
func (m *MockSyncAcl) HandleRequest(arg0 context.Context, arg1 string, arg2 *spacesyncproto.ObjectSyncMessage) (*spacesyncproto.ObjectSyncMessage, error) {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "HandleRequest", arg0, arg1, arg2)
|
|
||||||
ret0, _ := ret[0].(*spacesyncproto.ObjectSyncMessage)
|
|
||||||
ret1, _ := ret[1].(error)
|
|
||||||
return ret0, ret1
|
|
||||||
}
|
|
||||||
|
|
||||||
// HandleRequest indicates an expected call of HandleRequest.
|
|
||||||
func (mr *MockSyncAclMockRecorder) HandleRequest(arg0, arg1, arg2 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HandleRequest", reflect.TypeOf((*MockSyncAcl)(nil).HandleRequest), arg0, arg1, arg2)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HasHead mocks base method.
|
|
||||||
func (m *MockSyncAcl) HasHead(arg0 string) bool {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "HasHead", arg0)
|
|
||||||
ret0, _ := ret[0].(bool)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// HasHead indicates an expected call of HasHead.
|
|
||||||
func (mr *MockSyncAclMockRecorder) HasHead(arg0 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasHead", reflect.TypeOf((*MockSyncAcl)(nil).HasHead), arg0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Head mocks base method.
|
|
||||||
func (m *MockSyncAcl) Head() *list.AclRecord {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "Head")
|
|
||||||
ret0, _ := ret[0].(*list.AclRecord)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// Head indicates an expected call of Head.
|
|
||||||
func (mr *MockSyncAclMockRecorder) Head() *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Head", reflect.TypeOf((*MockSyncAcl)(nil).Head))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Id mocks base method.
|
|
||||||
func (m *MockSyncAcl) Id() string {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "Id")
|
|
||||||
ret0, _ := ret[0].(string)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// Id indicates an expected call of Id.
|
|
||||||
func (mr *MockSyncAclMockRecorder) Id() *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Id", reflect.TypeOf((*MockSyncAcl)(nil).Id))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Init mocks base method.
|
|
||||||
func (m *MockSyncAcl) Init(arg0 *app.App) error {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "Init", arg0)
|
|
||||||
ret0, _ := ret[0].(error)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// Init indicates an expected call of Init.
|
|
||||||
func (mr *MockSyncAclMockRecorder) Init(arg0 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockSyncAcl)(nil).Init), arg0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsAfter mocks base method.
|
|
||||||
func (m *MockSyncAcl) IsAfter(arg0, arg1 string) (bool, error) {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "IsAfter", arg0, arg1)
|
|
||||||
ret0, _ := ret[0].(bool)
|
|
||||||
ret1, _ := ret[1].(error)
|
|
||||||
return ret0, ret1
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsAfter indicates an expected call of IsAfter.
|
|
||||||
func (mr *MockSyncAclMockRecorder) IsAfter(arg0, arg1 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsAfter", reflect.TypeOf((*MockSyncAcl)(nil).IsAfter), arg0, arg1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Iterate mocks base method.
|
|
||||||
func (m *MockSyncAcl) Iterate(arg0 func(*list.AclRecord) bool) {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
m.ctrl.Call(m, "Iterate", arg0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Iterate indicates an expected call of Iterate.
|
|
||||||
func (mr *MockSyncAclMockRecorder) Iterate(arg0 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Iterate", reflect.TypeOf((*MockSyncAcl)(nil).Iterate), arg0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IterateFrom mocks base method.
|
|
||||||
func (m *MockSyncAcl) IterateFrom(arg0 string, arg1 func(*list.AclRecord) bool) {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
m.ctrl.Call(m, "IterateFrom", arg0, arg1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IterateFrom indicates an expected call of IterateFrom.
|
|
||||||
func (mr *MockSyncAclMockRecorder) IterateFrom(arg0, arg1 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IterateFrom", reflect.TypeOf((*MockSyncAcl)(nil).IterateFrom), arg0, arg1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// KeyStorage mocks base method.
|
|
||||||
func (m *MockSyncAcl) KeyStorage() crypto.KeyStorage {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "KeyStorage")
|
|
||||||
ret0, _ := ret[0].(crypto.KeyStorage)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// KeyStorage indicates an expected call of KeyStorage.
|
|
||||||
func (mr *MockSyncAclMockRecorder) KeyStorage() *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "KeyStorage", reflect.TypeOf((*MockSyncAcl)(nil).KeyStorage))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Lock mocks base method.
|
|
||||||
func (m *MockSyncAcl) Lock() {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
m.ctrl.Call(m, "Lock")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Lock indicates an expected call of Lock.
|
|
||||||
func (mr *MockSyncAclMockRecorder) Lock() *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Lock", reflect.TypeOf((*MockSyncAcl)(nil).Lock))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Name mocks base method.
|
|
||||||
func (m *MockSyncAcl) Name() string {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "Name")
|
|
||||||
ret0, _ := ret[0].(string)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// Name indicates an expected call of Name.
|
|
||||||
func (mr *MockSyncAclMockRecorder) Name() *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MockSyncAcl)(nil).Name))
|
|
||||||
}
|
|
||||||
|
|
||||||
// RLock mocks base method.
|
|
||||||
func (m *MockSyncAcl) RLock() {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
m.ctrl.Call(m, "RLock")
|
|
||||||
}
|
|
||||||
|
|
||||||
// RLock indicates an expected call of RLock.
|
|
||||||
func (mr *MockSyncAclMockRecorder) RLock() *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RLock", reflect.TypeOf((*MockSyncAcl)(nil).RLock))
|
|
||||||
}
|
|
||||||
|
|
||||||
// RUnlock mocks base method.
|
|
||||||
func (m *MockSyncAcl) RUnlock() {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
m.ctrl.Call(m, "RUnlock")
|
|
||||||
}
|
|
||||||
|
|
||||||
// RUnlock indicates an expected call of RUnlock.
|
|
||||||
func (mr *MockSyncAclMockRecorder) RUnlock() *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RUnlock", reflect.TypeOf((*MockSyncAcl)(nil).RUnlock))
|
|
||||||
}
|
|
||||||
|
|
||||||
// RecordBuilder mocks base method.
|
|
||||||
func (m *MockSyncAcl) RecordBuilder() list.AclRecordBuilder {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "RecordBuilder")
|
|
||||||
ret0, _ := ret[0].(list.AclRecordBuilder)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// RecordBuilder indicates an expected call of RecordBuilder.
|
|
||||||
func (mr *MockSyncAclMockRecorder) RecordBuilder() *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RecordBuilder", reflect.TypeOf((*MockSyncAcl)(nil).RecordBuilder))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Records mocks base method.
|
|
||||||
func (m *MockSyncAcl) Records() []*list.AclRecord {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "Records")
|
|
||||||
ret0, _ := ret[0].([]*list.AclRecord)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// Records indicates an expected call of Records.
|
|
||||||
func (mr *MockSyncAclMockRecorder) Records() *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Records", reflect.TypeOf((*MockSyncAcl)(nil).Records))
|
|
||||||
}
|
|
||||||
|
|
||||||
// RecordsAfter mocks base method.
|
|
||||||
func (m *MockSyncAcl) RecordsAfter(arg0 context.Context, arg1 string) ([]*consensusproto.RawRecordWithId, error) {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "RecordsAfter", arg0, arg1)
|
|
||||||
ret0, _ := ret[0].([]*consensusproto.RawRecordWithId)
|
|
||||||
ret1, _ := ret[1].(error)
|
|
||||||
return ret0, ret1
|
|
||||||
}
|
|
||||||
|
|
||||||
// RecordsAfter indicates an expected call of RecordsAfter.
|
|
||||||
func (mr *MockSyncAclMockRecorder) RecordsAfter(arg0, arg1 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RecordsAfter", reflect.TypeOf((*MockSyncAcl)(nil).RecordsAfter), arg0, arg1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Root mocks base method.
|
|
||||||
func (m *MockSyncAcl) Root() *consensusproto.RawRecordWithId {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "Root")
|
|
||||||
ret0, _ := ret[0].(*consensusproto.RawRecordWithId)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// Root indicates an expected call of Root.
|
|
||||||
func (mr *MockSyncAclMockRecorder) Root() *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Root", reflect.TypeOf((*MockSyncAcl)(nil).Root))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Run mocks base method.
|
|
||||||
func (m *MockSyncAcl) Run(arg0 context.Context) error {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "Run", arg0)
|
|
||||||
ret0, _ := ret[0].(error)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// Run indicates an expected call of Run.
|
|
||||||
func (mr *MockSyncAclMockRecorder) Run(arg0 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Run", reflect.TypeOf((*MockSyncAcl)(nil).Run), arg0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetHeadUpdater mocks base method.
|
|
||||||
func (m *MockSyncAcl) SetHeadUpdater(arg0 headupdater.HeadUpdater) {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
m.ctrl.Call(m, "SetHeadUpdater", arg0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetHeadUpdater indicates an expected call of SetHeadUpdater.
|
|
||||||
func (mr *MockSyncAclMockRecorder) SetHeadUpdater(arg0 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHeadUpdater", reflect.TypeOf((*MockSyncAcl)(nil).SetHeadUpdater), arg0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SyncWithPeer mocks base method.
|
|
||||||
func (m *MockSyncAcl) SyncWithPeer(arg0 context.Context, arg1 string) error {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "SyncWithPeer", arg0, arg1)
|
|
||||||
ret0, _ := ret[0].(error)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// SyncWithPeer indicates an expected call of SyncWithPeer.
|
|
||||||
func (mr *MockSyncAclMockRecorder) SyncWithPeer(arg0, arg1 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SyncWithPeer", reflect.TypeOf((*MockSyncAcl)(nil).SyncWithPeer), arg0, arg1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unlock mocks base method.
|
|
||||||
func (m *MockSyncAcl) Unlock() {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
m.ctrl.Call(m, "Unlock")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unlock indicates an expected call of Unlock.
|
|
||||||
func (mr *MockSyncAclMockRecorder) Unlock() *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Unlock", reflect.TypeOf((*MockSyncAcl)(nil).Unlock))
|
|
||||||
}
|
|
||||||
|
|
||||||
// ValidateRawRecord mocks base method.
|
|
||||||
func (m *MockSyncAcl) ValidateRawRecord(arg0 *consensusproto.RawRecord) error {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "ValidateRawRecord", arg0)
|
|
||||||
ret0, _ := ret[0].(error)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// ValidateRawRecord indicates an expected call of ValidateRawRecord.
|
|
||||||
func (mr *MockSyncAclMockRecorder) ValidateRawRecord(arg0 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValidateRawRecord", reflect.TypeOf((*MockSyncAcl)(nil).ValidateRawRecord), arg0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MockSyncClient is a mock of SyncClient interface.
|
|
||||||
type MockSyncClient struct {
|
|
||||||
ctrl *gomock.Controller
|
|
||||||
recorder *MockSyncClientMockRecorder
|
|
||||||
}
|
|
||||||
|
|
||||||
// MockSyncClientMockRecorder is the mock recorder for MockSyncClient.
|
|
||||||
type MockSyncClientMockRecorder struct {
|
|
||||||
mock *MockSyncClient
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewMockSyncClient creates a new mock instance.
|
|
||||||
func NewMockSyncClient(ctrl *gomock.Controller) *MockSyncClient {
|
|
||||||
mock := &MockSyncClient{ctrl: ctrl}
|
|
||||||
mock.recorder = &MockSyncClientMockRecorder{mock}
|
|
||||||
return mock
|
|
||||||
}
|
|
||||||
|
|
||||||
// EXPECT returns an object that allows the caller to indicate expected use.
|
|
||||||
func (m *MockSyncClient) EXPECT() *MockSyncClientMockRecorder {
|
|
||||||
return m.recorder
|
|
||||||
}
|
|
||||||
|
|
||||||
// Broadcast mocks base method.
|
|
||||||
func (m *MockSyncClient) Broadcast(arg0 *consensusproto.LogSyncMessage) {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
m.ctrl.Call(m, "Broadcast", arg0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Broadcast indicates an expected call of Broadcast.
|
|
||||||
func (mr *MockSyncClientMockRecorder) Broadcast(arg0 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Broadcast", reflect.TypeOf((*MockSyncClient)(nil).Broadcast), arg0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateFullSyncRequest mocks base method.
|
|
||||||
func (m *MockSyncClient) CreateFullSyncRequest(arg0 list.AclList, arg1 string) (*consensusproto.LogSyncMessage, error) {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "CreateFullSyncRequest", arg0, arg1)
|
|
||||||
ret0, _ := ret[0].(*consensusproto.LogSyncMessage)
|
|
||||||
ret1, _ := ret[1].(error)
|
|
||||||
return ret0, ret1
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateFullSyncRequest indicates an expected call of CreateFullSyncRequest.
|
|
||||||
func (mr *MockSyncClientMockRecorder) CreateFullSyncRequest(arg0, arg1 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateFullSyncRequest", reflect.TypeOf((*MockSyncClient)(nil).CreateFullSyncRequest), arg0, arg1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateFullSyncResponse mocks base method.
|
|
||||||
func (m *MockSyncClient) CreateFullSyncResponse(arg0 list.AclList, arg1 string) (*consensusproto.LogSyncMessage, error) {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "CreateFullSyncResponse", arg0, arg1)
|
|
||||||
ret0, _ := ret[0].(*consensusproto.LogSyncMessage)
|
|
||||||
ret1, _ := ret[1].(error)
|
|
||||||
return ret0, ret1
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateFullSyncResponse indicates an expected call of CreateFullSyncResponse.
|
|
||||||
func (mr *MockSyncClientMockRecorder) CreateFullSyncResponse(arg0, arg1 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateFullSyncResponse", reflect.TypeOf((*MockSyncClient)(nil).CreateFullSyncResponse), arg0, arg1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateHeadUpdate mocks base method.
|
|
||||||
func (m *MockSyncClient) CreateHeadUpdate(arg0 list.AclList, arg1 []*consensusproto.RawRecordWithId) *consensusproto.LogSyncMessage {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "CreateHeadUpdate", arg0, arg1)
|
|
||||||
ret0, _ := ret[0].(*consensusproto.LogSyncMessage)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateHeadUpdate indicates an expected call of CreateHeadUpdate.
|
|
||||||
func (mr *MockSyncClientMockRecorder) CreateHeadUpdate(arg0, arg1 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateHeadUpdate", reflect.TypeOf((*MockSyncClient)(nil).CreateHeadUpdate), arg0, arg1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// QueueRequest mocks base method.
|
|
||||||
func (m *MockSyncClient) QueueRequest(arg0 string, arg1 *consensusproto.LogSyncMessage) error {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "QueueRequest", arg0, arg1)
|
|
||||||
ret0, _ := ret[0].(error)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// QueueRequest indicates an expected call of QueueRequest.
|
|
||||||
func (mr *MockSyncClientMockRecorder) QueueRequest(arg0, arg1 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "QueueRequest", reflect.TypeOf((*MockSyncClient)(nil).QueueRequest), arg0, arg1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SendRequest mocks base method.
|
|
||||||
func (m *MockSyncClient) SendRequest(arg0 context.Context, arg1 string, arg2 *consensusproto.LogSyncMessage) (*spacesyncproto.ObjectSyncMessage, error) {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "SendRequest", arg0, arg1, arg2)
|
|
||||||
ret0, _ := ret[0].(*spacesyncproto.ObjectSyncMessage)
|
|
||||||
ret1, _ := ret[1].(error)
|
|
||||||
return ret0, ret1
|
|
||||||
}
|
|
||||||
|
|
||||||
// SendRequest indicates an expected call of SendRequest.
|
|
||||||
func (mr *MockSyncClientMockRecorder) SendRequest(arg0, arg1, arg2 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendRequest", reflect.TypeOf((*MockSyncClient)(nil).SendRequest), arg0, arg1, arg2)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SendUpdate mocks base method.
|
|
||||||
func (m *MockSyncClient) SendUpdate(arg0 string, arg1 *consensusproto.LogSyncMessage) error {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "SendUpdate", arg0, arg1)
|
|
||||||
ret0, _ := ret[0].(error)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// SendUpdate indicates an expected call of SendUpdate.
|
|
||||||
func (mr *MockSyncClientMockRecorder) SendUpdate(arg0, arg1 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendUpdate", reflect.TypeOf((*MockSyncClient)(nil).SendUpdate), arg0, arg1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MockRequestFactory is a mock of RequestFactory interface.
|
|
||||||
type MockRequestFactory struct {
|
|
||||||
ctrl *gomock.Controller
|
|
||||||
recorder *MockRequestFactoryMockRecorder
|
|
||||||
}
|
|
||||||
|
|
||||||
// MockRequestFactoryMockRecorder is the mock recorder for MockRequestFactory.
|
|
||||||
type MockRequestFactoryMockRecorder struct {
|
|
||||||
mock *MockRequestFactory
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewMockRequestFactory creates a new mock instance.
|
|
||||||
func NewMockRequestFactory(ctrl *gomock.Controller) *MockRequestFactory {
|
|
||||||
mock := &MockRequestFactory{ctrl: ctrl}
|
|
||||||
mock.recorder = &MockRequestFactoryMockRecorder{mock}
|
|
||||||
return mock
|
|
||||||
}
|
|
||||||
|
|
||||||
// EXPECT returns an object that allows the caller to indicate expected use.
|
|
||||||
func (m *MockRequestFactory) EXPECT() *MockRequestFactoryMockRecorder {
|
|
||||||
return m.recorder
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateFullSyncRequest mocks base method.
|
|
||||||
func (m *MockRequestFactory) CreateFullSyncRequest(arg0 list.AclList, arg1 string) (*consensusproto.LogSyncMessage, error) {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "CreateFullSyncRequest", arg0, arg1)
|
|
||||||
ret0, _ := ret[0].(*consensusproto.LogSyncMessage)
|
|
||||||
ret1, _ := ret[1].(error)
|
|
||||||
return ret0, ret1
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateFullSyncRequest indicates an expected call of CreateFullSyncRequest.
|
|
||||||
func (mr *MockRequestFactoryMockRecorder) CreateFullSyncRequest(arg0, arg1 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateFullSyncRequest", reflect.TypeOf((*MockRequestFactory)(nil).CreateFullSyncRequest), arg0, arg1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateFullSyncResponse mocks base method.
|
|
||||||
func (m *MockRequestFactory) CreateFullSyncResponse(arg0 list.AclList, arg1 string) (*consensusproto.LogSyncMessage, error) {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "CreateFullSyncResponse", arg0, arg1)
|
|
||||||
ret0, _ := ret[0].(*consensusproto.LogSyncMessage)
|
|
||||||
ret1, _ := ret[1].(error)
|
|
||||||
return ret0, ret1
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateFullSyncResponse indicates an expected call of CreateFullSyncResponse.
|
|
||||||
func (mr *MockRequestFactoryMockRecorder) CreateFullSyncResponse(arg0, arg1 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateFullSyncResponse", reflect.TypeOf((*MockRequestFactory)(nil).CreateFullSyncResponse), arg0, arg1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateHeadUpdate mocks base method.
|
|
||||||
func (m *MockRequestFactory) CreateHeadUpdate(arg0 list.AclList, arg1 []*consensusproto.RawRecordWithId) *consensusproto.LogSyncMessage {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "CreateHeadUpdate", arg0, arg1)
|
|
||||||
ret0, _ := ret[0].(*consensusproto.LogSyncMessage)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateHeadUpdate indicates an expected call of CreateHeadUpdate.
|
|
||||||
func (mr *MockRequestFactoryMockRecorder) CreateHeadUpdate(arg0, arg1 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateHeadUpdate", reflect.TypeOf((*MockRequestFactory)(nil).CreateHeadUpdate), arg0, arg1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MockAclSyncProtocol is a mock of AclSyncProtocol interface.
|
|
||||||
type MockAclSyncProtocol struct {
|
|
||||||
ctrl *gomock.Controller
|
|
||||||
recorder *MockAclSyncProtocolMockRecorder
|
|
||||||
}
|
|
||||||
|
|
||||||
// MockAclSyncProtocolMockRecorder is the mock recorder for MockAclSyncProtocol.
|
|
||||||
type MockAclSyncProtocolMockRecorder struct {
|
|
||||||
mock *MockAclSyncProtocol
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewMockAclSyncProtocol creates a new mock instance.
|
|
||||||
func NewMockAclSyncProtocol(ctrl *gomock.Controller) *MockAclSyncProtocol {
|
|
||||||
mock := &MockAclSyncProtocol{ctrl: ctrl}
|
|
||||||
mock.recorder = &MockAclSyncProtocolMockRecorder{mock}
|
|
||||||
return mock
|
|
||||||
}
|
|
||||||
|
|
||||||
// EXPECT returns an object that allows the caller to indicate expected use.
|
|
||||||
func (m *MockAclSyncProtocol) EXPECT() *MockAclSyncProtocolMockRecorder {
|
|
||||||
return m.recorder
|
|
||||||
}
|
|
||||||
|
|
||||||
// FullSyncRequest mocks base method.
|
|
||||||
func (m *MockAclSyncProtocol) FullSyncRequest(arg0 context.Context, arg1 string, arg2 *consensusproto.LogFullSyncRequest) (*consensusproto.LogSyncMessage, error) {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "FullSyncRequest", arg0, arg1, arg2)
|
|
||||||
ret0, _ := ret[0].(*consensusproto.LogSyncMessage)
|
|
||||||
ret1, _ := ret[1].(error)
|
|
||||||
return ret0, ret1
|
|
||||||
}
|
|
||||||
|
|
||||||
// FullSyncRequest indicates an expected call of FullSyncRequest.
|
|
||||||
func (mr *MockAclSyncProtocolMockRecorder) FullSyncRequest(arg0, arg1, arg2 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FullSyncRequest", reflect.TypeOf((*MockAclSyncProtocol)(nil).FullSyncRequest), arg0, arg1, arg2)
|
|
||||||
}
|
|
||||||
|
|
||||||
// FullSyncResponse mocks base method.
|
|
||||||
func (m *MockAclSyncProtocol) FullSyncResponse(arg0 context.Context, arg1 string, arg2 *consensusproto.LogFullSyncResponse) error {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "FullSyncResponse", arg0, arg1, arg2)
|
|
||||||
ret0, _ := ret[0].(error)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// FullSyncResponse indicates an expected call of FullSyncResponse.
|
|
||||||
func (mr *MockAclSyncProtocolMockRecorder) FullSyncResponse(arg0, arg1, arg2 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FullSyncResponse", reflect.TypeOf((*MockAclSyncProtocol)(nil).FullSyncResponse), arg0, arg1, arg2)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HeadUpdate mocks base method.
|
|
||||||
func (m *MockAclSyncProtocol) HeadUpdate(arg0 context.Context, arg1 string, arg2 *consensusproto.LogHeadUpdate) (*consensusproto.LogSyncMessage, error) {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "HeadUpdate", arg0, arg1, arg2)
|
|
||||||
ret0, _ := ret[0].(*consensusproto.LogSyncMessage)
|
|
||||||
ret1, _ := ret[1].(error)
|
|
||||||
return ret0, ret1
|
|
||||||
}
|
|
||||||
|
|
||||||
// HeadUpdate indicates an expected call of HeadUpdate.
|
|
||||||
func (mr *MockAclSyncProtocolMockRecorder) HeadUpdate(arg0, arg1, arg2 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HeadUpdate", reflect.TypeOf((*MockAclSyncProtocol)(nil).HeadUpdate), arg0, arg1, arg2)
|
|
||||||
}
|
|
||||||
@ -1,54 +0,0 @@
|
|||||||
package syncacl
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/anyproto/any-sync/commonspace/object/acl/list"
|
|
||||||
"github.com/anyproto/any-sync/consensus/consensusproto"
|
|
||||||
)
|
|
||||||
|
|
||||||
type RequestFactory interface {
|
|
||||||
CreateHeadUpdate(l list.AclList, added []*consensusproto.RawRecordWithId) (msg *consensusproto.LogSyncMessage)
|
|
||||||
CreateFullSyncRequest(l list.AclList, theirHead string) (req *consensusproto.LogSyncMessage, err error)
|
|
||||||
CreateFullSyncResponse(l list.AclList, theirHead string) (*consensusproto.LogSyncMessage, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
type requestFactory struct{}
|
|
||||||
|
|
||||||
func NewRequestFactory() RequestFactory {
|
|
||||||
return &requestFactory{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *requestFactory) CreateHeadUpdate(l list.AclList, added []*consensusproto.RawRecordWithId) (msg *consensusproto.LogSyncMessage) {
|
|
||||||
return consensusproto.WrapHeadUpdate(&consensusproto.LogHeadUpdate{
|
|
||||||
Head: l.Head().Id,
|
|
||||||
Records: added,
|
|
||||||
}, l.Root())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *requestFactory) CreateFullSyncRequest(l list.AclList, theirHead string) (req *consensusproto.LogSyncMessage, err error) {
|
|
||||||
if !l.HasHead(theirHead) {
|
|
||||||
return consensusproto.WrapFullRequest(&consensusproto.LogFullSyncRequest{
|
|
||||||
Head: l.Head().Id,
|
|
||||||
}, l.Root()), nil
|
|
||||||
}
|
|
||||||
records, err := l.RecordsAfter(context.Background(), theirHead)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return consensusproto.WrapFullRequest(&consensusproto.LogFullSyncRequest{
|
|
||||||
Head: l.Head().Id,
|
|
||||||
Records: records,
|
|
||||||
}, l.Root()), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *requestFactory) CreateFullSyncResponse(l list.AclList, theirHead string) (resp *consensusproto.LogSyncMessage, err error) {
|
|
||||||
records, err := l.RecordsAfter(context.Background(), theirHead)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return consensusproto.WrapFullResponse(&consensusproto.LogFullSyncResponse{
|
|
||||||
Head: l.Head().Id,
|
|
||||||
Records: records,
|
|
||||||
}, l.Root()), nil
|
|
||||||
}
|
|
||||||
@ -2,68 +2,33 @@ package syncacl
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
|
||||||
"github.com/anyproto/any-sync/commonspace/object/acl/syncacl/headupdater"
|
|
||||||
"github.com/anyproto/any-sync/commonspace/object/syncobjectgetter"
|
|
||||||
|
|
||||||
"github.com/anyproto/any-sync/accountservice"
|
"github.com/anyproto/any-sync/accountservice"
|
||||||
"github.com/anyproto/any-sync/app"
|
"github.com/anyproto/any-sync/app"
|
||||||
"github.com/anyproto/any-sync/app/logger"
|
|
||||||
"github.com/anyproto/any-sync/commonspace/object/acl/list"
|
"github.com/anyproto/any-sync/commonspace/object/acl/list"
|
||||||
"github.com/anyproto/any-sync/commonspace/objectsync/synchandler"
|
|
||||||
"github.com/anyproto/any-sync/commonspace/peermanager"
|
|
||||||
"github.com/anyproto/any-sync/commonspace/requestmanager"
|
|
||||||
"github.com/anyproto/any-sync/commonspace/spacestorage"
|
"github.com/anyproto/any-sync/commonspace/spacestorage"
|
||||||
"github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
"github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
||||||
"github.com/anyproto/any-sync/commonspace/syncstatus"
|
|
||||||
"github.com/anyproto/any-sync/consensus/consensusproto"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const CName = "common.acl.syncacl"
|
const CName = "common.acl.syncacl"
|
||||||
|
|
||||||
var (
|
func New() *SyncAcl {
|
||||||
log = logger.NewNamed(CName)
|
return &SyncAcl{}
|
||||||
|
}
|
||||||
|
|
||||||
ErrSyncAclClosed = errors.New("sync acl is closed")
|
type SyncAcl struct {
|
||||||
)
|
|
||||||
|
|
||||||
type SyncAcl interface {
|
|
||||||
app.ComponentRunnable
|
|
||||||
list.AclList
|
list.AclList
|
||||||
syncobjectgetter.SyncObject
|
|
||||||
SetHeadUpdater(updater headupdater.HeadUpdater)
|
|
||||||
SyncWithPeer(ctx context.Context, peerId string) (err error)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func New() SyncAcl {
|
func (s *SyncAcl) HandleRequest(ctx context.Context, senderId string, request *spacesyncproto.ObjectSyncMessage) (response *spacesyncproto.ObjectSyncMessage, err error) {
|
||||||
return &syncAcl{}
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type syncAcl struct {
|
func (s *SyncAcl) HandleMessage(ctx context.Context, senderId string, request *spacesyncproto.ObjectSyncMessage) (err error) {
|
||||||
list.AclList
|
return nil
|
||||||
syncClient SyncClient
|
|
||||||
syncHandler synchandler.SyncHandler
|
|
||||||
headUpdater headupdater.HeadUpdater
|
|
||||||
isClosed bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *syncAcl) Run(ctx context.Context) (err error) {
|
func (s *SyncAcl) Init(a *app.App) (err error) {
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *syncAcl) HandleRequest(ctx context.Context, senderId string, request *spacesyncproto.ObjectSyncMessage) (response *spacesyncproto.ObjectSyncMessage, err error) {
|
|
||||||
return s.syncHandler.HandleRequest(ctx, senderId, request)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *syncAcl) SetHeadUpdater(updater headupdater.HeadUpdater) {
|
|
||||||
s.headUpdater = updater
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *syncAcl) HandleMessage(ctx context.Context, senderId string, request *spacesyncproto.ObjectSyncMessage) (err error) {
|
|
||||||
return s.syncHandler.HandleMessage(ctx, senderId, request)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *syncAcl) Init(a *app.App) (err error) {
|
|
||||||
storage := a.MustComponent(spacestorage.CName).(spacestorage.SpaceStorage)
|
storage := a.MustComponent(spacestorage.CName).(spacestorage.SpaceStorage)
|
||||||
aclStorage, err := storage.AclStorage()
|
aclStorage, err := storage.AclStorage()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -71,60 +36,9 @@ func (s *syncAcl) Init(a *app.App) (err error) {
|
|||||||
}
|
}
|
||||||
acc := a.MustComponent(accountservice.CName).(accountservice.Service)
|
acc := a.MustComponent(accountservice.CName).(accountservice.Service)
|
||||||
s.AclList, err = list.BuildAclListWithIdentity(acc.Account(), aclStorage, list.NoOpAcceptorVerifier{})
|
s.AclList, err = list.BuildAclListWithIdentity(acc.Account(), aclStorage, list.NoOpAcceptorVerifier{})
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
spaceId := storage.Id()
|
|
||||||
requestManager := a.MustComponent(requestmanager.CName).(requestmanager.RequestManager)
|
|
||||||
peerManager := a.MustComponent(peermanager.CName).(peermanager.PeerManager)
|
|
||||||
syncStatus := a.MustComponent(syncstatus.CName).(syncstatus.StatusService)
|
|
||||||
s.syncClient = NewSyncClient(spaceId, requestManager, peerManager)
|
|
||||||
s.syncHandler = newSyncAclHandler(storage.Id(), s, s.syncClient, syncStatus)
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *syncAcl) AddRawRecord(rawRec *consensusproto.RawRecordWithId) (err error) {
|
func (s *SyncAcl) Name() (name string) {
|
||||||
if s.isClosed {
|
|
||||||
return ErrSyncAclClosed
|
|
||||||
}
|
|
||||||
err = s.AclList.AddRawRecord(rawRec)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
headUpdate := s.syncClient.CreateHeadUpdate(s, []*consensusproto.RawRecordWithId{rawRec})
|
|
||||||
s.headUpdater.UpdateHeads(s.Id(), []string{rawRec.Id})
|
|
||||||
s.syncClient.Broadcast(headUpdate)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *syncAcl) AddRawRecords(rawRecords []*consensusproto.RawRecordWithId) (err error) {
|
|
||||||
if s.isClosed {
|
|
||||||
return ErrSyncAclClosed
|
|
||||||
}
|
|
||||||
err = s.AclList.AddRawRecords(rawRecords)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
headUpdate := s.syncClient.CreateHeadUpdate(s, rawRecords)
|
|
||||||
s.headUpdater.UpdateHeads(s.Id(), []string{rawRecords[len(rawRecords)-1].Id})
|
|
||||||
s.syncClient.Broadcast(headUpdate)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *syncAcl) SyncWithPeer(ctx context.Context, peerId string) (err error) {
|
|
||||||
s.Lock()
|
|
||||||
defer s.Unlock()
|
|
||||||
headUpdate := s.syncClient.CreateHeadUpdate(s, nil)
|
|
||||||
return s.syncClient.SendUpdate(peerId, headUpdate)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *syncAcl) Close(ctx context.Context) (err error) {
|
|
||||||
s.Lock()
|
|
||||||
defer s.Unlock()
|
|
||||||
s.isClosed = true
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *syncAcl) Name() (name string) {
|
|
||||||
return CName
|
return CName
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,81 +2,15 @@ package syncacl
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
|
||||||
|
|
||||||
"github.com/anyproto/any-sync/commonspace/object/acl/list"
|
"github.com/anyproto/any-sync/commonspace/object/acl/list"
|
||||||
"github.com/anyproto/any-sync/commonspace/objectsync/synchandler"
|
|
||||||
"github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
"github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
||||||
"github.com/anyproto/any-sync/commonspace/syncstatus"
|
|
||||||
"github.com/anyproto/any-sync/consensus/consensusproto"
|
|
||||||
"github.com/gogo/protobuf/proto"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
ErrMessageIsRequest = errors.New("message is request")
|
|
||||||
ErrMessageIsNotRequest = errors.New("message is not request")
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type syncAclHandler struct {
|
type syncAclHandler struct {
|
||||||
aclList list.AclList
|
acl list.AclList
|
||||||
syncClient SyncClient
|
|
||||||
syncProtocol AclSyncProtocol
|
|
||||||
syncStatus syncstatus.StatusUpdater
|
|
||||||
spaceId string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func newSyncAclHandler(spaceId string, aclList list.AclList, syncClient SyncClient, syncStatus syncstatus.StatusUpdater) synchandler.SyncHandler {
|
func (s *syncAclHandler) HandleMessage(ctx context.Context, senderId string, req *spacesyncproto.ObjectSyncMessage) (err error) {
|
||||||
return &syncAclHandler{
|
return nil
|
||||||
aclList: aclList,
|
|
||||||
syncClient: syncClient,
|
|
||||||
syncProtocol: newAclSyncProtocol(spaceId, aclList, syncClient),
|
|
||||||
syncStatus: syncStatus,
|
|
||||||
spaceId: spaceId,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *syncAclHandler) HandleMessage(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) {
|
|
||||||
unmarshalled := &consensusproto.LogSyncMessage{}
|
|
||||||
err = proto.Unmarshal(message.Payload, unmarshalled)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
content := unmarshalled.GetContent()
|
|
||||||
head := consensusproto.GetHead(unmarshalled)
|
|
||||||
s.syncStatus.HeadsReceive(senderId, s.aclList.Id(), []string{head})
|
|
||||||
s.aclList.Lock()
|
|
||||||
defer s.aclList.Unlock()
|
|
||||||
switch {
|
|
||||||
case content.GetHeadUpdate() != nil:
|
|
||||||
var syncReq *consensusproto.LogSyncMessage
|
|
||||||
syncReq, err = s.syncProtocol.HeadUpdate(ctx, senderId, content.GetHeadUpdate())
|
|
||||||
if err != nil || syncReq == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return s.syncClient.QueueRequest(senderId, syncReq)
|
|
||||||
case content.GetFullSyncRequest() != nil:
|
|
||||||
return ErrMessageIsRequest
|
|
||||||
case content.GetFullSyncResponse() != nil:
|
|
||||||
return s.syncProtocol.FullSyncResponse(ctx, senderId, content.GetFullSyncResponse())
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *syncAclHandler) HandleRequest(ctx context.Context, senderId string, request *spacesyncproto.ObjectSyncMessage) (response *spacesyncproto.ObjectSyncMessage, err error) {
|
|
||||||
unmarshalled := &consensusproto.LogSyncMessage{}
|
|
||||||
err = proto.Unmarshal(request.Payload, unmarshalled)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
fullSyncRequest := unmarshalled.GetContent().GetFullSyncRequest()
|
|
||||||
if fullSyncRequest == nil {
|
|
||||||
return nil, ErrMessageIsNotRequest
|
|
||||||
}
|
|
||||||
s.aclList.Lock()
|
|
||||||
defer s.aclList.Unlock()
|
|
||||||
aclResp, err := s.syncProtocol.FullSyncRequest(ctx, senderId, fullSyncRequest)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return spacesyncproto.MarshallSyncMessage(aclResp, s.spaceId, s.aclList.Id())
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,233 +0,0 @@
|
|||||||
package syncacl
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"github.com/anyproto/any-sync/commonspace/object/acl/list/mock_list"
|
|
||||||
"github.com/anyproto/any-sync/commonspace/object/acl/syncacl/mock_syncacl"
|
|
||||||
"github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
|
||||||
"github.com/anyproto/any-sync/commonspace/syncstatus"
|
|
||||||
"github.com/anyproto/any-sync/consensus/consensusproto"
|
|
||||||
"github.com/gogo/protobuf/proto"
|
|
||||||
"github.com/stretchr/testify/require"
|
|
||||||
"go.uber.org/mock/gomock"
|
|
||||||
"sync"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
type testAclMock struct {
|
|
||||||
*mock_list.MockAclList
|
|
||||||
m sync.RWMutex
|
|
||||||
}
|
|
||||||
|
|
||||||
func newTestAclMock(mockAcl *mock_list.MockAclList) *testAclMock {
|
|
||||||
return &testAclMock{
|
|
||||||
MockAclList: mockAcl,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *testAclMock) Lock() {
|
|
||||||
t.m.Lock()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *testAclMock) RLock() {
|
|
||||||
t.m.RLock()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *testAclMock) Unlock() {
|
|
||||||
t.m.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *testAclMock) RUnlock() {
|
|
||||||
t.m.RUnlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *testAclMock) TryLock() bool {
|
|
||||||
return t.m.TryLock()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *testAclMock) TryRLock() bool {
|
|
||||||
return t.m.TryRLock()
|
|
||||||
}
|
|
||||||
|
|
||||||
type syncHandlerFixture struct {
|
|
||||||
ctrl *gomock.Controller
|
|
||||||
syncClientMock *mock_syncacl.MockSyncClient
|
|
||||||
aclMock *testAclMock
|
|
||||||
syncProtocolMock *mock_syncacl.MockAclSyncProtocol
|
|
||||||
spaceId string
|
|
||||||
senderId string
|
|
||||||
aclId string
|
|
||||||
|
|
||||||
syncHandler *syncAclHandler
|
|
||||||
}
|
|
||||||
|
|
||||||
func newSyncHandlerFixture(t *testing.T) *syncHandlerFixture {
|
|
||||||
ctrl := gomock.NewController(t)
|
|
||||||
aclMock := newTestAclMock(mock_list.NewMockAclList(ctrl))
|
|
||||||
syncClientMock := mock_syncacl.NewMockSyncClient(ctrl)
|
|
||||||
syncProtocolMock := mock_syncacl.NewMockAclSyncProtocol(ctrl)
|
|
||||||
spaceId := "spaceId"
|
|
||||||
|
|
||||||
syncHandler := &syncAclHandler{
|
|
||||||
aclList: aclMock,
|
|
||||||
syncClient: syncClientMock,
|
|
||||||
syncProtocol: syncProtocolMock,
|
|
||||||
syncStatus: syncstatus.NewNoOpSyncStatus(),
|
|
||||||
spaceId: spaceId,
|
|
||||||
}
|
|
||||||
return &syncHandlerFixture{
|
|
||||||
ctrl: ctrl,
|
|
||||||
syncClientMock: syncClientMock,
|
|
||||||
aclMock: aclMock,
|
|
||||||
syncProtocolMock: syncProtocolMock,
|
|
||||||
spaceId: spaceId,
|
|
||||||
senderId: "senderId",
|
|
||||||
aclId: "aclId",
|
|
||||||
syncHandler: syncHandler,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fx *syncHandlerFixture) stop() {
|
|
||||||
fx.ctrl.Finish()
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestSyncAclHandler_HandleMessage(t *testing.T) {
|
|
||||||
ctx := context.Background()
|
|
||||||
t.Run("handle head update, request returned", func(t *testing.T) {
|
|
||||||
fx := newSyncHandlerFixture(t)
|
|
||||||
defer fx.stop()
|
|
||||||
chWithId := &consensusproto.RawRecordWithId{}
|
|
||||||
headUpdate := &consensusproto.LogHeadUpdate{
|
|
||||||
Head: "h1",
|
|
||||||
Records: []*consensusproto.RawRecordWithId{chWithId},
|
|
||||||
}
|
|
||||||
logMessage := consensusproto.WrapHeadUpdate(headUpdate, chWithId)
|
|
||||||
objectMsg, _ := spacesyncproto.MarshallSyncMessage(logMessage, fx.spaceId, fx.aclId)
|
|
||||||
|
|
||||||
syncReq := &consensusproto.LogSyncMessage{}
|
|
||||||
fx.aclMock.EXPECT().Id().AnyTimes().Return(fx.aclId)
|
|
||||||
fx.syncProtocolMock.EXPECT().HeadUpdate(ctx, fx.senderId, gomock.Any()).Return(syncReq, nil)
|
|
||||||
fx.syncClientMock.EXPECT().QueueRequest(fx.senderId, syncReq).Return(nil)
|
|
||||||
|
|
||||||
err := fx.syncHandler.HandleMessage(ctx, fx.senderId, objectMsg)
|
|
||||||
require.NoError(t, err)
|
|
||||||
})
|
|
||||||
t.Run("handle head update, no request", func(t *testing.T) {
|
|
||||||
fx := newSyncHandlerFixture(t)
|
|
||||||
defer fx.stop()
|
|
||||||
chWithId := &consensusproto.RawRecordWithId{}
|
|
||||||
headUpdate := &consensusproto.LogHeadUpdate{
|
|
||||||
Head: "h1",
|
|
||||||
Records: []*consensusproto.RawRecordWithId{chWithId},
|
|
||||||
}
|
|
||||||
logMessage := consensusproto.WrapHeadUpdate(headUpdate, chWithId)
|
|
||||||
objectMsg, _ := spacesyncproto.MarshallSyncMessage(logMessage, fx.spaceId, fx.aclId)
|
|
||||||
|
|
||||||
fx.aclMock.EXPECT().Id().AnyTimes().Return(fx.aclId)
|
|
||||||
fx.syncProtocolMock.EXPECT().HeadUpdate(ctx, fx.senderId, gomock.Any()).Return(nil, nil)
|
|
||||||
|
|
||||||
err := fx.syncHandler.HandleMessage(ctx, fx.senderId, objectMsg)
|
|
||||||
require.NoError(t, err)
|
|
||||||
})
|
|
||||||
t.Run("handle head update, returned error", func(t *testing.T) {
|
|
||||||
fx := newSyncHandlerFixture(t)
|
|
||||||
defer fx.stop()
|
|
||||||
chWithId := &consensusproto.RawRecordWithId{}
|
|
||||||
headUpdate := &consensusproto.LogHeadUpdate{
|
|
||||||
Head: "h1",
|
|
||||||
Records: []*consensusproto.RawRecordWithId{chWithId},
|
|
||||||
}
|
|
||||||
logMessage := consensusproto.WrapHeadUpdate(headUpdate, chWithId)
|
|
||||||
objectMsg, _ := spacesyncproto.MarshallSyncMessage(logMessage, fx.spaceId, fx.aclId)
|
|
||||||
|
|
||||||
fx.aclMock.EXPECT().Id().AnyTimes().Return(fx.aclId)
|
|
||||||
expectedErr := fmt.Errorf("some error")
|
|
||||||
fx.syncProtocolMock.EXPECT().HeadUpdate(ctx, fx.senderId, gomock.Any()).Return(nil, expectedErr)
|
|
||||||
|
|
||||||
err := fx.syncHandler.HandleMessage(ctx, fx.senderId, objectMsg)
|
|
||||||
require.Error(t, expectedErr, err)
|
|
||||||
})
|
|
||||||
t.Run("handle full sync request is forbidden", func(t *testing.T) {
|
|
||||||
fx := newSyncHandlerFixture(t)
|
|
||||||
defer fx.stop()
|
|
||||||
chWithId := &consensusproto.RawRecordWithId{}
|
|
||||||
fullRequest := &consensusproto.LogFullSyncRequest{
|
|
||||||
Head: "h1",
|
|
||||||
Records: []*consensusproto.RawRecordWithId{chWithId},
|
|
||||||
}
|
|
||||||
logMessage := consensusproto.WrapFullRequest(fullRequest, chWithId)
|
|
||||||
objectMsg, _ := spacesyncproto.MarshallSyncMessage(logMessage, fx.spaceId, fx.aclId)
|
|
||||||
|
|
||||||
fx.aclMock.EXPECT().Id().AnyTimes().Return(fx.aclId)
|
|
||||||
err := fx.syncHandler.HandleMessage(ctx, fx.senderId, objectMsg)
|
|
||||||
require.Error(t, ErrMessageIsRequest, err)
|
|
||||||
})
|
|
||||||
t.Run("handle full sync response, no error", func(t *testing.T) {
|
|
||||||
fx := newSyncHandlerFixture(t)
|
|
||||||
defer fx.stop()
|
|
||||||
chWithId := &consensusproto.RawRecordWithId{}
|
|
||||||
fullResponse := &consensusproto.LogFullSyncResponse{
|
|
||||||
Head: "h1",
|
|
||||||
Records: []*consensusproto.RawRecordWithId{chWithId},
|
|
||||||
}
|
|
||||||
logMessage := consensusproto.WrapFullResponse(fullResponse, chWithId)
|
|
||||||
objectMsg, _ := spacesyncproto.MarshallSyncMessage(logMessage, fx.spaceId, fx.aclId)
|
|
||||||
|
|
||||||
fx.aclMock.EXPECT().Id().AnyTimes().Return(fx.aclId)
|
|
||||||
fx.syncProtocolMock.EXPECT().FullSyncResponse(ctx, fx.senderId, gomock.Any()).Return(nil)
|
|
||||||
|
|
||||||
err := fx.syncHandler.HandleMessage(ctx, fx.senderId, objectMsg)
|
|
||||||
require.NoError(t, err)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestSyncAclHandler_HandleRequest(t *testing.T) {
|
|
||||||
ctx := context.Background()
|
|
||||||
t.Run("handle full sync request, no error", func(t *testing.T) {
|
|
||||||
fx := newSyncHandlerFixture(t)
|
|
||||||
defer fx.stop()
|
|
||||||
chWithId := &consensusproto.RawRecordWithId{}
|
|
||||||
fullRequest := &consensusproto.LogFullSyncRequest{
|
|
||||||
Head: "h1",
|
|
||||||
Records: []*consensusproto.RawRecordWithId{chWithId},
|
|
||||||
}
|
|
||||||
logMessage := consensusproto.WrapFullRequest(fullRequest, chWithId)
|
|
||||||
objectMsg, _ := spacesyncproto.MarshallSyncMessage(logMessage, fx.spaceId, fx.aclId)
|
|
||||||
fullResp := &consensusproto.LogSyncMessage{
|
|
||||||
Content: &consensusproto.LogSyncContentValue{
|
|
||||||
Value: &consensusproto.LogSyncContentValue_FullSyncResponse{
|
|
||||||
FullSyncResponse: &consensusproto.LogFullSyncResponse{
|
|
||||||
Head: "returnedHead",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
fx.aclMock.EXPECT().Id().AnyTimes().Return(fx.aclId)
|
|
||||||
fx.syncProtocolMock.EXPECT().FullSyncRequest(ctx, fx.senderId, gomock.Any()).Return(fullResp, nil)
|
|
||||||
res, err := fx.syncHandler.HandleRequest(ctx, fx.senderId, objectMsg)
|
|
||||||
require.NoError(t, err)
|
|
||||||
unmarshalled := &consensusproto.LogSyncMessage{}
|
|
||||||
err = proto.Unmarshal(res.Payload, unmarshalled)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
require.Equal(t, "returnedHead", consensusproto.GetHead(unmarshalled))
|
|
||||||
})
|
|
||||||
t.Run("handle other message returns error", func(t *testing.T) {
|
|
||||||
fx := newSyncHandlerFixture(t)
|
|
||||||
defer fx.stop()
|
|
||||||
chWithId := &consensusproto.RawRecordWithId{}
|
|
||||||
headUpdate := &consensusproto.LogHeadUpdate{
|
|
||||||
Head: "h1",
|
|
||||||
Records: []*consensusproto.RawRecordWithId{chWithId},
|
|
||||||
}
|
|
||||||
logMessage := consensusproto.WrapHeadUpdate(headUpdate, chWithId)
|
|
||||||
objectMsg, _ := spacesyncproto.MarshallSyncMessage(logMessage, fx.spaceId, fx.aclId)
|
|
||||||
|
|
||||||
fx.aclMock.EXPECT().Id().AnyTimes().Return(fx.aclId)
|
|
||||||
_, err := fx.syncHandler.HandleRequest(ctx, fx.senderId, objectMsg)
|
|
||||||
require.Error(t, ErrMessageIsNotRequest, err)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@ -1,70 +0,0 @@
|
|||||||
package syncacl
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/anyproto/any-sync/commonspace/peermanager"
|
|
||||||
"github.com/anyproto/any-sync/commonspace/requestmanager"
|
|
||||||
"github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
|
||||||
"github.com/anyproto/any-sync/consensus/consensusproto"
|
|
||||||
"go.uber.org/zap"
|
|
||||||
)
|
|
||||||
|
|
||||||
type SyncClient interface {
|
|
||||||
RequestFactory
|
|
||||||
Broadcast(msg *consensusproto.LogSyncMessage)
|
|
||||||
SendUpdate(peerId string, msg *consensusproto.LogSyncMessage) (err error)
|
|
||||||
QueueRequest(peerId string, msg *consensusproto.LogSyncMessage) (err error)
|
|
||||||
SendRequest(ctx context.Context, peerId string, msg *consensusproto.LogSyncMessage) (reply *spacesyncproto.ObjectSyncMessage, err error)
|
|
||||||
}
|
|
||||||
|
|
||||||
type syncClient struct {
|
|
||||||
RequestFactory
|
|
||||||
spaceId string
|
|
||||||
requestManager requestmanager.RequestManager
|
|
||||||
peerManager peermanager.PeerManager
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewSyncClient(spaceId string, requestManager requestmanager.RequestManager, peerManager peermanager.PeerManager) SyncClient {
|
|
||||||
return &syncClient{
|
|
||||||
RequestFactory: &requestFactory{},
|
|
||||||
spaceId: spaceId,
|
|
||||||
requestManager: requestManager,
|
|
||||||
peerManager: peerManager,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *syncClient) Broadcast(msg *consensusproto.LogSyncMessage) {
|
|
||||||
objMsg, err := spacesyncproto.MarshallSyncMessage(msg, s.spaceId, msg.Id)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err = s.peerManager.Broadcast(context.Background(), objMsg)
|
|
||||||
if err != nil {
|
|
||||||
log.Debug("broadcast error", zap.Error(err))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *syncClient) SendUpdate(peerId string, msg *consensusproto.LogSyncMessage) (err error) {
|
|
||||||
objMsg, err := spacesyncproto.MarshallSyncMessage(msg, s.spaceId, msg.Id)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return s.peerManager.SendPeer(context.Background(), peerId, objMsg)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *syncClient) SendRequest(ctx context.Context, peerId string, msg *consensusproto.LogSyncMessage) (reply *spacesyncproto.ObjectSyncMessage, err error) {
|
|
||||||
objMsg, err := spacesyncproto.MarshallSyncMessage(msg, s.spaceId, msg.Id)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return s.requestManager.SendRequest(ctx, peerId, objMsg)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *syncClient) QueueRequest(peerId string, msg *consensusproto.LogSyncMessage) (err error) {
|
|
||||||
objMsg, err := spacesyncproto.MarshallSyncMessage(msg, s.spaceId, msg.Id)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return s.requestManager.QueueRequest(peerId, objMsg)
|
|
||||||
}
|
|
||||||
@ -13,7 +13,7 @@ import (
|
|||||||
objecttree "github.com/anyproto/any-sync/commonspace/object/tree/objecttree"
|
objecttree "github.com/anyproto/any-sync/commonspace/object/tree/objecttree"
|
||||||
treechangeproto "github.com/anyproto/any-sync/commonspace/object/tree/treechangeproto"
|
treechangeproto "github.com/anyproto/any-sync/commonspace/object/tree/treechangeproto"
|
||||||
treestorage "github.com/anyproto/any-sync/commonspace/object/tree/treestorage"
|
treestorage "github.com/anyproto/any-sync/commonspace/object/tree/treestorage"
|
||||||
gomock "go.uber.org/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockObjectTree is a mock of ObjectTree interface.
|
// MockObjectTree is a mock of ObjectTree interface.
|
||||||
|
|||||||
@ -15,7 +15,7 @@ import (
|
|||||||
treechangeproto "github.com/anyproto/any-sync/commonspace/object/tree/treechangeproto"
|
treechangeproto "github.com/anyproto/any-sync/commonspace/object/tree/treechangeproto"
|
||||||
treestorage "github.com/anyproto/any-sync/commonspace/object/tree/treestorage"
|
treestorage "github.com/anyproto/any-sync/commonspace/object/tree/treestorage"
|
||||||
spacesyncproto "github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
spacesyncproto "github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
||||||
gomock "go.uber.org/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockSyncTree is a mock of SyncTree interface.
|
// MockSyncTree is a mock of SyncTree interface.
|
||||||
|
|||||||
@ -2,7 +2,6 @@ package synctree
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/anyproto/any-sync/commonspace/object/tree/treechangeproto"
|
"github.com/anyproto/any-sync/commonspace/object/tree/treechangeproto"
|
||||||
"github.com/anyproto/any-sync/commonspace/peermanager"
|
"github.com/anyproto/any-sync/commonspace/peermanager"
|
||||||
"github.com/anyproto/any-sync/commonspace/requestmanager"
|
"github.com/anyproto/any-sync/commonspace/requestmanager"
|
||||||
@ -33,9 +32,8 @@ func NewSyncClient(spaceId string, requestManager requestmanager.RequestManager,
|
|||||||
peerManager: peerManager,
|
peerManager: peerManager,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *syncClient) Broadcast(msg *treechangeproto.TreeSyncMessage) {
|
func (s *syncClient) Broadcast(msg *treechangeproto.TreeSyncMessage) {
|
||||||
objMsg, err := spacesyncproto.MarshallSyncMessage(msg, s.spaceId, msg.RootChange.Id)
|
objMsg, err := MarshallTreeMessage(msg, s.spaceId, msg.RootChange.Id, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -46,7 +44,7 @@ func (s *syncClient) Broadcast(msg *treechangeproto.TreeSyncMessage) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *syncClient) SendUpdate(peerId, objectId string, msg *treechangeproto.TreeSyncMessage) (err error) {
|
func (s *syncClient) SendUpdate(peerId, objectId string, msg *treechangeproto.TreeSyncMessage) (err error) {
|
||||||
objMsg, err := spacesyncproto.MarshallSyncMessage(msg, s.spaceId, objectId)
|
objMsg, err := MarshallTreeMessage(msg, s.spaceId, objectId, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -54,7 +52,7 @@ func (s *syncClient) SendUpdate(peerId, objectId string, msg *treechangeproto.Tr
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *syncClient) SendRequest(ctx context.Context, peerId, objectId string, msg *treechangeproto.TreeSyncMessage) (reply *spacesyncproto.ObjectSyncMessage, err error) {
|
func (s *syncClient) SendRequest(ctx context.Context, peerId, objectId string, msg *treechangeproto.TreeSyncMessage) (reply *spacesyncproto.ObjectSyncMessage, err error) {
|
||||||
objMsg, err := spacesyncproto.MarshallSyncMessage(msg, s.spaceId, objectId)
|
objMsg, err := MarshallTreeMessage(msg, s.spaceId, objectId, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -62,9 +60,23 @@ func (s *syncClient) SendRequest(ctx context.Context, peerId, objectId string, m
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *syncClient) QueueRequest(peerId, objectId string, msg *treechangeproto.TreeSyncMessage) (err error) {
|
func (s *syncClient) QueueRequest(peerId, objectId string, msg *treechangeproto.TreeSyncMessage) (err error) {
|
||||||
objMsg, err := spacesyncproto.MarshallSyncMessage(msg, s.spaceId, objectId)
|
objMsg, err := MarshallTreeMessage(msg, s.spaceId, objectId, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
return s.requestManager.QueueRequest(peerId, objMsg)
|
return s.requestManager.QueueRequest(peerId, objMsg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func MarshallTreeMessage(message *treechangeproto.TreeSyncMessage, spaceId, objectId, replyId string) (objMsg *spacesyncproto.ObjectSyncMessage, err error) {
|
||||||
|
payload, err := message.Marshal()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
objMsg = &spacesyncproto.ObjectSyncMessage{
|
||||||
|
ReplyId: replyId,
|
||||||
|
Payload: payload,
|
||||||
|
ObjectId: objectId,
|
||||||
|
SpaceId: spaceId,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|||||||
@ -11,8 +11,8 @@ import (
|
|||||||
"github.com/anyproto/any-sync/commonspace/objectsync"
|
"github.com/anyproto/any-sync/commonspace/objectsync"
|
||||||
"github.com/anyproto/any-sync/commonspace/syncstatus"
|
"github.com/anyproto/any-sync/commonspace/syncstatus"
|
||||||
"github.com/anyproto/any-sync/nodeconf"
|
"github.com/anyproto/any-sync/nodeconf"
|
||||||
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"go.uber.org/mock/gomock"
|
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@ -81,7 +81,7 @@ func (s *syncTreeHandler) handleRequest(ctx context.Context, senderId string, fu
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
response, err = spacesyncproto.MarshallSyncMessage(treeResp, s.spaceId, s.objTree.Id())
|
response, err = MarshallTreeMessage(treeResp, s.spaceId, s.objTree.Id(), "")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -8,10 +8,9 @@ import (
|
|||||||
"github.com/anyproto/any-sync/commonspace/object/tree/objecttree/mock_objecttree"
|
"github.com/anyproto/any-sync/commonspace/object/tree/objecttree/mock_objecttree"
|
||||||
"github.com/anyproto/any-sync/commonspace/object/tree/synctree/mock_synctree"
|
"github.com/anyproto/any-sync/commonspace/object/tree/synctree/mock_synctree"
|
||||||
"github.com/anyproto/any-sync/commonspace/object/tree/treechangeproto"
|
"github.com/anyproto/any-sync/commonspace/object/tree/treechangeproto"
|
||||||
"github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
|
||||||
"github.com/anyproto/any-sync/commonspace/syncstatus"
|
"github.com/anyproto/any-sync/commonspace/syncstatus"
|
||||||
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"go.uber.org/mock/gomock"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type testObjTreeMock struct {
|
type testObjTreeMock struct {
|
||||||
@ -104,7 +103,7 @@ func TestSyncTreeHandler_HandleMessage(t *testing.T) {
|
|||||||
Heads: []string{"h3"},
|
Heads: []string{"h3"},
|
||||||
}
|
}
|
||||||
treeMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId)
|
treeMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId)
|
||||||
objectMsg, _ := spacesyncproto.MarshallSyncMessage(treeMsg, "spaceId", treeId)
|
objectMsg, _ := MarshallTreeMessage(treeMsg, "spaceId", treeId, "")
|
||||||
|
|
||||||
syncReq := &treechangeproto.TreeSyncMessage{}
|
syncReq := &treechangeproto.TreeSyncMessage{}
|
||||||
fx.syncHandler.heads = []string{"h2"}
|
fx.syncHandler.heads = []string{"h2"}
|
||||||
@ -128,7 +127,7 @@ func TestSyncTreeHandler_HandleMessage(t *testing.T) {
|
|||||||
Heads: []string{"h1"},
|
Heads: []string{"h1"},
|
||||||
}
|
}
|
||||||
treeMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId)
|
treeMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId)
|
||||||
objectMsg, _ := spacesyncproto.MarshallSyncMessage(treeMsg, "spaceId", treeId)
|
objectMsg, _ := MarshallTreeMessage(treeMsg, "spaceId", treeId, "")
|
||||||
|
|
||||||
fx.syncHandler.heads = []string{"h1"}
|
fx.syncHandler.heads = []string{"h1"}
|
||||||
fx.objectTreeMock.EXPECT().Id().AnyTimes().Return(fx.treeId)
|
fx.objectTreeMock.EXPECT().Id().AnyTimes().Return(fx.treeId)
|
||||||
@ -137,7 +136,7 @@ func TestSyncTreeHandler_HandleMessage(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("handle head update message, no sync request returned", func(t *testing.T) {
|
t.Run("handle head update message, empty sync request returned", func(t *testing.T) {
|
||||||
fx := newSyncHandlerFixture(t)
|
fx := newSyncHandlerFixture(t)
|
||||||
defer fx.stop()
|
defer fx.stop()
|
||||||
treeId := "treeId"
|
treeId := "treeId"
|
||||||
@ -146,7 +145,7 @@ func TestSyncTreeHandler_HandleMessage(t *testing.T) {
|
|||||||
Heads: []string{"h3"},
|
Heads: []string{"h3"},
|
||||||
}
|
}
|
||||||
treeMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId)
|
treeMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId)
|
||||||
objectMsg, _ := spacesyncproto.MarshallSyncMessage(treeMsg, "spaceId", treeId)
|
objectMsg, _ := MarshallTreeMessage(treeMsg, "spaceId", treeId, "")
|
||||||
|
|
||||||
fx.syncHandler.heads = []string{"h2"}
|
fx.syncHandler.heads = []string{"h2"}
|
||||||
fx.objectTreeMock.EXPECT().Id().AnyTimes().Return(fx.treeId)
|
fx.objectTreeMock.EXPECT().Id().AnyTimes().Return(fx.treeId)
|
||||||
@ -168,7 +167,7 @@ func TestSyncTreeHandler_HandleMessage(t *testing.T) {
|
|||||||
Heads: []string{"h3"},
|
Heads: []string{"h3"},
|
||||||
}
|
}
|
||||||
treeMsg := treechangeproto.WrapFullRequest(fullRequest, chWithId)
|
treeMsg := treechangeproto.WrapFullRequest(fullRequest, chWithId)
|
||||||
objectMsg, _ := spacesyncproto.MarshallSyncMessage(treeMsg, "spaceId", treeId)
|
objectMsg, _ := MarshallTreeMessage(treeMsg, "spaceId", treeId, "")
|
||||||
|
|
||||||
fx.syncHandler.heads = []string{"h2"}
|
fx.syncHandler.heads = []string{"h2"}
|
||||||
fx.objectTreeMock.EXPECT().Id().AnyTimes().Return(fx.treeId)
|
fx.objectTreeMock.EXPECT().Id().AnyTimes().Return(fx.treeId)
|
||||||
@ -187,7 +186,7 @@ func TestSyncTreeHandler_HandleMessage(t *testing.T) {
|
|||||||
Heads: []string{"h3"},
|
Heads: []string{"h3"},
|
||||||
}
|
}
|
||||||
treeMsg := treechangeproto.WrapFullResponse(fullSyncResponse, chWithId)
|
treeMsg := treechangeproto.WrapFullResponse(fullSyncResponse, chWithId)
|
||||||
objectMsg, _ := spacesyncproto.MarshallSyncMessage(treeMsg, "spaceId", treeId)
|
objectMsg, _ := MarshallTreeMessage(treeMsg, "spaceId", treeId, "")
|
||||||
|
|
||||||
fx.syncHandler.heads = []string{"h2"}
|
fx.syncHandler.heads = []string{"h2"}
|
||||||
fx.objectTreeMock.EXPECT().Id().AnyTimes().Return(fx.treeId)
|
fx.objectTreeMock.EXPECT().Id().AnyTimes().Return(fx.treeId)
|
||||||
@ -210,7 +209,7 @@ func TestSyncTreeHandler_HandleRequest(t *testing.T) {
|
|||||||
chWithId := &treechangeproto.RawTreeChangeWithId{}
|
chWithId := &treechangeproto.RawTreeChangeWithId{}
|
||||||
fullRequest := &treechangeproto.TreeFullSyncRequest{}
|
fullRequest := &treechangeproto.TreeFullSyncRequest{}
|
||||||
treeMsg := treechangeproto.WrapFullRequest(fullRequest, chWithId)
|
treeMsg := treechangeproto.WrapFullRequest(fullRequest, chWithId)
|
||||||
objectMsg, _ := spacesyncproto.MarshallSyncMessage(treeMsg, "spaceId", treeId)
|
objectMsg, _ := MarshallTreeMessage(treeMsg, "spaceId", treeId, "")
|
||||||
|
|
||||||
syncResp := &treechangeproto.TreeSyncMessage{}
|
syncResp := &treechangeproto.TreeSyncMessage{}
|
||||||
fx.objectTreeMock.EXPECT().Id().AnyTimes().Return(fx.treeId)
|
fx.objectTreeMock.EXPECT().Id().AnyTimes().Return(fx.treeId)
|
||||||
@ -231,7 +230,7 @@ func TestSyncTreeHandler_HandleRequest(t *testing.T) {
|
|||||||
headUpdate := &treechangeproto.TreeHeadUpdate{}
|
headUpdate := &treechangeproto.TreeHeadUpdate{}
|
||||||
headUpdateMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId)
|
headUpdateMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId)
|
||||||
for _, msg := range []*treechangeproto.TreeSyncMessage{responseMsg, headUpdateMsg} {
|
for _, msg := range []*treechangeproto.TreeSyncMessage{responseMsg, headUpdateMsg} {
|
||||||
objectMsg, _ := spacesyncproto.MarshallSyncMessage(msg, "spaceId", treeId)
|
objectMsg, _ := MarshallTreeMessage(msg, "spaceId", treeId, "")
|
||||||
|
|
||||||
_, err := fx.syncHandler.HandleRequest(ctx, fx.senderId, objectMsg)
|
_, err := fx.syncHandler.HandleRequest(ctx, fx.senderId, objectMsg)
|
||||||
require.Equal(t, err, ErrMessageIsNotRequest)
|
require.Equal(t, err, ErrMessageIsNotRequest)
|
||||||
|
|||||||
@ -12,8 +12,8 @@ import (
|
|||||||
"github.com/anyproto/any-sync/net/peer"
|
"github.com/anyproto/any-sync/net/peer"
|
||||||
"github.com/anyproto/any-sync/net/peer/mock_peer"
|
"github.com/anyproto/any-sync/net/peer/mock_peer"
|
||||||
"github.com/gogo/protobuf/proto"
|
"github.com/gogo/protobuf/proto"
|
||||||
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"go.uber.org/mock/gomock"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type treeRemoteGetterFixture struct {
|
type treeRemoteGetterFixture struct {
|
||||||
|
|||||||
@ -60,7 +60,7 @@ func (t *treeSyncProtocol) HeadUpdate(ctx context.Context, senderId string, upda
|
|||||||
// isEmptyUpdate is sent when the tree is brought up from cache
|
// isEmptyUpdate is sent when the tree is brought up from cache
|
||||||
if isEmptyUpdate {
|
if isEmptyUpdate {
|
||||||
headEquals := slice.UnsortedEquals(objTree.Heads(), update.Heads)
|
headEquals := slice.UnsortedEquals(objTree.Heads(), update.Heads)
|
||||||
log.DebugCtx(ctx, "is empty update", zap.Bool("headEquals", headEquals))
|
log.DebugCtx(ctx, "is empty update", zap.String("treeId", objTree.Id()), zap.Bool("headEquals", headEquals))
|
||||||
if headEquals {
|
if headEquals {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -70,7 +70,7 @@ func (t *treeSyncProtocol) HeadUpdate(ctx context.Context, senderId string, upda
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if t.hasHeads(objTree, update.Heads) {
|
if t.alreadyHasHeads(objTree, update.Heads) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,7 +82,7 @@ func (t *treeSyncProtocol) HeadUpdate(ctx context.Context, senderId string, upda
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if t.hasHeads(objTree, update.Heads) {
|
if t.alreadyHasHeads(objTree, update.Heads) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -109,7 +109,7 @@ func (t *treeSyncProtocol) FullSyncRequest(ctx context.Context, senderId string,
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
if len(request.Changes) != 0 && !t.hasHeads(objTree, request.Heads) {
|
if len(request.Changes) != 0 && !t.alreadyHasHeads(objTree, request.Heads) {
|
||||||
_, err = objTree.AddRawChanges(ctx, objecttree.RawChangesPayload{
|
_, err = objTree.AddRawChanges(ctx, objecttree.RawChangesPayload{
|
||||||
NewHeads: request.Heads,
|
NewHeads: request.Heads,
|
||||||
RawChanges: request.Changes,
|
RawChanges: request.Changes,
|
||||||
@ -137,7 +137,7 @@ func (t *treeSyncProtocol) FullSyncResponse(ctx context.Context, senderId string
|
|||||||
log.DebugCtx(ctx, "full sync response succeeded")
|
log.DebugCtx(ctx, "full sync response succeeded")
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
if t.hasHeads(objTree, response.Heads) {
|
if t.alreadyHasHeads(objTree, response.Heads) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -148,6 +148,6 @@ func (t *treeSyncProtocol) FullSyncResponse(ctx context.Context, senderId string
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *treeSyncProtocol) hasHeads(ot objecttree.ObjectTree, heads []string) bool {
|
func (t *treeSyncProtocol) alreadyHasHeads(ot objecttree.ObjectTree, heads []string) bool {
|
||||||
return slice.UnsortedEquals(ot.Heads(), heads) || ot.HasChanges(heads...)
|
return slice.UnsortedEquals(ot.Heads(), heads) || ot.HasChanges(heads...)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,8 +8,8 @@ import (
|
|||||||
"github.com/anyproto/any-sync/commonspace/object/tree/objecttree/mock_objecttree"
|
"github.com/anyproto/any-sync/commonspace/object/tree/objecttree/mock_objecttree"
|
||||||
"github.com/anyproto/any-sync/commonspace/object/tree/synctree/mock_synctree"
|
"github.com/anyproto/any-sync/commonspace/object/tree/synctree/mock_synctree"
|
||||||
"github.com/anyproto/any-sync/commonspace/object/tree/treechangeproto"
|
"github.com/anyproto/any-sync/commonspace/object/tree/treechangeproto"
|
||||||
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"go.uber.org/mock/gomock"
|
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import (
|
|||||||
reflect "reflect"
|
reflect "reflect"
|
||||||
|
|
||||||
objecttree "github.com/anyproto/any-sync/commonspace/object/tree/objecttree"
|
objecttree "github.com/anyproto/any-sync/commonspace/object/tree/objecttree"
|
||||||
gomock "go.uber.org/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockUpdateListener is a mock of UpdateListener interface.
|
// MockUpdateListener is a mock of UpdateListener interface.
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import (
|
|||||||
reflect "reflect"
|
reflect "reflect"
|
||||||
|
|
||||||
treechangeproto "github.com/anyproto/any-sync/commonspace/object/tree/treechangeproto"
|
treechangeproto "github.com/anyproto/any-sync/commonspace/object/tree/treechangeproto"
|
||||||
gomock "go.uber.org/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockTreeStorage is a mock of TreeStorage interface.
|
// MockTreeStorage is a mock of TreeStorage interface.
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import (
|
|||||||
app "github.com/anyproto/any-sync/app"
|
app "github.com/anyproto/any-sync/app"
|
||||||
objecttree "github.com/anyproto/any-sync/commonspace/object/tree/objecttree"
|
objecttree "github.com/anyproto/any-sync/commonspace/object/tree/objecttree"
|
||||||
treemanager "github.com/anyproto/any-sync/commonspace/object/treemanager"
|
treemanager "github.com/anyproto/any-sync/commonspace/object/treemanager"
|
||||||
gomock "go.uber.org/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockTreeManager is a mock of TreeManager interface.
|
// MockTreeManager is a mock of TreeManager interface.
|
||||||
|
|||||||
@ -41,7 +41,7 @@ func (o *objectManager) Init(a *app.App) (err error) {
|
|||||||
o.spaceId = state.SpaceId
|
o.spaceId = state.SpaceId
|
||||||
o.spaceIsClosed = state.SpaceIsClosed
|
o.spaceIsClosed = state.SpaceIsClosed
|
||||||
settingsObject := a.MustComponent(settings.CName).(settings.Settings).SettingsObject()
|
settingsObject := a.MustComponent(settings.CName).(settings.Settings).SettingsObject()
|
||||||
acl := a.MustComponent(syncacl.CName).(syncacl.SyncAcl)
|
acl := a.MustComponent(syncacl.CName).(*syncacl.SyncAcl)
|
||||||
o.AddObject(settingsObject)
|
o.AddObject(settingsObject)
|
||||||
o.AddObject(acl)
|
o.AddObject(acl)
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@ -12,7 +12,7 @@ import (
|
|||||||
app "github.com/anyproto/any-sync/app"
|
app "github.com/anyproto/any-sync/app"
|
||||||
objectsync "github.com/anyproto/any-sync/commonspace/objectsync"
|
objectsync "github.com/anyproto/any-sync/commonspace/objectsync"
|
||||||
spacesyncproto "github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
spacesyncproto "github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
||||||
gomock "go.uber.org/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockObjectSync is a mock of ObjectSync interface.
|
// MockObjectSync is a mock of ObjectSync interface.
|
||||||
|
|||||||
@ -12,7 +12,7 @@ import (
|
|||||||
updatelistener "github.com/anyproto/any-sync/commonspace/object/tree/synctree/updatelistener"
|
updatelistener "github.com/anyproto/any-sync/commonspace/object/tree/synctree/updatelistener"
|
||||||
treestorage "github.com/anyproto/any-sync/commonspace/object/tree/treestorage"
|
treestorage "github.com/anyproto/any-sync/commonspace/object/tree/treestorage"
|
||||||
objecttreebuilder "github.com/anyproto/any-sync/commonspace/objecttreebuilder"
|
objecttreebuilder "github.com/anyproto/any-sync/commonspace/objecttreebuilder"
|
||||||
gomock "go.uber.org/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockTreeBuilder is a mock of TreeBuilder interface.
|
// MockTreeBuilder is a mock of TreeBuilder interface.
|
||||||
|
|||||||
@ -82,7 +82,7 @@ func (t *treeBuilder) Init(a *app.App) (err error) {
|
|||||||
t.isClosed = state.SpaceIsClosed
|
t.isClosed = state.SpaceIsClosed
|
||||||
t.treesUsed = state.TreesUsed
|
t.treesUsed = state.TreesUsed
|
||||||
t.builder = state.TreeBuilderFunc
|
t.builder = state.TreeBuilderFunc
|
||||||
t.aclList = a.MustComponent(syncacl.CName).(syncacl.SyncAcl)
|
t.aclList = a.MustComponent(syncacl.CName).(*syncacl.SyncAcl)
|
||||||
t.spaceStorage = a.MustComponent(spacestorage.CName).(spacestorage.SpaceStorage)
|
t.spaceStorage = a.MustComponent(spacestorage.CName).(spacestorage.SpaceStorage)
|
||||||
t.configuration = a.MustComponent(nodeconf.CName).(nodeconf.NodeConf)
|
t.configuration = a.MustComponent(nodeconf.CName).(nodeconf.NodeConf)
|
||||||
t.headsNotifiable = a.MustComponent(headsync.CName).(headsync.HeadSync)
|
t.headsNotifiable = a.MustComponent(headsync.CName).(headsync.HeadSync)
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import (
|
|||||||
app "github.com/anyproto/any-sync/app"
|
app "github.com/anyproto/any-sync/app"
|
||||||
spacesyncproto "github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
spacesyncproto "github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
||||||
peer "github.com/anyproto/any-sync/net/peer"
|
peer "github.com/anyproto/any-sync/net/peer"
|
||||||
gomock "go.uber.org/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockPeerManager is a mock of PeerManager interface.
|
// MockPeerManager is a mock of PeerManager interface.
|
||||||
|
|||||||
@ -12,8 +12,8 @@ import (
|
|||||||
"github.com/anyproto/any-sync/net/peer"
|
"github.com/anyproto/any-sync/net/peer"
|
||||||
"github.com/anyproto/any-sync/net/peer/mock_peer"
|
"github.com/anyproto/any-sync/net/peer/mock_peer"
|
||||||
"github.com/anyproto/any-sync/net/pool/mock_pool"
|
"github.com/anyproto/any-sync/net/pool/mock_pool"
|
||||||
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"go.uber.org/mock/gomock"
|
|
||||||
"storj.io/drpc"
|
"storj.io/drpc"
|
||||||
"storj.io/drpc/drpcconn"
|
"storj.io/drpc/drpcconn"
|
||||||
)
|
)
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import (
|
|||||||
"github.com/anyproto/any-sync/commonspace/object/tree/treestorage"
|
"github.com/anyproto/any-sync/commonspace/object/tree/treestorage"
|
||||||
"github.com/anyproto/any-sync/commonspace/object/treemanager/mock_treemanager"
|
"github.com/anyproto/any-sync/commonspace/object/treemanager/mock_treemanager"
|
||||||
"github.com/anyproto/any-sync/commonspace/spacestorage/mock_spacestorage"
|
"github.com/anyproto/any-sync/commonspace/spacestorage/mock_spacestorage"
|
||||||
"go.uber.org/mock/gomock"
|
"github.com/golang/mock/gomock"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@ -6,8 +6,8 @@ import (
|
|||||||
"github.com/anyproto/any-sync/commonspace/object/treemanager/mock_treemanager"
|
"github.com/anyproto/any-sync/commonspace/object/treemanager/mock_treemanager"
|
||||||
"github.com/anyproto/any-sync/commonspace/settings/mock_settings"
|
"github.com/anyproto/any-sync/commonspace/settings/mock_settings"
|
||||||
"github.com/anyproto/any-sync/commonspace/settings/settingsstate"
|
"github.com/anyproto/any-sync/commonspace/settings/settingsstate"
|
||||||
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"go.uber.org/mock/gomock"
|
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import (
|
|||||||
reflect "reflect"
|
reflect "reflect"
|
||||||
|
|
||||||
settingsstate "github.com/anyproto/any-sync/commonspace/settings/settingsstate"
|
settingsstate "github.com/anyproto/any-sync/commonspace/settings/settingsstate"
|
||||||
gomock "go.uber.org/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockDeletionManager is a mock of DeletionManager interface.
|
// MockDeletionManager is a mock of DeletionManager interface.
|
||||||
|
|||||||
@ -16,8 +16,8 @@ import (
|
|||||||
"github.com/anyproto/any-sync/commonspace/settings/settingsstate"
|
"github.com/anyproto/any-sync/commonspace/settings/settingsstate"
|
||||||
"github.com/anyproto/any-sync/commonspace/settings/settingsstate/mock_settingsstate"
|
"github.com/anyproto/any-sync/commonspace/settings/settingsstate/mock_settingsstate"
|
||||||
"github.com/anyproto/any-sync/commonspace/spacestorage/mock_spacestorage"
|
"github.com/anyproto/any-sync/commonspace/spacestorage/mock_spacestorage"
|
||||||
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"go.uber.org/mock/gomock"
|
|
||||||
"sync"
|
"sync"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import (
|
|||||||
|
|
||||||
objecttree "github.com/anyproto/any-sync/commonspace/object/tree/objecttree"
|
objecttree "github.com/anyproto/any-sync/commonspace/object/tree/objecttree"
|
||||||
settingsstate "github.com/anyproto/any-sync/commonspace/settings/settingsstate"
|
settingsstate "github.com/anyproto/any-sync/commonspace/settings/settingsstate"
|
||||||
gomock "go.uber.org/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockStateBuilder is a mock of StateBuilder interface.
|
// MockStateBuilder is a mock of StateBuilder interface.
|
||||||
|
|||||||
@ -4,8 +4,8 @@ import (
|
|||||||
"github.com/anyproto/any-sync/commonspace/object/tree/objecttree"
|
"github.com/anyproto/any-sync/commonspace/object/tree/objecttree"
|
||||||
"github.com/anyproto/any-sync/commonspace/object/tree/objecttree/mock_objecttree"
|
"github.com/anyproto/any-sync/commonspace/object/tree/objecttree/mock_objecttree"
|
||||||
"github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
"github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
||||||
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"go.uber.org/mock/gomock"
|
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@ -59,7 +59,6 @@ func NewSpaceId(id string, repKey uint64) string {
|
|||||||
type Space interface {
|
type Space interface {
|
||||||
Id() string
|
Id() string
|
||||||
Init(ctx context.Context) error
|
Init(ctx context.Context) error
|
||||||
Acl() list.AclList
|
|
||||||
|
|
||||||
StoredIds() []string
|
StoredIds() []string
|
||||||
DebugAllHeads() []headsync.TreeHeads
|
DebugAllHeads() []headsync.TreeHeads
|
||||||
@ -154,10 +153,6 @@ func (s *space) TreeBuilder() objecttreebuilder.TreeBuilder {
|
|||||||
return s.treeBuilder
|
return s.treeBuilder
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *space) Acl() list.AclList {
|
|
||||||
return s.aclList
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *space) Id() string {
|
func (s *space) Id() string {
|
||||||
return s.state.SpaceId
|
return s.state.SpaceId
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,7 +13,7 @@ import (
|
|||||||
treechangeproto "github.com/anyproto/any-sync/commonspace/object/tree/treechangeproto"
|
treechangeproto "github.com/anyproto/any-sync/commonspace/object/tree/treechangeproto"
|
||||||
treestorage "github.com/anyproto/any-sync/commonspace/object/tree/treestorage"
|
treestorage "github.com/anyproto/any-sync/commonspace/object/tree/treestorage"
|
||||||
spacesyncproto "github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
spacesyncproto "github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
||||||
gomock "go.uber.org/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockSpaceStorage is a mock of SpaceStorage interface.
|
// MockSpaceStorage is a mock of SpaceStorage interface.
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import (
|
|||||||
reflect "reflect"
|
reflect "reflect"
|
||||||
|
|
||||||
spacesyncproto "github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
spacesyncproto "github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
||||||
gomock "go.uber.org/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
drpc "storj.io/drpc"
|
drpc "storj.io/drpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,6 @@
|
|||||||
package spacesyncproto
|
package spacesyncproto
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/gogo/protobuf/proto"
|
|
||||||
"storj.io/drpc"
|
"storj.io/drpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -17,16 +16,3 @@ func (c ClientFactoryFunc) Client(cc drpc.Conn) DRPCSpaceSyncClient {
|
|||||||
type ClientFactory interface {
|
type ClientFactory interface {
|
||||||
Client(cc drpc.Conn) DRPCSpaceSyncClient
|
Client(cc drpc.Conn) DRPCSpaceSyncClient
|
||||||
}
|
}
|
||||||
|
|
||||||
func MarshallSyncMessage(message proto.Marshaler, spaceId, objectId string) (objMsg *ObjectSyncMessage, err error) {
|
|
||||||
payload, err := message.Marshal()
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
objMsg = &ObjectSyncMessage{
|
|
||||||
Payload: payload,
|
|
||||||
ObjectId: objectId,
|
|
||||||
SpaceId: spaceId,
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|||||||
@ -36,13 +36,13 @@ type Watcher interface {
|
|||||||
|
|
||||||
type Service interface {
|
type Service interface {
|
||||||
// AddLog adds new log to consensus servers
|
// AddLog adds new log to consensus servers
|
||||||
AddLog(ctx context.Context, rec *consensusproto.RawRecordWithId) (err error)
|
AddLog(ctx context.Context, clog *consensusproto.Log) (err error)
|
||||||
// AddRecord adds new record to consensus servers
|
// AddRecord adds new record to consensus servers
|
||||||
AddRecord(ctx context.Context, logId string, rec *consensusproto.RawRecord) (record *consensusproto.RawRecordWithId, err error)
|
AddRecord(ctx context.Context, logId []byte, clog *consensusproto.RawRecord) (record *consensusproto.RawRecordWithId, err error)
|
||||||
// Watch starts watching to given logId and calls watcher when any relative event received
|
// Watch starts watching to given logId and calls watcher when any relative event received
|
||||||
Watch(logId string, w Watcher) (err error)
|
Watch(logId []byte, w Watcher) (err error)
|
||||||
// UnWatch stops watching given logId and removes watcher
|
// UnWatch stops watching given logId and removes watcher
|
||||||
UnWatch(logId string) (err error)
|
UnWatch(logId []byte) (err error)
|
||||||
app.ComponentRunnable
|
app.ComponentRunnable
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,10 +86,10 @@ func (s *service) doClient(ctx context.Context, fn func(cl consensusproto.DRPCCo
|
|||||||
return fn(consensusproto.NewDRPCConsensusClient(dc))
|
return fn(consensusproto.NewDRPCConsensusClient(dc))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *service) AddLog(ctx context.Context, rec *consensusproto.RawRecordWithId) (err error) {
|
func (s *service) AddLog(ctx context.Context, clog *consensusproto.Log) (err error) {
|
||||||
return s.doClient(ctx, func(cl consensusproto.DRPCConsensusClient) error {
|
return s.doClient(ctx, func(cl consensusproto.DRPCConsensusClient) error {
|
||||||
if _, err = cl.LogAdd(ctx, &consensusproto.LogAddRequest{
|
if _, err = cl.LogAdd(ctx, &consensusproto.LogAddRequest{
|
||||||
Record: rec,
|
Log: clog,
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
return rpcerr.Unwrap(err)
|
return rpcerr.Unwrap(err)
|
||||||
}
|
}
|
||||||
@ -97,11 +97,11 @@ func (s *service) AddLog(ctx context.Context, rec *consensusproto.RawRecordWithI
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *service) AddRecord(ctx context.Context, logId string, rec *consensusproto.RawRecord) (record *consensusproto.RawRecordWithId, err error) {
|
func (s *service) AddRecord(ctx context.Context, logId []byte, clog *consensusproto.RawRecord) (record *consensusproto.RawRecordWithId, err error) {
|
||||||
err = s.doClient(ctx, func(cl consensusproto.DRPCConsensusClient) error {
|
err = s.doClient(ctx, func(cl consensusproto.DRPCConsensusClient) error {
|
||||||
if record, err = cl.RecordAdd(ctx, &consensusproto.RecordAddRequest{
|
if record, err = cl.RecordAdd(ctx, &consensusproto.RecordAddRequest{
|
||||||
LogId: logId,
|
LogId: logId,
|
||||||
Record: rec,
|
Record: clog,
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
return rpcerr.Unwrap(err)
|
return rpcerr.Unwrap(err)
|
||||||
}
|
}
|
||||||
@ -110,30 +110,30 @@ func (s *service) AddRecord(ctx context.Context, logId string, rec *consensuspro
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *service) Watch(logId string, w Watcher) (err error) {
|
func (s *service) Watch(logId []byte, w Watcher) (err error) {
|
||||||
s.mu.Lock()
|
s.mu.Lock()
|
||||||
defer s.mu.Unlock()
|
defer s.mu.Unlock()
|
||||||
if _, ok := s.watchers[logId]; ok {
|
if _, ok := s.watchers[string(logId)]; ok {
|
||||||
return ErrWatcherExists
|
return ErrWatcherExists
|
||||||
}
|
}
|
||||||
s.watchers[logId] = w
|
s.watchers[string(logId)] = w
|
||||||
if s.stream != nil {
|
if s.stream != nil {
|
||||||
if wErr := s.stream.WatchIds([]string{logId}); wErr != nil {
|
if wErr := s.stream.WatchIds([][]byte{logId}); wErr != nil {
|
||||||
log.Warn("WatchIds error", zap.Error(wErr))
|
log.Warn("WatchIds error", zap.Error(wErr))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *service) UnWatch(logId string) (err error) {
|
func (s *service) UnWatch(logId []byte) (err error) {
|
||||||
s.mu.Lock()
|
s.mu.Lock()
|
||||||
defer s.mu.Unlock()
|
defer s.mu.Unlock()
|
||||||
if _, ok := s.watchers[logId]; !ok {
|
if _, ok := s.watchers[string(logId)]; !ok {
|
||||||
return ErrWatcherNotExists
|
return ErrWatcherNotExists
|
||||||
}
|
}
|
||||||
delete(s.watchers, logId)
|
delete(s.watchers, string(logId))
|
||||||
if s.stream != nil {
|
if s.stream != nil {
|
||||||
if wErr := s.stream.UnwatchIds([]string{logId}); wErr != nil {
|
if wErr := s.stream.UnwatchIds([][]byte{logId}); wErr != nil {
|
||||||
log.Warn("UnWatchIds error", zap.Error(wErr))
|
log.Warn("UnWatchIds error", zap.Error(wErr))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -182,9 +182,9 @@ func (s *service) streamWatcher() {
|
|||||||
|
|
||||||
// collect ids and setup stream
|
// collect ids and setup stream
|
||||||
s.mu.Lock()
|
s.mu.Lock()
|
||||||
var logIds = make([]string, 0, len(s.watchers))
|
var logIds = make([][]byte, 0, len(s.watchers))
|
||||||
for id := range s.watchers {
|
for id := range s.watchers {
|
||||||
logIds = append(logIds, id)
|
logIds = append(logIds, []byte(id))
|
||||||
}
|
}
|
||||||
s.stream = st
|
s.stream = st
|
||||||
s.mu.Unlock()
|
s.mu.Unlock()
|
||||||
@ -212,19 +212,17 @@ func (s *service) streamReader() error {
|
|||||||
if len(events) == 0 {
|
if len(events) == 0 {
|
||||||
return s.stream.Err()
|
return s.stream.Err()
|
||||||
}
|
}
|
||||||
s.mu.Lock()
|
|
||||||
for _, e := range events {
|
for _, e := range events {
|
||||||
if w, ok := s.watchers[e.LogId]; ok {
|
if w, ok := s.watchers[string(e.LogId)]; ok {
|
||||||
if e.Error == nil {
|
if e.Error == nil {
|
||||||
w.AddConsensusRecords(e.Records)
|
w.AddConsensusRecords(e.Records)
|
||||||
} else {
|
} else {
|
||||||
w.AddConsensusError(rpcerr.Err(uint64(e.Error.Error)))
|
w.AddConsensusError(rpcerr.Err(uint64(e.Error.Error)))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
log.Warn("received unexpected log id", zap.String("logId", e.LogId))
|
log.Warn("received unexpected log id", zap.Binary("logId", e.LogId))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
s.mu.Unlock()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -12,9 +12,9 @@ import (
|
|||||||
"github.com/anyproto/any-sync/nodeconf/mock_nodeconf"
|
"github.com/anyproto/any-sync/nodeconf/mock_nodeconf"
|
||||||
"github.com/anyproto/any-sync/testutil/accounttest"
|
"github.com/anyproto/any-sync/testutil/accounttest"
|
||||||
"github.com/anyproto/any-sync/util/cidutil"
|
"github.com/anyproto/any-sync/util/cidutil"
|
||||||
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"go.uber.org/mock/gomock"
|
|
||||||
"sync"
|
"sync"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
@ -24,13 +24,13 @@ func TestService_Watch(t *testing.T) {
|
|||||||
t.Run("not found error", func(t *testing.T) {
|
t.Run("not found error", func(t *testing.T) {
|
||||||
fx := newFixture(t).run(t)
|
fx := newFixture(t).run(t)
|
||||||
defer fx.Finish()
|
defer fx.Finish()
|
||||||
var logId = "1"
|
var logId = []byte{'1'}
|
||||||
w := &testWatcher{ready: make(chan struct{})}
|
w := &testWatcher{ready: make(chan struct{})}
|
||||||
require.NoError(t, fx.Watch(logId, w))
|
require.NoError(t, fx.Watch(logId, w))
|
||||||
st := fx.testServer.waitStream(t)
|
st := fx.testServer.waitStream(t)
|
||||||
req, err := st.Recv()
|
req, err := st.Recv()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.Equal(t, []string{logId}, req.WatchIds)
|
assert.Equal(t, [][]byte{logId}, req.WatchIds)
|
||||||
require.NoError(t, st.Send(&consensusproto.LogWatchEvent{
|
require.NoError(t, st.Send(&consensusproto.LogWatchEvent{
|
||||||
LogId: logId,
|
LogId: logId,
|
||||||
Error: &consensusproto.Err{
|
Error: &consensusproto.Err{
|
||||||
@ -44,7 +44,7 @@ func TestService_Watch(t *testing.T) {
|
|||||||
t.Run("watcherExists error", func(t *testing.T) {
|
t.Run("watcherExists error", func(t *testing.T) {
|
||||||
fx := newFixture(t).run(t)
|
fx := newFixture(t).run(t)
|
||||||
defer fx.Finish()
|
defer fx.Finish()
|
||||||
var logId = "1"
|
var logId = []byte{'1'}
|
||||||
w := &testWatcher{}
|
w := &testWatcher{}
|
||||||
require.NoError(t, fx.Watch(logId, w))
|
require.NoError(t, fx.Watch(logId, w))
|
||||||
require.Error(t, fx.Watch(logId, w))
|
require.Error(t, fx.Watch(logId, w))
|
||||||
@ -55,20 +55,20 @@ func TestService_Watch(t *testing.T) {
|
|||||||
t.Run("watch", func(t *testing.T) {
|
t.Run("watch", func(t *testing.T) {
|
||||||
fx := newFixture(t).run(t)
|
fx := newFixture(t).run(t)
|
||||||
defer fx.Finish()
|
defer fx.Finish()
|
||||||
var logId1 = "1"
|
var logId1 = []byte{'1'}
|
||||||
w := &testWatcher{}
|
w := &testWatcher{}
|
||||||
require.NoError(t, fx.Watch(logId1, w))
|
require.NoError(t, fx.Watch(logId1, w))
|
||||||
st := fx.testServer.waitStream(t)
|
st := fx.testServer.waitStream(t)
|
||||||
req, err := st.Recv()
|
req, err := st.Recv()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.Equal(t, []string{logId1}, req.WatchIds)
|
assert.Equal(t, [][]byte{logId1}, req.WatchIds)
|
||||||
|
|
||||||
var logId2 = "2"
|
var logId2 = []byte{'2'}
|
||||||
w = &testWatcher{}
|
w = &testWatcher{}
|
||||||
require.NoError(t, fx.Watch(logId2, w))
|
require.NoError(t, fx.Watch(logId2, w))
|
||||||
req, err = st.Recv()
|
req, err = st.Recv()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.Equal(t, []string{logId2}, req.WatchIds)
|
assert.Equal(t, [][]byte{logId2}, req.WatchIds)
|
||||||
|
|
||||||
fx.testServer.releaseStream <- nil
|
fx.testServer.releaseStream <- nil
|
||||||
})
|
})
|
||||||
@ -78,14 +78,14 @@ func TestService_UnWatch(t *testing.T) {
|
|||||||
t.Run("no watcher", func(t *testing.T) {
|
t.Run("no watcher", func(t *testing.T) {
|
||||||
fx := newFixture(t).run(t)
|
fx := newFixture(t).run(t)
|
||||||
defer fx.Finish()
|
defer fx.Finish()
|
||||||
require.Error(t, fx.UnWatch("1"))
|
require.Error(t, fx.UnWatch([]byte{'1'}))
|
||||||
})
|
})
|
||||||
t.Run("success", func(t *testing.T) {
|
t.Run("success", func(t *testing.T) {
|
||||||
fx := newFixture(t).run(t)
|
fx := newFixture(t).run(t)
|
||||||
defer fx.Finish()
|
defer fx.Finish()
|
||||||
w := &testWatcher{}
|
w := &testWatcher{}
|
||||||
require.NoError(t, fx.Watch("1", w))
|
require.NoError(t, fx.Watch([]byte{'1'}, w))
|
||||||
assert.NoError(t, fx.UnWatch("1"))
|
assert.NoError(t, fx.UnWatch([]byte{'1'}))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,13 +113,13 @@ func TestService_Init(t *testing.T) {
|
|||||||
func TestService_AddLog(t *testing.T) {
|
func TestService_AddLog(t *testing.T) {
|
||||||
fx := newFixture(t).run(t)
|
fx := newFixture(t).run(t)
|
||||||
defer fx.Finish()
|
defer fx.Finish()
|
||||||
assert.NoError(t, fx.AddLog(ctx, &consensusproto.RawRecordWithId{}))
|
assert.NoError(t, fx.AddLog(ctx, &consensusproto.Log{}))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestService_AddRecord(t *testing.T) {
|
func TestService_AddRecord(t *testing.T) {
|
||||||
fx := newFixture(t).run(t)
|
fx := newFixture(t).run(t)
|
||||||
defer fx.Finish()
|
defer fx.Finish()
|
||||||
rec, err := fx.AddRecord(ctx, "1", &consensusproto.RawRecord{})
|
rec, err := fx.AddRecord(ctx, []byte{'1'}, &consensusproto.RawRecord{})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.NotEmpty(t, rec)
|
assert.NotEmpty(t, rec)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import (
|
|||||||
app "github.com/anyproto/any-sync/app"
|
app "github.com/anyproto/any-sync/app"
|
||||||
consensusclient "github.com/anyproto/any-sync/consensus/consensusclient"
|
consensusclient "github.com/anyproto/any-sync/consensus/consensusclient"
|
||||||
consensusproto "github.com/anyproto/any-sync/consensus/consensusproto"
|
consensusproto "github.com/anyproto/any-sync/consensus/consensusproto"
|
||||||
gomock "go.uber.org/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockService is a mock of Service interface.
|
// MockService is a mock of Service interface.
|
||||||
@ -38,7 +38,7 @@ func (m *MockService) EXPECT() *MockServiceMockRecorder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// AddLog mocks base method.
|
// AddLog mocks base method.
|
||||||
func (m *MockService) AddLog(arg0 context.Context, arg1 *consensusproto.RawRecordWithId) error {
|
func (m *MockService) AddLog(arg0 context.Context, arg1 *consensusproto.Log) error {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "AddLog", arg0, arg1)
|
ret := m.ctrl.Call(m, "AddLog", arg0, arg1)
|
||||||
ret0, _ := ret[0].(error)
|
ret0, _ := ret[0].(error)
|
||||||
@ -52,7 +52,7 @@ func (mr *MockServiceMockRecorder) AddLog(arg0, arg1 interface{}) *gomock.Call {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// AddRecord mocks base method.
|
// AddRecord mocks base method.
|
||||||
func (m *MockService) AddRecord(arg0 context.Context, arg1 string, arg2 *consensusproto.RawRecord) (*consensusproto.RawRecordWithId, error) {
|
func (m *MockService) AddRecord(arg0 context.Context, arg1 []byte, arg2 *consensusproto.RawRecord) (*consensusproto.RawRecordWithId, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "AddRecord", arg0, arg1, arg2)
|
ret := m.ctrl.Call(m, "AddRecord", arg0, arg1, arg2)
|
||||||
ret0, _ := ret[0].(*consensusproto.RawRecordWithId)
|
ret0, _ := ret[0].(*consensusproto.RawRecordWithId)
|
||||||
@ -123,7 +123,7 @@ func (mr *MockServiceMockRecorder) Run(arg0 interface{}) *gomock.Call {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// UnWatch mocks base method.
|
// UnWatch mocks base method.
|
||||||
func (m *MockService) UnWatch(arg0 string) error {
|
func (m *MockService) UnWatch(arg0 []byte) error {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "UnWatch", arg0)
|
ret := m.ctrl.Call(m, "UnWatch", arg0)
|
||||||
ret0, _ := ret[0].(error)
|
ret0, _ := ret[0].(error)
|
||||||
@ -137,7 +137,7 @@ func (mr *MockServiceMockRecorder) UnWatch(arg0 interface{}) *gomock.Call {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Watch mocks base method.
|
// Watch mocks base method.
|
||||||
func (m *MockService) Watch(arg0 string, arg1 consensusclient.Watcher) error {
|
func (m *MockService) Watch(arg0 []byte, arg1 consensusclient.Watcher) error {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "Watch", arg0, arg1)
|
ret := m.ctrl.Call(m, "Watch", arg0, arg1)
|
||||||
ret0, _ := ret[0].(error)
|
ret0, _ := ret[0].(error)
|
||||||
|
|||||||
@ -23,13 +23,13 @@ type stream struct {
|
|||||||
err error
|
err error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *stream) WatchIds(logIds []string) (err error) {
|
func (s *stream) WatchIds(logIds [][]byte) (err error) {
|
||||||
return s.rpcStream.Send(&consensusproto.LogWatchRequest{
|
return s.rpcStream.Send(&consensusproto.LogWatchRequest{
|
||||||
WatchIds: logIds,
|
WatchIds: logIds,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *stream) UnwatchIds(logIds []string) (err error) {
|
func (s *stream) UnwatchIds(logIds [][]byte) (err error) {
|
||||||
return s.rpcStream.Send(&consensusproto.LogWatchRequest{
|
return s.rpcStream.Send(&consensusproto.LogWatchRequest{
|
||||||
UnwatchIds: logIds,
|
UnwatchIds: logIds,
|
||||||
})
|
})
|
||||||
|
|||||||
@ -1,45 +0,0 @@
|
|||||||
package consensusproto
|
|
||||||
|
|
||||||
func WrapHeadUpdate(update *LogHeadUpdate, rootRecord *RawRecordWithId) *LogSyncMessage {
|
|
||||||
return &LogSyncMessage{
|
|
||||||
Content: &LogSyncContentValue{
|
|
||||||
Value: &LogSyncContentValue_HeadUpdate{HeadUpdate: update},
|
|
||||||
},
|
|
||||||
Id: rootRecord.Id,
|
|
||||||
Payload: rootRecord.Payload,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func WrapFullRequest(request *LogFullSyncRequest, rootRecord *RawRecordWithId) *LogSyncMessage {
|
|
||||||
return &LogSyncMessage{
|
|
||||||
Content: &LogSyncContentValue{
|
|
||||||
Value: &LogSyncContentValue_FullSyncRequest{FullSyncRequest: request},
|
|
||||||
},
|
|
||||||
Id: rootRecord.Id,
|
|
||||||
Payload: rootRecord.Payload,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func WrapFullResponse(response *LogFullSyncResponse, rootRecord *RawRecordWithId) *LogSyncMessage {
|
|
||||||
return &LogSyncMessage{
|
|
||||||
Content: &LogSyncContentValue{
|
|
||||||
Value: &LogSyncContentValue_FullSyncResponse{FullSyncResponse: response},
|
|
||||||
},
|
|
||||||
Id: rootRecord.Id,
|
|
||||||
Payload: rootRecord.Payload,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetHead(msg *LogSyncMessage) (head string) {
|
|
||||||
content := msg.GetContent()
|
|
||||||
switch {
|
|
||||||
case content.GetHeadUpdate() != nil:
|
|
||||||
return content.GetHeadUpdate().Head
|
|
||||||
case content.GetFullSyncRequest() != nil:
|
|
||||||
return content.GetFullSyncRequest().Head
|
|
||||||
case content.GetFullSyncResponse() != nil:
|
|
||||||
return content.GetFullSyncResponse().Head
|
|
||||||
default:
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@ -13,6 +13,4 @@ var (
|
|||||||
ErrConflict = errGroup.Register(fmt.Errorf("records conflict"), uint64(consensusproto.ErrCodes_RecordConflict))
|
ErrConflict = errGroup.Register(fmt.Errorf("records conflict"), uint64(consensusproto.ErrCodes_RecordConflict))
|
||||||
ErrLogExists = errGroup.Register(fmt.Errorf("log exists"), uint64(consensusproto.ErrCodes_LogExists))
|
ErrLogExists = errGroup.Register(fmt.Errorf("log exists"), uint64(consensusproto.ErrCodes_LogExists))
|
||||||
ErrLogNotFound = errGroup.Register(fmt.Errorf("log not found"), uint64(consensusproto.ErrCodes_LogNotFound))
|
ErrLogNotFound = errGroup.Register(fmt.Errorf("log not found"), uint64(consensusproto.ErrCodes_LogNotFound))
|
||||||
ErrForbidden = errGroup.Register(fmt.Errorf("forbidden"), uint64(consensusproto.ErrCodes_Forbidden))
|
|
||||||
ErrInvalidPayload = errGroup.Register(fmt.Errorf("invalid payload"), uint64(consensusproto.ErrCodes_InvalidPayload))
|
|
||||||
)
|
)
|
||||||
|
|||||||
@ -8,14 +8,13 @@ enum ErrCodes {
|
|||||||
LogExists = 1;
|
LogExists = 1;
|
||||||
LogNotFound = 2;
|
LogNotFound = 2;
|
||||||
RecordConflict = 3;
|
RecordConflict = 3;
|
||||||
Forbidden = 4;
|
|
||||||
InvalidPayload = 5;
|
|
||||||
ErrorOffset = 500;
|
ErrorOffset = 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
message Log {
|
message Log {
|
||||||
string id = 1;
|
bytes id = 1;
|
||||||
|
bytes payload = 2;
|
||||||
repeated RawRecordWithId records = 3;
|
repeated RawRecordWithId records = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,22 +53,21 @@ service Consensus {
|
|||||||
message Ok {}
|
message Ok {}
|
||||||
|
|
||||||
message LogAddRequest {
|
message LogAddRequest {
|
||||||
// first record in the log, consensus node not sign it
|
Log log = 1;
|
||||||
RawRecordWithId record = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
message RecordAddRequest {
|
message RecordAddRequest {
|
||||||
string logId = 1;
|
bytes logId = 1;
|
||||||
RawRecord record = 2;
|
RawRecord record = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
message LogWatchRequest {
|
message LogWatchRequest {
|
||||||
repeated string watchIds = 1;
|
repeated bytes watchIds = 1;
|
||||||
repeated string unwatchIds = 2;
|
repeated bytes unwatchIds = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
message LogWatchEvent {
|
message LogWatchEvent {
|
||||||
string logId = 1;
|
bytes logId = 1;
|
||||||
repeated RawRecordWithId records = 2;
|
repeated RawRecordWithId records = 2;
|
||||||
Err error = 3;
|
Err error = 3;
|
||||||
}
|
}
|
||||||
@ -77,37 +75,3 @@ message LogWatchEvent {
|
|||||||
message Err {
|
message Err {
|
||||||
ErrCodes error = 1;
|
ErrCodes error = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// LogSyncContentValue provides different types for log sync
|
|
||||||
message LogSyncContentValue {
|
|
||||||
oneof value {
|
|
||||||
LogHeadUpdate headUpdate = 1;
|
|
||||||
LogFullSyncRequest fullSyncRequest = 2;
|
|
||||||
LogFullSyncResponse fullSyncResponse = 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// LogSyncMessage is a message sent when we are syncing logs
|
|
||||||
message LogSyncMessage {
|
|
||||||
string id = 1;
|
|
||||||
bytes payload = 2;
|
|
||||||
LogSyncContentValue content = 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
// LogHeadUpdate is a message sent on consensus log head update
|
|
||||||
message LogHeadUpdate {
|
|
||||||
string head = 1;
|
|
||||||
repeated RawRecordWithId records = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
// LogFullSyncRequest is a message sent when consensus log needs full sync
|
|
||||||
message LogFullSyncRequest {
|
|
||||||
string head = 1;
|
|
||||||
repeated RawRecordWithId records = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
// LogFullSyncResponse is a message sent as a response for a specific full sync
|
|
||||||
message LogFullSyncResponse {
|
|
||||||
string head = 1;
|
|
||||||
repeated RawRecordWithId records = 2;
|
|
||||||
}
|
|
||||||
|
|||||||
@ -12,7 +12,7 @@ import (
|
|||||||
treechangeproto "github.com/anyproto/any-sync/commonspace/object/tree/treechangeproto"
|
treechangeproto "github.com/anyproto/any-sync/commonspace/object/tree/treechangeproto"
|
||||||
coordinatorclient "github.com/anyproto/any-sync/coordinator/coordinatorclient"
|
coordinatorclient "github.com/anyproto/any-sync/coordinator/coordinatorclient"
|
||||||
coordinatorproto "github.com/anyproto/any-sync/coordinator/coordinatorproto"
|
coordinatorproto "github.com/anyproto/any-sync/coordinator/coordinatorproto"
|
||||||
gomock "go.uber.org/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockCoordinatorClient is a mock of CoordinatorClient interface.
|
// MockCoordinatorClient is a mock of CoordinatorClient interface.
|
||||||
|
|||||||
12
go.mod
12
go.mod
@ -12,6 +12,7 @@ require (
|
|||||||
github.com/gobwas/glob v0.2.3
|
github.com/gobwas/glob v0.2.3
|
||||||
github.com/goccy/go-graphviz v0.1.1
|
github.com/goccy/go-graphviz v0.1.1
|
||||||
github.com/gogo/protobuf v1.3.2
|
github.com/gogo/protobuf v1.3.2
|
||||||
|
github.com/golang/mock v1.6.0
|
||||||
github.com/google/uuid v1.3.0
|
github.com/google/uuid v1.3.0
|
||||||
github.com/hashicorp/yamux v0.1.1
|
github.com/hashicorp/yamux v0.1.1
|
||||||
github.com/huandu/skiplist v1.2.0
|
github.com/huandu/skiplist v1.2.0
|
||||||
@ -24,7 +25,7 @@ require (
|
|||||||
github.com/ipfs/go-ipld-format v0.5.0
|
github.com/ipfs/go-ipld-format v0.5.0
|
||||||
github.com/ipfs/go-merkledag v0.11.0
|
github.com/ipfs/go-merkledag v0.11.0
|
||||||
github.com/ipfs/go-unixfs v0.4.6
|
github.com/ipfs/go-unixfs v0.4.6
|
||||||
github.com/libp2p/go-libp2p v0.29.0
|
github.com/libp2p/go-libp2p v0.28.1
|
||||||
github.com/mr-tron/base58 v1.2.0
|
github.com/mr-tron/base58 v1.2.0
|
||||||
github.com/multiformats/go-multibase v0.2.0
|
github.com/multiformats/go-multibase v0.2.0
|
||||||
github.com/multiformats/go-multihash v0.2.3
|
github.com/multiformats/go-multihash v0.2.3
|
||||||
@ -33,10 +34,9 @@ require (
|
|||||||
github.com/tyler-smith/go-bip39 v1.1.0
|
github.com/tyler-smith/go-bip39 v1.1.0
|
||||||
github.com/zeebo/blake3 v0.2.3
|
github.com/zeebo/blake3 v0.2.3
|
||||||
go.uber.org/atomic v1.11.0
|
go.uber.org/atomic v1.11.0
|
||||||
go.uber.org/mock v0.2.0
|
|
||||||
go.uber.org/zap v1.24.0
|
go.uber.org/zap v1.24.0
|
||||||
golang.org/x/crypto v0.11.0
|
golang.org/x/crypto v0.11.0
|
||||||
golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1
|
golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1
|
||||||
golang.org/x/net v0.12.0
|
golang.org/x/net v0.12.0
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
storj.io/drpc v0.0.33
|
storj.io/drpc v0.0.33
|
||||||
@ -79,7 +79,7 @@ require (
|
|||||||
github.com/minio/sha256-simd v1.0.1 // indirect
|
github.com/minio/sha256-simd v1.0.1 // indirect
|
||||||
github.com/multiformats/go-base32 v0.1.0 // indirect
|
github.com/multiformats/go-base32 v0.1.0 // indirect
|
||||||
github.com/multiformats/go-base36 v0.2.0 // indirect
|
github.com/multiformats/go-base36 v0.2.0 // indirect
|
||||||
github.com/multiformats/go-multiaddr v0.10.1 // indirect
|
github.com/multiformats/go-multiaddr v0.9.0 // indirect
|
||||||
github.com/multiformats/go-multicodec v0.9.0 // indirect
|
github.com/multiformats/go-multicodec v0.9.0 // indirect
|
||||||
github.com/multiformats/go-multistream v0.4.1 // indirect
|
github.com/multiformats/go-multistream v0.4.1 // indirect
|
||||||
github.com/multiformats/go-varint v0.0.7 // indirect
|
github.com/multiformats/go-varint v0.0.7 // indirect
|
||||||
@ -90,6 +90,7 @@ require (
|
|||||||
github.com/prometheus/client_model v0.4.0 // indirect
|
github.com/prometheus/client_model v0.4.0 // indirect
|
||||||
github.com/prometheus/common v0.44.0 // indirect
|
github.com/prometheus/common v0.44.0 // indirect
|
||||||
github.com/prometheus/procfs v0.10.1 // indirect
|
github.com/prometheus/procfs v0.10.1 // indirect
|
||||||
|
github.com/quic-go/quic-go v0.35.1 // indirect
|
||||||
github.com/spaolacci/murmur3 v1.1.0 // indirect
|
github.com/spaolacci/murmur3 v1.1.0 // indirect
|
||||||
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect
|
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect
|
||||||
github.com/zeebo/errs v1.3.0 // indirect
|
github.com/zeebo/errs v1.3.0 // indirect
|
||||||
@ -97,8 +98,9 @@ require (
|
|||||||
go.opentelemetry.io/otel/trace v1.7.0 // indirect
|
go.opentelemetry.io/otel/trace v1.7.0 // indirect
|
||||||
go.uber.org/multierr v1.11.0 // indirect
|
go.uber.org/multierr v1.11.0 // indirect
|
||||||
golang.org/x/image v0.6.0 // indirect
|
golang.org/x/image v0.6.0 // indirect
|
||||||
golang.org/x/sync v0.3.0 // indirect
|
golang.org/x/sync v0.2.0 // indirect
|
||||||
golang.org/x/sys v0.10.0 // indirect
|
golang.org/x/sys v0.10.0 // indirect
|
||||||
|
golang.org/x/tools v0.9.3 // indirect
|
||||||
google.golang.org/protobuf v1.30.0 // indirect
|
google.golang.org/protobuf v1.30.0 // indirect
|
||||||
lukechampine.com/blake3 v1.2.1 // indirect
|
lukechampine.com/blake3 v1.2.1 // indirect
|
||||||
)
|
)
|
||||||
|
|||||||
38
go.sum
38
go.sum
@ -54,6 +54,7 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69
|
|||||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
|
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
|
||||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
|
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
|
||||||
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
|
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
|
||||||
|
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||||
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
|
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
|
||||||
@ -62,7 +63,7 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
|||||||
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
|
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
|
||||||
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
||||||
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
|
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
|
||||||
github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 h1:n6vlPhxsA+BW/XsS5+uqi7GyzaLa5MH7qlSLBZtRdiA=
|
github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 h1:hR7/MlvK23p6+lIw9SN1TigNLn9ZnF3W4SYRKq2gAHs=
|
||||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
||||||
@ -151,7 +152,7 @@ github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZl
|
|||||||
github.com/jtolds/gls v4.2.1+incompatible h1:fSuqC+Gmlu6l/ZYAoZzx2pyucC8Xza35fpRVWLVmUEE=
|
github.com/jtolds/gls v4.2.1+incompatible h1:fSuqC+Gmlu6l/ZYAoZzx2pyucC8Xza35fpRVWLVmUEE=
|
||||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=
|
github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI=
|
||||||
github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c=
|
github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c=
|
||||||
github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg=
|
github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg=
|
||||||
github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
|
github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
|
||||||
@ -165,21 +166,21 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
|||||||
github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8=
|
github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8=
|
||||||
github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg=
|
github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg=
|
||||||
github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c=
|
github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c=
|
||||||
github.com/libp2p/go-libp2p v0.29.0 h1:QduJ2XQr/Crg4EnloueWDL0Jj86N3Ezhyyj7XH+XwHI=
|
github.com/libp2p/go-libp2p v0.28.1 h1:YurK+ZAI6cKfASLJBVFkpVBdl3wGhFi6fusOt725ii8=
|
||||||
github.com/libp2p/go-libp2p v0.29.0/go.mod h1:iNKL7mEnZ9wAss+03IjAwM9ZAQXfVUAPUUmOACQfQ/g=
|
github.com/libp2p/go-libp2p v0.28.1/go.mod h1:s3Xabc9LSwOcnv9UD4nORnXKTsWkPMkIMB/JIGXVnzk=
|
||||||
github.com/libp2p/go-libp2p-asn-util v0.3.0 h1:gMDcMyYiZKkocGXDQ5nsUQyquC9+H+iLEQHwOCZ7s8s=
|
github.com/libp2p/go-libp2p-asn-util v0.3.0 h1:gMDcMyYiZKkocGXDQ5nsUQyquC9+H+iLEQHwOCZ7s8s=
|
||||||
github.com/libp2p/go-libp2p-record v0.2.0 h1:oiNUOCWno2BFuxt3my4i1frNrt7PerzB3queqa1NkQ0=
|
github.com/libp2p/go-libp2p-record v0.2.0 h1:oiNUOCWno2BFuxt3my4i1frNrt7PerzB3queqa1NkQ0=
|
||||||
github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA=
|
github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA=
|
||||||
github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0=
|
github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0=
|
||||||
github.com/libp2p/go-nat v0.2.0 h1:Tyz+bUFAYqGyJ/ppPPymMGbIgNRH+WqC5QrT5fKrrGk=
|
github.com/libp2p/go-nat v0.2.0 h1:Tyz+bUFAYqGyJ/ppPPymMGbIgNRH+WqC5QrT5fKrrGk=
|
||||||
github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU=
|
github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU=
|
||||||
github.com/libp2p/go-yamux/v4 v4.0.1 h1:FfDR4S1wj6Bw2Pqbc8Uz7pCxeRBPbwsBbEdfwiCypkQ=
|
github.com/libp2p/go-yamux/v4 v4.0.0 h1:+Y80dV2Yx/kv7Y7JKu0LECyVdMXm1VUoko+VQ9rBfZQ=
|
||||||
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
|
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
|
||||||
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
|
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
|
||||||
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
|
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
|
github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
|
||||||
github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo=
|
github.com/miekg/dns v1.1.54 h1:5jon9mWcb0sFJGpnI99tOMhCPyJ+RPVz5b63MQG0VWI=
|
||||||
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ=
|
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ=
|
||||||
github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U=
|
github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U=
|
||||||
github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
|
github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
|
||||||
@ -194,8 +195,8 @@ github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aG
|
|||||||
github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI=
|
github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI=
|
||||||
github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0=
|
github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0=
|
||||||
github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4=
|
github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4=
|
||||||
github.com/multiformats/go-multiaddr v0.10.1 h1:HghtFrWyZEPrpTvgAMFJi6gFdgHfs2cb0pyfDsk+lqU=
|
github.com/multiformats/go-multiaddr v0.9.0 h1:3h4V1LHIk5w4hJHekMKWALPXErDfz/sggzwC/NcqbDQ=
|
||||||
github.com/multiformats/go-multiaddr v0.10.1/go.mod h1:jLEZsA61rwWNZQTHHnqq2HNa+4os/Hz54eqiRnsRqYQ=
|
github.com/multiformats/go-multiaddr v0.9.0/go.mod h1:mI67Lb1EeTOYb8GQfL/7wpIZwc46ElrvzhYnoJOmTT0=
|
||||||
github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A=
|
github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A=
|
||||||
github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E=
|
github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E=
|
||||||
github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs=
|
github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs=
|
||||||
@ -214,7 +215,7 @@ github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/n
|
|||||||
github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU=
|
github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU=
|
||||||
github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5 h1:BvoENQQU+fZ9uukda/RzCAL/191HHwJA5b13R6diVlY=
|
github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5 h1:BvoENQQU+fZ9uukda/RzCAL/191HHwJA5b13R6diVlY=
|
||||||
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
|
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
|
||||||
github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU=
|
github.com/onsi/ginkgo/v2 v2.9.7 h1:06xGQy5www2oN160RtEZoTvnP2sPhEfePYmCDc2szss=
|
||||||
github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
|
github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
|
||||||
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
|
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
|
||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
@ -235,7 +236,8 @@ github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPH
|
|||||||
github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
|
github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
|
||||||
github.com/quic-go/qtls-go1-19 v0.3.2 h1:tFxjCFcTQzK+oMxG6Zcvp4Dq8dx4yD3dDiIiyc86Z5U=
|
github.com/quic-go/qtls-go1-19 v0.3.2 h1:tFxjCFcTQzK+oMxG6Zcvp4Dq8dx4yD3dDiIiyc86Z5U=
|
||||||
github.com/quic-go/qtls-go1-20 v0.2.2 h1:WLOPx6OY/hxtTxKV1Zrq20FtXtDEkeY00CGQm8GEa3E=
|
github.com/quic-go/qtls-go1-20 v0.2.2 h1:WLOPx6OY/hxtTxKV1Zrq20FtXtDEkeY00CGQm8GEa3E=
|
||||||
github.com/quic-go/quic-go v0.36.2 h1:ZX/UNQ4gvpCv2RmwdbA6lrRjF6EBm5yZ7TMoT4NQVrA=
|
github.com/quic-go/quic-go v0.35.1 h1:b0kzj6b/cQAf05cT0CkQubHM31wiA+xH3IBkxP62poo=
|
||||||
|
github.com/quic-go/quic-go v0.35.1/go.mod h1:+4CVgVppm0FNjpG3UcX8Joi/frKOH7/ciD5yGcwOO1g=
|
||||||
github.com/quic-go/webtransport-go v0.5.3 h1:5XMlzemqB4qmOlgIus5zB45AcZ2kCgCy2EptUrfOPWU=
|
github.com/quic-go/webtransport-go v0.5.3 h1:5XMlzemqB4qmOlgIus5zB45AcZ2kCgCy2EptUrfOPWU=
|
||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
|
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
|
||||||
@ -279,8 +281,6 @@ go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
|
|||||||
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
|
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
|
||||||
go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
|
go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
|
||||||
go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=
|
go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=
|
||||||
go.uber.org/mock v0.2.0 h1:TaP3xedm7JaAgScZO7tlvlKrqT0p7I6OsdGB5YNSMDU=
|
|
||||||
go.uber.org/mock v0.2.0/go.mod h1:J0y0rp9L3xiff1+ZBfKxlC1fz2+aO16tw0tsDOixfuM=
|
|
||||||
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
|
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
|
||||||
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
|
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
|
||||||
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
|
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
|
||||||
@ -300,8 +300,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
|
|||||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA=
|
golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA=
|
||||||
golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
|
golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
|
||||||
golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw=
|
golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc=
|
||||||
golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
|
golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w=
|
||||||
golang.org/x/image v0.6.0 h1:bR8b5okrPI3g/gyZakLZHeWxAR8Dn5CyxXv1hLH5g/4=
|
golang.org/x/image v0.6.0 h1:bR8b5okrPI3g/gyZakLZHeWxAR8Dn5CyxXv1hLH5g/4=
|
||||||
golang.org/x/image v0.6.0/go.mod h1:MXLdDR43H7cDJq5GEGXEVeeNhPgi+YYEQ2pC1byI1x0=
|
golang.org/x/image v0.6.0/go.mod h1:MXLdDR43H7cDJq5GEGXEVeeNhPgi+YYEQ2pC1byI1x0=
|
||||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
@ -311,7 +311,7 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
|||||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||||
golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc=
|
golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk=
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
@ -330,8 +330,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ
|
|||||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
|
golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI=
|
||||||
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
|
golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
@ -365,10 +365,12 @@ golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtn
|
|||||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
|
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||||
golang.org/x/tools v0.11.0 h1:EMCa6U9S2LtZXLAMoWiR/R8dAQFRqbAitmbJ2UKhoi8=
|
golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM=
|
||||||
|
golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import (
|
|||||||
reflect "reflect"
|
reflect "reflect"
|
||||||
time "time"
|
time "time"
|
||||||
|
|
||||||
gomock "go.uber.org/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
drpc "storj.io/drpc"
|
drpc "storj.io/drpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@ -106,10 +106,10 @@ func (p *peer) AcquireDrpcConn(ctx context.Context) (drpc.Conn, error) {
|
|||||||
p.mu.Lock()
|
p.mu.Lock()
|
||||||
if len(p.inactive) == 0 {
|
if len(p.inactive) == 0 {
|
||||||
wait := p.limiter.wait(len(p.active) + int(p.openingWaitCount.Load()))
|
wait := p.limiter.wait(len(p.active) + int(p.openingWaitCount.Load()))
|
||||||
p.mu.Unlock()
|
|
||||||
if wait != nil {
|
|
||||||
p.openingWaitCount.Add(1)
|
p.openingWaitCount.Add(1)
|
||||||
defer p.openingWaitCount.Add(-1)
|
defer p.openingWaitCount.Add(-1)
|
||||||
|
p.mu.Unlock()
|
||||||
|
if wait != nil {
|
||||||
// throttle new connection opening
|
// throttle new connection opening
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
|
|||||||
@ -6,9 +6,9 @@ import (
|
|||||||
"github.com/anyproto/any-sync/net/secureservice/handshake"
|
"github.com/anyproto/any-sync/net/secureservice/handshake"
|
||||||
"github.com/anyproto/any-sync/net/secureservice/handshake/handshakeproto"
|
"github.com/anyproto/any-sync/net/secureservice/handshake/handshakeproto"
|
||||||
"github.com/anyproto/any-sync/net/transport/mock_transport"
|
"github.com/anyproto/any-sync/net/transport/mock_transport"
|
||||||
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"go.uber.org/mock/gomock"
|
|
||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
_ "net/http/pprof"
|
_ "net/http/pprof"
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import (
|
|||||||
reflect "reflect"
|
reflect "reflect"
|
||||||
|
|
||||||
peer "github.com/anyproto/any-sync/net/peer"
|
peer "github.com/anyproto/any-sync/net/peer"
|
||||||
gomock "go.uber.org/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockPool is a mock of Pool interface.
|
// MockPool is a mock of Pool interface.
|
||||||
|
|||||||
@ -9,9 +9,9 @@ import (
|
|||||||
"github.com/anyproto/any-sync/nodeconf"
|
"github.com/anyproto/any-sync/nodeconf"
|
||||||
"github.com/anyproto/any-sync/nodeconf/mock_nodeconf"
|
"github.com/anyproto/any-sync/nodeconf/mock_nodeconf"
|
||||||
"github.com/anyproto/any-sync/testutil/testnodeconf"
|
"github.com/anyproto/any-sync/testutil/testnodeconf"
|
||||||
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"go.uber.org/mock/gomock"
|
|
||||||
"net"
|
"net"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|||||||
@ -10,7 +10,7 @@ import (
|
|||||||
reflect "reflect"
|
reflect "reflect"
|
||||||
|
|
||||||
transport "github.com/anyproto/any-sync/net/transport"
|
transport "github.com/anyproto/any-sync/net/transport"
|
||||||
gomock "go.uber.org/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockTransport is a mock of Transport interface.
|
// MockTransport is a mock of Transport interface.
|
||||||
|
|||||||
@ -10,9 +10,9 @@ import (
|
|||||||
"github.com/anyproto/any-sync/nodeconf/mock_nodeconf"
|
"github.com/anyproto/any-sync/nodeconf/mock_nodeconf"
|
||||||
"github.com/anyproto/any-sync/testutil/accounttest"
|
"github.com/anyproto/any-sync/testutil/accounttest"
|
||||||
"github.com/anyproto/any-sync/testutil/testnodeconf"
|
"github.com/anyproto/any-sync/testutil/testnodeconf"
|
||||||
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"go.uber.org/mock/gomock"
|
|
||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
"sync"
|
"sync"
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import (
|
|||||||
app "github.com/anyproto/any-sync/app"
|
app "github.com/anyproto/any-sync/app"
|
||||||
nodeconf "github.com/anyproto/any-sync/nodeconf"
|
nodeconf "github.com/anyproto/any-sync/nodeconf"
|
||||||
chash "github.com/anyproto/go-chash"
|
chash "github.com/anyproto/go-chash"
|
||||||
gomock "go.uber.org/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockService is a mock of Service interface.
|
// MockService is a mock of Service interface.
|
||||||
|
|||||||
@ -7,7 +7,7 @@ package mock_periodicsync
|
|||||||
import (
|
import (
|
||||||
reflect "reflect"
|
reflect "reflect"
|
||||||
|
|
||||||
gomock "go.uber.org/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockPeriodicSync is a mock of PeriodicSync interface.
|
// MockPeriodicSync is a mock of PeriodicSync interface.
|
||||||
|
|||||||
@ -3,8 +3,8 @@ package periodicsync
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/anyproto/any-sync/app/logger"
|
"github.com/anyproto/any-sync/app/logger"
|
||||||
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"go.uber.org/mock/gomock"
|
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user