101 lines
3.3 KiB
Go
101 lines
3.3 KiB
Go
package protocol
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/suite"
|
|
|
|
"github.com/ethereum/go-ethereum/crypto"
|
|
"github.com/status-im/status-go/eth-node/types"
|
|
"github.com/status-im/status-go/protocol/common"
|
|
"github.com/status-im/status-go/protocol/protobuf"
|
|
"github.com/status-im/status-go/protocol/requests"
|
|
)
|
|
|
|
type MessengerSyncContactRequestDecisionSuite struct {
|
|
MessengerBaseTestSuite
|
|
m2 *Messenger
|
|
}
|
|
|
|
func TestMessengerSyncContactRequestDecision(t *testing.T) {
|
|
suite.Run(t, new(MessengerSyncContactRequestDecisionSuite))
|
|
}
|
|
|
|
func (s *MessengerSyncContactRequestDecisionSuite) SetupTest() {
|
|
s.MessengerBaseTestSuite.SetupTest()
|
|
|
|
m2, err := newMessengerWithKey(s.shh, s.privateKey, s.logger, nil)
|
|
s.Require().NoError(err)
|
|
s.m2 = m2
|
|
|
|
PairDevices(&s.Suite, m2, s.m)
|
|
PairDevices(&s.Suite, s.m, m2)
|
|
}
|
|
|
|
func (s *MessengerSyncContactRequestDecisionSuite) TearDownTest() {
|
|
s.Require().NoError(s.m2.Shutdown())
|
|
s.MessengerBaseTestSuite.TearDownTest()
|
|
}
|
|
|
|
func (s *MessengerSyncContactRequestDecisionSuite) createUserB() *Messenger {
|
|
key, err := crypto.GenerateKey()
|
|
s.Require().NoError(err)
|
|
userB, err := newMessengerWithKey(s.shh, key, s.logger, nil)
|
|
s.Require().NoError(err)
|
|
return userB
|
|
}
|
|
|
|
func (s *MessengerSyncContactRequestDecisionSuite) TestSyncAcceptContactRequest() {
|
|
userB := s.createUserB()
|
|
defer func() {
|
|
s.Require().NoError(userB.Shutdown())
|
|
}()
|
|
|
|
numM1DispatchedAcceptContactRequest := 0
|
|
numM2DispatchedAcceptContactRequest := 0
|
|
s.m.dispatchMessageTestCallback = func(message common.RawMessage) {
|
|
if message.MessageType == protobuf.ApplicationMetadataMessage_ACCEPT_CONTACT_REQUEST {
|
|
numM1DispatchedAcceptContactRequest++
|
|
}
|
|
}
|
|
s.m2.dispatchMessageTestCallback = func(message common.RawMessage) {
|
|
if message.MessageType == protobuf.ApplicationMetadataMessage_ACCEPT_CONTACT_REQUEST {
|
|
numM2DispatchedAcceptContactRequest++
|
|
}
|
|
}
|
|
// send contact request to m/m2, m and m2 are paired
|
|
request := &requests.AddContact{ID: common.PubkeyToHex(&s.m2.identity.PublicKey)}
|
|
_, err := userB.AddContact(context.Background(), request)
|
|
s.Require().NoError(err)
|
|
|
|
// check m and m2 received contact request
|
|
var contactRequestMessageID types.HexBytes
|
|
receivedContactRequestCondition := func(r *MessengerResponse) bool {
|
|
for _, n := range r.ActivityCenterNotifications() {
|
|
if n.Type == ActivityCenterNotificationTypeContactRequest {
|
|
contactRequestMessageID = n.ID
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
_, err = WaitOnMessengerResponse(s.m, receivedContactRequestCondition, "contact request not received on device 1")
|
|
s.Require().NoError(err)
|
|
_, err = WaitOnMessengerResponse(s.m2, receivedContactRequestCondition, "contact request not received on device 2")
|
|
s.Require().NoError(err)
|
|
|
|
// m accept contact request from userB
|
|
_, err = s.m.AcceptContactRequest(context.Background(), &requests.AcceptContactRequest{ID: contactRequestMessageID})
|
|
s.Require().NoError(err)
|
|
|
|
// check sync contact request decision processed for m2
|
|
_, err = WaitOnMessengerResponse(s.m2, func(r *MessengerResponse) bool {
|
|
return len(r.Contacts) > 0
|
|
}, "contact request not accepted on device 2")
|
|
s.Require().NoError(err)
|
|
|
|
s.Require().Equal(1, numM1DispatchedAcceptContactRequest, "we should dispatch only 1 accept contact request message")
|
|
s.Require().Equal(0, numM2DispatchedAcceptContactRequest, "we should not dispatch accept contact request message")
|
|
}
|