LCOV - code coverage report
Current view: top level - /opt/artdaq/srcs/artdaq-database/test/CaseStudy/OtsDaqCPPInterface/test009 - MergeOverwrite_t.cc (source / functions) Coverage Total Hit
Test: artdaq.info.cleaned Lines: 100.0 % 295 295
Test Date: 2026-10-29 00:35:58 Functions: 100.0 % 27 27

            Line data    Source code
       1              : #define BOOST_TEST_DYN_LINK
       2              : #define BOOST_TEST_MODULE (MergeOverwrite test)
       3              : 
       4              : #include <boost/test/unit_test.hpp>
       5              : 
       6              : #include <algorithm>
       7              : #include <iostream>
       8              : #include <memory>
       9              : #include <set>
      10              : #include <string>
      11              : 
      12              : #include "../DatabaseConfigurationInterface.h"
      13              : 
      14              : using namespace ots;
      15              : 
      16              : struct MergeOverwriteTestData {
      17            2 :   MergeOverwriteTestData() {
      18            2 :     srand(time(nullptr));
      19            2 :     baseVersion = rand() % 99999 + 100000;
      20            2 :     std::cout << "=== MERGE-BASED OVERWRITE TEST SUITE ===\n";
      21            2 :     std::cout << "Base version: " << baseVersion << "\n";
      22            2 :   }
      23              : 
      24            2 :   ~MergeOverwriteTestData() { std::cout << "\n=== TEST SUITE COMPLETE ===\n"; }
      25              : 
      26           28 :   int createConfig001(DatabaseConfigurationInterface& ifc, int version) {
      27           28 :     std::shared_ptr<ConfigurationBase> cfg = std::make_shared<TestConfiguration001>();
      28           28 :     cfg->getView().version = version;
      29           56 :     return ifc.saveActiveVersion(cfg.get());
      30           28 :   }
      31              : 
      32           10 :   int createConfig002(DatabaseConfigurationInterface& ifc, int version) {
      33           10 :     std::shared_ptr<ConfigurationBase> cfg = std::make_shared<TestConfiguration002>();
      34           10 :     cfg->getView().version = version;
      35           20 :     return ifc.saveActiveVersion(cfg.get());
      36           10 :   }
      37              : 
      38           68 :   std::string config001Name() {
      39           68 :     std::shared_ptr<ConfigurationBase> cfg = std::make_shared<TestConfiguration001>();
      40          136 :     return cfg->getConfigurationName();
      41           68 :   }
      42              : 
      43           26 :   std::string config002Name() {
      44           26 :     std::shared_ptr<ConfigurationBase> cfg = std::make_shared<TestConfiguration002>();
      45           52 :     return cfg->getConfigurationName();
      46           26 :   }
      47              : 
      48              :   int baseVersion;
      49              : };
      50              : 
      51              : MergeOverwriteTestData fixture;
      52              : 
      53              : BOOST_AUTO_TEST_SUITE(merge_overwrite_test)
      54              : 
      55            4 : BOOST_AUTO_TEST_CASE(overwrite_same_content_succeeds) {
      56            2 :   std::cout << "\n=== TEST 1: Overwrite same content succeeds ===\n";
      57              : 
      58            2 :   auto ifc = DatabaseConfigurationInterface();
      59              : 
      60            2 :   int version1 = fixture.baseVersion;
      61            2 :   BOOST_REQUIRE_EQUAL(fixture.createConfig001(ifc, version1), 0);
      62            2 :   std::cout << "Step 1: Created version " << version1 << "\n";
      63              : 
      64            2 :   auto map1 = DatabaseConfigurationInterface::config_version_map_t{};
      65            2 :   map1[fixture.config001Name()] = version1;
      66              : 
      67            2 :   std::string compName = "OverwriteSame_" + std::to_string(fixture.baseVersion);
      68            2 :   BOOST_CHECK_NO_THROW(ifc.storeGlobalConfiguration(map1, compName));
      69            2 :   std::cout << "Step 2: Created composition '" << compName << "'\n";
      70              : 
      71            2 :   std::cout << "Step 3: Overwriting with same content (allowOverwrite=true)...\n";
      72            2 :   BOOST_CHECK_NO_THROW(ifc.storeGlobalConfiguration(map1, compName, true));
      73            2 :   std::cout << "  Result: SUCCESS\n";
      74              : 
      75            2 :   auto loaded = ifc.loadGlobalConfiguration(compName);
      76            2 :   BOOST_CHECK_EQUAL(loaded.size(), 1);
      77            2 :   BOOST_CHECK_EQUAL(loaded[fixture.config001Name()], version1);
      78              : 
      79            2 :   std::cout << "  Verified: Composition unchanged after overwrite\n";
      80            2 : }
      81              : 
      82            4 : BOOST_AUTO_TEST_CASE(overwrite_add_new_member) {
      83            2 :   std::cout << "\n=== TEST 2: Overwrite adding new member ===\n";
      84              : 
      85            2 :   auto ifc = DatabaseConfigurationInterface();
      86              : 
      87            2 :   int version1 = fixture.baseVersion + 10;
      88            2 :   int version2 = fixture.baseVersion + 11;
      89              : 
      90            2 :   BOOST_REQUIRE_EQUAL(fixture.createConfig001(ifc, version1), 0);
      91            2 :   BOOST_REQUIRE_EQUAL(fixture.createConfig002(ifc, version2), 0);
      92            2 :   std::cout << "Step 1: Created versions " << version1 << ", " << version2 << "\n";
      93              : 
      94            2 :   auto map1 = DatabaseConfigurationInterface::config_version_map_t{};
      95            2 :   map1[fixture.config001Name()] = version1;
      96              : 
      97            2 :   std::string compName = "OverwriteAdd_" + std::to_string(fixture.baseVersion);
      98            2 :   ifc.storeGlobalConfiguration(map1, compName);
      99            2 :   std::cout << "Step 2: Created composition with 1 member\n";
     100              : 
     101            2 :   auto initial = ifc.loadGlobalConfiguration(compName);
     102            2 :   BOOST_CHECK_EQUAL(initial.size(), 1);
     103              : 
     104            2 :   auto map2 = DatabaseConfigurationInterface::config_version_map_t{};
     105            2 :   map2[fixture.config001Name()] = version1;
     106            2 :   map2[fixture.config002Name()] = version2;
     107              : 
     108            2 :   std::cout << "Step 3: Overwriting to add new member...\n";
     109            2 :   BOOST_CHECK_NO_THROW(ifc.storeGlobalConfiguration(map2, compName, true));
     110            2 :   std::cout << "  Result: SUCCESS\n";
     111              : 
     112            2 :   auto loaded = ifc.loadGlobalConfiguration(compName);
     113            2 :   BOOST_CHECK_EQUAL(loaded.size(), 2);
     114            2 :   BOOST_CHECK_EQUAL(loaded[fixture.config001Name()], version1);
     115            2 :   BOOST_CHECK_EQUAL(loaded[fixture.config002Name()], version2);
     116              : 
     117            2 :   std::cout << "  Verified: Composition now has 2 members\n";
     118              : 
     119            2 :   auto foundComps = ifc.findCompositionsContaining(fixture.config002Name(), std::to_string(version2));
     120            2 :   bool found = (foundComps.find(compName) != foundComps.end());
     121            2 :   BOOST_CHECK_EQUAL(found, true);
     122              : 
     123            2 :   std::cout << "  Verified: Reverse lookup finds new member\n";
     124            2 : }
     125              : 
     126            4 : BOOST_AUTO_TEST_CASE(overwrite_remove_member) {
     127            2 :   std::cout << "\n=== TEST 3: Overwrite removing member ===\n";
     128              : 
     129            2 :   auto ifc = DatabaseConfigurationInterface();
     130              : 
     131            2 :   int version1 = fixture.baseVersion + 20;
     132            2 :   int version2 = fixture.baseVersion + 21;
     133              : 
     134            2 :   BOOST_REQUIRE_EQUAL(fixture.createConfig001(ifc, version1), 0);
     135            2 :   BOOST_REQUIRE_EQUAL(fixture.createConfig002(ifc, version2), 0);
     136            2 :   std::cout << "Step 1: Created versions " << version1 << ", " << version2 << "\n";
     137              : 
     138            2 :   auto map1 = DatabaseConfigurationInterface::config_version_map_t{};
     139            2 :   map1[fixture.config001Name()] = version1;
     140            2 :   map1[fixture.config002Name()] = version2;
     141              : 
     142            2 :   std::string compName = "OverwriteRemove_" + std::to_string(fixture.baseVersion);
     143            2 :   ifc.storeGlobalConfiguration(map1, compName);
     144            2 :   std::cout << "Step 2: Created composition with 2 members\n";
     145              : 
     146            2 :   auto initial = ifc.loadGlobalConfiguration(compName);
     147            2 :   BOOST_CHECK_EQUAL(initial.size(), 2);
     148              : 
     149            2 :   auto map2 = DatabaseConfigurationInterface::config_version_map_t{};
     150            2 :   map2[fixture.config001Name()] = version1;
     151              : 
     152            2 :   std::cout << "Step 3: Overwriting to remove Config002...\n";
     153            2 :   BOOST_CHECK_NO_THROW(ifc.storeGlobalConfiguration(map2, compName, true));
     154            2 :   std::cout << "  Result: SUCCESS\n";
     155              : 
     156            2 :   auto loaded = ifc.loadGlobalConfiguration(compName);
     157            2 :   BOOST_CHECK_EQUAL(loaded.size(), 1);
     158            2 :   BOOST_CHECK_EQUAL(loaded[fixture.config001Name()], version1);
     159              : 
     160            2 :   bool hasConfig002 = (loaded.find(fixture.config002Name()) != loaded.end());
     161            2 :   BOOST_CHECK_EQUAL(hasConfig002, false);
     162              : 
     163            2 :   std::cout << "  Verified: Composition now has 1 member (Config002 removed)\n";
     164              : 
     165            2 :   auto foundComps = ifc.findCompositionsContaining(fixture.config002Name(), std::to_string(version2));
     166            2 :   bool stillFound = (foundComps.find(compName) != foundComps.end());
     167            2 :   BOOST_CHECK_EQUAL(stillFound, false);
     168              : 
     169            2 :   std::cout << "  Verified: Reverse lookup no longer finds removed member\n";
     170            2 : }
     171              : 
     172            4 : BOOST_AUTO_TEST_CASE(overwrite_update_version) {
     173            2 :   std::cout << "\n=== TEST 4: Overwrite updating member version ===\n";
     174              : 
     175            2 :   auto ifc = DatabaseConfigurationInterface();
     176              : 
     177            2 :   int versionOld = fixture.baseVersion + 30;
     178            2 :   int versionNew = fixture.baseVersion + 31;
     179              : 
     180            2 :   BOOST_REQUIRE_EQUAL(fixture.createConfig001(ifc, versionOld), 0);
     181            2 :   BOOST_REQUIRE_EQUAL(fixture.createConfig001(ifc, versionNew), 0);
     182            2 :   std::cout << "Step 1: Created versions " << versionOld << " and " << versionNew << "\n";
     183              : 
     184            2 :   auto map1 = DatabaseConfigurationInterface::config_version_map_t{};
     185            2 :   map1[fixture.config001Name()] = versionOld;
     186              : 
     187            2 :   std::string compName = "OverwriteUpdate_" + std::to_string(fixture.baseVersion);
     188            2 :   ifc.storeGlobalConfiguration(map1, compName);
     189            2 :   std::cout << "Step 2: Created composition with version " << versionOld << "\n";
     190              : 
     191            2 :   auto map2 = DatabaseConfigurationInterface::config_version_map_t{};
     192            2 :   map2[fixture.config001Name()] = versionNew;
     193              : 
     194            2 :   std::cout << "Step 3: Overwriting to update version to " << versionNew << "...\n";
     195            2 :   BOOST_CHECK_NO_THROW(ifc.storeGlobalConfiguration(map2, compName, true));
     196            2 :   std::cout << "  Result: SUCCESS\n";
     197              : 
     198            2 :   auto loaded = ifc.loadGlobalConfiguration(compName);
     199            2 :   BOOST_CHECK_EQUAL(loaded.size(), 1);
     200            2 :   BOOST_CHECK_EQUAL(loaded[fixture.config001Name()], versionNew);
     201              : 
     202            2 :   std::cout << "  Verified: Composition now has version " << versionNew << "\n";
     203              : 
     204            2 :   auto foundOld = ifc.findCompositionsContaining(fixture.config001Name(), std::to_string(versionOld));
     205            2 :   bool oldFound = (foundOld.find(compName) != foundOld.end());
     206            2 :   BOOST_CHECK_EQUAL(oldFound, false);
     207              : 
     208            2 :   std::cout << "  Verified: Reverse lookup for old version returns empty\n";
     209              : 
     210            2 :   auto foundNew = ifc.findCompositionsContaining(fixture.config001Name(), std::to_string(versionNew));
     211            2 :   bool newFound = (foundNew.find(compName) != foundNew.end());
     212            2 :   BOOST_CHECK_EQUAL(newFound, true);
     213              : 
     214            2 :   std::cout << "  Verified: Reverse lookup for new version finds composition\n";
     215            2 : }
     216              : 
     217            4 : BOOST_AUTO_TEST_CASE(overwrite_complete_replacement) {
     218            2 :   std::cout << "\n=== TEST 5: Overwrite complete replacement ===\n";
     219              : 
     220            2 :   auto ifc = DatabaseConfigurationInterface();
     221              : 
     222            2 :   int versionA = fixture.baseVersion + 40;
     223            2 :   int versionB = fixture.baseVersion + 41;
     224            2 :   int versionC = fixture.baseVersion + 42;
     225              : 
     226            2 :   BOOST_REQUIRE_EQUAL(fixture.createConfig001(ifc, versionA), 0);
     227            2 :   BOOST_REQUIRE_EQUAL(fixture.createConfig001(ifc, versionC), 0);
     228            2 :   BOOST_REQUIRE_EQUAL(fixture.createConfig002(ifc, versionB), 0);
     229            2 :   std::cout << "Step 1: Created versions A=" << versionA << ", B=" << versionB << ", C=" << versionC << "\n";
     230              : 
     231            2 :   auto map1 = DatabaseConfigurationInterface::config_version_map_t{};
     232            2 :   map1[fixture.config001Name()] = versionA;
     233              : 
     234            2 :   std::string compName = "OverwriteReplace_" + std::to_string(fixture.baseVersion);
     235            2 :   ifc.storeGlobalConfiguration(map1, compName);
     236            2 :   std::cout << "Step 2: Created composition with Config001/v" << versionA << "\n";
     237              : 
     238            2 :   auto map2 = DatabaseConfigurationInterface::config_version_map_t{};
     239            2 :   map2[fixture.config001Name()] = versionC;
     240            2 :   map2[fixture.config002Name()] = versionB;
     241              : 
     242            2 :   std::cout << "Step 3: Complete replacement...\n";
     243            2 :   BOOST_CHECK_NO_THROW(ifc.storeGlobalConfiguration(map2, compName, true));
     244            2 :   std::cout << "  Result: SUCCESS\n";
     245              : 
     246            2 :   auto loaded = ifc.loadGlobalConfiguration(compName);
     247            2 :   BOOST_CHECK_EQUAL(loaded.size(), 2);
     248            2 :   BOOST_CHECK_EQUAL(loaded[fixture.config001Name()], versionC);
     249            2 :   BOOST_CHECK_EQUAL(loaded[fixture.config002Name()], versionB);
     250              : 
     251            2 :   std::cout << "  Verified: Composition replaced completely\n";
     252              : 
     253            2 :   auto foundA = ifc.findCompositionsContaining(fixture.config001Name(), std::to_string(versionA));
     254            2 :   BOOST_CHECK_EQUAL(foundA.find(compName) != foundA.end(), false);
     255              : 
     256            2 :   std::cout << "  Verified: Old version A not in reverse lookup\n";
     257            2 : }
     258              : 
     259            4 : BOOST_AUTO_TEST_CASE(overwrite_without_flag_fails) {
     260            2 :   std::cout << "\n=== TEST 6: Overwrite without flag fails ===\n";
     261              : 
     262            2 :   auto ifc = DatabaseConfigurationInterface();
     263              : 
     264            2 :   int version1 = fixture.baseVersion + 50;
     265            2 :   BOOST_REQUIRE_EQUAL(fixture.createConfig001(ifc, version1), 0);
     266              : 
     267            2 :   auto map1 = DatabaseConfigurationInterface::config_version_map_t{};
     268            2 :   map1[fixture.config001Name()] = version1;
     269              : 
     270            2 :   std::string compName = "OverwriteNoFlag_" + std::to_string(fixture.baseVersion);
     271            2 :   ifc.storeGlobalConfiguration(map1, compName);
     272            2 :   std::cout << "Step 1: Created composition\n";
     273              : 
     274            2 :   std::cout << "Step 2: Attempting overwrite without flag...\n";
     275            4 :   BOOST_CHECK_THROW(ifc.storeGlobalConfiguration(map1, compName), std::runtime_error);
     276            2 :   std::cout << "  Result: Exception thrown (as expected)\n";
     277              : 
     278            2 :   auto loaded = ifc.loadGlobalConfiguration(compName);
     279            2 :   BOOST_CHECK_EQUAL(loaded.size(), 1);
     280              : 
     281            2 :   std::cout << "  Verified: Original composition preserved\n";
     282            2 : }
     283              : 
     284            4 : BOOST_AUTO_TEST_CASE(empty_composition_creation_rejected) {
     285            2 :   std::cout << "\n=== TEST 7: Empty composition creation rejected ===\n";
     286              : 
     287            2 :   auto ifc = DatabaseConfigurationInterface();
     288              : 
     289            2 :   auto emptyMap = DatabaseConfigurationInterface::config_version_map_t{};
     290            2 :   std::string compName = "EmptyComp_" + std::to_string(fixture.baseVersion);
     291              : 
     292            2 :   std::cout << "Attempting to create empty composition...\n";
     293            4 :   BOOST_CHECK_THROW(ifc.storeGlobalConfiguration(emptyMap, compName), std::exception);
     294            2 :   std::cout << "  Result: Exception thrown (as expected)\n";
     295            2 :   std::cout << "  Verified: Empty compositions are rejected with clear error\n";
     296            2 : }
     297              : 
     298            4 : BOOST_AUTO_TEST_CASE(overwrite_to_empty_rejected) {
     299            2 :   std::cout << "\n=== TEST 8: Overwrite to empty rejected ===\n";
     300              : 
     301            2 :   auto ifc = DatabaseConfigurationInterface();
     302              : 
     303            2 :   int version1 = fixture.baseVersion + 70;
     304            2 :   BOOST_REQUIRE_EQUAL(fixture.createConfig001(ifc, version1), 0);
     305              : 
     306            2 :   auto map1 = DatabaseConfigurationInterface::config_version_map_t{};
     307            2 :   map1[fixture.config001Name()] = version1;
     308              : 
     309            2 :   std::string compName = "OverwriteToEmpty_" + std::to_string(fixture.baseVersion);
     310            2 :   ifc.storeGlobalConfiguration(map1, compName);
     311            2 :   std::cout << "Step 1: Created composition with 1 member\n";
     312              : 
     313            2 :   auto emptyMap = DatabaseConfigurationInterface::config_version_map_t{};
     314              : 
     315            2 :   std::cout << "Step 2: Attempting to overwrite with empty map...\n";
     316            4 :   BOOST_CHECK_THROW(ifc.storeGlobalConfiguration(emptyMap, compName, true), std::exception);
     317            2 :   std::cout << "  Result: Exception thrown (as expected)\n";
     318              : 
     319            2 :   auto loaded = ifc.loadGlobalConfiguration(compName);
     320            2 :   BOOST_CHECK_EQUAL(loaded.size(), 1);
     321            2 :   BOOST_CHECK_EQUAL(loaded[fixture.config001Name()], version1);
     322              : 
     323            2 :   std::cout << "  Verified: Original composition preserved after failed overwrite\n";
     324            2 : }
     325              : 
     326            4 : BOOST_AUTO_TEST_CASE(three_versions_bug_regression) {
     327            2 :   std::cout << "\n=== TEST 9: Three Versions Bug regression test ===\n";
     328            2 :   std::cout << "This test verifies the fix for the 'Three Versions Bug'\n";
     329              : 
     330            2 :   auto ifc = DatabaseConfigurationInterface();
     331              : 
     332            2 :   int version1 = fixture.baseVersion + 80;
     333            2 :   int version2 = fixture.baseVersion + 81;
     334            2 :   int version3 = fixture.baseVersion + 82;
     335              : 
     336            2 :   BOOST_REQUIRE_EQUAL(fixture.createConfig001(ifc, version1), 0);
     337            2 :   BOOST_REQUIRE_EQUAL(fixture.createConfig001(ifc, version2), 0);
     338            2 :   BOOST_REQUIRE_EQUAL(fixture.createConfig001(ifc, version3), 0);
     339            2 :   std::cout << "Step 1: Created versions " << version1 << ", " << version2 << ", " << version3 << "\n";
     340              : 
     341            2 :   std::string compName = "ThreeVersionsBugTest_" + std::to_string(fixture.baseVersion);
     342              : 
     343            2 :   auto map1 = DatabaseConfigurationInterface::config_version_map_t{};
     344            2 :   map1[fixture.config001Name()] = version1;
     345            2 :   ifc.storeGlobalConfiguration(map1, compName);
     346            2 :   std::cout << "Step 2: Created composition with version " << version1 << "\n";
     347              : 
     348            2 :   auto map2 = DatabaseConfigurationInterface::config_version_map_t{};
     349            2 :   map2[fixture.config001Name()] = version2;
     350            2 :   ifc.storeGlobalConfiguration(map2, compName, true);
     351            2 :   std::cout << "Step 3: Overwrote with version " << version2 << "\n";
     352              : 
     353            2 :   auto map3 = DatabaseConfigurationInterface::config_version_map_t{};
     354            2 :   map3[fixture.config001Name()] = version3;
     355            2 :   ifc.storeGlobalConfiguration(map3, compName, true);
     356            2 :   std::cout << "Step 4: Overwrote with version " << version3 << "\n";
     357              : 
     358            2 :   auto loaded = ifc.loadGlobalConfiguration(compName);
     359              : 
     360            2 :   BOOST_CHECK_EQUAL(loaded.size(), 1);
     361            2 :   BOOST_CHECK_EQUAL(loaded[fixture.config001Name()], version3);
     362              : 
     363            2 :   std::cout << "Step 5: Verified composition has only version " << version3 << "\n";
     364              : 
     365            2 :   auto found1 = ifc.findCompositionsContaining(fixture.config001Name(), std::to_string(version1));
     366            2 :   BOOST_CHECK_MESSAGE(found1.find(compName) == found1.end(), "BUG: Version " << version1 << " should NOT be found in composition!");
     367              : 
     368            2 :   auto found2 = ifc.findCompositionsContaining(fixture.config001Name(), std::to_string(version2));
     369            2 :   BOOST_CHECK_MESSAGE(found2.find(compName) == found2.end(), "BUG: Version " << version2 << " should NOT be found in composition!");
     370              : 
     371            2 :   auto found3 = ifc.findCompositionsContaining(fixture.config001Name(), std::to_string(version3));
     372            2 :   BOOST_CHECK_MESSAGE(found3.find(compName) != found3.end(), "Version " << version3 << " should be found in composition");
     373              : 
     374            2 :   std::cout << "Step 6-8: Verified reverse lookups are correct\n";
     375            2 :   std::cout << "  v" << version1 << " found: " << (found1.find(compName) != found1.end() ? "YES (BUG!)" : "NO (correct)") << "\n";
     376            2 :   std::cout << "  v" << version2 << " found: " << (found2.find(compName) != found2.end() ? "YES (BUG!)" : "NO (correct)") << "\n";
     377            2 :   std::cout << "  v" << version3 << " found: " << (found3.find(compName) != found3.end() ? "YES (correct)" : "NO (BUG!)") << "\n";
     378              : 
     379            2 :   std::cout << "\n  SUCCESS: Three Versions Bug fix verified!\n";
     380            2 : }
     381              : 
     382            4 : BOOST_AUTO_TEST_CASE(multiple_overwrites_integrity) {
     383            2 :   std::cout << "\n=== TEST 10: Multiple overwrites preserve integrity ===\n";
     384              : 
     385            2 :   auto ifc = DatabaseConfigurationInterface();
     386              : 
     387            2 :   int v1 = fixture.baseVersion + 90;
     388            2 :   int v2 = fixture.baseVersion + 91;
     389            2 :   int v3 = fixture.baseVersion + 92;
     390            2 :   int v4 = fixture.baseVersion + 93;
     391              : 
     392            2 :   BOOST_REQUIRE_EQUAL(fixture.createConfig001(ifc, v1), 0);
     393            2 :   BOOST_REQUIRE_EQUAL(fixture.createConfig001(ifc, v3), 0);
     394            2 :   BOOST_REQUIRE_EQUAL(fixture.createConfig002(ifc, v2), 0);
     395            2 :   BOOST_REQUIRE_EQUAL(fixture.createConfig002(ifc, v4), 0);
     396              : 
     397            2 :   std::string compName = "MultiOverwrite_" + std::to_string(fixture.baseVersion);
     398              : 
     399            2 :   auto map1 = DatabaseConfigurationInterface::config_version_map_t{};
     400            2 :   map1[fixture.config001Name()] = v1;
     401            2 :   map1[fixture.config002Name()] = v2;
     402            2 :   ifc.storeGlobalConfiguration(map1, compName);
     403              : 
     404            2 :   auto map2 = DatabaseConfigurationInterface::config_version_map_t{};
     405            2 :   map2[fixture.config001Name()] = v3;
     406            2 :   map2[fixture.config002Name()] = v2;
     407            2 :   ifc.storeGlobalConfiguration(map2, compName, true);
     408              : 
     409            2 :   auto map3 = DatabaseConfigurationInterface::config_version_map_t{};
     410            2 :   map3[fixture.config001Name()] = v3;
     411            2 :   map3[fixture.config002Name()] = v4;
     412            2 :   ifc.storeGlobalConfiguration(map3, compName, true);
     413              : 
     414            2 :   auto map4 = DatabaseConfigurationInterface::config_version_map_t{};
     415            2 :   map4[fixture.config001Name()] = v3;
     416            2 :   ifc.storeGlobalConfiguration(map4, compName, true);
     417              : 
     418            2 :   auto loaded = ifc.loadGlobalConfiguration(compName);
     419            2 :   BOOST_CHECK_EQUAL(loaded.size(), 1);
     420            2 :   BOOST_CHECK_EQUAL(loaded[fixture.config001Name()], v3);
     421              : 
     422            8 :   auto checkReverseLookup = [&](const std::string& type, int version, bool shouldFind) {
     423            8 :     auto found = ifc.findCompositionsContaining(type, std::to_string(version));
     424            8 :     bool isFound = (found.find(compName) != found.end());
     425            8 :     BOOST_CHECK_EQUAL(isFound, shouldFind);
     426           10 :   };
     427              : 
     428            2 :   checkReverseLookup(fixture.config001Name(), v1, false);
     429            2 :   checkReverseLookup(fixture.config001Name(), v3, true);
     430            2 :   checkReverseLookup(fixture.config002Name(), v2, false);
     431            2 :   checkReverseLookup(fixture.config002Name(), v4, false);
     432              : 
     433            2 :   std::cout << "  Verified: Multiple overwrites maintain integrity\n";
     434            2 : }
     435              : 
     436              : BOOST_AUTO_TEST_SUITE_END()
        

Generated by: LCOV version 2.0-1