github.com/hyperledger/aries-framework-go@v0.3.2/pkg/client/connection/client_test.go (about)

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