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
134
135
136
137
138
|
/*
* ============LICENSE_START========================================================
* Copyright (C) 2022-2023 Nordix Foundation
* ================================================================================
* 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.ncmp.api.impl.config.embeddedcache
import com.hazelcast.config.Config
import com.hazelcast.core.Hazelcast
import com.hazelcast.map.IMap
import org.onap.cps.spi.model.DataNode
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.test.context.ContextConfiguration
import spock.lang.Specification
import java.util.concurrent.BlockingQueue
import java.util.concurrent.TimeUnit
@SpringBootTest
@ContextConfiguration(classes = [SynchronizationCacheConfig])
class SynchronizationCacheConfigSpec extends Specification {
@Autowired
private BlockingQueue<DataNode> moduleSyncWorkQueue
@Autowired
private IMap<String, Object> moduleSyncStartedOnCmHandles
@Autowired
private IMap<String, Boolean> dataSyncSemaphores
def 'Embedded (hazelcast) Caches for Module and Data Sync.'() {
expect: 'system is able to create an instance of the Module Sync Work Queue'
assert null != moduleSyncWorkQueue
and: 'system is able to create an instance of a map to hold cm handles which have started (and maybe finished) module sync'
assert null != moduleSyncStartedOnCmHandles
and: 'system is able to create an instance of a map to hold data sync semaphores'
assert null != dataSyncSemaphores
and: 'there are at least 3 instances'
assert Hazelcast.allHazelcastInstances.size() > 2
and: 'they have the correct names (in any order)'
assert Hazelcast.allHazelcastInstances.name.containsAll('moduleSyncWorkQueue', 'moduleSyncStartedOnCmHandles', 'dataSyncSemaphores' )
}
def 'Verify configs for Distributed objects'(){
given: 'the Module Sync Work Queue config'
def queueConfig = Hazelcast.getHazelcastInstanceByName('moduleSyncWorkQueue').config.queueConfigs.get('defaultQueueConfig')
and: 'the Module Sync Started Cm Handle Map config'
def moduleSyncStartedOnCmHandlesConfig = Hazelcast.getHazelcastInstanceByName('moduleSyncStartedOnCmHandles').config.mapConfigs.get('moduleSyncStartedConfig')
and: 'the Data Sync Semaphores Map config'
def dataSyncSemaphoresConfig = Hazelcast.getHazelcastInstanceByName('dataSyncSemaphores').config.mapConfigs.get('dataSyncSemaphoresConfig')
expect: 'system created instance with correct config of Module Sync Work Queue'
assert queueConfig.backupCount == 3
assert queueConfig.asyncBackupCount == 3
and: 'Module Sync Started Cm Handle Map has the correct settings'
assert moduleSyncStartedOnCmHandlesConfig.backupCount == 3
assert moduleSyncStartedOnCmHandlesConfig.asyncBackupCount == 3
and: 'Data Sync Semaphore Map has the correct settings'
assert dataSyncSemaphoresConfig.backupCount == 3
assert dataSyncSemaphoresConfig.asyncBackupCount == 3
}
def 'Verify deployment network configs for Distributed objects'() {
given: 'the Module Sync Work Queue config'
def queueNetworkConfig = Hazelcast.getHazelcastInstanceByName('moduleSyncWorkQueue').config.networkConfig
and: 'the Module Sync Started Cm Handle Map config'
def moduleSyncStartedOnCmHandlesNetworkConfig = Hazelcast.getHazelcastInstanceByName('moduleSyncStartedOnCmHandles').config.networkConfig
and: 'the Data Sync Semaphores Map config'
def dataSyncSemaphoresNetworkConfig = Hazelcast.getHazelcastInstanceByName('dataSyncSemaphores').config.networkConfig
expect: 'system created instance with correct config of Module Sync Work Queue'
assert queueNetworkConfig.join.autoDetectionConfig.enabled
assert !queueNetworkConfig.join.kubernetesConfig.enabled
and: 'Module Sync Started Cm Handle Map has the correct settings'
assert moduleSyncStartedOnCmHandlesNetworkConfig.join.autoDetectionConfig.enabled
assert !moduleSyncStartedOnCmHandlesNetworkConfig.join.kubernetesConfig.enabled
and: 'Data Sync Semaphore Map has the correct settings'
assert dataSyncSemaphoresNetworkConfig.join.autoDetectionConfig.enabled
assert !dataSyncSemaphoresNetworkConfig.join.kubernetesConfig.enabled
}
def 'Verify network config'() {
given: 'Synchronization config object and test configuration'
def objectUnderTest = new SynchronizationCacheConfig()
def testConfig = new Config()
when: 'kubernetes properties are enabled'
objectUnderTest.cacheKubernetesEnabled = true
objectUnderTest.cacheKubernetesServiceName = 'test-service-name'
and: 'method called to update the discovery mode'
objectUnderTest.updateDiscoveryMode(testConfig)
then: 'applied properties are reflected'
assert testConfig.networkConfig.join.kubernetesConfig.enabled
assert testConfig.networkConfig.join.kubernetesConfig.properties.get('service-name') == 'test-service-name'
}
def 'Time to Live Verify for Module Sync Semaphore'() {
when: 'the key is inserted with a TTL of 1 second (Hazelcast TTL resolution is seconds!)'
moduleSyncStartedOnCmHandles.put('testKeyModuleSync', 'toBeExpired' as Object, 1, TimeUnit.SECONDS)
then: 'the entry is present in the map'
assert moduleSyncStartedOnCmHandles.get('testKeyModuleSync') != null
and: 'the entry expires in less then 2 seconds'
waitMax2SecondsForKeyExpiration(moduleSyncStartedOnCmHandles, 'testKeyModuleSync')
}
def 'Time to Live Verify for Data Sync Semaphore'() {
when: 'the key is inserted with a TTL of 1 second'
dataSyncSemaphores.put('testKeyDataSync', Boolean.TRUE, 1, TimeUnit.SECONDS)
then: 'the entry is present in the map'
assert dataSyncSemaphores.get('testKeyDataSync') != null
and: 'the entry expires in less then 2 seconds'
waitMax2SecondsForKeyExpiration(dataSyncSemaphores, 'testKeyDataSync')
}
def waitMax2SecondsForKeyExpiration(map, key) {
def count = 0
while ( map.get(key)!=null && ++count <= 20 ) {
sleep(100)
}
return count < 20 // Should have expired in less the 20 x 100ms = 2 seconds!
}
}
|