/*- * ============LICENSE_START======================================================= * Simulator * ================================================================================ * Copyright (C) 2019 Nokia. All rights reserved. * ================================================================================ * 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.pnfsimulator.integration; import static io.restassured.RestAssured.given; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.stringContainsInOrder; import com.google.gson.JsonObject; import com.mongodb.MongoClient; import com.mongodb.MongoClientOptions; import com.mongodb.MongoCredential; import com.mongodb.ServerAddress; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoCursor; import com.mongodb.client.MongoDatabase; import java.time.Instant; import java.net.Inet4Address; import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; import java.util.Collections; import java.util.List; import org.assertj.core.api.Assertions; import org.bson.Document; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.http.HttpStatus; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(classes = {Main.class, TestConfiguration.class}, webEnvironment = WebEnvironment.DEFINED_PORT) public class OptionalTemplatesTest { private static final String PNF_SIMULATOR_DB = "pnf_simulator"; private static final String COMMON_EVENT_HEADER = "commonEventHeader"; private static final String PNF_SIMULATOR_DB_PSWD = "zXcVbN123!"; private static final String PNF_SIMULATOR_DB_USER = "pnf_simulator_user"; private static final String PATCHED = "patched"; private static final String SINGLE_EVENT_URL = "http://0.0.0.0:5000/simulator/event"; @Autowired VesSimulatorController vesSimulatorController; @Autowired private VesSimulatorService vesSimulatorService; private String currentVesSimulatorIp; @Before public void setUp() throws Exception { currentVesSimulatorIp = getCurrentIpAddress(); } @After public void tearDown() { Mockito.reset(vesSimulatorService); } @Test public void whenTriggeredSimulatorWithoutTemplateShouldSendSingleEventToVes() { //given long currentTimestamp = Instant.now().getEpochSecond(); String body = "{\n" + "\"vesServerUrl\": \"https://" + currentVesSimulatorIp + ":9443/ves-simulator/eventListener/v5\",\n" + "\"event\": { \n" + "\"commonEventHeader\": {\n" + "\"eventId1\": \"#RandomString(20)\",\n" + "\"eventId2\": \"#RandomInteger(10,10)\",\n" + "\"eventId3\": \"#Increment\",\n" + "\"eventId4\": \"#RandomPrimitiveInteger(10,10)\",\n" + "\"eventId5\": \"#TimestampPrimitive\",\n" + "\"sourceName\": \"Single_sourceName\",\n" + "\"version\": 3" + "}\n" + "}\n" + "}"; ArgumentCaptor parameterCaptor = ArgumentCaptor.forClass(JsonObject.class); //when given() .contentType("application/json") .body(body) .when() .post(SINGLE_EVENT_URL) .then() .statusCode(HttpStatus.ACCEPTED.value()) .body("message", equalTo("Accepted")); //then long afterExecution = Instant.now().getEpochSecond(); Mockito.verify(vesSimulatorService, Mockito.timeout(3000)) .sendEventToDmaapV5(parameterCaptor.capture()); JsonObject value = parameterCaptor.getValue(); assertThat(value .getAsJsonObject(COMMON_EVENT_HEADER) .get("sourceName").getAsString()).isEqualTo("Single_sourceName"); assertThat(value .getAsJsonObject(COMMON_EVENT_HEADER) .get("eventId1").getAsString()).hasSize(20); assertThat(value .getAsJsonObject(COMMON_EVENT_HEADER) .get("eventId2").getAsString()).isEqualTo("10"); assertThat(value .getAsJsonObject(COMMON_EVENT_HEADER) .get("eventId3").getAsString()).isEqualTo("1"); assertThat(value .getAsJsonObject(COMMON_EVENT_HEADER) .get("eventId4").getAsInt()).isEqualTo(10); assertThat(value .getAsJsonObject(COMMON_EVENT_HEADER) .get("eventId5").getAsLong()).isBetween(currentTimestamp, afterExecution); } @Test public void whenTriggeredSimulatorWithoutTemplateEventShouldBeVisibleInDB() throws UnknownHostException { //given String body = "{\n" + "\"vesServerUrl\": \"https://" + currentVesSimulatorIp + ":9443/ves-simulator/eventListener/v5\",\n" + "\"event\": { \n" + "\"commonEventHeader\": {\n" + "\"sourceName\": \"HistoricalEvent\",\n" + "\"version\": 3" + "}\n" + "}\n" + "}"; ArgumentCaptor parameterCaptor = ArgumentCaptor.forClass(JsonObject.class); //when given() .contentType("application/json") .body(body) .when() .post(SINGLE_EVENT_URL) .then() .statusCode(HttpStatus.ACCEPTED.value()) .body("message", equalTo("Accepted")); //then Mockito.verify(vesSimulatorService, Mockito.timeout(3000)) .sendEventToDmaapV5(parameterCaptor.capture()); Document sourceNameInMongoDB = findSourceNameInMongoDB(); Assertions.assertThat(sourceNameInMongoDB.get(PATCHED)) .isEqualTo("{\"commonEventHeader\":{\"sourceName\":\"HistoricalEvent\",\"version\":3}}"); } @Test public void whenTriggeredSimulatorWithWrongVesIpInformationShouldBeReturned() { //given String body = "{\n" + "\"vesServerUrl\": \"https://" + currentVesSimulatorIp + ":8080/ves-simulator/eventListener/v5\",\n" + "\"event\": { \n" + "\"commonEventHeader\": {\n" + "\"sourceName\": \"HistoricalEvent\",\n" + "\"version\": 3" + "}\n" + "}\n" + "}"; //when given() .contentType("application/json") .body(body) .when() .post(SINGLE_EVENT_URL) .then() .statusCode(421) .body("message", equalTo( "Fail to connect with ves: Connect to "+currentVesSimulatorIp+":8080 " + "[/"+currentVesSimulatorIp+"] " + "failed: Connection refused (Connection refused)")); } @Test public void whenTriggeredSimulatorWithWrongEventShouldReturnedError() { //given String body = "{\n" + "\"vesServerUrl\": \"https://" + currentVesSimulatorIp + ":9443/ves-simulator/eventListener/v5\",\n" + "\"event\": { \n" + "this is not JSON {}" + "}\n" + "}"; //when given() .contentType("application/json") .body(body) .when() .post(SINGLE_EVENT_URL) .then() .statusCode(HttpStatus.BAD_REQUEST.value()) .body("message", stringContainsInOrder(List.of("JSON parse error:","Unexpected character ('t' (code 116)):")) ); } private Document findSourceNameInMongoDB() throws UnknownHostException { MongoCredential credential = MongoCredential .createCredential(PNF_SIMULATOR_DB_USER, PNF_SIMULATOR_DB, PNF_SIMULATOR_DB_PSWD.toCharArray()); MongoClient mongoClient = new MongoClient(new ServerAddress(Inet4Address.getLocalHost(), 27017), credential, MongoClientOptions.builder().build()); MongoDatabase pnfSimulatorDb = mongoClient.getDatabase(PNF_SIMULATOR_DB); MongoCollection table = pnfSimulatorDb.getCollection("eventData"); Document searchQuery = new Document(); searchQuery.put(PATCHED, new Document("$regex", ".*" + "HistoricalEvent" + ".*")); FindIterable findOfPatched = table.find(searchQuery); Document dbObject = null; MongoCursor cursor = findOfPatched.iterator(); if (cursor.hasNext()) { dbObject = cursor.next(); } return dbObject; } private String getCurrentIpAddress() throws SocketException { return Collections.list(NetworkInterface.getNetworkInterfaces()).stream() .flatMap(i -> Collections.list(i.getInetAddresses()).stream()) .filter(ip -> ip instanceof Inet4Address) .map(e -> (Inet4Address) e) .findFirst() .orElseThrow(RuntimeException::new) .getHostAddress(); } }