/
VirusVK
/
ServerIT
Обзор
Документация
Войти
/
VirusVK
/
ServerIT
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
armdb/tests/test_basic.c
374 строки
13 KB
VirusVK
upload files
13 дек 2025, 14:28
13 дек 2025, 14:28
a626524
Код
Авторство
О чём код?
/** * @file test_basic.c * @brief Базовые тесты для ARMDB */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <time.h> #include "../include/storage.h" #include "../include/models.h" #include "../include/csv.h" #define TEST_DB_FILE "test_database.db" #define TEST_CSV_FILE "test_data.csv" // Вспомогательные функции void cleanup_test_files(void) { remove(TEST_DB_FILE); remove(TEST_CSV_FILE); } // Тест 1: Создание и открытие базы данных void test_database_creation(void) { printf("Тест 1: Создание базы данных... "); cleanup_test_files(); // Создаем новую БД assert(db_init(TEST_DB_FILE) == 0); // Открываем созданную БД Database db = {0}; assert(db_open(TEST_DB_FILE, &db) == 0); // Проверяем заголовок assert(db.header.version == DB_VERSION); assert(db.header.page_count >= 1); assert(db.header.last_object_id[OBJ_TYPE_ARM] == 0); assert(db.header.last_object_id[OBJ_TYPE_USER] == 0); // Закрываем БД db_close(&db); printf("OK\n"); } // Тест 2: Операции с АРМ void test_arm_operations(void) { printf("Тест 2: Операции с АРМ... "); Database db = {0}; assert(db_open(TEST_DB_FILE, &db) == 0); // Создаем тестовый АРМ ARM test_arm = {0}; strcpy(test_arm.inventory_number, "TEST-ARM-001"); strcpy(test_arm.name, "Тестовое рабочее место"); strcpy(test_arm.type, "Desktop"); strcpy(test_arm.department, "Тестовый отдел"); test_arm.status = STATUS_ACTIVE; strcpy(test_arm.ip_address, "192.168.0.100"); strcpy(test_arm.mac_address, "00:11:22:33:44:55"); test_arm.last_maintenance = time(NULL); strcpy(test_arm.notes, "Тестовая запись"); // Добавляем АРМ uint32_t arm_id = db_add_arm(&db, &test_arm); assert(arm_id > 0); // Читаем АРМ ARM read_arm = {0}; assert(db_get_arm(&db, arm_id, &read_arm) == 0); // Проверяем данные assert(strcmp(read_arm.inventory_number, test_arm.inventory_number) == 0); assert(strcmp(read_arm.name, test_arm.name) == 0); assert(strcmp(read_arm.type, test_arm.type) == 0); assert(strcmp(read_arm.department, test_arm.department) == 0); assert(read_arm.status == test_arm.status); assert(strcmp(read_arm.ip_address, test_arm.ip_address) == 0); // Обновляем АРМ strcpy(read_arm.notes, "Обновленная тестовая запись"); assert(db_update_arm(&db, arm_id, &read_arm) == 0); // Проверяем обновление ARM updated_arm = {0}; assert(db_get_arm(&db, arm_id, &updated_arm) == 0); assert(strstr(updated_arm.notes, "Обновленная") != NULL); // Удаляем АРМ assert(db_delete_arm(&db, arm_id) == 0); assert(db_get_arm(&db, arm_id, &updated_arm) != 0); db_close(&db); printf("OK\n"); } // Тест 3: Операции с пользователями void test_user_operations(void) { printf("Тест 3: Операции с пользователями... "); Database db = {0}; assert(db_open(TEST_DB_FILE, &db) == 0); // Создаем тестового пользователя User test_user = {0}; strcpy(test_user.username, "testuser"); strcpy(test_user.first_name, "Иван"); strcpy(test_user.last_name, "Тестов"); strcpy(test_user.department, "Тестовый отдел"); strcpy(test_user.position, "Тестировщик"); strcpy(test_user.email, "test@company.com"); strcpy(test_user.phone, "+7-999-999-99-99"); test_user.start_date = time(NULL); test_user.access_level = ACCESS_USER; // Добавляем пользователя uint32_t user_id = db_add_user(&db, &test_user); assert(user_id > 0); // Читаем пользователя User read_user = {0}; assert(db_get_user(&db, user_id, &read_user) == 0); // Проверяем данные assert(strcmp(read_user.username, test_user.username) == 0); assert(strcmp(read_user.first_name, test_user.first_name) == 0); assert(strcmp(read_user.last_name, test_user.last_name) == 0); assert(strcmp(read_user.email, test_user.email) == 0); assert(read_user.access_level == test_user.access_level); // Обновляем уровень доступа read_user.access_level = ACCESS_ADMIN; assert(db_update_user(&db, user_id, &read_user) == 0); // Проверяем обновление User updated_user = {0}; assert(db_get_user(&db, user_id, &updated_user) == 0); assert(updated_user.access_level == ACCESS_ADMIN); db_close(&db); printf("OK\n"); } // Тест 4: CSV импорт/экспорт void test_csv_operations(void) { printf("Тест 4: CSV импорт/экспорт... "); // Создаем тестовый CSV файл FILE *csv = fopen(TEST_CSV_FILE, "w"); assert(csv != NULL); fprintf(csv, "inventory_number,name,type,department,status,ip_address,mac_address,last_maintenance,notes\n"); fprintf(csv, "CSV-ARM-001,CSV Тест 1,Desktop,CSV Отдел,active,10.0.0.1,AA:BB:CC:DD:EE:FF,2024-01-01,CSV импорт\n"); fprintf(csv, "CSV-ARM-002,CSV Тест 2,Laptop,CSV Отдел,active,10.0.0.2,11:22:33:44:55:66,2024-02-01,Второй CSV\n"); fclose(csv); // Открываем БД Database db = {0}; assert(db_open(TEST_DB_FILE, &db) == 0); // Импортируем из CSV assert(csv_import_arms(&db, TEST_CSV_FILE, ',') > 0); // Проверяем, что данные импортированы uint32_t count = 0; ARM arm = {0}; for (uint32_t i = 1; i <= db.header.last_object_id[OBJ_TYPE_ARM]; i++) { if (db_get_arm(&db, i, &arm) == 0) { if (strstr(arm.inventory_number, "CSV-ARM") != NULL) { count++; } } } assert(count >= 2); // Экспортируем в другой файл const char *export_file = "test_export.csv"; assert(csv_export_arms(&db, export_file, ',') == 0); // Проверяем, что файл экспорта создан FILE *export = fopen(export_file, "r"); assert(export != NULL); char line[256]; int lines = 0; while (fgets(line, sizeof(line), export)) { lines++; } fclose(export); assert(lines > 1); // Удаляем временный файл remove(export_file); db_close(&db); printf("OK\n"); } // Тест 5: Поиск и фильтрация void test_search_operations(void) { printf("Тест 5: Поиск и фильтрация... "); Database db = {0}; assert(db_open(TEST_DB_FILE, &db) == 0); // Добавляем несколько тестовых записей для поиска ARM arms[] = { {0}, {0}, {0} }; strcpy(arms[0].inventory_number, "SEARCH-001"); strcpy(arms[0].name, "Для поиска 1"); strcpy(arms[0].department, "Поисковый отдел"); arms[0].status = STATUS_ACTIVE; strcpy(arms[1].inventory_number, "SEARCH-002"); strcpy(arms[1].name, "Для поиска 2"); strcpy(arms[1].department, "Другой отдел"); arms[1].status = STATUS_INACTIVE; strcpy(arms[2].inventory_number, "SEARCH-003"); strcpy(arms[2].name, "Еще один"); strcpy(arms[2].department, "Поисковый отдел"); arms[2].status = STATUS_ACTIVE; for (int i = 0; i < 3; i++) { assert(db_add_arm(&db, &arms[i]) > 0); } // TODO: Реализовать тесты поиска после реализации функций поиска db_close(&db); printf("OK (заглушка)\n"); } // Тест 6: Целостность данных void test_data_integrity(void) { printf("Тест 6: Целостность данных... "); Database db = {0}; assert(db_open(TEST_DB_FILE, &db) == 0); // Проверяем контрольную сумму uint32_t checksum = db_calculate_checksum(&db); assert(db.header.checksum == checksum); // Проверяем, что последние ID корректны assert(db.header.last_object_id[OBJ_TYPE_ARM] >= 0); assert(db.header.last_object_id[OBJ_TYPE_USER] >= 0); // Проверяем даты assert(db.header.created_at > 0); assert(db.header.modified_at >= db.header.created_at); db_close(&db); printf("OK\n"); } // Тест 7: Журнал аудита void test_audit_log(void) { printf("Тест 7: Журнал аудита... "); Database db = {0}; assert(db_open(TEST_DB_FILE, &db) == 0); // Добавляем запись в журнал аудита AuditEntry audit = {0}; audit.timestamp = time(NULL); audit.user_id = 1; strcpy(audit.action, "TEST"); strcpy(audit.object_type, "ARM"); audit.object_id = 1; strcpy(audit.details, "Тестовая запись в журнале"); assert(db_add_audit(&db, &audit) > 0); // Проверяем, что запись добавлена assert(db.header.last_object_id[OBJ_TYPE_AUDIT] > 0); // TODO: Реализовать чтение записей аудита db_close(&db); printf("OK\n"); } // Тест 8: Обработка ошибок void test_error_handling(void) { printf("Тест 8: Обработка ошибок... "); // Попытка открыть несуществующий файл Database db = {0}; assert(db_open("non_existent_file.db", &db) != 0); // Попытка добавить АРМ без открытой БД ARM arm = {0}; assert(db_add_arm(&db, &arm) == 0); // Должен вернуть 0 при ошибке // Попытка импорта из несуществующего CSV assert(csv_import_arms(&db, "non_existent.csv", ',') == 0); printf("OK\n"); } // Тест 9: Производительность void test_performance(void) { printf("Тест 9: Производительность... "); Database db = {0}; assert(db_open(TEST_DB_FILE, &db) == 0); clock_t start = clock(); // Добавляем 100 записей ARM perf_arm = {0}; for (int i = 0; i < 100; i++) { snprintf(perf_arm.inventory_number, sizeof(perf_arm.inventory_number), "PERF-%03d", i); snprintf(perf_arm.name, sizeof(perf_arm.name), "Тест производительности %d", i); perf_arm.status = STATUS_ACTIVE; assert(db_add_arm(&db, &perf_arm) > 0); } clock_t end = clock(); double elapsed = (double)(end - start) / CLOCKS_PER_SEC; printf("Добавлено 100 записей за %.3f секунд (%.1f записей/сек)\n", elapsed, 100 / elapsed); db_close(&db); } // Главная функция тестов int main(void) { printf("=== Запуск тестов ARMDB ===\n\n"); int passed = 0; int total = 9; // Запускаем тесты test_database_creation(); passed++; test_arm_operations(); passed++; test_user_operations(); passed++; test_csv_operations(); passed++; test_search_operations(); passed++; test_data_integrity(); passed++; test_audit_log(); passed++; test_error_handling(); passed++; test_performance(); passed++; // Очистка тестовых файлов cleanup_test_files(); printf("\n=== Результаты тестирования ===\n"); printf("Пройдено: %d/%d тестов\n", passed, total); if (passed == total) { printf("Все тесты пройдены успешно! ✅\n"); return 0; } else { printf("Некоторые тесты не пройдены ❌\n"); return 1; } }