github.com/hyperledger/aries-framework-go@v0.3.2/pkg/client/legacyconnection/client_test.go (about) 1 /* 2 Copyright Avast Software. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package legacyconnection 8 9 import ( 10 "crypto/ed25519" 11 "crypto/rand" 12 "encoding/json" 13 "errors" 14 "fmt" 15 "strconv" 16 "testing" 17 "time" 18 19 "github.com/btcsuite/btcutil/base58" 20 "github.com/google/uuid" 21 "github.com/stretchr/testify/require" 22 23 "github.com/hyperledger/aries-framework-go/component/storageutil/mem" 24 "github.com/hyperledger/aries-framework-go/pkg/common/model" 25 "github.com/hyperledger/aries-framework-go/pkg/didcomm/common/service" 26 "github.com/hyperledger/aries-framework-go/pkg/didcomm/protocol/decorator" 27 "github.com/hyperledger/aries-framework-go/pkg/didcomm/protocol/legacyconnection" 28 "github.com/hyperledger/aries-framework-go/pkg/didcomm/protocol/mediator" 29 "github.com/hyperledger/aries-framework-go/pkg/doc/did" 30 "github.com/hyperledger/aries-framework-go/pkg/framework/aries" 31 "github.com/hyperledger/aries-framework-go/pkg/kms" 32 "github.com/hyperledger/aries-framework-go/pkg/kms/localkms" 33 mockprotocol "github.com/hyperledger/aries-framework-go/pkg/mock/didcomm/protocol" 34 mocksvc "github.com/hyperledger/aries-framework-go/pkg/mock/didcomm/protocol/legacyconnection" 35 mockroute "github.com/hyperledger/aries-framework-go/pkg/mock/didcomm/protocol/mediator" 36 mockkms "github.com/hyperledger/aries-framework-go/pkg/mock/kms" 37 mockprovider "github.com/hyperledger/aries-framework-go/pkg/mock/provider" 38 mockstore "github.com/hyperledger/aries-framework-go/pkg/mock/storage" 39 mockvdr "github.com/hyperledger/aries-framework-go/pkg/mock/vdr" 40 "github.com/hyperledger/aries-framework-go/pkg/secretlock" 41 "github.com/hyperledger/aries-framework-go/pkg/secretlock/noop" 42 "github.com/hyperledger/aries-framework-go/pkg/store/connection" 43 "github.com/hyperledger/aries-framework-go/pkg/vdr/peer" 44 spi "github.com/hyperledger/aries-framework-go/spi/storage" 45 ) 46 47 func TestNew(t *testing.T) { 48 t.Run("test new client", func(t *testing.T) { 49 svc, err := legacyconnection.New(&mockprotocol.MockProvider{ 50 ServiceMap: map[string]interface{}{ 51 mediator.Coordination: &mockroute.MockMediatorSvc{}, 52 }, 53 }) 54 require.NoError(t, err) 55 require.NotNil(t, svc) 56 57 _, err = New(&mockprovider.Provider{ 58 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 59 StorageProviderValue: mockstore.NewMockStoreProvider(), 60 ServiceMap: map[string]interface{}{ 61 legacyconnection.LegacyConnection: svc, 62 mediator.Coordination: &mockroute.MockMediatorSvc{}, 63 }, 64 }) 65 require.NoError(t, err) 66 }) 67 68 t.Run("test error from get service from context", func(t *testing.T) { 69 _, err := New(&mockprovider.Provider{ServiceErr: fmt.Errorf("service error")}) 70 require.Error(t, err) 71 require.Contains(t, err.Error(), "service error") 72 }) 73 74 t.Run("test error from cast service", func(t *testing.T) { 75 _, err := New(&mockprovider.Provider{ServiceValue: nil}) 76 require.Error(t, err) 77 require.Contains(t, err.Error(), "cast service to legacyconnection Service failed") 78 }) 79 80 t.Run("test route service cast error", func(t *testing.T) { 81 _, err := New(&mockprovider.Provider{ 82 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 83 StorageProviderValue: mockstore.NewMockStoreProvider(), 84 ServiceMap: map[string]interface{}{ 85 legacyconnection.LegacyConnection: &mocksvc.MockLegacyConnectionSvc{}, 86 mediator.Coordination: &mocksvc.MockLegacyConnectionSvc{}, 87 }, 88 }) 89 require.Error(t, err) 90 require.Contains(t, err.Error(), "cast service to Route Service failed") 91 }) 92 93 t.Run("test error from open store", func(t *testing.T) { 94 svc, err := legacyconnection.New(&mockprotocol.MockProvider{ 95 ServiceMap: map[string]interface{}{ 96 mediator.Coordination: &mockroute.MockMediatorSvc{}, 97 }, 98 }) 99 require.NoError(t, err) 100 require.NotNil(t, svc) 101 102 _, err = New(&mockprovider.Provider{ 103 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 104 StorageProviderValue: &mockstore.MockStoreProvider{ 105 ErrOpenStoreHandle: fmt.Errorf("failed to open store"), 106 }, 107 ServiceMap: map[string]interface{}{ 108 legacyconnection.LegacyConnection: svc, 109 mediator.Coordination: &mockroute.MockMediatorSvc{}, 110 }, 111 ServiceEndpointValue: "endpoint", 112 }) 113 require.Error(t, err) 114 require.Contains(t, err.Error(), "failed to open store") 115 }) 116 117 t.Run("test error from open protocol state store", func(t *testing.T) { 118 svc, err := legacyconnection.New(&mockprotocol.MockProvider{ 119 ServiceMap: map[string]interface{}{ 120 mediator.Coordination: &mockroute.MockMediatorSvc{}, 121 }, 122 }) 123 require.NoError(t, err) 124 require.NotNil(t, svc) 125 126 _, err = New(&mockprovider.Provider{ 127 StorageProviderValue: mockstore.NewMockStoreProvider(), 128 ProtocolStateStorageProviderValue: &mockstore.MockStoreProvider{ 129 ErrOpenStoreHandle: fmt.Errorf("failed to open protocol state store"), 130 }, 131 ServiceMap: map[string]interface{}{ 132 legacyconnection.LegacyConnection: svc, 133 mediator.Coordination: &mockroute.MockMediatorSvc{}, 134 }, 135 ServiceEndpointValue: "endpoint", 136 }) 137 require.Error(t, err) 138 require.Contains(t, err.Error(), "failed to open protocol state store") 139 }) 140 } 141 142 func TestClient_CreateInvitation(t *testing.T) { 143 t.Run("test success", func(t *testing.T) { 144 svc, err := legacyconnection.New(&mockprotocol.MockProvider{ 145 ServiceMap: map[string]interface{}{ 146 mediator.Coordination: &mockroute.MockMediatorSvc{}, 147 }, 148 }) 149 require.NoError(t, err) 150 require.NotNil(t, svc) 151 152 ed25519KH, err := mockkms.CreateMockED25519KeyHandle() 153 require.NoError(t, err) 154 155 c, err := New(&mockprovider.Provider{ 156 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 157 StorageProviderValue: mockstore.NewMockStoreProvider(), 158 ServiceMap: map[string]interface{}{ 159 legacyconnection.LegacyConnection: svc, 160 mediator.Coordination: &mockroute.MockMediatorSvc{}, 161 }, 162 KMSValue: &mockkms.KeyManager{CreateKeyValue: ed25519KH}, 163 ServiceEndpointValue: "endpoint", 164 }) 165 166 require.NoError(t, err) 167 inviteReq, err := c.CreateInvitation("agent") 168 require.NoError(t, err) 169 require.NotNil(t, inviteReq) 170 require.NotEmpty(t, inviteReq.Label) 171 require.NotEmpty(t, inviteReq.ID) 172 require.Nil(t, inviteReq.RoutingKeys) 173 require.Equal(t, "endpoint", inviteReq.ServiceEndpoint) 174 }) 175 176 t.Run("test error from createSigningKey", func(t *testing.T) { 177 svc, err := legacyconnection.New(&mockprotocol.MockProvider{ 178 ServiceMap: map[string]interface{}{ 179 mediator.Coordination: &mockroute.MockMediatorSvc{}, 180 }, 181 }) 182 require.NoError(t, err) 183 require.NotNil(t, svc) 184 185 c, err := New(&mockprovider.Provider{ 186 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 187 StorageProviderValue: mockstore.NewMockStoreProvider(), 188 ServiceMap: map[string]interface{}{ 189 legacyconnection.LegacyConnection: svc, 190 mediator.Coordination: &mockroute.MockMediatorSvc{}, 191 }, 192 KMSValue: &mockkms.KeyManager{CrAndExportPubKeyErr: fmt.Errorf("createKeyErr")}, 193 }) 194 require.NoError(t, err) 195 _, err = c.CreateInvitation("agent") 196 require.Error(t, err) 197 require.Contains(t, err.Error(), "createKeyErr") 198 }) 199 200 t.Run("test error from save record", func(t *testing.T) { 201 store := &mockstore.MockStore{ 202 Store: make(map[string]mockstore.DBEntry), 203 ErrPut: fmt.Errorf("store error"), 204 } 205 206 svc, err := legacyconnection.New(&mockprotocol.MockProvider{ 207 StoreProvider: mockstore.NewCustomMockStoreProvider(store), 208 ServiceMap: map[string]interface{}{ 209 mediator.Coordination: &mockroute.MockMediatorSvc{}, 210 }, 211 }) 212 require.NoError(t, err) 213 require.NotNil(t, svc) 214 215 c, err := New(&mockprovider.Provider{ 216 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 217 StorageProviderValue: mockstore.NewCustomMockStoreProvider(store), 218 ServiceMap: map[string]interface{}{ 219 legacyconnection.LegacyConnection: svc, 220 mediator.Coordination: &mockroute.MockMediatorSvc{}, 221 }, 222 KMSValue: &mockkms.KeyManager{}, 223 }) 224 require.NoError(t, err) 225 _, err = c.CreateInvitation("agent") 226 require.Error(t, err) 227 require.Contains(t, err.Error(), "failed to save invitation") 228 }) 229 230 t.Run("test success with router registered", func(t *testing.T) { 231 endpoint := "http://router.example.com" 232 routingKeys := []string{"abc", "xyz"} 233 234 svc, err := legacyconnection.New(&mockprotocol.MockProvider{ 235 ServiceMap: map[string]interface{}{ 236 mediator.Coordination: &mockroute.MockMediatorSvc{}, 237 }, 238 }) 239 require.NoError(t, err) 240 require.NotNil(t, svc) 241 242 ed25519KH, err := mockkms.CreateMockED25519KeyHandle() 243 require.NoError(t, err) 244 245 c, err := New(&mockprovider.Provider{ 246 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 247 StorageProviderValue: mockstore.NewMockStoreProvider(), 248 ServiceMap: map[string]interface{}{ 249 legacyconnection.LegacyConnection: svc, 250 mediator.Coordination: &mockroute.MockMediatorSvc{ 251 Connections: []string{"xyz"}, 252 RoutingKeys: routingKeys, 253 RouterEndpoint: endpoint, 254 }, 255 }, 256 KMSValue: &mockkms.KeyManager{CreateKeyValue: ed25519KH}, 257 ServiceEndpointValue: "endpoint", 258 }) 259 require.NoError(t, err) 260 261 inviteReq, err := c.CreateInvitation("agent", WithRouterConnectionID("xyz")) 262 require.NoError(t, err) 263 require.NotNil(t, inviteReq) 264 require.NotEmpty(t, inviteReq.Label) 265 require.NotEmpty(t, inviteReq.ID) 266 require.Equal(t, endpoint, inviteReq.ServiceEndpoint) 267 require.Equal(t, routingKeys, inviteReq.RoutingKeys) 268 }) 269 270 t.Run("test create invitation with router config error", func(t *testing.T) { 271 svc, err := legacyconnection.New(&mockprotocol.MockProvider{ 272 ServiceMap: map[string]interface{}{ 273 mediator.Coordination: &mockroute.MockMediatorSvc{}, 274 }, 275 }) 276 require.NoError(t, err) 277 require.NotNil(t, svc) 278 279 ed25519KH, err := mockkms.CreateMockED25519KeyHandle() 280 require.NoError(t, err) 281 282 c, err := New(&mockprovider.Provider{ 283 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 284 StorageProviderValue: mockstore.NewMockStoreProvider(), 285 ServiceMap: map[string]interface{}{ 286 legacyconnection.LegacyConnection: svc, 287 mediator.Coordination: &mockroute.MockMediatorSvc{ 288 Connections: []string{"xyz"}, 289 ConfigErr: errors.New("router config error"), 290 }, 291 }, 292 KMSValue: &mockkms.KeyManager{CreateKeyValue: ed25519KH}, 293 ServiceEndpointValue: "endpoint", 294 }) 295 require.NoError(t, err) 296 297 inviteReq, err := c.CreateInvitation("agent", WithRouterConnectionID("xyz")) 298 require.EqualError(t, err, "createInvitation: getRouterConfig: fetch router config: router config error") 299 require.Nil(t, inviteReq) 300 }) 301 302 t.Run("test create invitation with adding key to router error", func(t *testing.T) { 303 endpoint := "http://router.example.com" 304 routingKeys := []string{"abc", "xyz"} 305 306 svc, err := legacyconnection.New(&mockprotocol.MockProvider{ 307 ServiceMap: map[string]interface{}{ 308 mediator.Coordination: &mockroute.MockMediatorSvc{}, 309 }, 310 }) 311 require.NoError(t, err) 312 require.NotNil(t, svc) 313 314 ed25519KH, err := mockkms.CreateMockED25519KeyHandle() 315 require.NoError(t, err) 316 317 c, err := New(&mockprovider.Provider{ 318 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 319 StorageProviderValue: mockstore.NewMockStoreProvider(), 320 ServiceMap: map[string]interface{}{ 321 legacyconnection.LegacyConnection: svc, 322 mediator.Coordination: &mockroute.MockMediatorSvc{ 323 Connections: []string{"xyz"}, 324 RoutingKeys: routingKeys, 325 RouterEndpoint: endpoint, 326 AddKeyErr: errors.New("failed to add key to the router"), 327 }, 328 }, 329 KMSValue: &mockkms.KeyManager{CreateKeyValue: ed25519KH}, 330 ServiceEndpointValue: "endpoint", 331 }) 332 require.NoError(t, err) 333 334 inviteReq, err := c.CreateInvitation("agent", WithRouterConnectionID("xyz")) 335 require.EqualError(t, err, "createInvitation: AddKeyToRouter: addKey: failed to add key to the router") 336 require.Nil(t, inviteReq) 337 }) 338 } 339 340 func TestClient_CreateInvitationWithDID(t *testing.T) { 341 t.Run("test success", func(t *testing.T) { 342 svc, err := legacyconnection.New(&mockprotocol.MockProvider{ 343 ServiceMap: map[string]interface{}{ 344 mediator.Coordination: &mockroute.MockMediatorSvc{}, 345 }, 346 }) 347 require.NoError(t, err) 348 require.NotNil(t, svc) 349 350 ed25519KH, err := mockkms.CreateMockED25519KeyHandle() 351 require.NoError(t, err) 352 353 c, err := New(&mockprovider.Provider{ 354 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 355 StorageProviderValue: mockstore.NewMockStoreProvider(), 356 ServiceMap: map[string]interface{}{ 357 legacyconnection.LegacyConnection: svc, 358 mediator.Coordination: &mockroute.MockMediatorSvc{}, 359 }, 360 KMSValue: &mockkms.KeyManager{CreateKeyValue: ed25519KH}, 361 ServiceEndpointValue: "endpoint", 362 }) 363 require.NoError(t, err) 364 365 const label = "agent" 366 const id = "did:peer:123" 367 inviteReq, err := c.CreateInvitationWithDID(label, id) 368 require.NoError(t, err) 369 require.NotNil(t, inviteReq) 370 require.Equal(t, label, inviteReq.Label) 371 require.NotEmpty(t, inviteReq.ID) 372 require.Equal(t, id, inviteReq.DID) 373 }) 374 375 t.Run("test error from save invitation", func(t *testing.T) { 376 store := &mockstore.MockStore{ 377 Store: make(map[string]mockstore.DBEntry), 378 ErrPut: fmt.Errorf("store error"), 379 } 380 381 svc, err := legacyconnection.New(&mockprotocol.MockProvider{ 382 StoreProvider: mockstore.NewCustomMockStoreProvider(store), 383 ServiceMap: map[string]interface{}{ 384 mediator.Coordination: &mockroute.MockMediatorSvc{}, 385 }, 386 }) 387 require.NoError(t, err) 388 require.NotNil(t, svc) 389 390 c, err := New(&mockprovider.Provider{ 391 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 392 StorageProviderValue: mockstore.NewCustomMockStoreProvider(store), 393 ServiceMap: map[string]interface{}{ 394 legacyconnection.LegacyConnection: svc, 395 mediator.Coordination: &mockroute.MockMediatorSvc{}, 396 }, 397 KMSValue: &mockkms.KeyManager{}, 398 }) 399 require.NoError(t, err) 400 401 _, err = c.CreateInvitationWithDID("agent", "did:peer:123") 402 require.Error(t, err) 403 require.Contains(t, err.Error(), "failed to save invitation") 404 }) 405 } 406 407 func TestClient_QueryConnectionByID(t *testing.T) { 408 const ( 409 connID = "id1" 410 threadID = "thid1" 411 ) 412 413 ed25519KH, err := mockkms.CreateMockED25519KeyHandle() 414 require.NoError(t, err) 415 416 t.Run("test success", func(t *testing.T) { 417 svc, err := legacyconnection.New(&mockprotocol.MockProvider{ 418 ServiceMap: map[string]interface{}{ 419 mediator.Coordination: &mockroute.MockMediatorSvc{}, 420 }, 421 }) 422 require.NoError(t, err) 423 require.NotNil(t, svc) 424 425 c, err := New(&mockprovider.Provider{ 426 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 427 StorageProviderValue: mockstore.NewMockStoreProvider(), 428 ServiceMap: map[string]interface{}{ 429 legacyconnection.LegacyConnection: svc, 430 mediator.Coordination: &mockroute.MockMediatorSvc{}, 431 }, 432 KMSValue: &mockkms.KeyManager{CreateKeyValue: ed25519KH}, 433 ServiceEndpointValue: "endpoint", 434 }) 435 require.NoError(t, err) 436 437 connRec := &connection.Record{ConnectionID: connID, ThreadID: threadID, State: "complete"} 438 439 require.NoError(t, err) 440 require.NoError(t, c.connectionStore.SaveConnectionRecord(connRec)) 441 result, err := c.GetConnection(connID) 442 require.NoError(t, err) 443 require.Equal(t, "complete", result.State) 444 require.Equal(t, "id1", result.ConnectionID) 445 }) 446 447 t.Run("test error", func(t *testing.T) { 448 const errMsg = "query connection error" 449 svc, err := legacyconnection.New(&mockprotocol.MockProvider{ 450 ServiceMap: map[string]interface{}{ 451 mediator.Coordination: &mockroute.MockMediatorSvc{}, 452 }, 453 }) 454 require.NoError(t, err) 455 require.NotNil(t, svc) 456 457 store := &mockstore.MockStore{ 458 Store: make(map[string]mockstore.DBEntry), 459 ErrGet: fmt.Errorf(errMsg), 460 } 461 462 c, err := New(&mockprovider.Provider{ 463 ProtocolStateStorageProviderValue: mockstore.NewCustomMockStoreProvider(store), 464 StorageProviderValue: mockstore.NewMockStoreProvider(), 465 ServiceMap: map[string]interface{}{ 466 legacyconnection.LegacyConnection: svc, 467 mediator.Coordination: &mockroute.MockMediatorSvc{}, 468 }, 469 KMSValue: &mockkms.KeyManager{CreateKeyValue: ed25519KH}, 470 ServiceEndpointValue: "endpoint", 471 }) 472 require.NoError(t, err) 473 474 connRec := &connection.Record{ConnectionID: connID, ThreadID: threadID, State: "complete"} 475 476 require.NoError(t, err) 477 require.NoError(t, c.connectionStore.SaveConnectionRecord(connRec)) 478 _, err = c.GetConnection(connID) 479 require.Error(t, err) 480 require.Contains(t, err.Error(), errMsg) 481 }) 482 483 t.Run("test data not found", func(t *testing.T) { 484 svc, err := legacyconnection.New(&mockprotocol.MockProvider{ 485 ServiceMap: map[string]interface{}{ 486 mediator.Coordination: &mockroute.MockMediatorSvc{}, 487 }, 488 }) 489 require.NoError(t, err) 490 require.NotNil(t, svc) 491 492 c, err := New(&mockprovider.Provider{ 493 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 494 StorageProviderValue: mockstore.NewMockStoreProvider(), 495 ServiceMap: map[string]interface{}{ 496 legacyconnection.LegacyConnection: svc, 497 mediator.Coordination: &mockroute.MockMediatorSvc{}, 498 }, 499 KMSValue: &mockkms.KeyManager{CreateKeyValue: ed25519KH}, 500 ServiceEndpointValue: "endpoint", 501 }) 502 require.NoError(t, err) 503 504 result, err := c.GetConnection(connID) 505 require.Error(t, err) 506 require.True(t, errors.Is(err, ErrConnectionNotFound)) 507 require.Nil(t, result) 508 }) 509 } 510 511 func TestClient_GetConnection(t *testing.T) { 512 connID := "id1" 513 threadID := "thid1" 514 515 t.Run("test failure", func(t *testing.T) { 516 svc, err := legacyconnection.New(&mockprotocol.MockProvider{ 517 ServiceMap: map[string]interface{}{ 518 mediator.Coordination: &mockroute.MockMediatorSvc{}, 519 }, 520 }) 521 require.NoError(t, err) 522 require.NotNil(t, svc) 523 s := &mockstore.MockStore{Store: make(map[string]mockstore.DBEntry), ErrGet: ErrConnectionNotFound} 524 c, err := New(&mockprovider.Provider{ 525 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 526 StorageProviderValue: mockstore.NewMockStoreProvider(), 527 ServiceMap: map[string]interface{}{ 528 legacyconnection.LegacyConnection: svc, 529 mediator.Coordination: &mockroute.MockMediatorSvc{}, 530 }, 531 }) 532 require.NoError(t, err) 533 connRec := &connection.Record{ConnectionID: connID, ThreadID: threadID, State: "complete"} 534 connBytes, err := json.Marshal(connRec) 535 require.NoError(t, err) 536 require.NoError(t, s.Put("conn_id1", connBytes)) 537 result, err := c.GetConnection(connID) 538 require.Equal(t, err.Error(), ErrConnectionNotFound.Error()) 539 require.Nil(t, result) 540 }) 541 } 542 543 func TestClientGetConnectionAtState(t *testing.T) { 544 // create service 545 svc, err := legacyconnection.New(&mockprotocol.MockProvider{ 546 ServiceMap: map[string]interface{}{ 547 mediator.Coordination: &mockroute.MockMediatorSvc{}, 548 }, 549 }) 550 require.NoError(t, err) 551 require.NotNil(t, svc) 552 553 // create client 554 c, err := New(&mockprovider.Provider{ 555 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 556 StorageProviderValue: mockstore.NewMockStoreProvider(), 557 ServiceMap: map[string]interface{}{ 558 legacyconnection.LegacyConnection: svc, 559 mediator.Coordination: &mockroute.MockMediatorSvc{}, 560 }, 561 }) 562 require.NoError(t, err) 563 564 // not found 565 result, err := c.GetConnectionAtState("id1", "complete") 566 require.Equal(t, err.Error(), ErrConnectionNotFound.Error()) 567 require.Nil(t, result) 568 } 569 570 func TestClient_CreateConnection(t *testing.T) { 571 t.Run("test create connection - success", func(t *testing.T) { 572 theirDID := newPeerDID(t) 573 myDID := newPeerDID(t) 574 threadID := uuid.New().String() 575 parentThreadID := uuid.New().String() 576 label := uuid.New().String() 577 invitationID := uuid.New().String() 578 invitationDID := newPeerDID(t).ID 579 implicit := true 580 storageProvider := &mockprovider.Provider{ 581 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 582 StorageProviderValue: mockstore.NewMockStoreProvider(), 583 } 584 c, err := New(&mockprovider.Provider{ 585 ProtocolStateStorageProviderValue: storageProvider.ProtocolStateStorageProvider(), 586 StorageProviderValue: storageProvider.StorageProvider(), 587 ServiceMap: map[string]interface{}{ 588 legacyconnection.LegacyConnection: &mocksvc.MockLegacyConnectionSvc{ 589 CreateConnRecordFunc: func(r *connection.Record, td *did.Doc) error { 590 recorder, err := connection.NewRecorder(storageProvider) 591 require.NoError(t, err) 592 err = recorder.SaveConnectionRecord(r) 593 require.NoError(t, err) 594 595 return nil 596 }, 597 }, 598 mediator.Coordination: &mockroute.MockMediatorSvc{}, 599 }, 600 }) 601 require.NoError(t, err) 602 603 id, err := c.CreateConnection(myDID.ID, theirDID, 604 WithTheirLabel(label), WithThreadID(threadID), WithParentThreadID(parentThreadID), 605 WithInvitationID(invitationID), WithInvitationDID(invitationDID), WithImplicit(implicit)) 606 require.NoError(t, err) 607 608 conn, err := c.GetConnection(id) 609 require.NoError(t, err) 610 require.Equal(t, connection.StateNameCompleted, conn.State) 611 require.Equal(t, threadID, conn.ThreadID) 612 require.Equal(t, parentThreadID, conn.ParentThreadID) 613 require.Equal(t, label, conn.TheirLabel) 614 require.Equal(t, theirDID.ID, conn.TheirDID) 615 require.Equal(t, myDID.ID, conn.MyDID) 616 require.Equal(t, invitationID, conn.InvitationID) 617 require.Equal(t, invitationDID, conn.InvitationDID) 618 require.Equal(t, theirDID.Service[0].ServiceEndpoint, conn.ServiceEndPoint) 619 require.Equal(t, implicit, conn.Implicit) 620 }) 621 622 t.Run("test create connection - error", func(t *testing.T) { 623 c, err := New(&mockprovider.Provider{ 624 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 625 StorageProviderValue: mockstore.NewMockStoreProvider(), 626 ServiceMap: map[string]interface{}{ 627 legacyconnection.LegacyConnection: &mocksvc.MockLegacyConnectionSvc{ 628 CreateConnRecordFunc: func(*connection.Record, *did.Doc) error { 629 return errors.New("save connection") 630 }, 631 }, 632 mediator.Coordination: &mockroute.MockMediatorSvc{}, 633 }, 634 }) 635 require.NoError(t, err) 636 637 id, err := c.CreateConnection(newPeerDID(t).ID, newPeerDID(t)) 638 require.EqualError(t, err, "createConnection: err: save connection") 639 require.Empty(t, id) 640 }) 641 642 t.Run("test create connection - error from CreateDestination", func(t *testing.T) { 643 theirDID := newPeerDID(t) 644 myDID := newPeerDID(t) 645 threadID := uuid.New().String() 646 parentThreadID := uuid.New().String() 647 label := uuid.New().String() 648 invitationID := uuid.New().String() 649 invitationDID := newPeerDID(t).ID 650 implicit := true 651 storageProvider := &mockprovider.Provider{ 652 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 653 StorageProviderValue: mockstore.NewMockStoreProvider(), 654 } 655 c, err := New(&mockprovider.Provider{ 656 ProtocolStateStorageProviderValue: storageProvider.ProtocolStateStorageProvider(), 657 StorageProviderValue: storageProvider.StorageProvider(), 658 ServiceMap: map[string]interface{}{ 659 legacyconnection.LegacyConnection: &mocksvc.MockLegacyConnectionSvc{ 660 CreateConnRecordFunc: func(r *connection.Record, td *did.Doc) error { 661 recorder, err := connection.NewRecorder(storageProvider) 662 require.NoError(t, err) 663 err = recorder.SaveConnectionRecord(r) 664 require.NoError(t, err) 665 666 return nil 667 }, 668 }, 669 mediator.Coordination: &mockroute.MockMediatorSvc{}, 670 }, 671 }) 672 require.NoError(t, err) 673 674 // empty ServiceEndpoint to trigger CreateDestination error 675 theirDID.Service[0].ServiceEndpoint = model.NewDIDCommV1Endpoint("") 676 677 _, err = c.CreateConnection(myDID.ID, theirDID, 678 WithTheirLabel(label), WithThreadID(threadID), WithParentThreadID(parentThreadID), 679 WithInvitationID(invitationID), WithInvitationDID(invitationDID), WithImplicit(implicit)) 680 require.Contains(t, err.Error(), "createConnection: failed to create destination: "+ 681 "create destination: service endpoint URI on didcomm v1 service block in diddoc error:") 682 }) 683 } 684 685 func TestClient_RemoveConnection(t *testing.T) { 686 t.Run("test success", func(t *testing.T) { 687 connID := "id1" 688 threadID := "thid1" 689 690 svc, err := legacyconnection.New(&mockprotocol.MockProvider{ 691 ServiceMap: map[string]interface{}{ 692 mediator.Coordination: &mockroute.MockMediatorSvc{}, 693 }, 694 }) 695 require.NoError(t, err) 696 require.NotNil(t, svc) 697 698 c, err := New(&mockprovider.Provider{ 699 ProtocolStateStorageProviderValue: mem.NewProvider(), 700 StorageProviderValue: mem.NewProvider(), 701 ServiceMap: map[string]interface{}{ 702 legacyconnection.LegacyConnection: svc, 703 mediator.Coordination: &mockroute.MockMediatorSvc{}, 704 }, 705 }) 706 require.NoError(t, err) 707 708 connRec := &connection.Record{ConnectionID: connID, ThreadID: threadID, State: "complete"} 709 710 require.NoError(t, err) 711 require.NoError(t, c.connectionStore.SaveConnectionRecord(connRec)) 712 713 _, err = c.GetConnection(connID) 714 require.NoError(t, err) 715 716 err = c.RemoveConnection(connID) 717 require.NoError(t, err) 718 719 _, err = c.GetConnection(connID) 720 require.Error(t, err) 721 require.Equal(t, err.Error(), ErrConnectionNotFound.Error()) 722 }) 723 t.Run("test error data not found", func(t *testing.T) { 724 svc, err := legacyconnection.New(&mockprotocol.MockProvider{ 725 ServiceMap: map[string]interface{}{ 726 mediator.Coordination: &mockroute.MockMediatorSvc{}, 727 }, 728 }) 729 require.NoError(t, err) 730 require.NotNil(t, svc) 731 c, err := New(&mockprovider.Provider{ 732 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 733 StorageProviderValue: mockstore.NewMockStoreProvider(), 734 ServiceMap: map[string]interface{}{ 735 legacyconnection.LegacyConnection: svc, 736 mediator.Coordination: &mockroute.MockMediatorSvc{}, 737 }, 738 }) 739 require.NoError(t, err) 740 741 err = c.RemoveConnection("sample-id") 742 require.Error(t, err) 743 require.Contains(t, err.Error(), "data not found") 744 }) 745 } 746 747 func TestClient_HandleInvitation(t *testing.T) { 748 ed25519KH, err := mockkms.CreateMockED25519KeyHandle() 749 require.NoError(t, err) 750 751 t.Run("test success", func(t *testing.T) { 752 c, err := New(&mockprovider.Provider{ 753 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 754 StorageProviderValue: mockstore.NewMockStoreProvider(), 755 ServiceMap: map[string]interface{}{ 756 legacyconnection.LegacyConnection: &mocksvc.MockLegacyConnectionSvc{}, 757 mediator.Coordination: &mockroute.MockMediatorSvc{}, 758 }, 759 KMSValue: &mockkms.KeyManager{CreateKeyValue: ed25519KH}, 760 ServiceEndpointValue: "endpoint", 761 }) 762 763 require.NoError(t, err) 764 inviteReq, err := c.CreateInvitation("agent") 765 require.NoError(t, err) 766 767 connectionID, err := c.HandleInvitation(inviteReq) 768 require.NoError(t, err) 769 require.NotEmpty(t, connectionID) 770 }) 771 772 t.Run("test error from handle msg", func(t *testing.T) { 773 c, err := New(&mockprovider.Provider{ 774 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 775 StorageProviderValue: mockstore.NewMockStoreProvider(), 776 ServiceMap: map[string]interface{}{ 777 legacyconnection.LegacyConnection: &mocksvc.MockLegacyConnectionSvc{ 778 HandleFunc: func(msg service.DIDCommMsg) (string, error) { 779 return "", fmt.Errorf("handle error") 780 }, 781 }, 782 mediator.Coordination: &mockroute.MockMediatorSvc{}, 783 }, 784 785 KMSValue: &mockkms.KeyManager{CreateKeyValue: ed25519KH}, 786 ServiceEndpointValue: "endpoint", 787 }) 788 require.NoError(t, err) 789 inviteReq, err := c.CreateInvitation("agent") 790 require.NoError(t, err) 791 792 _, err = c.HandleInvitation(inviteReq) 793 require.Error(t, err) 794 require.Contains(t, err.Error(), "handle error") 795 }) 796 } 797 798 func TestClient_CreateImplicitInvitation(t *testing.T) { 799 ed25519KH, err := mockkms.CreateMockED25519KeyHandle() 800 require.NoError(t, err) 801 802 t.Run("test success", func(t *testing.T) { 803 c, err := New(&mockprovider.Provider{ 804 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 805 StorageProviderValue: mockstore.NewMockStoreProvider(), 806 ServiceMap: map[string]interface{}{ 807 legacyconnection.LegacyConnection: &mocksvc.MockLegacyConnectionSvc{}, 808 mediator.Coordination: &mockroute.MockMediatorSvc{}, 809 }, 810 KMSValue: &mockkms.KeyManager{CreateKeyValue: ed25519KH}, 811 ServiceEndpointValue: "endpoint", 812 }) 813 require.NoError(t, err) 814 815 connectionID, err := c.CreateImplicitInvitation("alice", "did:example:123") 816 require.NoError(t, err) 817 require.NotEmpty(t, connectionID) 818 }) 819 820 t.Run("test error from service", func(t *testing.T) { 821 c, err := New(&mockprovider.Provider{ 822 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 823 StorageProviderValue: mockstore.NewMockStoreProvider(), 824 ServiceMap: map[string]interface{}{ 825 legacyconnection.LegacyConnection: &mocksvc.MockLegacyConnectionSvc{ 826 ImplicitInvitationErr: errors.New("implicit error"), 827 }, 828 mediator.Coordination: &mockroute.MockMediatorSvc{}, 829 }, 830 KMSValue: &mockkms.KeyManager{CreateKeyValue: ed25519KH}, 831 ServiceEndpointValue: "endpoint", 832 }) 833 require.NoError(t, err) 834 835 connectionID, err := c.CreateImplicitInvitation("Alice", "did:example:123") 836 require.Error(t, err) 837 require.Contains(t, err.Error(), "implicit error") 838 require.Empty(t, connectionID) 839 }) 840 } 841 842 func TestClient_CreateImplicitInvitationWithDID(t *testing.T) { 843 inviter := &DIDInfo{Label: "alice", DID: "did:example:alice"} 844 invitee := &DIDInfo{Label: "bob", DID: "did:example:bob"} 845 846 ed25519KH, err := mockkms.CreateMockED25519KeyHandle() 847 require.NoError(t, err) 848 849 t.Run("test success", func(t *testing.T) { 850 c, err := New(&mockprovider.Provider{ 851 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 852 StorageProviderValue: mockstore.NewMockStoreProvider(), 853 ServiceMap: map[string]interface{}{ 854 legacyconnection.LegacyConnection: &mocksvc.MockLegacyConnectionSvc{}, 855 mediator.Coordination: &mockroute.MockMediatorSvc{}, 856 }, 857 KMSValue: &mockkms.KeyManager{CreateKeyValue: ed25519KH}, 858 ServiceEndpointValue: "endpoint", 859 }) 860 require.NoError(t, err) 861 862 connectionID, err := c.CreateImplicitInvitationWithDID(inviter, invitee) 863 require.NoError(t, err) 864 require.NotEmpty(t, connectionID) 865 }) 866 867 t.Run("test error from service", func(t *testing.T) { 868 c, err := New(&mockprovider.Provider{ 869 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 870 StorageProviderValue: mockstore.NewMockStoreProvider(), 871 ServiceMap: map[string]interface{}{ 872 legacyconnection.LegacyConnection: &mocksvc.MockLegacyConnectionSvc{ 873 ImplicitInvitationErr: errors.New("implicit with DID error"), 874 }, 875 mediator.Coordination: &mockroute.MockMediatorSvc{}, 876 }, 877 KMSValue: &mockkms.KeyManager{CreateKeyValue: ed25519KH}, 878 ServiceEndpointValue: "endpoint", 879 }) 880 require.NoError(t, err) 881 882 connectionID, err := c.CreateImplicitInvitationWithDID(inviter, invitee) 883 require.Error(t, err) 884 require.Contains(t, err.Error(), "implicit with DID error") 885 require.Empty(t, connectionID) 886 }) 887 888 t.Run("test missing required DID info", func(t *testing.T) { 889 c, err := New(&mockprovider.Provider{ 890 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 891 StorageProviderValue: mockstore.NewMockStoreProvider(), 892 ServiceMap: map[string]interface{}{ 893 legacyconnection.LegacyConnection: &mocksvc.MockLegacyConnectionSvc{}, 894 mediator.Coordination: &mockroute.MockMediatorSvc{}, 895 }, 896 KMSValue: &mockkms.KeyManager{CreateKeyValue: ed25519KH}, 897 ServiceEndpointValue: "endpoint", 898 }) 899 require.NoError(t, err) 900 901 connectionID, err := c.CreateImplicitInvitationWithDID(inviter, nil) 902 require.Error(t, err) 903 require.Contains(t, err.Error(), "missing inviter and/or invitee public DID(s)") 904 require.Empty(t, connectionID) 905 906 connectionID, err = c.CreateImplicitInvitationWithDID(nil, invitee) 907 require.Error(t, err) 908 require.Contains(t, err.Error(), "missing inviter and/or invitee public DID(s)") 909 require.Empty(t, connectionID) 910 }) 911 } 912 913 func TestClient_QueryConnectionsByParams(t *testing.T) { // nolint: gocyclo 914 t.Run("test get all connections", func(t *testing.T) { 915 svc, err := legacyconnection.New(&mockprotocol.MockProvider{ 916 ServiceMap: map[string]interface{}{ 917 mediator.Coordination: &mockroute.MockMediatorSvc{}, 918 }, 919 }) 920 require.NoError(t, err) 921 require.NotNil(t, svc) 922 923 storageProvider := mem.NewProvider() 924 c, err := New(&mockprovider.Provider{ 925 ProtocolStateStorageProviderValue: mem.NewProvider(), 926 StorageProviderValue: storageProvider, 927 ServiceMap: map[string]interface{}{ 928 legacyconnection.LegacyConnection: svc, 929 mediator.Coordination: &mockroute.MockMediatorSvc{}, 930 }, 931 }) 932 require.NoError(t, err) 933 934 store, err := storageProvider.OpenStore("didexchange") 935 require.NoError(t, err) 936 937 const count = 10 938 const keyPrefix = "conn_" 939 const state = "completed" 940 for i := 0; i < count; i++ { 941 val, e := json.Marshal(&connection.Record{ 942 ConnectionID: fmt.Sprint(i), 943 State: state, 944 }) 945 require.NoError(t, e) 946 require.NoError(t, 947 store.Put(fmt.Sprintf("%sabc%d", keyPrefix, i), val, spi.Tag{Name: keyPrefix})) 948 } 949 950 results, err := c.QueryConnections(&QueryConnectionsParams{}) 951 require.NoError(t, err) 952 require.Len(t, results, count) 953 for _, result := range results { 954 require.NotEmpty(t, result.ConnectionID) 955 } 956 }) 957 t.Run("test get connections with params", func(t *testing.T) { 958 svc, err := legacyconnection.New(&mockprotocol.MockProvider{ 959 ServiceMap: map[string]interface{}{ 960 mediator.Coordination: &mockroute.MockMediatorSvc{}, 961 }, 962 }) 963 require.NoError(t, err) 964 require.NotNil(t, svc) 965 966 storageProvider := mem.NewProvider() 967 c, err := New(&mockprovider.Provider{ 968 ProtocolStateStorageProviderValue: mem.NewProvider(), 969 StorageProviderValue: storageProvider, 970 ServiceMap: map[string]interface{}{ 971 legacyconnection.LegacyConnection: svc, 972 mediator.Coordination: &mockroute.MockMediatorSvc{}, 973 }, 974 }) 975 require.NoError(t, err) 976 977 store, err := storageProvider.OpenStore("didexchange") 978 require.NoError(t, err) 979 980 const count = 10 981 const countWithState = 5 982 const keyPrefix = "conn_" 983 const state = "completed" 984 const myDID = "my_did" 985 const theirDID = "their_did" 986 for i := 0; i < count; i++ { 987 var queryState string 988 if i < countWithState { 989 queryState = state 990 } 991 992 val, e := json.Marshal(&connection.Record{ 993 ConnectionID: fmt.Sprint(i), 994 InvitationID: fmt.Sprintf("inv-%d", i), 995 ParentThreadID: fmt.Sprintf("ptid-%d", i), 996 State: queryState, 997 MyDID: myDID + strconv.Itoa(i), 998 TheirDID: theirDID + strconv.Itoa(i), 999 }) 1000 require.NoError(t, e) 1001 require.NoError(t, 1002 store.Put(fmt.Sprintf("%sabc%d", keyPrefix, i), val, spi.Tag{Name: keyPrefix})) 1003 } 1004 1005 results, err := c.QueryConnections(&QueryConnectionsParams{}) 1006 require.NoError(t, err) 1007 require.Len(t, results, count) 1008 for _, result := range results { 1009 require.NotEmpty(t, result.ConnectionID) 1010 } 1011 1012 results, err = c.QueryConnections(&QueryConnectionsParams{State: state}) 1013 require.NoError(t, err) 1014 require.Len(t, results, countWithState) 1015 for _, result := range results { 1016 require.NotEmpty(t, result.ConnectionID) 1017 require.Equal(t, result.State, state) 1018 } 1019 1020 params := &QueryConnectionsParams{MyDID: myDID + strconv.Itoa(count-1)} 1021 results, err = c.QueryConnections(params) 1022 require.NoError(t, err) 1023 require.Len(t, results, 1) 1024 for _, result := range results { 1025 require.NotEmpty(t, result.ConnectionID) 1026 require.Equal(t, result.MyDID, params.MyDID) 1027 } 1028 1029 params = &QueryConnectionsParams{TheirDID: theirDID + strconv.Itoa(count-1)} 1030 results, err = c.QueryConnections(params) 1031 require.NoError(t, err) 1032 require.Len(t, results, 1) 1033 for _, result := range results { 1034 require.NotEmpty(t, result.ConnectionID) 1035 require.Equal(t, result.TheirDID, params.TheirDID) 1036 } 1037 1038 params = &QueryConnectionsParams{ 1039 MyDID: myDID + strconv.Itoa(count-1), 1040 TheirDID: theirDID + strconv.Itoa(count-1), 1041 } 1042 results, err = c.QueryConnections(params) 1043 require.NoError(t, err) 1044 require.Len(t, results, 1) 1045 for _, result := range results { 1046 require.NotEmpty(t, result.ConnectionID) 1047 require.Equal(t, result.MyDID, params.MyDID) 1048 require.Equal(t, result.TheirDID, params.TheirDID) 1049 } 1050 1051 params = &QueryConnectionsParams{ 1052 InvitationID: fmt.Sprintf("inv-%d", count-1), 1053 } 1054 results, err = c.QueryConnections(params) 1055 require.NoError(t, err) 1056 require.Len(t, results, 1) 1057 for _, result := range results { 1058 require.NotEmpty(t, result.ConnectionID) 1059 require.Equal(t, result.InvitationID, params.InvitationID) 1060 } 1061 1062 params = &QueryConnectionsParams{ 1063 ParentThreadID: fmt.Sprintf("ptid-%d", count-1), 1064 } 1065 results, err = c.QueryConnections(params) 1066 require.NoError(t, err) 1067 require.Len(t, results, 1) 1068 for _, result := range results { 1069 require.NotEmpty(t, result.ConnectionID) 1070 require.Equal(t, result.ParentThreadID, params.ParentThreadID) 1071 } 1072 }) 1073 1074 t.Run("test get connections error", func(t *testing.T) { 1075 svc, err := legacyconnection.New(&mockprotocol.MockProvider{ 1076 ServiceMap: map[string]interface{}{ 1077 mediator.Coordination: &mockroute.MockMediatorSvc{}, 1078 }, 1079 }) 1080 require.NoError(t, err) 1081 require.NotNil(t, svc) 1082 const keyPrefix = "conn_" 1083 1084 storageProvider := mem.NewProvider() 1085 c, err := New(&mockprovider.Provider{ 1086 ProtocolStateStorageProviderValue: mem.NewProvider(), 1087 StorageProviderValue: storageProvider, 1088 ServiceMap: map[string]interface{}{ 1089 legacyconnection.LegacyConnection: svc, 1090 mediator.Coordination: &mockroute.MockMediatorSvc{}, 1091 }, 1092 }) 1093 require.NoError(t, err) 1094 1095 store, err := storageProvider.OpenStore("didexchange") 1096 require.NoError(t, err) 1097 1098 require.NoError(t, 1099 store.Put(fmt.Sprintf("%sabc", keyPrefix), []byte("----"), spi.Tag{Name: keyPrefix})) 1100 1101 results, err := c.QueryConnections(&QueryConnectionsParams{}) 1102 require.Error(t, err) 1103 require.Empty(t, results) 1104 }) 1105 } 1106 1107 func TestServiceEvents(t *testing.T) { 1108 protocolStateStore := mockstore.NewMockStoreProvider() 1109 store := mockstore.NewMockStoreProvider() 1110 km := newKMS(t, store) 1111 didExSvc, err := legacyconnection.New(&mockprotocol.MockProvider{ 1112 ProtocolStateStoreProvider: protocolStateStore, 1113 StoreProvider: store, 1114 ServiceMap: map[string]interface{}{ 1115 mediator.Coordination: &mockroute.MockMediatorSvc{}, 1116 }, 1117 CustomKMS: km, 1118 KeyTypeValue: kms.ED25519Type, 1119 KeyAgreementTypeValue: kms.X25519ECDHKWType, 1120 }) 1121 require.NoError(t, err) 1122 1123 // create the client 1124 c, err := New(&mockprovider.Provider{ 1125 ProtocolStateStorageProviderValue: protocolStateStore, 1126 StorageProviderValue: store, 1127 ServiceMap: map[string]interface{}{ 1128 legacyconnection.LegacyConnection: didExSvc, 1129 mediator.Coordination: &mockroute.MockMediatorSvc{}, 1130 }, 1131 KMSValue: km, 1132 KeyTypeValue: kms.ED25519Type, 1133 KeyAgreementTypeValue: kms.X25519ECDHKWType, 1134 }) 1135 require.NoError(t, err) 1136 require.NotNil(t, c) 1137 1138 // register action event channel 1139 aCh := make(chan service.DIDCommAction, 10) 1140 err = c.RegisterActionEvent(aCh) 1141 require.NoError(t, err) 1142 1143 go func() { 1144 service.AutoExecuteActionEvent(aCh) 1145 }() 1146 1147 // register message event channel 1148 mCh := make(chan service.StateMsg, 10) 1149 err = c.RegisterMsgEvent(mCh) 1150 require.NoError(t, err) 1151 1152 stateMsg := make(chan service.StateMsg) 1153 1154 go func() { 1155 for e := range mCh { 1156 if e.Type == service.PostState && e.StateID == "responded" { 1157 stateMsg <- e 1158 } 1159 } 1160 }() 1161 1162 // send connection request message 1163 id := "valid-thread-id" 1164 doc, err := (&mockvdr.MockVDRegistry{}).Create("test", nil) 1165 require.NoError(t, err) 1166 1167 invitation, err := c.CreateInvitation("alice") 1168 require.NoError(t, err) 1169 1170 request, err := json.Marshal( 1171 &legacyconnection.Request{ 1172 Type: legacyconnection.RequestMsgType, 1173 ID: id, 1174 Label: "test", 1175 Thread: &decorator.Thread{ 1176 PID: invitation.ID, 1177 }, 1178 Connection: &legacyconnection.Connection{ 1179 DID: doc.DIDDocument.ID, 1180 DIDDoc: doc.DIDDocument, 1181 }, 1182 }, 1183 ) 1184 require.NoError(t, err) 1185 1186 msg, err := service.ParseDIDCommMsgMap(request) 1187 require.NoError(t, err) 1188 _, err = didExSvc.HandleInbound(msg, service.EmptyDIDCommContext()) 1189 require.NoError(t, err) 1190 1191 select { 1192 case e := <-stateMsg: 1193 switch v := e.Properties.(type) { 1194 case Event: 1195 props := v 1196 conn, err := c.GetConnectionAtState(props.ConnectionID(), e.StateID) 1197 require.NoError(t, err) 1198 require.Equal(t, e.StateID, conn.State) 1199 default: 1200 require.Fail(t, "unable to cast to did exchange event") 1201 } 1202 case <-time.After(5 * time.Second): 1203 require.Fail(t, "tests are not validated due to timeout") 1204 } 1205 } 1206 1207 func TestAcceptConnectionRequest(t *testing.T) { 1208 store := mockstore.NewMockStoreProvider() 1209 km := newKMS(t, store) 1210 svc, err := legacyconnection.New(&mockprotocol.MockProvider{ 1211 StoreProvider: store, 1212 ServiceMap: map[string]interface{}{ 1213 mediator.Coordination: &mockroute.MockMediatorSvc{}, 1214 }, 1215 CustomKMS: km, 1216 KeyTypeValue: kms.ED25519Type, 1217 KeyAgreementTypeValue: kms.X25519ECDHKWType, 1218 }) 1219 require.NoError(t, err) 1220 1221 // create the client 1222 c, err := New(&mockprovider.Provider{ 1223 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 1224 StorageProviderValue: store, 1225 ServiceMap: map[string]interface{}{ 1226 legacyconnection.LegacyConnection: svc, 1227 mediator.Coordination: &mockroute.MockMediatorSvc{}, 1228 }, 1229 KMSValue: km, 1230 KeyTypeValue: kms.ED25519Type, 1231 KeyAgreementTypeValue: kms.X25519ECDHKWType, 1232 }, 1233 ) 1234 require.NoError(t, err) 1235 require.NotNil(t, c) 1236 1237 // register action event channel 1238 aCh := make(chan service.DIDCommAction, 10) 1239 err = c.RegisterActionEvent(aCh) 1240 require.NoError(t, err) 1241 1242 go func() { 1243 for e := range aCh { 1244 prop, ok := e.Properties.(Event) 1245 if !ok { 1246 require.Fail(t, "Failed to cast the event properties to service.Event") 1247 } 1248 1249 require.NoError(t, c.AcceptConnectionRequest(prop.ConnectionID(), "", "")) 1250 } 1251 }() 1252 1253 // register message event channel 1254 mCh := make(chan service.StateMsg, 10) 1255 err = c.RegisterMsgEvent(mCh) 1256 require.NoError(t, err) 1257 1258 done := make(chan struct{}) 1259 1260 go func() { 1261 for e := range mCh { 1262 if e.Type == service.PostState && e.StateID == "responded" { 1263 close(done) 1264 } 1265 } 1266 }() 1267 1268 invitation, err := c.CreateInvitation("alice") 1269 require.NoError(t, err) 1270 // send connection request message 1271 id := "valid-thread-id" 1272 doc, err := (&mockvdr.MockVDRegistry{}).Create("test", nil) 1273 require.NoError(t, err) 1274 1275 request, err := json.Marshal( 1276 &legacyconnection.Request{ 1277 Type: legacyconnection.RequestMsgType, 1278 ID: id, 1279 Label: "test", 1280 Thread: &decorator.Thread{ 1281 PID: invitation.ID, 1282 }, 1283 Connection: &legacyconnection.Connection{ 1284 DID: doc.DIDDocument.ID, 1285 DIDDoc: doc.DIDDocument, 1286 }, 1287 }, 1288 ) 1289 require.NoError(t, err) 1290 1291 msg, err := service.ParseDIDCommMsgMap(request) 1292 require.NoError(t, err) 1293 _, err = svc.HandleInbound(msg, service.EmptyDIDCommContext()) 1294 require.NoError(t, err) 1295 1296 select { 1297 case <-done: 1298 case <-time.After(5 * time.Second): 1299 require.Fail(t, "tests are not validated due to timeout") 1300 } 1301 1302 err = c.AcceptConnectionRequest("invalid-id", "", "") 1303 require.Error(t, err) 1304 require.Contains(t, err.Error(), "legacyconnection client - accept connection request:") 1305 } 1306 1307 func TestAcceptInvitation(t *testing.T) { 1308 store := mockstore.NewMockStoreProvider() 1309 km := newKMS(t, store) 1310 didExSvc, err := legacyconnection.New(&mockprotocol.MockProvider{ 1311 StoreProvider: store, 1312 ServiceMap: map[string]interface{}{ 1313 mediator.Coordination: &mockroute.MockMediatorSvc{}, 1314 }, 1315 CustomKMS: km, 1316 KeyTypeValue: kms.ED25519Type, 1317 KeyAgreementTypeValue: kms.X25519ECDHKWType, 1318 }) 1319 require.NoError(t, err) 1320 1321 // create the client 1322 c, err := New(&mockprovider.Provider{ 1323 ProtocolStateStorageProviderValue: mockstore.NewMockStoreProvider(), 1324 StorageProviderValue: store, 1325 ServiceMap: map[string]interface{}{ 1326 legacyconnection.LegacyConnection: didExSvc, 1327 mediator.Coordination: &mockroute.MockMediatorSvc{}, 1328 }, 1329 KMSValue: km, 1330 KeyTypeValue: kms.ED25519Type, 1331 KeyAgreementTypeValue: kms.X25519ECDHKWType, 1332 }) 1333 require.NoError(t, err) 1334 require.NotNil(t, c) 1335 1336 t.Run("accept invitation - success", func(t *testing.T) { 1337 // register action event channel 1338 aCh := make(chan service.DIDCommAction, 10) 1339 err = c.RegisterActionEvent(aCh) 1340 require.NoError(t, err) 1341 1342 go func() { 1343 for e := range aCh { 1344 _, ok := e.Properties.(Event) 1345 require.True(t, ok, "Failed to cast the event properties to service.Event") 1346 1347 // ignore action event 1348 } 1349 }() 1350 1351 // register message event channel 1352 mCh := make(chan service.StateMsg, 10) 1353 err = c.RegisterMsgEvent(mCh) 1354 require.NoError(t, err) 1355 1356 done := make(chan struct{}) 1357 1358 go func() { 1359 for e := range mCh { 1360 prop, ok := e.Properties.(Event) 1361 if !ok { 1362 require.Fail(t, "Failed to cast the event properties to service.Event") 1363 } 1364 1365 if e.Type == service.PostState && e.StateID == "invited" { 1366 require.NoError(t, c.AcceptInvitation(prop.ConnectionID(), "", "")) 1367 } 1368 1369 if e.Type == service.PostState && e.StateID == "requested" { 1370 close(done) 1371 } 1372 } 1373 }() 1374 1375 _, pubKey, e := km.CreateAndExportPubKeyBytes(kms.ED25519Type) 1376 require.NoError(t, e) 1377 1378 // send connection invitation message 1379 invitation, jsonErr := json.Marshal( 1380 &legacyconnection.Invitation{ 1381 Type: InvitationMsgType, 1382 ID: "abc", 1383 Label: "test", 1384 RecipientKeys: []string{base58.Encode(pubKey)}, 1385 }, 1386 ) 1387 require.NoError(t, jsonErr) 1388 1389 msg, svcErr := service.ParseDIDCommMsgMap(invitation) 1390 require.NoError(t, svcErr) 1391 _, err = didExSvc.HandleInbound(msg, service.EmptyDIDCommContext()) 1392 require.NoError(t, err) 1393 1394 select { 1395 case <-done: 1396 case <-time.After(5 * time.Second): 1397 require.Fail(t, "tests are not validated due to timeout") 1398 } 1399 }) 1400 1401 t.Run("accept invitation - error", func(t *testing.T) { 1402 err = c.AcceptInvitation("invalid-id", "", "") 1403 require.Error(t, err) 1404 require.Contains(t, err.Error(), "legacyconnection client - accept connection invitation") 1405 }) 1406 } 1407 1408 func newPeerDID(t *testing.T) *did.Doc { 1409 t.Helper() 1410 1411 a, err := aries.New( 1412 aries.WithStoreProvider(mem.NewProvider()), 1413 aries.WithProtocolStateStoreProvider(mem.NewProvider()), 1414 ) 1415 require.NoError(t, err) 1416 1417 ctx, err := a.Context() 1418 require.NoError(t, err) 1419 1420 d, err := ctx.VDRegistry().Create( 1421 peer.DIDMethod, &did.Doc{Service: []did.Service{{ 1422 Type: "did-communication", 1423 ServiceEndpoint: model.NewDIDCommV1Endpoint("http://agent.example.com/didcomm"), 1424 }}, VerificationMethod: []did.VerificationMethod{getSigningKey()}}) 1425 require.NoError(t, err) 1426 1427 return d.DIDDocument 1428 } 1429 1430 func getSigningKey() did.VerificationMethod { 1431 pub, _, err := ed25519.GenerateKey(rand.Reader) 1432 if err != nil { 1433 panic(err) 1434 } 1435 1436 return did.VerificationMethod{Value: pub[:], Type: "Ed25519VerificationKey2018"} 1437 } 1438 1439 type kmsProvider struct { 1440 store kms.Store 1441 secretLockService secretlock.Service 1442 } 1443 1444 func (k *kmsProvider) StorageProvider() kms.Store { 1445 return k.store 1446 } 1447 1448 func (k *kmsProvider) SecretLock() secretlock.Service { 1449 return k.secretLockService 1450 } 1451 1452 func newKMS(t *testing.T, store spi.Provider) kms.KeyManager { 1453 t.Helper() 1454 1455 kmsStore, err := kms.NewAriesProviderWrapper(store) 1456 require.NoError(t, err) 1457 1458 kmsProv := &kmsProvider{ 1459 store: kmsStore, 1460 secretLockService: &noop.NoLock{}, 1461 } 1462 1463 customKMS, err := localkms.New("local-lock://primary/test/", kmsProv) 1464 require.NoError(t, err) 1465 1466 return customKMS 1467 }