mirror of
https://github.com/anyproto/any-sync.git
synced 2025-06-08 05:57:03 +09:00
Acl tests
This commit is contained in:
parent
d63187cc8a
commit
f4beb91316
5 changed files with 126 additions and 59 deletions
|
@ -5,7 +5,6 @@ import (
|
|||
"context"
|
||||
"fmt"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
"go.uber.org/mock/gomock"
|
||||
|
@ -18,6 +17,7 @@ import (
|
|||
"github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
||||
"github.com/anyproto/any-sync/consensus/consensusproto"
|
||||
"github.com/anyproto/any-sync/net/peer"
|
||||
"github.com/anyproto/any-sync/net/rpc/rpctest"
|
||||
)
|
||||
|
||||
type pushSpaceRequestMatcher struct {
|
||||
|
@ -56,49 +56,6 @@ func (p pushSpaceRequestMatcher) String() string {
|
|||
return ""
|
||||
}
|
||||
|
||||
type mockPeer struct {
|
||||
}
|
||||
|
||||
func (m mockPeer) CloseChan() <-chan struct{} {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m mockPeer) SetTTL(ttl time.Duration) {
|
||||
return
|
||||
}
|
||||
|
||||
func (m mockPeer) Id() string {
|
||||
return "peerId"
|
||||
}
|
||||
|
||||
func (m mockPeer) Context() context.Context {
|
||||
return context.Background()
|
||||
}
|
||||
|
||||
func (m mockPeer) AcquireDrpcConn(ctx context.Context) (drpc.Conn, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (m mockPeer) ReleaseDrpcConn(conn drpc.Conn) {
|
||||
return
|
||||
}
|
||||
|
||||
func (m mockPeer) DoDrpc(ctx context.Context, do func(conn drpc.Conn) error) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m mockPeer) IsClosed() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (m mockPeer) TryClose(objectTTL time.Duration) (res bool, err error) {
|
||||
return false, err
|
||||
}
|
||||
|
||||
func (m mockPeer) Close() (err error) {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (fx *headSyncFixture) initDiffSyncer(t *testing.T) {
|
||||
fx.init(t)
|
||||
fx.diffSyncer = newDiffSyncer(fx.headSync).(*diffSyncer)
|
||||
|
@ -116,7 +73,7 @@ func TestDiffSyncer(t *testing.T) {
|
|||
fx := newHeadSyncFixture(t)
|
||||
fx.initDiffSyncer(t)
|
||||
defer fx.stop()
|
||||
mPeer := mockPeer{}
|
||||
mPeer := rpctest.MockPeer{}
|
||||
remDiff := NewRemoteDiff(fx.spaceState.SpaceId, fx.clientMock)
|
||||
fx.aclMock.EXPECT().Id().AnyTimes().Return("aclId")
|
||||
fx.treeSyncerMock.EXPECT().ShouldSync(gomock.Any()).Return(true)
|
||||
|
@ -139,7 +96,7 @@ func TestDiffSyncer(t *testing.T) {
|
|||
fx := newHeadSyncFixture(t)
|
||||
fx.initDiffSyncer(t)
|
||||
defer fx.stop()
|
||||
mPeer := mockPeer{}
|
||||
mPeer := rpctest.MockPeer{}
|
||||
remDiff := NewRemoteDiff(fx.spaceState.SpaceId, fx.clientMock)
|
||||
fx.treeSyncerMock.EXPECT().ShouldSync(gomock.Any()).Return(true)
|
||||
fx.aclMock.EXPECT().Id().AnyTimes().Return("aclId")
|
||||
|
@ -225,7 +182,7 @@ func TestDiffSyncer(t *testing.T) {
|
|||
|
||||
fx.peerManagerMock.EXPECT().
|
||||
GetResponsiblePeers(gomock.Any()).
|
||||
Return([]peer.Peer{mockPeer{}}, nil)
|
||||
Return([]peer.Peer{rpctest.MockPeer{}}, nil)
|
||||
fx.diffContainerMock.EXPECT().
|
||||
DiffTypeCheck(gomock.Any(), gomock.Eq(remDiff)).Return(true, fx.diffMock, nil)
|
||||
fx.diffMock.EXPECT().
|
||||
|
@ -261,7 +218,7 @@ func TestDiffSyncer(t *testing.T) {
|
|||
fx.treeSyncerMock.EXPECT().ShouldSync(gomock.Any()).Return(true)
|
||||
fx.peerManagerMock.EXPECT().
|
||||
GetResponsiblePeers(gomock.Any()).
|
||||
Return([]peer.Peer{mockPeer{}}, nil)
|
||||
Return([]peer.Peer{rpctest.MockPeer{}}, nil)
|
||||
fx.diffContainerMock.EXPECT().
|
||||
DiffTypeCheck(gomock.Any(), gomock.Eq(remDiff)).Return(true, fx.diffMock, nil)
|
||||
fx.diffMock.EXPECT().
|
||||
|
@ -275,7 +232,7 @@ func TestDiffSyncer(t *testing.T) {
|
|||
fx := newHeadSyncFixture(t)
|
||||
fx.initDiffSyncer(t)
|
||||
defer fx.stop()
|
||||
mPeer := mockPeer{}
|
||||
mPeer := rpctest.MockPeer{}
|
||||
remDiff := NewRemoteDiff(fx.spaceState.SpaceId, fx.clientMock)
|
||||
fx.treeSyncerMock.EXPECT().ShouldSync(gomock.Any()).Return(true)
|
||||
fx.aclMock.EXPECT().Id().AnyTimes().Return("aclId")
|
||||
|
|
|
@ -28,6 +28,7 @@ func (r *requestFactory) CreateHeadUpdate(l list.AclList, added []*consensusprot
|
|||
}
|
||||
|
||||
func (r *requestFactory) CreateEmptyFullSyncRequest(l list.AclList) (req *consensusproto.LogSyncMessage) {
|
||||
// this is only sent to newer versions of the protocol
|
||||
return consensusproto.WrapFullRequest(&consensusproto.LogFullSyncRequest{
|
||||
Head: l.Head().Id,
|
||||
}, l.Root())
|
||||
|
|
56
commonspace/object/acl/syncacl/syncacl_test.go
Normal file
56
commonspace/object/acl/syncacl/syncacl_test.go
Normal file
|
@ -0,0 +1,56 @@
|
|||
package syncacl
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
"go.uber.org/mock/gomock"
|
||||
|
||||
"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/anyproto/any-sync/net/peer"
|
||||
"github.com/anyproto/any-sync/net/rpc/rpctest"
|
||||
"github.com/anyproto/any-sync/net/secureservice"
|
||||
)
|
||||
|
||||
var ctx = context.Background()
|
||||
|
||||
func TestSyncAcl_SyncWithPeer(t *testing.T) {
|
||||
// this component will be rewritten, so no need for fixture now
|
||||
t.Run("sync with old peer", func(t *testing.T) {
|
||||
ctrl := gomock.NewController(t)
|
||||
acl := mock_list.NewMockAclList(ctrl)
|
||||
s := &syncAcl{AclList: acl}
|
||||
defer ctrl.Finish()
|
||||
mockClient := mock_syncacl.NewMockSyncClient(ctrl)
|
||||
s.syncClient = mockClient
|
||||
ctx := peer.CtxWithProtoVersion(ctx, secureservice.ProtoVersion)
|
||||
pr := rpctest.MockPeer{Ctx: ctx}
|
||||
retMsg := &consensusproto.LogSyncMessage{}
|
||||
mockClient.EXPECT().CreateHeadUpdate(s, nil).Return(retMsg)
|
||||
acl.EXPECT().Lock()
|
||||
acl.EXPECT().Unlock()
|
||||
mockClient.EXPECT().SendUpdate("peerId", retMsg).Return(nil)
|
||||
err := s.SyncWithPeer(ctx, &pr)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
t.Run("sync with new peer", func(t *testing.T) {
|
||||
ctrl := gomock.NewController(t)
|
||||
acl := mock_list.NewMockAclList(ctrl)
|
||||
s := &syncAcl{AclList: acl}
|
||||
defer ctrl.Finish()
|
||||
mockClient := mock_syncacl.NewMockSyncClient(ctrl)
|
||||
s.syncClient = mockClient
|
||||
ctx := peer.CtxWithProtoVersion(ctx, secureservice.NewSyncProtoVersion)
|
||||
pr := rpctest.MockPeer{Ctx: ctx}
|
||||
req := &consensusproto.LogSyncMessage{}
|
||||
mockClient.EXPECT().CreateEmptyFullSyncRequest(s).Return(req)
|
||||
acl.EXPECT().Lock()
|
||||
acl.EXPECT().Unlock()
|
||||
mockClient.EXPECT().QueueRequest("peerId", req).Return(nil)
|
||||
err := s.SyncWithPeer(ctx, &pr)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
}
|
|
@ -3,16 +3,18 @@ package syncacl
|
|||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"sync"
|
||||
"testing"
|
||||
|
||||
"github.com/gogo/protobuf/proto"
|
||||
"github.com/stretchr/testify/require"
|
||||
"go.uber.org/mock/gomock"
|
||||
|
||||
"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 {
|
||||
|
@ -110,7 +112,7 @@ func TestSyncAclHandler_HandleMessage(t *testing.T) {
|
|||
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)
|
||||
err := fx.syncHandler.HandleMessage(ctx, fx.senderId, 0, objectMsg)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
t.Run("handle head update, no request", func(t *testing.T) {
|
||||
|
@ -127,7 +129,7 @@ func TestSyncAclHandler_HandleMessage(t *testing.T) {
|
|||
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)
|
||||
err := fx.syncHandler.HandleMessage(ctx, fx.senderId, 0, objectMsg)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
t.Run("handle head update, returned error", func(t *testing.T) {
|
||||
|
@ -145,7 +147,7 @@ func TestSyncAclHandler_HandleMessage(t *testing.T) {
|
|||
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)
|
||||
err := fx.syncHandler.HandleMessage(ctx, fx.senderId, 0, objectMsg)
|
||||
require.Error(t, expectedErr, err)
|
||||
})
|
||||
t.Run("handle full sync request is forbidden", func(t *testing.T) {
|
||||
|
@ -160,7 +162,7 @@ func TestSyncAclHandler_HandleMessage(t *testing.T) {
|
|||
objectMsg, _ := spacesyncproto.MarshallSyncMessage(logMessage, fx.spaceId, fx.aclId)
|
||||
|
||||
fx.aclMock.EXPECT().Id().AnyTimes().Return(fx.aclId)
|
||||
err := fx.syncHandler.HandleMessage(ctx, fx.senderId, objectMsg)
|
||||
err := fx.syncHandler.HandleMessage(ctx, fx.senderId, 0, objectMsg)
|
||||
require.Error(t, ErrMessageIsRequest, err)
|
||||
})
|
||||
t.Run("handle full sync response, no error", func(t *testing.T) {
|
||||
|
@ -177,7 +179,7 @@ func TestSyncAclHandler_HandleMessage(t *testing.T) {
|
|||
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)
|
||||
err := fx.syncHandler.HandleMessage(ctx, fx.senderId, 0, objectMsg)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
}
|
||||
|
|
|
@ -2,6 +2,10 @@ package rpctest
|
|||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"storj.io/drpc"
|
||||
|
||||
"github.com/anyproto/any-sync/net/peer"
|
||||
"github.com/anyproto/any-sync/net/rpc/rpctest/multiconntest"
|
||||
"github.com/anyproto/any-sync/net/transport"
|
||||
|
@ -10,3 +14,50 @@ import (
|
|||
func MultiConnPair(peerIdServ, peerIdClient string) (serv, client transport.MultiConn) {
|
||||
return multiconntest.MultiConnPair(peer.CtxWithPeerId(context.Background(), peerIdServ), peer.CtxWithPeerId(context.Background(), peerIdClient))
|
||||
}
|
||||
|
||||
type MockPeer struct {
|
||||
Ctx context.Context
|
||||
}
|
||||
|
||||
func (m MockPeer) CloseChan() <-chan struct{} {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m MockPeer) SetTTL(ttl time.Duration) {
|
||||
return
|
||||
}
|
||||
|
||||
func (m MockPeer) Id() string {
|
||||
return "peerId"
|
||||
}
|
||||
|
||||
func (m MockPeer) Context() context.Context {
|
||||
if m.Ctx != nil {
|
||||
return m.Ctx
|
||||
}
|
||||
return context.Background()
|
||||
}
|
||||
|
||||
func (m MockPeer) AcquireDrpcConn(ctx context.Context) (drpc.Conn, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (m MockPeer) ReleaseDrpcConn(conn drpc.Conn) {
|
||||
return
|
||||
}
|
||||
|
||||
func (m MockPeer) DoDrpc(ctx context.Context, do func(conn drpc.Conn) error) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m MockPeer) IsClosed() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (m MockPeer) TryClose(objectTTL time.Duration) (res bool, err error) {
|
||||
return false, err
|
||||
}
|
||||
|
||||
func (m MockPeer) Close() (err error) {
|
||||
return nil
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue