aboutsummaryrefslogtreecommitdiffstats
path: root/src/test/java/org/onap/aai/babel/xml/generator/model/TestVfModule.java
blob: d752ecdefedf6ba3b9de400b41252ac512a3b4ec (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
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
/**
 * ============LICENSE_START=======================================================
 * org.onap.aai
 * ================================================================================
 * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
 * Copyright (c) 2017-2019 European Software Marketing Ltd.
 * ================================================================================
 * 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.
 * ============LICENSE_END=========================================================
 */

package org.onap.aai.babel.xml.generator.model;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.collection.IsCollectionWithSize.hasSize;

import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.onap.aai.babel.util.ArtifactTestUtils;
import org.onap.aai.babel.xml.generator.XmlArtifactGenerationException;

/**
 * Direct tests of the VFMODULE Resource and Widget functionality to improve code coverage.
 */
public class TestVfModule {

    /**
     * Load the Widget mappings configuration.
     *
     * @throws IOException
     *             if the mappings configuration cannot be loaded
     */
    @BeforeAll
    public static void setup() throws IOException {
        new ArtifactTestUtils().loadWidgetMappings();
    }

    /**
     * Call hashCode() method for code coverage.
     */
    @Test
    public void testHashCode() {
        Resource vfModule = createNewVfModule();
        populateIdentInfo(vfModule);
        assertThat(vfModule.hashCode(), is(notNullValue()));
    }

    /**
     * Call equals() method for code coverage.
     */
    @Test
    public void testEquals() {
        Resource vfModuleA = createNewVfModule();
        populateIdentInfo(vfModuleA);

        // equals() is reflexive
        assertThat(vfModuleA.equals(vfModuleA), is(true));

        // equals() is symmetric
        Resource vfModuleB = createNewVfModule();
        populateIdentInfo(vfModuleB);
        assertThat(vfModuleA.equals(vfModuleB), is(true));
        assertThat(vfModuleB.equals(vfModuleA), is(true));

        assertThat(vfModuleA.equals(null), is(false));
    }

    @Test
    public void testAddVServerWidgetToVf() throws XmlArtifactGenerationException {
        assertAddWidget(createNewVfModule(), WidgetType.valueOf("VSERVER"));
    }

    @Test
    public void testAddServiceWidgetToVf() throws XmlArtifactGenerationException {
        assertAddWidget(createNewVfModule(), WidgetType.valueOf("SERVICE"));
    }

    /**
     * Add a new Widget to a VF Module, where the Widget is NOT set as a member. N.B. For the current VF Module
     * implementation the actual Widget type is not important.
     *
     * @throws XmlArtifactGenerationException
     *             if the Widget mapping configuration is missing
     */
    @Test
    public void testNonMemberWidgetToVf() throws XmlArtifactGenerationException {
        Resource vfModule = createNewVfModule();
        assertThat(vfModule.addWidget(Widget.createWidget("SERVICE")), is(false));
        assertNumberOfWidgets(vfModule, 0);
    }

    /**
     * OAM Network is specifically excluded from a VF Module.
     *
     * @throws XmlArtifactGenerationException
     *             if the Widget mapping configuration is missing
     */
    @Test
    public void testAddOamNetworkWidgetToVf() throws XmlArtifactGenerationException {
        Resource vfModule = createNewVfModule();
        assertThat(createNewWidgetForModule(vfModule, WidgetType.valueOf("OAM_NETWORK")), is(false));
        assertNumberOfWidgets(vfModule, 0);
    }

    /**
     * Add a Volume Widget to a VF Module via a vserver Widget.
     *
     * <li>Create a VF Module</li>
     * <li>Add a Volume Widget</li>
     * <li>Add a vserver Widget</li>
     * <li>Check that the Volume Widget appears under the vserver</li>
     *
     * @throws XmlArtifactGenerationException
     *             if the Widget mapping configuration is missing
     */
    @Test
    public void testAddVolumeWidgetToVf() throws XmlArtifactGenerationException {
        Resource vfModule = createNewVfModule();

        // Adding a Volume widget has no effect until a vserver widget is added.
        assertAddWidget(vfModule, WidgetType.valueOf("VOLUME"));
        assertNumberOfWidgets(vfModule, 0);

        final int vserverBaseWidgetCount = createVserverForVf(vfModule);

        // The vserver now has Volume as well.
        assertNumberOfWidgets(vfModule.vserver, vserverBaseWidgetCount + 1);

        // Adding another instance of a vserver widget fails.
        assertFailToAddWidget(vfModule, WidgetType.valueOf("VSERVER"));
        assertNumberOfWidgets(vfModule, 1);

        // Adding another Volume widget is always treated as successful.
        assertAddWidget(vfModule, WidgetType.valueOf("VOLUME"));
        // Assert that no additional Widgets are actually present.
        assertNumberOfWidgets(vfModule, 1);
        assertNumberOfWidgets(vfModule.vserver, vserverBaseWidgetCount + 1);
    }

    /**
     * Add an L-Interface Widget to a VF Module via a vserver Widget.
     *
     * <li>Create a VF Module</li>
     * <li>Add an L-Interface Widget</li>
     * <li>Add a vserver Widget</li>
     * <li>Check that the L-Interface Widget appears under the vserver</li>
     *
     * @throws XmlArtifactGenerationException
     *             if the Widget mapping configuration is missing
     */
    @Test
    public void testAddLinterfaceWidgetToVf() throws XmlArtifactGenerationException {
        Resource vfModule = createNewVfModule();

        // Adding an L-Interface widget has no effect until a vserver widget is added.
        assertFailToAddWidget(vfModule, WidgetType.valueOf("LINT"));
        assertNumberOfWidgets(vfModule, 0);

        final int vserverBaseWidgetCount = createVserverForVf(vfModule);

        // The vserver now has an L-Interface as well.
        assertNumberOfWidgets(vfModule.vserver, vserverBaseWidgetCount + 1);

        // Adding another instance of a vserver widget fails.
        assertFailToAddWidget(vfModule, WidgetType.valueOf("VSERVER"));
        assertNumberOfWidgets(vfModule, 1);

        // Adding an L-Interface widget is always treated as successful when a vserver exists.
        assertAddWidget(vfModule, WidgetType.valueOf("LINT"));
        // Assert that no additional Widgets are actually present.
        assertNumberOfWidgets(vfModule, 1);
        assertNumberOfWidgets(vfModule.vserver, vserverBaseWidgetCount + 1);
    }

    /**
     * Add a Volume and an L-Interface Widget to a VF Module via a vserver Widget.
     *
     * <li>Create a VF Module</li>
     * <li>Add a Volume Widget</li>
     * <li>Add an L-Interface Widget</li>
     * <li>Add a vserver Widget</li>
     * <li>Check that both Widgets appear under the vserver</li>
     *
     * @throws XmlArtifactGenerationException
     *             if the Widget mapping configuration is missing
     */
    @Test
    public void testAddVolumeAndLinterfaceWidgetToVf() throws XmlArtifactGenerationException {
        Resource vfModule = createNewVfModule();

        // Adding a Volume widget has no effect until a vserver widget is added.
        assertAddWidget(vfModule, WidgetType.valueOf("VOLUME"));
        assertNumberOfWidgets(vfModule, 0);

        // Adding an L-Interface widget has no effect until a vserver widget is added.
        assertFailToAddWidget(vfModule, WidgetType.valueOf("LINT"));
        assertNumberOfWidgets(vfModule, 0);

        final int vserverBaseWidgetCount = createVserverForVf(vfModule);

        // The vserver now has both Volume and L-Interface.
        assertNumberOfWidgets(vfModule.vserver, vserverBaseWidgetCount + 2);

        // Adding another instance of a vserver widget fails.
        assertFailToAddWidget(vfModule, WidgetType.valueOf("VSERVER"));
        assertNumberOfWidgets(vfModule, 1);

        // Add new instances (with no effect).
        assertAddWidget(vfModule, WidgetType.valueOf("VOLUME"));
        assertAddWidget(vfModule, WidgetType.valueOf("LINT"));
        // Assert that no additional Widgets are in fact present.
        assertNumberOfWidgets(vfModule, 1);
        assertNumberOfWidgets(vfModule.vserver, vserverBaseWidgetCount + 2);
    }

    private void assertNumberOfWidgets(Model model, int numberOfWidgets) {
        assertThat(model.getWidgets(), hasSize(numberOfWidgets));
    }

    /**
     * Create a new VF Module that contains zero widgets and has no members.
     *
     * @return new VF Module resource
     */
    private Resource createNewVfModule() {
        Resource vfModule = new Resource(WidgetType.valueOf("VFMODULE"), true);
        assertNumberOfWidgets(vfModule, 0);
        return vfModule;
    }

    /**
     * Set up some dummy Model Identification properties.
     *
     * @param vfModule
     *            to be populated
     */
    private void populateIdentInfo(Resource vfModule) {
        Map<String, String> modelIdentInfo = new HashMap<>();
        modelIdentInfo.put("UUID", "dummy_uuid");
        vfModule.populateModelIdentificationInformation(modelIdentInfo);
    }

    /**
     * Create a new Widget and assert that it is successfully added to the VF Module.
     *
     * @param vfModule
     *            the VF Module to update
     * @param widgetType
     *            the type of Widget to create and add
     * @throws XmlArtifactGenerationException
     *             if the Widget mapping configuration is missing
     */
    private void assertAddWidget(Resource vfModule, WidgetType widgetType) throws XmlArtifactGenerationException {
        assertThat(createNewWidgetForModule(vfModule, widgetType), is(true));
    }

    /**
     * Create a new Widget and assert that it cannot be added to the VF Module.
     *
     * @param vfModule
     *            the VF Module
     * @param widgetType
     *            the type of Widget to create and attempt to add
     * @throws XmlArtifactGenerationException
     *             if the Widget mapping configuration is missing
     */
    private void assertFailToAddWidget(Resource vfModule, WidgetType widgetType) throws XmlArtifactGenerationException {
        assertThat(createNewWidgetForModule(vfModule, widgetType), is(false));
    }

    /**
     * Create a new widget, make it a member of the VF Module, then try to add it.
     *
     * @param vfModule
     *            the VF Module to update
     * @param widgetType
     *            the type of Widget to create and attempt to add
     * @return whether or not the Widget was added to the module
     * @throws XmlArtifactGenerationException
     *             if the Widget mapping configuration is missing
     */
    private boolean createNewWidgetForModule(Resource vfModule, WidgetType widgetType)
            throws XmlArtifactGenerationException {
        Widget widget = Widget.createWidget(widgetType);
        setWidgetAsMember(vfModule, widget);
        return vfModule.addWidget(widget);
    }

    /**
     * Make the specified Widget the sole member of the VF Module. This is achieved by first adding the Widget's own ID
     * to its set of keys, and by then setting the VF Module's members to a Singleton List comprised of this ID. These
     * updates allow the Widget to be successfully added to the VF Module. (Non-member Widgets cannot be added.)
     *
     * @param vfModule
     *            the module for which members are overwritten
     * @param widget
     *            the widget to be set as the member
     */
    private void setWidgetAsMember(Resource vfModule, Widget widget) {
        String id = widget.getId();
        widget.addKey(id);
        vfModule.setMembers(Collections.singletonList(id));
    }

    /**
     * Create a vserver widget and add it to the specified VF Module.
     *
     * @param vfModule
     *            the VF Module to update
     * @return the number of Widgets present in the vserver on creation
     * @throws XmlArtifactGenerationException
     *             if the Widget mapping configuration is missing
     */
    private int createVserverForVf(Resource vfModule) throws XmlArtifactGenerationException {
        Widget vserverWidget = Widget.createWidget("VSERVER");
        assertNumberOfWidgets(vfModule, 0);
        final int initialWidgetCount = addVserverToVf(vfModule, vserverWidget);
        assertNumberOfWidgets(vfModule, 1);
        return initialWidgetCount;
    }

    /**
     * Add the specified vserver to the specified VF Module.
     *
     * @param vfModule
     *            the VF Module to update
     * @param vserverWidget
     *            the Widget to add
     * @return initial widget count for the vserver Widget
     * @throws XmlArtifactGenerationException
     *             if the Widget mapping configuration is missing
     */
    private int addVserverToVf(Resource vfModule, Widget vserverWidget) throws XmlArtifactGenerationException {
        // A vserver (initially) has Flavor, Image, Tenant and Vfc.
        final int initialWidgetCount = 4;
        assertNumberOfWidgets(vserverWidget, initialWidgetCount);

        // Add the vserver to the VF Module.
        setWidgetAsMember(vfModule, vserverWidget);
        assertThat(vfModule.addWidget(vserverWidget), is(true));

        return initialWidgetCount;
    }
}