/*
* ===============================LICENSE_START======================================
* dcae-analytics
* ================================================================================
* Copyright © 2017 AT&T Intellectual Property. 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.openecomp.dcae.apod.analytics.model;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Suppliers;
import org.json.JSONException;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.openecomp.dcae.apod.analytics.model.util.json.AnalyticsModelObjectMapperSupplier;
import org.openecomp.dcae.apod.analytics.test.BaseDCAEAnalyticsUnitTest;
import java.io.IOException;
import java.io.InputStream;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
/**
* @author Rajiv Singla . Creation Date: 10/17/2016.
*/
public abstract class BaseAnalyticsModelUnitTest extends BaseDCAEAnalyticsUnitTest {
protected static ObjectMapper objectMapper;
/**
* Before running test cases need to assign object mapper.
*/
@BeforeClass
public static void beforeClass() {
final AnalyticsModelObjectMapperSupplier analyticsModelObjectMapperSupplier =
new AnalyticsModelObjectMapperSupplier();
objectMapper = Suppliers.memoize(analyticsModelObjectMapperSupplier).get();
}
/**
* Deserialize given Json file location to given model class and returns it back without any validation check.
*
* @param jsonFileLocation Classpath location of the json file
* @param modelClass Model Class type
* @param Json Model Type
* @return Deserialized Model Object
*/
public static T deserializeJsonFileToModel(String jsonFileLocation, Class modelClass) {
final InputStream jsonFileInputStream =
BaseDCAEAnalyticsUnitTest.class.getClassLoader().getResourceAsStream(jsonFileLocation);
Assert.assertNotNull("Json File Location must be valid", jsonFileInputStream);
try {
return objectMapper.readValue(jsonFileInputStream, modelClass);
} catch (IOException ex) {
LOG.error("Error while doing assert Json for fileLocation: {}, modelClass: {}, Exception {}",
jsonFileLocation, modelClass, ex);
throw new RuntimeException(ex);
} finally {
try {
jsonFileInputStream.close();
} catch (IOException e) {
LOG.error("Error while closing input stream at file location: {}", jsonFileLocation);
throw new RuntimeException(e);
}
}
}
/**
* Deserialize given Json file location to given model class and then validates deserialization by comparing it
* with given expected Object.
*
* @param jsonFileLocation Classpath location of the json file
* @param modelClass Model Class type
* @param expectedJsonObject Expected Json Object
* @param Json Model Type
* @return deserialized actual value if expected Json Object matches deserialized object
*/
public static T assertJsonDeserialization(String jsonFileLocation, Class modelClass, T expectedJsonObject) {
final T actualValue = deserializeJsonFileToModel(jsonFileLocation, modelClass);
assertThat(actualValue, is(expectedJsonObject));
return actualValue;
}
/**
* Serialize model to json.
* @param model model
* @return json
* @throws JsonProcessingException when fails to process object
*/
public static String serializeModelToJson(Object model) throws JsonProcessingException {
return objectMapper.writeValueAsString(model);
}
/**
* Converts given model to json string and compare it with json present at given file location.
*
* @param model Model which needs to be compared
* @param expectedJsonFileLocation Location of file containing expected json string
*
* @return If assertion passes returns the input model
*/
public static T assertJsonSerialization(T model, String expectedJsonFileLocation) {
try {
final String actualModelString = serializeModelToJson(model);
final String expectedModelString = fromStream(expectedJsonFileLocation);
assertJson(expectedModelString, actualModelString);
return model;
} catch (IOException | JSONException ex) {
LOG.error("Error while doing assert Json serialization Assertion: model: {}, "
+ "expected Json File Location: {}, Exception {}", model, expectedJsonFileLocation, ex);
throw new RuntimeException(ex);
}
}
/**
* Checks both serialization and deserialization.
*
* First checks deserialization and then serialize the deserialized object back to json
* and check if matches the given json file location string
*
* @param jsonFileLocation Classpath location of the json file
* @param modelClass Class type
* @param Json Model Type
*
* @return If assertion passes, returns deserialized object
*/
public static T assertJsonConversions(String jsonFileLocation, Class modelClass) {
//first check deserialization
final T actualValue = deserializeJsonFileToModel(jsonFileLocation, modelClass);
//then check serialization
assertJsonSerialization(actualValue, jsonFileLocation);
return actualValue;
}
}