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 }