Database System 0.1.0
Advanced C++20 Database System with Multi-Backend Support
Loading...
Searching...
No Matches
integration_tests.cpp File Reference
#include <gtest/gtest.h>
#include <memory>
#include <chrono>
#include <thread>
#include <future>
#include <vector>
#include "database/database_manager.h"
#include "database/database_types.h"
#include "database/core/database_context.h"
#include "database/orm/entity.h"
#include "database/monitoring/performance_monitor.h"
#include "database/security/secure_connection.h"
#include "database/async/async_operations.h"
Include dependency graph for integration_tests.cpp:

Go to the source code of this file.

Classes

class  IntegrationTestUser
 
class  IntegrationTestBase
 
class  ORMSecurityIntegrationTest
 
class  PerformanceAsyncIntegrationTest
 
class  SecurityMonitoringIntegrationTest
 
class  FullSystemIntegrationTest
 
class  ErrorHandlingIntegrationTest
 
class  ConcurrentOperationsIntegrationTest
 

Functions

 TEST_F (ORMSecurityIntegrationTest, SecureEntityOperations)
 
 TEST_F (PerformanceAsyncIntegrationTest, MonitoredAsyncOperations)
 
 TEST_F (SecurityMonitoringIntegrationTest, MonitoredSecurityEvents)
 
 TEST_F (FullSystemIntegrationTest, CompleteWorkflow)
 
 TEST_F (ErrorHandlingIntegrationTest, FailureRecoveryWorkflow)
 
 TEST_F (ConcurrentOperationsIntegrationTest, ConcurrentSecureOperations)
 
int main (int argc, char **argv)
 

Function Documentation

◆ main()

int main ( int argc,
char ** argv )

Definition at line 567 of file integration_tests.cpp.

567 {
568 ::testing::InitGoogleTest(&argc, argv);
569 return RUN_ALL_TESTS();
570}

◆ TEST_F() [1/6]

TEST_F ( ConcurrentOperationsIntegrationTest ,
ConcurrentSecureOperations  )

Definition at line 481 of file integration_tests.cpp.

481 {
482 auto& rbac = rbac_manager::instance();
483 auto& logger = context_->get_audit_logger();
484 auto& executor = async_executor::instance();
485
486 // Create multiple concurrent users
487 std::vector<std::string> user_ids;
488 for (int i = 0; i < 10; ++i) {
489 std::string user_id = "concurrent_user_" + std::to_string(i);
490 rbac_user user(user_id, user_id + "@test.com");
491 rbac.create_user(user);
492 rbac.assign_role_to_user(user_id, (i % 2 == 0) ? "admin" : "user");
493 user_ids.push_back(user_id);
494 }
495
496 // Launch concurrent operations
497 std::vector<std::future<bool>> operation_futures;
498
499 for (const auto& user_id : user_ids) {
500 auto future = executor.execute_async([&, user_id]() -> bool {
501 // Perform multiple operations concurrently
502 std::vector<std::string> operations = {"user.read", "user.create", "user.update"};
503 bool all_successful = true;
504
505 for (const auto& operation : operations) {
506 auto start_time = std::chrono::high_resolution_clock::now();
507
508 bool has_permission = rbac.check_permission(user_id, operation);
509
510 auto end_time = std::chrono::high_resolution_clock::now();
511 auto op_time = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time);
512
513 // Log concurrent operation
514 audit_event event;
515 event.event_type = audit_event_type::authorization;
516 event.user_id = user_id;
517 event.event_description = "Concurrent operation: " + operation;
518 event.success = has_permission;
519 event.timestamp = start_time;
520 logger.log_event(event);
521
522 // Monitor concurrent performance
523 query_metrics metrics;
524 metrics.query_type = "CONCURRENT_" + operation;
525 metrics.execution_time = op_time;
526 metrics.success = has_permission;
527 metrics.rows_affected = 1;
528 metrics.timestamp = start_time;
529 monitor.record_query_execution(metrics);
530
531 if (!has_permission && operation == "user.read") {
532 all_successful = false; // Even basic read should work
533 }
534 }
535
536 return all_successful;
537 });
538
539 operation_futures.push_back(std::move(future));
540 }
541
542 // Wait for all concurrent operations
543 int successful_operations = 0;
544 for (auto& future : operation_futures) {
545 if (future.get()) {
546 successful_operations++;
547 }
548 }
549
550 // Verify concurrent operations worked correctly
551 EXPECT_GT(successful_operations, 0);
552
553 // Verify all systems handled concurrency properly
554 const auto& stats = monitor.get_query_statistics();
555 EXPECT_GE(stats.total_queries, user_ids.size() * 3); // Each user performed 3 operations
556
557 // Verify audit log captured all concurrent events
558 size_t total_events = 0;
559 for (const auto& user_id : user_ids) {
560 auto events = logger.get_events_by_user(user_id);
561 total_events += events.size();
562 }
563 EXPECT_GE(total_events, user_ids.size() * 3);
564}
bool has_permission(access_control::permission permissions, access_control::permission check)
Metrics for individual query execution.
std::chrono::microseconds execution_time

References database::monitoring::query_metrics::execution_time, database::security::has_permission(), database::monitoring::query_metrics::rows_affected, and database::monitoring::query_metrics::success.

Here is the call graph for this function:

◆ TEST_F() [2/6]

TEST_F ( ErrorHandlingIntegrationTest ,
FailureRecoveryWorkflow  )

Definition at line 418 of file integration_tests.cpp.

418 {
419 auto& rbac = rbac_manager::instance();
420 auto& logger = context_->get_audit_logger();
421 auto& executor = async_executor::instance();
422
423 // Create user without sufficient permissions
424 rbac_user limited_user("limited.user", "limited@test.com");
425 rbac.create_user(limited_user);
426 rbac.assign_role_to_user("limited.user", "user"); // Only has read permission
427
428 // Test error handling in async operations
429 auto error_test_future = executor.execute_async([&]() -> bool {
430 std::string user_id = "limited.user";
431
432 // Attempt unauthorized operation
433 bool can_delete = rbac.check_permission(user_id, "user.delete");
434
435 // Log the authorization failure
436 audit_event auth_event;
437 auth_event.event_type = audit_event_type::authorization;
438 auth_event.user_id = user_id;
439 auth_event.event_description = "Attempted unauthorized delete operation";
440 auth_event.success = can_delete;
441 auth_event.timestamp = std::chrono::system_clock::now();
442 logger.log_event(auth_event);
443
444 // Simulate failed query due to insufficient permissions
445 auto start_time = std::chrono::high_resolution_clock::now();
446
447 // This would be the actual failed operation
448 std::this_thread::sleep_for(std::chrono::milliseconds(10));
449
450 auto end_time = std::chrono::high_resolution_clock::now();
451 auto failed_time = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time);
452
453 // Record failed operation in performance metrics
454 query_metrics failed_metrics;
455 failed_metrics.query_type = "DELETE";
456 failed_metrics.execution_time = failed_time;
457 failed_metrics.success = false; // Failed operation
458 failed_metrics.rows_affected = 0;
459 failed_metrics.timestamp = start_time;
460 monitor.record_query_execution(failed_metrics);
461
462 return !can_delete; // Return true if operation properly failed
463 });
464
465 bool error_handling_success = error_test_future.get();
466 EXPECT_TRUE(error_handling_success);
467
468 // Verify error was properly logged and monitored
469 auto failed_events = logger.get_failed_events();
470 EXPECT_GT(failed_events.size(), 0);
471
472 const auto& stats = monitor.get_query_statistics();
473 EXPECT_GT(stats.failed_queries, 0);
474 EXPECT_LT(stats.successful_queries / static_cast<double>(stats.total_queries), 1.0);
475}

References database::monitoring::query_metrics::execution_time, database::monitoring::query_metrics::rows_affected, and database::monitoring::query_metrics::success.

◆ TEST_F() [3/6]

TEST_F ( FullSystemIntegrationTest ,
CompleteWorkflow  )

Definition at line 332 of file integration_tests.cpp.

332 {
333 auto& rbac = rbac_manager::instance();
334 auto& logger = context_->get_audit_logger();
335 auto& executor = async_executor::instance();
336 auto& entity_mgr = context_->get_entity_manager();
337
338 // Create a complete user management workflow
339 std::string admin_user = "system.admin";
340 rbac_user admin(admin_user, "admin@system.com");
341 rbac.create_user(admin);
342 rbac.assign_role_to_user(admin_user, "admin");
343
344 // Test async entity operations with full security and monitoring
345 auto workflow_future = executor.execute_async([&]() -> bool {
346 auto start_time = std::chrono::high_resolution_clock::now();
347
348 // Step 1: Check permissions
349 bool can_create = rbac.check_permission(admin_user, "user.create");
350 if (!can_create) {
351 audit_event denied_event;
352 denied_event.event_type = audit_event_type::authorization;
353 denied_event.user_id = admin_user;
354 denied_event.event_description = "Access denied for user creation";
355 denied_event.success = false;
356 denied_event.timestamp = std::chrono::system_clock::now();
357 logger.log_event(denied_event);
358 return false;
359 }
360
361 // Step 2: Create entities
362 std::vector<IntegrationTestUser> users;
363 for (int i = 0; i < 5; ++i) {
365 user.username = "workflow_user_" + std::to_string(i);
366 user.email = "workflow" + std::to_string(i) + "@test.com";
367 user.role = (i % 2 == 0) ? "admin" : "user";
368 users.push_back(std::move(user));
369 }
370
371 // Step 3: Log successful operations
372 for (const auto& user : users) {
373 audit_event create_event;
374 create_event.event_type = audit_event_type::data_access;
375 create_event.user_id = admin_user;
376 create_event.event_description = "Created user: " + user.username.get();
377 create_event.success = true;
378 create_event.timestamp = std::chrono::system_clock::now();
379 create_event.resource_accessed = "integration_users";
380 logger.log_event(create_event);
381 }
382
383 auto end_time = std::chrono::high_resolution_clock::now();
384 auto workflow_time = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time);
385
386 // Step 4: Record performance metrics
387 query_metrics metrics;
388 metrics.query_type = "WORKFLOW";
389 metrics.execution_time = workflow_time;
390 metrics.success = true;
391 metrics.rows_affected = users.size();
392 metrics.timestamp = start_time;
393 monitor.record_query_execution(metrics);
394
395 return true;
396 });
397
398 // Wait for workflow completion
399 bool workflow_success = workflow_future.get();
400 EXPECT_TRUE(workflow_success);
401
402 // Verify all systems recorded the workflow
403 auto admin_events = logger.get_events_by_user(admin_user);
404 EXPECT_GT(admin_events.size(), 5); // At least 5 events (1 creation + 5 user operations)
405
406 const auto& perf_stats = monitor.get_query_statistics();
407 EXPECT_GT(perf_stats.total_queries, 0);
408
409 // Verify entity manager has the registered entity
410 const auto& user_metadata = entity_mgr.get_metadata<IntegrationTestUser>();
411 EXPECT_EQ(user_metadata.table_name(), "integration_users");
412}

References database::monitoring::query_metrics::execution_time, database::monitoring::query_metrics::rows_affected, and database::monitoring::query_metrics::success.

◆ TEST_F() [4/6]

TEST_F ( ORMSecurityIntegrationTest ,
SecureEntityOperations  )

Definition at line 160 of file integration_tests.cpp.

160 {
161 auto& rbac = rbac_manager::instance();
162 auto& logger = context_->get_audit_logger();
163
164 // Test entity creation with permission check
165 std::string user_id = "integration.user";
166
167 // Check permission before operation
168 bool can_read = rbac.check_permission(user_id, "user.read");
169 bool can_create = rbac.check_permission(user_id, "user.create");
170
171 EXPECT_TRUE(can_read);
172 EXPECT_FALSE(can_create); // user role doesn't have create permission
173
174 // Create entity and log the operation
175 IntegrationTestUser entity;
176 entity.username = "test_user";
177 entity.email = "test@example.com";
178 entity.role = "user";
179
180 // Log the attempted operation
181 audit_event event;
182 event.event_type = audit_event_type::data_access;
183 event.user_id = user_id;
184 event.event_description = "Entity creation attempt";
185 event.success = can_create;
186 event.timestamp = std::chrono::system_clock::now();
187 event.resource_accessed = "integration_users";
188
189 logger.log_event(event);
190
191 // Verify audit log contains the event
192 auto events = logger.get_events_by_user(user_id);
193 EXPECT_GT(events.size(), 0);
194
195 // Verify entity metadata includes security information
196 const auto& metadata = entity.get_metadata();
197 EXPECT_EQ(metadata.table_name(), "integration_users");
198 EXPECT_TRUE(entity.is_valid());
199}
virtual const entity_metadata & get_metadata() const =0

References database::orm::entity_base::get_metadata(), and IntegrationTestUser::is_valid().

Here is the call graph for this function:

◆ TEST_F() [5/6]

TEST_F ( PerformanceAsyncIntegrationTest ,
MonitoredAsyncOperations  )

Definition at line 205 of file integration_tests.cpp.

205 {
206 auto& executor = async_executor::instance();
207
208 // Submit multiple async operations while monitoring performance
209 std::vector<std::future<query_result>> futures;
210
211 for (int i = 0; i < 10; ++i) {
212 auto future = executor.execute_async([i, &monitor]() -> query_result {
213 auto start_time = std::chrono::high_resolution_clock::now();
214
215 // Simulate database operation
216 std::this_thread::sleep_for(std::chrono::milliseconds(50 + (i * 10)));
217
218 auto end_time = std::chrono::high_resolution_clock::now();
219 auto execution_time = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time);
220
221 // Record query metrics
222 query_metrics metrics;
223 metrics.query_type = "SELECT";
224 metrics.execution_time = execution_time;
225 metrics.success = true;
226 metrics.rows_affected = i + 1;
227 metrics.timestamp = start_time;
228
229 monitor.record_query_execution(metrics);
230
231 query_result result;
232 result.success = true;
233 result.execution_time = execution_time;
234 result.rows_affected = i + 1;
235
236 return result;
237 });
238
239 futures.push_back(std::move(future));
240 }
241
242 // Wait for all operations to complete
243 for (auto& future : futures) {
244 auto result = future.get();
245 EXPECT_TRUE(result.success);
246 EXPECT_GT(result.execution_time.count(), 0);
247 }
248
249 // Verify performance metrics were recorded
250 const auto& stats = monitor.get_query_statistics();
251 EXPECT_GE(stats.total_queries, 10);
252 EXPECT_GT(stats.average_execution_time.count(), 0);
253}

References database::monitoring::query_metrics::execution_time, database::monitoring::query_metrics::rows_affected, and database::monitoring::query_metrics::success.

◆ TEST_F() [6/6]

TEST_F ( SecurityMonitoringIntegrationTest ,
MonitoredSecurityEvents  )

Definition at line 259 of file integration_tests.cpp.

259 {
260 auto& rbac = rbac_manager::instance();
261 auto& logger = context_->get_audit_logger();
262
263 // Create users with different permission levels
264 std::vector<std::tuple<std::string, std::string, std::string>> test_users = {
265 {"admin.user", "admin@test.com", "admin"},
266 {"normal.user", "normal@test.com", "user"},
267 {"unauthorized.user", "unauthorized@test.com", "user"}
268 };
269
270 for (const auto& [username, email, role] : test_users) {
271 rbac_user user(username, email);
272 rbac.create_user(user);
273 rbac.assign_role_to_user(username, role);
274 }
275
276 // Simulate various security events and monitor performance impact
277 std::vector<std::string> operations = {
278 "user.read", "user.create", "user.update", "user.delete"
279 };
280
281 for (const auto& [username, email, role] : test_users) {
282 for (const auto& operation : operations) {
283 auto start_time = std::chrono::high_resolution_clock::now();
284
285 // Check permission (this is the operation being monitored)
286 bool has_permission = rbac.check_permission(username, operation);
287
288 auto end_time = std::chrono::high_resolution_clock::now();
289 auto check_time = std::chrono::duration_cast<std::chrono::microseconds>(end_time - start_time);
290
291 // Log the authorization event
292 audit_event event;
293 event.event_type = audit_event_type::authorization;
294 event.user_id = username;
295 event.event_description = "Permission check: " + operation;
296 event.success = has_permission;
297 event.timestamp = start_time;
298 event.resource_accessed = operation;
299
300 logger.log_event(event);
301
302 // Record performance metrics for security operations
303 query_metrics metrics;
304 metrics.query_type = "SECURITY_CHECK";
305 metrics.execution_time = std::chrono::duration_cast<std::chrono::milliseconds>(check_time);
306 metrics.success = true;
307 metrics.rows_affected = 1;
308 metrics.timestamp = start_time;
309
310 monitor.record_query_execution(metrics);
311 }
312 }
313
314 // Verify audit events were logged
315 auto admin_events = logger.get_events_by_user("admin.user");
316 auto normal_events = logger.get_events_by_user("normal.user");
317 auto unauthorized_events = logger.get_events_by_user("unauthorized.user");
318
319 EXPECT_EQ(admin_events.size(), 4); // admin should have 4 events (all operations)
320 EXPECT_EQ(normal_events.size(), 4); // normal user should have 4 events
321 EXPECT_EQ(unauthorized_events.size(), 4); // unauthorized user should have 4 events
322
323 // Verify performance metrics include security operations
324 const auto& stats = monitor.get_query_statistics();
325 EXPECT_GT(stats.total_queries, 12); // At least 12 security checks recorded
326}

References database::monitoring::query_metrics::execution_time, database::security::has_permission(), database::monitoring::query_metrics::rows_affected, and database::monitoring::query_metrics::success.

Here is the call graph for this function: