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()
|