#14423 Fail a unit test leaving data behind in the shared project

The project is a global object shared by all tests, and the MSW export tests loaded a project without closing it. The two summary cases of that project stayed in the summary case main collection, and made RimSummaryCaseMainCollection.RemoveCases_NoDanglingInCallerVector fail on Windows only. Google Test runs the test suites in link order, and the MSW suite runs before the summary suite on Windows and after it on Linux.

Add a test event listener reporting a failure for the test leaving cases, ensembles, well paths or views behind in the project. The project is closed as well, so the tests running after the offending one are unaffected.
This commit is contained in:
Magne Sjaastad committed 2026-08-14 10:23:34 +02:00
1 parent db594490fc
commit 0af06ad965
2 files changed
+68

No files matched your search

@@ -451,6 +451,15 @@ struct MswExportInput
RimWellPath* wellPath = nullptr;
};
//--------------------------------------------------------------------------------------------------
/// The project is a global object shared by all tests, and must be closed before the test completes.
/// The tests below leave early on a failing assertion, so close from a destructor.
//--------------------------------------------------------------------------------------------------
struct ProjectCloser
{
~ProjectCloser() { RiaApplication::instance()->closeProject(); }
};
//--------------------------------------------------------------------------------------------------
/// Load the multiple_laterals project and look up the well path with the given name.
/// Members are left as nullptr if the project, the case or the well path could not be found.
@@ -489,6 +498,8 @@ MswExportInput loadMultipleLateralsProject( const QString& wellPathName )
//--------------------------------------------------------------------------------------------------
TEST( RicWellPathExportMswGeometryPath, MultipleLaterals_LateralsNumberedBeforeCompletionBranches )
{
ProjectCloser projectCloser;
auto input = loadMultipleLateralsProject( "Well-A Y1" );
ASSERT_TRUE( input.eclipseCase != nullptr );
ASSERT_TRUE( input.wellPath != nullptr );
@@ -520,6 +531,8 @@ TEST( RicWellPathExportMswGeometryPath, MultipleLaterals_LateralsNumberedBeforeC
//--------------------------------------------------------------------------------------------------
TEST( RicWellPathExportMswGeometryPath, MultipleLaterals_CompletionBranchesListedAfterTheirLateral )
{
ProjectCloser projectCloser;
auto input = loadMultipleLateralsProject( "Well-A Y1" );
ASSERT_TRUE( input.eclipseCase != nullptr );
ASSERT_TRUE( input.wellPath != nullptr );
@@ -545,6 +558,8 @@ TEST( RicWellPathExportMswGeometryPath, MultipleLaterals_CompletionBranchesListe
//--------------------------------------------------------------------------------------------------
TEST( RicWellPathExportMswGeometryPath, MultipleLaterals_CompsegsOrderedByBranchNumber )
{
ProjectCloser projectCloser;
auto input = loadMultipleLateralsProject( "Well-A Y1" );
ASSERT_TRUE( input.eclipseCase != nullptr );
ASSERT_TRUE( input.wellPath != nullptr );
+53
View File
@@ -22,7 +22,55 @@
#include "RiaQuantityInfoTools.h"
#include "RiaRegressionTestRunner.h"
#include "RimProject.h"
#include <QLocale>
#include <QStringList>
//--------------------------------------------------------------------------------------------------
/// The project is a global object shared by all tests. A test leaving data behind in the project
/// makes the outcome of the tests running after it depend on the test order, and the test order is
/// not the same on all platforms.
///
/// Fail the test that leaves data behind, and close the project so the tests after it are unaffected.
//--------------------------------------------------------------------------------------------------
class RiaProjectIsolationListener : public testing::EmptyTestEventListener
{
private:
void OnTestEnd( const testing::TestInfo& ) override
{
RimProject* project = RimProject::current();
if ( !project ) return;
const QString leftovers = leftoverDescription( project );
if ( leftovers.isEmpty() ) return;
RiaApplication::instance()->closeProject();
ADD_FAILURE() << "The test left data behind in the shared project: " << leftovers.toStdString()
<< ". Call RiaApplication::instance()->closeProject() before the test completes.";
}
static QString leftoverDescription( RimProject* project )
{
QStringList leftovers;
auto appendCount = [&leftovers]( const QString& description, size_t count )
{
if ( count > 0 ) leftovers.append( QString( "%1 %2" ).arg( count ).arg( description ) );
};
appendCount( "grid case(s)", project->allGridCases().size() );
appendCount( "summary case(s)", project->allSummaryCases().size() );
appendCount( "summary ensemble(s)", project->summaryEnsembles().size() );
appendCount( "well path(s)", project->allWellPaths().size() );
appendCount( "view(s)", project->allViews().size() );
if ( !project->fileName().isEmpty() ) leftovers.append( "a project file name" );
return leftovers.join( ", " );
}
};
//--------------------------------------------------------------------------------------------------
///
@@ -40,6 +88,11 @@ int main( int argc, char** argv )
setlocale( LC_NUMERIC, "C" );
testing::InitGoogleTest( &argc, argv );
// OnTestEnd is dispatched in reverse order of appending, so the listener appended last is the
// first to see the end of a test. The failure it reports is then part of the printed test result.
testing::UnitTest::GetInstance()->listeners().Append( new RiaProjectIsolationListener );
int result = RUN_ALL_TESTS();
return result;
}