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

import org.apache.commons.lang3.time.StopWatch
import org.onap.cps.spi.CpsDataPersistenceService
import org.onap.cps.spi.impl.CpsPersistenceSpecBase
import org.onap.cps.spi.model.DataNode
import org.onap.cps.spi.model.DataNodeBuilder
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.test.context.jdbc.Sql
import static org.onap.cps.spi.FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS

class CpsToDataNodePerfSpec extends CpsPersistenceSpecBase {

    @Autowired
    CpsDataPersistenceService objectUnderTest

    static final String SET_DATA = '/data/fragment.sql'
    static final String  XPATH_DATA_NODE_WITH_DESCENDANTS = '/parent-1'

    @Sql([CLEAR_DATA, SET_DATA])
    def 'Get data node by xpath with all descendants with many children'() {
        given: 'nodes and grandchildren have been persisted'
            def setupStopWatch = new StopWatch()
            setupStopWatch.start()
            createLineage()
            setupStopWatch.stop()
            def setupDurationInMillis = setupStopWatch.getTime()
        when: 'data node is requested with all descendants'
            def readStopWatch = new StopWatch()
            readStopWatch.start()
            def result = objectUnderTest.getDataNode(
                DATASPACE_NAME, ANCHOR_NAME1, XPATH_DATA_NODE_WITH_DESCENDANTS, INCLUDE_ALL_DESCENDANTS)
            readStopWatch.stop()
            def readDurationInMillis = readStopWatch.getTime()
        then : 'setup duration is under 8 seconds'
            assert setupDurationInMillis < 8000
        and: 'read duration is under 6 seconds'
            assert readDurationInMillis < 6000
        and: 'data node is returned with all the descendants populated'
            assert countDataNodes(result) == 1533
    }

    def createLineage() {
        def numOfChildren = 30
        def numOfGrandChildren = 50
        (1..numOfChildren).each {
            def childName = "perf-test-child-${it}".toString()
            def newChild = goForthAndMultiply(XPATH_DATA_NODE_WITH_DESCENDANTS, childName, numOfGrandChildren)
            objectUnderTest.addChildDataNode(DATASPACE_NAME, ANCHOR_NAME1, XPATH_DATA_NODE_WITH_DESCENDANTS, newChild)
        }
    }

    def goForthAndMultiply(parentXpath, childName, numOfGrandChildren) {
        def children = []
        (1..numOfGrandChildren).each {
            def child = new DataNodeBuilder().withXpath("${parentXpath}/${childName}/${it}-grand-child").build()
            children.add(child)
        }
        return new DataNodeBuilder().withXpath("${parentXpath}/${childName}").withChildDataNodes(children).build()
    }

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