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 }