36e8e66098815b35554dcb7a9af86a14bc52766f
[integration.git] /
1 /*
2  * ============LICENSE_START=======================================================
3  * PNF-REGISTRATION-HANDLER
4  * ================================================================================
5  * Copyright (C) 2018 Nokia. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.pnfsimulator.rest;
22
23 import com.google.common.collect.ImmutableMap;
24 import com.google.gson.Gson;
25 import com.google.gson.JsonObject;
26 import org.junit.jupiter.api.BeforeAll;
27 import org.junit.jupiter.api.BeforeEach;
28 import org.junit.jupiter.api.Test;
29 import org.mockito.InjectMocks;
30 import org.mockito.Mock;
31 import org.mockito.Mockito;
32 import org.mockito.MockitoAnnotations;
33 import org.onap.pnfsimulator.rest.model.FullEvent;
34 import org.onap.pnfsimulator.rest.model.SimulatorParams;
35 import org.onap.pnfsimulator.rest.model.SimulatorRequest;
36 import org.onap.pnfsimulator.rest.util.JsonObjectDeserializer;
37 import org.onap.pnfsimulator.simulator.SimulatorService;
38 import org.onap.pnfsimulator.simulatorconfig.SimulatorConfig;
39 import org.quartz.SchedulerException;
40 import org.springframework.http.MediaType;
41 import org.springframework.test.web.servlet.MockMvc;
42 import org.springframework.test.web.servlet.MvcResult;
43 import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
44 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
45
46 import java.io.IOException;
47 import java.net.URL;
48
49 import static org.assertj.core.api.Java6Assertions.assertThat;
50 import static org.mockito.ArgumentMatchers.any;
51 import static org.mockito.ArgumentMatchers.eq;
52 import static org.mockito.Mockito.verify;
53 import static org.mockito.Mockito.when;
54 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
55 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
56 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put;
57 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
58 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
59
60 class SimulatorControllerTest {
61
62     private static final String START_ENDPOINT = "/simulator/start";
63     private static final String CONFIG_ENDPOINT = "/simulator/config";
64     private static final String EVENT_ENDPOINT = "/simulator/event";
65     private static final String JSON_MSG_EXPRESSION = "$.message";
66
67     private static final String NEW_URL = "http://0.0.0.0:8090/eventListener/v7";
68     private static final String UPDATE_SIM_CONFIG_VALID_JSON = "{\"vesServerUrl\": \"" + NEW_URL + "\"}";
69     private static final String SAMPLE_ID = "sampleId";
70     private static final Gson GSON_OBJ = new Gson();
71     private static String simulatorRequestBody;
72     private MockMvc mockMvc;
73     @InjectMocks
74     private SimulatorController controller;
75     @Mock
76     private SimulatorService simulatorService;
77
78     @BeforeAll
79     static void beforeAll() {
80         SimulatorParams simulatorParams = new SimulatorParams("http://0.0.0.0:8080", 1, 1);
81         SimulatorRequest simulatorRequest = new SimulatorRequest(simulatorParams,
82                 "testTemplate.json", new JsonObject());
83
84         simulatorRequestBody = GSON_OBJ.toJson(simulatorRequest);
85     }
86
87     @BeforeEach
88     void setup() throws IOException, SchedulerException {
89         MockitoAnnotations.initMocks(this);
90         when(simulatorService.triggerEvent(any())).thenReturn("jobName");
91         mockMvc = MockMvcBuilders
92                 .standaloneSetup(controller)
93                 .build();
94     }
95
96     @Test
97     void shouldStartSimulatorProperly() throws Exception {
98         startSimulator();
99         SimulatorRequest simulatorRequest = new Gson().fromJson(simulatorRequestBody, SimulatorRequest.class);
100
101         verify(simulatorService).triggerEvent(eq(simulatorRequest));
102     }
103
104     @Test
105     void testShouldGetConfigurationWhenRequested() throws Exception {
106         String newUrl = "http://localhost:8090/eventListener/v7";
107         SimulatorConfig expectedConfig = new SimulatorConfig(SAMPLE_ID, new URL(newUrl));
108         when(simulatorService.getConfiguration()).thenReturn(expectedConfig);
109
110         MvcResult getResult = mockMvc
111                 .perform(get(CONFIG_ENDPOINT)
112                         .contentType(MediaType.APPLICATION_JSON)
113                         .content(UPDATE_SIM_CONFIG_VALID_JSON))
114                 .andExpect(status().isOk())
115                 .andReturn();
116
117         String expectedVesUrlJsonPart = createStringReprOfJson("vesServerUrl", newUrl);
118         assertThat(getResult.getResponse().getContentAsString()).contains(expectedVesUrlJsonPart);
119     }
120
121     @Test
122     void testShouldSuccessfullyUpdateConfigurationWithNewVesUrl() throws Exception {
123         String oldUrl = "http://localhost:8090/eventListener/v7";
124         SimulatorConfig expectedConfigBeforeUpdate = new SimulatorConfig(SAMPLE_ID, new URL(oldUrl));
125         SimulatorConfig expectedConfigAfterUpdate = new SimulatorConfig(SAMPLE_ID, new URL(NEW_URL));
126
127         when(simulatorService.getConfiguration()).thenReturn(expectedConfigBeforeUpdate);
128         when(simulatorService.updateConfiguration(any(SimulatorConfig.class))).thenReturn(expectedConfigAfterUpdate);
129
130         MvcResult postResult = mockMvc
131                 .perform(put(CONFIG_ENDPOINT)
132                         .contentType(MediaType.APPLICATION_JSON)
133                         .content(UPDATE_SIM_CONFIG_VALID_JSON))
134                 .andExpect(status().isOk())
135                 .andReturn();
136
137         String expectedVesUrlJsonPart = createStringReprOfJson("vesServerUrl", expectedConfigAfterUpdate.getVesServerUrl().toString());
138         assertThat(postResult.getResponse().getContentAsString()).contains(expectedVesUrlJsonPart);
139     }
140
141     @Test
142     void testShouldRaiseExceptionWhenUpdateConfigWithIncorrectPayloadWasSent() throws Exception {
143         mockMvc
144                 .perform(put(CONFIG_ENDPOINT)
145                         .contentType(MediaType.APPLICATION_JSON)
146                         .content("{\"vesUrl\": \"" + NEW_URL + "\"}"))
147                 .andExpect(status().isBadRequest());
148     }
149
150     @Test
151     void testShouldRaiseExceptionWhenUrlInInvalidFormatIsSent() throws Exception {
152         mockMvc
153                 .perform(put(CONFIG_ENDPOINT)
154                         .contentType(MediaType.APPLICATION_JSON)
155                         .content("{\"vesUrl\": \"http://0.0.0.0:VES-PORT/eventListener/v7\"}"))
156                 .andExpect(status().isBadRequest());
157     }
158
159     @Test
160     void testShouldSendEventDirectly() throws Exception {
161         String contentAsString = mockMvc
162                 .perform(post(EVENT_ENDPOINT)
163                         .contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)
164                         .content("{\"vesServerUrl\":\"http://0.0.0.0:8080/simulator/v7\",\n" +
165                                 "      \"event\":{  \n" +
166                                 "         \"commonEventHeader\":{  \n" +
167                                 "            \"domain\":\"notification\",\n" +
168                                 "            \"eventName\":\"vFirewallBroadcastPackets\"\n" +
169                                 "         },\n" +
170                                 "         \"notificationFields\":{  \n" +
171                                 "            \"arrayOfNamedHashMap\":[  \n" +
172                                 "               {  \n" +
173                                 "                  \"name\":\"A20161221.1031-1041.bin.gz\",\n" +
174                                 "                  \"hashMap\":{  \n" +
175                                 "                     \"fileformatType\":\"org.3GPP.32.435#measCollec\"}}]}}}"))
176                 .andExpect(status().isAccepted()).andReturn().getResponse().getContentAsString();
177         assertThat(contentAsString).contains("One-time direct event sent successfully");
178     }
179
180     @Test
181     void testShouldReplaceKeywordsAndSendEventDirectly() throws Exception {
182         String contentAsString = mockMvc
183                 .perform(post(EVENT_ENDPOINT)
184                         .contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)
185                         .content("{\"vesServerUrl\": \"http://localhost:9999/eventListener\",\n" +
186                                 "    \"event\": {\n" +
187                                 "        \"commonEventHeader\": {\n" +
188                                 "            \"eventId\": \"#RandomString(20)\",\n" +
189                                 "            \"sourceName\": \"PATCHED_sourceName\",\n" +
190                                 "            \"version\": 3.0\n}}}"))
191                 .andExpect(status().isAccepted()).andReturn().getResponse().getContentAsString();
192         assertThat(contentAsString).contains("One-time direct event sent successfully");
193
194         verify(simulatorService, Mockito.times(1)).triggerOneTimeEvent(any(FullEvent.class));
195     }
196
197
198     private void startSimulator() throws Exception {
199         mockMvc
200                 .perform(post(START_ENDPOINT)
201                         .content(simulatorRequestBody)
202                         .contentType(MediaType.APPLICATION_JSON).characterEncoding("utf-8"))
203                 .andExpect(status().isOk())
204                 .andExpect(jsonPath(JSON_MSG_EXPRESSION).value("Request started"));
205
206     }
207
208     private String createStringReprOfJson(String key, String value) {
209         return GSON_OBJ.toJson(ImmutableMap.of(key, value));
210     }
211 }