From e0ab2445bb7baf58d82ab4e1b5fce0b26a8fe7a5 Mon Sep 17 00:00:00 2001 From: Mark Berrill Date: Thu, 5 Mar 2015 12:55:24 -0500 Subject: [PATCH] Adding option to check example output --- cmake/CompareOutput.cmake | 50 +++++++++++++++++++++++++++++++ cmake/macros.cmake | 33 +++++++++++++++++---- example/Bubble/ExampleOutput.txt | 51 ++++---------------------------- 3 files changed, 82 insertions(+), 52 deletions(-) create mode 100644 cmake/CompareOutput.cmake diff --git a/cmake/CompareOutput.cmake b/cmake/CompareOutput.cmake new file mode 100644 index 00000000..85f13006 --- /dev/null +++ b/cmake/CompareOutput.cmake @@ -0,0 +1,50 @@ +# This script compares the output of TEST against GOLD, +# ensuring that all lines within GOLD are int TEST. +# Note that TEST may have additional lines that are not checked +CMAKE_POLICY(SET CMP0007 OLD) + +FILE(READ "${TEST}" output ) +FILE(READ "${GOLD}" sol ) + +macro(LIST_REPLACE LIST INDEX NEWVALUE) + list(INSERT ${LIST} ${INDEX} ${NEWVALUE}) + MATH(EXPR __INDEX "${INDEX} + 1") + list(REMOVE_AT ${LIST} ${__INDEX}) +endmacro(LIST_REPLACE) + +# Convert file contents into a CMake list (where each element in the list is one line of the file) +STRING(REGEX REPLACE ";" "\\\\;" data "${output}") +STRING(REGEX REPLACE ";" "\\\\;" sol "${sol}") +STRING(REGEX REPLACE "\n" ";" data "${data}") +STRING(REGEX REPLACE "\n" ";" sol "${sol}") +LIST( LENGTH data N_data ) +LIST( LENGTH sol N_sol ) +MATH( EXPR N_data "${N_data}-1" ) +MATH( EXPR N_sol "${N_sol}-1" ) +FOREACH( index RANGE ${N_data} ) + LIST(GET data ${index} tmp ) + STRING(REGEX REPLACE "(\n|\r)" "" tmp "${tmp}") + STRING(STRIP "${tmp}" tmp ) + LIST_REPLACE( data ${index} "${tmp}") +ENDFOREACH() +FOREACH( index RANGE ${N_sol} ) + LIST( GET sol ${index} tmp ) + STRING(REGEX REPLACE "(\n|\r)" "" tmp "${tmp}") + STRING(STRIP "${tmp}" tmp ) + LIST_REPLACE( sol ${index} "${tmp}") +ENDFOREACH() + +# Check that each line of sol is present in data (and delete it) +FOREACH( tmp ${sol} ) + LIST(FIND data "${tmp}" result ) + IF ( ${result} EQUAL -1 ) + MESSAGE("Test output:\n${output}\n\n") + MESSAGE(FATAL_ERROR "Did not find '${tmp}' in test output\n" ) + ELSE() + LIST(REMOVE_AT data ${result} ) + ENDIF() +ENDFOREACH() + +# Finished +MESSAGE( "All lines in ${GOLD} were found in ${TEST}") + diff --git a/cmake/macros.cmake b/cmake/macros.cmake index 4ece70ae..3275ae1a 100644 --- a/cmake/macros.cmake +++ b/cmake/macros.cmake @@ -10,7 +10,9 @@ ENDIF() IF ( NOT ${PROJ}_INSTALL_DIR ) MESSAGE(FATAL_ERROR "${PROJ}_INSTALL_DIR must be set before including macros.cmake") ENDIF() - +IF ( NOT ${PROJ}_BUILD_DIR ) + MESSAGE(FATAL_ERROR "${PROJ}_BUILD_DIR must be set before including macros.cmake") +ENDIF() # Macro to print all variables @@ -445,21 +447,40 @@ MACRO( INSTALL_EXAMPLE EXAMPLE ) ENDMACRO() -# Copy an example folder +# Create an example test +CONFIGURE_FILE( "${${PROJ}_SOURCE_DIR}/cmake/CompareOutput.cmake" "${${PROJ}_BUILD_DIR}/CompareOutput.cmake" COPYONLY ) MACRO( TEST_EXAMPLE EXAMPLE EXEFILE PROCS ${ARGN} ) + SET( EXAMPLE_DIR "${CMAKE_CURRENT_BINARY_DIR}/${EXAMPLE}" ) + # Copy the example directory ADD_CUSTOM_TARGET( ${EXAMPLE} ALL - ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/${EXAMPLE}" "${CMAKE_CURRENT_BINARY_DIR}/${EXAMPLE}" + ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/${EXAMPLE}" "${EXAMPLE_DIR}" DEPENDS ${EXEFILE} ) + # Create a wrapper script to run the test and copy the output to ${EXAMPLE}.out + SET( FILENAME "${EXAMPLE_DIR}/run-${EXAMPLE}" ) + FILE(WRITE "${FILENAME}" "# This is a automatically generated file to run example--${EXAMPLE}\n" ) + FILE(APPEND "${FILENAME}" "${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} ${PROCS} \"${LBPM_INSTALL_DIR}/bin/${EXEFILE}\" ${ARGN} 2>&1 | tee ${EXAMPLE}.out\n\n" ) + # Create the test to run the example SET( TESTNAME example--${EXAMPLE} ) + EXECUTE_PROCESS(COMMAND chmod 755 "${FILENAME}") ADD_TEST( NAME ${TESTNAME} - WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${EXAMPLE}" - COMMAND ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} ${PROCS} "${LBPM_INSTALL_DIR}/bin/${EXEFILE}" ${ARGN} ) + WORKING_DIRECTORY "${EXAMPLE_DIR}" + COMMAND "${FILENAME}" + ) SET_TESTS_PROPERTIES( ${TESTNAME} PROPERTIES FAIL_REGULAR_EXPRESSION "${TEST_FAIL_REGULAR_EXPRESSION}" PROCESSORS ${PROCS} ) SET_TESTS_PROPERTIES( ${TESTNAME} PROPERTIES RESOURCE_LOCK ${EXEFILE} ) - + # Create a test that checks the output against the data in EXAMPLE/OutputAns.txt + IF ( EXISTS "${EXAMPLE_DIR}/ExampleOutput.txt" ) + ADD_TEST( + NAME ${TESTNAME}-output + WORKING_DIRECTORY "${EXAMPLE_DIR}" + COMMAND ${CMAKE_COMMAND} -DTEST=${EXAMPLE}.out -DGOLD=ExampleOutput.txt -P "${${PROJ}_BUILD_DIR}/CompareOutput.cmake" + ) + SET_TESTS_PROPERTIES( ${TESTNAME} PROPERTIES FAIL_REGULAR_EXPRESSION "${TEST_FAIL_REGULAR_EXPRESSION}" PROCESSORS 1 ) + SET_TESTS_PROPERTIES( ${TESTNAME} PROPERTIES DEPENDS ${TESTNAME} ) + ENDIF() ENDMACRO() diff --git a/example/Bubble/ExampleOutput.txt b/example/Bubble/ExampleOutput.txt index 69451121..a80f114f 100644 --- a/example/Bubble/ExampleOutput.txt +++ b/example/Bubble/ExampleOutput.txt @@ -1,46 +1,5 @@ -******************************************************** -Running Hybrid Implementation of Color LBM -******************************************************** -******************************************************** -tau = 1.000000 -alpha = 0.010000 -beta = 0.950000 -das = 0.100000 -dbs = 0.900000 -Value of phi at solid surface = 0.800000 -Distance to phi = 0.0: 1.156434 -gamma_{wn} = 0.057960 -Force(x) = 0.000000 -Force(y) = 0.000000 -Force(z) = 0.000000 -Sub-domain size = 80 x 80 x 80 -Parallel domain size = 1 x 1 x 1 -******************************************************** -Number of blocks = 32 -Threads per block = 128 -Sweeps per thread = 135 -Number of nodes per side = 82 -Total Number of nodes = 551368 -******************************************************** -Read input media... -Setting up communication control structures -Preparing the sendlists -SendLists are ready on host -Prepare to copy send/recv Lists to device -Devices are ready to communicate. -Copying phase ID to device -Allocating distributions -******************************************************** -No. of timesteps: 1000 --------------------------------------------------------------------------------------- -radius sw pw pn awn Jwn Gwn [xx, yy, zz, xy, xz, yz] -------------------------------------------------------------------------------------- -8 0.34906 0.33333 0.0013898 0.26946 0.33334 0.33333 0.33333 -5.3309e-06 1.1201e-05 -1.3209e-05 -10 0.34568 0.33333 0.0022109 0.21364 0.33334 0.33333 0.33333 -4.1967e-06 1.0265e-05 -1.2941e-05 -12 0.34355 0.33333 0.0031972 0.1779 0.33334 0.33333 0.33333 -5.6086e-06 1.1842e-05 -1.4445e-05 -15 0.34143 0.33332 0.005043 0.14164 0.33334 0.33333 0.33333 -5.5737e-06 1.0229e-05 -1.2561e-05 -------------------------------------------------------------------- -******************************************************** -CPU time = inf -Lattice update rate (per core)= 0.000000 MLUPS -Lattice update rate (total)= 0.000000 MLUPS -******************************************************** +8 0.34914 0.33333 0.001388 0.25364 0.33333 0.33333 0.33333 -1.6662e-06 2.1469e-06 -2.3454e-06 +10 0.34583 0.33333 0.0022065 0.20135 0.33333 0.33333 0.33333 -8.5941e-07 1.734e-06 -2.071e-06 +12 0.34377 0.33332 0.0031884 0.1675 0.33333 0.33333 0.33333 -7.089e-07 1.4714e-06 -1.7527e-06 +15 0.3417 0.33332 0.0050284 0.13345 0.33333 0.33333 0.33333 -7.8226e-07 1.4551e-06 -1.6459e-06 +