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  }