diff options
Diffstat (limited to 'dcae-analytics-test/src/main')
6 files changed, 503 insertions, 0 deletions
diff --git a/dcae-analytics-test/src/main/java/org/openecomp/dcae/apod/analytics/test/BaseDCAEAnalyticsCommonTest.java b/dcae-analytics-test/src/main/java/org/openecomp/dcae/apod/analytics/test/BaseDCAEAnalyticsCommonTest.java new file mode 100644 index 0000000..c1d939e --- /dev/null +++ b/dcae-analytics-test/src/main/java/org/openecomp/dcae/apod/analytics/test/BaseDCAEAnalyticsCommonTest.java @@ -0,0 +1,243 @@ +/* + * ===============================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.test; + +import org.json.JSONException; +import org.junit.Assert; +import org.skyscreamer.jsonassert.JSONAssert; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.ObjectOutputStream; +import java.io.OutputStreamWriter; +import java.lang.reflect.Field; +import java.net.URL; +import java.net.URLClassLoader; +import java.nio.charset.Charset; +import java.nio.file.Paths; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.util.Arrays; + +import static java.nio.file.Files.deleteIfExists; +import static java.nio.file.Files.exists; + +/** + * Base common test class for all DCAE Analytics Test e.g. unit tests, integration test, CDAP tests etc. + * <p> + * @author Rajiv Singla . Creation Date: 10/19/2016. + */ +abstract class BaseDCAEAnalyticsCommonTest { + + protected static final Logger LOG = LoggerFactory.getLogger(BaseDCAEAnalyticsCommonTest.class); + + /** + * Asserts if expected Json String and actual Json String contain the same properties ignoring + * property order. Simple String assertion might fail as property order during serialization and deserialization + * is generally non-deterministic. Also proper error message are generated more missing or unexpected + * properties + * + * @param expectedJsonString expected Json String + * @param actualJsonString actual Json String + * @throws JSONException Json Exception + */ + public static void assertJson(String expectedJsonString, String actualJsonString) throws JSONException { + JSONAssert.assertEquals(expectedJsonString, actualJsonString, true); + } + + /** + * Converts given file location to String + * + * @param fileLocation location of the file which needs to be converted to String + * @return Contents of file as string + * @throws IOException IOException + */ + public static String fromStream(String fileLocation) throws IOException { + final InputStream jsonFileInputStream = + BaseDCAEAnalyticsCommonTest.class.getClassLoader().getResourceAsStream(fileLocation); + Assert.assertNotNull("Json File Location must be valid", jsonFileInputStream); + try (BufferedReader reader = + new BufferedReader(new InputStreamReader(jsonFileInputStream, Charset.forName("UTF-8")))) { + final StringBuilder result = new StringBuilder(); + final String newLine = System.getProperty("line.separator"); + String line = reader.readLine(); + while (line != null) { + result.append(line); + result.append(newLine); + line = reader.readLine(); + } + jsonFileInputStream.close(); + return result.toString(); + } + } + + + /** + * Checks if object can be serialized properly + * + * @param object input object + * @param callingClass calling class + * @throws IOException IOException + */ + public static void testSerialization(Object object, Class<?> callingClass) throws IOException { + final URL location = callingClass.getProtectionDomain().getCodeSource().getLocation(); + final File serializedOutputFile = + new File(location.getPath() + String.format("serialization/%s.ser", object.getClass().getSimpleName())); + + // Maybe file already try deleting it first + final boolean deleteIfExists = deleteIfExists(Paths.get(serializedOutputFile.getPath())); + + if (deleteIfExists) { + LOG.warn("Previous serialization file was overwritten at location: {}", serializedOutputFile.getPath()); + } + + boolean mkdirs = true; + if (!exists(Paths.get(serializedOutputFile.getParentFile().getPath()))) { + mkdirs = serializedOutputFile.getParentFile().mkdirs(); + } + if (mkdirs) { + try (FileOutputStream fileOutputStream = new FileOutputStream(serializedOutputFile); + ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream)) { + objectOutputStream.writeObject(object); + LOG.debug("Successfully created serialization file at location: {}", serializedOutputFile.getPath()); + } + } else { + throw new IllegalStateException( + String.format("Failed to create location to store serialization file: %s", + serializedOutputFile)); + } + } + + /** + * Writes Text to Output file + * + * @param textFileLocation - location of text file e.g. textfiles/fileName.json + * @param content - file content + * @param callingClass - calling class + * @throws IOException - ioException + */ + public static void writeToOutputTextFile(String textFileLocation, String content, Class<?> callingClass) throws + IOException { + final URL location = callingClass.getProtectionDomain().getCodeSource().getLocation(); + final File fileLocation = new File(location.getPath() + textFileLocation); + + // Maybe file already try deleting it first + final boolean deleteIfExists = deleteIfExists(Paths.get(fileLocation.getPath())); + + if (deleteIfExists) { + LOG.warn("Previous file will be overwritten at location: {}", fileLocation.getPath()); + } + + boolean mkdirs = true; + if (!exists(Paths.get(fileLocation.getParentFile().getPath()))) { + mkdirs = fileLocation.getParentFile().mkdirs(); + } + if (mkdirs) { + try ( + FileOutputStream fileOutputStream = new FileOutputStream(fileLocation); + OutputStreamWriter outputStream = + new OutputStreamWriter(fileOutputStream, Charset.forName("UTF-8"))) { + outputStream.write(content); + LOG.debug("Successfully created text file at location: {}", fileLocation.getPath()); + } + } else { + throw new IllegalStateException( + String.format("Failed to create location to store text file: %s", fileLocation)); + } + + } + + + /** + * For testing purposes only we may sometime we may want to access private fields of underlying + * object to confirm the values are setup correctly. + * <p> + * This method uses java reflection to get the value to private object in the class + * + * @param object Actual object which has the private field you want to check + * @param fieldName Field name in the Actual Object you want to get the value of + * @param privateFieldClass Type of the private field + * @param <T> Class of Actual Object + * @param <U> Class of private field + * @return value of the private field + */ + public static <T, U> U getPrivateFiledValue(T object, String fieldName, Class<U> privateFieldClass) { + + final Class<?> objectClass = object.getClass(); + try { + final Field privateField = objectClass.getDeclaredField(fieldName); + try { + + // mark private field to be accessible for testing purposes + AccessController.doPrivileged(new PrivilegedAction() { + @Override + public Object run() { + privateField.setAccessible(true); + return null; + } + }); + + + return privateFieldClass.cast(privateField.get(object)); + + } catch (IllegalAccessException e) { + LOG.error("Unable to access field: {}", fieldName); + throw new IllegalStateException(e); + } + } catch (NoSuchFieldException e) { + LOG.error("Unable to locate field name: {} in class: {}", fieldName, objectClass.getSimpleName()); + throw new IllegalStateException(e); + } + + + } + + + /** + * Prints classpath jars which are visible inside the class + * + * @param classLoader classloader of the calling class + */ + public static void dumpClasspath(ClassLoader classLoader) { + + LOG.info("Dumping ClassPath for classloader: {}", classLoader); + + if (classLoader instanceof URLClassLoader) { + + URLClassLoader ucl = (URLClassLoader) classLoader; + LOG.info("\t ==========>>>" + Arrays.toString(ucl.getURLs())); + + } else { + LOG.info("\t(cannot display components as not a URLClassLoader)"); + } + + if (classLoader.getParent() != null) { + dumpClasspath(classLoader.getParent()); + } + } + +} diff --git a/dcae-analytics-test/src/main/java/org/openecomp/dcae/apod/analytics/test/BaseDCAEAnalyticsIT.java b/dcae-analytics-test/src/main/java/org/openecomp/dcae/apod/analytics/test/BaseDCAEAnalyticsIT.java new file mode 100644 index 0000000..cbc7f1c --- /dev/null +++ b/dcae-analytics-test/src/main/java/org/openecomp/dcae/apod/analytics/test/BaseDCAEAnalyticsIT.java @@ -0,0 +1,29 @@ +/* + * ===============================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.test; + +/** + * Base class for all DCAE Analytics Integration Tests + * <p> + * @author Rajiv Singla . Creation Date: 10/6/2016. + */ +public abstract class BaseDCAEAnalyticsIT extends BaseDCAEAnalyticsCommonTest { +} diff --git a/dcae-analytics-test/src/main/java/org/openecomp/dcae/apod/analytics/test/BaseDCAEAnalyticsUnitTest.java b/dcae-analytics-test/src/main/java/org/openecomp/dcae/apod/analytics/test/BaseDCAEAnalyticsUnitTest.java new file mode 100644 index 0000000..84feb1d --- /dev/null +++ b/dcae-analytics-test/src/main/java/org/openecomp/dcae/apod/analytics/test/BaseDCAEAnalyticsUnitTest.java @@ -0,0 +1,31 @@ +/* + * ===============================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.test; + +/** + * Base class for all DCAE Analytics Unit Tests + * <p> + * @author Rajiv Singla . Creation Date: 10/6/2016. + */ +public abstract class BaseDCAEAnalyticsUnitTest extends BaseDCAEAnalyticsCommonTest { + + +} diff --git a/dcae-analytics-test/src/main/java/org/openecomp/dcae/apod/analytics/test/annotation/GuiceModules.java b/dcae-analytics-test/src/main/java/org/openecomp/dcae/apod/analytics/test/annotation/GuiceModules.java new file mode 100644 index 0000000..8c62db2 --- /dev/null +++ b/dcae-analytics-test/src/main/java/org/openecomp/dcae/apod/analytics/test/annotation/GuiceModules.java @@ -0,0 +1,45 @@ +/* + * ===============================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.test.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Annotation which can be used to provide test guice modules + * <p> + * @author Rajiv Singla . Creation Date: 10/20/2016. + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface GuiceModules { + + /** + * Test Modules + * + * @return module classes + */ + Class<?>[] value(); +} diff --git a/dcae-analytics-test/src/main/java/org/openecomp/dcae/apod/analytics/test/runner/GuiceJUnitRunner.java b/dcae-analytics-test/src/main/java/org/openecomp/dcae/apod/analytics/test/runner/GuiceJUnitRunner.java new file mode 100644 index 0000000..6c6071e --- /dev/null +++ b/dcae-analytics-test/src/main/java/org/openecomp/dcae/apod/analytics/test/runner/GuiceJUnitRunner.java @@ -0,0 +1,100 @@ +/* + * ===============================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.test.runner; + +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.Module; +import org.junit.runners.BlockJUnit4ClassRunner; +import org.junit.runners.model.InitializationError; +import org.openecomp.dcae.apod.analytics.test.annotation.GuiceModules; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; + +/** + * A custom Junit Runner which can be used to run Guice Test with custom Test Modules + * <p> + * @author Rajiv Singla . Creation Date: 10/20/2016. + */ +public class GuiceJUnitRunner extends BlockJUnit4ClassRunner { + + private static final Logger LOG = LoggerFactory.getLogger(GuiceJUnitRunner.class); + + private Injector injector; + + public GuiceJUnitRunner(Class<?> klass) throws InitializationError { + super(klass); + Class<?>[] classes = getModulesFor(klass); + injector = createInjectorFor(classes); + } + + + /** + * Returns a new fixture for running a test. Injects Guice members + */ + @Override + public Object createTest() throws Exception { + Object obj = super.createTest(); + injector.injectMembers(obj); + return obj; + } + + + /** + * Creates new Guice Injector and registers Guice test modules + * + * @param classes test module classes + * @return Guice injector with test modules + * @throws InitializationError + */ + private Injector createInjectorFor(Class<?>[] classes) throws InitializationError { + Module[] modules = new Module[classes.length]; + for (int i = 0; i < classes.length; i++) { + try { + modules[i] = (Module) (classes[i]).newInstance(); + } catch (InstantiationException | IllegalAccessException e) { + throw new InitializationError(e); + } + } + LOG.debug("Creating Junit Test Runner with Guice Test Modules: {}", Arrays.toString(modules)); + return Guice.createInjector(modules); + } + + /** + * Extract user provide test modules from the {@link GuiceModules} annotation + * + * @param klass Target class which is running the test + * @return Guice modules contained passed in annotation of Guice Modules + * @throws InitializationError + */ + private Class<?>[] getModulesFor(Class<?> klass) throws InitializationError { + GuiceModules annotation = klass.getAnnotation(GuiceModules.class); + if (annotation == null) { + throw new InitializationError( + "Missing @GuiceModules annotation for unit test '" + klass.getName() + + "'"); + } + return annotation.value(); + } + +} diff --git a/dcae-analytics-test/src/main/resources/logback-test.xml b/dcae-analytics-test/src/main/resources/logback-test.xml new file mode 100644 index 0000000..68d2f3d --- /dev/null +++ b/dcae-analytics-test/src/main/resources/logback-test.xml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!-- + ~ ===============================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=========================================== + --> +<configuration debug="false"> + + <!-- + Disabling some chatty loggers. + --> + <logger name="org.apache.commons.beanutils" level="ERROR"/> + <logger name="org.apache.zookeeper.server" level="ERROR"/> + <logger name="org.apache.zookeeper" level="ERROR"/> + <logger name="com.ning" level="WARN"/> + <logger name="org.apache.spark" level="WARN"/> + <logger name="org.spark-project" level="WARN"/> + <logger name="org.apache.hadoop" level="WARN"/> + <logger name="org.apache.hive" level="WARN"/> + <logger name="org.quartz.core" level="WARN"/> + <logger name="org.eclipse.jetty" level="WARN"/> + <logger name="io.netty.util.internal" level="WARN"/> + + <logger name="org.apache.twill" level="WARN"/> + <logger name="co.cask.cdap" level="INFO"/> + <logger name="org.openecomp.dcae.apod.analytics" level="DEBUG"/> + + <appender name="Console" class="ch.qos.logback.core.ConsoleAppender"> + <encoder> + <pattern>%d{ISO8601} - %-5p [%t:%C{1}@%L] - %m%n</pattern> + </encoder> + </appender> + + <root level="ERROR"> + <appender-ref ref="Console"/> + </root> + + +</configuration> + |