Database System 0.1.0
Advanced C++20 Database System with Multi-Backend Support
Loading...
Searching...
No Matches
backend_base_test.cpp File Reference
#include <atomic>
#include <gtest/gtest.h>
#include <memory>
#include <string>
#include "database/core/backend_base.h"
#include "database/core/database_backend.h"
Include dependency graph for backend_base_test.cpp:

Go to the source code of this file.

Classes

class  BackendBaseTest
 

Functions

 TEST_F (BackendBaseTest, TypeReturnsCorrectDatabaseType)
 
 TEST_F (BackendBaseTest, TypeReturnsCorrectForAlternateBackend)
 
 TEST_F (BackendBaseTest, InitialStateIsNotInitialized)
 
 TEST_F (BackendBaseTest, SuccessfulInitializationSetsState)
 
 TEST_F (BackendBaseTest, FailedInitializationDoesNotSetState)
 
 TEST_F (BackendBaseTest, DoubleInitializationIsRejected)
 
 TEST_F (BackendBaseTest, DoubleInitializationDoesNotCallDoInitialize)
 
 TEST_F (BackendBaseTest, InitializeAfterShutdownSucceeds)
 
 TEST_F (BackendBaseTest, ShutdownWithoutInitIsNoOp)
 
 TEST_F (BackendBaseTest, ShutdownAfterInitClearsState)
 
 TEST_F (BackendBaseTest, DoubleShutdownIsIdempotent)
 
 TEST_F (BackendBaseTest, ShutdownSetsInitializedToFalseEvenOnError)
 
 TEST_F (BackendBaseTest, CreateReturnsUniquePointer)
 
 TEST_F (BackendBaseTest, CreateReturnsDistinctInstances)
 
 TEST_F (BackendBaseTest, DestructorCallsShutdown)
 
 TEST_F (BackendBaseTest, DestructorSafeWithoutInit)
 
 TEST_F (BackendBaseTest, FullLifecycleCycle)
 
 TEST_F (BackendBaseTest, MultipleLifecycleCycles)
 
 TEST_F (BackendBaseTest, BackendIsNotCopyable)
 
 TEST_F (BackendBaseTest, BackendIsNotMoveable)
 
int main (int argc, char **argv)
 

Function Documentation

◆ main()

int main ( int argc,
char ** argv )

Definition at line 393 of file backend_base_test.cpp.

394{
395 ::testing::InitGoogleTest(&argc, argv);
396 return RUN_ALL_TESTS();
397}

◆ TEST_F() [1/20]

TEST_F ( BackendBaseTest ,
BackendIsNotCopyable  )

Definition at line 381 of file backend_base_test.cpp.

382{
383 EXPECT_FALSE(std::is_copy_constructible_v<succeeding_backend>);
384 EXPECT_FALSE(std::is_copy_assignable_v<succeeding_backend>);
385}

◆ TEST_F() [2/20]

TEST_F ( BackendBaseTest ,
BackendIsNotMoveable  )

Definition at line 387 of file backend_base_test.cpp.

388{
389 EXPECT_FALSE(std::is_move_constructible_v<succeeding_backend>);
390 EXPECT_FALSE(std::is_move_assignable_v<succeeding_backend>);
391}

◆ TEST_F() [3/20]

TEST_F ( BackendBaseTest ,
CreateReturnsDistinctInstances  )

Definition at line 305 of file backend_base_test.cpp.

306{
307 auto b1 = succeeding_backend::create();
308 auto b2 = succeeding_backend::create();
309 EXPECT_NE(b1.get(), b2.get());
310}

◆ TEST_F() [4/20]

TEST_F ( BackendBaseTest ,
CreateReturnsUniquePointer  )

Definition at line 297 of file backend_base_test.cpp.

298{
299 auto backend = succeeding_backend::create();
300 ASSERT_NE(backend, nullptr);
301 EXPECT_EQ(backend->type(), database_types::sqlite);
302 EXPECT_FALSE(backend->is_initialized());
303}

◆ TEST_F() [5/20]

TEST_F ( BackendBaseTest ,
DestructorCallsShutdown  )

Definition at line 316 of file backend_base_test.cpp.

317{
318 int shutdown_count = 0;
319 {
320 succeeding_backend backend;
321 backend.initialize(test_config_);
322 shutdown_count = backend.shutdown_call_count;
323 EXPECT_EQ(shutdown_count, 0);
324 // Destructor should call shutdown
325 }
326 // After destruction, we cannot check shutdown_call_count directly,
327 // but we can verify the pattern works without crashes
328 SUCCEED();
329}

◆ TEST_F() [6/20]

TEST_F ( BackendBaseTest ,
DestructorSafeWithoutInit  )

Definition at line 331 of file backend_base_test.cpp.

332{
333 // Backend destroyed without ever being initialized - should not crash
334 { succeeding_backend backend; }
335 SUCCEED();
336}

◆ TEST_F() [7/20]

TEST_F ( BackendBaseTest ,
DoubleInitializationDoesNotCallDoInitialize  )

Definition at line 225 of file backend_base_test.cpp.

226{
227 succeeding_backend backend;
228 backend.initialize(test_config_);
229 backend.initialize(test_config_); // Should be rejected
230
231 // do_initialize should only be called once
232 EXPECT_EQ(backend.init_call_count, 1);
233}

◆ TEST_F() [8/20]

TEST_F ( BackendBaseTest ,
DoubleInitializationIsRejected  )

Definition at line 214 of file backend_base_test.cpp.

215{
216 succeeding_backend backend;
217 EXPECT_TRUE(backend.initialize(test_config_).is_ok());
218
219 // Second initialization should fail with error
220 auto result = backend.initialize(test_config_);
221 EXPECT_FALSE(result.is_ok());
222 EXPECT_TRUE(backend.is_initialized()); // State unchanged
223}

◆ TEST_F() [9/20]

TEST_F ( BackendBaseTest ,
DoubleShutdownIsIdempotent  )

Definition at line 273 of file backend_base_test.cpp.

274{
275 succeeding_backend backend;
276 backend.initialize(test_config_);
277 backend.shutdown();
278 auto result = backend.shutdown(); // Second call is no-op
279 EXPECT_TRUE(result.is_ok());
280 EXPECT_EQ(backend.shutdown_call_count, 1);
281}

◆ TEST_F() [10/20]

TEST_F ( BackendBaseTest ,
FailedInitializationDoesNotSetState  )

Definition at line 206 of file backend_base_test.cpp.

207{
208 failing_backend backend;
209 auto result = backend.initialize(test_config_);
210 EXPECT_FALSE(result.is_ok());
211 EXPECT_FALSE(backend.is_initialized());
212}

◆ TEST_F() [11/20]

TEST_F ( BackendBaseTest ,
FullLifecycleCycle  )

Definition at line 342 of file backend_base_test.cpp.

343{
344 succeeding_backend backend;
345
346 // Initial state
347 EXPECT_FALSE(backend.is_initialized());
348
349 // Initialize
350 EXPECT_TRUE(backend.initialize(test_config_).is_ok());
351 EXPECT_TRUE(backend.is_initialized());
352
353 // Use (simple operation)
354 auto result = backend.execute_query("INSERT INTO test VALUES (1)");
355 EXPECT_TRUE(result.is_ok());
356
357 // Shutdown
358 EXPECT_TRUE(backend.shutdown().is_ok());
359 EXPECT_FALSE(backend.is_initialized());
360}

◆ TEST_F() [12/20]

TEST_F ( BackendBaseTest ,
InitializeAfterShutdownSucceeds  )

Definition at line 235 of file backend_base_test.cpp.

236{
237 succeeding_backend backend;
238 EXPECT_TRUE(backend.initialize(test_config_).is_ok());
239 EXPECT_TRUE(backend.shutdown().is_ok());
240 EXPECT_FALSE(backend.is_initialized());
241
242 // Re-initialization should succeed
243 auto result = backend.initialize(test_config_);
244 EXPECT_TRUE(result.is_ok());
245 EXPECT_TRUE(backend.is_initialized());
246 EXPECT_EQ(backend.init_call_count, 2);
247}

◆ TEST_F() [13/20]

TEST_F ( BackendBaseTest ,
InitialStateIsNotInitialized  )

Definition at line 192 of file backend_base_test.cpp.

193{
194 succeeding_backend backend;
195 EXPECT_FALSE(backend.is_initialized());
196}

◆ TEST_F() [14/20]

TEST_F ( BackendBaseTest ,
MultipleLifecycleCycles  )

Definition at line 362 of file backend_base_test.cpp.

363{
364 succeeding_backend backend;
365
366 for (int i = 0; i < 5; ++i) {
367 EXPECT_TRUE(backend.initialize(test_config_).is_ok());
368 EXPECT_TRUE(backend.is_initialized());
369 EXPECT_TRUE(backend.shutdown().is_ok());
370 EXPECT_FALSE(backend.is_initialized());
371 }
372
373 EXPECT_EQ(backend.init_call_count, 5);
374 EXPECT_EQ(backend.shutdown_call_count, 5);
375}

◆ TEST_F() [15/20]

TEST_F ( BackendBaseTest ,
ShutdownAfterInitClearsState  )

Definition at line 263 of file backend_base_test.cpp.

264{
265 succeeding_backend backend;
266 backend.initialize(test_config_);
267 auto result = backend.shutdown();
268 EXPECT_TRUE(result.is_ok());
269 EXPECT_FALSE(backend.is_initialized());
270 EXPECT_EQ(backend.shutdown_call_count, 1);
271}

◆ TEST_F() [16/20]

TEST_F ( BackendBaseTest ,
ShutdownSetsInitializedToFalseEvenOnError  )

Definition at line 283 of file backend_base_test.cpp.

284{
285 // backend_base always sets initialized_ = false after do_shutdown,
286 // regardless of whether do_shutdown returns error
287 succeeding_backend backend;
288 backend.initialize(test_config_);
289 backend.shutdown();
290 EXPECT_FALSE(backend.is_initialized());
291}

◆ TEST_F() [17/20]

TEST_F ( BackendBaseTest ,
ShutdownWithoutInitIsNoOp  )

Definition at line 253 of file backend_base_test.cpp.

254{
255 succeeding_backend backend;
256 auto result = backend.shutdown();
257 EXPECT_TRUE(result.is_ok());
258 EXPECT_FALSE(backend.is_initialized());
259 // do_shutdown should not be called since not initialized
260 EXPECT_EQ(backend.shutdown_call_count, 0);
261}

◆ TEST_F() [18/20]

TEST_F ( BackendBaseTest ,
SuccessfulInitializationSetsState  )

Definition at line 198 of file backend_base_test.cpp.

199{
200 succeeding_backend backend;
201 auto result = backend.initialize(test_config_);
202 EXPECT_TRUE(result.is_ok());
203 EXPECT_TRUE(backend.is_initialized());
204}

◆ TEST_F() [19/20]

TEST_F ( BackendBaseTest ,
TypeReturnsCorrectDatabaseType  )

Definition at line 176 of file backend_base_test.cpp.

177{
178 succeeding_backend backend;
179 EXPECT_EQ(backend.type(), database_types::sqlite);
180}

◆ TEST_F() [20/20]

TEST_F ( BackendBaseTest ,
TypeReturnsCorrectForAlternateBackend  )

Definition at line 182 of file backend_base_test.cpp.

183{
184 failing_backend backend;
185 EXPECT_EQ(backend.type(), database_types::postgres);
186}