aboutsummaryrefslogtreecommitdiffstats
path: root/cps-service/src/test/groovy/org/onap/cps/api/impl/YangTextSchemaSourceSetCacheSpec.groovy
blob: 860b7399d25bdd9f2fabe8c1407a9a7c95028212 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*
 * ============LICENSE_START=======================================================
 *  Copyright (C) 2022 Bell Canada
 *  ================================================================================
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 *  SPDX-License-Identifier: Apache-2.0
 *  ============LICENSE_END=========================================================
 */

package org.onap.cps.api.impl

import org.onap.cps.TestUtils
import org.onap.cps.spi.CpsModulePersistenceService
import org.onap.cps.yang.YangTextSchemaSourceSet
import org.onap.cps.yang.YangTextSchemaSourceSetBuilder
import org.spockframework.spring.SpringBean
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.cache.Cache
import org.springframework.cache.CacheManager
import org.springframework.cache.annotation.EnableCaching
import org.springframework.cache.caffeine.CaffeineCacheManager
import org.springframework.test.context.ContextConfiguration
import spock.lang.Specification

@SpringBootTest
@EnableCaching
@ContextConfiguration(classes = [YangTextSchemaSourceSetCache, CaffeineCacheManager])
class YangTextSchemaSourceSetCacheSpec extends Specification {

    @SpringBean
    CpsModulePersistenceService mockModuleStoreService = Mock()

    @Autowired
    YangTextSchemaSourceSetCache objectUnderTest

    @Autowired
    CacheManager cacheManager

    Cache yangResourceCacheImpl;

    def setup() {
        yangResourceCacheImpl = cacheManager.getCache('yangSchema')
        yangResourceCacheImpl.clear()
    }


    def 'Cache Miss: Fetch data from Module persistence'() {
        given: 'cache is empty'
            yangResourceCacheImpl.clear()
        and: 'a schema set exists'
            def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap('bookstore.yang')
            def expectedYangTextSchemaSourceSet = YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap)
        when: 'schema-set information is asked'
            def result = objectUnderTest.get('my-dataspace', 'my-schemaset')
        then: 'information fetched from cps module persistence'
            1 * mockModuleStoreService.getYangSchemaResources('my-dataspace', 'my-schemaset')
                    >> yangResourcesNameToContentMap
        and: 'stored in the cache'
            def cachedValue = getCachedValue('my-dataspace', 'my-schemaset')
            assert cachedValue.getModuleReferences() == expectedYangTextSchemaSourceSet.getModuleReferences()
        and: 'the response is as expected'
            assert result.getModuleReferences() == expectedYangTextSchemaSourceSet.getModuleReferences()
    }

    def 'Cache Hit: Respond from cache'() {
        given: 'a schema set exists'
            def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap('bookstore.yang')
            def expectedYangTextSchemaSourceSet = YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap)
        and: 'stored in cache'
            yangResourceCacheImpl.put(getCacheKey('my-dataspace', 'my-schemaset'), expectedYangTextSchemaSourceSet)
        when: 'schema-set information is asked'
            def result = objectUnderTest.get('my-dataspace', 'my-schemaset')
        then: 'expected value is returned'
            result.getModuleReferences() == expectedYangTextSchemaSourceSet.getModuleReferences()
        and: 'module persistence is not invoked'
            0 * mockModuleStoreService.getYangSchemaResources(_, _)
    }

    def 'Cache Update: when no data exist in the cache'() {
        given: 'a schema set exists'
            def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap('bookstore.yang')
            def yangTextSchemaSourceSet = YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap)
        when: 'cache is updated'
            objectUnderTest.updateCache('my-dataspace', 'my-schemaset', yangTextSchemaSourceSet)
        then: 'cached value is same as expected'
            def cachedValue = getCachedValue('my-dataspace', 'my-schemaset')
            cachedValue.getModuleReferences() == yangTextSchemaSourceSet.getModuleReferences()
    }

    def 'Cache Evict: remove when exist'() {
        given: 'a schema set exists in cache'
            def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap('bookstore.yang')
            def yangTextSchemaSourceSet = YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap)
            yangResourceCacheImpl.put(getCacheKey('my-dataspace', 'my-schemaset'), yangTextSchemaSourceSet)
            def cachedValue = getCachedValue('my-dataspace', 'my-schemaset')
            assert cachedValue.getModuleReferences() == yangTextSchemaSourceSet.getModuleReferences()
        when: 'cache is evicted for schemaset'
            objectUnderTest.removeFromCache('my-dataspace', 'my-schemaset')
        then: 'cached does not have value'
            assert getCachedValue('my-dataspace', 'my-schemaset') == null
    }

    def 'Cache Evict: remove when does not exist'() {
        given: 'cache is empty'
            yangResourceCacheImpl.clear()
        when: 'cache is evicted for schemaset'
            objectUnderTest.removeFromCache('my-dataspace', 'my-schemaset')
        then: 'cached does not have value'
            assert getCachedValue('my-dataspace', 'my-schemaset') == null
    }

    def getCachedValue(dataSpace, schemaSet) {
        yangResourceCacheImpl.get(getCacheKey(dataSpace, schemaSet), YangTextSchemaSourceSet)
    }

    def getCacheKey(dataSpace, schemaSet) {
        return new String("${dataSpace}-${schemaSet}")
    }


}