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

     1  package protocol
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"fmt"
     7  	"testing"
     8  
     9  	"github.com/status-im/status-go/images"
    10  	"github.com/status-im/status-go/protocol/encryption/multidevice"
    11  	"github.com/status-im/status-go/protocol/tt"
    12  
    13  	"github.com/stretchr/testify/suite"
    14  )
    15  
    16  func TestMessengerSyncProfilePictureSuite(t *testing.T) {
    17  	suite.Run(t, new(MessengerSyncProfilePictureSuite))
    18  }
    19  
    20  type MessengerSyncProfilePictureSuite struct {
    21  	MessengerBaseTestSuite
    22  }
    23  
    24  func (s *MessengerSyncProfilePictureSuite) TestSyncProfilePicture() {
    25  
    26  	// Add identity images
    27  	keyUID := s.m.account.KeyUID
    28  
    29  	// pair
    30  	theirMessenger, err := newMessengerWithKey(s.shh, s.privateKey, s.logger, nil)
    31  	s.Require().NoError(err)
    32  
    33  	err = theirMessenger.SetInstallationMetadata(theirMessenger.installationID, &multidevice.InstallationMetadata{
    34  		Name:       "their-name",
    35  		DeviceType: "their-device-type",
    36  	})
    37  	s.Require().NoError(err)
    38  	response, err := theirMessenger.SendPairInstallation(context.Background(), nil)
    39  	s.Require().NoError(err)
    40  	s.Require().NotNil(response)
    41  	s.Require().Len(response.Chats(), 1)
    42  	s.Require().False(response.Chats()[0].Active)
    43  
    44  	// Wait for the message to reach its destination
    45  	response, err = WaitOnMessengerResponse(
    46  		s.m,
    47  		func(r *MessengerResponse) bool { return len(r.Installations()) > 0 },
    48  		"installation not received",
    49  	)
    50  
    51  	s.Require().NoError(err)
    52  	actualInstallation := response.Installations()[0]
    53  	s.Require().Equal(theirMessenger.installationID, actualInstallation.ID)
    54  	s.Require().NotNil(actualInstallation.InstallationMetadata)
    55  	s.Require().Equal("their-name", actualInstallation.InstallationMetadata.Name)
    56  	s.Require().Equal("their-device-type", actualInstallation.InstallationMetadata.DeviceType)
    57  
    58  	err = s.m.EnableInstallation(theirMessenger.installationID)
    59  	s.Require().NoError(err)
    60  
    61  	// Sync happens via subscription triggered from within StoreIdentityImages
    62  	const (
    63  		lowClock  = 5
    64  		highClock = 10
    65  	)
    66  
    67  	iis := images.SampleIdentityImages()
    68  	for i := range iis {
    69  		iis[i].Clock = highClock
    70  	}
    71  	s.Require().NoError(s.m.multiAccounts.StoreIdentityImages(keyUID, iis, true))
    72  
    73  	// Wait for the message to reach its destination
    74  	err = tt.RetryWithBackOff(func() error {
    75  		response, err = theirMessenger.RetrieveAll()
    76  		if err != nil {
    77  			return err
    78  		}
    79  
    80  		syncedImages, err := theirMessenger.multiAccounts.GetIdentityImages(keyUID)
    81  		if err != nil {
    82  			return err
    83  		}
    84  
    85  		if len(syncedImages) == 2 {
    86  			return nil
    87  		}
    88  
    89  		return errors.New("not received all identity images")
    90  	})
    91  
    92  	s.Require().NoError(err)
    93  
    94  	syncedImages, err := theirMessenger.multiAccounts.GetIdentityImages(keyUID)
    95  	s.Require().NoError(err)
    96  	s.Require().Equal(2, len(syncedImages))
    97  	s.Require().Equal(2, len(response.IdentityImages))
    98  
    99  	// Check that we don't update images with earlier clock values
   100  
   101  	for i := range iis {
   102  		iis[i].Clock = lowClock
   103  	}
   104  	iis2 := images.SampleIdentityImages()
   105  	for i := range iis2 {
   106  		iis2[i].Name = fmt.Sprintf("newimg%d", i)
   107  		iis2[i].Clock = highClock
   108  	}
   109  	iis = append(iis, iis2...)
   110  	s.Require().NoError(s.m.multiAccounts.StoreIdentityImages(keyUID, iis, true))
   111  
   112  	err = tt.RetryWithBackOff(func() error {
   113  		response, err = theirMessenger.RetrieveAll()
   114  		if err != nil {
   115  			return err
   116  		}
   117  
   118  		syncedImages, err := theirMessenger.multiAccounts.GetIdentityImages(keyUID)
   119  		if err != nil {
   120  			return err
   121  		}
   122  
   123  		if len(syncedImages) == 4 {
   124  			return nil
   125  		}
   126  
   127  		return errors.New("not received all identity images")
   128  	})
   129  
   130  	syncedImages, err = theirMessenger.multiAccounts.GetIdentityImages(keyUID)
   131  	s.Require().NoError(err)
   132  	s.Require().Equal(4, len(syncedImages))
   133  	for _, img := range syncedImages {
   134  		s.Require().NotEqual(img.Clock, lowClock)
   135  	}
   136  
   137  	s.Require().NoError(theirMessenger.Shutdown())
   138  }