org.openmrs.test.TestUtil.java Source code

Java tutorial

Introduction

Here is the source code for org.openmrs.test.TestUtil.java

Source

/**
 * This Source Code Form is subject to the terms of the Mozilla Public License,
 * v. 2.0. If a copy of the MPL was not distributed with this file, You can
 * obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under
 * the terms of the Healthcare Disclaimer located at http://openmrs.org/license.
 *
 * Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS
 * graphic logo is a trademark of OpenMRS Inc.
 */
package org.openmrs.test;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.text.ParseException;
import java.util.Collection;
import java.util.Date;
import java.util.Properties;

import org.apache.commons.lang3.time.DateUtils;
import org.dbunit.database.DatabaseConfig;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.database.QueryDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.ext.hsqldb.HsqldbDataTypeFactory;
import org.openmrs.BaseOpenmrsObject;
import org.openmrs.GlobalProperty;
import org.openmrs.api.context.Context;
import org.openmrs.util.OpenmrsUtil;

/**
 * Methods use by the Openmrs tests
 */
public class TestUtil {

    /**
     * Additional assert method for testing that will test that two Collections have equal contents
     * The Collections must be of equal size, and each object from one Collection must equal an
     * object in the other Collection Order is not considered.
     * 
     * @param expected
     * @param actual
     */
    @SuppressWarnings("unchecked")
    public static void assertCollectionContentsEquals(Collection expected, Collection actual)
            throws AssertionError {
        try {
            if (!expected.containsAll(actual) || !actual.containsAll(expected)) {
                throw new AssertionError("Expected " + expected + " but found " + actual);
            }
        } catch (Exception e) {
            throw new AssertionError(e);
        }
    }

    /**
     * Mimics org.openmrs.web.Listener.getRuntimeProperties()
     * 
     * @param webappName name to use when looking up the runtime properties env var or filename
     * @return Properties runtime
     */
    public static Properties getRuntimeProperties(String webappName) {

        Properties props = new Properties();

        try {
            FileInputStream propertyStream = null;

            // Look for environment variable
            // {WEBAPP.NAME}_RUNTIME_PROPERTIES_FILE
            String env = webappName.toUpperCase() + "_RUNTIME_PROPERTIES_FILE";

            String filepath = System.getenv(env);

            if (filepath != null) {
                try {
                    propertyStream = new FileInputStream(filepath);
                } catch (IOException e) {
                }
            }

            // env is the name of the file to look for in the directories
            String filename = webappName + "-runtime.properties";

            if (propertyStream == null) {
                filepath = OpenmrsUtil.getApplicationDataDirectory() + filename;
                try {
                    propertyStream = new FileInputStream(filepath);
                } catch (IOException e) {
                }
            }

            // look in current directory last
            if (propertyStream == null) {
                filepath = filename;
                try {
                    propertyStream = new FileInputStream(filepath);
                } catch (IOException e) {
                }
            }

            if (propertyStream == null)
                throw new IOException("Could not open '" + filename + "' in user or local directory.");
            OpenmrsUtil.loadProperties(props, propertyStream);
            propertyStream.close();

        } catch (IOException e) {
        }

        return props;
    }

    /**
     * Convert the given xml output to a string that is assignable to a single String variable
     * 
     * @param output multi line string to convert
     */
    public static void printAssignableToSingleString(String output) {
        output = output.replace("\n", "\\n");
        output = output.replace("\"", "\\\"");
        System.out.println(output);
    }

    /**
     * Convert the given multi-line output to lines of StringBuilder.append lines <br>
     * <br>
     * From an input of this this:
     * 
     * <pre>
     * asdf
     *  asdfasdf
     * asdf"asdf"
     * </pre>
     * 
     * To this:<br>
     * <br>
     * StringBuilder correctOutput = new StringBuilder();<br>
     * correctOutput.append("asdf\n");<br>
     * correctOutput.append(" asdfasdf\n");<br>
     * correctOutput.append("asdf\"asdf\"\n");<br>
     * 
     * @param output multi line string to convert
     */
    public static void printStringBuilderOutput(String output) {
        output = output.replace("\"", "\\\"");
        String[] lines = output.split("\n");

        System.out.println("StringBuilder correctOutput = new StringBuilder();");
        for (String line : lines) {
            System.out.print("correctOutput.append(\"");
            System.out.print(line);
            System.out.println("\\n\");");
        }

    }

    /**
     * Print the contents of the given tableName to system.out<br>
     * <br>
     * Call this from any {@link BaseContextSensitiveTest} child by:
     * TestUtil.printOutTableContents(getConnection(), "encounter");
     * 
     * @param sqlConnection the connection to use
     * @param tableNames the name(s) of the table(s) to print out
     * @throws Exception
     */
    public static void printOutTableContents(Connection sqlConnection, String... tableNames) throws Exception {
        for (String tableName : tableNames) {
            System.out.println("The contents of table: " + tableName);
            IDatabaseConnection connection = new DatabaseConnection(sqlConnection);
            DatabaseConfig config = connection.getConfig();
            config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new HsqldbDataTypeFactory());
            QueryDataSet outputSet = new QueryDataSet(connection);
            outputSet.addTable(tableName);
            FlatXmlDataSet.write(outputSet, System.out);
        }
    }

    /**
     * Utility method that allows tests to easily configure and save a global property
     * @param string the name of the property to save
     * @param value the value of the property to save
     */
    public static void saveGlobalProperty(String name, String value) {
        GlobalProperty gp = Context.getAdministrationService().getGlobalPropertyObject(name);
        if (gp == null) {
            gp = new GlobalProperty(name);
        }
        gp.setPropertyValue(value);
        Context.getAdministrationService().saveGlobalProperty(gp);
    }

    /**
     * Utility method to check if a list contains a BaseOpenmrsObject using the id
     * @param list
     * @param id
     * @return true if list contains object with the id else false
     */
    public static boolean containsId(Collection<? extends BaseOpenmrsObject> list, Integer id) {
        for (BaseOpenmrsObject baseOpenmrsObject : list) {
            if (baseOpenmrsObject.getId().equals(id)) {
                return true;
            }
        }
        return false;
    }

    /**
     * Waits until the System.currentTimeMillis() results has changed. Useful because the
     * granularity of the clock on some systems is low, so doing a Thread.sleep(10) may not give you
     * a different clock value, for example.
     */
    public static void waitForClockTick() {
        long t = System.currentTimeMillis();
        while (System.currentTimeMillis() == t) {
            try {
                Thread.sleep(1);
            } catch (InterruptedException ex) {
            }
        }
    }

    /**
     * Test utility method to create date time using standard 'yyyy-MM-dd hh:mm:ss' format
     * @param dateTimeString in 'yyyy-MM-dd hh:mm:ss' format
     */
    public static Date createDateTime(String dateTimeString) throws ParseException {
        return DateUtils.parseDate(dateTimeString, "yyyy-MM-dd hh:mm:ss.SSS", "yyyy-MM-dd hh:mm:ss", "yyyy-MM-dd");
    }
}