github.com/hyperledger/aries-framework-go@v0.3.2/pkg/client/connection/client_test.go (about) 1 /* 2 Copyright SecureKey Technologies Inc. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package connection 8 9 import ( 10 "fmt" 11 "testing" 12 13 "github.com/stretchr/testify/require" 14 15 "github.com/hyperledger/aries-framework-go/pkg/didcomm/common/middleware" 16 "github.com/hyperledger/aries-framework-go/pkg/doc/did" 17 vdrapi "github.com/hyperledger/aries-framework-go/pkg/framework/aries/api/vdr" 18 mockcrypto "github.com/hyperledger/aries-framework-go/pkg/mock/crypto" 19 mockdiddoc "github.com/hyperledger/aries-framework-go/pkg/mock/diddoc" 20 mockkms "github.com/hyperledger/aries-framework-go/pkg/mock/kms" 21 mockprovider "github.com/hyperledger/aries-framework-go/pkg/mock/provider" 22 mockstore "github.com/hyperledger/aries-framework-go/pkg/mock/storage" 23 mockvdr "github.com/hyperledger/aries-framework-go/pkg/mock/vdr" 24 "github.com/hyperledger/aries-framework-go/pkg/store/connection" 25 didstore "github.com/hyperledger/aries-framework-go/pkg/store/did" 26 "github.com/hyperledger/aries-framework-go/spi/storage" 27 ) 28 29 const ( 30 mockSignatureValue = "mock-did-rotation-signature" 31 myDID = "did:peer:123456789abcdefghi" 32 theirDID = "did:test:theirDID" 33 connectionID = "test-connection-id" 34 ) 35 36 func mockProvider(t *testing.T) *mockprovider.Provider { 37 t.Helper() 38 39 storeProv := mockstore.NewMockStoreProvider() 40 41 prov := &mockprovider.Provider{ 42 StorageProviderValue: storeProv, 43 ProtocolStateStorageProviderValue: storeProv, 44 } 45 46 prov.VDRegistryValue = &mockvdr.MockVDRegistry{ 47 ResolveFunc: func(didID string, _ ...vdrapi.DIDMethodOption) (*did.DocResolution, error) { 48 switch didID { 49 default: 50 fallthrough 51 case myDID: 52 return &did.DocResolution{ 53 DIDDocument: mockdiddoc.GetMockDIDDocWithKeyAgreements(t), 54 }, nil 55 case theirDID: 56 return &did.DocResolution{ 57 DIDDocument: mockdiddoc.GetMockDIDDocWithDIDCommV2Bloc(t, theirDID), 58 }, nil 59 } 60 }, 61 } 62 63 didStore, err := didstore.NewConnectionStore(prov) 64 require.NoError(t, err) 65 66 prov.DIDConnectionStoreValue = didStore 67 68 prov.CryptoValue = &mockcrypto.Crypto{ 69 SignValue: []byte(mockSignatureValue), 70 } 71 72 prov.KMSValue = &mockkms.KeyManager{} 73 74 didRotator, err := middleware.New(prov) 75 require.NoError(t, err) 76 77 prov.DIDRotatorValue = *didRotator 78 79 return prov 80 } 81 82 func TestNew(t *testing.T) { 83 prov := mockProvider(t) 84 85 _, err := New(prov) 86 require.NoError(t, err) 87 88 expectErr := fmt.Errorf("expected error") 89 90 prov.StorageProviderValue = &mockstore.MockStoreProvider{ErrOpenStoreHandle: expectErr} 91 92 _, err = New(prov) 93 require.ErrorIs(t, err, expectErr) 94 } 95 96 func TestClient_RotateDID(t *testing.T) { 97 c, err := New(mockProvider(t)) 98 require.NoError(t, err) 99 100 _, err = c.RotateDID("a", "b", WithNewDID("c")) 101 require.Error(t, err) 102 } 103 104 func TestClient_CreateConnectionV2(t *testing.T) { 105 expectErr := fmt.Errorf("expected error") 106 107 t.Parallel() 108 109 t.Run("success", func(t *testing.T) { 110 prov := mockProvider(t) 111 112 c, err := New(prov) 113 require.NoError(t, err) 114 115 connID, err := c.CreateConnectionV2(myDID, theirDID, WithTheirLabel("their label")) 116 require.NoError(t, err) 117 require.NotEqual(t, "", connID) 118 }) 119 120 t.Run("fail to resolve their did", func(t *testing.T) { 121 prov := mockProvider(t) 122 123 prov.VDRegistryValue = &mockvdr.MockVDRegistry{ 124 ResolveFunc: func(didID string, _ ...vdrapi.DIDMethodOption) (*did.DocResolution, error) { 125 switch didID { 126 default: 127 fallthrough 128 case myDID: 129 return &did.DocResolution{ 130 DIDDocument: mockdiddoc.GetMockDIDDocWithKeyAgreements(t), 131 }, nil 132 case theirDID: 133 return nil, expectErr 134 } 135 }, 136 } 137 138 c, err := New(prov) 139 require.NoError(t, err) 140 141 connID, err := c.CreateConnectionV2(myDID, theirDID) 142 require.Error(t, err) 143 require.ErrorIs(t, err, expectErr) 144 require.Contains(t, err.Error(), "resolving their DID") 145 require.Equal(t, "", connID) 146 }) 147 148 t.Run("fail to save their did to did store", func(t *testing.T) { 149 prov := mockProvider(t) 150 151 prov.StorageProviderValue = mockstore.NewCustomMockStoreProvider(&mockstore.MockStore{ 152 ErrPut: expectErr, 153 }) 154 155 didStore, err := didstore.NewConnectionStore(prov) 156 require.NoError(t, err) 157 158 prov.DIDConnectionStoreValue = didStore 159 160 c, err := New(prov) 161 require.NoError(t, err) 162 163 connID, err := c.CreateConnectionV2(myDID, theirDID) 164 require.Error(t, err) 165 require.ErrorIs(t, err, expectErr) 166 require.Contains(t, err.Error(), "failed to save theirDID") 167 require.Equal(t, "", connID) 168 }) 169 170 t.Run("fail to resolve my did when saving to did store", func(t *testing.T) { 171 prov := mockProvider(t) 172 173 prov.VDRegistryValue = &mockvdr.MockVDRegistry{ 174 ResolveFunc: func(didID string, _ ...vdrapi.DIDMethodOption) (*did.DocResolution, error) { 175 switch didID { 176 default: 177 fallthrough 178 case myDID: 179 return nil, expectErr 180 case theirDID: 181 return &did.DocResolution{ 182 DIDDocument: mockdiddoc.GetMockDIDDocWithDIDCommV2Bloc(t, theirDID), 183 }, nil 184 } 185 }, 186 } 187 188 didStore, err := didstore.NewConnectionStore(prov) 189 require.NoError(t, err) 190 191 prov.DIDConnectionStoreValue = didStore 192 193 c, err := New(prov) 194 require.NoError(t, err) 195 196 connID, err := c.CreateConnectionV2(myDID, theirDID) 197 require.Error(t, err) 198 require.ErrorIs(t, err, expectErr) 199 require.Contains(t, err.Error(), "failed to save myDID") 200 require.Equal(t, "", connID) 201 }) 202 203 t.Run("fail to resolve my did when saving to did store", func(t *testing.T) { 204 prov := mockProvider(t) 205 206 prov.VDRegistryValue = &mockvdr.MockVDRegistry{ 207 ResolveFunc: func(didID string, _ ...vdrapi.DIDMethodOption) (*did.DocResolution, error) { 208 switch didID { 209 default: 210 fallthrough 211 case myDID: 212 return &did.DocResolution{ 213 DIDDocument: mockdiddoc.GetMockDIDDocWithKeyAgreements(t), 214 }, nil 215 case theirDID: 216 return &did.DocResolution{ 217 DIDDocument: &did.Doc{ 218 ID: theirDID, 219 }, 220 }, nil 221 } 222 }, 223 } 224 225 didStore, err := didstore.NewConnectionStore(prov) 226 require.NoError(t, err) 227 228 prov.DIDConnectionStoreValue = didStore 229 230 c, err := New(prov) 231 require.NoError(t, err) 232 233 connID, err := c.CreateConnectionV2(myDID, theirDID) 234 require.Error(t, err) 235 require.Contains(t, err.Error(), "failed to create destination") 236 require.Equal(t, "", connID) 237 }) 238 239 t.Run("fail to save to connection store", func(t *testing.T) { 240 prov := mockProvider(t) 241 242 prov.ProtocolStateStorageProviderValue = mockstore.NewCustomMockStoreProvider(&mockstore.MockStore{ 243 ErrPut: expectErr, 244 }) 245 246 c, err := New(prov) 247 require.NoError(t, err) 248 249 connID, err := c.CreateConnectionV2(myDID, theirDID) 250 require.Error(t, err) 251 require.ErrorIs(t, err, expectErr) 252 require.Equal(t, "", connID) 253 }) 254 } 255 256 func TestClient_SetConnectionToDIDCommV2(t *testing.T) { 257 t.Parallel() 258 259 t.Run("success", func(t *testing.T) { 260 prov := mockProvider(t) 261 262 connStore, err := connection.NewRecorder(prov) 263 require.NoError(t, err) 264 265 require.NoError(t, connStore.SaveConnectionRecord(&connection.Record{ 266 ConnectionID: connectionID, 267 State: connection.StateNameCompleted, 268 })) 269 270 c, err := New(prov) 271 require.NoError(t, err) 272 273 err = c.SetConnectionToDIDCommV2(connectionID) 274 require.NoError(t, err) 275 }) 276 277 t.Run("fail: connection ID not found", func(t *testing.T) { 278 prov := mockProvider(t) 279 280 c, err := New(prov) 281 require.NoError(t, err) 282 283 err = c.SetConnectionToDIDCommV2(connectionID) 284 require.Error(t, err) 285 require.ErrorIs(t, err, storage.ErrDataNotFound) 286 }) 287 288 t.Run("fail: saving updated connection", func(t *testing.T) { 289 prov := mockProvider(t) 290 291 store := mockstore.MockStore{Store: map[string]mockstore.DBEntry{}} 292 293 prov.StorageProviderValue = mockstore.NewCustomMockStoreProvider(&store) 294 295 connStore, err := connection.NewRecorder(prov) 296 require.NoError(t, err) 297 298 require.NoError(t, connStore.SaveConnectionRecord(&connection.Record{ 299 ConnectionID: connectionID, 300 State: connection.StateNameCompleted, 301 })) 302 303 expectErr := fmt.Errorf("expected error") 304 305 store.ErrPut = expectErr 306 307 c, err := New(prov) 308 require.NoError(t, err) 309 310 err = c.SetConnectionToDIDCommV2(connectionID) 311 require.Error(t, err) 312 require.ErrorIs(t, err, expectErr) 313 }) 314 }