summaryrefslogtreecommitdiffstats
path: root/cps-ri/src/test/groovy/org/onap/cps/spi/impl/CpsPersistencePerfSpecBase.groovy
blob: b67a5cc68661d995d0638403d2139328b54473ca (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
/*
 *  ============LICENSE_START=======================================================
 *  Copyright (C) 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.spi.impl

import org.onap.cps.spi.model.DataNode
import org.onap.cps.spi.model.DataNodeBuilder
import org.springframework.util.StopWatch

class CpsPersistencePerfSpecBase extends CpsPersistenceSpecBase {

    static final String PERF_TEST_DATA = '/data/perf-test.sql'
    static final String PERF_DATASPACE = 'PERF-DATASPACE'
    static final String PERF_ANCHOR = 'PERF-ANCHOR'
    static final String PERF_TEST_PARENT = '/perf-parent-1'

    static def xpathsToAllGrandChildren = []

    static def PERFORMANCE_RECORD = []

    def stopWatch = new StopWatch()

    def cleanupSpec() {
        println('#############################################################################')
        println('##             P E R F O R M A N C E   T E S T   R E S U L T S             ##')
        println('#############################################################################')
        PERFORMANCE_RECORD.sort().each { println(it) }
        PERFORMANCE_RECORD.clear()
    }

    def createLineage(cpsDataPersistenceService, numberOfChildren, numberOfGrandChildren, createLists) {
        xpathsToAllGrandChildren = []
        (1..numberOfChildren).each {
            if (createLists) {
                def xpathFormat = "${PERF_TEST_PARENT}/perf-test-list-${it}[@key='%d']"
                def listElements = goForthAndMultiply(xpathFormat, numberOfGrandChildren)
                cpsDataPersistenceService.addListElements(PERF_DATASPACE, PERF_ANCHOR, PERF_TEST_PARENT, listElements)
            } else {
                def xpathFormat = "${PERF_TEST_PARENT}/perf-test-child-${it}/perf-test-grand-child-%d"
                def grandChildren = goForthAndMultiply(xpathFormat, numberOfGrandChildren)
                def child = new DataNodeBuilder()
                    .withXpath("${PERF_TEST_PARENT}/perf-test-child-${it}")
                    .withChildDataNodes(grandChildren)
                    .build()
                cpsDataPersistenceService.addChildDataNode(PERF_DATASPACE, PERF_ANCHOR, PERF_TEST_PARENT, child)
            }
        }
    }

    def goForthAndMultiply(xpathFormat, numberOfGrandChildren) {
        def grandChildren = []
        (1..numberOfGrandChildren).each {
            def xpath = String.format(xpathFormat as String, it)
            def grandChild = new DataNodeBuilder().withXpath(xpath).build()
            xpathsToAllGrandChildren.add(grandChild.xpath)
            grandChildren.add(grandChild)
        }
        return grandChildren
    }

    def countDataNodes(dataNodes) {
        int nodeCount = 1
        for (DataNode parent : dataNodes) {
            for (DataNode child : parent.childDataNodes) {
                nodeCount = nodeCount + (countDataNodes(child))
            }
        }
        return nodeCount
    }

    def recordAndAssertPerformance(String shortTitle, thresholdInMs, recordedTimeInMs) {
        def pass = recordedTimeInMs <= thresholdInMs
        if (shortTitle.length()>40) {
            shortTitle = shortTitle.substring(0,40)
        }
        def record = String.format('%2d.%-40s limit%,7d took %,7d ms ', PERFORMANCE_RECORD.size()+1, shortTitle, thresholdInMs, recordedTimeInMs)
        record += pass?'PASS':'FAIL'
        PERFORMANCE_RECORD.add(record)
        assert recordedTimeInMs <= thresholdInMs
        return true
    }
}