github.com/status-im/status-go@v1.1.0/protocol/messenger_sync_chat_test.go (about)

     1  package protocol
     2  
     3  import (
     4  	"context"
     5  	"crypto/ecdsa"
     6  	"errors"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/suite"
    10  	"go.uber.org/zap"
    11  
    12  	gethbridge "github.com/status-im/status-go/eth-node/bridge/geth"
    13  	"github.com/status-im/status-go/eth-node/crypto"
    14  	"github.com/status-im/status-go/eth-node/types"
    15  	"github.com/status-im/status-go/protocol/common"
    16  	"github.com/status-im/status-go/protocol/encryption/multidevice"
    17  	"github.com/status-im/status-go/protocol/tt"
    18  	"github.com/status-im/status-go/waku"
    19  )
    20  
    21  const publicChatName = "status"
    22  
    23  func TestMessengerSyncChatSuite(t *testing.T) {
    24  	suite.Run(t, new(MessengerSyncChatSuite))
    25  }
    26  
    27  type MessengerSyncChatSuite struct {
    28  	suite.Suite
    29  	privateKey *ecdsa.PrivateKey
    30  	alice1     *Messenger
    31  	alice2     *Messenger
    32  	// If one wants to send messages between different instances of Messenger,
    33  	// a single Waku service should be shared.
    34  	shh    types.Waku
    35  	logger *zap.Logger
    36  }
    37  
    38  func (s *MessengerSyncChatSuite) newMessenger() *Messenger {
    39  	if s.privateKey == nil {
    40  		privateKey, err := crypto.GenerateKey()
    41  		s.Require().NoError(err)
    42  
    43  		s.privateKey = privateKey
    44  	}
    45  
    46  	messenger, err := newMessengerWithKey(s.shh, s.privateKey, s.logger, nil)
    47  	s.Require().NoError(err)
    48  	return messenger
    49  }
    50  
    51  func (s *MessengerSyncChatSuite) otherNewMessenger() *Messenger {
    52  	privateKey, err := crypto.GenerateKey()
    53  	s.Require().NoError(err)
    54  
    55  	messenger, err := newMessengerWithKey(s.shh, privateKey, s.logger, nil)
    56  	s.Require().NoError(err)
    57  	return messenger
    58  }
    59  
    60  func (s *MessengerSyncChatSuite) SetupTest() {
    61  	s.logger = tt.MustCreateTestLogger()
    62  
    63  	config := waku.DefaultConfig
    64  	config.MinimumAcceptedPoW = 0
    65  	shh := waku.New(&config, s.logger)
    66  	s.shh = gethbridge.NewGethWakuWrapper(shh)
    67  	s.Require().NoError(shh.Start())
    68  
    69  	s.alice1 = s.newMessenger()
    70  	s.alice2 = s.newMessenger()
    71  }
    72  
    73  func (s *MessengerSyncChatSuite) TearDownTest() {
    74  	TearDownMessenger(&s.Suite, s.alice1)
    75  	TearDownMessenger(&s.Suite, s.alice2)
    76  	_ = s.logger.Sync()
    77  }
    78  
    79  func (s *MessengerSyncChatSuite) Pair() {
    80  	err := s.alice2.SetInstallationMetadata(s.alice2.installationID, &multidevice.InstallationMetadata{
    81  		Name:       "alice2",
    82  		DeviceType: "alice2",
    83  	})
    84  	s.Require().NoError(err)
    85  	response, err := s.alice2.SendPairInstallation(context.Background(), nil)
    86  	s.Require().NoError(err)
    87  	s.Require().NotNil(response)
    88  	s.Require().Len(response.Chats(), 1)
    89  	s.Require().False(response.Chats()[0].Active)
    90  
    91  	// Wait for the message to reach its destination
    92  	response, err = WaitOnMessengerResponse(
    93  		s.alice1,
    94  		func(r *MessengerResponse) bool { return len(r.Installations()) > 0 },
    95  		"installation not received",
    96  	)
    97  
    98  	s.Require().NoError(err)
    99  	actualInstallation := response.Installations()[0]
   100  	s.Require().Equal(s.alice2.installationID, actualInstallation.ID)
   101  	s.Require().NotNil(actualInstallation.InstallationMetadata)
   102  	s.Require().Equal("alice2", actualInstallation.InstallationMetadata.Name)
   103  	s.Require().Equal("alice2", actualInstallation.InstallationMetadata.DeviceType)
   104  
   105  	err = s.alice1.EnableInstallation(s.alice2.installationID)
   106  	s.Require().NoError(err)
   107  }
   108  
   109  func (s *MessengerSyncChatSuite) TestRemovePubChat() {
   110  	chat := CreatePublicChat(publicChatName, s.alice1.transport)
   111  	err := s.alice1.SaveChat(chat)
   112  	s.Require().NoError(err)
   113  
   114  	chat = CreatePublicChat(publicChatName, s.alice2.transport)
   115  	err = s.alice2.SaveChat(chat)
   116  	s.Require().NoError(err)
   117  
   118  	s.Pair()
   119  
   120  	_, err = s.alice1.deactivateChat(publicChatName, 0, true, true)
   121  	s.Require().NoError(err)
   122  
   123  	var allChats []*Chat
   124  	// Wait for the message to reach its destination
   125  	err = tt.RetryWithBackOff(func() error {
   126  		var err error
   127  		response, err := s.alice2.RetrieveAll()
   128  		if err != nil {
   129  			return err
   130  		}
   131  
   132  		allChats = append(allChats, response.Chats()...)
   133  		if len(allChats) >= 1 {
   134  			return nil
   135  		}
   136  
   137  		return errors.New("Not received all chats & contacts")
   138  	})
   139  	s.Require().NoError(err)
   140  
   141  	var statusChat *Chat
   142  	for _, c := range allChats {
   143  		if c.ID == publicChatName {
   144  			statusChat = c
   145  		}
   146  	}
   147  
   148  	s.Require().NotNil(statusChat)
   149  	s.Require().False(statusChat.Active)
   150  }
   151  
   152  func (s *MessengerSyncChatSuite) TestMarkChatMessagesRead() {
   153  	s.Pair()
   154  	chatID := "foobarsynctest"
   155  	_, err := s.alice1.createPublicChat(chatID, &MessengerResponse{})
   156  	s.Require().NoError(err)
   157  
   158  	_, err = s.alice2.createPublicChat(chatID, &MessengerResponse{})
   159  	s.Require().NoError(err)
   160  
   161  	otherMessenger := s.otherNewMessenger()
   162  	_, err = otherMessenger.createPublicChat(chatID, &MessengerResponse{})
   163  	s.Require().NoError(err)
   164  
   165  	chat := otherMessenger.Chat(chatID)
   166  	message := buildTestMessage(*chat)
   167  
   168  	_, err = otherMessenger.SendChatMessage(context.Background(), message)
   169  	s.Require().NoError(err)
   170  
   171  	var receivedPubChatMessage *common.Message
   172  	err = tt.RetryWithBackOff(func() error {
   173  		var err error
   174  		response, err := s.alice2.RetrieveAll()
   175  		if err != nil {
   176  			return err
   177  		}
   178  
   179  		messages := response.Messages()
   180  		if len(messages) > 0 {
   181  			receivedPubChatMessage = messages[0]
   182  			return nil
   183  		}
   184  
   185  		return errors.New("Not received all messages")
   186  	})
   187  	s.Require().NoError(err)
   188  	s.Require().Equal(receivedPubChatMessage.ChatId, chatID)
   189  
   190  	alice2chat := s.alice2.Chat(chatID)
   191  	s.Require().Equal(alice2chat.UnviewedMessagesCount, uint(1))
   192  
   193  	_, err = s.alice1.MarkAllRead(context.TODO(), chatID)
   194  	s.Require().NoError(err)
   195  
   196  	var receivedChat *Chat
   197  	err = tt.RetryWithBackOff(func() error {
   198  		var err error
   199  		response, err := s.alice2.RetrieveAll()
   200  		if err != nil {
   201  			return err
   202  		}
   203  
   204  		chats := response.Chats()
   205  		if len(chats) > 0 {
   206  			receivedChat = chats[0]
   207  			return nil
   208  		}
   209  
   210  		return errors.New("Not received all messages")
   211  	})
   212  	s.Require().NoError(err)
   213  
   214  	s.Require().Equal(receivedChat.ID, chatID)
   215  	s.Require().Equal(receivedChat.UnviewedMessagesCount, uint(0))
   216  }