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 }