aboutsummaryrefslogtreecommitdiffstats
path: root/ms/blueprintsprocessor/modules/services/workflow-service/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/BluePrintWorkflowExecutionServiceImplTest.kt
blob: 8295f924ab006736e2aa45e6ace098ca202a1617 (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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
/*
 *  Copyright © 2019 IBM.
 *
 *  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.
 */

package org.onap.ccsdk.cds.blueprintsprocessor.services.workflow

import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.node.ObjectNode
import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkObject
import io.mockk.unmockkAll
import kotlinx.coroutines.runBlocking
import org.junit.After
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ActionIdentifiers
import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.CommonHeader
import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceInput
import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceOutput
import org.onap.ccsdk.cds.blueprintsprocessor.services.workflow.mock.MockComponentFunction
import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants
import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintError
import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintProcessorException
import org.onap.ccsdk.cds.controllerblueprints.core.asJsonType
import org.onap.ccsdk.cds.controllerblueprints.core.data.Step
import org.onap.ccsdk.cds.controllerblueprints.core.data.Workflow
import org.onap.ccsdk.cds.controllerblueprints.core.interfaces.BluePrintWorkflowExecutionService
import org.onap.ccsdk.cds.controllerblueprints.core.service.BluePrintContext
import org.onap.ccsdk.cds.controllerblueprints.core.service.BluePrintDependencyService
import org.onap.ccsdk.cds.controllerblueprints.core.service.BluePrintRuntimeService
import org.onap.ccsdk.cds.controllerblueprints.core.utils.BluePrintMetadataUtils
import org.onap.ccsdk.cds.controllerblueprints.core.utils.JacksonUtils
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.test.context.ContextConfiguration
import org.springframework.test.context.junit4.SpringRunner
import java.lang.RuntimeException
import kotlin.test.assertEquals
import kotlin.test.assertFailsWith
import kotlin.test.assertNotNull

@RunWith(SpringRunner::class)
@ContextConfiguration(classes = [WorkflowServiceConfiguration::class])
class BluePrintWorkflowExecutionServiceImplTest {

    @Autowired
    lateinit var bluePrintWorkflowExecutionService: BluePrintWorkflowExecutionService<ExecutionServiceInput, ExecutionServiceOutput>

    @Before
    fun init() {
        mockkObject(BluePrintDependencyService)
        every { BluePrintDependencyService.applicationContext.getBean(any()) } returns MockComponentFunction()
    }

    @After
    fun afterTests() {
        unmockkAll()
    }

    @Test
    fun testBluePrintWorkflowExecutionService() {
        runBlocking {
            val bluePrintRuntimeService = BluePrintMetadataUtils.getBluePrintRuntime(
                "1234",
                "./../../../../../components/model-catalog/blueprint-model/test-blueprint/baseconfiguration"
            )

            val executionServiceInput = JacksonUtils.readValueFromClassPathFile(
                "execution-input/resource-assignment-input.json",
                ExecutionServiceInput::class.java
            )!!

            val executionServiceOutput = bluePrintWorkflowExecutionService
                .executeBluePrintWorkflow(bluePrintRuntimeService, executionServiceInput, hashMapOf())

            assertNotNull(executionServiceOutput, "failed to get response")
            assertEquals(
                BluePrintConstants.STATUS_SUCCESS, executionServiceOutput.status.message,
                "failed to get successful response"
            )
        }
    }

    @Test
    fun testImperativeBluePrintWorkflowExecutionService() {
        runBlocking {
            val bluePrintRuntimeService = BluePrintMetadataUtils.getBluePrintRuntime(
                "1234",
                "./../../../../../components/model-catalog/blueprint-model/test-blueprint/baseconfiguration"
            )

            val executionServiceInput = JacksonUtils.readValueFromClassPathFile(
                "execution-input/imperative-test-input.json",
                ExecutionServiceInput::class.java
            )!!

            val executionServiceOutput = bluePrintWorkflowExecutionService
                .executeBluePrintWorkflow(bluePrintRuntimeService, executionServiceInput, hashMapOf())

            assertNotNull(executionServiceOutput, "failed to get response")
            assertEquals(
                BluePrintConstants.STATUS_SUCCESS, executionServiceOutput.status.message,
                "failed to get successful response"
            )
        }
    }

    @Test
    fun `Blueprint fails on missing workflowName-parameters with a useful message`() {
        assertFailsWith(exceptionClass = BluePrintProcessorException::class) {
            runBlocking {
                val bluePrintRuntimeService = BluePrintMetadataUtils.getBluePrintRuntime(
                    "1234",
                    "./../../../../../components/model-catalog/blueprint-model/test-blueprint/baseconfiguration"
                )
                // service input will have a mislabeled input params, we are expecting to get an error when that happens with a useful error message
                val executionServiceInput =
                    JacksonUtils.readValueFromClassPathFile(
                        "execution-input/resource-assignment-input-missing-resource_assignment_request.json",
                        ExecutionServiceInput::class.java
                    )!!

                val executionServiceOutput = bluePrintWorkflowExecutionService
                    .executeBluePrintWorkflow(bluePrintRuntimeService, executionServiceInput, hashMapOf())
            }
        }
    }

    @Test
    fun `Should handle errors from resolve workflow output`() {
        val imperativeWorkflowExecutionService: ImperativeWorkflowExecutionService = mockk()
        val bluePrintWorkflowExecutionServiceImpl = BluePrintWorkflowExecutionServiceImpl(
                mockk(), mockk(), imperativeWorkflowExecutionService)
        val bluePrintRuntimeService: BluePrintRuntimeService<MutableMap<String, JsonNode>> = mockk()
        val bluePrintContext: BluePrintContext = mockk()
        val executionServiceInput = ExecutionServiceInput().apply {
            this.actionIdentifiers = ActionIdentifiers().apply { this.actionName = "config-assign" }
            this.commonHeader = CommonHeader()
            this.payload = """{"config-assign-request": {}}""".asJsonType() as ObjectNode
        }
        val workflow = Workflow().apply {
            this.steps = mutableMapOf("one" to Step(), "two" to Step())
        }
        val blueprintError = BluePrintError()

        every { bluePrintRuntimeService.bluePrintContext() } returns bluePrintContext
        every { bluePrintRuntimeService.assignWorkflowInputs(any(), any()) } returns Unit
        every { bluePrintContext.workflowByName(any()) } returns workflow
        every {
            bluePrintRuntimeService.resolveWorkflowOutputs(any())
        } throws RuntimeException("failed to resolve property...")
        every {
            runBlocking {
                imperativeWorkflowExecutionService.executeBluePrintWorkflow(any(), any(), any())
            }
        } returns ExecutionServiceOutput()
        every { bluePrintRuntimeService.getBluePrintError() } returns blueprintError

        runBlocking {
            val output = bluePrintWorkflowExecutionServiceImpl.executeBluePrintWorkflow(
                    bluePrintRuntimeService, executionServiceInput, mutableMapOf())
            assertEquals("failed to resolve property...", blueprintError.errors[0])
            assertEquals("""{"config-assign-response":{}}""".asJsonType(), output.payload)
        }
    }
}