Skip to content

Commit

Permalink
Add unit test to HConfig reproducing issue found by NASA (ticket #385…
Browse files Browse the repository at this point in the history
…) where two begin iterators produced by subsequent calls to ESMF_HConfigIterBegin() aren't equal.
  • Loading branch information
oehmke committed Jan 6, 2024
1 parent 6c54be7 commit 609c811
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 0 deletions.
73 changes: 73 additions & 0 deletions src/Infrastructure/HConfig/tests/ESMF_HConfigUTest.F90
Original file line number Diff line number Diff line change
Expand Up @@ -789,6 +789,14 @@ program ESMF_HConfigUTest
call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
!------------------------------------------------------------------------

!------------------------------------------------------------------------
!NEX_UTest
write(name, *) "Test fix for issue where two HConfig begin iterators aren't equal."
write(failMsg, *) "Did not return ESMF_SUCCESS"
call HConfigNASAIterIssueTest(rc=rc)
call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
!------------------------------------------------------------------------

!------------------------------------------------------------------------
call ESMF_TestEnd(ESMF_SRCLINE) ! calls ESMF_Finalize() internally
!------------------------------------------------------------------------
Expand Down Expand Up @@ -1074,4 +1082,69 @@ subroutine HConfigIterationTest(hconfig, rc)

end subroutine

! Reproduce an issue found by NASA on NAG systems (support ticket #385) where two begin iterators produced by
! subsequent calls to ESMF_HConfigIterBegin() aren't equal.
subroutine HConfigNASAIterIssueTest(rc)
integer, intent(out) :: rc

type(ESMF_HConfig) :: base_config, temp_configs
type(ESMF_HConfigIter) :: hconfigIter,hconfigIterBegin,hconfigIterEnd
logical :: looped

! Create base hconfig
base_config = ESMF_HConfigCreate(filename='iterequalrepro.yaml',rc=rc)
if (rc /= ESMF_SUCCESS) return

! Does it have collections
if (ESMF_HConfigIsDefined(base_config,keyString='Collections')) then
! Get Collection
temp_configs = ESMF_HConfigCreateAt(base_config,keyString="Collections",rc=rc)
if (rc /= ESMF_SUCCESS) return

! Get iterator to collection
hconfigIter = ESMF_HConfigIterBegin(temp_configs,rc=rc)
if (rc /= ESMF_SUCCESS) return

! Get begin iterator to collection
hconfigIterBegin = ESMF_HConfigIterBegin(temp_configs, rc=rc)
if (rc /= ESMF_SUCCESS) return

! Get end iterator to collection
hconfigIterEnd = ESMF_HConfigIterEnd(temp_configs,rc=rc)
if (rc /= ESMF_SUCCESS) return

! Both begin iterators should be the same
if (hconfigIter /= hconfigIterBegin) then
rc=ESMF_FAILURE
return
endif

! Check if it's looping
looped=.false.
do while (ESMF_HConfigIterLoop(hconfigIter,hconfigIterBegin,hconfigIterEnd))
looped=.true.
enddo

! Should have looped at least once
if (.not. looped) then
rc=ESMF_FAILURE
return
endif

! Get rid of Collection hconfig
call ESMF_HConfigDestroy(temp_configs, rc=rc)
if (rc /= ESMF_SUCCESS) return
end if

! Get rid of Collection hconfig
call ESMF_HConfigDestroy(base_config, rc=rc)
if (rc /= ESMF_SUCCESS) return

! Return success
rc = ESMF_SUCCESS

end subroutine HConfigNASAIterIssueTest



end program ESMF_HConfigUTest
4 changes: 4 additions & 0 deletions src/Infrastructure/HConfig/tests/iterequalrepro.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Collections:
fstream1:
template: foo
range: bar
2 changes: 2 additions & 0 deletions src/Infrastructure/HConfig/tests/makefile
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,11 @@ DIRS =
RUN_ESMF_HConfigUTest:
cp -f sample.rc $(ESMF_TESTDIR)
cp -f sample.yaml $(ESMF_TESTDIR)
cp -f iterequalrepro.yaml $(ESMF_TESTDIR)
$(MAKE) TNAME=HConfig NP=4 ftest

RUN_ESMF_HConfigUTestUNI:
cp -f sample.rc $(ESMF_TESTDIR)
cp -f sample.yaml $(ESMF_TESTDIR)
cp -f iterequalrepro.yaml $(ESMF_TESTDIR)
$(MAKE) TNAME=HConfig NP=1 ftest

0 comments on commit 609c811

Please sign in to comment.