From dc99820bb4db56cb624d0d0e9a4bcba8c9a49b38 Mon Sep 17 00:00:00 2001
From: Tadej Novak <tadej.novak@cern.ch>
Date: Wed, 1 Feb 2023 16:44:13 +0100
Subject: [PATCH] Reorganise AthenaConfiguration unit tests

---
 Control/AthenaConfiguration/CMakeLists.txt    | 85 +++++++++++--------
 .../python/AllConfigFlags.py                  | 17 ++--
 .../python/GeoModelConfigFlags.py             | 40 +++++++--
 .../test/testAllConfigFlags.py                | 53 ------------
 .../test/testAllConfigFlags_AOD_MC.py         | 23 +++++
 .../test/testAllConfigFlags_AOD_data.py       | 23 +++++
 .../test/testAllConfigFlags_EVNT.py           | 18 ++--
 .../test/testAllConfigFlags_HITS.py           | 16 ++--
 .../test/testAllConfigFlags_RDO.py            | 36 +++-----
 .../test/testAthConfigFlags.py                | 18 ++--
 .../AthExUnittest/CMakeLists.txt              | 12 +--
 Projects/AthAnalysis/package_filters.txt      |  2 +
 Projects/AthGeneration/package_filters.txt    |  2 +
 Projects/AthSimulation/package_filters.txt    |  2 +
 .../SimulationConfig/python/SimConfigFlags.py |  2 +-
 15 files changed, 194 insertions(+), 155 deletions(-)
 delete mode 100755 Control/AthenaConfiguration/test/testAllConfigFlags.py
 create mode 100755 Control/AthenaConfiguration/test/testAllConfigFlags_AOD_MC.py
 create mode 100755 Control/AthenaConfiguration/test/testAllConfigFlags_AOD_data.py

diff --git a/Control/AthenaConfiguration/CMakeLists.txt b/Control/AthenaConfiguration/CMakeLists.txt
index d642378ac67..4533caadd51 100644
--- a/Control/AthenaConfiguration/CMakeLists.txt
+++ b/Control/AthenaConfiguration/CMakeLists.txt
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
 
 # Declare the package name:
 atlas_subdir( AthenaConfiguration )
@@ -7,7 +7,9 @@ if( XAOD_STANDALONE )
     atlas_install_python_modules( python/AllConfigFlags.py
                                   python/AthConfigFlags.py
                                   python/AutoConfigFlags.py
+                                  python/GeoModelConfigFlags.py
                                   python/Enums.py
+                                  python/TestDefaults.py
                                   POST_BUILD_CMD ${ATLAS_FLAKE8} )
 else()
     # External dependencies.
@@ -19,51 +21,75 @@ else()
     
     atlas_install_scripts( share/confTool.py python/iconfTool/iconfTool share/CARunner.py
                            POST_BUILD_CMD ${ATLAS_FLAKE8} )
-    
-    # Tests in the package:
-    atlas_add_test( AthConfigFlagsTest
-       SCRIPT test/testAthConfigFlags.py
-       POST_EXEC_SCRIPT nopost.sh )
-    
-    atlas_add_test( MainServicesConfig
-       SCRIPT python -m AthenaConfiguration.MainServicesConfig
-       POST_EXEC_SCRIPT nopost.sh )
+endif()
 
-    atlas_add_test( testAccumulatorCache
-       SCRIPT test/testAccumulatorCache.py
-       POST_EXEC_SCRIPT nopost.sh )
+# common tests
+atlas_add_test( AthConfigFlagsTest
+                SCRIPT test/testAthConfigFlags.py
+                POST_EXEC_SCRIPT nopost.sh )
+
+# tests for analysis releases and Athena
+if( NOT GENERATIONBASE AND NOT SIMULATIONBASE )
+    atlas_add_test( AllConfigFlagsTest_AOD_MC
+                    SCRIPT test/testAllConfigFlags_AOD_MC.py
+                    POST_EXEC_SCRIPT nopost.sh )
+
+    atlas_add_test( AllConfigFlagsTest_AOD_data
+                    SCRIPT test/testAllConfigFlags_AOD_data.py
+                    POST_EXEC_SCRIPT nopost.sh )
 endif()
 
+# tests for Athena-based releases
+if( NOT XAOD_STANDALONE )    
+    atlas_add_test( ComponentAccumulatorTest
+                    SCRIPT test/testComponentAccumulator.py
+                    POST_EXEC_SCRIPT nopost.sh )
+
+    atlas_add_test( AtlasSemantics
+                    SCRIPT test/testAtlasSemantics.py
+                    POST_EXEC_SCRIPT nopost.sh )
+
+    atlas_add_test( AccumulatorCache
+                    SCRIPT test/testAccumulatorCache.py
+                    POST_EXEC_SCRIPT nopost.sh )
+
+    atlas_add_test( MainServicesConfig
+                    SCRIPT python -m AthenaConfiguration.MainServicesConfig
+                    POST_EXEC_SCRIPT nopost.sh )
+endif()
+
+# tests that should not run in analysis releases
 if( NOT XAOD_ANALYSIS )
-   atlas_add_test( ComponentAccumulatorTest
-      SCRIPT test/testComponentAccumulator.py
-      POST_EXEC_SCRIPT nopost.sh )
-
-   atlas_add_test( AllConfigFlagsTest_EVNT_test
-      SCRIPT test/testAllConfigFlags_EVNT.py
-      POST_EXEC_SCRIPT nopost.sh
-      PROPERTIES TIMEOUT 300 )
+    atlas_add_test( AllConfigFlagsTest_EVNT
+                    SCRIPT test/testAllConfigFlags_EVNT.py
+                    POST_EXEC_SCRIPT nopost.sh
+                    PROPERTIES TIMEOUT 300 )
 endif()
 
+# tests that should not run in analysis releases and in AthGeneration
 if( NOT GENERATIONBASE AND NOT XAOD_ANALYSIS )
-    atlas_add_test( DetectorConfigFlags_test
+    atlas_add_test( FPEAndCoreDump
+                    SCRIPT test/testFPEHandling.py )
+
+    atlas_add_test( DetectorConfigFlags
                     SCRIPT test/testDetectorFlags.py
                     POST_EXEC_SCRIPT nopost.sh
                     PROPERTIES TIMEOUT 300 )
 
-    atlas_add_test( AllConfigFlagsTest_HITS_test
+    atlas_add_test( AllConfigFlagsTest_HITS
                     SCRIPT test/testAllConfigFlags_HITS.py
                     POST_EXEC_SCRIPT nopost.sh
                     PROPERTIES TIMEOUT 300  )
 endif()
 
+# tests that should run only in Athena
 if( NOT SIMULATIONBASE AND NOT GENERATIONBASE AND NOT XAOD_ANALYSIS )
-    atlas_add_test( AllConfigFlagsTest_RDO_test
+    atlas_add_test( AllConfigFlagsTest_RDO
                     SCRIPT test/testAllConfigFlags_RDO.py
                     POST_EXEC_SCRIPT nopost.sh
                     PROPERTIES TIMEOUT 300  )
 
-    atlas_add_test( AllConfigFlagsTest
+    atlas_add_test( AllConfigFlagsTest_AOD_Full
                     SCRIPT python -m AthenaConfiguration.AllConfigFlags
                     POST_EXEC_SCRIPT nopost.sh
                     PROPERTIES TIMEOUT 300  )
@@ -75,13 +101,4 @@ if( NOT SIMULATIONBASE AND NOT GENERATIONBASE AND NOT XAOD_ANALYSIS )
     atlas_add_test( OldFlags2NewFlagsTest
                     SCRIPT python -m AthenaConfiguration.OldFlags2NewFlags
                     POST_EXEC_SCRIPT nopost.sh )
-
-    atlas_add_test( AtlasSemantics
-                    SCRIPT test/testAtlasSemantics.py
-                    POST_EXEC_SCRIPT nopost.sh )
-
-
-   atlas_add_test( FPEAndCoreDump
-                   SCRIPT test/testFPEHandling.py
-                 )
 endif()
diff --git a/Control/AthenaConfiguration/python/AllConfigFlags.py b/Control/AthenaConfiguration/python/AllConfigFlags.py
index c155ac07049..fcc23edb8e3 100644
--- a/Control/AthenaConfiguration/python/AllConfigFlags.py
+++ b/Control/AthenaConfiguration/python/AllConfigFlags.py
@@ -196,7 +196,7 @@ def initConfigFlags():
 #Geo Model Flags:
     def __geomodel():
         from AthenaConfiguration.GeoModelConfigFlags import createGeoModelConfigFlags
-        return createGeoModelConfigFlags()
+        return createGeoModelConfigFlags(not isGaudiEnv() or acf.Common.Project is Project.AthAnalysis)
     acf.addFlagsCategory( "GeoModel", __geomodel )
 
 #Reco Flags:
@@ -368,13 +368,16 @@ def initConfigFlags():
 
 ConfigFlags=initConfigFlags()
 
+
 if __name__=="__main__":
+    from AthenaConfiguration.TestDefaults import defaultTestFiles
+    flags = initConfigFlags()
     import sys
-    if len(sys.argv)>1:
-        ConfigFlags.Input.Files = sys.argv[1:]
+    if len(sys.argv) > 1:
+        flags.Input.Files = sys.argv[1:]
     else:
-        ConfigFlags.Input.Files = [ "/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/CommonInputs/data16_13TeV.00311321.physics_Main.recon.AOD.r9264/AOD.11038520._000001.pool.root.1",]
+        flags.Input.Files = defaultTestFiles.AOD_RUN3_DATA
 
-    ConfigFlags.loadAllDynamicFlags()
-    ConfigFlags.initAll()
-    ConfigFlags.dump()
+    flags.loadAllDynamicFlags()
+    flags.initAll()
+    flags.dump()
diff --git a/Control/AthenaConfiguration/python/GeoModelConfigFlags.py b/Control/AthenaConfiguration/python/GeoModelConfigFlags.py
index 73fabcb2449..af7d707647b 100644
--- a/Control/AthenaConfiguration/python/GeoModelConfigFlags.py
+++ b/Control/AthenaConfiguration/python/GeoModelConfigFlags.py
@@ -1,18 +1,45 @@
-# Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
 
 from AthenaConfiguration.AthConfigFlags import AthConfigFlags
 from AthenaConfiguration.AutoConfigFlags import GetFileMD, DetDescrInfo
 from AthenaConfiguration.Enums import LHCPeriod, ProductionStep, Project
 
-def createGeoModelConfigFlags():
+def createGeoModelConfigFlags(analysis=False):
     gcf=AthConfigFlags()
 
-    gcf.addFlag('GeoModel.Layout', 'atlas') # replaces global.GeoLayout
-
     gcf.addFlag("GeoModel.AtlasVersion",
                 lambda prevFlags : (GetFileMD(prevFlags.Input.Files).get("GeoAtlas", None)
                                     or "ATLAS-R2-2016-01-00-01"))
 
+    # Special handling of analysis releases where we only want AtlasVersion and Run
+    if analysis:
+        def _deduct_LHCPeriod(prevFlags):
+            import logging
+            log = logging.getLogger("GeoModelConfigFlags")
+            log.info('Deducing LHC Run period from the geometry tag name "%s" as database access is not available in analysis releases', prevFlags.GeoModel.AtlasVersion)
+
+            if prevFlags.GeoModel.AtlasVersion.startswith("ATLAS-R1"):
+                period = LHCPeriod.Run1
+            elif prevFlags.GeoModel.AtlasVersion.startswith("ATLAS-R2"):
+                period = LHCPeriod.Run2
+            elif prevFlags.GeoModel.AtlasVersion.startswith("ATLAS-R3"):
+                period = LHCPeriod.Run3
+            else:
+                raise ValueError(f'Can not deduct LHC Run period from "{prevFlags.GeoModel.AtlasVersion}", please set "flags.GeoModel.Run" manually.')
+
+            log.info('Using LHC Run period "%s"', period.value)
+            return period
+
+        gcf.addFlag("GeoModel.Run",  # Run deducted from other metadata
+                    _deduct_LHCPeriod, enum=LHCPeriod)
+        return gcf
+
+    gcf.addFlag("GeoModel.Run",  # Run from the geometry database
+                lambda prevFlags : LHCPeriod(DetDescrInfo(prevFlags.GeoModel.AtlasVersion)['Common']['Run']),
+                enum=LHCPeriod)
+
+    gcf.addFlag('GeoModel.Layout', 'atlas') # replaces global.GeoLayout
+
     gcf.addFlag("GeoModel.Align.Dynamic",
                 lambda prevFlags : not prevFlags.Input.isMC and prevFlags.Common.ProductionStep not in [ProductionStep.Simulation, ProductionStep.Overlay])
 
@@ -20,11 +47,6 @@ def createGeoModelConfigFlags():
                 lambda prevFlags : prevFlags.Common.Project is Project.AthSimulation or prevFlags.Common.ProductionStep is ProductionStep.Simulation)
                 # Mainly for G4 which still loads alignment on initialize
 
-    gcf.addFlag("GeoModel.Run",
-                lambda prevFlags : LHCPeriod(DetDescrInfo(prevFlags.GeoModel.AtlasVersion)['Common']['Run']),
-                enum=LHCPeriod)
-                # Based on CommonGeometryFlags.Run
-
     gcf.addFlag("GeoModel.Type",
                 lambda prevFlags : DetDescrInfo(prevFlags.GeoModel.AtlasVersion)['Common']['GeoType'])
                 # Geometry type in {ITKLoI, ITkLoI-VF, etc...}
diff --git a/Control/AthenaConfiguration/test/testAllConfigFlags.py b/Control/AthenaConfiguration/test/testAllConfigFlags.py
deleted file mode 100755
index 4f2c40de94d..00000000000
--- a/Control/AthenaConfiguration/test/testAllConfigFlags.py
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/usr/bin/env python
-# Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
-
-from AthenaConfiguration.AthConfigFlags import AthConfigFlags
-acf=AthConfigFlags()
-acf.addFlag("x.flag1",1)
-acf.addFlag("x.flag2",2)
-acf.addFlag("x.flag3", lambda prev: prev.x.flag2*2 )
-acf.addFlag("x.flag7", lambda prev: prev.x.flag1+27)
-
-print(acf.x.flag1)
-print(acf.x.flag3)
-
-#acf.addFlag("flag4", lambda prev: prev.get("flag5")*2 )
-#acf.addFlag("flag5", lambda prev: prev.get("flag4")*2 )
-#print (acf.get("flag4") -> Circular dependency!  )
-
-
-acf.addFlag("domain1.flag1","bla")
-acf.addFlag("domain1.flag2",lambda prev: prev.domain1.flag1*2)
-acf.addFlag("domain2.flag1","geh")
-acf.addFlag("domain2.flag2","xyz")
-#acf.addFlag("domain2.flagxxx","will fail")
-
-def _createDomain3():
-   f = AthConfigFlags()
-   f.addFlag("domain3.flag1", "")
-   return f
-
-acf.addFlagsCategory("domain3", _createDomain3)
-
-acf.lock()
-
-print("Initial flag container")
-acf.dump()
-
-acfPrime=acf.clone()
-acfPrime.x.flag3 = 42
-acfPrime.domain3.flag1 = "bar"  # check if dynamic flags are cloned
-
-print("Cloned flag container")
-acfPrime.dump()
-
-acfMod=acf.cloneAndReplace("domain1","domain2")
-
-print("After cloneAndReplace")
-acfMod.dump()
-
-ff=acf.initAll()
-
-print("Frozen dict:")
-acf.lock()
-acf.dump()
diff --git a/Control/AthenaConfiguration/test/testAllConfigFlags_AOD_MC.py b/Control/AthenaConfiguration/test/testAllConfigFlags_AOD_MC.py
new file mode 100755
index 00000000000..5dd625ba3ec
--- /dev/null
+++ b/Control/AthenaConfiguration/test/testAllConfigFlags_AOD_MC.py
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+# Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
+from AthenaConfiguration.AllConfigFlags import initConfigFlags
+from AthenaConfiguration.TestDefaults import defaultTestFiles
+flags = initConfigFlags()
+flags.Input.Files = defaultTestFiles.AOD_RUN3_MC
+
+# Load Sim flags if available
+flagsAvailableSim = True
+try:
+    import SimulationConfig # noqa: F401
+except ImportError:
+    flagsAvailableSim = False
+if flagsAvailableSim:
+    flags._loadDynaFlags("Sim")
+
+# Load GeoModel flags
+flags._loadDynaFlags("GeoModel")
+
+# Init and print
+flags.initAll()
+flags.lock()
+flags.dump()
diff --git a/Control/AthenaConfiguration/test/testAllConfigFlags_AOD_data.py b/Control/AthenaConfiguration/test/testAllConfigFlags_AOD_data.py
new file mode 100755
index 00000000000..21ff7011017
--- /dev/null
+++ b/Control/AthenaConfiguration/test/testAllConfigFlags_AOD_data.py
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+# Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
+from AthenaConfiguration.AllConfigFlags import initConfigFlags
+from AthenaConfiguration.TestDefaults import defaultTestFiles
+flags = initConfigFlags()
+flags.Input.Files = defaultTestFiles.AOD_RUN3_DATA
+
+# Load Sim flags if available
+flagsAvailableSim = True
+try:
+    import SimulationConfig # noqa: F401
+except ImportError:
+    flagsAvailableSim = False
+if flagsAvailableSim:
+    flags._loadDynaFlags("Sim")
+
+# Load GeoModel flags
+flags._loadDynaFlags("GeoModel")
+
+# Init and print
+flags.initAll()
+flags.lock()
+flags.dump()
diff --git a/Control/AthenaConfiguration/test/testAllConfigFlags_EVNT.py b/Control/AthenaConfiguration/test/testAllConfigFlags_EVNT.py
index 50f119fdb36..48236eebbe0 100755
--- a/Control/AthenaConfiguration/test/testAllConfigFlags_EVNT.py
+++ b/Control/AthenaConfiguration/test/testAllConfigFlags_EVNT.py
@@ -5,23 +5,25 @@ from AthenaConfiguration.TestDefaults import defaultTestFiles
 flags = initConfigFlags()
 flags.Input.Files = defaultTestFiles.EVNT
 
-havedet = True
+# Load Detector flags if available
+flagsAvailableDetector = True
 try:
     import DetDescrCnvSvc # noqa: F401
 except ImportError:
-    havedet = False
-if havedet:
+    flagsAvailableDetector = False
+if flagsAvailableDetector:
     flags._loadDynaFlags("Detector")
 
-# Don't fail just because G4AtlasApps isn't present in this build.
-havesim = True
+# Load Sim flags if available
+flagsAvailableSim = True
 try:
-    import G4AtlasApps # noqa: F401
+    import SimulationConfig # noqa: F401
 except ImportError:
-    havesim = False
-if havesim:
+    flagsAvailableSim = False
+if flagsAvailableSim:
     flags._loadDynaFlags("Sim")
 
+# Init and print
 flags.initAll()
 flags.lock()
 flags.dump()
diff --git a/Control/AthenaConfiguration/test/testAllConfigFlags_HITS.py b/Control/AthenaConfiguration/test/testAllConfigFlags_HITS.py
index 3a6104e4c7a..ba80d0401c3 100755
--- a/Control/AthenaConfiguration/test/testAllConfigFlags_HITS.py
+++ b/Control/AthenaConfiguration/test/testAllConfigFlags_HITS.py
@@ -4,17 +4,17 @@ from AthenaConfiguration.AllConfigFlags import initConfigFlags
 from AthenaConfiguration.TestDefaults import defaultTestFiles
 flags = initConfigFlags()
 flags.Input.Files = defaultTestFiles.HITS_RUN2
+
+# Load Detector flags
 flags._loadDynaFlags("Detector")
 
-# Don't fail just because G4AtlasApps isn't present in this build.
-havesim = True
-try:
-    import G4AtlasApps # noqa: F401
-except ImportError:
-    havesim = False
-if havesim:
-    flags._loadDynaFlags("Sim")
+# Load Sim flags
+flags._loadDynaFlags("Sim")
+
+# Load GeoModel flags
+flags._loadDynaFlags("GeoModel")
 
+# Init and print
 flags.initAll()
 flags.lock()
 flags.dump()
diff --git a/Control/AthenaConfiguration/test/testAllConfigFlags_RDO.py b/Control/AthenaConfiguration/test/testAllConfigFlags_RDO.py
index 7d5c72cbee2..af25ee1b065 100755
--- a/Control/AthenaConfiguration/test/testAllConfigFlags_RDO.py
+++ b/Control/AthenaConfiguration/test/testAllConfigFlags_RDO.py
@@ -4,35 +4,23 @@ from AthenaConfiguration.AllConfigFlags import initConfigFlags
 from AthenaConfiguration.TestDefaults import defaultTestFiles
 flags = initConfigFlags()
 flags.Input.Files = defaultTestFiles.RDO_RUN2
+
+# Load Detector flags
 flags._loadDynaFlags("Detector")
 
-# Don't fail just because G4AtlasApps isn't present in this build.
-havesim = True
-try:
-    import G4AtlasApps # noqa: F401
-except ImportError:
-    havesim = False
-if havesim:
-    flags._loadDynaFlags("Sim")
+# Load Sim flags
+flags._loadDynaFlags("Sim")
+
+# Load GeoModel flags
+flags._loadDynaFlags("GeoModel")
 
-# Don't fail just because Digitization isn't present in this build.
-haveDigi = True
-try:
-    import Digitization # noqa: F401
-except ImportError:
-    haveDigi = False
-if haveDigi:
-    flags._loadDynaFlags("Digitization")
+# Load Digitization flags
+flags._loadDynaFlags("Digitization")
 
-# Don't fail just because OverlayConfiguration isn't present in this build.
-haveOverlay = True
-try:
-    import OverlayConfiguration # noqa: F401
-except ImportError:
-    haveOverlay = False
-if haveOverlay:
-    flags._loadDynaFlags("Overlay")
+# Load Overlay flags
+flags._loadDynaFlags("Overlay")
 
+# Init and print
 flags.initAll()
 flags.lock()
 flags.dump()
diff --git a/Control/AthenaConfiguration/test/testAthConfigFlags.py b/Control/AthenaConfiguration/test/testAthConfigFlags.py
index 56c152b5668..424f072e919 100755
--- a/Control/AthenaConfiguration/test/testAthConfigFlags.py
+++ b/Control/AthenaConfiguration/test/testAthConfigFlags.py
@@ -1,8 +1,7 @@
 #!/usr/bin/env python
-# Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
 
-from AthenaConfiguration.AthConfigFlags import AthConfigFlags
-from AthenaConfiguration.AccumulatorCache import AccumulatorCache
+from AthenaConfiguration.AthConfigFlags import AthConfigFlags, isGaudiEnv
 from AthenaConfiguration.Enums import Format
 
 import unittest
@@ -46,6 +45,11 @@ class BasicTests(FlagsSetup):
 
     def test_hash(self):
         """Test flag hashing"""
+        if not isGaudiEnv():
+            return
+
+        from AthenaConfiguration.AccumulatorCache import AccumulatorCache
+
         self.assertEqual(self.flags.locked() , False)
         with self.assertRaises(RuntimeError):
             self.flags.athHash()
@@ -108,7 +112,7 @@ class BasicTests(FlagsSetup):
         """Test that enums are properly validated (incorrect flags)"""
         self.flags.addFlag("FormatWrong", lambda flags : "ABC", enum=Format)
         with self.assertRaises(RuntimeError) as _:
-            x=self.flags.FormatWrong 
+            x = self.flags.FormatWrong  # noqa: F841
 
 
 class TestFlagsSetupDynamic(FlagsSetup):
@@ -213,13 +217,15 @@ class FlagsFromArgsTest(unittest.TestCase):
         self.flags.addFlag("detA.flagC","")
 
     def test(self):
-        argline="-l VERBOSE --debug exec --evtMax=10 --skipEvents=3 --filesInput=bla1.data,bla2.data detA.flagB=7 detA.flagC=a.2"
+        argline="-l VERBOSE --evtMax=10 --skipEvents=3 --filesInput=bla1.data,bla2.data detA.flagB=7 detA.flagC=a.2"
+        if isGaudiEnv():
+            argline += " --debug exec"
         print (f"Interpreting arguments: '{argline}'")
         self.flags.fillFromArgs(argline.split())
         self.assertEqual(self.flags.Exec.OutputLevel,1,"Failed to set output level from args")
         self.assertEqual(self.flags.Exec.MaxEvents,10,"Failed to set MaxEvents from args")
         self.assertEqual(self.flags.Exec.SkipEvents,3,"Failed to set SkipEvents from args")
-        self.assertEqual(self.flags.Exec.DebugStage,"exec","Failed to set DebugStage from args")
+        self.assertEqual(self.flags.Exec.DebugStage,"exec" if isGaudiEnv() else "","Failed to set DebugStage from args")
         self.assertEqual(self.flags.Input.Files,["bla1.data","bla2.data"],"Failed to set FileInput from args")
         self.assertEqual(self.flags.detA.flagB,7,"Failed to set arbitrary from args")
         self.assertEqual(self.flags.detA.flagC,"a.2","Failed to set arbitrary unquoted string from args")
diff --git a/Control/AthenaExamples/AthExUnittest/CMakeLists.txt b/Control/AthenaExamples/AthExUnittest/CMakeLists.txt
index 20014dcff61..8adc70bc234 100644
--- a/Control/AthenaExamples/AthExUnittest/CMakeLists.txt
+++ b/Control/AthenaExamples/AthExUnittest/CMakeLists.txt
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
 
 # Declare the package name:
 atlas_subdir( AthExUnittest )
@@ -14,7 +14,9 @@ atlas_add_component( AthExUnittest
                      LINK_LIBRARIES GaudiKernel AthenaBaseComps )
 
 # The test:
-atlas_add_test( gt_AthExUnittest
-  SOURCES test/gt_AthExUnittest.cxx
-  LINK_LIBRARIES GaudiKernel GoogleTestTools AthenaBaseComps CxxUtils
-  POST_EXEC_SCRIPT nopost.sh )
+if( NOT SIMULATIONBASE AND NOT GENERATIONBASE AND NOT XAOD_ANALYSIS )
+  atlas_add_test( gt_AthExUnittest
+    SOURCES test/gt_AthExUnittest.cxx
+    LINK_LIBRARIES GaudiKernel GoogleTestTools AthenaBaseComps CxxUtils
+    POST_EXEC_SCRIPT nopost.sh )
+endif()
diff --git a/Projects/AthAnalysis/package_filters.txt b/Projects/AthAnalysis/package_filters.txt
index 1508639ec46..8146e1d6c43 100644
--- a/Projects/AthAnalysis/package_filters.txt
+++ b/Projects/AthAnalysis/package_filters.txt
@@ -144,6 +144,8 @@
 # Core Athena (would like to reduce) :
 + Control/AthAllocators
 + Control/AthenaConfiguration
++ Control/AthenaExamples/AthExHelloWorld
++ Control/AthenaExamples/AthExHive
 + Control/AthenaServices
 + Control/StoreGate
 + Control/SGComps
diff --git a/Projects/AthGeneration/package_filters.txt b/Projects/AthGeneration/package_filters.txt
index dc8a5689fc6..8bb91e5317f 100644
--- a/Projects/AthGeneration/package_filters.txt
+++ b/Projects/AthGeneration/package_filters.txt
@@ -24,6 +24,8 @@
 + Control/AthenaCommon
 + Control/AthenaConfiguration
 + Control/AthenaExamples/AthExHelloWorld
++ Control/AthenaExamples/AthExHive
++ Control/AthenaExamples/AthExUnittest
 + Control/AthenaInterprocess
 + Control/AthenaKernel
 + Control/AthenaMP
diff --git a/Projects/AthSimulation/package_filters.txt b/Projects/AthSimulation/package_filters.txt
index 0331eee9031..aaf8c791fc9 100644
--- a/Projects/AthSimulation/package_filters.txt
+++ b/Projects/AthSimulation/package_filters.txt
@@ -33,6 +33,8 @@
 + Control/AthenaConfiguration
 + Control/AthenaCommon
 + Control/AthenaExamples/AthExHelloWorld
++ Control/AthenaExamples/AthExHive
++ Control/AthenaExamples/AthExUnittest
 + Control/AthenaInterprocess
 + Control/AthenaKernel
 + Control/AthenaMP
diff --git a/Simulation/SimulationConfig/python/SimConfigFlags.py b/Simulation/SimulationConfig/python/SimConfigFlags.py
index 51e29cb9b3c..b634d965b86 100644
--- a/Simulation/SimulationConfig/python/SimConfigFlags.py
+++ b/Simulation/SimulationConfig/python/SimConfigFlags.py
@@ -86,7 +86,7 @@ def createSimConfigFlags():
         if not version:
             from os import environ
             version = str(environ.get("G4VERS", ""))
-        if isGaudiEnv() and not version:
+        if prevFlags.Input.isMC and isGaudiEnv() and not version:
             raise ValueError("Unknown G4 version")
         return version
 
-- 
GitLab