/** * The contents of this file are subject to the OpenMRS Public License * Version 1.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://license.openmrs.org * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the * License for the specific language governing rights and limitations * under the License. * * Copyright (C) OpenMRS, LLC. All Rights Reserved. */ package org.openmrs.test; import java.io.FileInputStream; import java.io.IOException; import java.sql.Connection; import java.util.Collection; import java.util.Properties; 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.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); } }