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

            Line data    Source code
       1              : #define BOOST_TEST_DYN_LINK
       2              : #define BOOST_TEST_MODULE (FindLatestVersion test)
       3              : 
       4              : #include <boost/test/unit_test.hpp>
       5              : 
       6              : #include <cstdlib>
       7              : #include <ctime>
       8              : #include <iostream>
       9              : #include <memory>
      10              : #include <string>
      11              : #include <vector>
      12              : 
      13              : #include "../DatabaseConfigurationInterface.h"
      14              : 
      15              : using namespace ots;
      16              : 
      17              : struct FindLatestVersionTestData {
      18            2 :   FindLatestVersionTestData() {
      19            2 :     srand(time(nullptr));
      20            2 :     baseVersion = rand() % 99999 + 100000;
      21            2 :     std::cout << "=== FIND LATEST VERSION TEST SUITE ===\n";
      22            2 :     std::cout << "Base version: " << baseVersion << "\n\n";
      23            2 :   }
      24              : 
      25            2 :   ~FindLatestVersionTestData() { std::cout << "\n=== TEST SUITE COMPLETE ===\n"; }
      26              : 
      27              :   int baseVersion;
      28              : };
      29              : 
      30              : FindLatestVersionTestData fixture;
      31              : 
      32              : BOOST_AUTO_TEST_SUITE(find_latest_version_test)
      33              : 
      34            4 : BOOST_AUTO_TEST_CASE(findlatest_single_version) {
      35            2 :   std::cout << "\n=== TEST 1: findLatest single version ===\n";
      36              : 
      37            2 :   auto ifc = DatabaseConfigurationInterface();
      38            2 :   int testVersion = fixture.baseVersion;
      39              : 
      40            2 :   std::shared_ptr<ConfigurationBase> cfg = std::make_shared<TestConfiguration001>();
      41            2 :   cfg->getView().version = testVersion;
      42            2 :   auto saveResult = ifc.saveActiveVersion(cfg.get());
      43            2 :   BOOST_REQUIRE_EQUAL(saveResult, 0);
      44            2 :   std::cout << "Step 1: Saved version " << testVersion << "\n";
      45              : 
      46            2 :   auto latest = ifc.findLatestVersion(cfg.get());
      47            2 :   std::cout << "Step 2: findLatestVersion returned: " << latest << "\n";
      48              : 
      49            2 :   BOOST_CHECK_GE(latest, testVersion);
      50            2 :   std::cout << "  Verified: findLatestVersion works with single version\n";
      51            2 : }
      52              : 
      53            4 : BOOST_AUTO_TEST_CASE(findlatest_ascending_versions) {
      54            2 :   std::cout << "\n=== TEST 2: findLatest ascending versions ===\n";
      55              : 
      56            2 :   auto ifc = DatabaseConfigurationInterface();
      57            2 :   int baseV = fixture.baseVersion + 100;
      58              : 
      59           22 :   for (int i = 1; i <= 10; i++) {
      60           20 :     std::shared_ptr<ConfigurationBase> cfg = std::make_shared<TestConfiguration001>();
      61           20 :     cfg->getView().version = baseV + i;
      62           20 :     auto result = ifc.saveActiveVersion(cfg.get());
      63           20 :     BOOST_REQUIRE_EQUAL(result, 0);
      64           20 :   }
      65            2 :   std::cout << "Step 1: Created versions " << baseV + 1 << " to " << baseV + 10 << "\n";
      66              : 
      67            2 :   std::shared_ptr<ConfigurationBase> cfg = std::make_shared<TestConfiguration001>();
      68            2 :   auto latest = ifc.findLatestVersion(cfg.get());
      69            2 :   std::cout << "Step 2: findLatestVersion returned: " << latest << "\n";
      70              : 
      71            2 :   BOOST_CHECK_GE(latest, baseV + 10);
      72            2 :   std::cout << "  Verified: findLatestVersion returns highest ascending version\n";
      73            2 : }
      74              : 
      75            4 : BOOST_AUTO_TEST_CASE(findlatest_descending_versions) {
      76            2 :   std::cout << "\n=== TEST 3: findLatest descending versions ===\n";
      77              : 
      78            2 :   auto ifc = DatabaseConfigurationInterface();
      79            2 :   int baseV = fixture.baseVersion + 200;
      80              : 
      81           22 :   for (int i = 10; i >= 1; i--) {
      82           20 :     std::shared_ptr<ConfigurationBase> cfg = std::make_shared<TestConfiguration001>();
      83           20 :     cfg->getView().version = baseV + i;
      84           20 :     auto result = ifc.saveActiveVersion(cfg.get());
      85           20 :     BOOST_REQUIRE_EQUAL(result, 0);
      86           20 :   }
      87            2 :   std::cout << "Step 1: Created versions " << baseV + 10 << " down to " << baseV + 1 << " (descending insert order)\n";
      88              : 
      89            2 :   std::shared_ptr<ConfigurationBase> cfg = std::make_shared<TestConfiguration001>();
      90            2 :   auto latest = ifc.findLatestVersion(cfg.get());
      91            2 :   std::cout << "Step 2: findLatestVersion returned: " << latest << "\n";
      92              : 
      93            2 :   BOOST_CHECK_GE(latest, baseV + 10);
      94            2 :   std::cout << "  Verified: findLatestVersion returns highest regardless of insertion order\n";
      95            2 : }
      96              : 
      97            4 : BOOST_AUTO_TEST_CASE(findlatest_random_order_versions) {
      98            2 :   std::cout << "\n=== TEST 4: findLatest random order versions ===\n";
      99              : 
     100            2 :   auto ifc = DatabaseConfigurationInterface();
     101            2 :   int baseV = fixture.baseVersion + 300;
     102              : 
     103            4 :   std::vector<int> versions = {50, 10, 90, 30, 70, 20, 80, 40, 60, 100};
     104              : 
     105           22 :   for (int v : versions) {
     106           20 :     std::shared_ptr<ConfigurationBase> cfg = std::make_shared<TestConfiguration001>();
     107           20 :     cfg->getView().version = baseV + v;
     108           20 :     auto result = ifc.saveActiveVersion(cfg.get());
     109           20 :     BOOST_REQUIRE_EQUAL(result, 0);
     110           20 :   }
     111            2 :   std::cout << "Step 1: Created 10 versions in random order, highest is " << baseV + 100 << "\n";
     112              : 
     113            2 :   std::shared_ptr<ConfigurationBase> cfg = std::make_shared<TestConfiguration001>();
     114            2 :   auto latest = ifc.findLatestVersion(cfg.get());
     115            2 :   std::cout << "Step 2: findLatestVersion returned: " << latest << "\n";
     116              : 
     117            2 :   BOOST_CHECK_GE(latest, baseV + 100);
     118            2 :   std::cout << "  Verified: findLatestVersion returns highest with random insertion\n";
     119            2 : }
     120              : 
     121            4 : BOOST_AUTO_TEST_CASE(findlatest_with_large_gaps) {
     122            2 :   std::cout << "\n=== TEST 5: findLatest with large gaps ===\n";
     123              : 
     124            2 :   auto ifc = DatabaseConfigurationInterface();
     125            2 :   int baseV = fixture.baseVersion + 500;
     126              : 
     127            4 :   std::vector<int> versions = {1, 100, 10000, 100000};
     128              : 
     129           10 :   for (int v : versions) {
     130            8 :     std::shared_ptr<ConfigurationBase> cfg = std::make_shared<TestConfiguration001>();
     131            8 :     cfg->getView().version = baseV + v;
     132            8 :     auto result = ifc.saveActiveVersion(cfg.get());
     133            8 :     BOOST_REQUIRE_EQUAL(result, 0);
     134            8 :   }
     135            2 :   std::cout << "Step 1: Created versions with large gaps: " << baseV + 1 << ", " << baseV + 100 << ", " << baseV + 10000 << ", " << baseV + 100000
     136            2 :             << "\n";
     137              : 
     138            2 :   std::shared_ptr<ConfigurationBase> cfg = std::make_shared<TestConfiguration001>();
     139            2 :   auto latest = ifc.findLatestVersion(cfg.get());
     140            2 :   std::cout << "Step 2: findLatestVersion returned: " << latest << "\n";
     141              : 
     142            2 :   BOOST_CHECK_GE(latest, baseV + 100000);
     143            2 :   std::cout << "  Verified: findLatestVersion handles large gaps correctly\n";
     144            2 : }
     145              : 
     146            4 : BOOST_AUTO_TEST_CASE(findlatest_different_config_types_independent) {
     147            2 :   std::cout << "\n=== TEST 6: findLatest different config types independent ===\n";
     148              : 
     149            2 :   auto ifc = DatabaseConfigurationInterface();
     150            2 :   int baseV = fixture.baseVersion + 600;
     151              : 
     152            8 :   for (int v = 1; v <= 3; v++) {
     153            6 :     std::shared_ptr<ConfigurationBase> cfg1 = std::make_shared<TestConfiguration001>();
     154            6 :     cfg1->getView().version = baseV + v;
     155            6 :     auto result = ifc.saveActiveVersion(cfg1.get());
     156            6 :     BOOST_REQUIRE_EQUAL(result, 0);
     157            6 :   }
     158            2 :   std::cout << "Step 1: TestConfiguration001 versions: " << baseV + 1 << "-" << baseV + 3 << "\n";
     159              : 
     160            8 :   for (int v = 100; v <= 300; v += 100) {
     161            6 :     std::shared_ptr<ConfigurationBase> cfg2 = std::make_shared<TestConfiguration002>();
     162            6 :     cfg2->getView().version = baseV + v;
     163            6 :     auto result = ifc.saveActiveVersion(cfg2.get());
     164            6 :     BOOST_REQUIRE_EQUAL(result, 0);
     165            6 :   }
     166            2 :   std::cout << "Step 2: TestConfiguration002 versions: " << baseV + 100 << ", " << baseV + 200 << ", " << baseV + 300 << "\n";
     167              : 
     168            2 :   std::shared_ptr<ConfigurationBase> cfg1 = std::make_shared<TestConfiguration001>();
     169            2 :   std::shared_ptr<ConfigurationBase> cfg2 = std::make_shared<TestConfiguration002>();
     170              : 
     171            2 :   auto latest1 = ifc.findLatestVersion(cfg1.get());
     172            2 :   auto latest2 = ifc.findLatestVersion(cfg2.get());
     173              : 
     174            2 :   std::cout << "Step 3: Type1 latest: " << latest1 << ", Type2 latest: " << latest2 << "\n";
     175              : 
     176            2 :   BOOST_CHECK_GE(latest1, baseV + 3);
     177            2 :   BOOST_CHECK_GE(latest2, baseV + 300);
     178            2 :   BOOST_CHECK_NE(latest1, latest2);
     179              : 
     180            2 :   std::cout << "  Verified: findLatestVersion is independent per config type\n";
     181            2 : }
     182              : 
     183            4 : BOOST_AUTO_TEST_CASE(findlatest_consecutive_calls_consistent) {
     184            2 :   std::cout << "\n=== TEST 7: findLatest consecutive calls consistent ===\n";
     185              : 
     186            2 :   auto ifc = DatabaseConfigurationInterface();
     187            2 :   int baseV = fixture.baseVersion + 700;
     188              : 
     189           12 :   for (int v = 1; v <= 5; v++) {
     190           10 :     std::shared_ptr<ConfigurationBase> cfg = std::make_shared<TestConfiguration001>();
     191           10 :     cfg->getView().version = baseV + v;
     192           10 :     auto result = ifc.saveActiveVersion(cfg.get());
     193           10 :     BOOST_REQUIRE_EQUAL(result, 0);
     194           10 :   }
     195            2 :   std::cout << "Step 1: Created versions " << baseV + 1 << " to " << baseV + 5 << "\n";
     196              : 
     197            2 :   std::shared_ptr<ConfigurationBase> cfg = std::make_shared<TestConfiguration001>();
     198            2 :   int firstLatest = ifc.findLatestVersion(cfg.get());
     199              : 
     200            2 :   int consistentCount = 0;
     201           22 :   for (int i = 0; i < 10; i++) {
     202           20 :     int latest = ifc.findLatestVersion(cfg.get());
     203           20 :     if (latest == firstLatest) {
     204           20 :       consistentCount++;
     205              :     }
     206              :   }
     207              : 
     208            2 :   std::cout << "Step 2: First call returned: " << firstLatest << ", consistent: " << consistentCount << "/10\n";
     209              : 
     210            2 :   BOOST_CHECK_EQUAL(consistentCount, 10);
     211            2 :   std::cout << "  Verified: findLatestVersion returns consistent results\n";
     212            2 : }
     213              : 
     214              : BOOST_AUTO_TEST_SUITE_END()
        

Generated by: LCOV version 2.0-1