mirror of
https://github.com/status-im/status-go.git
synced 2025-01-27 23:18:40 +00:00
0ff2542939
When sending a contact update we automatically added the contact, but that resulted in the contact not being synced correctly as `saveContact` will not trigger the side effects. For now I have removed this behavior. Ideally we should have a single call that handles the side effects, but for that ENS names should be stored in messenger, so we can propagate it.
152 lines
4.4 KiB
Go
152 lines
4.4 KiB
Go
package protocol
|
|
|
|
import (
|
|
"context"
|
|
"crypto/ecdsa"
|
|
"io/ioutil"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/google/uuid"
|
|
"github.com/stretchr/testify/suite"
|
|
"go.uber.org/zap"
|
|
|
|
gethbridge "github.com/status-im/status-go/eth-node/bridge/geth"
|
|
"github.com/status-im/status-go/eth-node/crypto"
|
|
"github.com/status-im/status-go/eth-node/types"
|
|
"github.com/status-im/status-go/protocol/tt"
|
|
"github.com/status-im/status-go/waku"
|
|
)
|
|
|
|
func TestMessengerContactUpdateSuite(t *testing.T) {
|
|
suite.Run(t, new(MessengerContactUpdateSuite))
|
|
}
|
|
|
|
type MessengerContactUpdateSuite struct {
|
|
suite.Suite
|
|
m *Messenger // main instance of Messenger
|
|
privateKey *ecdsa.PrivateKey // private key for the main instance of Messenger
|
|
// If one wants to send messages between different instances of Messenger,
|
|
// a single waku service should be shared.
|
|
shh types.Waku
|
|
tmpFiles []*os.File // files to clean up
|
|
logger *zap.Logger
|
|
}
|
|
|
|
func (s *MessengerContactUpdateSuite) SetupTest() {
|
|
s.logger = tt.MustCreateTestLogger()
|
|
|
|
config := waku.DefaultConfig
|
|
config.MinimumAcceptedPoW = 0
|
|
shh := waku.New(&config, s.logger)
|
|
s.shh = gethbridge.NewGethWakuWrapper(shh)
|
|
s.Require().NoError(shh.Start(nil))
|
|
|
|
s.m = s.newMessenger(s.shh)
|
|
s.privateKey = s.m.identity
|
|
s.Require().NoError(s.m.Start())
|
|
}
|
|
|
|
func (s *MessengerContactUpdateSuite) TearDownTest() {
|
|
s.Require().NoError(s.m.Shutdown())
|
|
}
|
|
|
|
func (s *MessengerContactUpdateSuite) newMessengerWithKey(shh types.Waku, privateKey *ecdsa.PrivateKey) *Messenger {
|
|
tmpFile, err := ioutil.TempFile("", "")
|
|
s.Require().NoError(err)
|
|
|
|
options := []Option{
|
|
WithCustomLogger(s.logger),
|
|
WithMessagesPersistenceEnabled(),
|
|
WithDatabaseConfig(tmpFile.Name(), "some-key"),
|
|
WithDatasync(),
|
|
}
|
|
m, err := NewMessenger(
|
|
privateKey,
|
|
&testNode{shh: shh},
|
|
uuid.New().String(),
|
|
options...,
|
|
)
|
|
s.Require().NoError(err)
|
|
|
|
err = m.Init()
|
|
s.Require().NoError(err)
|
|
|
|
s.tmpFiles = append(s.tmpFiles, tmpFile)
|
|
|
|
return m
|
|
}
|
|
|
|
func (s *MessengerContactUpdateSuite) newMessenger(shh types.Waku) *Messenger {
|
|
privateKey, err := crypto.GenerateKey()
|
|
s.Require().NoError(err)
|
|
|
|
return s.newMessengerWithKey(s.shh, privateKey)
|
|
}
|
|
|
|
func (s *MessengerContactUpdateSuite) TestReceiveContactUpdate() {
|
|
theirName := "ens-name.stateofus.eth"
|
|
theirPicture := "their-picture"
|
|
contactID := types.EncodeHex(crypto.FromECDSAPub(&s.m.identity.PublicKey))
|
|
|
|
theirMessenger := s.newMessenger(s.shh)
|
|
s.Require().NoError(theirMessenger.Start())
|
|
theirContactID := types.EncodeHex(crypto.FromECDSAPub(&theirMessenger.identity.PublicKey))
|
|
|
|
response, err := theirMessenger.SendContactUpdate(context.Background(), contactID, theirName, theirPicture)
|
|
s.Require().NoError(err)
|
|
s.Require().NotNil(response)
|
|
|
|
s.Require().Len(response.Contacts, 1)
|
|
contact := response.Contacts[0]
|
|
// It should not add the contact, as that's left to `SaveContact`
|
|
s.Require().False(contact.IsAdded())
|
|
|
|
// add contact
|
|
contact.SystemTags = []string{contactAdded}
|
|
s.Require().NoError(theirMessenger.SaveContact(contact))
|
|
|
|
s.Require().Len(response.Chats, 1)
|
|
chat := response.Chats[0]
|
|
s.Require().False(chat.Active, "It does not create an active chat")
|
|
|
|
// Wait for the message to reach its destination
|
|
response, err = WaitOnMessengerResponse(
|
|
s.m,
|
|
func(r *MessengerResponse) bool { return len(r.Contacts) > 0 },
|
|
"contact request not received",
|
|
)
|
|
s.Require().NoError(err)
|
|
|
|
receivedContact := response.Contacts[0]
|
|
s.Require().Equal(theirName, receivedContact.Name)
|
|
s.Require().Equal(theirPicture, receivedContact.Photo)
|
|
s.Require().False(receivedContact.ENSVerified)
|
|
s.Require().True(receivedContact.HasBeenAdded())
|
|
s.Require().NotEmpty(receivedContact.LastUpdated)
|
|
|
|
newPicture := "new-picture"
|
|
err = theirMessenger.SendContactUpdates(context.Background(), newName, newPicture)
|
|
s.Require().NoError(err)
|
|
|
|
// Wait for the message to reach its destination
|
|
response, err = WaitOnMessengerResponse(
|
|
s.m,
|
|
func(r *MessengerResponse) bool {
|
|
return len(r.Contacts) > 0 && response.Contacts[0].ID == theirContactID
|
|
},
|
|
"contact request not received",
|
|
)
|
|
|
|
s.Require().NoError(err)
|
|
|
|
receivedContact = response.Contacts[0]
|
|
s.Require().Equal(theirContactID, receivedContact.ID)
|
|
s.Require().Equal(newName, receivedContact.Name)
|
|
s.Require().Equal(newPicture, receivedContact.Photo)
|
|
s.Require().False(receivedContact.ENSVerified)
|
|
s.Require().True(receivedContact.HasBeenAdded())
|
|
s.Require().NotEmpty(receivedContact.LastUpdated)
|
|
s.Require().NoError(theirMessenger.Shutdown())
|
|
}
|