github.com/Axway/agent-sdk@v1.1.101/pkg/agent/cache/manager_test.go (about)

     1  package cache
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"testing"
     7  
     8  	defs "github.com/Axway/agent-sdk/pkg/apic/definitions"
     9  
    10  	v1 "github.com/Axway/agent-sdk/pkg/apic/apiserver/models/api/v1"
    11  	"github.com/Axway/agent-sdk/pkg/config"
    12  	"github.com/stretchr/testify/assert"
    13  )
    14  
    15  func createAPIService(apiID, apiName, primaryKey string) *v1.ResourceInstance {
    16  	sub := map[string]interface{}{
    17  		defs.AttrExternalAPIID:         apiID,
    18  		defs.AttrExternalAPIName:       apiName,
    19  		defs.AttrExternalAPIPrimaryKey: primaryKey,
    20  	}
    21  
    22  	if primaryKey != "" {
    23  		sub[defs.AttrExternalAPIPrimaryKey] = primaryKey
    24  	}
    25  
    26  	return &v1.ResourceInstance{
    27  		ResourceMeta: v1.ResourceMeta{
    28  			Name: fmt.Sprintf("name-%s", apiName),
    29  			SubResources: map[string]interface{}{
    30  				defs.XAgentDetails: sub,
    31  			},
    32  		},
    33  	}
    34  }
    35  
    36  func createAPIServiceInstance(id, apiID, stage string) *v1.ResourceInstance {
    37  	return createAPIServiceInstanceWithVersion(id, apiID, stage, "")
    38  }
    39  
    40  func createAPIServiceInstanceWithVersion(id, apiID, stage, version string) *v1.ResourceInstance {
    41  	sub := map[string]interface{}{
    42  		defs.AttrExternalAPIID:         apiID,
    43  		defs.AttrExternalAPIStage:      stage,
    44  		defs.AttrExternalAPIPrimaryKey: fmt.Sprintf("%s-%s", apiID, stage),
    45  		defs.AttrExternalAPIVersion:    version,
    46  	}
    47  	return &v1.ResourceInstance{
    48  		ResourceMeta: v1.ResourceMeta{
    49  			Name: fmt.Sprintf("name-%s", id),
    50  			Metadata: v1.Metadata{
    51  				ID: id,
    52  			},
    53  			SubResources: map[string]interface{}{
    54  				defs.XAgentDetails: sub,
    55  			},
    56  		},
    57  	}
    58  }
    59  
    60  func createRI(id, name string) *v1.ResourceInstance {
    61  	return &v1.ResourceInstance{
    62  		ResourceMeta: v1.ResourceMeta{
    63  			Metadata: v1.Metadata{
    64  				ID: id,
    65  			},
    66  			Name: name,
    67  		},
    68  	}
    69  }
    70  
    71  // add api service with externalAPIID, externalAPIName
    72  // add api service with externalAPIPrimaryKey, externalAPIID, externalAPIName
    73  // add existing api service with externalAPIID, externalAPIName
    74  // get api service with APIID added by externalAPIID
    75  // get api service with APIID added by externalAPIPrimaryKey
    76  // get api service with Name added by externalAPIID
    77  // get api service with Name added by externalAPIPrimaryKey
    78  // get api service with invalid primary key
    79  // get api service with primary key added by externalAPIPrimaryKey
    80  // delete api service with APIID added by externalAPIID
    81  // delete api service with APIID added by externalAPIPrimaryKey
    82  func TestAPIServiceCache(t *testing.T) {
    83  	m := NewAgentCacheManager(&config.CentralConfiguration{}, false)
    84  	assert.NotNil(t, m)
    85  
    86  	apiCache := m.GetAPIServiceCache()
    87  	assert.NotNil(t, apiCache)
    88  	assert.Equal(t, apiCache.GetKeys(), m.GetAPIServiceKeys())
    89  
    90  	api1 := createAPIService("id1", "api1", "")
    91  	api2 := createAPIService("id2", "api2", "api2key")
    92  	api1.Owner = &v1.Owner{Type: v1.TeamOwner, ID: "teamID1"}
    93  	api2.Owner = &v1.Owner{Type: v1.TeamOwner, ID: "teamID2"}
    94  
    95  	err := m.AddAPIService(api1)
    96  	assert.Nil(t, err)
    97  
    98  	err = m.AddAPIService(api2)
    99  	assert.Nil(t, err)
   100  
   101  	err = m.AddAPIService(api2)
   102  	assert.Nil(t, err)
   103  
   104  	teamIDs := m.GetTeamsIDsInAPIServices()
   105  	assert.ElementsMatch(t, []string{"teamID1", "teamID2"}, teamIDs)
   106  
   107  	cachedAPI := m.GetAPIServiceWithAPIID("id1")
   108  	assert.Equal(t, api1, cachedAPI)
   109  
   110  	cachedAPI = m.GetAPIServiceWithAPIID("id2")
   111  	assert.Equal(t, api2, cachedAPI)
   112  
   113  	cachedAPI = m.GetAPIServiceWithName("api1")
   114  	assert.Equal(t, api1, cachedAPI)
   115  
   116  	cachedAPI = m.GetAPIServiceWithName("api2")
   117  	assert.Equal(t, api2, cachedAPI)
   118  
   119  	cachedAPI = m.GetAPIServiceWithPrimaryKey("api1key")
   120  	assert.Nil(t, cachedAPI)
   121  
   122  	cachedAPI = m.GetAPIServiceWithPrimaryKey("api2key")
   123  	assert.Equal(t, api2, cachedAPI)
   124  
   125  	err = m.DeleteAPIService("api1")
   126  	assert.Nil(t, err)
   127  	cachedAPI = m.GetAPIServiceWithAPIID("api1")
   128  	assert.Nil(t, cachedAPI)
   129  
   130  	err = m.DeleteAPIService("api2")
   131  	assert.Nil(t, err)
   132  	cachedAPI = m.GetAPIServiceWithAPIID("api2")
   133  	assert.Nil(t, cachedAPI)
   134  
   135  	err = m.DeleteAPIService("api2")
   136  	assert.NotNil(t, err)
   137  }
   138  
   139  // add api service instance
   140  // get api service instance by ID
   141  // get api service instance with invalid ID
   142  // delete api service instance by ID
   143  // delete all api service instance
   144  func TestAPIServiceInstanceCache(t *testing.T) {
   145  	m := NewAgentCacheManager(&config.CentralConfiguration{}, false)
   146  	assert.NotNil(t, m)
   147  	assert.Equal(t, []string{}, m.GetAPIServiceInstanceKeys())
   148  
   149  	api1 := createAPIService("apiID1", "api1", "api1key")
   150  	instance1 := createAPIServiceInstance("id1", "apiID1", "stage1")
   151  	instance2 := createAPIServiceInstance("id2", "apiID2", "stage2")
   152  
   153  	m.AddAPIService(api1)
   154  	m.AddAPIServiceInstance(instance1)
   155  	m.AddAPIServiceInstance(instance2)
   156  	assert.ElementsMatch(t, []string{"id1", "id2"}, m.GetAPIServiceInstanceKeys())
   157  
   158  	allInstances := m.ListAPIServiceInstances()
   159  	assert.ElementsMatch(t, []*v1.ResourceInstance{instance1, instance2}, allInstances)
   160  
   161  	cachedInstance, err := m.GetAPIServiceInstanceByID("id1")
   162  	assert.Nil(t, err)
   163  	assert.Equal(t, instance1, cachedInstance)
   164  	assert.Equal(t, 1, m.GetAPIServiceInstanceCount(api1.Name))
   165  
   166  	cachedInstance, err = m.GetAPIServiceInstanceByName("name-id1")
   167  	assert.Nil(t, err)
   168  	assert.Equal(t, instance1, cachedInstance)
   169  	assert.Equal(t, 1, m.GetAPIServiceInstanceCount(api1.Name))
   170  
   171  	err = m.DeleteAPIServiceInstance("id1")
   172  	assert.Nil(t, err)
   173  	assert.ElementsMatch(t, []string{"id2"}, m.GetAPIServiceInstanceKeys())
   174  
   175  	cachedInstance, err = m.GetAPIServiceInstanceByID("id1")
   176  	assert.NotNil(t, err)
   177  	assert.Nil(t, cachedInstance)
   178  	assert.Equal(t, 0, m.GetAPIServiceInstanceCount(instance2.Name))
   179  
   180  	cachedInstance, err = m.GetAPIServiceInstanceByName("name-id1")
   181  	assert.NotNil(t, err)
   182  	assert.Nil(t, cachedInstance)
   183  	assert.Equal(t, 0, m.GetAPIServiceInstanceCount(instance2.Name))
   184  
   185  	m.DeleteAllAPIServiceInstance()
   186  	assert.ElementsMatch(t, []string{}, m.GetAPIServiceInstanceKeys())
   187  }
   188  
   189  // add sequence
   190  // get sequence
   191  func TestSequenceCache(t *testing.T) {
   192  	m := NewAgentCacheManager(&config.CentralConfiguration{}, false)
   193  	assert.NotNil(t, m)
   194  
   195  	m.AddSequence("watch1", 1)
   196  	assert.Equal(t, int64(1), m.GetSequence("watch1"))
   197  	assert.Equal(t, int64(0), m.GetSequence("invalidwatch"))
   198  	m.AddSequence("watch1", 2)
   199  	assert.Equal(t, int64(2), m.GetSequence("watch1"))
   200  }
   201  
   202  // create manager
   203  // add items to cache
   204  // save cache
   205  // create manager initialized with persisted cache
   206  // validate all original cached items exists
   207  func TestCachePersistenc(t *testing.T) {
   208  	m := NewAgentCacheManager(&config.CentralConfiguration{AgentName: "test", GRPCCfg: config.GRPCConfig{Enabled: true}}, true)
   209  	assert.NotNil(t, m)
   210  
   211  	api1 := createAPIService("id1", "apiID", "")
   212  	err := m.AddAPIService(api1)
   213  	assert.Nil(t, err)
   214  
   215  	instance1 := createAPIServiceInstance("id1", "apiID", "stage")
   216  	m.AddAPIServiceInstance(instance1)
   217  
   218  	m.AddSequence("watch1", 1)
   219  
   220  	defer func() {
   221  		// Remove file if it exists
   222  		_, err := os.Stat("./data")
   223  		if !os.IsExist(err) {
   224  			os.RemoveAll("./data")
   225  		}
   226  	}()
   227  
   228  	m.SaveCache()
   229  
   230  	m2 := NewAgentCacheManager(&config.CentralConfiguration{AgentName: "test", GRPCCfg: config.GRPCConfig{Enabled: true}}, true)
   231  
   232  	persistedAPI := m2.GetAPIServiceWithAPIID("id1")
   233  	assert.ElementsMatch(t, m.GetAPIServiceKeys(), m2.GetAPIServiceKeys())
   234  	assertResourceInstance(t, api1, persistedAPI)
   235  	// instance count not updated properly check
   236  	assert.Equal(t, 0, m2.GetAPIServiceInstanceCount(api1.Name))
   237  
   238  	persistedInstance, err := m2.GetAPIServiceInstanceByID("id1")
   239  	assert.Nil(t, err)
   240  	assert.ElementsMatch(t, m.GetAPIServiceInstanceKeys(), m2.GetAPIServiceInstanceKeys())
   241  	assertResourceInstance(t, instance1, persistedInstance)
   242  
   243  	persistedSeq := m2.GetSequence("watch1")
   244  	assert.Equal(t, int64(1), persistedSeq)
   245  }
   246  
   247  func assertResourceInstance(t *testing.T, expected *v1.ResourceInstance, actual *v1.ResourceInstance) {
   248  	assert.Equal(t, expected.Name, actual.Name)
   249  	assert.Equal(t, expected.Title, actual.Title)
   250  	assert.Equal(t, expected.Group, actual.Group)
   251  	assert.Equal(t, expected.Kind, actual.Kind)
   252  	assert.Equal(t, expected.Metadata.ID, actual.Metadata.ID)
   253  	assert.Equal(t, expected.Attributes, actual.Attributes)
   254  	assert.Equal(t, expected.Spec, actual.Spec)
   255  	assert.Equal(t, expected.SubResources, actual.SubResources)
   256  }
   257  
   258  func createRequestDefinition(name, id string) *v1.ResourceInstance {
   259  	return &v1.ResourceInstance{
   260  		ResourceMeta: v1.ResourceMeta{
   261  			Name: name,
   262  			Metadata: v1.Metadata{
   263  				ID: id,
   264  			},
   265  		},
   266  	}
   267  }
   268  
   269  func TestAccessRequestDefinitionCache(t *testing.T) {
   270  	m := NewAgentCacheManager(&config.CentralConfiguration{}, false)
   271  	assert.NotNil(t, m)
   272  
   273  	ard1 := createRequestDefinition("name1", "id1")
   274  	ard2 := createRequestDefinition("name2", "id2")
   275  
   276  	m.AddAccessRequestDefinition(ard1)
   277  	m.AddAccessRequestDefinition(ard2)
   278  
   279  	cachedARD, err := m.GetAccessRequestDefinitionByName("name1")
   280  	assert.Nil(t, err)
   281  	assert.Equal(t, ard1, cachedARD)
   282  
   283  	cachedARD, err = m.GetAccessRequestDefinitionByID("id1")
   284  	assert.Nil(t, err)
   285  	assert.Equal(t, ard1, cachedARD)
   286  
   287  	err = m.DeleteAccessRequestDefinition("id1")
   288  	assert.Nil(t, err)
   289  
   290  	cachedARD, err = m.GetAccessRequestDefinitionByName("name1")
   291  	assert.NotNil(t, err)
   292  	assert.Nil(t, cachedARD)
   293  
   294  	cachedARD, err = m.GetAccessRequestDefinitionByID("id1")
   295  	assert.NotNil(t, err)
   296  	assert.Nil(t, cachedARD)
   297  }
   298  
   299  func TestCredentialRequestDefinitionCache(t *testing.T) {
   300  	m := NewAgentCacheManager(&config.CentralConfiguration{}, false)
   301  	assert.NotNil(t, m)
   302  
   303  	crd1 := createRequestDefinition("name1", "id1")
   304  	crd2 := createRequestDefinition("name2", "id2")
   305  
   306  	m.AddCredentialRequestDefinition(crd1)
   307  	m.AddCredentialRequestDefinition(crd2)
   308  
   309  	crdKeys := m.GetCredentialRequestDefinitionKeys()
   310  	assert.ElementsMatch(t, []string{"id1", "id2"}, crdKeys)
   311  
   312  	cachedCRDs := m.ListCredentialRequestDefinitions()
   313  	assert.ElementsMatch(t, []*v1.ResourceInstance{crd1, crd2}, cachedCRDs)
   314  
   315  	cachedCRD, err := m.GetCredentialRequestDefinitionByName("name1")
   316  	assert.Nil(t, err)
   317  	assert.Equal(t, crd1, cachedCRD)
   318  
   319  	cachedCRD, err = m.GetCredentialRequestDefinitionByID("id1")
   320  	assert.Nil(t, err)
   321  	assert.Equal(t, crd1, cachedCRD)
   322  
   323  	err = m.DeleteCredentialRequestDefinition("id1")
   324  	assert.Nil(t, err)
   325  
   326  	cachedCRD, err = m.GetCredentialRequestDefinitionByName("name1")
   327  	assert.NotNil(t, err)
   328  	assert.Nil(t, cachedCRD)
   329  
   330  	cachedCRD, err = m.GetCredentialRequestDefinitionByName("id1")
   331  	assert.NotNil(t, err)
   332  	assert.Nil(t, cachedCRD)
   333  }