# See http://formalverification.cs.utah.edu/ISP_Tests/

set(umpire_tests_passing
  change-send-buffer
  comm-dup-no-error
  comm-dup-no-free
  comm-dup-no-free2
  comm-simple
  comm-split-no-free
  comm-translate-ranks
  hello
  no-error
  no-error2
  no-error3
  no-error3-any_src
  no-error-any_src
  no-error-interleaved-isend
  no-error-test
  no-error-testall
  no-error-testany
  no-error-vector-isend
  no-error-wait
  no-error-waitany-any_src2
  no-error-waitany-any_src3
  no-error-waitany
  no-error-wait-any_src
  no-error-wait-any_src2
  no-error-wait-any_src3
  no-error-wait-any_src4
  no-error-waitany-any_src
  partial-recv
  sendrecv-deadlock
  send-recv-ok
  irecv-isend-ok
  lost-request-waitall
 ) # Passing (no deadlock) tests

set(umpire_tests_passing_broken
  irecv-isend-ok2
  )

# These are supposed to deadlock but ISP does not find deadlock
# and we don't either. What should be test here?
set(umpire_tests_missed_deadlock
  any_src-deadlock
  any_src-can-deadlock
  any_src-can-deadlock2
  any_src-can-deadlock3
  )

set(umpire_tests_deadlock
  any_src-can-deadlock10
  any_src-can-deadlock4
  any_src-can-deadlock5
  any_src-can-deadlock6
  any_src-waitall-deadlock
  any_src-waitall-deadlock2
  any_src-waitall-deadlock3
  any_src-waitany-deadlock2
  any_src-waitany-deadlock
  any_src-wait-deadlock
  any_src-wait-deadlock2
  basic-deadlock
  basic-deadlock-comm_create
  basic-deadlock-comm_dup
  basic-deadlock-comm_split
  bcast-deadlock
  collective-misorder
  collective-misorder-allreduce
  complex-deadlock
  finalize-deadlock
  irecv-deadlock
  waitall-deadlock
  waitany-deadlock
  wait-deadlock
 ) # failing (deadlocking) tests

# Compile but run those tests:
set(umpire_tests_deadlock_broken
  any_src-can-deadlock10_mod
  any_src-can-deadlock4_mod
  any_src-can-deadlock5_mod
  any_src-can-deadlock6_mod
  any_src-can-deadlock7
  any_src-can-deadlock8
  any_src-can-deadlock9
  any_src-can-deadlock11
  collective-misorder2
  comm-bcast-deadlock
  dropped-req
  comm-deadlock
)
 
set(umpire_tests_problematic
  deadlock-config # No deadlock detected by ISP unless MPI_Send blocking activated
 ) # problematic tests
 
 # These files are not listed on http://formalverification.cs.utah.edu/ISP_Tests/
set(umpire_src_other
  abort1.c
  abort2.c
  abort3.c
  abort.c
  basic-deadlock-cart_create.c
  basic-deadlock-cart_sub.c
  basic-deadlock-graph_create.c
  basic-deadlock-intercomm_create.c
  basic-deadlock-intercomm_merge.c
  change-send-buffer-exhaustive.c
  change-send-buffer-type-exhaustive.c
  collective-exhaustive-byte-int-mismatch.c
  collective-exhaustive-no-error.c
  collective-misorder.c
  collective-misorder2.c

  deadlock-config_blocking.c
  errhandler-no-error.c
  errhandler-no-free.c
  group-no-error2.c
  group-no-error3.c
  group-no-error.c
  group-no-error-exhaustive.c
  group-no-free2.c
  group-no-free3.c
  group-no-free.c
  group-no-free-exhaustive.c
  intercomm_create-deadlock2.c
  intercomm_create-deadlock3.c
  intercomm_create-deadlock4.c
  intercomm_create-deadlock.c
  intercomm_create-no-error.c
  intercomm_merge-deadlock.c
  lost-request2.c
  lost-request3.c
  lost-request.c  
  no-error4-any_src.c
  no-error4.c
  no-error-derived-comms.c
    
  no-error-persistent-all-completions.c
  no-error-persistent.c
  no-error-persistent-test.c
  no-error-persistent-testpartial.c
  no-error-persistent-waitpartial.c
  no-error-probe-any_src.c
  no-error-probe-any_tag.c
  no-error-probe.c
  
  no-error-wait2.c # Does not compile.
  no-error-waitall-any_src2.c
  no-error-waitall-any_src3.c
  no-error-waitall-any_src.c
  no-error-waitall.c
  no-error-waitany2.c
  
  op-no-error.c
  op-no-free.c
  partial-recv-exhaustive.c
  partial-recv-persistent2.c
  partial-recv-persistent3.c
  partial-recv-persistent4.c
  partial-recv-persistent.c
  persistent2.c
  persistent3.c
  persistent4.c
  persistent.c
  probe-any_src-types-can-mismatch.c
  probe-any_tag-types-can-mismatch.c
  probe-deadlock.c
  pt2pt-byte-int-mismatch.c
  remote_group-no-error.c
  type-commit-twice.c
  type-no-error.c
  type-no-error-exhaustive.c
  type-no-error-exhaustive-with-isends.c
  type-no-free2.c
  type-no-free3.c
  type-no-free.c
  type-no-free-exhaustive.c
  )

# Add these files to the archive
#################

set(sources "${CMAKE_CURRENT_SOURCE_DIR}/README")
foreach(file ${umpire_src_other})
  set(sources ${sources} ${CMAKE_CURRENT_SOURCE_DIR}/${file})
endforeach()

foreach(file
    ${umpire_tests_passing}  ${umpire_tests_passing_broken}
    ${umpire_tests_deadlock} ${umpire_tests_deadlock_broken} ${umpire_tests_missed_deadlock}
    ${umpire_tests_problematic}
    ${umpire_tests_ignored} )
  set(sources ${sources} ${CMAKE_CURRENT_SOURCE_DIR}/${file}.c)
endforeach()
set(txt_files ${txt_files} ${sources} PARENT_SCOPE)

# Build the tests
#################

if(enable_smpi AND enable_model-checking AND enable_smpi_ISP_testsuite)
  set(CMAKE_C_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc")
  set(CMAKE_Fortran_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpiff")

  include_directories(BEFORE "${CMAKE_HOME_DIRECTORY}/include/smpi")

  foreach (test ${umpire_tests_passing} ${umpire_tests_deadlock} ${umpire_tests_problematic} )
    add_executable(${test} ${test}.c)
    target_link_libraries(${test} simgrid)
    set_source_files_properties(${test}.c PROPERTIES COMPILE_FLAGS "-Wno-error -Wno-return-type")
    set(umpire_tesh ${umpire_tesh} ${test})
    set(files_to_clean ${files_to_clean} ${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh)
  endforeach(test)
  
  # TODO, what should we do about ${umpire_tests_missed_deadlock}?

  foreach (test ${umpire_tests_passing})
    write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "! timeout 30")
    write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "! output display" APPEND)
    write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "\$ \${bindir:=.}/../../../../bin/smpirun -wrapper \"\${bindir:=.}/../../../../bin/simgrid-mc\" -hostfile ../../hostfile -platform ../../../../examples/platforms/small_platform.xml --log=xbt_cfg.thresh:warning -np 3 --cfg=smpi/host-speed:1e9 --cfg=smpi/coll_selector:mpich \${bindir:=.}/${test} --log=smpi_coll.thresh:error" APPEND)
  endforeach()

  foreach (test ${umpire_tests_deadlock} ${umpire_tests_problematic} )
    write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "! timeout 30"     )
    write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "! expect return 3" APPEND)
    write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "! output display"  APPEND)
    write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "\$ \${bindir:=.}/../../../../bin/smpirun -wrapper \"\${bindir:=.}/../../../../bin/simgrid-mc\" -hostfile ../../hostfile -platform ../../../../examples/platforms/small_platform.xml --log=xbt_cfg.thresh:warning -np 3 --cfg=smpi/host-speed:1e9 --cfg=smpi/coll_selector:mpich \${bindir:=.}/${test} --log=smpi_coll.thresh:error" APPEND)
  endforeach()
endif()

# Erase all tesh files on cleanup: they are generated anyway
set_directory_properties ( PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${files_to_clean}" )

if(enable_smpi AND enable_model-checking AND enable_smpi_ISP_testsuite)
  foreach (tesh ${umpire_tesh})
    ADD_TESH(mc-umpire-${tesh}
      --setenv srcdir=${CMAKE_CURRENT_SOURCE_DIR}
      --setenv bindir=${CMAKE_CURRENT_BINARY_DIR}
      --cd ${CMAKE_CURRENT_SOURCE_DIR}
      ${CMAKE_CURRENT_BINARY_DIR}/${tesh}.tesh)
  endforeach()
endif()
